diff --git a/.github/workflows/issue-metrics.yml b/.github/workflows/issue-metrics.yml new file mode 100644 index 00000000..bd08bbb9 --- /dev/null +++ b/.github/workflows/issue-metrics.yml @@ -0,0 +1,42 @@ +name: Monthly issue metrics +on: + workflow_dispatch: + schedule: + - cron: '3 2 1 * *' + +permissions: + contents: read + +jobs: + build: + name: issue metrics + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: read + steps: + - name: Get dates for last month + shell: bash + run: | + # Calculate the first day of the previous month + first_day=$(date -d "last month" +%Y-%m-01) + + # Calculate the last day of the previous month + last_day=$(date -d "$first_day +1 month -1 day" +%Y-%m-%d) + + #Set an environment variable with the date range + echo "$first_day..$last_day" + echo "last_month=$first_day..$last_day" >> "$GITHUB_ENV" + + - name: Run issue-metrics tool + uses: github/issue-metrics@v3 + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SEARCH_QUERY: 'repo:materialsproject/crystaltoolkit is:issue created:${{ env.last_month }} -reason:"not planned"' + + - name: Create issue + uses: peter-evans/create-issue-from-file@v5 + with: + title: Monthly issue metrics report + token: ${{ secrets.GITHUB_TOKEN }} + content-filepath: ./issue_metrics.md diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 4450ed87..35ccd301 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -1,15 +1,24 @@ -name: pytest +name: Testing on: + push: + branches: + - main + tags: + - "v*" pull_request: - branches: [main] + branches: + - main + +permissions: + contents: read jobs: build: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.9"] + python-version: ["3.10"] steps: - uses: actions/checkout@v3 @@ -29,7 +38,7 @@ jobs: python${{ matrix.python-version }} -m pip install `grep numpy== requirements/ubuntu-latest_py${{ matrix.python-version }}_extras.txt` python${{ matrix.python-version }} -m pip install -r requirements/ubuntu-latest_py${{ matrix.python-version }}_extras.txt python${{ matrix.python-version }} -m pip install --upgrade pip - python${{ matrix.python-version }} -m pip install --no-deps . + python${{ matrix.python-version }} -m pip install --no-deps .[server] - name: Test modules run: python${{ matrix.python-version }} -m pytest tests - name: Test example apps diff --git a/.github/workflows/pytest-docs.yml b/.github/workflows/pytest-docs.yml index 20c8cd76..e3af7774 100644 --- a/.github/workflows/pytest-docs.yml +++ b/.github/workflows/pytest-docs.yml @@ -1,13 +1,23 @@ -name: Tests +name: Build Docs -on: [release, workflow_dispatch] +on: + push: + branches: + - main + tags: + - "v*" + pull_request: + branches: + - main + release: + types: [published] jobs: build: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.9"] + python-version: ["3.10"] steps: - uses: actions/checkout@v3 @@ -20,18 +30,20 @@ jobs: cache: 'pip' cache-dependency-path: '**/pyproject.toml' - name: Install webdriver - run: sudo apt-get update && sudo apt-get install firefox-geckodriver + run: sudo apt-get update && sudo apt-get install chromium-chromedriver - name: Install dependencies run: | python${{ matrix.python-version }} -m pip install --upgrade pip packaging wheel python${{ matrix.python-version }} -m pip install `grep numpy== requirements/ubuntu-latest_py${{ matrix.python-version }}_extras.txt` python${{ matrix.python-version }} -m pip install -r requirements/ubuntu-latest_py${{ matrix.python-version }}_extras.txt + python${{ matrix.python-version }} -m pip install --upgrade pip python${{ matrix.python-version }} -m pip install --no-deps . - name: Build new docs run: | cd docs_rst make html - - name: Detect changes + - name: Detect changes on release + if: startsWith(github.head_ref, 'releases/') id: changes shell: bash run: | @@ -45,7 +57,3 @@ jobs: git add -A git commit -m "Automated doc build" git push - - name: pytest - env: - PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }} - run: pytest --color=yes --webdriver Firefox --headless crystal_toolkit/apps/examples/tests/ diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6df769f0..01969a23 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,13 +1,18 @@ name: Release -on: workflow_dispatch +on: + release: + types: [published] + +permissions: + contents: read jobs: deploy: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.9"] + python-version: ["3.10"] steps: - uses: actions/checkout@v3 @@ -15,48 +20,23 @@ jobs: fetch-depth: 0 token: ${{ secrets.PAT }} - - uses: actions/setup-python@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} cache: "pip" cache-dependency-path: '**/pyproject.toml' - - name: bump version and create tag - env: - DATE_FORMAT: "%Y.%m.%d" - run: | - NEXT_RELEASE=$(date "+${DATE_FORMAT}") - LAST_RELEASE=$(git tag --sort=v:refname | grep "^20[^\-]*$" | tail -n 1) - echo "Last release : ${LAST_RELEASE}" - MAJOR_LAST_RELEASE=$(echo "${LAST_RELEASE}" | awk -v l=${#NEXT_RELEASE} '{ string=substr($0, 1, l); print string; }') - echo "Last major release : ${MAJOR_LAST_RELEASE}" - if [ "${MAJOR_LAST_RELEASE}" = "${NEXT_RELEASE}" ]; then - MINOR_LAST_RELEASE="$(echo "${LAST_RELEASE}" | awk -v l=$((${#NEXT_RELEASE} + 2)) '{ string=substr($0, l); print string; }')" - NEXT_RELEASE=${MAJOR_LAST_RELEASE}.$((MINOR_LAST_RELEASE + 1)) - fi - echo "Next release: ${NEXT_RELEASE}" - git config --local user.email "github-actions@github.com" - git config --local user.name "github-actions" - python -m pip install --upgrade pip - python -m pip install --user --upgrade pip build setuptools setuptools_scm wheel - SETUPTOOLS_SCM_PRETEND_VERSION=${NEXT_RELEASE} python -m setuptools_scm - git add crystal_toolkit/_version.py - git commit -m "version bump: ${NEXT_RELEASE}" - git push - git tag ${NEXT_RELEASE} - git push --tags - echo "NEXT_RELEASE=${NEXT_RELEASE}" >> $GITHUB_ENV - - name: Install dependencies run: | - python -m pip install --upgrade pip - python -m pip install `grep numpy== requirements/ubuntu-latest_py${{ matrix.python-version }}_extras.txt` - python -m pip install -r requirements/ubuntu-latest_py${{ matrix.python-version }}_extras.txt - python -m pip install --upgrade pip - python -m pip install --no-deps .[server] + python${{ matrix.python-version }} -m pip install --upgrade pip packaging wheel build + python${{ matrix.python-version }} -m pip install `grep numpy== requirements/ubuntu-latest_py${{ matrix.python-version }}_extras.txt` + python${{ matrix.python-version }} -m pip install -r requirements/ubuntu-latest_py${{ matrix.python-version }}_extras.txt + python${{ matrix.python-version }} -m pip install --upgrade pip + python${{ matrix.python-version }} -m pip install --no-deps .[server] - name: Build package - run: SETUPTOOLS_SCM_PRETEND_VERSION=${{env.NEXT_RELEASE}} python -m build + run: python${{ matrix.python-version }} -m build - name: Publish package uses: pypa/gh-action-pypi-publish@release/v1.5 diff --git a/.github/workflows/upgrade-dependencies.yml b/.github/workflows/upgrade-dependencies.yml index cc2b9069..5c9d6267 100644 --- a/.github/workflows/upgrade-dependencies.yml +++ b/.github/workflows/upgrade-dependencies.yml @@ -13,20 +13,20 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: ['ubuntu-latest', 'macos-latest'] - python-version: ["3.8", "3.9", "3.10"] + os: ['ubuntu-latest'] + python-version: ["3.9", "3.10", "3.11"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} cache: 'pip' - name: Upgrade Python dependencies shell: bash run: | - python${{ matrix.python-version }} -m pip install --upgrade pip pip-tools + python${{ matrix.python-version }} -m pip install --upgrade pip pip-tools wheel cython setuptools python${{ matrix.python-version }} -m pip install `grep numpy== requirements/${{ matrix.os }}_py${{ matrix.python-version }}_extras.txt` python${{ matrix.python-version }} -m piptools compile -q --upgrade --resolver=backtracking -o requirements/${{ matrix.os }}_py${{ matrix.python-version }}.txt pyproject.toml python${{ matrix.python-version }} -m piptools compile -q --upgrade --resolver=backtracking --all-extras -o requirements/${{ matrix.os }}_py${{ matrix.python-version }}_extras.txt pyproject.toml @@ -43,7 +43,7 @@ jobs: git config user.name github-actions git config user.email github-actions@github.com git add requirements - git commit -m "update dependencies for ${{ matrix.os }}/py${{ matrix.python-version }}" + git commit --allow-empty -m "update dependencies for ${{ matrix.os }}/py${{ matrix.python-version }}" git push -f origin ${{ github.ref_name }}:auto-dependency-upgrades-${{ matrix.os }}-py${{ matrix.python-version }} pull_request: @@ -54,10 +54,10 @@ jobs: matrix: python-version: ["3.9"] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: detect auto-upgrade-dependency branches diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index aa51c85f..c70871e4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,19 +7,15 @@ default_install_hook_types: [pre-commit, commit-msg] # ignore generated docs and dependency lock files, the directory # jupyterlab-extension/ and all SVG, JS and CSS files -exclude: ^(docs/.+|.*lock.*|jupyterlab-extension/.+|.*\.(svg|js|css))$ +exclude: ^(docs/.+|.*lock.*|jupyterlab-extension/.+|.*\.(svg|js|css))|_version.py$ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.0.277 + rev: v0.4.8 hooks: - id: ruff args: [--fix, --ignore, D] - - - repo: https://github.com/psf/black - rev: 23.3.0 - hooks: - - id: black-jupyter + - id: ruff-format # - repo: https://github.com/pre-commit/mirrors-mypy # rev: v1.3.0 @@ -27,7 +23,7 @@ repos: # - id: mypy - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.6.0 hooks: - id: check-case-conflict - id: check-symlinks @@ -37,19 +33,14 @@ repos: - id: trailing-whitespace - repo: https://github.com/codespell-project/codespell - rev: v2.2.5 + rev: v2.3.0 hooks: - id: codespell stages: [commit, commit-msg] - args: [--ignore-words-list, "nd,te,ois"] - - - repo: https://github.com/nbQA-dev/nbQA - rev: 1.7.0 - hooks: - - id: nbqa-ruff + args: [--ignore-words-list, "nd,te,ois,dscribe", --check-filenames] - repo: https://github.com/kynan/nbstripout - rev: 0.6.1 + rev: 0.7.1 hooks: - id: nbstripout args: [--drop-empty-cells, --keep-output] diff --git a/README.md b/README.md index c7884e15..a92d0777 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ If you would like a new-contributor issue assigned, get in touch with project ma ## Status [![Tests](https://github.com/materialsproject/crystaltoolkit/actions/workflows/pytest-docs.yml/badge.svg)](https://github.com/materialsproject/crystaltoolkit/actions/workflows/pytest-docs.yml) -[![Visual Regression Test Status](https://percy.io/static/images/percy-badge.svg)](https://percy.io/Materials-Project/crystaltoolkit) +[![Visual Regression Test Status](https://percy.io/static/images/percy-badge.svg)](https://percy.io/6f28436a/crystaltoolkit) [![Docker Build Status](https://img.shields.io/docker/cloud/build/materialsproject/crystaltoolkit)](https://hub.docker.com/repository/docker/materialsproject/crystaltoolkit/general) [![Release](https://github.com/materialsproject/crystaltoolkit/actions/workflows/release.yml/badge.svg)](https://github.com/materialsproject/crystaltoolkit/actions/workflows/release.yml) [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/materialsproject/crystaltoolkit/main.svg)](https://results.pre-commit.ci/latest/github/materialsproject/crystaltoolkit/main) diff --git a/crystal_toolkit/__init__.py b/crystal_toolkit/__init__.py index 676aca0d..1b6d05c9 100644 --- a/crystal_toolkit/__init__.py +++ b/crystal_toolkit/__init__.py @@ -5,12 +5,9 @@ from monty.json import MSONable -from crystal_toolkit.msonable import ( - _ipython_display_, - _repr_mimebundle_, - show_json, - to_plotly_json, -) +import crystal_toolkit.helpers.layouts as ctl +from crystal_toolkit.core.jupyter import patch_msonable +from crystal_toolkit.core.plugin import CrystalToolkitPlugin from crystal_toolkit.renderables import ( Lattice, Molecule, @@ -22,10 +19,7 @@ VolumetricData, ) -MSONable.to_plotly_json = to_plotly_json -MSONable._repr_mimebundle_ = _repr_mimebundle_ -MSONable.show_json = show_json -MSONable._ipython_display_ = _ipython_display_ +patch_msonable() MODULE_PATH = Path(__file__).parents[0] diff --git a/crystal_toolkit/_version.py b/crystal_toolkit/_version.py deleted file mode 100644 index a9f48b8d..00000000 --- a/crystal_toolkit/_version.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "2023.07.17" diff --git a/crystal_toolkit/apps/examples/bandstructure.py b/crystal_toolkit/apps/examples/bandstructure.py index 8a4a38ea..ee979693 100644 --- a/crystal_toolkit/apps/examples/bandstructure.py +++ b/crystal_toolkit/apps/examples/bandstructure.py @@ -32,13 +32,13 @@ ) # example layout to demonstrate capabilities of component -my_layout = Container( +layout = Container( [H1("Band Structure and Density of States Example"), bsdos_component.layout()] ) # wrap your app.layout with crystal_toolkit_layout() # to ensure all necessary components are loaded into layout -ctc.register_crystal_toolkit(app, layout=my_layout) +ctc.register_crystal_toolkit(app, layout=layout) # run this app with "python path/to/this/file.py" diff --git a/crystal_toolkit/apps/examples/basic_hello_structure.py b/crystal_toolkit/apps/examples/basic_hello_structure.py index f0af2c98..61e11985 100644 --- a/crystal_toolkit/apps/examples/basic_hello_structure.py +++ b/crystal_toolkit/apps/examples/basic_hello_structure.py @@ -15,9 +15,9 @@ structure_component = ctc.StructureMoleculeComponent(structure, id="hello_structure") # add the component's layout to our app's layout -my_layout = html.Div([structure_component.layout()]) +layout = html.Div([structure_component.layout()]) # as explained in "preamble" section in documentation -ctc.register_crystal_toolkit(app=app, layout=my_layout) +ctc.register_crystal_toolkit(app=app, layout=layout) if __name__ == "__main__": app.run(debug=True, port=8050) diff --git a/crystal_toolkit/apps/examples/basic_hello_structure_interactive.py b/crystal_toolkit/apps/examples/basic_hello_structure_interactive.py index 381f7897..edf85ca7 100644 --- a/crystal_toolkit/apps/examples/basic_hello_structure_interactive.py +++ b/crystal_toolkit/apps/examples/basic_hello_structure_interactive.py @@ -28,9 +28,9 @@ # now we have two entries in our app layout, # the structure component's layout and the button -my_layout = html.Div([structure_component.layout(), my_button]) +layout = html.Div([structure_component.layout(), my_button]) -ctc.register_crystal_toolkit(app=app, layout=my_layout) +ctc.register_crystal_toolkit(app=app, layout=layout) # for the interactivity, we use a standard Dash callback diff --git a/crystal_toolkit/apps/examples/diffraction.py b/crystal_toolkit/apps/examples/diffraction.py index 31aeb43f..a0ed0fe0 100644 --- a/crystal_toolkit/apps/examples/diffraction.py +++ b/crystal_toolkit/apps/examples/diffraction.py @@ -4,27 +4,26 @@ from pymatgen.core import Lattice, Structure import crystal_toolkit.components as ctc -from crystal_toolkit.helpers.layouts import H1, H3, Container +from crystal_toolkit.helpers.layouts import H1, H2, Container from crystal_toolkit.settings import SETTINGS app = dash.Dash(assets_folder=SETTINGS.ASSETS_PATH) - structure = Structure(Lattice.cubic(4.2), ["Na", "K"], [[0, 0, 0], [0.5, 0.5, 0.5]]) xrd_component = ctc.XRayDiffractionComponent(initial_structure=structure) # example layout to demonstrate capabilities of component -my_layout = Container( +layout = Container( [ H1("XRDComponent Example"), - H3("Generated from Structure object"), + H2("Generated from Structure object", style={"fontSize": "1rem"}), xrd_component.layout(), ] ) # as explained in "preamble" section in documentation -ctc.register_crystal_toolkit(app=app, layout=my_layout) +ctc.register_crystal_toolkit(app=app, layout=layout) # run this app with "python path/to/this/file.py" # in production, deploy behind gunicorn or similar diff --git a/crystal_toolkit/apps/examples/diffraction_dynamic.py b/crystal_toolkit/apps/examples/diffraction_dynamic.py index c7fad07b..1e83a738 100644 --- a/crystal_toolkit/apps/examples/diffraction_dynamic.py +++ b/crystal_toolkit/apps/examples/diffraction_dynamic.py @@ -15,10 +15,10 @@ # example layout to demonstrate capabilities of component page_title = H1("XRDComponent Example (Structure Added After Loading)") load_btn = Button("Load XRD", id="load-xrd-button") -my_layout = Container([page_title, xrd_component.layout(), load_btn]) +layout = Container([page_title, xrd_component.layout(), load_btn]) # as explained in "preamble" section in documentation -ctc.register_crystal_toolkit(app=app, layout=my_layout) +ctc.register_crystal_toolkit(app=app, layout=layout) @app.callback(Output(xrd_component.id(), "data"), Input(load_btn, "n_clicks")) diff --git a/crystal_toolkit/apps/examples/diffraction_empty.py b/crystal_toolkit/apps/examples/diffraction_empty.py index b0173eb3..c4bc0b8e 100644 --- a/crystal_toolkit/apps/examples/diffraction_empty.py +++ b/crystal_toolkit/apps/examples/diffraction_empty.py @@ -11,12 +11,12 @@ xrd_component = ctc.XRayDiffractionComponent() # example layout to demonstrate capabilities of component -my_layout = Container( +layout = Container( [H1("XRDComponent Example (Empty, No Structure Defined)"), xrd_component.layout()] ) # as explained in "preamble" section in documentation -ctc.register_crystal_toolkit(app=app, layout=my_layout) +ctc.register_crystal_toolkit(app=app, layout=layout) # run this app with "python path/to/this/file.py" # in production, deploy behind gunicorn or similar diff --git a/crystal_toolkit/apps/examples/diffraction_tem.py b/crystal_toolkit/apps/examples/diffraction_tem.py index 098b0cf8..6e029c65 100644 --- a/crystal_toolkit/apps/examples/diffraction_tem.py +++ b/crystal_toolkit/apps/examples/diffraction_tem.py @@ -12,12 +12,25 @@ app = dash.Dash(assets_folder=SETTINGS.ASSETS_PATH) -structure = Structure(Lattice.cubic(4.2), ["Na", "K"], [[0, 0, 0], [0.5, 0.5, 0.5]]) +structure = Structure( + Lattice.cubic(5.44), + ["Si"] * 8, + [ + [0.25, 0.75, 0.25], + [0.0, 0.0, 0.5], + [0.25, 0.25, 0.75], + [0.0, 0.5, 0.0], + [0.75, 0.75, 0.75], + [0.5, 0.0, 0.0], + [0.75, 0.25, 0.25], + [0.5, 0.5, 0.5], + ], +) tem_component = ctc.TEMDiffractionComponent(initial_structure=structure) # example layout to demonstrate capabilities of component -my_layout = Container( +layout = Container( [ H1("TEMDiffractionComponent Example"), H3("Generated from Structure object"), @@ -26,7 +39,7 @@ ) # as explained in "preamble" section in documentation -ctc.register_crystal_toolkit(app=app, layout=my_layout) +ctc.register_crystal_toolkit(app=app, layout=layout) # run this app with "python path/to/this/file.py" # in production, deploy behind gunicorn or similar diff --git a/crystal_toolkit/apps/examples/fermi_surface.py b/crystal_toolkit/apps/examples/fermi_surface.py index 7f29d493..2835ca38 100644 --- a/crystal_toolkit/apps/examples/fermi_surface.py +++ b/crystal_toolkit/apps/examples/fermi_surface.py @@ -25,11 +25,11 @@ fs_component = ctc.FermiSurfaceComponent(fermi_surface, id="fermi_surface") # example layout to demonstrate capabilities of component -my_layout = Container([H1("Fermi Surface Example"), fs_component.layout()]) +layout = Container([H1("Fermi Surface Example"), fs_component.layout()]) # wrap your app.layout with crystal_toolkit_layout() # to ensure all necessary components are loaded into layout -ctc.register_crystal_toolkit(app, layout=my_layout) +ctc.register_crystal_toolkit(app, layout=layout) # run this app with "python path/to/this/file.py" # in production, deploy behind gunicorn or similar diff --git a/crystal_toolkit/apps/examples/kwarg_inputs.py b/crystal_toolkit/apps/examples/kwarg_inputs.py index 7d18baed..95963235 100644 --- a/crystal_toolkit/apps/examples/kwarg_inputs.py +++ b/crystal_toolkit/apps/examples/kwarg_inputs.py @@ -37,7 +37,7 @@ ) # create your layout -my_layout = ctl.Section( +layout = ctl.Section( [ ctl.H1("Example of input controls"), dcc.Markdown( @@ -86,7 +86,7 @@ def add_inputs(n_clicks): # tell Crystal Toolkit about the app and layout we want to display -ctc.register_crystal_toolkit(app=app, layout=my_layout, cache=None) +ctc.register_crystal_toolkit(app=app, layout=layout, cache=None) # run this app with "python path/to/this/file.py" # in production, deploy behind gunicorn or similar diff --git a/crystal_toolkit/apps/examples/mpcontribs/catalysis.py b/crystal_toolkit/apps/examples/mpcontribs/catalysis.py index ba93a4a1..717a9587 100644 --- a/crystal_toolkit/apps/examples/mpcontribs/catalysis.py +++ b/crystal_toolkit/apps/examples/mpcontribs/catalysis.py @@ -293,7 +293,7 @@ def get_visualization(self, structure): show_compass=False, show_settings=False, show_image_button=False, - show_export_button=False + show_export_button=False, # group_by_site_property="display_text", # pending new Crystal Toolkit release ).layout() diff --git a/crystal_toolkit/apps/examples/phase_diagram.py b/crystal_toolkit/apps/examples/phase_diagram.py index bda3e686..827e36d2 100644 --- a/crystal_toolkit/apps/examples/phase_diagram.py +++ b/crystal_toolkit/apps/examples/phase_diagram.py @@ -42,7 +42,7 @@ # example layout to demonstrate capabilities of component -my_layout = html.Div( +layout = html.Div( [ html.H1("PhaseDiagramComponent Example"), html.H2("Standard Layout (1 Element)"), @@ -57,7 +57,7 @@ # wrap your app.layout with crystal_toolkit_layout() # to ensure all necessary components are loaded into layout -app.layout = ctc.crystal_toolkit_layout(my_layout) +app.layout = ctc.crystal_toolkit_layout(layout) # run this app with "python path/to/this/file.py" diff --git a/crystal_toolkit/apps/examples/pourbaix.py b/crystal_toolkit/apps/examples/pourbaix.py index e61d2c05..56941932 100644 --- a/crystal_toolkit/apps/examples/pourbaix.py +++ b/crystal_toolkit/apps/examples/pourbaix.py @@ -22,7 +22,7 @@ pourbaix_component = ctc.PourbaixDiagramComponent(default_data=pourbaix_entries) # example layout to demonstrate capabilities of component -my_layout = html.Div( +layout = html.Div( [ html.H1("PourbaixDiagramComponent Example"), html.Button("Get Pourbaix Diagram", id="get-pourbaix"), @@ -32,7 +32,7 @@ style=dict(maxWidth="90vw", margin="2em auto"), ) -ctc.register_crystal_toolkit(app=app, layout=my_layout) +ctc.register_crystal_toolkit(app=app, layout=layout) # run this app with "python path/to/this/file.py" # in production, deploy behind gunicorn or similar diff --git a/crystal_toolkit/apps/examples/relaxation_trajectory.py b/crystal_toolkit/apps/examples/relaxation_trajectory.py index fd62536b..af8c5258 100644 --- a/crystal_toolkit/apps/examples/relaxation_trajectory.py +++ b/crystal_toolkit/apps/examples/relaxation_trajectory.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import sys import numpy as np diff --git a/crystal_toolkit/apps/examples/structure.py b/crystal_toolkit/apps/examples/structure.py index 5e18f2b5..0ef3ba4e 100644 --- a/crystal_toolkit/apps/examples/structure.py +++ b/crystal_toolkit/apps/examples/structure.py @@ -21,7 +21,7 @@ structure_component = ctc.StructureMoleculeComponent(structure, id="my_structure") # example layout to demonstrate capabilities of component -my_layout = html.Div( +layout = html.Div( [ html.H1("StructureMoleculeComponent Example"), html.H2("Standard Layout"), @@ -35,7 +35,7 @@ ) # tell crystal toolkit about your app and layout -ctc.register_crystal_toolkit(app, layout=my_layout) +ctc.register_crystal_toolkit(app, layout=layout) # run this app with "python path/to/this/file.py" # in production, deploy behind gunicorn or similar diff --git a/crystal_toolkit/apps/examples/structure_magnetic.py b/crystal_toolkit/apps/examples/structure_magnetic.py index 55340739..1ac0e476 100644 --- a/crystal_toolkit/apps/examples/structure_magnetic.py +++ b/crystal_toolkit/apps/examples/structure_magnetic.py @@ -22,7 +22,7 @@ structure_component = ctc.StructureMoleculeComponent(structure, id="struct") # example layout to demonstrate capabilities of component -my_layout = html.Div( +layout = html.Div( [ html.H1("StructureMoleculeComponent Example"), html.H2("Standard Layout"), @@ -40,7 +40,7 @@ ) # tell crystal toolkit about your app and layout -ctc.register_crystal_toolkit(app, layout=my_layout) +ctc.register_crystal_toolkit(app, layout=layout) # run this app with "python path/to/this/file.py" # in production, deploy behind gunicorn or similar diff --git a/crystal_toolkit/apps/examples/tests/test_bandstructure.py b/crystal_toolkit/apps/examples/tests/test_bandstructure.py index d28492ef..7a3777bd 100644 --- a/crystal_toolkit/apps/examples/tests/test_bandstructure.py +++ b/crystal_toolkit/apps/examples/tests/test_bandstructure.py @@ -32,4 +32,4 @@ def test_bs(dash_duo: DashDuo) -> None: # dash_duo.percy_snapshot("example_bsdos_projection_index_2") logs = dash_duo.get_logs() - assert logs == [], f"Unexpected browser {logs=}" + assert logs is None, f"Unexpected browser {logs=}" diff --git a/crystal_toolkit/apps/examples/tests/test_basic.py b/crystal_toolkit/apps/examples/tests/test_basic.py index 276004ac..bac726d2 100644 --- a/crystal_toolkit/apps/examples/tests/test_basic.py +++ b/crystal_toolkit/apps/examples/tests/test_basic.py @@ -22,7 +22,7 @@ def test_hello_scientist(dash_duo: DashDuo): dash_duo.percy_snapshot("hello_scientist") logs = dash_duo.get_logs() - assert logs == [], f"Unexpected browser {logs=}" + assert logs is None, f"Unexpected browser {logs=}" def test_hello_structure(dash_duo: DashDuo) -> None: @@ -33,7 +33,7 @@ def test_hello_structure(dash_duo: DashDuo) -> None: dash_duo.percy_snapshot("hello_structure") logs = dash_duo.get_logs() - assert logs == [], f"Unexpected browser {logs=}" + assert logs is None, f"Unexpected browser {logs=}" def test_hello_structure_interactive(dash_duo: DashDuo) -> None: @@ -47,4 +47,4 @@ def test_hello_structure_interactive(dash_duo: DashDuo) -> None: dash_duo.percy_snapshot("hello_structure_interactive_on_click") logs = dash_duo.get_logs() - assert logs == [], f"Unexpected browser {logs=}" + assert logs is None, f"Unexpected browser {logs=}" diff --git a/crystal_toolkit/apps/examples/tests/test_diffraction.py b/crystal_toolkit/apps/examples/tests/test_diffraction.py index 32c793e9..eb167b24 100644 --- a/crystal_toolkit/apps/examples/tests/test_diffraction.py +++ b/crystal_toolkit/apps/examples/tests/test_diffraction.py @@ -31,4 +31,4 @@ def test_diffraction(dash_duo: DashDuo) -> None: input_nodes[0].send_keys(Keys.ARROW_UP) logs = dash_duo.get_logs() - assert logs == [], f"Unexpected browser {logs=}" + assert logs is None, f"Unexpected browser {logs=}" diff --git a/crystal_toolkit/apps/examples/tests/test_fermi_surface.py b/crystal_toolkit/apps/examples/tests/test_fermi_surface.py index c191c814..530a87e7 100644 --- a/crystal_toolkit/apps/examples/tests/test_fermi_surface.py +++ b/crystal_toolkit/apps/examples/tests/test_fermi_surface.py @@ -2,13 +2,13 @@ from typing import TYPE_CHECKING -from crystal_toolkit.apps.examples.fermi_surface import app - if TYPE_CHECKING: from crystal_toolkit.apps.examples.tests.typing import DashDuo def test_diffraction(dash_duo: DashDuo) -> None: + from crystal_toolkit.apps.examples.fermi_surface import app + dash_duo.start_server(app) dash_duo.clear_storage() @@ -17,4 +17,4 @@ def test_diffraction(dash_duo: DashDuo) -> None: assert "dash-graph" in node.get_attribute("class") logs = dash_duo.get_logs() - assert logs == [], f"Unexpected browser {logs=}" + assert logs is None, f"Unexpected browser {logs=}" diff --git a/crystal_toolkit/apps/examples/tests/test_structure.py b/crystal_toolkit/apps/examples/tests/test_structure.py index 6e14e713..c54fa77c 100644 --- a/crystal_toolkit/apps/examples/tests/test_structure.py +++ b/crystal_toolkit/apps/examples/tests/test_structure.py @@ -36,4 +36,4 @@ def test_structure(dash_duo: DashDuo) -> None: sleep(1) logs = dash_duo.get_logs() - assert logs == [], f"Unexpected browser {logs=}" + assert logs is None, f"Unexpected browser {logs=}" diff --git a/crystal_toolkit/apps/examples/tests/typing.py b/crystal_toolkit/apps/examples/tests/typing.py index db8c0611..3baab361 100644 --- a/crystal_toolkit/apps/examples/tests/typing.py +++ b/crystal_toolkit/apps/examples/tests/typing.py @@ -16,42 +16,33 @@ class DashDuo(Protocol): # driver = ... # selenium.webdriver.remote.WebDriver - def start_server(self, start_server) -> None: - ... + def start_server(self, start_server) -> None: ... - def find_element(self, selector: str) -> dash.development.base_component.Component: - ... + def find_element( + self, selector: str + ) -> dash.development.base_component.Component: ... def wait_for_text_to_equal( self, selector: str, text: str, timeout: int | None = None - ) -> None: - ... + ) -> None: ... - def get_logs(self) -> list[str]: - ... + def get_logs(self) -> list[str]: ... - def clear_storage(self) -> None: - ... + def clear_storage(self) -> None: ... - def percy_snapshot(self, name: str, wait_for_callbacks: bool = False) -> None: - ... + def percy_snapshot(self, name: str, wait_for_callbacks: bool = False) -> None: ... - def multiple_click(self, selector: str, clicks: int) -> None: - ... + def multiple_click(self, selector: str, clicks: int) -> None: ... - def wait_for_element(self, selector: str, timeout: int | None = None) -> None: - ... + def wait_for_element(self, selector: str, timeout: int | None = None) -> None: ... - def take_snapshot(self, name: str) -> None: - ... + def take_snapshot(self, name: str) -> None: ... - def wait_for_page(self, url: str | None = None, timeout: int = 10) -> None: - ... + def wait_for_page(self, url: str | None = None, timeout: int = 10) -> None: ... def find_elements( self, selector: str - ) -> list[dash.development.base_component.Component]: - ... + ) -> list[dash.development.base_component.Component]: ... def select_dcc_dropdown( self, diff --git a/crystal_toolkit/apps/examples/transformations.py b/crystal_toolkit/apps/examples/transformations.py index 90e238bf..19b52d37 100644 --- a/crystal_toolkit/apps/examples/transformations.py +++ b/crystal_toolkit/apps/examples/transformations.py @@ -31,7 +31,7 @@ ) # example layout to demonstrate capabilities of component -my_layout = html.Div( +layout = html.Div( [ html.H1("TransformationComponent Example"), html.H2("Standard Layout"), @@ -46,7 +46,7 @@ ) # tell crystal toolkit about your app and layout -ctc.register_crystal_toolkit(app, layout=my_layout) +ctc.register_crystal_toolkit(app, layout=layout) # this is here for to see the JSON representation of # the transformations when running the example app, diff --git a/crystal_toolkit/apps/examples/transformations_minimal.py b/crystal_toolkit/apps/examples/transformations_minimal.py index 59211709..19bf0178 100644 --- a/crystal_toolkit/apps/examples/transformations_minimal.py +++ b/crystal_toolkit/apps/examples/transformations_minimal.py @@ -36,7 +36,7 @@ ) # example layout to demonstrate capabilities of component -my_layout = html.Div( +layout = html.Div( [ html.H1("TransformationComponent Example"), html.H2("Standard Layout"), @@ -49,7 +49,7 @@ ) # tell crystal toolkit about your app and layout -ctc.register_crystal_toolkit(app, layout=my_layout) +ctc.register_crystal_toolkit(app, layout=layout) @app.callback( diff --git a/crystal_toolkit/apps/examples/write_structure_screenshot_to_file.py b/crystal_toolkit/apps/examples/write_structure_screenshot_to_file.py index 40d45b49..cfeba5f0 100644 --- a/crystal_toolkit/apps/examples/write_structure_screenshot_to_file.py +++ b/crystal_toolkit/apps/examples/write_structure_screenshot_to_file.py @@ -26,7 +26,7 @@ scene_settings={"zoomToFit2D": True}, ) -my_layout = html.Div( +layout = html.Div( [structure_component.layout(), dcc.Location(id="url"), html.Div(id="dummy-output")] ) @@ -73,6 +73,6 @@ def save_image(image_data_timestamp, url, image_data): file.write(response.file.read()) -ctc.register_crystal_toolkit(app=app, layout=my_layout) +ctc.register_crystal_toolkit(app=app, layout=layout) if __name__ == "__main__": app.run(debug=True, port=8050) diff --git a/crystal_toolkit/apps/main.py b/crystal_toolkit/apps/main.py index 577f559c..b18f3286 100644 --- a/crystal_toolkit/apps/main.py +++ b/crystal_toolkit/apps/main.py @@ -55,9 +55,7 @@ } ] -print("SETTINGS") -for setting, value in SETTINGS: - print(f"{setting}: {value}") +SETTINGS.print() if not SETTINGS.ASSETS_PATH: warnings.warn( @@ -175,12 +173,7 @@ else: action_div = html.Div([struct_component.download_layout()]) -panels = [ - symmetry_panel, - localenv_panel, - xrd_panel, - robocrys_panel, -] +panels = [symmetry_panel, localenv_panel, xrd_panel, robocrys_panel] if SETTINGS.MP_EMBED_MODE: @@ -368,7 +361,7 @@ html.Div( [ html.Div( - struct_component.legend_layout(), + struct_component._sub_layouts["legend"], style={"float": "left"}, ), html.Div( @@ -398,7 +391,7 @@ id="load", ), Reveal( - [struct_component.options_layout()], + [struct_component._sub_layouts["options"]], title="Display Options", id="display-options", ), diff --git a/crystal_toolkit/apps/tests/conftest.py b/crystal_toolkit/apps/tests/conftest.py new file mode 100644 index 00000000..94f20073 --- /dev/null +++ b/crystal_toolkit/apps/tests/conftest.py @@ -0,0 +1,15 @@ +import pytest +from playwright.sync_api import Page + + +@pytest.fixture(autouse=True) +def _assert_no_console_errors(page: Page): + logs = [] + page.on("console", lambda msg: logs.append(msg)) + + page.goto("http://127.0.0.1:8050") + + yield + + errors = [msg.text for msg in logs if msg.type == "error"] + assert len(errors) == 0, f"Unexpected browser {errors=}" diff --git a/crystal_toolkit/apps/tests/test_main.py b/crystal_toolkit/apps/tests/test_main.py index eb2f1793..0447caf6 100644 --- a/crystal_toolkit/apps/tests/test_main.py +++ b/crystal_toolkit/apps/tests/test_main.py @@ -3,13 +3,13 @@ import time from typing import TYPE_CHECKING -from crystal_toolkit.apps.main import app - if TYPE_CHECKING: from crystal_toolkit.apps.examples.tests.typing import DashDuo def test_main_app_startup(dash_duo: DashDuo): + from crystal_toolkit.apps.main import app + dash_duo.start_server(app) # dash_duo.clear_storage() @@ -20,4 +20,4 @@ def test_main_app_startup(dash_duo: DashDuo): dash_duo.take_snapshot("main_app_startup-layout") logs = dash_duo.get_logs() - assert logs == [], f"Unexpected browser {logs=}" + assert logs is None, f"Unexpected browser {logs=}" diff --git a/crystal_toolkit/apps/tests/test_pourbaix.py b/crystal_toolkit/apps/tests/test_pourbaix.py new file mode 100644 index 00000000..41261b1d --- /dev/null +++ b/crystal_toolkit/apps/tests/test_pourbaix.py @@ -0,0 +1,22 @@ +import threading + +from playwright.sync_api import Page + + +def test_pourbaix(page: Page): + from crystal_toolkit.apps.examples.pourbaix import app + + thread = threading.Thread(target=app.run) + thread.start() + + # select 1st structure + page.locator(".react-select__input-container").click() + page.get_by_text("Fe₃H (mp-1184287-GGA)", exact=True).click() + + # click toggle switches + page.locator("div.mpc-switch").nth(0).click() # click on "Filter Solids" + page.locator("div.mpc-switch").nth(1).click() # click on "Show Heatmap" + + # select 2nd structure + page.locator(".react-select__input-container").click() + page.get_by_text("CoH (mp-1206874-GGA)", exact=True).click() diff --git a/crystal_toolkit/apps/tests/test_structure.py b/crystal_toolkit/apps/tests/test_structure.py new file mode 100644 index 00000000..d676e8a0 --- /dev/null +++ b/crystal_toolkit/apps/tests/test_structure.py @@ -0,0 +1,56 @@ +import re +import threading + +from playwright.sync_api import Page, expect + + +def test_structure(page: Page): + from crystal_toolkit.apps.examples.structure import app + + thread = threading.Thread(target=app.run) + thread.start() + + expect(page).to_have_title("Crystal Toolkit") + h1_text = page.text_content("h1") + assert h1_text == "StructureMoleculeComponent Example" + + # repeatedly drag the canvas to test rotating the structure + canvas = page.locator("canvas") + canvas.drag_to(target=canvas, source_position={"x": 100, "y": 20}) + canvas.drag_to(target=canvas, source_position={"x": 0, "y": 70}) + + # test enter and exit "Full screen" + full_screen_button = page.query_selector('button[data-for^="expand-"]') + assert full_screen_button.is_visible() + page.locator("button").filter(has_text="Full screen").click() + page.locator("button").filter(has_text="Exit full screen").click() + + # Check if "Show settings" button exists and is visible + settings_button = page.query_selector('button[data-for^="settings-"]') + assert settings_button.is_visible() + + # test "export structure as image" button + image_button = page.query_selector('div[data-for^="image-"] button') + image_button.click() + with page.expect_download() as download: + page.get_by_text("Screenshot (PNG)").click() + assert download.value.url.startswith("blob:http://") + + # test "export structure as file" button + position_button = page.query_selector("div[data-for^='export-'] button") + position_button.click() + with page.expect_download() as download: + page.get_by_text("CIF (Symmetrized)").click() + + assert re.match("", + str(download.value), + ) diff --git a/crystal_toolkit/components/bandstructure.py b/crystal_toolkit/components/bandstructure.py index 7580f6e3..7aedf662 100644 --- a/crystal_toolkit/components/bandstructure.py +++ b/crystal_toolkit/components/bandstructure.py @@ -523,7 +523,6 @@ def get_dos_traces( raise PreventUpdate # Projected DOS - count = 0 colors = [ "#d62728", # brick red "#2ca02c", # cooked asparagus green @@ -534,7 +533,7 @@ def get_dos_traces( "#e377c2", # raspberry yogurt pink ] - for label in proj_data: + for count, label in enumerate(proj_data): if spin_polarized: trace = { dos_axis: -1.0 @@ -565,8 +564,6 @@ def get_dos_traces( dos_traces.append(trace) - count += 1 - return dos_traces @staticmethod diff --git a/crystal_toolkit/components/diffraction.py b/crystal_toolkit/components/diffraction.py index 64d74e78..1696106a 100644 --- a/crystal_toolkit/components/diffraction.py +++ b/crystal_toolkit/components/diffraction.py @@ -503,8 +503,8 @@ def pattern_from_struct(struct, rad_source): Output(self.id("large_cell_note"), "children"), Input(self.id("structure"), "data"), ) - def update_message(structure): - if len(self.from_data(structure).sites) < SITES_LIMIT: + def update_message(structure: Structure | None): + if structure is None or len(self.from_data(structure).sites) < SITES_LIMIT: return html.Div([]) return MessageContainer( MessageBody( diff --git a/crystal_toolkit/components/diffraction_tem.py b/crystal_toolkit/components/diffraction_tem.py index b5c5fcc7..3053e3c7 100644 --- a/crystal_toolkit/components/diffraction_tem.py +++ b/crystal_toolkit/components/diffraction_tem.py @@ -64,6 +64,7 @@ def layout(self) -> Columns: step=0.25, label="Maximum Scattering Angle [Å⁻¹]", help_str="Maximum scattering angle to compute reciprocal lattice.", + max=10, ) use_dynamical = self.get_bool_input( @@ -91,6 +92,7 @@ def layout(self) -> Columns: step=0.001, label="Excitation error tolerance [Å⁻¹]", help_str="Standard deviation of Gaussian function for damping reciprocal lattice points.", + max=0.2, ) Fhkl_tol = self.get_numerical_input( @@ -243,7 +245,8 @@ def get_plot_2d( structure ) needs_structure = not self.crystal or not ( - np.allclose(self.crystal.numbers, new_crystal.numbers) + self.crystal.positions.shape[0] == new_crystal.positions.shape[0] + and np.allclose(self.crystal.numbers, new_crystal.numbers) and np.allclose(self.crystal.cell, new_crystal.cell) and np.allclose(self.crystal.positions, new_crystal.positions) ) @@ -279,7 +282,7 @@ def get_plot_2d( # generate diffraction pattern pattern = self.crystal.generate_diffraction_pattern( - zone_axis_lattice=beam_direction + zone_axis_lattice=beam_direction, tol_intensity=0.0 ) # rescale intensities diff --git a/crystal_toolkit/components/phase_diagram.py b/crystal_toolkit/components/phase_diagram.py index a543f5b7..c48204d0 100644 --- a/crystal_toolkit/components/phase_diagram.py +++ b/crystal_toolkit/components/phase_diagram.py @@ -469,7 +469,7 @@ def _sub_layouts(self) -> dict[str, Component]: graph = html.Div( [ dcc.Graph( - figure=go.Figure(layout=PhaseDiagramComponent.empty_plot_style), + figure=go.Figure(layout={**PhaseDiagramComponent.empty_plot_style}), id=self.id("graph"), config={"displayModeBar": False, "displaylogo": False}, ) diff --git a/crystal_toolkit/components/phonon.py b/crystal_toolkit/components/phonon.py index 38e75878..d3de53a3 100644 --- a/crystal_toolkit/components/phonon.py +++ b/crystal_toolkit/components/phonon.py @@ -174,7 +174,7 @@ def layout(self) -> html.Div: @staticmethod def _get_ph_bs_dos( - data: dict[str, Any] | None + data: dict[str, Any] | None, ) -> tuple[PhononBandStructureSymmLine, CompletePhononDos]: data = data or {} @@ -399,7 +399,6 @@ def get_ph_dos_traces(dos: CompletePhononDos, freq_range: tuple[float, float]): dos_traces.append(trace_tdos) # Projected DOS - count = 0 colors = [ "#d62728", # brick red "#2ca02c", # cooked asparagus green @@ -411,7 +410,7 @@ def get_ph_dos_traces(dos: CompletePhononDos, freq_range: tuple[float, float]): ] ele_dos = dos.get_element_dos() # project DOS onto elements - for label in ele_dos: + for count, label in enumerate(ele_dos): spin_up_label = str(label) trace = { @@ -426,8 +425,6 @@ def get_ph_dos_traces(dos: CompletePhononDos, freq_range: tuple[float, float]): dos_traces.append(trace) - count += 1 - return dos_traces @staticmethod diff --git a/crystal_toolkit/components/pourbaix.py b/crystal_toolkit/components/pourbaix.py index 1452563c..836d8d04 100644 --- a/crystal_toolkit/components/pourbaix.py +++ b/crystal_toolkit/components/pourbaix.py @@ -583,7 +583,7 @@ def _sub_layouts(self) -> dict[str, Component]: responsive=True, config={"displayModeBar": False, "displaylogo": False}, ), - style={"min-height": "500px"}, + style={"minHeight": "500px"}, ) return {"graph": graph, "options": options} diff --git a/crystal_toolkit/components/search.py b/crystal_toolkit/components/search.py index 856f1e85..c43d4cb7 100644 --- a/crystal_toolkit/components/search.py +++ b/crystal_toolkit/components/search.py @@ -184,7 +184,7 @@ def update_dropdown_options(results): def update_dropdown_value(results): if not results or "error" in results: raise PreventUpdate - return list(results)[0] + return next(iter(results)) @app.callback( Output(self.id("dropdown-container"), "style"), diff --git a/crystal_toolkit/components/structure.py b/crystal_toolkit/components/structure.py index 5d341017..459e024d 100644 --- a/crystal_toolkit/components/structure.py +++ b/crystal_toolkit/components/structure.py @@ -111,6 +111,7 @@ def __init__( show_image_button: bool = DEFAULTS["show_image_button"], show_export_button: bool = DEFAULTS["show_export_button"], show_position_button: bool = DEFAULTS["show_position_button"], + scene_kwargs: dict | None = None, **kwargs, ) -> None: """Create a StructureMoleculeComponent from a structure or molecule. @@ -118,34 +119,37 @@ def __init__( Args: struct_or_mol (None |, optional): input structure or molecule. Defaults to None. id (str, optional): canonical id. Defaults to None. - className (str, optional): extra geometric elements to add to the 3D scene. Defaults to "box". - scene_additions (Scene | None, optional): bonding strategy from pymatgen NearNeighbors class. + className (str, optional): CSS class name for the root element. Defaults to "box". + scene_additions (Scene | None, optional): extra geometric elements to add to the 3D scene. Defaults to "box". + bonding_strategy (str, optional): bonding strategy from pymatgen NearNeighbors class. Defaults to None. - bonding_strategy (str, optional): options for the bonding strategy. - bonding_strategy_kwargs (dict | None, optional): color scheme, see Legend class. - Defaults to None. - color_scheme (str, optional): color scale, see Legend class. - color_scale (str | None, optional): radius strategy, see Legend class. - Defaults to None. - radius_strategy (str, optional): optional): radius strategy, see Legend class. - unit_cell_choice (str, optional): whether to draw repeats of atoms on periodic images. - draw_image_atoms (bool, optional): whether to draw sites bonded outside the unit cell. - bonded_sites_outside_unit_cell (bool, optional): whether to hide or show incomplete bonds. - Defaults to DEFAULTS[ "bonded_sites_outside_unit_cell" ]. - hide_incomplete_bonds (bool, optional): whether to hide or show the compass. - show_compass (bool, optional): scene settings (lighting etc.) to pass to CrystalToolkitScene. - scene_settings (dict | None, optional): a site property used for grouping of atoms for - mouseover/interaction. Defaults to None. + bonding_strategy_kwargs (dict | None, optional): options for the bonding strategy. + color_scheme (str, optional): color scheme, see Legend class. Defaults to None. + color_scale (str | None, optional): color scale, see Legend class. + radius_strategy (str, optional): radius strategy, see Legend class. + unit_cell_choice (str, optional): one of "input", "primitive", "conventional", "reduced_niggli", "reduced_lll". + Defaults to "input", i.e. no change to unit cell, render as-is. + draw_image_atoms (bool, optional): whether to draw repeats of atoms on periodic images. + bonded_sites_outside_unit_cell (bool, optional): whether to hide or show sites outside the unit cell + that are bonded to sites within the unit cell. Defaults to False. + hide_incomplete_bonds (bool, optional): whether to hide or show incomplete bonds. + Defaults to False. + show_compass (bool, optional): whether to hide or show the compass. + scene_settings (dict | None, optional): scene settings (lighting etc.) to pass to CrystalToolkitScene. group_by_site_property (str | None, optional): a site property used for grouping of atoms for mouseover/interaction. Defaults to None. - show_legend (bool, optional): optional): show or hide legend panel within the scene. - show_settings (bool, optional): show or hide scene control bar. - show_controls (bool, optional): show or hide the full screen button within the scene control bar. - show_expand_button (bool, optional): show or hide the image download button within the scene control bar. - show_image_button (bool, optional): show or hide the file export button within the scene control bar. - show_export_button (bool, optional): show or hide the revert position button within the scene control bar. - show_position_button (bool, optional): extra keyword arguments to pass to MPComponent. e.g. Wyckoff label. - **kwargs: a CSS dimension specifying width/height of Div. + show_legend (bool, optional): show or hide legend panel within the scene. + show_settings (bool, optional): show or hide settings panel within the scene. + show_controls (bool, optional): show or hide scene control bar. + show_expand_button (bool, optional): show or hide the full screen button within the scene control bar. + show_image_button (bool, optional): show or hide the image download as image button within the scene control bar. + show_export_button (bool, optional): show or hide the file export button within the scene control bar. + show_position_button (bool, optional): show or hide the revert position button within the scene control bar. + scene_kwargs (dict, optional): extra keyword arguments to pass to CrystalToolkitScene. + e.g. sceneSize, axisView, renderer, customCameraState, etc. See + https://github.com/materialsproject/dash-mp-components/blob/maindash_mp_components/CrystalToolkitScene.py + for complete list. + **kwargs: extra keyword arguments to pass to MPComponent. e.g. Wyckoff label. """ super().__init__(id=id, default_data=struct_or_mol, **kwargs) self.className = className @@ -233,11 +237,12 @@ def __init__( # this is used by a CrystalToolkitScene component, not a dcc.Store self._initial_data["scene"] = scene - # hide axes inset for molecules - if isinstance(struct_or_mol, (Molecule, MoleculeGraph)): - self.scene_kwargs = {"axisView": "HIDDEN"} - else: - self.scene_kwargs = {} + is_mol = isinstance(struct_or_mol, (Molecule, MoleculeGraph)) + self.scene_kwargs = { + # hide axes inset for molecules + **({"axisView": "HIDDEN"} if is_mol else {}), + **(scene_kwargs or {}), + } def __str__(self) -> str: return repr(self) @@ -456,12 +461,16 @@ def download_image(image_data_timestamp, image_data, data): formula = struct_or_mol.molecule.composition.reduced_Formula else: formula = struct_or_mol.composition.reduced_formula - spg_symbol = ( - struct_or_mol.get_space_group_info()[0] - if hasattr(struct_or_mol, "get_space_group_info") - else "" + # molecules don't have space group in which case fall back to empty string + spg_symbol = getattr(struct_or_mol, "get_space_group_info", lambda: [""])()[ + 0 + ] + request_filename = f"{formula}-{spg_symbol}.png" + material_id = struct_or_mol.properties.get( + "material_id", struct_or_mol.properties.get("id") ) - request_filename = f"{formula}-{spg_symbol}-crystal-toolkit.png" + if material_id: + request_filename = f"{material_id}-{request_filename}" return { "content": image_data[len("data:image/png;base64,") :], @@ -954,50 +963,43 @@ def _preprocess_input_to_graph( if isinstance(input, (StructureGraph, MoleculeGraph)): graph = input else: - if ( - bonding_strategy - not in StructureMoleculeComponent.available_bonding_strategies - ): - valid_subclasses = ", ".join( - StructureMoleculeComponent.available_bonding_strategies - ) + valid_bond_strategies = ( + StructureMoleculeComponent.available_bonding_strategies + ) + if bonding_strategy not in valid_bond_strategies: raise ValueError( "Bonding strategy not supported. Please supply a name of a NearNeighbor " - f"subclass, choose from: {valid_subclasses}" + f"subclass, choose from: {', '.join(valid_bond_strategies)}" ) - else: - bonding_strategy_kwargs = bonding_strategy_kwargs or {} - if ( - bonding_strategy == "CutOffDictNN" - and "cut_off_dict" in bonding_strategy_kwargs - ): - # TODO: remove this hack by making args properly JSON serializable - bonding_strategy_kwargs["cut_off_dict"] = { - (x[0], x[1]): x[2] - for x in bonding_strategy_kwargs["cut_off_dict"] - } - bonding_strategy = ( - StructureMoleculeComponent.available_bonding_strategies[ - bonding_strategy - ](**bonding_strategy_kwargs) - ) - try: - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - if isinstance(input, Structure): - graph = StructureGraph.with_local_env_strategy( - input, bonding_strategy - ) - else: - graph = MoleculeGraph.with_local_env_strategy( - input, bonding_strategy, reorder=False - ) - except Exception: - # for some reason computing bonds failed, so let's not have any bonds(!) + bonding_strategy_kwargs = bonding_strategy_kwargs or {} + if ( + bonding_strategy == "CutOffDictNN" + and "cut_off_dict" in bonding_strategy_kwargs + ): + # TODO: remove this hack by making args properly JSON serializable + bonding_strategy_kwargs["cut_off_dict"] = { + (x[0], x[1]): x[2] for x in bonding_strategy_kwargs["cut_off_dict"] + } + bonding_strategy = valid_bond_strategies[bonding_strategy]( + **bonding_strategy_kwargs + ) + try: + with warnings.catch_warnings(): + warnings.simplefilter("ignore") if isinstance(input, Structure): - graph = StructureGraph.with_empty_graph(input) + graph = StructureGraph.with_local_env_strategy( + input, bonding_strategy + ) else: - graph = MoleculeGraph.with_empty_graph(input) + graph = MoleculeGraph.with_local_env_strategy( + input, bonding_strategy, reorder=False + ) + except Exception: + # for some reason computing bonds failed, so let's not have any bonds(!) + if isinstance(input, Structure): + graph = StructureGraph.with_empty_graph(input) + else: + graph = MoleculeGraph.with_empty_graph(input) return graph diff --git a/crystal_toolkit/core/jupyter.py b/crystal_toolkit/core/jupyter.py new file mode 100644 index 00000000..f799a7a9 --- /dev/null +++ b/crystal_toolkit/core/jupyter.py @@ -0,0 +1,135 @@ +"""Pleasant hack to support MSONable objects in Dash callbacks natively.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, ClassVar +from warnings import warn + +from dash import Dash +from monty.json import jsanitize +from pymatgen.analysis.graphs import MoleculeGraph, StructureGraph +from pymatgen.core.structure import SiteCollection + +import crystal_toolkit.helpers.layouts as ctl +from crystal_toolkit.components.structure import StructureMoleculeComponent +from crystal_toolkit.core.plugin import CrystalToolkitPlugin +from crystal_toolkit.settings import SETTINGS + +if TYPE_CHECKING: + from monty.json import MSONable + + from crystal_toolkit.core.mpcomponent import MPComponent + + +class _JupyterRenderer: + # TODO: For now this is hard-coded but could be replaced with a Registry class later. + registry: ClassVar[dict[MSONable, MPComponent]] = { + SiteCollection: StructureMoleculeComponent, + StructureGraph: StructureMoleculeComponent, + MoleculeGraph: StructureMoleculeComponent, + } + + @staticmethod + def _find_available_port(): + """Find an available port. + + Thank you Mihai Capotă, https://stackoverflow.com/a/61685162 + """ + import socketserver + + with socketserver.TCPServer(("localhost", 0), None) as s: + return s.server_address[1] + + # check docs about callback exception output + # check docs about proxy settings + + def run(self, layout): + """Run Dash app.""" + app = Dash(plugins=[CrystalToolkitPlugin(layout=layout)]) + + port = SETTINGS.JUPYTER_EMBED_PORT or self._find_available_port() + + # try preferred port first, if already in use try alternative + try: + app.run(port=port, jupyter_mode=SETTINGS.JUPYTER_EMBED_MODE) + except OSError: + free_port = self._find_available_port() + warn("Port {port} not available, using {free_port} instead.") + app.run(port=free_port, jupyter_mode=SETTINGS.JUPYTER_EMBED_MODE) + + def display(self, obj): + """Display a provided object.""" + for kls, component in self.registry.items(): + if isinstance(obj, kls): + layout = ctl.Block( + [component(obj).layout()], + style={"margin-top": "1rem", "margin-left": "1rem"}, + ) + return self.run(layout) + + raise ValueError(f"No component defined for object of type {type(obj)}.") + + +def _to_plotly_json(self): + """Patch to ensure MSONable objects can be serialized into JSON by plotly tools.""" + return self.as_dict() + + +def _display_json(self, **kwargs): + """Display JSON representation of an MSONable object inside Jupyter.""" + from IPython.display import JSON + + JSON(self.as_dict(), **kwargs) + + +def _repr_mimebundle_(self, include=None, exclude=None): + """Method used by Jupyter. A default for MSONable objects to return JSON representation.""" + return { + "application/json": self.as_dict(), + "text/plain": repr(self), + } + + +def _ipython_display_(self): + """Display MSONable objects using a Crystal Toolkit component, if available.""" + from IPython.display import publish_display_data + + if any(isinstance(self, x) for x in _JupyterRenderer.registry): + return _JupyterRenderer().display(self) + + # To be strict here, we could use inspect.signature + # and .return_annotation is either a Scene or a go.Figure respectively + # and also check all .parameters .kind.name have no POSITIONAL_ONLY + # in practice, fairly unlikely this will cause issues without strict checking. + # TODO: This can be removed once a central registry of renderable objects is implemented. + if hasattr(self, "get_scene"): + display_data = { + "application/vnd.mp.ctk+json": self.get_scene().to_json(), + "text/plain": repr(self), + } + elif hasattr(self, "get_plot"): + display_data = { + "application/vnd.plotly.v1+json": self.get_plot().to_plotly_json(), + "application/json": jsanitize(self.as_dict()), + "text/plain": repr(self), + } + else: + display_data = { + "application/json": jsanitize(self.as_dict()), + "text/plain": repr(self), + } + + publish_display_data(display_data) + return None + + +def patch_msonable(): + """Patch MSONable to allow MSONable objects to render in Jupyter + environments using Crystal Toolkit components. + """ + from monty.json import MSONable + + MSONable.to_plotly_json = _to_plotly_json + MSONable._repr_mimebundle_ = _repr_mimebundle_ + MSONable.display_json = _display_json + MSONable._ipython_display_ = _ipython_display_ diff --git a/crystal_toolkit/core/legend.py b/crystal_toolkit/core/legend.py index dd6a8ecb..19a779c5 100644 --- a/crystal_toolkit/core/legend.py +++ b/crystal_toolkit/core/legend.py @@ -6,7 +6,7 @@ from itertools import chain from typing import TYPE_CHECKING, Any -from matplotlib.cm import get_cmap +from matplotlib.pyplot import get_cmap from monty.json import MSONable from monty.serialization import loadfn from palettable.colorbrewer.qualitative import Set1_9 @@ -16,6 +16,8 @@ from sklearn.preprocessing import LabelEncoder from webcolors import html5_parse_legacy_color, html5_serialize_simple_color +from crystal_toolkit.settings import SETTINGS + if TYPE_CHECKING: from pymatgen.core.structure import SiteCollection @@ -34,18 +36,17 @@ class Legend(MSONable): is at) to correctly generate the legend. """ - default_color_scheme = "Jmol" - default_color = (0, 0, 0) - default_radius = 1.0 - fallback_radius = 0.5 - uniform_radius = 0.5 + default_color_scheme = SETTINGS.LEGEND_COLOR_SCHEME + default_color = SETTINGS.LEGEND_FALLBACK_COLOR + fallback_radius = SETTINGS.LEGEND_FALLBACK_RADIUS + uniform_radius = SETTINGS.LEGEND_UNIFORM_RADIUS def __init__( self, site_collection: SiteCollection | Site, - color_scheme: str = "Jmol", - radius_scheme: str = "uniform", - cmap: str = "coolwarm", + color_scheme: str = SETTINGS.LEGEND_COLOR_SCHEME, + radius_scheme: str = SETTINGS.LEGEND_RADIUS_SCHEME, + cmap: SETTINGS.LEGEND_CMAP = "coolwarm", cmap_range: tuple[float, float] | None = None, ) -> None: """Create a legend for a given SiteCollection to choose how to display colors and radii for @@ -98,9 +99,9 @@ def __init__( if color_scheme not in self.allowed_color_schemes: warnings.warn( f"Color scheme {color_scheme} not available, " - f"falling back to {self.default_color_scheme}." + f"falling back to {SETTINGS.LEGEND_COLOR_SCHEME}." ) - color_scheme = self.default_color_scheme + color_scheme = SETTINGS.LEGEND_COLOR_SCHEME # if color-coding by a scalar site property, determine minimum and # maximum values for color scheme, will default to be symmetric @@ -256,7 +257,11 @@ def get_color(self, sp: Species | Element, site: Site | None = None) -> str: Returns: Color """ # allow manual override by user - if site and "display_color" in site.properties: + if ( + site + and "display_color" in site.properties + and site.properties["display_color"] is not None + ): color = site.properties["display_color"] # TODO: next two lines due to change in API, will be removed if isinstance(color, list) and isinstance(color[0], str): diff --git a/crystal_toolkit/core/mpcomponent.py b/crystal_toolkit/core/mpcomponent.py index aaf8a45a..80878543 100644 --- a/crystal_toolkit/core/mpcomponent.py +++ b/crystal_toolkit/core/mpcomponent.py @@ -9,32 +9,30 @@ from itertools import chain, zip_longest from json import JSONDecodeError, dumps, loads from typing import TYPE_CHECKING, Any, ClassVar, Literal +from warnings import warn import dash import dash_mp_components as mpc import numpy as np from dash import dcc, html from dash.dependencies import ALL -from flask_caching import Cache from monty.json import MontyDecoder, MSONable -from crystal_toolkit import __version__ as ct_version +from crystal_toolkit.core.plugin import CrystalToolkitPlugin from crystal_toolkit.helpers.layouts import H6, Button, Icon, Loading, add_label_help from crystal_toolkit.settings import SETTINGS if TYPE_CHECKING: import plotly.graph_objects as go + from flask_caching import Cache -# fallback cache if Redis etc. isn't set up -null_cache = Cache(config={"CACHE_TYPE": "null"}) - # Crystal Toolkit namespace, added to the start of all ids # so we can see which layouts have been added by Crystal Toolkit CT_NAMESPACE = "CT" -class MPComponent(ABC): +class MPComponent(ABC): # noqa: B024 """The abstract base class for an MPComponent. MPComponent is designed to help render an MSONable object. @@ -60,74 +58,46 @@ class MPComponent(ABC): @staticmethod def register_app(app: dash.Dash): - """This method must be called at least once in your Crystal Toolkit Dash app if you want to - enable interactivity with the MPComponents. The "app" variable is a special global variable - used by Dash/Flask, and registering it with MPComponent allows callbacks to be registered - with the app on instantiation. - - Args: - app: a Dash app instance - """ - MPComponent.app = app - # add metadata - app.config.meta_tags.append( - { - "name": "generator", - "content": f"Crystal Toolkit {ct_version} (Materials Project)", - } + """This method has been deprecated. Please use crystal_toolkit.CrystalToolkitPlugin.""" + warn( + "The register_app method is no longer required, please instead use the " + "crystal_toolkit.CrystalToolkitPlugin when instantiating your Dash app.", + category=PendingDeprecationWarning, ) - # set default title, but respect the user if they override it - if app.title == "Dash": - app.title = "Crystal Toolkit" + return @staticmethod def register_cache(cache: Cache) -> None: - """This method must be called at least once in your Crystal Toolkit Dash app if you want to - enable callback caching. Callback caching is one of the easiest ways to see significant - performance improvements, especially for callbacks that are computationally expensive. - - Args: - cache: a flask_caching Cache instance - """ - if SETTINGS.DEBUG_MODE: - MPComponent.cache = null_cache - MPComponent.cache.init_app(MPComponent.app.server) - elif cache: - MPComponent.cache = cache - else: - MPComponent.cache = Cache( - MPComponent.app.server, config={"CACHE_TYPE": "simple"} - ) + """This method has been deprecated. Please use crystal_toolkit.CrystalToolkitPlugin.""" + warn( + "The register_cache method is no longer required, please instead use the " + "crystal_toolkit.CrystalToolkitPlugin when instantiating your Dash app.", + category=PendingDeprecationWarning, + ) + return @staticmethod def crystal_toolkit_layout(layout: html.Div) -> html.Div: - if not MPComponent.app: - raise ValueError( - "Please register the Dash app with Crystal Toolkit using register_app()." - ) - - # layout_str = str(layout) - stores_to_add = [] - for basename in MPComponent._all_id_basenames: - # can use "if basename in layout_str:" to restrict to components present in initial layout - # this would cause bugs for components displayed dynamically - stores_to_add += MPComponent._app_stores_dict[basename] - layout.children += stores_to_add - - # set app.layout to layout so that callbacks can be validated - MPComponent.app.layout = layout - - for component in MPComponent._callbacks_to_generate: - component.generate_callbacks(MPComponent.app, MPComponent.cache) - - return layout + """This method has been deprecated. Please use crystal_toolkit.CrystalToolkitPlugin.""" + warn( + "The crystal_toolkit_layout method is no longer required, please instead use the " + "crystal_toolkit.CrystalToolkitPlugin when instantiating your Dash app.", + category=PendingDeprecationWarning, + ) + return @staticmethod def register_crystal_toolkit(app, layout, cache=None): - MPComponent.register_app(app) - MPComponent.register_cache(cache) - app.config["suppress_callback_exceptions"] = True - app.layout = MPComponent.crystal_toolkit_layout(layout) + """This method has been deprecated. Please use crystal_toolkit.CrystalToolkitPlugin.""" + warn( + "The register_crystal_toolkit method is no longer required, please instead use the " + "crystal_toolkit.CrystalToolkitPlugin when instantiating your Dash app.", + category=PendingDeprecationWarning, + ) + # call the plugin manually for backwards compatibility, but the + # user should instead use Dash(..., plugins=[CrystalToolkitPlugin(cache=cache, layout=layout)]) + plugin = CrystalToolkitPlugin(layout=layout, cache=cache) + plugin.plug(app) @staticmethod def all_app_stores() -> html.Div: @@ -162,9 +132,8 @@ def __init__( anywhere you choose: my_component.layout If you want the layouts to be interactive, i.e. to respond to callbacks, - you have to also use the MPComponent.register_app(app) method in your app, - and also include MPComponent.all_app_stores in your app.layout (an - invisible layout that contains the MSON itself). + you have to also use the CrystalToolkitPlugin when instantiating your + Dash app. If you do not want the layouts to be interactive, set disable_callbacks to True to prevent errors. @@ -379,7 +348,7 @@ def generate_callbacks(self, app, cache) -> None: def get_numerical_input( self, kwarg_label: str, - default: int | float | list | None = None, + default: float | list | None = None, state: dict | None = None, label: str | None = None, help_str: str | None = None, @@ -429,7 +398,7 @@ def matrix_element(idx, value=0): className="input", style=style, value=float(value) if value is not None else None, - persistence=True, + persistence="True", type="number", **kwargs, ) @@ -440,7 +409,7 @@ def matrix_element(idx, value=0): className="input", style=style, value=int(value) if value is not None else None, - persistence=True, + persistence="True", type="number", **kwargs, ) @@ -632,7 +601,7 @@ def pair_element(idx, key=None, value=None): className="input", style=style, value=value, - persistence=True, + persistence="True", **kwargs, ) vid = self.id(kwarg_label, is_kwarg=True, idx=("v", idx), hint="dict") @@ -642,7 +611,7 @@ def pair_element(idx, key=None, value=None): className="input", style=style, value=value, - persistence=True, + persistence="True", **kwargs, ) diff --git a/crystal_toolkit/core/panelcomponent.py b/crystal_toolkit/core/panelcomponent.py index dc6b647f..03392e3e 100644 --- a/crystal_toolkit/core/panelcomponent.py +++ b/crystal_toolkit/core/panelcomponent.py @@ -47,8 +47,6 @@ def contents_layout(self) -> html.Div: raise NotImplementedError def generate_callbacks(self, app, cache) -> None: - pass - @app.callback( Output(self.id("contents"), "children"), Input(self.id("panel_summary"), "n_clicks"), diff --git a/crystal_toolkit/core/plugin.py b/crystal_toolkit/core/plugin.py new file mode 100644 index 00000000..6b8fdae9 --- /dev/null +++ b/crystal_toolkit/core/plugin.py @@ -0,0 +1,105 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +from flask_caching import Cache + +from crystal_toolkit.settings import SETTINGS + +if TYPE_CHECKING: + from dash import Dash, html + + +class CrystalToolkitPlugin: + """Enables Crystal Toolkit components to work with your Dash app. + + This is a replacement for the previous `register_crystal_toolkit` + function, to instead use Dash's native plugin system. + + You can use this plugin when instantiating your Dash app: + + dash = Dash(..., plugins=[CrystalToolkitPlugin(layout=layout)]) + + Eventually, it is hoped to remove the need for this plugin entirely. + """ + + def __init__( + self, layout, cache: Cache | None = None, use_default_css=True + ) -> None: + """Provide your initial app layout. + + Provide a cache to improve performance. If running + in debug mode, the cache will be automatically disabled. If + not specified, a default "simple" cache will be enabled. The + redis cache is recommended in production contexts. + + If `use_default_css` is set, Bulma and Font Awesome CSS will + be loaded from external CDNs, as defined in Crystal Toolkit + settings. + """ + if cache: + self.cache = cache + elif SETTINGS.DEBUG_MODE: + self.cache = Cache(config={"CACHE_TYPE": "null"}) + else: + self.cache = Cache(config={"CACHE_TYPE": "simple"}) + + self.layout = layout + + self.use_default_css = use_default_css + + def plug(self, app: Dash): + """Initialize Crystal Toolkit plugin for the specified Dash app.""" + self.app = app + self.cache.init_app(app.server) + + from crystal_toolkit import __version__ as ct_version + + # add metadata for "generator" tag + app.config.meta_tags.append( + { + "name": "generator", + "content": f"Crystal Toolkit {ct_version} (Materials Project)", + } + ) + + # set default title, but respect the user if they override the default + if app.title == "Dash": + app.title = "Crystal Toolkit" + + # these should no longer be needed after switching to All-in-One components + # and pattern-matching callbacks + app.config["suppress_callback_exceptions"] = True + app.layout = self.crystal_toolkit_layout(self.layout) + + if self.use_default_css: + if bulma_css := SETTINGS.BULMA_CSS_URL: + app.config.external_stylesheets.append(bulma_css) + if font_awesome_css := SETTINGS.FONT_AWESOME_CSS_URL: + app.config.external_stylesheets.append(font_awesome_css) + + def crystal_toolkit_layout(self, layout) -> html.Div: + """Crystal Toolkit currently requires a set of dcc.Store components + to be added to the layout in order to function. + + Eventually, it is hoped to remove the need for this method through + use of All-in-One components. All-in-One components were not yet + available when Crystal Toolkit was first developed. + """ + from crystal_toolkit.core.mpcomponent import MPComponent + + # Crystal Toolkit has not been tested with dynamic layouts + if callable(layout): + layout = layout() + + stores_to_add = [] + for basename in MPComponent._all_id_basenames: + # can use "if basename in layout_str:" to restrict to components present in initial layout + # this would cause bugs for components displayed dynamically + stores_to_add += MPComponent._app_stores_dict[basename] + layout.children += stores_to_add + + for component in MPComponent._callbacks_to_generate: + component.generate_callbacks(self.app, self.cache) + + return layout diff --git a/crystal_toolkit/defaults.py b/crystal_toolkit/defaults.py index 94c09f88..1c9fa01d 100644 --- a/crystal_toolkit/defaults.py +++ b/crystal_toolkit/defaults.py @@ -1,4 +1,5 @@ """Populate the default values from the JSON file.""" + from __future__ import annotations import json diff --git a/crystal_toolkit/helpers/asymptote_renderer.py b/crystal_toolkit/helpers/asymptote_renderer.py index a52a89e8..19908b80 100644 --- a/crystal_toolkit/helpers/asymptote_renderer.py +++ b/crystal_toolkit/helpers/asymptote_renderer.py @@ -5,6 +5,7 @@ TODO The code should also append a set of special points at the end in case the user wants to add more "hand drawn" features to the plot. """ + from __future__ import annotations import logging diff --git a/crystal_toolkit/helpers/layouts.py b/crystal_toolkit/helpers/layouts.py index 4c56753c..c9d7058b 100644 --- a/crystal_toolkit/helpers/layouts.py +++ b/crystal_toolkit/helpers/layouts.py @@ -1,118 +1,771 @@ +"""Helper methods to make working with Bulma classes easier. This file incorporates +language from the Bulma documentation. See https://github.com/jgthms/bulma/blob/master/LICENSE +""" + from __future__ import annotations import warnings -from typing import Any +from typing import TYPE_CHECKING, Any, Literal, Sequence from uuid import uuid4 import dash_mp_components as mpc from dash import dcc, html from monty.serialization import loadfn -from crystal_toolkit import MODULE_PATH from crystal_toolkit.settings import SETTINGS -BULMA_CSS = { - "external_url": "https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css" -} - -FONT_AWESOME_CSS = { - "external_url": "https://use.fontawesome.com/releases/v5.6.3/css/all.css" -} - -PRIMARY_COLOR = "hsl(171, 100%, 41%)" +if TYPE_CHECKING: + from dash.development.base_component import Component -# TODO: change "kind" kwarg to list / group is- modifiers together? +BulmaPrimaryColor = Literal[ + "white", + "black", + "light", + "dark", + "primary", + "link", + "info", + "success", + "warning", + "danger", +] -""" -Helper methods to make working with Bulma classes easier. -""" +# Developer note: Subclasses use `*args`` since common usage of html/dcc components +# is to use the `children` arg as a positional argument, and we want to continue +# to allow this here, unless we override the `children` argument in the subclass. -def _update_css_class(kwargs, class_name): +def _update_css_class(kwargs, class_name, conditional=True): """Convenience function to update className while respecting any additional classNames already set. """ - if "className" in kwargs: - kwargs["className"] += f" {class_name}" - else: - kwargs["className"] = class_name + if conditional: + if "className" in kwargs: + kwargs["className"] += f" {class_name}" + else: + kwargs["className"] = class_name + +# Bulma "Form" +# See https://bulma.io/documentation/form/general/ -class Section(html.Div): + +class Field(html.Div): + def __init__( + self, + *args, + addons: bool = False, + addons_centered: bool = False, + addons_right: bool = False, + grouped: bool = False, + grouped_centered: bool = False, + grouped_right: bool = False, + grouped_multiline: bool = False, + **kwargs, + ) -> None: + """When combining several controls in a form, use the field class as a container, to keep the spacing consistent. + + See https://bulma.io/documentation/form/general/ + """ + _update_css_class(kwargs, "field") + + _update_css_class(kwargs, "has-addons", addons) + _update_css_class(kwargs, "has-addons-centered", addons_centered) + _update_css_class(kwargs, "has-addons_right", addons_right) + _update_css_class(kwargs, "is-grouped", grouped) + _update_css_class(kwargs, "is-grouped-centered", grouped_centered) + _update_css_class(kwargs, "is-grouped-right", grouped_right) + _update_css_class(kwargs, "is-grouped-multiline", grouped_multiline) + + super().__init__(*args, **kwargs) + + +class Control(html.Div): def __init__(self, *args, **kwargs) -> None: - _update_css_class(kwargs, "section") + """To maintain an evenly balanced design, Bulma provides a very useful control container with which you can wrap the form controls. + + See https://bulma.io/documentation/form/general/ + """ + # Developer note: has-icon-left etc. have not yet been tested with dcc Components + _update_css_class(kwargs, "control") super().__init__(*args, **kwargs) -class Container(html.Div): +class Input(dcc.Input): + def __init__( + self, + *args, + color: BulmaPrimaryColor | None = None, + size: Literal["small", "normal", "medium", "large"] | None = None, + rounded: bool = False, + **kwargs, + ) -> None: + """A dcc.Input with Bulma styles attached. + + See https://bulma.io/documentation/form/input/ + """ + _update_css_class(kwargs, "input") + _update_css_class(kwargs, f"is-{color}", color) + _update_css_class(kwargs, f"is-{size}", size) + _update_css_class(kwargs, "is-rounded", rounded) + + super().__init__(*args, **kwargs) + + +class Textarea(dcc.Textarea): + def __init__( + self, + *args, + color: BulmaPrimaryColor | None = None, + size: Literal["small", "medium", "large"] | None = None, + fixed_size: bool = False, + **kwargs, + ) -> None: + """A dcc.Textarea with Bulma styles attached. + + See https://bulma.io/documentation/form/textarea/ + """ + _update_css_class(kwargs, "textarea") + _update_css_class(kwargs, f"is-{color}", color) + _update_css_class(kwargs, f"is-{size}", size) + _update_css_class(kwargs, "has-fixed-size", fixed_size) + + super().__init__(*args, **kwargs) + + +class Select: + # TODO: see if dcc.Dropdown can be styled with Bulma styles. def __init__(self, *args, **kwargs) -> None: - _update_css_class(kwargs, "container") + raise NotImplementedError("Not implemented, prefer dcc.Dropdown.") + + +class Checkbox: + # TODO: see if dcc.Checklist can be styled with Bulma styles. + def __init__(self, *args, **kwargs) -> None: + raise NotImplementedError("Not implemented, prefer dcc.Checklist.") + + +class Radio: + # TODO: see if dcc.RadioItems can be styled with Bulma styles. + def __init__(self, *args, **kwargs) -> None: + raise NotImplementedError("Not implemented, prefer dcc.RadioItems.") + + +class File(dcc.Upload): + def __init__( + self, + icon: str | None = "upload", + label: str | None = "Choose a file...", + alignment: Literal["centered", "right"] | None = None, + fullwidth: bool = False, + boxed: bool = False, + color: BulmaPrimaryColor | None = None, + size: Literal["small", "normal", "medium", "large"] | None = None, + placeholder: str | None = None, + **kwargs, + ) -> None: + """Returns a dcc.Upload with Bulma styling. + + See https://bulma.io/documentation/form/file/ + """ + div_kwargs = {"className": "file"} + + children = [] + if icon or label: + cta = html.Span(className="file-cta") + if icon: + cta.children.append(Icon(kind=icon)) + if label: + cta.children.append(html.Span(label, className="file-label")) + children.append(cta) + + if placeholder: + _update_css_class(div_kwargs, "has_name") + children.append(html.Span(placeholder, className="file-name")) + + _update_css_class(div_kwargs, f"is-{alignment}", alignment) + _update_css_class(div_kwargs, "is-fullwidth", fullwidth) + _update_css_class(div_kwargs, "is-boxed", boxed) + _update_css_class(div_kwargs, f"is-{color}", color) + _update_css_class(div_kwargs, f"is-{size}", size) + + super().__init__(children=html.Div(children, className="file"), **kwargs) + + +class Label(html.Label): + def __init__(self, *args, **kwargs) -> None: + # TODO docstring, use Field([Label(...), Control(...), Help(...)]) + _update_css_class(kwargs, "label") super().__init__(*args, **kwargs) +class Help(html.P): + def __init__(self, *args, **kwargs) -> None: + # TODO docstring, use Field([Label(...), Control(...), Help(...)]) + _update_css_class(kwargs, "help") + super().__init__(*args, **kwargs) + + +# Bulma "Elements" +# See https://bulma.io/documentation/elements/ + + class Block(html.Div): + """The block element is a simple spacer tool. It allows sibling HTML elements to have a consistent margin between them. + + See https://bulma.io/documentation/elements/block/ + """ + def __init__(self, *args, **kwargs) -> None: _update_css_class(kwargs, "block") super().__init__(*args, **kwargs) -class Columns(html.Div): +class Box(html.Div): + def __init__(self, *args, **kwargs) -> None: + """The box element is a simple container with a white background, some padding, and a box shadow. + + See https://bulma.io/documentation/elements/box/ + """ + _update_css_class(kwargs, "box") + super().__init__(*args, **kwargs) + + +class Button(html.Button): def __init__( self, *args, - desktop_only=False, - centered=False, - gapless=False, - multiline=False, + kind: Literal[BulmaPrimaryColor, "ghost"] | None = None, + size: Literal["small", "normal", "medium", "large"] | None = None, + display: Literal["fullwidth"] | None = None, + light: bool = False, + outlined: bool = False, + inverted: bool = False, + rounded: bool = False, + loading: bool = False, + static: bool = False, + disabled: bool = False, **kwargs, ) -> None: - _update_css_class(kwargs, "columns") - if desktop_only: - kwargs["className"] += " is-desktop" - if centered: - kwargs["className"] += " is-centered" - if gapless: - kwargs["className"] += " is-gapless" - if multiline: - kwargs["className"] += " is-multiline" + """The button is an essential element of any design. It's meant to look and behave as an interactive element of your page. + + See https://bulma.io/documentation/elements/button/ + """ + _update_css_class(kwargs, "button") + _update_css_class(kwargs, f"is-{size}", size) + _update_css_class(kwargs, f"is-{kind}", kind) + _update_css_class(kwargs, f"is-{display}", display) + _update_css_class(kwargs, "is-light", light) + _update_css_class(kwargs, "is-outlined", outlined) + _update_css_class(kwargs, "is-inverted", inverted) + _update_css_class(kwargs, "is-rounded", rounded) + _update_css_class(kwargs, "is-loading", loading) + _update_css_class(kwargs, "is-static", static) + _update_css_class(kwargs, "is-disabled", disabled) super().__init__(*args, **kwargs) -class Column(html.Div): +class Content(html.Div): + def __init__(self, *args, **kwargs) -> None: + """A single class to handle WYSIWYG generated content, where only HTML tags are available. + + It is useful to use Content around a Markdown component. + + See https://bulma.io/documentation/elements/content/ + """ + _update_css_class(kwargs, "content") + super().__init__(*args, **kwargs) + + +class Delete(html.Div): def __init__( self, *args, - size: str | None = None, - offset=None, + size: Literal["small", "normal", "medium", "large"] | None, + **kwargs, + ) -> None: + """A versatile delete cross. + + See https://bulma.io/documentation/elements/delete/ + """ + _update_css_class(kwargs, "delete") + _update_css_class(kwargs, f"is-{size}", size) + super().__init__(*args, **kwargs) + + +class Icon(html.Span): + def __init__( + self, + kind: str = "download", + fill: Literal["s", "r", "l", "d"] = "s", + fontawesome: bool = True, + size: Literal["small", "medium", "large"] | None = None, + color: BulmaPrimaryColor | None = None, + i_kwargs: dict | None = None, + **kwargs, + ) -> None: + """Bulma is compatible with all icon font libraries: Font Awesome 5, Font Awesome 4, Material Design Icons, Ionicons, etc. + + See also https://bulma.io/documentation/elements/icon/ + + Here, we assume using Font Awesome, where "kind" is a Font Awesome icon + such as "info-circle", "question-circle", "book" or "code", and "fill" + specifies whether it is solid ("s"), regular ("r"), light ("l") or + duotone ("d"). See fontawesome.com for more. + + If not using Font Awesome, set fontawesome to False. + + An Icon is a html.Span(html.I()), i_kwargs get passed to the + html.I element. + """ + _update_css_class(kwargs, "icon") + _update_css_class(kwargs, f"is-{size}", size) + _update_css_class(kwargs, f"has-text-{color}", color) + + # fontastic styles (custom icons, e.g. the MP app icons) + if "fontastic" in kind: + fontawesome = False + + i_kwargs = i_kwargs or {} + + # fontawesome styles (pre-distributed icons, e.g. download) + if fontawesome: + _update_css_class(i_kwargs, f"fa{fill} fa-{kind}") + super().__init__(children=html.I(**i_kwargs), **kwargs) + else: + _update_css_class(i_kwargs, kind) + super().__init__(children=html.I(**i_kwargs), **kwargs) + + +class Image(html.Figure): + def __init__( + self, + square_size: Literal[16, 24, 32, 48, 64, 96, 128] | None = None, + ratio: Literal[ + "square", + "1by1", + "5by4", + "4by3", + "3by2", + "5by3", + "16by9", + "2by1", + "3by1", + "4by5", + "3by4", + "2by3", + "3by5", + "9by16", + "1by2", + "1by3", + ] + | None = None, + rounded: bool = False, + img_kwargs: dict | None = None, + src: str | None = None, + alt: str | None = None, + children=None, + **kwargs, + ) -> None: + """A container for responsive images. + + See https://bulma.io/documentation/elements/image/ + + An Image is typically a html.Figure(html.Img()), img_kwargs get passed to the + html.Img element. For convenience, src and alt kwargs are also provided, and + these will also get passed to the html.Img element. + + If children are specified, these will be used instead of the html.Img + (for example, to maintain the ratio of an iframe). + """ + _update_css_class(kwargs, "image") + _update_css_class(kwargs, f"is-{square_size}x{square_size}", square_size) + _update_css_class(kwargs, f"is-{ratio}", ratio) + _update_css_class(kwargs, "is-rounded", rounded) + if not children: + img_kwargs = img_kwargs or {} + if src and src not in img_kwargs: + img_kwargs[src] = src + if alt and alt not in img_kwargs: + img_kwargs[alt] = alt + super().__init__(children=html.Img(**img_kwargs), **kwargs) + else: + super().__init__(children=children, **kwargs) + + +class Notification(html.Div): + def __init__( + self, + *args, + color: BulmaPrimaryColor | None = None, + light: bool = False, + **kwargs, + ) -> None: + """The notification is a simple colored block meant to draw the attention to the user about something. + + See https://bulma.io/documentation/elements/notification/ + """ + _update_css_class(kwargs, "notification") + _update_css_class(kwargs, f"is-{color}", color) + _update_css_class(kwargs, "is-light", light) + super().__init__(*args, **kwargs) + + +class Error(Notification): + def __init__(self, *args, **kwargs) -> None: + """A Notification for errors.""" + super().__init__(*args, color="danger", **kwargs) + + +class Progress(html.Progress): + def __init__( + self, + *args, + color: BulmaPrimaryColor | None = None, + size: Literal["small", "normal", "medium", "large"] | None = None, + indeterminate: bool = False, + value: int | None = None, + max: int | None = None, + **kwargs, + ) -> None: + """Native HTML progress bars. + + See https://bulma.io/documentation/elements/progress/ + """ + _update_css_class(kwargs, "progress") + _update_css_class(kwargs, color, f"is-{color}", color) + _update_css_class(kwargs, size, f"is-{size}", size) + if indeterminate: + value = None + if value: + kwargs["value"] = value + if max: + kwargs["max"] = max + super().__init__(*args, **kwargs) + + +class Table(html.Table): + def __init__( + self, + *args, + bordered: bool = False, + striped: bool = False, narrow: bool = False, + hoverable: bool = False, + fullwidth: bool = False, **kwargs, ) -> None: - _update_css_class(kwargs, "column") - if size: - kwargs["className"] += f" is-{size}" - if offset: - kwargs["className"] += f" -is-offset-{size}" - if narrow: - kwargs["className"] += " is-narrow" + """A simple Table element. + + See https://bulma.io/documentation/elements/table/ + + Typically users are expected to use DataTable or AgGrid instead + for any tables that require interactivity. + + Use with: + + * html.Thead, the optional top part of the table + * html.Tfoot, the optional bottom part of the table + * html.Tbody the main content of the table + * html.Tr, each table row + * html.Th, a table cell heading + * html.Td, a table cell + """ + _update_css_class(kwargs, "table") + _update_css_class(kwargs, "is-bordered", bordered) + _update_css_class(kwargs, "is-striped", striped) + _update_css_class(kwargs, "is-narrow", narrow) + _update_css_class(kwargs, "is-hoverable", hoverable) + _update_css_class(kwargs, "is-fullwidth", fullwidth) super().__init__(*args, **kwargs) + def with_container(self, **kwargs) -> html.Div: + """Add a container to make the Table scrollable.""" + _update_css_class(kwargs, "table-container") + return html.Div(children=[self], **kwargs) -class Button(html.Button): + +class Tag(html.Div): + def __init__( + self, + tag: str, + color: BulmaPrimaryColor | None = "primary", + size: Literal["normal", "medium", "large"] | None = None, + rounded: bool = False, + delete: bool = False, + addon: str | None = None, + addon_color: BulmaPrimaryColor | None = "primary", + span_kwargs: dict | None = None, + **kwargs, + ) -> None: + """A tag element. + + See https://bulma.io/documentation/elements/tag/ + + kwargs are passed to the container Div, span_kwargs to the inner + html.Span element. + """ + # Developer note: this class is a bit awkward. It assumes a tag is a + # html.Span, but it could be a html.A, etc. It also has to handle + # both a Tag and a Tag with addons (technically a container + two Tags) + + # for backwards compatibility + if tag_type := kwargs.get("tag_type"): + color = tag_type + if tag_addon_type := kwargs.get("tag_addon_type"): + addon_color = tag_addon_type + if tag_addon := kwargs.get("tag_addon"): + addon = tag_addon + + span_kwargs = span_kwargs or {} + _update_css_class(span_kwargs, "tag") + _update_css_class(span_kwargs, f"is-{color}", color) + _update_css_class(span_kwargs, f"is-{size}", size) + _update_css_class(span_kwargs, "is-rounded", rounded) + _update_css_class(span_kwargs, "is-delete", delete) + + tags = [html.Span(tag, **span_kwargs)] + + if addon: + addon_kwargs = span_kwargs.copy() + _update_css_class(addon_kwargs, f"is-{color}", addon_color) + tags.append(html.Span(addon, **addon_kwargs)) + + _update_css_class(kwargs, "tags has-addons") + super().__init__(children=tags, **kwargs) + else: + super().__init__(children=tags, **kwargs) + + +class TagContainer(Field): def __init__( - self, *args, kind: str | None = None, size: str = "normal", **kwargs + self, tags: list[Tag], grouped=True, grouped_multiline=True, **kwargs ) -> None: - _update_css_class(kwargs, f"button is-{size}") - if kind: - kwargs["className"] += f" is-{kind}" + """Contain a list of tags and keep them evenly spaced. + + See https://bulma.io/documentation/elements/tag/ + """ + # Developer note: this class is a bit awkward. It has to + # assume the children tags *might* contain addons, which + # changes the class being used. + tags = [Control(tag) for tag in tags] + super().__init__( + children=tags, + grouped=grouped, + grouped_multiline=grouped_multiline, + **kwargs, + ) + + +class H1(html.H1): + def __init__( + self, *args, subtitle: bool = False, spaced: bool = False, **kwargs + ) -> None: + """H1 heading. + + See https://bulma.io/documentation/elements/title/ + """ + if not subtitle: + _update_css_class(kwargs, "title is-1") + else: + _update_css_class(kwargs, "subtitle is-1") + _update_css_class(kwargs, "is-spaced", spaced) super().__init__(*args, **kwargs) -class Error(html.Div): +class H2(html.H2): + def __init__( + self, *args, subtitle: bool = False, spaced: bool = False, **kwargs + ) -> None: + """H2 heading. + + See https://bulma.io/documentation/elements/title/ + """ + if not subtitle: + _update_css_class(kwargs, "title is-2") + else: + _update_css_class(kwargs, "subtitle is-2") + _update_css_class(kwargs, "is-spaced", spaced) + super().__init__(*args, **kwargs) + + +class H3(html.H3): + def __init__( + self, *args, subtitle: bool = False, spaced: bool = False, **kwargs + ) -> None: + """H3 heading. + + See https://bulma.io/documentation/elements/title/ + """ + if not subtitle: + _update_css_class(kwargs, "title is-3") + else: + _update_css_class(kwargs, "subtitle is-3") + _update_css_class(kwargs, "is-spaced", spaced) + super().__init__(*args, **kwargs) + + +class H4(html.H4): + def __init__( + self, *args, subtitle: bool = False, spaced: bool = False, **kwargs + ) -> None: + """H4 heading. + + See https://bulma.io/documentation/elements/title/ + """ + if not subtitle: + _update_css_class(kwargs, "title is-4") + else: + _update_css_class(kwargs, "subtitle is-4") + _update_css_class(kwargs, "is-spaced", spaced) + super().__init__(*args, **kwargs) + + +class H5(html.H5): + def __init__( + self, *args, subtitle: bool = False, spaced: bool = False, **kwargs + ) -> None: + """H5 heading. + + See https://bulma.io/documentation/elements/title/ + """ + if not subtitle: + _update_css_class(kwargs, "title is-5") + else: + _update_css_class(kwargs, "subtitle is-5") + _update_css_class(kwargs, "is-spaced", spaced) + super().__init__(*args, **kwargs) + + +class H6(html.H6): + def __init__( + self, *args, subtitle: bool = False, spaced: bool = False, **kwargs + ) -> None: + """H6 heading. + + See https://bulma.io/documentation/elements/title/ + """ + if not subtitle: + _update_css_class(kwargs, "title is-6") + else: + _update_css_class(kwargs, "subtitle is-6") + _update_css_class(kwargs, "is-spaced", spaced) + super().__init__(*args, **kwargs) + + +# Bulma "Components" +# See https://bulma.io/documentation/components/ + + +class Breadcrumb(html.Nav): + def __init__( + self, + parts: Sequence[tuple[str | Component, str]], + alignment: Literal["centered", "right"] | None = None, + separator: Literal["arrow", "bullet", "dot", "succeeds"] | None = None, + size: Literal["small", "medium", "large"] | None = None, + **kwargs, + ) -> None: + """Breadcrumb navigation. Supply a list of tuples of display + name (string or any Component) and link (string) to construct the breadcrumb navigation. + + See https://bulma.io/documentation/components/breadcrumb/ + """ + _update_css_class(kwargs, "breadcrumb") + _update_css_class(kwargs, f"is-{alignment}", alignment) + _update_css_class(kwargs, f"has-{separator}-separator", separator) + _update_css_class(kwargs, f"is-{size}", size) + + if isinstance(parts, dict): + # For backwards compatibility, no longer recommended. + parts = parts.items() + + links = [ + html.Li( + dcc.Link(name, href=link), + className="is-active" if idx == len(parts) - 1 else None, + ) + for idx, (name, link) in enumerate(parts) + ] + + kwargs["aria-label"] = "breadcrumbs" + super(links).__init__(**kwargs) + + +class Card(html.Div): + def __init__(self, *args, **kwargs) -> None: + """Card container. + + See https://bulma.io/documentation/components/card/ + """ + _update_css_class(kwargs, "card") + super().__init__(*args, **kwargs) + + +class CardHeader(html.Header): + def __init__(self, *args, **kwargs) -> None: + """Card header. + + See https://bulma.io/documentation/components/card/ + """ + _update_css_class(kwargs, "card-header") + super().__init__(*args, **kwargs) + + +class CardImage(html.Div): + def __init__(self, *args, **kwargs) -> None: + """Card image. Provide a ctl.Image() as child. + + See https://bulma.io/documentation/components/card/ + """ + _update_css_class(kwargs, "card-header") + super().__init__(*args, **kwargs) + + +class CardContent(html.Div): + def __init__(self, *args, **kwargs) -> None: + """Card content. + + See https://bulma.io/documentation/components/card/ + """ + _update_css_class(kwargs, "card-content") + super().__init__(*args, **kwargs) + + +class CardFooter(html.Footer): + def __init__(self, *args, **kwargs) -> None: + """Card footer. Provide a list of ctl.CardFooterItem() as children. + + See https://bulma.io/documentation/components/card/ + """ + _update_css_class(kwargs, "card-footer") + super().__init__(*args, **kwargs) + + +class CardFooterItem(html.A): def __init__(self, *args, **kwargs) -> None: - _update_css_class(kwargs, "notification is-danger") + """Card footer item. + + See https://bulma.io/documentation/components/card/ + """ + _update_css_class(kwargs, "card-footer-item") super().__init__(*args, **kwargs) +class Dropdown: + # TODO: see if dcc.Dropdown can be styled with Bulma styles. + def __init__(self, *args, **kwargs) -> None: + raise NotImplementedError("Not implemented, prefer dcc.Dropdown.") + + +class Menu: + # TODO: map this to Scrollspy component automatically? + def __init__(self, *args, **kwargs) -> None: + raise NotImplementedError( + "Not implemented, prefer dash_mp_components.Scrollspy menu which uses Bulma styles." + ) + + class MessageContainer(html.Article): def __init__( self, *args, kind: str = "warning", size: str = "normal", **kwargs @@ -125,6 +778,7 @@ def __init__( class MessageHeader(html.Div): + # rename to Message def __init__(self, *args, **kwargs) -> None: _update_css_class(kwargs, "message-header") super().__init__(*args, **kwargs) @@ -136,131 +790,348 @@ def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) -class Icon(html.Span): +class Modal(html.Div): def __init__( - self, kind: str = "download", fill: str = "s", *args, **kwargs + self, + children: list | None = None, + id: str | None = None, + active: bool = False, + **kwargs, ) -> None: - """Font-awesome icon. + _update_css_class(kwargs, "modal") + if active: + kwargs["className"] += " is-active" + super().__init__( + [ + html.Div(className="modal-background"), + html.Div( + children=children, id=f"{id}_contents", className="modal-contents" + ), + html.Button(id=f"{id}_close", className="modal-close is-large"), + ], + **kwargs, + ) + - Good options for kind are "info-circle", "question-circle", "book", "code". +class Navbar: + # TODO: map this to Navbar component automatically? + def __init__(self, *args, **kwargs) -> None: + raise NotImplementedError( + "Not implemented, prefer dash_mp_components.Navbar menu which uses Bulma styles." + ) + + +class Pagination(html.Nav): + def __init__(self, *args, **kwargs) -> None: + """Pagination container. + + See https://bulma.io/documentation/components/pagination/ """ - _update_css_class(kwargs, "icon") - if "fontastic" not in kind: - # fontawesome styles (pre-distributed icons, e.g. download) - super().__init__(html.I(className=f"fa{fill} fa-{kind}"), *args, **kwargs) - else: - # fontastic styles (custom icons, e.g. the MP app icons) - super().__init__(html.I(className=kind), *args, **kwargs) + _update_css_class(kwargs, "pagination") + super().__init__(*args, **kwargs) -class Footer(html.Footer): +class PaginationPrevious(html.A): def __init__(self, *args, **kwargs) -> None: - _update_css_class(kwargs, "footer") + """Pagination previous button. + + See https://bulma.io/documentation/components/pagination/ + """ + _update_css_class(kwargs, "pagination-previous") super().__init__(*args, **kwargs) -class Spinner(html.Button): +class PaginationNext(html.A): def __init__(self, *args, **kwargs) -> None: - _update_css_class(kwargs, "button is-primary is-loading") - kwargs["style"] = {"width": "35px", "height": "35px", "borderRadius": "35px"} - kwargs["aria-label"] = "Loading" + """Pagination next button. + + See https://bulma.io/documentation/components/pagination/ + """ + _update_css_class(kwargs, "pagination-next") + super().__init__(*args, **kwargs) + + +class PaginationList(html.Ul): + def __init__(self, *args, **kwargs) -> None: + """Pagination list container. Provide list of ctl.PaginationLink as children. + + See https://bulma.io/documentation/components/pagination/ + """ + _update_css_class(kwargs, "pagination-list") + super().__init__(*args, **kwargs) + + +class PaginationLink(html.Li): + def __init__(self, *args, current: bool, **kwargs) -> None: + """Pagination link. Keyword arguments passed to html.A element. + + See https://bulma.io/documentation/components/pagination/ + """ + _update_css_class(kwargs, "pagination-link") + _update_css_class(kwargs, "is-current", current) + super().__init__(html.A(*args, **kwargs)) + + +class PaginationEllipsis(html.Li): + def __init__(self, **kwargs) -> None: + """Pagination link. Keyword arguments passed to html.Span element. + + See https://bulma.io/documentation/components/pagination/ + """ + _update_css_class(kwargs, "pagination-ellipsis") + super().__init__(html.Span("…", **kwargs)) + + +class Panel: + # TODO, https://bulma.io/documentation/components/panel/ + def __init__(self, *args, **kwargs) -> None: + raise NotImplementedError + + +class PanelHeading: + # TODO, https://bulma.io/documentation/components/panel/ + def __init__(self, *args, **kwargs) -> None: + raise NotImplementedError + + +class PanelTabs: + # TODO, https://bulma.io/documentation/components/panel/ + def __init__(self, *args, **kwargs) -> None: + raise NotImplementedError + + +class PanelBlock: + # TODO, https://bulma.io/documentation/components/panel/ + def __init__(self, *args, **kwargs) -> None: + raise NotImplementedError + + +class Tabs: + # TODO: see if dcc.Tabs can be styled with Bulma styles. + def __init__(self, *args, **kwargs) -> None: + raise NotImplementedError("Not implemented, prefer dcc.Tabs.") + + +# Bulma "Layout" +# See https://bulma.io/documentation/layout/ + + +class Container(html.Div): + def __init__(self, *args, **kwargs) -> None: + _update_css_class(kwargs, "container") + super().__init__(*args, **kwargs) + + +class Level(html.Nav): + def __init__( + self, + *args, + mobile: bool = False, + **kwargs, + ) -> None: + """A multi-purpose horizontal level, which can contain almost any other element. + + Use either ctl.LevelLeft, ctl.LevelRight or ctl.LevelItem as children. + + See https://bulma.io/documentation/layout/level/ + """ + _update_css_class(kwargs, "level") + _update_css_class(kwargs, f"is-{mobile}", mobile) + super().__init__(*args, **kwargs) + + +class LevelLeft(html.Div): + def __init__( + self, + *args, + **kwargs, + ) -> None: + """Use with ctl.Level. + + See https://bulma.io/documentation/layout/level/ + """ + _update_css_class(kwargs, "level-left") + super().__init__(*args, **kwargs) + + +class LevelRight(html.Div): + def __init__( + self, + *args, + **kwargs, + ) -> None: + """Use with ctl.Level. + + See https://bulma.io/documentation/layout/level/ + """ + _update_css_class(kwargs, "level-right") + super().__init__(*args, **kwargs) + + +class LevelItem(html.Div): + def __init__( + self, + *args, + centered: bool = False, + **kwargs, + ) -> None: + """Use with ctl.Level. + + See https://bulma.io/documentation/layout/level/ + """ + _update_css_class(kwargs, "level-item") + _update_css_class(kwargs, "has-text-centered", centered) + super().__init__(*args, **kwargs) + + +class MediaObject: + # TODO, https://bulma.io/documentation/layout/media-object/ + def __init__(self, *args, **kwargs) -> None: + raise NotImplementedError + + +class Hero(html.Div): + def __init__( + self, + *args, + color: BulmaPrimaryColor | None = None, + size: Literal["small", "medium", "large", "halfheight", "fullheight"] + | None = None, + **kwargs, + ) -> None: + """Hero element. Provide a ctl.HeroBody() as child and, if using "fullheight", a + ctl.HeroHead() and ctl.HeroFoot(). + + See https://bulma.io/documentation/layout/hero/ + """ + _update_css_class(kwargs, "hero") + _update_css_class(kwargs, f"is-{color}", color) + _update_css_class(kwargs, f"is-{size}", size) super().__init__(*args, **kwargs) -class Box(html.Div): +class HeroBody(html.Div): def __init__(self, *args, **kwargs) -> None: - _update_css_class(kwargs, "box") + """Use with ctl.Hero. + + See https://bulma.io/documentation/layout/hero/ + """ + _update_css_class(kwargs, "hero-body") super().__init__(*args, **kwargs) -class H1(html.H1): - def __init__(self, *args, subtitle: bool = False, **kwargs) -> None: - if subtitle: - _update_css_class(kwargs, "subtitle is-1") - else: - _update_css_class(kwargs, "title is-1") +class HeroHead(html.Div): + def __init__(self, *args, **kwargs) -> None: + """Use with "fullheight" ctl.Hero. + + See https://bulma.io/documentation/layout/hero/ + """ + _update_css_class(kwargs, "hero-head") super().__init__(*args, **kwargs) -class H2(html.H2): - def __init__(self, *args, subtitle: bool = False, **kwargs) -> None: - if subtitle: - _update_css_class(kwargs, "subtitle is-2") - else: - _update_css_class(kwargs, "title is-2") +class HeroFoot(html.Div): + def __init__(self, *args, **kwargs) -> None: + """Use with "fullheight" ctl.Hero. + + See https://bulma.io/documentation/layout/hero/ + """ + _update_css_class(kwargs, "hero-foot") super().__init__(*args, **kwargs) -class H3(html.H3): - def __init__(self, *args, subtitle: bool = False, **kwargs) -> None: - if subtitle: - _update_css_class(kwargs, "subtitle is-3") - else: - _update_css_class(kwargs, "title is-3") +class Section(html.Section): + def __init__( + self, *args, size: Literal["medium", "large"] | None = None, **kwargs + ) -> None: + """Section. + + See https://bulma.io/documentation/layout/section/ + """ + _update_css_class(kwargs, "section") + _update_css_class(kwargs, f"is-{size}", size) super().__init__(*args, **kwargs) -class H4(html.H4): - def __init__(self, *args, subtitle: bool = False, **kwargs) -> None: - if subtitle: - _update_css_class(kwargs, "subtitle is-4") - else: - _update_css_class(kwargs, "title is-4") +class Footer(html.Footer): + def __init__(self, *args, **kwargs) -> None: + """Footer. + + See https://bulma.io/documentation/layout/footer/ + """ + _update_css_class(kwargs, "footer") super().__init__(*args, **kwargs) -class H5(html.H5): - def __init__(self, *args, subtitle: bool = False, **kwargs) -> None: - if subtitle: - _update_css_class(kwargs, "subtitle is-5") - else: - _update_css_class(kwargs, "title is-5") +class Tile(html.Div): + def __init__( + self, + *args, + context: Literal["ancestor", "parent", "child"] | None = None, + vertical: bool = False, + size: Literal[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] | None, + **kwargs, + ) -> None: + """A single tile element to build 2-dimensional grids. + + See https://bulma.io/documentation/layout/tiles/ + """ + _update_css_class(kwargs, "tile") + _update_css_class(kwargs, f"is-{context}", context) + _update_css_class(kwargs, "is-vertical", vertical) + _update_css_class(kwargs, f"is-{size}", size) super().__init__(*args, **kwargs) -class H6(html.H6): - def __init__(self, *args, subtitle: bool = False, **kwargs) -> None: - if subtitle: - _update_css_class(kwargs, "subtitle is-6") - else: - _update_css_class(kwargs, "title is-6") - super().__init__(*args, **kwargs) +# Bulma "Columns" +# See https://bulma.io/documentation/columns/ -class Tag(html.Div): +class Columns(html.Div): def __init__( self, - tag, - tag_type="primary", - tag_addon=None, - tag_addon_type="primary", - size: str = "normal", *args, + desktop_only=False, + centered=False, + gapless=False, + multiline=False, **kwargs, ) -> None: - _update_css_class(kwargs, "tags") - tags = [html.Span(tag, className=f"tag is-{tag_type} is-{size}")] - if tag_addon: - tags.append( - html.Span(tag_addon, className=f"tag is-{tag_addon_type} is-{size}") - ) - kwargs["className"] += " has-addons" - super().__init__(tags, *args, **kwargs) + _update_css_class(kwargs, "columns") + if desktop_only: + kwargs["className"] += " is-desktop" + if centered: + kwargs["className"] += " is-centered" + if gapless: + kwargs["className"] += " is-gapless" + if multiline: + kwargs["className"] += " is-multiline" + super().__init__(*args, **kwargs) -class TagContainer(html.Div): - def __init__(self, tags: list[Tag], *args, **kwargs) -> None: - _update_css_class(kwargs, "field is-grouped is-grouped-multiline") - tags = [html.Div(tag, className="control") for tag in tags] - super().__init__(tags, *args, **kwargs) +class Column(html.Div): + def __init__( + self, + *args, + size: str | None = None, + offset=None, + narrow: bool = False, + **kwargs, + ) -> None: + _update_css_class(kwargs, "column") + if size: + kwargs["className"] += f" is-{size}" + if offset: + kwargs["className"] += f" -is-offset-{size}" + if narrow: + kwargs["className"] += " is-narrow" + super().__init__(*args, **kwargs) -class Textarea(dcc.Textarea): - def __init__(self, *args, **kwargs) -> None: - _update_css_class(kwargs, "textarea") - super().__init__(*args, **kwargs) +# Non-Bulma helpers +# TODO: review class Reveal(html.Details): def __init__( self, children=None, id=None, summary_id=None, title=None, **kwargs @@ -290,73 +1161,86 @@ def __init__( ) -class Label(html.Label): - def __init__(self, *args, **kwargs) -> None: - _update_css_class(kwargs, "label") - super().__init__(*args, **kwargs) +# TODO: review +def add_label_help(input, label, help) -> mpc.FilterField: + """Combine an input, label, and tooltip text into a single consistent component.""" + return mpc.FilterField(input, id=uuid4().hex, label=label, tooltip=help) -class Modal(html.Div): - def __init__( - self, - children: list | None = None, - id: str | None = None, - active: bool = False, - **kwargs, - ) -> None: - _update_css_class(kwargs, "modal") - if active: - kwargs["className"] += " is-active" +# TODO: review +def get_data_list(data: dict[str, str | int | float | list[str | int | float]]): + """Show a formatted table of data items. + + :param data: dictionary of label, value pairs + :return: html.Div + """ + contents = [] + for title, value in data.items(): + label = Label(title) if isinstance(title, str) else title + contents.append(html.Tr([html.Td(label), html.Td(value)])) + return html.Table([html.Tbody(contents)], className="table") + + +# TODO: review +def cite_me( + doi: str | None = None, manual_ref: str | None = None, cite_text: str = "Cite me" +) -> html.Div: + """Create a button to show users how to cite a particular resource. + + :param doi: DOI + :param manual_ref: If DOI not available + :param cite_text: Text to show as button label + :return: A button + """ + if doi: + component = mpc.PublicationButton(id=doi, doi=doi, showTooltip=True) + elif manual_ref: + warnings.warn("Please use the DOI if available.") + component = mpc.PublicationButton( + children=cite_text, id=manual_ref, url=manual_ref + ) + + return component + + +class Loading(dcc.Loading): + def __init__(self, *args, **kwargs) -> None: + """A wrapper around dcc.Loading that uses PRIMARY_COLOR and DEBUG_MODE from + Crystal Toolkit settings. + """ + if "type" not in kwargs: + kwargs["type"] = "dot" super().__init__( - [ - html.Div(className="modal-background"), - html.Div( - children=children, id=f"{id}_contents", className="modal-contents" - ), - html.Button(id=f"{id}_close", className="modal-close is-large"), - ], - **kwargs, + *args, color=SETTINGS.PRIMARY_COLOR, debug=SETTINGS.DEBUG_MODE, **kwargs ) -class Field(html.Div): - def __init__( - self, - *args, - addons: bool = False, - grouped: bool = False, - grouped_multiline: bool = False, - **kwargs, - ) -> None: - _update_css_class(kwargs, "field") - if addons: - kwargs["className"] += " has-addons" - if grouped: - kwargs["className"] += " is-grouped" - if grouped_multiline: - kwargs["className"] += " is-grouped-multiline" - super().__init__(*args, **kwargs) +# DEPRECATED. Everything from here to the end of the file is deprecated. There is no +# immediate plan to remove these variables or functions which are fairly harmless, +# but please do not use in new projects. +PRIMARY_COLOR = SETTINGS.PRIMARY_COLOR -class Control(html.Div): - """Control tag to wrap form elements, see https://bulma.io/documentation/form/general/.""" +BULMA_CSS = {"external_url": SETTINGS.BULMA_CSS_URL} - def __init__(self, *args, **kwargs) -> None: - _update_css_class(kwargs, "control") - super().__init__(*args, **kwargs) +FONT_AWESOME_CSS = {"external_url": SETTINGS.FONT_AWESOME_CSS_URL} +DOI_CACHE = loadfn(SETTINGS.DOI_CACHE_PATH) if SETTINGS.DOI_CACHE_PATH else {} -class Input(dcc.Input): - """Control tag to wrap form elements, see https://bulma.io/documentation/input/general/.""" - def __init__( - self, - *args, - color="primary", - **kwargs, - ) -> None: - _update_css_class(kwargs, f"input is-{color}") - super().__init__(*args, **kwargs) +def get_table(rows: list[list[Any]], header: list[str] | None = None) -> html.Table: + """Deprecated. Prefer ctl.Table class instead. + + Create a HTML table from a list of elements. + + :param rows: list of list of cell contents + :return: html.Table + """ + contents = [html.Tr([html.Td(item) for item in row]) for row in rows] + if not header: + return html.Table([html.Tbody(contents)], className="table") + header = html.Thead([html.Tr([html.Th(item) for item in header])]) + return html.Table([header, html.Tbody(contents)], className="table") def get_tooltip( @@ -367,7 +1251,9 @@ def get_tooltip( wrapper_class: str | None = None, **kwargs, ): - """Uses the tooltip component from dash-mp-components to add a tooltip, typically for help text. + """Deprecated. Prefer alternative dcc.Tooltip component instead. + + Uses the tooltip component from dash-mp-components to add a tooltip, typically for help text. This component uses react-tooltip under the hood. :param tooltip_label: text or component to display and apply hover behavior to @@ -395,70 +1281,10 @@ def get_tooltip( ) -def get_data_list(data: dict[str, str | int | float | list[str | int | float]]): - """Show a formatted table of data items. - - :param data: dictionary of label, value pairs - :return: html.Div - """ - contents = [] - for title, value in data.items(): - label = Label(title) if isinstance(title, str) else title - contents.append(html.Tr([html.Td(label), html.Td(value)])) - return html.Table([html.Tbody(contents)], className="table") - - -def get_table(rows: list[list[Any]], header: list[str] | None = None) -> html.Table: - """Create a HTML table from a list of elements. - - :param rows: list of list of cell contents - :return: html.Table - """ - contents = [html.Tr([html.Td(item) for item in row]) for row in rows] - if not header: - return html.Table([html.Tbody(contents)], className="table") - header = html.Thead([html.Tr([html.Th(item) for item in header])]) - return html.Table([header, html.Tbody(contents)], className="table") - - -DOI_CACHE = loadfn(MODULE_PATH / "apps/assets/doi_cache.json") - - -def cite_me( - doi: str | None = None, manual_ref: str | None = None, cite_text: str = "Cite me" -) -> html.Div: - """Create a button to show users how to cite a particular resource. - - :param doi: DOI - :param manual_ref: If DOI not available - :param cite_text: Text to show as button label - :return: A button - """ - if doi: - component = mpc.PublicationButton(id=doi, doi=doi, showTooltip=True) - elif manual_ref: - warnings.warn("Please use the DOI if available.") - component = mpc.PublicationButton( - children=cite_text, id=manual_ref, url=manual_ref - ) - - return component - - -def add_label_help(input, label, help) -> mpc.FilterField: - """Combine an input, label, and tooltip text into a single consistent component.""" - return mpc.FilterField(input, id=uuid4().hex, label=label, tooltip=help) - - -class Loading(dcc.Loading): - def __init__(self, *args, **kwargs) -> None: - super().__init__( - *args, color=PRIMARY_COLOR, type="dot", debug=SETTINGS.DEBUG_MODE, **kwargs - ) - - def get_breadcrumb(parts): - """Create a breadcrumb navigation bar. + """Deprecated, prefer the ctl.Breadcrumb class instead, which is a drop-in replacement. + + Create a breadcrumb navigation bar. Args: parts (dict): Dictionary of name, link pairs. @@ -477,3 +1303,12 @@ def get_breadcrumb(parts): for idx, (name, link) in enumerate(parts.items()) ] return html.Nav(html.Ul(links), className="breadcrumb") + + +class Spinner(html.Button): + def __init__(self, *args, **kwargs) -> None: + """Deprecated, prefer ctl.Button class instead with loading=True keyword argument.""" + _update_css_class(kwargs, "button is-primary is-loading") + kwargs["style"] = {"width": "35px", "height": "35px", "borderRadius": "35px"} + kwargs["aria-label"] = "Loading" + super().__init__(*args, **kwargs) diff --git a/crystal_toolkit/helpers/povray_renderer.py b/crystal_toolkit/helpers/povray_renderer.py index 74bce80c..8eb86dc2 100644 --- a/crystal_toolkit/helpers/povray_renderer.py +++ b/crystal_toolkit/helpers/povray_renderer.py @@ -2,6 +2,7 @@ For creating publication quality plots. """ + from __future__ import annotations from jinja2 import Environment diff --git a/crystal_toolkit/helpers/utils.py b/crystal_toolkit/helpers/utils.py index 14a866d7..4a8f75df 100644 --- a/crystal_toolkit/helpers/utils.py +++ b/crystal_toolkit/helpers/utils.py @@ -269,7 +269,7 @@ def get_reference_button(cite_text=None, hover_text=None, doi=None, icon="book") def get_data_table( df=None, virtualized=True, columns=None, column_widths=None, **kwargs ): - """Returns a nicely styled DataTable with sensible defaults for re-use. + """Returns a nicely styled DataTable with sensible defaults for reuse. :param df: optional pandas DataFrame to populate DataTable :param virtualized: used for large tables, adds filter options diff --git a/crystal_toolkit/msonable.py b/crystal_toolkit/msonable.py deleted file mode 100644 index 4f781d82..00000000 --- a/crystal_toolkit/msonable.py +++ /dev/null @@ -1,56 +0,0 @@ -"""Pleasant hack to support MSONable objects in Dash callbacks natively.""" - -from __future__ import annotations - - -def to_plotly_json(self): - return self.as_dict() - - -def _repr_mimebundle_(self, include=None, exclude=None): - """Render Scenes using crystaltoolkit-extension for Jupyter Lab.""" - # TODO: add Plotly, application/vnd.plotly.v1+json - - help_text_ct = """If you see this text, the Crystal Toolkit Jupyter Lab \n -extension is not installed. You can install it by running \n -\"pip install crystaltoolkit-extension\" \n -from the same environment you run \"jupyter lab\". \n -This only works in Jupyter Lab 3.x or above.\n\n -""" - - help_text_plotly = """If you see this text, the Plotly Jupyter Lab extension -is not installed, please consult Plotly documentation for information on how to -install. -""" - - # TODO: to be strict here, we could use inspect.signature - # and .return_annotation is either a Scene or a go.Figure respectively - # and also check all .parameters .kind.name have no POSITIONAL_ONLY - # in practice, fairly unlikely this will cause issues without strict checking - if hasattr(self, "get_scene"): - return { - "application/vnd.mp.ctk+json": self.get_scene().to_json(), - "text/plain": help_text_ct + repr(self), - } - if hasattr(self, "get_plot"): - return { - "application/vnd.plotly.v1+json": self.get_plot().to_plotly_json(), - "text/plain": help_text_plotly + repr(self), - } - return {"application/json": self.as_dict(), "text/plain": repr(self)} - - -def show_json(self): - from IPython.display import display_json - - return display_json(self.as_dict(), raw=True) - - -def _ipython_display_(self): - """Render Scenes using crystaltoolkit-extension for Jupyter Lab. - - This function ensures that objects are also printed in string format as previously. - """ - from IPython.display import publish_display_data - - publish_display_data(self._repr_mimebundle_()) diff --git a/crystal_toolkit/renderables/site.py b/crystal_toolkit/renderables/site.py index 32efe263..ef43be57 100644 --- a/crystal_toolkit/renderables/site.py +++ b/crystal_toolkit/renderables/site.py @@ -169,7 +169,7 @@ def get_site_scene( if connected_sites: # TODO: more graceful solution here - # if ambiguous (disordered), re-use last color used + # if ambiguous (disordered), reuse last color used site_color = color # TODO: can cause a bug if all vertices almost co-planar diff --git a/crystal_toolkit/renderables/structuregraph.py b/crystal_toolkit/renderables/structuregraph.py index 0f7662f7..6c8077c2 100644 --- a/crystal_toolkit/renderables/structuregraph.py +++ b/crystal_toolkit/renderables/structuregraph.py @@ -5,7 +5,7 @@ from typing import Sequence import numpy as np -from matplotlib.cm import get_cmap +from matplotlib.pyplot import get_cmap from pymatgen.analysis.graphs import StructureGraph from pymatgen.core import PeriodicSite diff --git a/crystal_toolkit/settings.py b/crystal_toolkit/settings.py index 5836cc5a..6ed95ef4 100644 --- a/crystal_toolkit/settings.py +++ b/crystal_toolkit/settings.py @@ -1,36 +1,154 @@ from __future__ import annotations -from typing import Literal, Union +from pathlib import Path +from typing import Literal, Optional -from pydantic import BaseSettings +from pydantic import Field, HttpUrl, RedisDsn -from crystal_toolkit import MODULE_PATH +try: + # pydantic 2+ + from pydantic_settings import BaseSettings +except ImportError: + # pydantic <2 + from pydantic import BaseSettings + + +MODULE_PATH = Path(__file__).parents[0] class Settings(BaseSettings): - """Crystal Toolkit settings class.""" + """Crystal Toolkit settings.""" + + DEBUG_MODE: bool = Field( + default=False, + help="This setting will set Dash's debug mode, will disable the cache used by Crystal Toolkit, and control log output.", + ) + TEST_MODE: bool = Field( + default=False, + help="Set to True when Crytal Toolkit is run during automated testing. It will switch the default renderer to SVG instead of WebGL, since many testing environments do not have WebGL available.", + ) + + REDIS_URL: Optional[RedisDsn] = Field( + default="redis://localhost:6379", + help="Redis instance used by Crystal Toolkit for caching. If set to None, simple caching will be used instead.", + ) + ASSETS_PATH: Path = Field( + default=MODULE_PATH / "apps" / "assets", + help="Path to assets folder. Used only when running the example Crystal Toolkit apps.", + ) + + PERSISTENCE: bool = Field( + default=True, + help="This setting controls whether Crystal Toolkit components in your app will have user-chosen values persisted by default or not. For example, choice of bonding algorithm, etc.", + ) + PERSISTENCE_TYPE: Literal["memory", "session", "local"] = Field( + default="local", + help="If persistence enabled, this will control the type of persistence. See Dash documentation for more information.", + ) - DEBUG_MODE: bool = False - MP_EMBED_MODE: bool = False - TEST_MODE: bool = False + PRIMARY_COLOR: str = Field( + default="hsl(171, 100%, 41%)", + help="A default primary color used for some user interface elements.", + ) - TRANSFORMATION_PREVIEWS: bool = False - REDIS_URL: str = "redis://localhost:6379" - ASSETS_PATH: str = str(MODULE_PATH / "apps" / "assets") - APP_METADATA: str = str(MODULE_PATH / "apps" / "app_metadata.yaml") + BULMA_CSS_URL: Optional[HttpUrl] = Field( + default="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.9.4/css/bulma.min.css", + help="If set, this CSS file will be loaded by default. Loading Bulma CSS is required only for aesthetic reasons.", + ) + FONT_AWESOME_CSS_URL: Optional[HttpUrl] = Field( + default="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css", + help="If set, this CSS file will be loaded by default. Loading Font Awesome is required to display certain icons, but otherwise is not required for functionality.", + ) - DEV_LOGIN_DISABLED: bool = True - LOGIN_ENDPOINT: str = "https://profile.materialsproject.org/" - API_KEY: Union[str, None] = "" - API_EXTERNAL_ENDPOINT: str = "https://api.materialsproject.org" + JUPYTER_EMBED_PORT: Optional[int] = Field( + default=8884, + help="The Jupyter extension (powered by Dash) requires a port to run on. If None, an available port will be chosen.", + ) + JUPYTER_EMBED_MODE: Optional[Literal["external", "tab", "jupyterlab"]] = Field( + default=None, + help="The Jupyter extension mode to use. See Dash documentation for more information.", + ) - PERSISTENCE: bool = True - PERSISTENCE_TYPE: Literal["memory", "session", "local"] = "local" + # Legend settings. These control the defaults for crystal structure and molecule visualization. + LEGEND_COLOR_SCHEME: Literal["Jmol", "VESTA", "accessible"] = Field( + default="Jmol", + help="Color scheme used to display atoms.", + ) + LEGEND_RADIUS_SCHEME: Literal[ + "atomic", + "specified_or_average_ionic", + "covalent", + "van_der_waals", + "atomic_calculated", + "uniform", + ] = Field( + default="uniform", + help="Method with which to choose a radius when displaying atoms.", + ) + LEGEND_CMAP: str = Field( + default="coolwarm", + help="Color map for displaying atoms when color-coded by a site property. Choose from matplotlib color maps.", + ) + LEGEND_FALLBACK_COLOR: tuple = Field( + default=(0, 0, 0), + help="Fallback color for displaying atoms when a more specific color is not defined.", + ) + LEGEND_FALLBACK_RADIUS: float = Field( + default=1.0, + help="Fallback radius for displaying atoms when a more specific radius (e.g. ionic radius) is not defined.", + ) + LEGEND_UNIFORM_RADIUS: float = Field( + default=0.5, + help="Default radius for displaying atoms when uniform radii are chosen.", + ) + + # Materials Project API settings. + # TODO: These should be deprecated in favor of setti + API_KEY: Optional[str] = Field(default="", help="Materials Project API key.") + API_EXTERNAL_ENDPOINT: str = Field( + default="https://api.materialsproject.org", + help="Materials Project API endpoint.", + ) + + # Materials Project deployment settings. If not running Crystal Toolkit for the Materials Project website, these can be ignored. + DEV_LOGIN_DISABLED: bool = Field( + default=True, help="Used internally by Materials Project." + ) + LOGIN_ENDPOINT: str = Field( + default="https://profile.materialsproject.org/", + help="Used internally by Materials Project.", + ) + APP_METADATA: Path = Field( + default=MODULE_PATH / "apps" / "app_metadata.yaml", + help="Path to app metadata field for Materials Project apps. Used as an alternative way of defining app metadata when defining many apps.", + ) + + # Experimental settings. + TRANSFORMATION_PREVIEWS: bool = Field( + default=False, + help="This setting controls whether previews are rendered for structure transformations.", + ) + DOI_CACHE_PATH: Optional[Path] = Field( + default=MODULE_PATH / "apps/assets/doi_cache.json", + help="Not currently used, maybe will be deprecated. This was used to avoid a CrossRef API lookup when a small set of DOIs were used in an app.", + ) + + # Deprecated settings. + MP_EMBED_MODE: bool = Field( + default=False, + help="Deprecated. This was used for early versions of Crystal Toolkit when embedded in the Materials Project website.", + ) class Config: """Crystal Toolkit environment variable config class.""" env_prefix = "CT_" + def print(self): + """Print settings.""" + print("Crystal Toolkit settings") + for key, val in self.dict().items(): + print(f" {key} = {val}") + SETTINGS = Settings() diff --git a/docs_rst/components.rst b/docs_rst/components.rst index 1be92540..ed7cc228 100644 --- a/docs_rst/components.rst +++ b/docs_rst/components.rst @@ -5,5 +5,6 @@ Component Library .. toctree:: :hidden: + components/bulma_layouts components/structuremoleculecomponent components/dash_components diff --git a/docs_rst/components/bulma_layouts.rst b/docs_rst/components/bulma_layouts.rst new file mode 100644 index 00000000..ea9c3aa9 --- /dev/null +++ b/docs_rst/components/bulma_layouts.rst @@ -0,0 +1,20 @@ +Bulma Layouts +------------- + +`Bulma `_ is a popular CSS-only web framework which can make it easier to build responsive web interfaces. +This is an alternative to other frameworks, such as Bootstrap, which require additional JavaScript to be loaded. + +Crystal Toolkit provides wrappers around the in-built Dash HTML components with Bulma CSS styles pre-applied. + +To use:: + + from crystal_toolkit import ctl + + # a simple two-column layout + my_layout = ctl.Columns([ + ctl.Column([]), + ctl.Column([]) + ]) + +Most Bulma styles are supported and fully type-hinted in Python. It is recommended to keep the Bulma docs open when +using these components to make it easier to understand how to achieve specific layouts! diff --git a/docs_rst/index.rst b/docs_rst/index.rst index 53240c92..bd92abd1 100644 --- a/docs_rst/index.rst +++ b/docs_rst/index.rst @@ -9,6 +9,7 @@ mp_app helpers jupyter + modernization API Docs .. include:: introduction.rst diff --git a/docs_rst/introduction.rst b/docs_rst/introduction.rst index 53a78459..d1d4a9ec 100644 --- a/docs_rst/introduction.rst +++ b/docs_rst/introduction.rst @@ -12,13 +12,26 @@ allowing Python developers to easily make an interactive web app to display mate As a showcase of the framework's capabilities, the Crystal Toolkit app allows you to import, view, analyze and transform crystal structures and molecules. +Citation +-------- + +Crystal Toolkit was created as an academic project to solve specific problems. It is open sourced in the +hopes that it is helpful for others but without guarantee of support. + +If you use Crystal Toolkit for your own apps, please cite the Crystal Toolkit publication: + +`Horton, Matthew, et al. "Crystal Toolkit: A Web App Framework to Improve Usability and Accessibility of Materials Science Research Algorithms." arXiv preprint arXiv:2302.06147 (2023). `_ + +This will help encourage future development and is a nice way to say thank you! + Crystal Toolkit Demonstration App --------------------------------- The new Materials Project website is powered by the Crystal Toolkit framework, visit it `here. `_. This includes the original "Crystal -Toolkit" app `available here `_. +Toolkit" app `available here `_, which was an app on the +Materials Project that gave the Crystal Toolkit library its name. Crystal Toolkit Web Framework @@ -44,35 +57,20 @@ You can ``pip install crystal-toolkit``. For Jupyter integration, please see the `additional installation steps `_. -Dash 2.x Migration ------------------- +Modernization +------------- -Crystal Toolkit works with both Dash 1.x and Dash 2.x. Several design choices were made -before Dash 2.x was developed that may be re-evaluated in future as new functionality -becomes available. +Please see the `Modernization <>`_ page for more information on how Crystal Toolkit is changing +due to the availability of new features in Dash. The required minimum version is now Dash 2.11. Development Team ---------------- -The `Crystal Toolkit Development Team `_ includes: - -* `Matthew Horton `_, project lead - -Contributors - -* `Cody O'Donnell `_ primary developer of custom React components -* `François Chabbey `_ for development of React components -* `Jimmy Shen `_ contributed pythreejs support, surface plotting, initial arrows/axes support, and various bug fixes -* `Joey Montoya `_ contributed Pourbaix component -* `Shyam Dwaraknath `_ for planned contributions for ellipsoid support and architectural design -* `Donny Winston `_, assisted by `Tyler Huntington `_, for helping embed Crystal Toolkit in a Django app -* `Matt McDermott `_ contributed phase diagram, X-ray Diffraction, X-ray Absorption Spectrum components -* `Jason Munro `_ contributed band structure component -* `Janosh Riebesell `_ contributed Phonon band structure component, 3 example apps, tests -* `Stephen Weitzner `_ contributed POV-Ray integration (in progress) -* `Richard Tran `_ for contributing plotly-powered Wulff shapes to pymatgen, which Crystal Toolkit uses -* `Guy Moore `_ for contributing magnetic moment visualization +Crystal Toolkit is the result of the combined efforts of the `Crystal Toolkit Development Team `_. +It was created by `Matthew Horton `_. +More information on individual contributions can be seen in the `GitHub README `_ and +the associated publication. New contributors are welcome, please see our `Code of Conduct. `_ diff --git a/docs_rst/jupyter.rst b/docs_rst/jupyter.rst index 488c7fd0..f4592c27 100644 --- a/docs_rst/jupyter.rst +++ b/docs_rst/jupyter.rst @@ -2,32 +2,29 @@ Jupyter Integration =================== -Crystal Toolkit offers integration with JupyterLab to +Crystal Toolkit offers integration with Jupyter to allow easy viewing of crystal structures and other Materials Project data interactively. -Installation ------------- - -There are two steps to using Crystal Toolkit inside Jupyter: - -1. Make sure Jupyter Lab is installed and run using ``jupyter lab``, version 3.x. - Crystal Toolkit is not supported in the older Jupyter notebooks or older versions - of Jupyter Lab. +Usage +----- -2. Ensure Crystal Toolkit is installed as normal, ``pip install crystal-toolkit --upgrade`` +To use, simply ``import crystal_toolkit`` and use ``pymatgen`` as normal for crystal structures +to be shown using Crystal Toolkit. -3. Restart Jupyter Lab completely. You be asked to perform a "build," click OK and it's normal - for this to take a minute. After this it's ready to use! +Caveats +------- -The extension may still work on Jupyter Lab 2.x by additionally running: +Crystal Toolkit now uses Dash's in-built `Jupyter integration `_. +Previous versions of Crystal Toolkit used a customer Jupyter extension, but this extension was limited in scope, +difficult to maintain, and restricted usage to specific versions of Jupyter (Jupyter Lab 2+). The new solution +runs a Dash server behind-the-scenes. - ``jupyter labextension install crystaltoolkit-extension`` +Issues might be encountered when running behind a proxy. To fix, try:: -However 2.x is no longer supported, and this command does not need to be run with Jupyter Lab 3.x + from dash import jupyter_dash -Usage ------ + jupyter_dash.infer_jupyter_proxy_config() -To use, simply ``import crystal_toolkit`` and use ``pymatgen`` as normal for crystal structures -to be shown using Crystal Toolkit. +Alternatively, consult the Dash documentation or forums for help. The default port is 8884, but can be modified +by setting the ``CT_JUPYTER_EMBED_PORT`` environment variable. diff --git a/docs_rst/modernization.rst b/docs_rst/modernization.rst new file mode 100644 index 00000000..399212cd --- /dev/null +++ b/docs_rst/modernization.rst @@ -0,0 +1,52 @@ +============= +Modernization +============= + +Crystal Toolkit has been able to work with both Dash 1.x and Dash 2. However, +several design choices were made before Dash 2 was developed that can now be +replaced with first-party solutions now provided by Dash 2. + +The minimum version required is now Dash 2.11. + +Wherever possible, changes will be made gradually and in a backwards-compatible way. +However, please pay attention to deprecation warnings! + +The overall goal is to defer to first-party solutions wherever possible, with the +hope of making the Crystal Toolkit codebase leaner and simpler. + +Plugin +------ + +Previously, a `ctc.register_crystal_toolkit()` line was required in every Crystal Toolkit +app. Dash now supports plugins, so the new solution is:: + + from crystal_toolkit import CrystalToolkitPlugin + + my_layout = ... # your initial app layout + + # provide other arguments to Dash constructor as required + dash = Dash(..., plugins=[CrystalToolkitPlugin(layout=my_layout)]) + +Jupyter +------- + +Previously, Crystal Toolkit supplied its own Jupyter Lab extension. While this is still +installed by default to render ``Scene`` objects, most end users will now use a Dash-based +Jupyter renderer. This will allow for display of Crystal Toolkit components in Jupyter +exactly as in its Dash app counterpart. + +Pagination +---------- + +Crystal Toolkit as developed before first-party support for multipage apps was developed. As +such, there are some limitations for very large Crystal Toolkit apps, which result in a lot of +``dcc.Store`` elements being added to a layout. This design choice can now be reconsidered. +This improvement is pending. + + +All-in-One Components and Pattern-Matched Callbacks +--------------------------------------------------- + +Crystal Toolkit as developed before pattern-matched callbacks were available, and before +the "all-in-one" component pattern was established. Many components can now be simplified +to use these features. This improvement is pending. diff --git a/pyproject.toml b/pyproject.toml index bc74b5ad..e7b1609d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,15 +7,17 @@ showcase of the framework’s capabilities, the Crystal Toolkit app allows you t analyze and transform crystal structures and molecules.""" readme = "README.md" license = { file = "LICENSE" } -requires-python = ">=3.8" +requires-python = ">=3.9" authors = [{ name = "Matt Horton", email = "mkhorton@lbl.gov" }] dependencies = [ "crystaltoolkit-extension", - "dash-mp-components", + "dash-mp-components>=0.4.38", "dash>=2.11.0", "flask-caching", "frozendict", + "mp-api", + "pydantic-settings", "pymatgen", "scikit-image", "scikit-learn", @@ -40,6 +42,7 @@ dev = [ "recommonmark", "sphinx_rtd_theme", ] +test = ["playwright", "pytest", "pytest-playwright"] [project.urls] repo = "https://github.com/materialsproject/crystaltoolkit" @@ -54,11 +57,13 @@ write_to_template = '__version__ = "{version}"' local_scheme = "no-local-version" [build-system] -requires = ["setuptools>=45", "setuptools_scm[toml]>=6.2"] +requires = ["setuptools>=45", "setuptools_scm[toml]>=6.2,<8"] build-backend = "setuptools.build_meta" [tool.ruff] target-version = "py38" + +[tool.ruff.lint] select = [ "B", # flake8-bugbear "C4", # flake8-comprehensions @@ -100,6 +105,7 @@ ignore = [ "D205", # 1 blank line required between summary line and description "E501", # Line too long "E731", # Do not assign a lambda expression, use a def + "ISC001", "PD901", # pandas-df-variable-name "PERF203", # try-except-in-loop "PLR", # pylint refactor @@ -108,7 +114,7 @@ ignore = [ pydocstyle.convention = "google" isort.split-on-trailing-comma = false -[tool.ruff.per-file-ignores] +[tool.ruff.lint.per-file-ignores] "**/tests/*" = ["D"] "__init__.py" = ["F401"] # future annotations incompatible with pydantic BaseModel schemas below py 3.10 @@ -125,3 +131,7 @@ ignore-words-list = "nd,te,ois" [tool.mypy] no_implicit_optional = false + +[tool.versioningit.vcs] +default-tag = "0.0.1" +method = "git" diff --git a/requirements/macos-latest_py3.10.txt b/requirements/macos-latest_py3.10.txt deleted file mode 100644 index 4f159b78..00000000 --- a/requirements/macos-latest_py3.10.txt +++ /dev/null @@ -1,509 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.10 -# by the following command: -# -# pip-compile --output-file=requirements/macos-latest_py3.10.txt pyproject.toml -# -aiofiles==22.1.0 - # via ypy-websocket -aiosqlite==0.19.0 - # via ypy-websocket -ansi2html==1.8.0 - # via dash -anyio==3.7.1 - # via jupyter-server -appnope==0.1.3 - # via - # ipykernel - # ipython -argon2-cffi==21.3.0 - # via - # jupyter-server - # nbclassic - # notebook -argon2-cffi-bindings==21.2.0 - # via argon2-cffi -arrow==1.2.3 - # via isoduration -asttokens==2.2.1 - # via stack-data -attrs==23.1.0 - # via - # jsonschema - # referencing -babel==2.12.1 - # via jupyterlab-server -backcall==0.2.0 - # via ipython -beautifulsoup4==4.12.2 - # via nbconvert -bleach==6.0.0 - # via nbconvert -cachelib==0.9.0 - # via flask-caching -certifi==2023.5.7 - # via requests -cffi==1.15.1 - # via argon2-cffi-bindings -charset-normalizer==3.2.0 - # via requests -click==8.1.5 - # via flask -comm==0.1.3 - # via ipykernel -contourpy==1.1.0 - # via matplotlib -crystaltoolkit-extension==0.6.0 - # via crystal-toolkit (pyproject.toml) -cycler==0.11.0 - # via matplotlib -dash==2.11.1 - # via crystal-toolkit (pyproject.toml) -dash-core-components==2.0.0 - # via dash -dash-html-components==2.0.0 - # via dash -dash-mp-components==0.4.36 - # via crystal-toolkit (pyproject.toml) -dash-table==5.0.0 - # via dash -debugpy==1.6.7 - # via ipykernel -decorator==5.1.1 - # via ipython -defusedxml==0.7.1 - # via nbconvert -emmet-core==0.60.1 - # via mp-api -exceptiongroup==1.1.2 - # via anyio -executing==1.2.0 - # via stack-data -fastjsonschema==2.17.1 - # via nbformat -flask==2.2.5 - # via - # dash - # flask-caching -flask-caching==2.0.2 - # via crystal-toolkit (pyproject.toml) -fonttools==4.41.0 - # via matplotlib -fqdn==1.5.1 - # via jsonschema -frozendict==2.3.8 - # via crystal-toolkit (pyproject.toml) -future==0.18.3 - # via uncertainties -idna==3.4 - # via - # anyio - # jsonschema - # requests -imageio==2.31.1 - # via scikit-image -ipykernel==6.24.0 - # via - # nbclassic - # notebook -ipython==8.14.0 - # via - # ipykernel - # jupyterlab -ipython-genutils==0.2.0 - # via - # nbclassic - # notebook -isoduration==20.11.0 - # via jsonschema -itsdangerous==2.1.2 - # via flask -jedi==0.18.2 - # via ipython -jinja2==3.1.2 - # via - # flask - # jupyter-server - # jupyterlab - # jupyterlab-server - # nbclassic - # nbconvert - # notebook -joblib==1.3.1 - # via - # pymatgen - # scikit-learn -json5==0.9.14 - # via jupyterlab-server -jsonpointer==2.4 - # via jsonschema -jsonschema[format-nongpl]==4.18.3 - # via - # jupyter-events - # jupyterlab-server - # nbformat -jsonschema-specifications==2023.6.1 - # via jsonschema -jupyter-client==8.3.0 - # via - # ipykernel - # jupyter-server - # nbclassic - # nbclient - # notebook -jupyter-core==5.3.1 - # via - # ipykernel - # jupyter-client - # jupyter-server - # jupyterlab - # nbclassic - # nbclient - # nbconvert - # nbformat - # notebook -jupyter-events==0.6.3 - # via - # jupyter-server - # jupyter-server-fileid -jupyter-server==2.7.0 - # via - # jupyter-server-fileid - # jupyterlab - # jupyterlab-server - # nbclassic - # notebook-shim -jupyter-server-fileid==0.9.0 - # via jupyter-server-ydoc -jupyter-server-terminals==0.4.4 - # via jupyter-server -jupyter-server-ydoc==0.8.0 - # via jupyterlab -jupyter-ydoc==0.2.4 - # via - # jupyter-server-ydoc - # jupyterlab -jupyterlab==3.6.5 - # via crystaltoolkit-extension -jupyterlab-pygments==0.2.2 - # via nbconvert -jupyterlab-server==2.23.0 - # via jupyterlab -kiwisolver==1.4.4 - # via matplotlib -latexcodec==2.0.1 - # via pybtex -lazy-loader==0.3 - # via scikit-image -markupsafe==2.1.3 - # via - # jinja2 - # nbconvert - # werkzeug -matplotlib==3.7.2 - # via pymatgen -matplotlib-inline==0.1.6 - # via - # ipykernel - # ipython -mistune==3.0.1 - # via nbconvert -monty==2023.5.8 - # via - # emmet-core - # mp-api - # pymatgen -mp-api==0.33.3 - # via pymatgen -mpmath==1.3.0 - # via sympy -msgpack==1.0.5 - # via mp-api -nbclassic==1.0.0 - # via - # jupyterlab - # notebook -nbclient==0.8.0 - # via nbconvert -nbconvert==7.7.1 - # via - # jupyter-server - # nbclassic - # notebook -nbformat==5.9.1 - # via - # jupyter-server - # nbclassic - # nbclient - # nbconvert - # notebook -nest-asyncio==1.5.6 - # via - # dash - # ipykernel - # nbclassic - # notebook -networkx==3.1 - # via - # pymatgen - # scikit-image -notebook==6.5.4 - # via jupyterlab -notebook-shim==0.2.3 - # via nbclassic -numpy==1.25.1 - # via - # contourpy - # imageio - # matplotlib - # pandas - # pymatgen - # pywavelets - # scikit-image - # scikit-learn - # scipy - # shapely - # spglib - # tifffile -overrides==7.3.1 - # via jupyter-server -packaging==23.1 - # via - # ipykernel - # jupyter-server - # jupyterlab - # jupyterlab-server - # matplotlib - # nbconvert - # plotly - # scikit-image -palettable==3.3.3 - # via pymatgen -pandas==2.0.3 - # via pymatgen -pandocfilters==1.5.0 - # via nbconvert -parso==0.8.3 - # via jedi -pexpect==4.8.0 - # via ipython -pickleshare==0.7.5 - # via ipython -pillow==10.0.0 - # via - # imageio - # matplotlib - # scikit-image -platformdirs==3.9.1 - # via jupyter-core -plotly==5.15.0 - # via - # dash - # pymatgen -prometheus-client==0.17.1 - # via - # jupyter-server - # nbclassic - # notebook -prompt-toolkit==3.0.39 - # via ipython -psutil==5.9.5 - # via ipykernel -ptyprocess==0.7.0 - # via - # pexpect - # terminado -pure-eval==0.2.2 - # via stack-data -pybtex==0.24.0 - # via - # emmet-core - # pymatgen -pycparser==2.21 - # via cffi -pydantic==1.10.11 - # via - # emmet-core - # pymatgen -pygments==2.15.1 - # via - # ipython - # nbconvert -pymatgen==2023.7.17 - # via - # crystal-toolkit (pyproject.toml) - # emmet-core - # mp-api -pyparsing==3.0.9 - # via matplotlib -python-dateutil==2.8.2 - # via - # arrow - # jupyter-client - # matplotlib - # pandas -python-json-logger==2.0.7 - # via jupyter-events -pytz==2023.3 - # via pandas -pywavelets==1.4.1 - # via scikit-image -pyyaml==6.0.1 - # via - # jupyter-events - # pybtex -pyzmq==25.1.0 - # via - # ipykernel - # jupyter-client - # jupyter-server - # nbclassic - # notebook -referencing==0.29.1 - # via - # jsonschema - # jsonschema-specifications -requests==2.31.0 - # via - # dash - # jupyterlab-server - # mp-api - # pymatgen -retrying==1.3.4 - # via dash -rfc3339-validator==0.1.4 - # via - # jsonschema - # jupyter-events -rfc3986-validator==0.1.1 - # via - # jsonschema - # jupyter-events -rpds-py==0.8.11 - # via - # jsonschema - # referencing -ruamel-yaml==0.17.32 - # via pymatgen -ruamel-yaml-clib==0.2.7 - # via ruamel-yaml -scikit-image==0.21.0 - # via crystal-toolkit (pyproject.toml) -scikit-learn==1.3.0 - # via crystal-toolkit (pyproject.toml) -scipy==1.11.1 - # via - # pymatgen - # scikit-image - # scikit-learn -send2trash==1.8.2 - # via - # jupyter-server - # nbclassic - # notebook -shapely==2.0.1 - # via crystal-toolkit (pyproject.toml) -six==1.16.0 - # via - # asttokens - # bleach - # latexcodec - # pybtex - # python-dateutil - # retrying - # rfc3339-validator -sniffio==1.3.0 - # via anyio -soupsieve==2.4.1 - # via beautifulsoup4 -spglib==2.0.2 - # via - # emmet-core - # pymatgen -stack-data==0.6.2 - # via ipython -sympy==1.12 - # via pymatgen -tabulate==0.9.0 - # via pymatgen -tenacity==8.2.2 - # via plotly -terminado==0.17.1 - # via - # jupyter-server - # jupyter-server-terminals - # nbclassic - # notebook -threadpoolctl==3.2.0 - # via scikit-learn -tifffile==2023.7.10 - # via scikit-image -tinycss2==1.2.1 - # via nbconvert -tomli==2.0.1 - # via jupyterlab -tornado==6.3.2 - # via - # ipykernel - # jupyter-client - # jupyter-server - # jupyterlab - # nbclassic - # notebook - # terminado -tqdm==4.65.0 - # via pymatgen -traitlets==5.9.0 - # via - # comm - # ipykernel - # ipython - # jupyter-client - # jupyter-core - # jupyter-events - # jupyter-server - # matplotlib-inline - # nbclassic - # nbclient - # nbconvert - # nbformat - # notebook -typing-extensions==4.7.1 - # via - # dash - # emmet-core - # mp-api - # pydantic -tzdata==2023.3 - # via pandas -uncertainties==3.1.7 - # via pymatgen -uri-template==1.3.0 - # via jsonschema -urllib3==2.0.3 - # via requests -wcwidth==0.2.6 - # via prompt-toolkit -webcolors==1.13 - # via - # crystal-toolkit (pyproject.toml) - # jsonschema -webencodings==0.5.1 - # via - # bleach - # tinycss2 -websocket-client==1.6.1 - # via jupyter-server -werkzeug==2.2.3 - # via - # dash - # flask -y-py==0.5.9 - # via - # jupyter-ydoc - # ypy-websocket -ypy-websocket==0.8.2 - # via jupyter-server-ydoc - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/requirements/macos-latest_py3.10_extras.txt b/requirements/macos-latest_py3.10_extras.txt deleted file mode 100644 index 180b410f..00000000 --- a/requirements/macos-latest_py3.10_extras.txt +++ /dev/null @@ -1,1007 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.10 -# by the following command: -# -# pip-compile --all-extras --output-file=requirements/macos-latest_py3.10_extras.txt pyproject.toml -# -aiofiles==22.1.0 - # via ypy-websocket -aiohttp==3.8.4 - # via dephell -aiosignal==1.3.1 - # via aiohttp -aiosqlite==0.19.0 - # via ypy-websocket -alabaster==0.7.13 - # via sphinx -ansi2html==1.8.0 - # via dash -anyio==3.7.1 - # via - # httpcore - # jupyter-server -appnope==0.1.3 - # via - # ipykernel - # ipython -argon2-cffi==21.3.0 - # via - # jupyter-server - # nbclassic - # notebook -argon2-cffi-bindings==21.2.0 - # via argon2-cffi -arrow==1.2.3 - # via isoduration -ase==3.22.1 - # via - # boltztrap2 - # dscribe - # hiphive -asttokens==2.2.1 - # via stack-data -async-timeout==4.0.2 - # via - # aiohttp - # redis -attrs==23.1.0 - # via - # aiohttp - # dephell - # dephell-archive - # dephell-discover - # dephell-licenses - # dephell-links - # dephell-markers - # dephell-pythons - # dephell-shells - # dephell-venvs - # jsonschema - # outcome - # referencing - # trio -babel==2.12.1 - # via - # jupyterlab-server - # sphinx -backcall==0.2.0 - # via ipython -beautifulsoup4==4.12.2 - # via - # dash - # gdown - # nbconvert -black==23.7.0 - # via crystal-toolkit (pyproject.toml) -bleach==6.0.0 - # via nbconvert -boltztrap2==22.12.1 - # via ifermi -cachelib==0.9.0 - # via flask-caching -cerberus==1.3.4 - # via dephell -certifi==2023.5.7 - # via - # dephell - # httpcore - # netcdf4 - # requests - # urllib3 -cffi==1.15.1 - # via - # argon2-cffi-bindings - # cryptography -cfgv==3.3.1 - # via pre-commit -cftime==1.6.2 - # via netcdf4 -charset-normalizer==3.2.0 - # via - # aiohttp - # requests -click==8.1.5 - # via - # black - # dask - # distributed - # flask - # ifermi -cloudpickle==2.2.1 - # via - # dask - # distributed -comm==0.1.3 - # via ipykernel -commonmark==0.9.1 - # via recommonmark -contourpy==1.1.0 - # via matplotlib -cryptography==41.0.2 - # via - # pyopenssl - # urllib3 -crystaltoolkit-extension==0.6.0 - # via crystal-toolkit (pyproject.toml) -cycler==0.11.0 - # via matplotlib -dash[testing]==2.11.1 - # via - # crystal-toolkit (pyproject.toml) - # dash-extensions - # dash-vtk -dash-core-components==2.0.0 - # via dash -dash-extensions==1.0.1 - # via crystal-toolkit (pyproject.toml) -dash-html-components==2.0.0 - # via dash -dash-mp-components==0.4.36 - # via crystal-toolkit (pyproject.toml) -dash-table==5.0.0 - # via dash -dash-testing-stub==0.0.2 - # via dash -dash-vtk==0.0.9 - # via crystal-toolkit (pyproject.toml) -dask==2023.7.0 - # via - # distributed - # py4dstem -debugpy==1.6.7 - # via ipykernel -decorator==5.1.1 - # via ipython -defusedxml==0.7.1 - # via nbconvert -dephell==0.8.3 - # via crystal-toolkit (pyproject.toml) -dephell-archive==0.1.7 - # via dephell -dephell-argparse==0.1.3 - # via dephell -dephell-changelogs==0.0.1 - # via dephell -dephell-discover==0.2.10 - # via dephell -dephell-licenses==0.1.7 - # via dephell -dephell-links==0.1.5 - # via dephell -dephell-markers==1.0.3 - # via dephell -dephell-pythons==0.1.15 - # via - # dephell - # dephell-venvs -dephell-setuptools==0.2.5 - # via dephell -dephell-shells==0.1.5 - # via dephell -dephell-specifier==0.3.0 - # via - # dephell - # dephell-markers - # dephell-pythons -dephell-venvs==0.1.18 - # via dephell -dephell-versioning==0.1.2 - # via dephell -dill==0.3.6 - # via - # multiprocess - # py4dstem -distlib==0.3.7 - # via virtualenv -distributed==2023.7.0 - # via py4dstem -dnspython==2.4.0 - # via pymongo -docutils==0.18.1 - # via - # m2r - # recommonmark - # sphinx - # sphinx-rtd-theme -dscribe==2.0.0 - # via crystal-toolkit (pyproject.toml) -editorconfig==0.12.3 - # via jsbeautifier -emdfile==0.0.8 - # via py4dstem -emmet-core==0.60.1 - # via mp-api -entrypoints==0.4 - # via nbconvert -exceptiongroup==1.1.2 - # via - # anyio - # pytest - # trio - # trio-websocket -executing==1.2.0 - # via stack-data -fastjsonschema==2.17.1 - # via nbformat -filelock==3.12.2 - # via - # gdown - # virtualenv -flask==2.2.5 - # via - # dash - # flask-caching -flask-caching==2.0.2 - # via - # crystal-toolkit (pyproject.toml) - # dash-extensions -fonttools==4.41.0 - # via matplotlib -fqdn==1.5.1 - # via jsonschema -frozendict==2.3.8 - # via crystal-toolkit (pyproject.toml) -frozenlist==1.4.0 - # via - # aiohttp - # aiosignal -fsspec==2023.6.0 - # via dask -future==0.18.3 - # via - # matminer - # uncertainties -gdown==4.7.1 - # via py4dstem -gevent==23.7.0 - # via gunicorn -greenlet==2.0.2 - # via gevent -gunicorn[gevent]==21.0.1 - # via crystal-toolkit (pyproject.toml) -h11==0.14.0 - # via - # httpcore - # wsproto -h5py==3.9.0 - # via - # emdfile - # hiphive - # ncempy - # py4dstem -habanero==1.2.3 - # via crystal-toolkit (pyproject.toml) -hiphive==1.1 - # via crystal-toolkit (pyproject.toml) -httpcore==0.17.3 - # via dnspython -identify==2.5.24 - # via pre-commit -idna==3.4 - # via - # anyio - # jsonschema - # requests - # trio - # urllib3 - # yarl -ifermi==0.3.1 - # via crystal-toolkit (pyproject.toml) -imageio==2.31.1 - # via scikit-image -imagesize==1.4.1 - # via sphinx -importlib-metadata==6.8.0 - # via dask -inflect==7.0.0 - # via robocrys -iniconfig==2.0.0 - # via pytest -ipykernel==6.24.0 - # via - # ipywidgets - # nbclassic - # notebook -ipython==8.14.0 - # via - # ipykernel - # ipywidgets - # jupyterlab -ipython-genutils==0.2.0 - # via - # nbclassic - # notebook -ipywidgets==8.0.7 - # via py4dstem -isoduration==20.11.0 - # via jsonschema -itsdangerous==2.1.2 - # via flask -jedi==0.18.2 - # via ipython -jinja2==3.1.2 - # via - # crystal-toolkit (pyproject.toml) - # dephell - # distributed - # flask - # jupyter-server - # jupyterlab - # jupyterlab-server - # nbclassic - # nbconvert - # notebook - # sphinx -joblib==1.3.1 - # via - # dscribe - # pymatgen - # scikit-learn -jsbeautifier==1.14.8 - # via dash-extensions -json5==0.9.14 - # via jupyterlab-server -jsonpointer==2.4 - # via jsonschema -jsonschema[format-nongpl]==4.18.3 - # via - # jupyter-events - # jupyterlab-server - # nbformat -jsonschema-specifications==2023.6.1 - # via jsonschema -jupyter-client==8.3.0 - # via - # ipykernel - # jupyter-server - # nbclassic - # nbclient - # notebook -jupyter-core==5.3.1 - # via - # ipykernel - # jupyter-client - # jupyter-server - # jupyterlab - # nbclassic - # nbclient - # nbconvert - # nbformat - # notebook -jupyter-events==0.6.3 - # via - # jupyter-server - # jupyter-server-fileid -jupyter-server==2.7.0 - # via - # jupyter-server-fileid - # jupyterlab - # jupyterlab-server - # nbclassic - # notebook-shim -jupyter-server-fileid==0.9.0 - # via jupyter-server-ydoc -jupyter-server-terminals==0.4.4 - # via jupyter-server -jupyter-server-ydoc==0.8.0 - # via jupyterlab -jupyter-ydoc==0.2.4 - # via - # jupyter-server-ydoc - # jupyterlab -jupyterlab==3.6.5 - # via crystaltoolkit-extension -jupyterlab-pygments==0.2.2 - # via nbconvert -jupyterlab-server==2.23.0 - # via jupyterlab -jupyterlab-widgets==3.0.8 - # via ipywidgets -kaleido==0.2.1 - # via crystal-toolkit (pyproject.toml) -kiwisolver==1.4.4 - # via matplotlib -latexcodec==2.0.1 - # via pybtex -lazy-loader==0.3 - # via scikit-image -llvmlite==0.40.1 - # via numba -locket==1.0.0 - # via - # distributed - # partd -lxml==4.9.3 - # via - # dash - # nbconvert -m2r==0.3.1 - # via dephell -markupsafe==2.1.3 - # via - # jinja2 - # nbconvert - # werkzeug -matminer==0.9.0 - # via robocrys -matplotlib==3.7.2 - # via - # ase - # boltztrap2 - # ifermi - # ncempy - # py4dstem - # pymatgen - # vtk -matplotlib-inline==0.1.6 - # via - # ipykernel - # ipython -meshcut==0.3.0 - # via ifermi -mistune==0.8.4 - # via - # m2r - # nbconvert -monty==2023.5.8 - # via - # emmet-core - # ifermi - # matminer - # mp-api - # pymatgen - # robocrys -more-itertools==9.1.0 - # via dash-extensions -mp-api==0.33.3 - # via pymatgen -mpmath==1.3.0 - # via sympy -msgpack==1.0.5 - # via - # distributed - # mp-api -multidict==6.0.4 - # via - # aiohttp - # yarl -multiprocess==0.70.14 - # via dash -mypy-extensions==1.0.0 - # via black -nbclassic==1.0.0 - # via - # jupyterlab - # notebook -nbclient==0.8.0 - # via nbconvert -nbconvert==6.5.4 - # via - # jupyter-server - # nbclassic - # notebook -nbformat==5.9.1 - # via - # jupyter-server - # nbclassic - # nbclient - # nbconvert - # notebook -ncempy==1.10.0 - # via py4dstem -nest-asyncio==1.5.6 - # via - # dash - # ipykernel - # nbclassic - # notebook -netcdf4==1.6.4 - # via boltztrap2 -networkx==3.1 - # via - # ifermi - # pymatgen - # robocrys - # scikit-image -nodeenv==1.8.0 - # via pre-commit -notebook==6.5.4 - # via jupyterlab -notebook-shim==0.2.3 - # via nbclassic -numba==0.57.1 - # via - # hiphive - # sparse -numpy==1.21.6 - # via - # ase - # boltztrap2 - # cftime - # contourpy - # dscribe - # emdfile - # h5py - # hiphive - # ifermi - # imageio - # matminer - # matplotlib - # meshcut - # ncempy - # netcdf4 - # numba - # numpy-stl - # pandas - # py4dstem - # pyfftw - # pymatgen - # pywavelets - # robocrys - # scikit-image - # scikit-learn - # scipy - # shapely - # sparse - # spglib - # tifffile - # trainstation - # trimesh -numpy-stl==3.0.1 - # via meshcut -outcome==1.2.0 - # via trio -overrides==7.3.1 - # via jupyter-server -packaging==23.1 - # via - # black - # dask - # dephell - # dephell-markers - # dephell-pythons - # dephell-specifier - # dephell-versioning - # distributed - # gunicorn - # ipykernel - # jupyter-server - # jupyterlab - # jupyterlab-server - # matplotlib - # nbconvert - # plotly - # pytest - # scikit-image - # sphinx -palettable==3.3.3 - # via pymatgen -pandas==1.5.3 - # via - # hiphive - # matminer - # pymatgen -pandocfilters==1.5.0 - # via nbconvert -parso==0.8.3 - # via jedi -partd==1.4.0 - # via dask -pathspec==0.11.1 - # via black -percy==2.0.2 - # via dash -pexpect==4.8.0 - # via - # dephell-shells - # ipython -pickleshare==0.7.5 - # via ipython -pillow==10.0.0 - # via - # imageio - # matplotlib - # scikit-image -platformdirs==3.9.1 - # via - # black - # jupyter-core - # virtualenv -plotly==5.15.0 - # via - # dash - # ifermi - # pymatgen -pluggy==1.2.0 - # via pytest -pre-commit==3.3.3 - # via crystal-toolkit (pyproject.toml) -prometheus-client==0.17.1 - # via - # jupyter-server - # nbclassic - # notebook -prompt-toolkit==3.0.39 - # via ipython -psutil==5.9.5 - # via - # dash - # distributed - # ifermi - # ipykernel -ptyprocess==0.7.0 - # via - # pexpect - # terminado -pubchempy==1.0.4 - # via robocrys -pure-eval==0.2.2 - # via stack-data -py4dstem==0.14.2 - # via crystal-toolkit (pyproject.toml) -pybind11==2.11.1 - # via dscribe -pybtex==0.24.0 - # via - # emmet-core - # pymatgen - # robocrys -pycparser==2.21 - # via cffi -pydantic==1.10.11 - # via - # emmet-core - # inflect - # pymatgen -pyfftw==0.13.1 - # via - # crystal-toolkit (pyproject.toml) - # ifermi -pygments==2.15.1 - # via - # ipython - # nbconvert - # sphinx -pymatgen==2023.7.17 - # via - # crystal-toolkit (pyproject.toml) - # emmet-core - # ifermi - # matminer - # mp-api - # robocrys -pymongo==4.4.1 - # via matminer -pyopenssl==23.2.0 - # via urllib3 -pyparsing==3.0.9 - # via matplotlib -pysocks==1.7.1 - # via - # requests - # urllib3 -pytest==7.4.0 - # via dash -python-dateutil==2.8.2 - # via - # arrow - # jupyter-client - # matplotlib - # pandas -python-json-logger==2.0.7 - # via jupyter-events -python-utils==3.7.0 - # via numpy-stl -pytz==2023.3 - # via pandas -pywavelets==1.4.1 - # via scikit-image -pyyaml==6.0.1 - # via - # dask - # distributed - # jupyter-events - # pre-commit - # pybtex -pyzmq==25.1.0 - # via - # ipykernel - # jupyter-client - # jupyter-server - # nbclassic - # notebook -recommonmark==0.7.1 - # via crystal-toolkit (pyproject.toml) -redis==4.6.0 - # via crystal-toolkit (pyproject.toml) -referencing==0.29.1 - # via - # jsonschema - # jsonschema-specifications -requests[security,socks]==2.31.0 - # via - # dash - # dephell - # dephell-changelogs - # dephell-licenses - # dephell-venvs - # gdown - # habanero - # jupyterlab-server - # matminer - # mp-api - # percy - # pymatgen - # sphinx -retrying==1.3.4 - # via dash -rfc3339-validator==0.1.4 - # via - # jsonschema - # jupyter-events -rfc3986-validator==0.1.1 - # via - # jsonschema - # jupyter-events -robocrys==0.2.8 - # via crystal-toolkit (pyproject.toml) -rpds-py==0.8.11 - # via - # jsonschema - # referencing -ruamel-yaml==0.17.32 - # via - # dephell - # pymatgen - # robocrys -ruamel-yaml-clib==0.2.7 - # via ruamel-yaml -scikit-image==0.21.0 - # via - # crystal-toolkit (pyproject.toml) - # ifermi - # py4dstem -scikit-learn==1.3.0 - # via - # crystal-toolkit (pyproject.toml) - # dscribe - # hiphive - # matminer - # py4dstem - # trainstation -scipy==1.11.1 - # via - # ase - # boltztrap2 - # dscribe - # emdfile - # hiphive - # ifermi - # meshcut - # ncempy - # py4dstem - # pymatgen - # robocrys - # scikit-image - # scikit-learn - # sparse - # trainstation -selenium==4.2.0 - # via dash -send2trash==1.8.2 - # via - # jupyter-server - # nbclassic - # notebook -shapely==2.0.1 - # via crystal-toolkit (pyproject.toml) -shellingham==1.5.0.post1 - # via dephell-shells -six==1.16.0 - # via - # asttokens - # bleach - # gdown - # jsbeautifier - # latexcodec - # pybtex - # python-dateutil - # retrying - # rfc3339-validator -sniffio==1.3.0 - # via - # anyio - # dnspython - # httpcore - # trio -snowballstemmer==2.2.0 - # via sphinx -sortedcontainers==2.4.0 - # via - # distributed - # trio -soupsieve==2.4.1 - # via beautifulsoup4 -sparse==0.14.0 - # via dscribe -spglib==2.0.2 - # via - # boltztrap2 - # emmet-core - # hiphive - # ifermi - # pymatgen - # robocrys -sphinx==6.2.1 - # via - # recommonmark - # sphinx-rtd-theme - # sphinxcontrib-jquery -sphinx-rtd-theme==1.2.2 - # via crystal-toolkit (pyproject.toml) -sphinxcontrib-applehelp==1.0.4 - # via sphinx -sphinxcontrib-devhelp==1.0.2 - # via sphinx -sphinxcontrib-htmlhelp==2.0.1 - # via sphinx -sphinxcontrib-jquery==4.1 - # via sphinx-rtd-theme -sphinxcontrib-jsmath==1.0.1 - # via sphinx -sphinxcontrib-qthelp==1.0.3 - # via sphinx -sphinxcontrib-serializinghtml==1.1.5 - # via sphinx -stack-data==0.6.2 - # via ipython -sympy==1.12 - # via - # hiphive - # matminer - # pymatgen -tabulate==0.9.0 - # via - # ifermi - # pymatgen -tblib==2.0.0 - # via distributed -tenacity==8.2.2 - # via plotly -termcolor==2.3.0 - # via yaspin -terminado==0.17.1 - # via - # jupyter-server - # jupyter-server-terminals - # nbclassic - # notebook -threadpoolctl==3.2.0 - # via scikit-learn -tifffile==2023.7.10 - # via scikit-image -tinycss2==1.2.1 - # via nbconvert -tomli==2.0.1 - # via - # black - # jupyterlab - # pytest -tomlkit==0.11.8 - # via dephell -toolz==0.12.0 - # via - # dask - # distributed - # partd -tornado==6.3.2 - # via - # distributed - # ipykernel - # jupyter-client - # jupyter-server - # jupyterlab - # nbclassic - # notebook - # terminado -tqdm==4.65.0 - # via - # emdfile - # gdown - # habanero - # matminer - # py4dstem - # pymatgen -trainstation==1.0 - # via hiphive -traitlets==5.9.0 - # via - # comm - # ipykernel - # ipython - # ipywidgets - # jupyter-client - # jupyter-core - # jupyter-events - # jupyter-server - # matplotlib-inline - # nbclassic - # nbclient - # nbconvert - # nbformat - # notebook -trimesh==3.22.4 - # via ifermi -trio==0.22.2 - # via - # selenium - # trio-websocket -trio-websocket==0.10.3 - # via selenium -typing-extensions==4.7.1 - # via - # dash - # emmet-core - # inflect - # mp-api - # pydantic - # python-utils -uncertainties==3.1.7 - # via pymatgen -uri-template==1.3.0 - # via jsonschema -urllib3[secure,socks]==1.26.16 - # via - # distributed - # requests - # selenium -urllib3-secure-extra==0.1.0 - # via urllib3 -virtualenv==20.24.0 - # via pre-commit -vtk==9.2.6 - # via dash-vtk -waitress==2.1.2 - # via dash -wcwidth==0.2.6 - # via prompt-toolkit -webcolors==1.13 - # via - # crystal-toolkit (pyproject.toml) - # jsonschema -webencodings==0.5.1 - # via - # bleach - # tinycss2 -websocket-client==1.6.1 - # via jupyter-server -werkzeug==2.2.3 - # via - # dash - # flask -widgetsnbextension==4.0.8 - # via ipywidgets -wsproto==1.2.0 - # via trio-websocket -y-py==0.5.9 - # via - # jupyter-ydoc - # ypy-websocket -yarl==1.9.2 - # via aiohttp -yaspin==2.3.0 - # via dephell -ypy-websocket==0.8.2 - # via jupyter-server-ydoc -zict==3.0.0 - # via distributed -zipp==3.16.2 - # via importlib-metadata -zope-event==5.0 - # via gevent -zope-interface==6.0 - # via gevent - -# The following packages are considered to be unsafe in a requirements file: -# pip -# setuptools diff --git a/requirements/macos-latest_py3.8_extras.txt b/requirements/macos-latest_py3.8_extras.txt deleted file mode 100644 index 1175609c..00000000 --- a/requirements/macos-latest_py3.8_extras.txt +++ /dev/null @@ -1,1021 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.8 -# by the following command: -# -# pip-compile --all-extras --output-file=requirements/macos-latest_py3.8_extras.txt pyproject.toml -# -aiofiles==22.1.0 - # via ypy-websocket -aiohttp==3.8.4 - # via dephell -aiosignal==1.3.1 - # via aiohttp -aiosqlite==0.19.0 - # via ypy-websocket -alabaster==0.7.13 - # via sphinx -ansi2html==1.8.0 - # via dash -anyio==3.7.1 - # via - # httpcore - # jupyter-server -appnope==0.1.3 - # via - # ipykernel - # ipython -argon2-cffi==21.3.0 - # via - # jupyter-server - # nbclassic - # notebook -argon2-cffi-bindings==21.2.0 - # via argon2-cffi -arrow==1.2.3 - # via isoduration -ase==3.22.1 - # via - # boltztrap2 - # dscribe - # hiphive -asttokens==2.2.1 - # via stack-data -async-timeout==4.0.2 - # via - # aiohttp - # redis -attrs==23.1.0 - # via - # aiohttp - # dephell - # dephell-archive - # dephell-discover - # dephell-licenses - # dephell-links - # dephell-markers - # dephell-pythons - # dephell-shells - # dephell-venvs - # jsonschema - # outcome - # referencing - # trio -babel==2.12.1 - # via - # jupyterlab-server - # sphinx -backcall==0.2.0 - # via ipython -beautifulsoup4==4.12.2 - # via - # dash - # gdown - # nbconvert -black==23.7.0 - # via crystal-toolkit (pyproject.toml) -bleach==6.0.0 - # via nbconvert -boltztrap2==22.12.1 - # via ifermi -cachelib==0.9.0 - # via flask-caching -cerberus==1.3.4 - # via dephell -certifi==2023.5.7 - # via - # dephell - # httpcore - # netcdf4 - # requests - # urllib3 -cffi==1.15.1 - # via - # argon2-cffi-bindings - # cryptography -cfgv==3.3.1 - # via pre-commit -cftime==1.6.2 - # via netcdf4 -charset-normalizer==3.2.0 - # via - # aiohttp - # requests -click==8.1.5 - # via - # black - # dask - # distributed - # flask - # ifermi -cloudpickle==2.2.1 - # via - # dask - # distributed -comm==0.1.3 - # via ipykernel -commonmark==0.9.1 - # via recommonmark -contourpy==1.1.0 - # via matplotlib -cryptography==41.0.2 - # via - # pyopenssl - # urllib3 -crystaltoolkit-extension==0.6.0 - # via crystal-toolkit (pyproject.toml) -cycler==0.11.0 - # via matplotlib -dash[testing]==2.11.1 - # via - # crystal-toolkit (pyproject.toml) - # dash-extensions - # dash-vtk -dash-core-components==2.0.0 - # via dash -dash-extensions==1.0.1 - # via crystal-toolkit (pyproject.toml) -dash-html-components==2.0.0 - # via dash -dash-mp-components==0.4.36 - # via crystal-toolkit (pyproject.toml) -dash-table==5.0.0 - # via dash -dash-testing-stub==0.0.2 - # via dash -dash-vtk==0.0.9 - # via crystal-toolkit (pyproject.toml) -dask==2023.5.0 - # via - # distributed - # py4dstem -debugpy==1.6.7 - # via ipykernel -decorator==5.1.1 - # via ipython -defusedxml==0.7.1 - # via nbconvert -dephell==0.8.3 - # via crystal-toolkit (pyproject.toml) -dephell-archive==0.1.7 - # via dephell -dephell-argparse==0.1.3 - # via dephell -dephell-changelogs==0.0.1 - # via dephell -dephell-discover==0.2.10 - # via dephell -dephell-licenses==0.1.7 - # via dephell -dephell-links==0.1.5 - # via dephell -dephell-markers==1.0.3 - # via dephell -dephell-pythons==0.1.15 - # via - # dephell - # dephell-venvs -dephell-setuptools==0.2.5 - # via dephell -dephell-shells==0.1.5 - # via dephell -dephell-specifier==0.3.0 - # via - # dephell - # dephell-markers - # dephell-pythons -dephell-venvs==0.1.18 - # via dephell -dephell-versioning==0.1.2 - # via dephell -dill==0.3.6 - # via - # multiprocess - # py4dstem -distlib==0.3.7 - # via virtualenv -distributed==2023.5.0 - # via py4dstem -dnspython==2.4.0 - # via pymongo -docutils==0.18.1 - # via - # m2r - # recommonmark - # sphinx - # sphinx-rtd-theme -dscribe==2.0.0 - # via crystal-toolkit (pyproject.toml) -editorconfig==0.12.3 - # via jsbeautifier -emmet-core==0.60.1 - # via mp-api -entrypoints==0.4 - # via nbconvert -exceptiongroup==1.1.2 - # via - # anyio - # pytest - # trio - # trio-websocket -executing==1.2.0 - # via stack-data -fastjsonschema==2.17.1 - # via nbformat -filelock==3.12.2 - # via - # gdown - # virtualenv -flask==2.2.5 - # via - # dash - # flask-caching -flask-caching==2.0.2 - # via - # crystal-toolkit (pyproject.toml) - # dash-extensions -fonttools==4.41.0 - # via matplotlib -fqdn==1.5.1 - # via jsonschema -frozendict==2.3.8 - # via crystal-toolkit (pyproject.toml) -frozenlist==1.4.0 - # via - # aiohttp - # aiosignal -fsspec==2023.6.0 - # via dask -future==0.18.3 - # via - # matminer - # uncertainties -gdown==4.7.1 - # via py4dstem -gevent==23.7.0 - # via gunicorn -greenlet==2.0.2 - # via gevent -gunicorn[gevent]==21.0.1 - # via crystal-toolkit (pyproject.toml) -h11==0.14.0 - # via - # httpcore - # wsproto -h5py==3.9.0 - # via - # hiphive - # ncempy - # py4dstem -habanero==1.2.3 - # via crystal-toolkit (pyproject.toml) -hiphive==1.1 - # via crystal-toolkit (pyproject.toml) -httpcore==0.17.3 - # via dnspython -identify==2.5.24 - # via pre-commit -idna==3.4 - # via - # anyio - # jsonschema - # requests - # trio - # urllib3 - # yarl -ifermi==0.3.1 - # via crystal-toolkit (pyproject.toml) -imageio==2.31.1 - # via scikit-image -imagesize==1.4.1 - # via sphinx -importlib-metadata==6.8.0 - # via - # dask - # flask - # jupyter-client - # jupyter-ydoc - # jupyterlab-server - # numba - # sphinx -importlib-resources==6.0.0 - # via - # jsonschema - # jsonschema-specifications - # matplotlib -inflect==7.0.0 - # via robocrys -iniconfig==2.0.0 - # via pytest -ipykernel==6.24.0 - # via - # ipywidgets - # nbclassic - # notebook -ipython==8.12.2 - # via - # ipykernel - # ipywidgets - # jupyterlab -ipython-genutils==0.2.0 - # via - # nbclassic - # notebook -ipywidgets==8.0.7 - # via py4dstem -isoduration==20.11.0 - # via jsonschema -itsdangerous==2.1.2 - # via flask -jedi==0.18.2 - # via ipython -jinja2==3.1.2 - # via - # crystal-toolkit (pyproject.toml) - # dephell - # distributed - # flask - # jupyter-server - # jupyterlab - # jupyterlab-server - # nbclassic - # nbconvert - # notebook - # sphinx -joblib==1.3.1 - # via - # dscribe - # pymatgen - # scikit-learn -jsbeautifier==1.14.8 - # via dash-extensions -json5==0.9.14 - # via jupyterlab-server -jsonpointer==2.4 - # via jsonschema -jsonschema[format-nongpl]==4.18.3 - # via - # jupyter-events - # jupyterlab-server - # nbformat -jsonschema-specifications==2023.6.1 - # via jsonschema -jupyter-client==8.3.0 - # via - # ipykernel - # jupyter-server - # nbclassic - # nbclient - # notebook -jupyter-core==5.3.1 - # via - # ipykernel - # jupyter-client - # jupyter-server - # jupyterlab - # nbclassic - # nbclient - # nbconvert - # nbformat - # notebook -jupyter-events==0.6.3 - # via - # jupyter-server - # jupyter-server-fileid -jupyter-server==2.7.0 - # via - # jupyter-server-fileid - # jupyterlab - # jupyterlab-server - # nbclassic - # notebook-shim -jupyter-server-fileid==0.9.0 - # via jupyter-server-ydoc -jupyter-server-terminals==0.4.4 - # via jupyter-server -jupyter-server-ydoc==0.8.0 - # via jupyterlab -jupyter-ydoc==0.2.4 - # via - # jupyter-server-ydoc - # jupyterlab -jupyterlab==3.6.5 - # via crystaltoolkit-extension -jupyterlab-pygments==0.2.2 - # via nbconvert -jupyterlab-server==2.23.0 - # via jupyterlab -jupyterlab-widgets==3.0.8 - # via ipywidgets -kaleido==0.2.1 - # via crystal-toolkit (pyproject.toml) -kiwisolver==1.4.4 - # via matplotlib -latexcodec==2.0.1 - # via pybtex -lazy-loader==0.3 - # via scikit-image -llvmlite==0.40.1 - # via numba -locket==1.0.0 - # via - # distributed - # partd -lxml==4.9.3 - # via - # dash - # nbconvert -m2r==0.3.1 - # via dephell -markupsafe==2.1.3 - # via - # jinja2 - # nbconvert - # werkzeug -matminer==0.9.0 - # via robocrys -matplotlib==3.7.2 - # via - # ase - # boltztrap2 - # ifermi - # ncempy - # py4dstem - # pymatgen - # vtk -matplotlib-inline==0.1.6 - # via - # ipykernel - # ipython -meshcut==0.3.0 - # via ifermi -mistune==0.8.4 - # via - # m2r - # nbconvert -monty==2023.5.8 - # via - # emmet-core - # ifermi - # matminer - # mp-api - # pymatgen - # robocrys -more-itertools==9.1.0 - # via dash-extensions -mp-api==0.33.3 - # via pymatgen -mpmath==1.3.0 - # via sympy -msgpack==1.0.5 - # via - # distributed - # mp-api -multidict==6.0.4 - # via - # aiohttp - # yarl -multiprocess==0.70.14 - # via dash -mypy-extensions==1.0.0 - # via black -nbclassic==1.0.0 - # via - # jupyterlab - # notebook -nbclient==0.8.0 - # via nbconvert -nbconvert==6.5.4 - # via - # jupyter-server - # nbclassic - # notebook -nbformat==5.9.1 - # via - # jupyter-server - # nbclassic - # nbclient - # nbconvert - # notebook -ncempy==1.10.0 - # via py4dstem -nest-asyncio==1.5.6 - # via - # dash - # ipykernel - # nbclassic - # notebook -netcdf4==1.6.4 - # via boltztrap2 -networkx==3.1 - # via - # ifermi - # pymatgen - # robocrys - # scikit-image -nodeenv==1.8.0 - # via pre-commit -notebook==6.5.4 - # via jupyterlab -notebook-shim==0.2.3 - # via nbclassic -numba==0.57.1 - # via - # hiphive - # sparse -numpy==1.21.6 - # via - # ase - # boltztrap2 - # cftime - # contourpy - # dscribe - # h5py - # hiphive - # ifermi - # imageio - # matminer - # matplotlib - # meshcut - # ncempy - # netcdf4 - # numba - # numpy-stl - # pandas - # py4dstem - # pyfftw - # pymatgen - # pywavelets - # robocrys - # scikit-image - # scikit-learn - # scipy - # shapely - # sparse - # spglib - # tifffile - # trainstation - # trimesh -numpy-stl==3.0.1 - # via meshcut -outcome==1.2.0 - # via trio -overrides==7.3.1 - # via jupyter-server -packaging==23.1 - # via - # black - # dask - # dephell - # dephell-markers - # dephell-pythons - # dephell-specifier - # dephell-versioning - # distributed - # gunicorn - # ipykernel - # jupyter-server - # jupyterlab - # jupyterlab-server - # matplotlib - # nbconvert - # plotly - # pytest - # scikit-image - # sphinx -palettable==3.3.3 - # via pymatgen -pandas==1.5.3 - # via - # hiphive - # matminer - # pymatgen -pandocfilters==1.5.0 - # via nbconvert -parso==0.8.3 - # via jedi -partd==1.4.0 - # via dask -pathspec==0.11.1 - # via black -percy==2.0.2 - # via dash -pexpect==4.8.0 - # via - # dephell-shells - # ipython -pickleshare==0.7.5 - # via ipython -pillow==10.0.0 - # via - # imageio - # matplotlib - # scikit-image -pkgutil-resolve-name==1.3.10 - # via jsonschema -platformdirs==3.9.1 - # via - # black - # jupyter-core - # virtualenv -plotly==5.15.0 - # via - # dash - # ifermi - # pymatgen -pluggy==1.2.0 - # via pytest -pre-commit==3.3.3 - # via crystal-toolkit (pyproject.toml) -prometheus-client==0.17.1 - # via - # jupyter-server - # nbclassic - # notebook -prompt-toolkit==3.0.39 - # via ipython -psutil==5.9.5 - # via - # dash - # distributed - # ifermi - # ipykernel -ptyprocess==0.7.0 - # via - # pexpect - # terminado -pubchempy==1.0.4 - # via robocrys -pure-eval==0.2.2 - # via stack-data -py4dstem==0.14.0 - # via crystal-toolkit (pyproject.toml) -pybind11==2.11.1 - # via dscribe -pybtex==0.24.0 - # via - # emmet-core - # pymatgen - # robocrys -pycparser==2.21 - # via cffi -pydantic==1.10.11 - # via - # emmet-core - # inflect - # pymatgen -pyfftw==0.13.1 - # via - # crystal-toolkit (pyproject.toml) - # ifermi -pygments==2.15.1 - # via - # ipython - # nbconvert - # sphinx -pymatgen==2023.7.17 - # via - # crystal-toolkit (pyproject.toml) - # emmet-core - # ifermi - # matminer - # mp-api - # robocrys -pymongo==4.4.1 - # via matminer -pyopenssl==23.2.0 - # via urllib3 -pyparsing==3.0.9 - # via matplotlib -pysocks==1.7.1 - # via - # requests - # urllib3 -pytest==7.4.0 - # via dash -python-dateutil==2.8.2 - # via - # arrow - # jupyter-client - # matplotlib - # pandas -python-json-logger==2.0.7 - # via jupyter-events -python-utils==3.7.0 - # via numpy-stl -pytz==2023.3 - # via - # babel - # pandas -pywavelets==1.4.1 - # via scikit-image -pyyaml==6.0.1 - # via - # dask - # distributed - # jupyter-events - # pre-commit - # pybtex -pyzmq==25.1.0 - # via - # ipykernel - # jupyter-client - # jupyter-server - # nbclassic - # notebook -recommonmark==0.7.1 - # via crystal-toolkit (pyproject.toml) -redis==4.6.0 - # via crystal-toolkit (pyproject.toml) -referencing==0.29.1 - # via - # jsonschema - # jsonschema-specifications -requests[security,socks]==2.31.0 - # via - # dash - # dephell - # dephell-changelogs - # dephell-licenses - # dephell-venvs - # gdown - # habanero - # jupyterlab-server - # matminer - # mp-api - # percy - # pymatgen - # sphinx -retrying==1.3.4 - # via dash -rfc3339-validator==0.1.4 - # via - # jsonschema - # jupyter-events -rfc3986-validator==0.1.1 - # via - # jsonschema - # jupyter-events -robocrys==0.2.8 - # via crystal-toolkit (pyproject.toml) -rpds-py==0.8.11 - # via - # jsonschema - # referencing -ruamel-yaml==0.17.32 - # via - # dephell - # pymatgen - # robocrys -ruamel-yaml-clib==0.2.7 - # via ruamel-yaml -scikit-image==0.21.0 - # via - # crystal-toolkit (pyproject.toml) - # ifermi - # py4dstem -scikit-learn==1.3.0 - # via - # crystal-toolkit (pyproject.toml) - # dscribe - # hiphive - # matminer - # py4dstem - # trainstation -scipy==1.10.1 - # via - # ase - # boltztrap2 - # dscribe - # hiphive - # ifermi - # meshcut - # ncempy - # py4dstem - # pymatgen - # robocrys - # scikit-image - # scikit-learn - # sparse - # trainstation -selenium==4.2.0 - # via dash -send2trash==1.8.2 - # via - # jupyter-server - # nbclassic - # notebook -shapely==2.0.1 - # via crystal-toolkit (pyproject.toml) -shellingham==1.5.0.post1 - # via dephell-shells -six==1.16.0 - # via - # asttokens - # bleach - # gdown - # jsbeautifier - # latexcodec - # pybtex - # python-dateutil - # retrying - # rfc3339-validator -sniffio==1.3.0 - # via - # anyio - # dnspython - # httpcore - # trio -snowballstemmer==2.2.0 - # via sphinx -sortedcontainers==2.4.0 - # via - # distributed - # trio -soupsieve==2.4.1 - # via beautifulsoup4 -sparse==0.14.0 - # via dscribe -spglib==2.0.2 - # via - # boltztrap2 - # emmet-core - # hiphive - # ifermi - # pymatgen - # robocrys -sphinx==6.2.1 - # via - # recommonmark - # sphinx-rtd-theme - # sphinxcontrib-jquery -sphinx-rtd-theme==1.2.2 - # via crystal-toolkit (pyproject.toml) -sphinxcontrib-applehelp==1.0.4 - # via sphinx -sphinxcontrib-devhelp==1.0.2 - # via sphinx -sphinxcontrib-htmlhelp==2.0.1 - # via sphinx -sphinxcontrib-jquery==4.1 - # via sphinx-rtd-theme -sphinxcontrib-jsmath==1.0.1 - # via sphinx -sphinxcontrib-qthelp==1.0.3 - # via sphinx -sphinxcontrib-serializinghtml==1.1.5 - # via sphinx -stack-data==0.6.2 - # via ipython -sympy==1.12 - # via - # hiphive - # matminer - # pymatgen -tabulate==0.9.0 - # via - # ifermi - # pymatgen -tblib==2.0.0 - # via distributed -tenacity==8.2.2 - # via plotly -termcolor==2.3.0 - # via yaspin -terminado==0.17.1 - # via - # jupyter-server - # jupyter-server-terminals - # nbclassic - # notebook -threadpoolctl==3.2.0 - # via scikit-learn -tifffile==2023.7.10 - # via scikit-image -tinycss2==1.2.1 - # via nbconvert -tomli==2.0.1 - # via - # black - # jupyterlab - # pytest -tomlkit==0.11.8 - # via dephell -toolz==0.12.0 - # via - # dask - # distributed - # partd -tornado==6.3.2 - # via - # distributed - # ipykernel - # jupyter-client - # jupyter-server - # jupyterlab - # nbclassic - # notebook - # terminado -tqdm==4.65.0 - # via - # gdown - # habanero - # matminer - # py4dstem - # pymatgen -trainstation==1.0 - # via hiphive -traitlets==5.9.0 - # via - # comm - # ipykernel - # ipython - # ipywidgets - # jupyter-client - # jupyter-core - # jupyter-events - # jupyter-server - # matplotlib-inline - # nbclassic - # nbclient - # nbconvert - # nbformat - # notebook -trimesh==3.22.4 - # via ifermi -trio==0.22.2 - # via - # selenium - # trio-websocket -trio-websocket==0.10.3 - # via selenium -typing-extensions==4.7.1 - # via - # black - # dash - # emmet-core - # inflect - # ipython - # mp-api - # pydantic - # python-utils -uncertainties==3.1.7 - # via pymatgen -uri-template==1.3.0 - # via jsonschema -urllib3[secure,socks]==1.26.16 - # via - # distributed - # requests - # selenium -urllib3-secure-extra==0.1.0 - # via urllib3 -virtualenv==20.24.0 - # via pre-commit -vtk==9.2.6 - # via dash-vtk -waitress==2.1.2 - # via dash -wcwidth==0.2.6 - # via prompt-toolkit -webcolors==1.13 - # via - # crystal-toolkit (pyproject.toml) - # jsonschema -webencodings==0.5.1 - # via - # bleach - # tinycss2 -websocket-client==1.6.1 - # via jupyter-server -werkzeug==2.2.3 - # via - # dash - # flask -widgetsnbextension==4.0.8 - # via ipywidgets -wsproto==1.2.0 - # via trio-websocket -y-py==0.5.9 - # via - # jupyter-ydoc - # ypy-websocket -yarl==1.9.2 - # via aiohttp -yaspin==2.3.0 - # via dephell -ypy-websocket==0.8.2 - # via jupyter-server-ydoc -zict==3.0.0 - # via distributed -zipp==3.16.2 - # via - # importlib-metadata - # importlib-resources -zope-event==5.0 - # via gevent -zope-interface==6.0 - # via gevent - -# The following packages are considered to be unsafe in a requirements file: -# pip -# setuptools diff --git a/requirements/macos-latest_py3.9.txt b/requirements/macos-latest_py3.9.txt deleted file mode 100644 index 890a839b..00000000 --- a/requirements/macos-latest_py3.9.txt +++ /dev/null @@ -1,523 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --output-file=requirements/macos-latest_py3.9.txt pyproject.toml -# -aiofiles==22.1.0 - # via ypy-websocket -aiosqlite==0.19.0 - # via ypy-websocket -ansi2html==1.8.0 - # via dash -anyio==3.7.1 - # via jupyter-server -appnope==0.1.3 - # via - # ipykernel - # ipython -argon2-cffi==21.3.0 - # via - # jupyter-server - # nbclassic - # notebook -argon2-cffi-bindings==21.2.0 - # via argon2-cffi -arrow==1.2.3 - # via isoduration -asttokens==2.2.1 - # via stack-data -attrs==23.1.0 - # via - # jsonschema - # referencing -babel==2.12.1 - # via jupyterlab-server -backcall==0.2.0 - # via ipython -beautifulsoup4==4.12.2 - # via nbconvert -bleach==6.0.0 - # via nbconvert -cachelib==0.9.0 - # via flask-caching -certifi==2023.5.7 - # via requests -cffi==1.15.1 - # via argon2-cffi-bindings -charset-normalizer==3.2.0 - # via requests -click==8.1.5 - # via flask -comm==0.1.3 - # via ipykernel -contourpy==1.1.0 - # via matplotlib -crystaltoolkit-extension==0.6.0 - # via crystal-toolkit (pyproject.toml) -cycler==0.11.0 - # via matplotlib -dash==2.11.1 - # via crystal-toolkit (pyproject.toml) -dash-core-components==2.0.0 - # via dash -dash-html-components==2.0.0 - # via dash -dash-mp-components==0.4.36 - # via crystal-toolkit (pyproject.toml) -dash-table==5.0.0 - # via dash -debugpy==1.6.7 - # via ipykernel -decorator==5.1.1 - # via ipython -defusedxml==0.7.1 - # via nbconvert -emmet-core==0.60.1 - # via mp-api -exceptiongroup==1.1.2 - # via anyio -executing==1.2.0 - # via stack-data -fastjsonschema==2.17.1 - # via nbformat -flask==2.2.5 - # via - # dash - # flask-caching -flask-caching==2.0.2 - # via crystal-toolkit (pyproject.toml) -fonttools==4.41.0 - # via matplotlib -fqdn==1.5.1 - # via jsonschema -frozendict==2.3.8 - # via crystal-toolkit (pyproject.toml) -future==0.18.3 - # via uncertainties -idna==3.4 - # via - # anyio - # jsonschema - # requests -imageio==2.31.1 - # via scikit-image -importlib-metadata==6.8.0 - # via - # flask - # jupyter-client - # jupyter-ydoc - # jupyterlab-server - # nbconvert -importlib-resources==6.0.0 - # via matplotlib -ipykernel==6.24.0 - # via - # nbclassic - # notebook -ipython==8.14.0 - # via - # ipykernel - # jupyterlab -ipython-genutils==0.2.0 - # via - # nbclassic - # notebook -isoduration==20.11.0 - # via jsonschema -itsdangerous==2.1.2 - # via flask -jedi==0.18.2 - # via ipython -jinja2==3.1.2 - # via - # flask - # jupyter-server - # jupyterlab - # jupyterlab-server - # nbclassic - # nbconvert - # notebook -joblib==1.3.1 - # via - # pymatgen - # scikit-learn -json5==0.9.14 - # via jupyterlab-server -jsonpointer==2.4 - # via jsonschema -jsonschema[format-nongpl]==4.18.3 - # via - # jupyter-events - # jupyterlab-server - # nbformat -jsonschema-specifications==2023.6.1 - # via jsonschema -jupyter-client==8.3.0 - # via - # ipykernel - # jupyter-server - # nbclassic - # nbclient - # notebook -jupyter-core==5.3.1 - # via - # ipykernel - # jupyter-client - # jupyter-server - # jupyterlab - # nbclassic - # nbclient - # nbconvert - # nbformat - # notebook -jupyter-events==0.6.3 - # via - # jupyter-server - # jupyter-server-fileid -jupyter-server==2.7.0 - # via - # jupyter-server-fileid - # jupyterlab - # jupyterlab-server - # nbclassic - # notebook-shim -jupyter-server-fileid==0.9.0 - # via jupyter-server-ydoc -jupyter-server-terminals==0.4.4 - # via jupyter-server -jupyter-server-ydoc==0.8.0 - # via jupyterlab -jupyter-ydoc==0.2.4 - # via - # jupyter-server-ydoc - # jupyterlab -jupyterlab==3.6.5 - # via crystaltoolkit-extension -jupyterlab-pygments==0.2.2 - # via nbconvert -jupyterlab-server==2.23.0 - # via jupyterlab -kiwisolver==1.4.4 - # via matplotlib -latexcodec==2.0.1 - # via pybtex -lazy-loader==0.3 - # via scikit-image -markupsafe==2.1.3 - # via - # jinja2 - # nbconvert - # werkzeug -matplotlib==3.7.2 - # via pymatgen -matplotlib-inline==0.1.6 - # via - # ipykernel - # ipython -mistune==3.0.1 - # via nbconvert -monty==2023.5.8 - # via - # emmet-core - # mp-api - # pymatgen -mp-api==0.33.3 - # via pymatgen -mpmath==1.3.0 - # via sympy -msgpack==1.0.5 - # via mp-api -nbclassic==1.0.0 - # via - # jupyterlab - # notebook -nbclient==0.8.0 - # via nbconvert -nbconvert==7.7.1 - # via - # jupyter-server - # nbclassic - # notebook -nbformat==5.9.1 - # via - # jupyter-server - # nbclassic - # nbclient - # nbconvert - # notebook -nest-asyncio==1.5.6 - # via - # dash - # ipykernel - # nbclassic - # notebook -networkx==3.1 - # via - # pymatgen - # scikit-image -notebook==6.5.4 - # via jupyterlab -notebook-shim==0.2.3 - # via nbclassic -numpy==1.25.1 - # via - # contourpy - # imageio - # matplotlib - # pandas - # pymatgen - # pywavelets - # scikit-image - # scikit-learn - # scipy - # shapely - # spglib - # tifffile -overrides==7.3.1 - # via jupyter-server -packaging==23.1 - # via - # ipykernel - # jupyter-server - # jupyterlab - # jupyterlab-server - # matplotlib - # nbconvert - # plotly - # scikit-image -palettable==3.3.3 - # via pymatgen -pandas==2.0.3 - # via pymatgen -pandocfilters==1.5.0 - # via nbconvert -parso==0.8.3 - # via jedi -pexpect==4.8.0 - # via ipython -pickleshare==0.7.5 - # via ipython -pillow==10.0.0 - # via - # imageio - # matplotlib - # scikit-image -platformdirs==3.9.1 - # via jupyter-core -plotly==5.15.0 - # via - # dash - # pymatgen -prometheus-client==0.17.1 - # via - # jupyter-server - # nbclassic - # notebook -prompt-toolkit==3.0.39 - # via ipython -psutil==5.9.5 - # via ipykernel -ptyprocess==0.7.0 - # via - # pexpect - # terminado -pure-eval==0.2.2 - # via stack-data -pybtex==0.24.0 - # via - # emmet-core - # pymatgen -pycparser==2.21 - # via cffi -pydantic==1.10.11 - # via - # emmet-core - # pymatgen -pygments==2.15.1 - # via - # ipython - # nbconvert -pymatgen==2023.7.17 - # via - # crystal-toolkit (pyproject.toml) - # emmet-core - # mp-api -pyparsing==3.0.9 - # via matplotlib -python-dateutil==2.8.2 - # via - # arrow - # jupyter-client - # matplotlib - # pandas -python-json-logger==2.0.7 - # via jupyter-events -pytz==2023.3 - # via pandas -pywavelets==1.4.1 - # via scikit-image -pyyaml==6.0.1 - # via - # jupyter-events - # pybtex -pyzmq==25.1.0 - # via - # ipykernel - # jupyter-client - # jupyter-server - # nbclassic - # notebook -referencing==0.29.1 - # via - # jsonschema - # jsonschema-specifications -requests==2.31.0 - # via - # dash - # jupyterlab-server - # mp-api - # pymatgen -retrying==1.3.4 - # via dash -rfc3339-validator==0.1.4 - # via - # jsonschema - # jupyter-events -rfc3986-validator==0.1.1 - # via - # jsonschema - # jupyter-events -rpds-py==0.8.11 - # via - # jsonschema - # referencing -ruamel-yaml==0.17.32 - # via pymatgen -ruamel-yaml-clib==0.2.7 - # via ruamel-yaml -scikit-image==0.21.0 - # via crystal-toolkit (pyproject.toml) -scikit-learn==1.3.0 - # via crystal-toolkit (pyproject.toml) -scipy==1.11.1 - # via - # pymatgen - # scikit-image - # scikit-learn -send2trash==1.8.2 - # via - # jupyter-server - # nbclassic - # notebook -shapely==2.0.1 - # via crystal-toolkit (pyproject.toml) -six==1.16.0 - # via - # asttokens - # bleach - # latexcodec - # pybtex - # python-dateutil - # retrying - # rfc3339-validator -sniffio==1.3.0 - # via anyio -soupsieve==2.4.1 - # via beautifulsoup4 -spglib==2.0.2 - # via - # emmet-core - # pymatgen -stack-data==0.6.2 - # via ipython -sympy==1.12 - # via pymatgen -tabulate==0.9.0 - # via pymatgen -tenacity==8.2.2 - # via plotly -terminado==0.17.1 - # via - # jupyter-server - # jupyter-server-terminals - # nbclassic - # notebook -threadpoolctl==3.2.0 - # via scikit-learn -tifffile==2023.7.10 - # via scikit-image -tinycss2==1.2.1 - # via nbconvert -tomli==2.0.1 - # via jupyterlab -tornado==6.3.2 - # via - # ipykernel - # jupyter-client - # jupyter-server - # jupyterlab - # nbclassic - # notebook - # terminado -tqdm==4.65.0 - # via pymatgen -traitlets==5.9.0 - # via - # comm - # ipykernel - # ipython - # jupyter-client - # jupyter-core - # jupyter-events - # jupyter-server - # matplotlib-inline - # nbclassic - # nbclient - # nbconvert - # nbformat - # notebook -typing-extensions==4.7.1 - # via - # dash - # emmet-core - # ipython - # mp-api - # pydantic -tzdata==2023.3 - # via pandas -uncertainties==3.1.7 - # via pymatgen -uri-template==1.3.0 - # via jsonschema -urllib3==2.0.3 - # via requests -wcwidth==0.2.6 - # via prompt-toolkit -webcolors==1.13 - # via - # crystal-toolkit (pyproject.toml) - # jsonschema -webencodings==0.5.1 - # via - # bleach - # tinycss2 -websocket-client==1.6.1 - # via jupyter-server -werkzeug==2.2.3 - # via - # dash - # flask -y-py==0.5.9 - # via - # jupyter-ydoc - # ypy-websocket -ypy-websocket==0.8.2 - # via jupyter-server-ydoc -zipp==3.16.2 - # via - # importlib-metadata - # importlib-resources - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/requirements/ubuntu-latest_py3.10.txt b/requirements/ubuntu-latest_py3.10.txt index 08e33ee4..1b3292a9 100644 --- a/requirements/ubuntu-latest_py3.10.txt +++ b/requirements/ubuntu-latest_py3.10.txt @@ -6,103 +6,126 @@ # aiofiles==22.1.0 # via ypy-websocket -aiosqlite==0.19.0 +aioitertools==0.12.0 + # via maggma +aiosqlite==0.20.0 # via ypy-websocket -ansi2html==1.8.0 - # via dash -anyio==3.7.1 +annotated-types==0.7.0 + # via pydantic +anyio==4.4.0 # via jupyter-server -argon2-cffi==21.3.0 +argon2-cffi==23.1.0 # via # jupyter-server - # nbclassic # notebook argon2-cffi-bindings==21.2.0 # via argon2-cffi -arrow==1.2.3 +arrow==1.3.0 # via isoduration -asttokens==2.2.1 +asttokens==2.4.1 # via stack-data -attrs==23.1.0 +attrs==24.2.0 # via + # jsonlines # jsonschema # referencing -babel==2.12.1 +babel==2.16.0 # via jupyterlab-server -backcall==0.2.0 - # via ipython -beautifulsoup4==4.12.2 +bcrypt==4.2.0 + # via paramiko +beautifulsoup4==4.12.3 # via nbconvert -bleach==6.0.0 +bleach==6.1.0 # via nbconvert +blinker==1.8.2 + # via flask +boto3==1.35.10 + # via maggma +botocore==1.35.10 + # via + # boto3 + # s3transfer cachelib==0.9.0 # via flask-caching -certifi==2023.5.7 +certifi==2024.8.30 # via requests -cffi==1.15.1 - # via argon2-cffi-bindings -charset-normalizer==3.2.0 +cffi==1.17.0 + # via + # argon2-cffi-bindings + # cryptography + # pynacl +charset-normalizer==3.3.2 # via requests -click==8.1.5 +click==8.1.7 # via flask -comm==0.1.3 +comm==0.2.2 # via ipykernel -contourpy==1.1.0 +contourpy==1.3.0 # via matplotlib +cryptography==43.0.0 + # via paramiko crystaltoolkit-extension==0.6.0 - # via crystal-toolkit (pyproject.toml) -cycler==0.11.0 + # via crystal_toolkit (pyproject.toml) +cycler==0.12.1 # via matplotlib -dash==2.11.1 - # via crystal-toolkit (pyproject.toml) +dash==2.17.1 + # via crystal_toolkit (pyproject.toml) dash-core-components==2.0.0 # via dash dash-html-components==2.0.0 # via dash -dash-mp-components==0.4.36 - # via crystal-toolkit (pyproject.toml) +dash-mp-components==0.4.45 + # via crystal_toolkit (pyproject.toml) dash-table==5.0.0 # via dash -debugpy==1.6.7 +debugpy==1.8.5 # via ipykernel decorator==5.1.1 # via ipython defusedxml==0.7.1 # via nbconvert -emmet-core==0.60.1 +dnspython==2.6.1 + # via + # maggma + # pymongo +emmet-core==0.84.2rc6 # via mp-api -exceptiongroup==1.1.2 - # via anyio -executing==1.2.0 +entrypoints==0.4 + # via jupyter-client +exceptiongroup==1.2.2 + # via + # anyio + # ipython +executing==2.1.0 # via stack-data -fastjsonschema==2.17.1 +fastjsonschema==2.20.0 # via nbformat -flask==2.2.5 +flask==3.0.3 # via # dash # flask-caching -flask-caching==2.0.2 - # via crystal-toolkit (pyproject.toml) -fonttools==4.41.0 +flask-caching==2.3.0 + # via crystal_toolkit (pyproject.toml) +fonttools==4.53.1 # via matplotlib fqdn==1.5.1 # via jsonschema -frozendict==2.3.8 - # via crystal-toolkit (pyproject.toml) -future==0.18.3 - # via uncertainties -idna==3.4 +frozendict==2.4.4 + # via crystal_toolkit (pyproject.toml) +idna==3.8 # via # anyio # jsonschema # requests -imageio==2.31.1 +imageio==2.35.1 # via scikit-image -ipykernel==6.24.0 +importlib-metadata==8.4.0 + # via dash +ipykernel==6.29.5 # via # nbclassic # notebook -ipython==8.14.0 +ipython==8.27.0 # via # ipykernel # jupyterlab @@ -112,254 +135,286 @@ ipython-genutils==0.2.0 # notebook isoduration==20.11.0 # via jsonschema -itsdangerous==2.1.2 +itsdangerous==2.2.0 # via flask -jedi==0.18.2 +jedi==0.19.1 # via ipython -jinja2==3.1.2 +jinja2==3.1.4 # via # flask # jupyter-server # jupyterlab # jupyterlab-server - # nbclassic # nbconvert # notebook -joblib==1.3.1 +jmespath==1.0.1 + # via + # boto3 + # botocore +joblib==1.4.2 # via # pymatgen # scikit-learn -json5==0.9.14 +json5==0.9.25 # via jupyterlab-server -jsonpointer==2.4 +jsonlines==4.0.0 + # via maggma +jsonpointer==3.0.0 # via jsonschema -jsonschema[format-nongpl]==4.18.3 +jsonschema[format-nongpl]==4.23.0 # via # jupyter-events # jupyterlab-server + # maggma # nbformat -jsonschema-specifications==2023.6.1 +jsonschema-specifications==2023.12.1 # via jsonschema -jupyter-client==8.3.0 +jupyter-client==7.4.9 # via # ipykernel # jupyter-server - # nbclassic # nbclient # notebook -jupyter-core==5.3.1 +jupyter-core==5.7.2 # via # ipykernel # jupyter-client # jupyter-server # jupyterlab - # nbclassic # nbclient # nbconvert # nbformat # notebook -jupyter-events==0.6.3 +jupyter-events==0.10.0 # via # jupyter-server # jupyter-server-fileid -jupyter-server==2.7.0 +jupyter-server==2.14.2 # via # jupyter-server-fileid # jupyterlab # jupyterlab-server - # nbclassic # notebook-shim -jupyter-server-fileid==0.9.0 +jupyter-server-fileid==0.9.2 # via jupyter-server-ydoc -jupyter-server-terminals==0.4.4 +jupyter-server-terminals==0.5.3 # via jupyter-server jupyter-server-ydoc==0.8.0 # via jupyterlab -jupyter-ydoc==0.2.4 +jupyter-ydoc==0.2.5 # via # jupyter-server-ydoc # jupyterlab -jupyterlab==3.6.5 +jupyterlab==3.6.8 # via crystaltoolkit-extension -jupyterlab-pygments==0.2.2 +jupyterlab-pygments==0.3.0 # via nbconvert -jupyterlab-server==2.23.0 +jupyterlab-server==2.27.3 # via jupyterlab -kiwisolver==1.4.4 +kiwisolver==1.4.6 # via matplotlib -latexcodec==2.0.1 +latexcodec==3.0.0 # via pybtex -lazy-loader==0.3 +lazy-loader==0.4 # via scikit-image -markupsafe==2.1.3 +maggma==0.69.3 + # via mp-api +markupsafe==2.1.5 # via # jinja2 # nbconvert # werkzeug -matplotlib==3.7.2 +matplotlib==3.9.2 # via pymatgen -matplotlib-inline==0.1.6 +matplotlib-inline==0.1.7 # via # ipykernel # ipython -mistune==3.0.1 +mistune==3.0.2 # via nbconvert -monty==2023.5.8 +mongomock==4.1.2 + # via maggma +monty==2024.7.30 # via # emmet-core + # maggma # mp-api # pymatgen -mp-api==0.33.3 - # via pymatgen +mp-api==0.42.1 + # via crystal_toolkit (pyproject.toml) mpmath==1.3.0 # via sympy -msgpack==1.0.5 - # via mp-api -nbclassic==1.0.0 +msgpack==1.0.8 + # via + # maggma + # mp-api +nbclassic==1.1.0 # via # jupyterlab # notebook -nbclient==0.8.0 +nbclient==0.10.0 # via nbconvert -nbconvert==7.7.1 +nbconvert==7.16.4 # via # jupyter-server - # nbclassic # notebook -nbformat==5.9.1 +nbformat==5.10.4 # via # jupyter-server - # nbclassic # nbclient # nbconvert # notebook -nest-asyncio==1.5.6 +nest-asyncio==1.6.0 # via # dash # ipykernel + # jupyter-client # nbclassic # notebook -networkx==3.1 +networkx==3.3 # via # pymatgen # scikit-image -notebook==6.5.4 +notebook==6.5.7 # via jupyterlab -notebook-shim==0.2.3 +notebook-shim==0.2.4 # via nbclassic -numpy==1.25.1 +numpy==1.26.4 # via # contourpy + # emmet-core # imageio + # maggma # matplotlib # pandas # pymatgen - # pywavelets # scikit-image # scikit-learn # scipy # shapely # spglib # tifffile -overrides==7.3.1 +orjson==3.10.7 + # via maggma +overrides==7.7.0 # via jupyter-server -packaging==23.1 +packaging==24.1 # via # ipykernel # jupyter-server # jupyterlab # jupyterlab-server + # lazy-loader # matplotlib + # mongomock # nbconvert # plotly # scikit-image palettable==3.3.3 # via pymatgen -pandas==2.0.3 - # via pymatgen -pandocfilters==1.5.0 +pandas==2.2.2 + # via + # maggma + # pymatgen +pandocfilters==1.5.1 # via nbconvert -parso==0.8.3 +paramiko==3.4.1 + # via sshtunnel +parso==0.8.4 # via jedi -pexpect==4.8.0 +pexpect==4.9.0 # via ipython -pickleshare==0.7.5 - # via ipython -pillow==10.0.0 +pillow==10.4.0 # via # imageio # matplotlib # scikit-image -platformdirs==3.9.1 +platformdirs==4.2.2 # via jupyter-core -plotly==5.15.0 +plotly==5.24.0 # via # dash # pymatgen -prometheus-client==0.17.1 +prometheus-client==0.20.0 # via # jupyter-server - # nbclassic # notebook -prompt-toolkit==3.0.39 +prompt-toolkit==3.0.47 # via ipython -psutil==5.9.5 +psutil==6.0.0 # via ipykernel ptyprocess==0.7.0 # via # pexpect # terminado -pure-eval==0.2.2 +pure-eval==0.2.3 # via stack-data pybtex==0.24.0 # via # emmet-core # pymatgen -pycparser==2.21 +pycparser==2.22 # via cffi -pydantic==1.10.11 +pydantic==2.8.2 # via # emmet-core - # pymatgen -pygments==2.15.1 + # maggma + # pydantic-settings +pydantic-core==2.20.1 + # via pydantic +pydantic-settings==2.4.0 + # via + # crystal_toolkit (pyproject.toml) + # emmet-core + # maggma +pydash==8.0.3 + # via maggma +pygments==2.18.0 # via # ipython # nbconvert -pymatgen==2023.7.17 +pymatgen==2024.8.9 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # emmet-core # mp-api -pyparsing==3.0.9 +pymongo==4.8.0 + # via maggma +pynacl==1.5.0 + # via paramiko +pyparsing==3.1.4 # via matplotlib -python-dateutil==2.8.2 +python-dateutil==2.9.0.post0 # via # arrow + # botocore # jupyter-client + # maggma # matplotlib # pandas +python-dotenv==1.0.1 + # via pydantic-settings python-json-logger==2.0.7 # via jupyter-events -pytz==2023.3 +pytz==2024.1 # via pandas -pywavelets==1.4.1 - # via scikit-image -pyyaml==6.0.1 +pyyaml==6.0.2 # via # jupyter-events # pybtex -pyzmq==25.1.0 +pyzmq==26.2.0 # via # ipykernel # jupyter-client # jupyter-server - # nbclassic + # maggma # notebook -referencing==0.29.1 +referencing==0.35.1 # via # jsonschema # jsonschema-specifications -requests==2.31.0 + # jupyter-events +requests==2.32.3 # via # dash # jupyterlab-server @@ -375,81 +430,87 @@ rfc3986-validator==0.1.1 # via # jsonschema # jupyter-events -rpds-py==0.8.11 +rpds-py==0.20.0 # via # jsonschema # referencing -ruamel-yaml==0.17.32 - # via pymatgen -ruamel-yaml-clib==0.2.7 +ruamel-yaml==0.18.6 + # via + # maggma + # pymatgen +ruamel-yaml-clib==0.2.8 # via ruamel-yaml -scikit-image==0.21.0 - # via crystal-toolkit (pyproject.toml) -scikit-learn==1.3.0 - # via crystal-toolkit (pyproject.toml) -scipy==1.11.1 +s3transfer==0.10.2 + # via boto3 +scikit-image==0.24.0 + # via crystal_toolkit (pyproject.toml) +scikit-learn==1.5.1 + # via crystal_toolkit (pyproject.toml) +scipy==1.14.1 # via # pymatgen # scikit-image # scikit-learn -send2trash==1.8.2 +send2trash==1.8.3 # via # jupyter-server - # nbclassic # notebook -shapely==2.0.1 - # via crystal-toolkit (pyproject.toml) +sentinels==1.0.0 + # via mongomock +shapely==2.0.6 + # via crystal_toolkit (pyproject.toml) six==1.16.0 # via # asttokens # bleach - # latexcodec # pybtex # python-dateutil # retrying # rfc3339-validator -sniffio==1.3.0 +smart-open==7.0.4 + # via mp-api +sniffio==1.3.1 # via anyio -soupsieve==2.4.1 +soupsieve==2.6 # via beautifulsoup4 -spglib==2.0.2 - # via - # emmet-core - # pymatgen -stack-data==0.6.2 +spglib==2.5.0 + # via pymatgen +sshtunnel==0.4.0 + # via maggma +stack-data==0.6.3 # via ipython -sympy==1.12 +sympy==1.13.2 # via pymatgen tabulate==0.9.0 # via pymatgen -tenacity==8.2.2 +tenacity==9.0.0 # via plotly -terminado==0.17.1 +terminado==0.18.1 # via # jupyter-server # jupyter-server-terminals - # nbclassic # notebook -threadpoolctl==3.2.0 +threadpoolctl==3.5.0 # via scikit-learn -tifffile==2023.7.10 +tifffile==2024.8.30 # via scikit-image -tinycss2==1.2.1 +tinycss2==1.3.0 # via nbconvert tomli==2.0.1 # via jupyterlab -tornado==6.3.2 +tornado==6.4.1 # via # ipykernel # jupyter-client # jupyter-server # jupyterlab - # nbclassic # notebook # terminado -tqdm==4.65.0 - # via pymatgen -traitlets==5.9.0 +tqdm==4.66.5 + # via + # maggma + # pymatgen +traitlets==5.14.3 # via # comm # ipykernel @@ -459,47 +520,59 @@ traitlets==5.9.0 # jupyter-events # jupyter-server # matplotlib-inline - # nbclassic # nbclient # nbconvert # nbformat # notebook -typing-extensions==4.7.1 +types-python-dateutil==2.9.0.20240821 + # via arrow +typing-extensions==4.12.2 # via + # aiosqlite + # anyio # dash # emmet-core + # ipython # mp-api # pydantic -tzdata==2023.3 + # pydantic-core + # pydash +tzdata==2024.1 # via pandas -uncertainties==3.1.7 +uncertainties==3.2.2 # via pymatgen uri-template==1.3.0 # via jsonschema -urllib3==2.0.3 - # via requests -wcwidth==0.2.6 +urllib3==2.2.2 + # via + # botocore + # requests +wcwidth==0.2.13 # via prompt-toolkit -webcolors==1.13 +webcolors==24.8.0 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # jsonschema webencodings==0.5.1 # via # bleach # tinycss2 -websocket-client==1.6.1 +websocket-client==1.8.0 # via jupyter-server -werkzeug==2.2.3 +werkzeug==3.0.4 # via # dash # flask -y-py==0.5.9 +wrapt==1.16.0 + # via smart-open +y-py==0.6.2 # via # jupyter-ydoc # ypy-websocket -ypy-websocket==0.8.2 +ypy-websocket==0.8.4 # via jupyter-server-ydoc +zipp==3.20.1 + # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/requirements/ubuntu-latest_py3.10_extras.txt b/requirements/ubuntu-latest_py3.10_extras.txt index 6fdf99b5..0d9c42fb 100644 --- a/requirements/ubuntu-latest_py3.10_extras.txt +++ b/requirements/ubuntu-latest_py3.10_extras.txt @@ -6,41 +6,42 @@ # aiofiles==22.1.0 # via ypy-websocket -aiohttp==3.8.4 +aiohappyeyeballs==2.4.0 + # via aiohttp +aiohttp==3.10.5 # via dephell +aioitertools==0.12.0 + # via maggma aiosignal==1.3.1 # via aiohttp -aiosqlite==0.19.0 +aiosqlite==0.20.0 # via ypy-websocket -alabaster==0.7.13 +alabaster==0.7.16 # via sphinx -ansi2html==1.8.0 - # via dash -anyio==3.7.1 - # via - # httpcore - # jupyter-server -argon2-cffi==21.3.0 +annotated-types==0.7.0 + # via pydantic +anyio==4.4.0 + # via jupyter-server +argon2-cffi==23.1.0 # via # jupyter-server - # nbclassic # notebook argon2-cffi-bindings==21.2.0 # via argon2-cffi -arrow==1.2.3 +arrow==1.3.0 # via isoduration -ase==3.22.1 +ase==3.23.0 # via # boltztrap2 # dscribe # hiphive -asttokens==2.2.1 +asttokens==2.4.1 # via stack-data -async-timeout==4.0.2 +async-timeout==4.0.3 # via # aiohttp # redis -attrs==23.1.0 +attrs==24.2.0 # via # aiohttp # dephell @@ -52,106 +53,121 @@ attrs==23.1.0 # dephell-pythons # dephell-shells # dephell-venvs + # jsonlines # jsonschema # outcome # referencing # trio -babel==2.12.1 +babel==2.16.0 # via # jupyterlab-server # sphinx -backcall==0.2.0 - # via ipython -beautifulsoup4==4.12.2 +bcrypt==4.2.0 + # via paramiko +beautifulsoup4==4.12.3 # via # dash # gdown # nbconvert -black==23.7.0 - # via crystal-toolkit (pyproject.toml) -bleach==6.0.0 +black==24.8.0 + # via crystal_toolkit (pyproject.toml) +bleach==6.1.0 # via nbconvert -boltztrap2==22.12.1 +blinker==1.8.2 + # via flask +boltztrap2==24.7.2 # via ifermi +boto3==1.35.10 + # via maggma +botocore==1.35.10 + # via + # boto3 + # s3transfer cachelib==0.9.0 # via flask-caching -cerberus==1.3.4 +cerberus==1.3.5 # via dephell -certifi==2023.5.7 +certifi==2024.8.30 # via # dephell - # httpcore # netcdf4 # requests # urllib3 -cffi==1.15.1 +cffi==1.17.0 # via # argon2-cffi-bindings # cryptography -cfgv==3.3.1 + # pynacl +cfgv==3.4.0 # via pre-commit -cftime==1.6.2 +cftime==1.6.4 # via netcdf4 -charset-normalizer==3.2.0 - # via - # aiohttp - # requests -click==8.1.5 +charset-normalizer==3.3.2 + # via requests +click==8.1.7 # via # black # dask # distributed # flask # ifermi -cloudpickle==2.2.1 +cloudpickle==3.0.0 # via # dask # distributed -comm==0.1.3 +colorspacious==1.1.2 + # via py4dstem +comm==0.2.2 # via ipykernel commonmark==0.9.1 # via recommonmark -contourpy==1.1.0 +contourpy==1.3.0 # via matplotlib -cryptography==41.0.2 +cryptography==43.0.0 # via + # dash + # paramiko # pyopenssl # urllib3 crystaltoolkit-extension==0.6.0 - # via crystal-toolkit (pyproject.toml) -cycler==0.11.0 + # via crystal_toolkit (pyproject.toml) +cycler==0.12.1 # via matplotlib -dash[testing]==2.11.1 +cython==3.0.11 + # via boltztrap2 +dash[testing]==2.17.1 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # dash-extensions # dash-vtk dash-core-components==2.0.0 # via dash -dash-extensions==1.0.1 - # via crystal-toolkit (pyproject.toml) +dash-extensions==1.0.18 + # via crystal_toolkit (pyproject.toml) dash-html-components==2.0.0 # via dash -dash-mp-components==0.4.36 - # via crystal-toolkit (pyproject.toml) +dash-mp-components==0.4.45 + # via crystal_toolkit (pyproject.toml) dash-table==5.0.0 # via dash dash-testing-stub==0.0.2 # via dash dash-vtk==0.0.9 - # via crystal-toolkit (pyproject.toml) -dask==2023.7.0 + # via crystal_toolkit (pyproject.toml) +dask==2024.8.2 # via # distributed # py4dstem -debugpy==1.6.7 +dataclass-wizard==0.22.3 + # via dash-extensions +debugpy==1.8.5 # via ipykernel decorator==5.1.1 # via ipython defusedxml==0.7.1 # via nbconvert dephell==0.8.3 - # via crystal-toolkit (pyproject.toml) + # via crystal_toolkit (pyproject.toml) dephell-archive==0.1.7 # via dephell dephell-argparse==0.1.3 @@ -183,97 +199,99 @@ dephell-venvs==0.1.18 # via dephell dephell-versioning==0.1.2 # via dephell -dill==0.3.6 +dill==0.3.8 # via # multiprocess # py4dstem -distlib==0.3.7 +distlib==0.3.8 # via virtualenv -distributed==2023.7.0 +distributed==2024.8.2 # via py4dstem -dnspython==2.4.0 - # via pymongo -docutils==0.18.1 +dnspython==2.6.1 + # via + # maggma + # pymongo +docutils==0.20.1 # via # m2r # recommonmark # sphinx # sphinx-rtd-theme -dscribe==2.0.0 - # via crystal-toolkit (pyproject.toml) -editorconfig==0.12.3 +dscribe==2.1.1 + # via crystal_toolkit (pyproject.toml) +editorconfig==0.12.4 # via jsbeautifier -emdfile==0.0.8 +emdfile==0.0.15 # via py4dstem -emmet-core==0.60.1 +emmet-core==0.84.2rc6 # via mp-api entrypoints==0.4 - # via nbconvert -exceptiongroup==1.1.2 + # via + # jupyter-client + # nbconvert +exceptiongroup==1.2.2 # via # anyio + # ipython # pytest # trio # trio-websocket -executing==1.2.0 +executing==2.1.0 # via stack-data -fastjsonschema==2.17.1 +fastjsonschema==2.20.0 # via nbformat -filelock==3.12.2 +filelock==3.15.4 # via # gdown # virtualenv -flask==2.2.5 +flask==3.0.3 # via # dash # flask-caching -flask-caching==2.0.2 +flask-caching==2.3.0 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # dash-extensions -fonttools==4.41.0 +fonttools==4.53.1 # via matplotlib fqdn==1.5.1 # via jsonschema -frozendict==2.3.8 - # via crystal-toolkit (pyproject.toml) -frozenlist==1.4.0 +frozendict==2.4.4 + # via crystal_toolkit (pyproject.toml) +frozenlist==1.4.1 # via # aiohttp # aiosignal -fsspec==2023.6.0 +fsspec==2024.6.1 # via dask -future==0.18.3 - # via - # matminer - # uncertainties -gdown==4.7.1 +gdown==5.2.0 # via py4dstem -gevent==23.7.0 +gevent==24.2.1 # via gunicorn -greenlet==2.0.2 - # via gevent -gunicorn[gevent]==21.0.1 - # via crystal-toolkit (pyproject.toml) -h11==0.14.0 +greenlet==3.0.3 # via - # httpcore - # wsproto -h5py==3.9.0 + # gevent + # playwright +gunicorn[gevent]==23.0.0 + # via crystal_toolkit (pyproject.toml) +h11==0.14.0 + # via wsproto +h5py==3.11.0 # via # emdfile + # hdf5plugin # hiphive # ncempy # py4dstem -habanero==1.2.3 - # via crystal-toolkit (pyproject.toml) -hiphive==1.1 - # via crystal-toolkit (pyproject.toml) -httpcore==0.17.3 - # via dnspython -identify==2.5.24 +habanero==1.2.6 + # via crystal_toolkit (pyproject.toml) +hdf5plugin==5.0.0 + # via py4dstem +hiphive==1.3.1 + # via crystal_toolkit (pyproject.toml) +identify==2.6.0 # via pre-commit -idna==3.4 +idna==3.8 # via # anyio # jsonschema @@ -281,146 +299,148 @@ idna==3.4 # trio # urllib3 # yarl -ifermi==0.3.1 - # via crystal-toolkit (pyproject.toml) -imageio==2.31.1 +ifermi==0.3.5 + # via crystal_toolkit (pyproject.toml) +imageio==2.35.1 # via scikit-image imagesize==1.4.1 # via sphinx -importlib-metadata==6.8.0 - # via dask -inflect==7.0.0 +importlib-metadata==8.4.0 + # via + # dash + # dask +inflect==7.3.1 # via robocrys iniconfig==2.0.0 # via pytest -ipykernel==6.24.0 +ipykernel==6.29.5 # via - # ipywidgets # nbclassic # notebook -ipython==8.14.0 +ipython==8.27.0 # via # ipykernel - # ipywidgets # jupyterlab ipython-genutils==0.2.0 # via # nbclassic # notebook -ipywidgets==8.0.7 - # via py4dstem isoduration==20.11.0 # via jsonschema -itsdangerous==2.1.2 +itsdangerous==2.2.0 # via flask -jedi==0.18.2 +jedi==0.19.1 # via ipython -jinja2==3.1.2 +jinja2==3.1.4 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # dephell # distributed # flask # jupyter-server # jupyterlab # jupyterlab-server - # nbclassic # nbconvert # notebook # sphinx -joblib==1.3.1 +jmespath==1.0.1 + # via + # boto3 + # botocore +joblib==1.4.2 # via # dscribe # pymatgen # scikit-learn -jsbeautifier==1.14.8 + # scikit-optimize +jsbeautifier==1.15.1 # via dash-extensions -json5==0.9.14 +json5==0.9.25 # via jupyterlab-server -jsonpointer==2.4 +jsonlines==4.0.0 + # via maggma +jsonpointer==3.0.0 # via jsonschema -jsonschema[format-nongpl]==4.18.3 +jsonschema[format-nongpl]==4.23.0 # via # jupyter-events # jupyterlab-server + # maggma # nbformat -jsonschema-specifications==2023.6.1 +jsonschema-specifications==2023.12.1 # via jsonschema -jupyter-client==8.3.0 +jupyter-client==7.4.9 # via # ipykernel # jupyter-server - # nbclassic # nbclient # notebook -jupyter-core==5.3.1 +jupyter-core==5.7.2 # via # ipykernel # jupyter-client # jupyter-server # jupyterlab - # nbclassic # nbclient # nbconvert # nbformat # notebook -jupyter-events==0.6.3 +jupyter-events==0.10.0 # via # jupyter-server # jupyter-server-fileid -jupyter-server==2.7.0 +jupyter-server==2.14.2 # via # jupyter-server-fileid # jupyterlab # jupyterlab-server - # nbclassic # notebook-shim -jupyter-server-fileid==0.9.0 +jupyter-server-fileid==0.9.2 # via jupyter-server-ydoc -jupyter-server-terminals==0.4.4 +jupyter-server-terminals==0.5.3 # via jupyter-server jupyter-server-ydoc==0.8.0 # via jupyterlab -jupyter-ydoc==0.2.4 +jupyter-ydoc==0.2.5 # via # jupyter-server-ydoc # jupyterlab -jupyterlab==3.6.5 +jupyterlab==3.6.8 # via crystaltoolkit-extension -jupyterlab-pygments==0.2.2 +jupyterlab-pygments==0.3.0 # via nbconvert -jupyterlab-server==2.23.0 +jupyterlab-server==2.27.3 # via jupyterlab -jupyterlab-widgets==3.0.8 - # via ipywidgets kaleido==0.2.1 - # via crystal-toolkit (pyproject.toml) -kiwisolver==1.4.4 + # via crystal_toolkit (pyproject.toml) +kiwisolver==1.4.6 # via matplotlib -latexcodec==2.0.1 +latexcodec==3.0.0 # via pybtex -lazy-loader==0.3 +lazy-loader==0.4 # via scikit-image -llvmlite==0.40.1 +llvmlite==0.43.0 # via numba locket==1.0.0 # via # distributed # partd -lxml==4.9.3 +lxml==5.3.0 # via # dash # nbconvert m2r==0.3.1 # via dephell -markupsafe==2.1.3 +maggma==0.69.3 + # via mp-api +markupsafe==2.1.5 # via # jinja2 # nbconvert # werkzeug -matminer==0.9.0 +matminer==0.9.2 # via robocrys -matplotlib==3.7.2 +matplotlib==3.9.2 # via # ase # boltztrap2 @@ -429,7 +449,7 @@ matplotlib==3.7.2 # py4dstem # pymatgen # vtk -matplotlib-inline==0.1.6 +matplotlib-inline==0.1.7 # via # ipykernel # ipython @@ -439,88 +459,100 @@ mistune==0.8.4 # via # m2r # nbconvert -monty==2023.5.8 +mongomock==4.1.2 + # via maggma +monty==2024.7.30 # via # emmet-core # ifermi + # maggma # matminer # mp-api # pymatgen # robocrys -more-itertools==9.1.0 - # via dash-extensions -mp-api==0.33.3 - # via pymatgen +more-itertools==10.4.0 + # via + # dash-extensions + # inflect +mp-api==0.42.1 + # via + # crystal_toolkit (pyproject.toml) + # robocrys +mpire==2.10.2 + # via py4dstem mpmath==1.3.0 # via sympy -msgpack==1.0.5 +msgpack==1.0.8 # via # distributed + # maggma # mp-api -multidict==6.0.4 +multidict==6.0.5 # via # aiohttp # yarl -multiprocess==0.70.14 +multiprocess==0.70.16 # via dash mypy-extensions==1.0.0 # via black -nbclassic==1.0.0 +nbclassic==1.1.0 # via # jupyterlab # notebook -nbclient==0.8.0 +nbclient==0.10.0 # via nbconvert nbconvert==6.5.4 # via # jupyter-server - # nbclassic # notebook -nbformat==5.9.1 +nbformat==5.10.4 # via # jupyter-server - # nbclassic # nbclient # nbconvert # notebook -ncempy==1.10.0 +ncempy==1.11.3 # via py4dstem -nest-asyncio==1.5.6 +nest-asyncio==1.6.0 # via # dash # ipykernel + # jupyter-client # nbclassic # notebook -netcdf4==1.6.4 +netcdf4==1.7.1.post2 # via boltztrap2 -networkx==3.1 +networkx==3.3 # via # ifermi # pymatgen # robocrys # scikit-image -nodeenv==1.8.0 +nodeenv==1.9.1 # via pre-commit -notebook==6.5.4 +notebook==6.5.7 # via jupyterlab -notebook-shim==0.2.3 +notebook-shim==0.2.4 # via nbclassic -numba==0.57.1 +numba==0.60.0 # via # hiphive # sparse -numpy==1.21.6 +numpy==1.26.4 # via # ase # boltztrap2 # cftime + # colorspacious # contourpy # dscribe # emdfile + # emmet-core # h5py # hiphive # ifermi # imageio + # maggma # matminer # matplotlib # meshcut @@ -531,11 +563,12 @@ numpy==1.21.6 # pandas # py4dstem # pyfftw + # pylops # pymatgen - # pywavelets # robocrys # scikit-image # scikit-learn + # scikit-optimize # scipy # shapely # sparse @@ -543,13 +576,15 @@ numpy==1.21.6 # tifffile # trainstation # trimesh -numpy-stl==3.0.1 +numpy-stl==3.1.2 # via meshcut -outcome==1.2.0 +orjson==3.10.7 + # via maggma +outcome==1.3.0.post0 # via trio -overrides==7.3.1 +overrides==7.7.0 # via jupyter-server -packaging==23.1 +packaging==24.1 # via # black # dask @@ -564,62 +599,69 @@ packaging==23.1 # jupyter-server # jupyterlab # jupyterlab-server + # lazy-loader # matplotlib + # mongomock # nbconvert # plotly # pytest # scikit-image + # scikit-optimize # sphinx palettable==3.3.3 # via pymatgen -pandas==1.5.3 +pandas==2.2.2 # via # hiphive + # maggma # matminer # pymatgen -pandocfilters==1.5.0 +pandocfilters==1.5.1 # via nbconvert -parso==0.8.3 +paramiko==3.4.1 + # via sshtunnel +parso==0.8.4 # via jedi -partd==1.4.0 +partd==1.4.2 # via dask -pathspec==0.11.1 +pathspec==0.12.1 # via black percy==2.0.2 # via dash -pexpect==4.8.0 +pexpect==4.9.0 # via # dephell-shells # ipython -pickleshare==0.7.5 - # via ipython -pillow==10.0.0 +pillow==10.4.0 # via # imageio # matplotlib # scikit-image -platformdirs==3.9.1 +platformdirs==4.2.2 # via # black # jupyter-core # virtualenv -plotly==5.15.0 +playwright==1.46.0 + # via + # crystal_toolkit (pyproject.toml) + # pytest-playwright +plotly==5.24.0 # via # dash # ifermi # pymatgen -pluggy==1.2.0 +pluggy==1.5.0 # via pytest -pre-commit==3.3.3 - # via crystal-toolkit (pyproject.toml) -prometheus-client==0.17.1 +pre-commit==3.8.0 + # via crystal_toolkit (pyproject.toml) +prometheus-client==0.20.0 # via # jupyter-server - # nbclassic # notebook -prompt-toolkit==3.0.39 +prompt-toolkit==3.0.47 # via ipython -psutil==5.9.5 +psutil==6.0.0 # via # dash # distributed @@ -631,90 +673,123 @@ ptyprocess==0.7.0 # terminado pubchempy==1.0.4 # via robocrys -pure-eval==0.2.2 +pure-eval==0.2.3 # via stack-data -py4dstem==0.14.2 - # via crystal-toolkit (pyproject.toml) -pybind11==2.11.1 - # via dscribe +py4dstem==0.14.16 + # via crystal_toolkit (pyproject.toml) +pyaml==24.7.0 + # via scikit-optimize pybtex==0.24.0 # via # emmet-core # pymatgen # robocrys -pycparser==2.21 +pycparser==2.22 # via cffi -pydantic==1.10.11 +pydantic==2.8.2 # via + # dash-extensions # emmet-core - # inflect - # pymatgen -pyfftw==0.13.1 + # maggma + # pydantic-settings +pydantic-core==2.20.1 + # via pydantic +pydantic-settings==2.4.0 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) + # emmet-core + # maggma +pydash==8.0.3 + # via maggma +pyee==11.1.0 + # via playwright +pyfftw==0.14.0 + # via + # crystal_toolkit (pyproject.toml) # ifermi -pygments==2.15.1 +pygments==2.18.0 # via # ipython + # mpire # nbconvert # sphinx -pymatgen==2023.7.17 +pylops==2.3.1 + # via py4dstem +pymatgen==2024.8.9 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # emmet-core # ifermi # matminer # mp-api # robocrys -pymongo==4.4.1 - # via matminer -pyopenssl==23.2.0 +pymongo==4.8.0 + # via + # maggma + # matminer +pynacl==1.5.0 + # via paramiko +pyopenssl==24.2.1 # via urllib3 -pyparsing==3.0.9 +pyparsing==3.1.4 # via matplotlib pysocks==1.7.1 # via # requests # urllib3 -pytest==7.4.0 - # via dash -python-dateutil==2.8.2 +pytest==8.3.2 + # via + # crystal_toolkit (pyproject.toml) + # dash + # pytest-base-url + # pytest-playwright +pytest-base-url==2.1.0 + # via pytest-playwright +pytest-playwright==0.5.1 + # via crystal_toolkit (pyproject.toml) +python-dateutil==2.9.0.post0 # via # arrow + # botocore # jupyter-client + # maggma # matplotlib # pandas +python-dotenv==1.0.1 + # via pydantic-settings python-json-logger==2.0.7 # via jupyter-events -python-utils==3.7.0 +python-slugify==8.0.4 + # via pytest-playwright +python-utils==3.8.2 # via numpy-stl -pytz==2023.3 +pytz==2024.1 # via pandas -pywavelets==1.4.1 - # via scikit-image -pyyaml==6.0.1 +pyyaml==6.0.2 # via # dask # distributed # jupyter-events # pre-commit + # pyaml # pybtex -pyzmq==25.1.0 +pyzmq==26.2.0 # via # ipykernel # jupyter-client # jupyter-server - # nbclassic + # maggma # notebook recommonmark==0.7.1 - # via crystal-toolkit (pyproject.toml) -redis==4.6.0 - # via crystal-toolkit (pyproject.toml) -referencing==0.29.1 + # via crystal_toolkit (pyproject.toml) +redis==5.0.8 + # via crystal_toolkit (pyproject.toml) +referencing==0.35.1 # via # jsonschema # jsonschema-specifications -requests[security,socks]==2.31.0 + # jupyter-events +requests[security,socks]==2.32.3 # via # dash # dephell @@ -728,6 +803,7 @@ requests[security,socks]==2.31.0 # mp-api # percy # pymatgen + # pytest-base-url # sphinx retrying==1.3.4 # via dash @@ -739,76 +815,84 @@ rfc3986-validator==0.1.1 # via # jsonschema # jupyter-events -robocrys==0.2.8 - # via crystal-toolkit (pyproject.toml) -rpds-py==0.8.11 +robocrys==0.2.9 + # via crystal_toolkit (pyproject.toml) +rpds-py==0.20.0 # via # jsonschema # referencing -ruamel-yaml==0.17.32 +ruamel-yaml==0.18.6 # via # dephell + # maggma # pymatgen # robocrys -ruamel-yaml-clib==0.2.7 +ruamel-yaml-clib==0.2.8 # via ruamel-yaml -scikit-image==0.21.0 +ruff==0.4.10 + # via dash-extensions +s3transfer==0.10.2 + # via boto3 +scikit-image==0.24.0 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # ifermi # py4dstem -scikit-learn==1.3.0 +scikit-learn==1.4.2 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # dscribe # hiphive # matminer # py4dstem + # scikit-optimize # trainstation -scipy==1.11.1 +scikit-optimize==0.10.2 + # via py4dstem +scipy==1.14.1 # via # ase # boltztrap2 # dscribe - # emdfile # hiphive # ifermi # meshcut # ncempy # py4dstem + # pylops # pymatgen # robocrys # scikit-image # scikit-learn + # scikit-optimize # sparse # trainstation selenium==4.2.0 # via dash -send2trash==1.8.2 +send2trash==1.8.3 # via # jupyter-server - # nbclassic # notebook -shapely==2.0.1 - # via crystal-toolkit (pyproject.toml) -shellingham==1.5.0.post1 +sentinels==1.0.0 + # via mongomock +shapely==2.0.6 + # via crystal_toolkit (pyproject.toml) +shellingham==1.5.4 # via dephell-shells six==1.16.0 # via # asttokens # bleach - # gdown # jsbeautifier - # latexcodec # pybtex # python-dateutil # retrying # rfc3339-validator -sniffio==1.3.0 +smart-open==7.0.4 + # via mp-api +sniffio==1.3.1 # via # anyio - # dnspython - # httpcore # trio snowballstemmer==2.2.0 # via sphinx @@ -816,42 +900,43 @@ sortedcontainers==2.4.0 # via # distributed # trio -soupsieve==2.4.1 +soupsieve==2.6 # via beautifulsoup4 -sparse==0.14.0 +sparse==0.15.4 # via dscribe -spglib==2.0.2 +spglib==2.5.0 # via # boltztrap2 - # emmet-core # hiphive # ifermi # pymatgen # robocrys -sphinx==6.2.1 +sphinx==7.4.7 # via # recommonmark # sphinx-rtd-theme # sphinxcontrib-jquery -sphinx-rtd-theme==1.2.2 - # via crystal-toolkit (pyproject.toml) -sphinxcontrib-applehelp==1.0.4 +sphinx-rtd-theme==2.0.0 + # via crystal_toolkit (pyproject.toml) +sphinxcontrib-applehelp==2.0.0 # via sphinx -sphinxcontrib-devhelp==1.0.2 +sphinxcontrib-devhelp==2.0.0 # via sphinx -sphinxcontrib-htmlhelp==2.0.1 +sphinxcontrib-htmlhelp==2.1.0 # via sphinx sphinxcontrib-jquery==4.1 # via sphinx-rtd-theme sphinxcontrib-jsmath==1.0.1 # via sphinx -sphinxcontrib-qthelp==1.0.3 +sphinxcontrib-qthelp==2.0.0 # via sphinx -sphinxcontrib-serializinghtml==1.1.5 +sphinxcontrib-serializinghtml==2.0.0 # via sphinx -stack-data==0.6.2 +sshtunnel==0.4.0 + # via maggma +stack-data==0.6.3 # via ipython -sympy==1.12 +sympy==1.13.2 # via # hiphive # matminer @@ -860,142 +945,159 @@ tabulate==0.9.0 # via # ifermi # pymatgen -tblib==2.0.0 +tblib==3.0.0 # via distributed -tenacity==8.2.2 +tenacity==9.0.0 # via plotly termcolor==2.3.0 # via yaspin -terminado==0.17.1 +terminado==0.18.1 # via # jupyter-server # jupyter-server-terminals - # nbclassic # notebook -threadpoolctl==3.2.0 - # via scikit-learn -tifffile==2023.7.10 +text-unidecode==1.3 + # via python-slugify +threadpoolctl==3.5.0 + # via + # py4dstem + # scikit-learn +tifffile==2024.8.30 # via scikit-image -tinycss2==1.2.1 +tinycss2==1.3.0 # via nbconvert tomli==2.0.1 # via # black # jupyterlab # pytest -tomlkit==0.11.8 + # sphinx +tomlkit==0.13.2 # via dephell -toolz==0.12.0 +toolz==0.12.1 # via # dask # distributed # partd -tornado==6.3.2 +tornado==6.4.1 # via # distributed # ipykernel # jupyter-client # jupyter-server # jupyterlab - # nbclassic # notebook # terminado -tqdm==4.65.0 +tqdm==4.66.5 # via # emdfile # gdown # habanero + # maggma # matminer + # mpire # py4dstem # pymatgen -trainstation==1.0 +trainstation==1.1 # via hiphive -traitlets==5.9.0 +traitlets==5.14.3 # via # comm # ipykernel # ipython - # ipywidgets # jupyter-client # jupyter-core # jupyter-events # jupyter-server # matplotlib-inline - # nbclassic # nbclient # nbconvert # nbformat # notebook -trimesh==3.22.4 +trimesh==4.4.8 # via ifermi -trio==0.22.2 +trio==0.26.2 # via # selenium # trio-websocket -trio-websocket==0.10.3 +trio-websocket==0.11.1 # via selenium -typing-extensions==4.7.1 +typeguard==4.3.0 + # via inflect +types-python-dateutil==2.9.0.20240821 + # via arrow +typing-extensions==4.12.2 # via + # aiosqlite + # anyio + # black # dash # emmet-core - # inflect + # ipython # mp-api # pydantic + # pydantic-core + # pydash + # pyee # python-utils -uncertainties==3.1.7 + # typeguard +tzdata==2024.1 + # via pandas +uncertainties==3.2.2 # via pymatgen uri-template==1.3.0 # via jsonschema -urllib3[secure,socks]==1.26.16 +urllib3[secure,socks]==1.26.20 # via + # botocore # distributed # requests # selenium urllib3-secure-extra==0.1.0 # via urllib3 -virtualenv==20.24.0 +virtualenv==20.26.3 # via pre-commit -vtk==9.2.6 +vtk==9.3.1 # via dash-vtk -waitress==2.1.2 +waitress==3.0.0 # via dash -wcwidth==0.2.6 +wcwidth==0.2.13 # via prompt-toolkit -webcolors==1.13 +webcolors==24.8.0 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # jsonschema webencodings==0.5.1 # via # bleach # tinycss2 -websocket-client==1.6.1 +websocket-client==1.8.0 # via jupyter-server -werkzeug==2.2.3 +werkzeug==3.0.4 # via # dash # flask -widgetsnbextension==4.0.8 - # via ipywidgets +wrapt==1.16.0 + # via smart-open wsproto==1.2.0 # via trio-websocket -y-py==0.5.9 +y-py==0.6.2 # via # jupyter-ydoc # ypy-websocket -yarl==1.9.2 +yarl==1.9.7 # via aiohttp -yaspin==2.3.0 +yaspin==3.0.2 # via dephell -ypy-websocket==0.8.2 +ypy-websocket==0.8.4 # via jupyter-server-ydoc zict==3.0.0 # via distributed -zipp==3.16.2 +zipp==3.20.1 # via importlib-metadata zope-event==5.0 # via gevent -zope-interface==6.0 +zope-interface==7.0.3 # via gevent # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/macos-latest_py3.8.txt b/requirements/ubuntu-latest_py3.11.txt similarity index 57% rename from requirements/macos-latest_py3.8.txt rename to requirements/ubuntu-latest_py3.11.txt index dbe77a4c..dcb0e801 100644 --- a/requirements/macos-latest_py3.8.txt +++ b/requirements/ubuntu-latest_py3.11.txt @@ -1,124 +1,127 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # -# pip-compile --output-file=requirements/macos-latest_py3.8.txt pyproject.toml +# pip-compile --output-file=requirements/ubuntu-latest_py3.11.txt pyproject.toml # aiofiles==22.1.0 # via ypy-websocket -aiosqlite==0.19.0 +aioitertools==0.12.0 + # via maggma +aiosqlite==0.20.0 # via ypy-websocket -ansi2html==1.8.0 - # via dash -anyio==3.7.1 +annotated-types==0.7.0 + # via pydantic +anyio==4.4.0 # via jupyter-server -appnope==0.1.3 - # via - # ipykernel - # ipython -argon2-cffi==21.3.0 +argon2-cffi==23.1.0 # via # jupyter-server - # nbclassic # notebook argon2-cffi-bindings==21.2.0 # via argon2-cffi -arrow==1.2.3 +arrow==1.3.0 # via isoduration -asttokens==2.2.1 +asttokens==2.4.1 # via stack-data -attrs==23.1.0 +attrs==24.2.0 # via + # jsonlines # jsonschema # referencing -babel==2.12.1 +babel==2.16.0 # via jupyterlab-server -backcall==0.2.0 - # via ipython -beautifulsoup4==4.12.2 +bcrypt==4.2.0 + # via paramiko +beautifulsoup4==4.12.3 # via nbconvert -bleach==6.0.0 +bleach==6.1.0 # via nbconvert +blinker==1.8.2 + # via flask +boto3==1.35.10 + # via maggma +botocore==1.35.10 + # via + # boto3 + # s3transfer cachelib==0.9.0 # via flask-caching -certifi==2023.5.7 +certifi==2024.8.30 # via requests -cffi==1.15.1 - # via argon2-cffi-bindings -charset-normalizer==3.2.0 +cffi==1.17.0 + # via + # argon2-cffi-bindings + # cryptography + # pynacl +charset-normalizer==3.3.2 # via requests -click==8.1.5 +click==8.1.7 # via flask -comm==0.1.3 +comm==0.2.2 # via ipykernel -contourpy==1.1.0 +contourpy==1.3.0 # via matplotlib +cryptography==43.0.0 + # via paramiko crystaltoolkit-extension==0.6.0 - # via crystal-toolkit (pyproject.toml) -cycler==0.11.0 + # via crystal_toolkit (pyproject.toml) +cycler==0.12.1 # via matplotlib -dash==2.11.1 - # via crystal-toolkit (pyproject.toml) +dash==2.17.1 + # via crystal_toolkit (pyproject.toml) dash-core-components==2.0.0 # via dash dash-html-components==2.0.0 # via dash -dash-mp-components==0.4.36 - # via crystal-toolkit (pyproject.toml) +dash-mp-components==0.4.45 + # via crystal_toolkit (pyproject.toml) dash-table==5.0.0 # via dash -debugpy==1.6.7 +debugpy==1.8.5 # via ipykernel decorator==5.1.1 # via ipython defusedxml==0.7.1 # via nbconvert -emmet-core==0.60.1 +dnspython==2.6.1 + # via + # maggma + # pymongo +emmet-core==0.84.2rc6 # via mp-api -exceptiongroup==1.1.2 - # via anyio -executing==1.2.0 +entrypoints==0.4 + # via jupyter-client +executing==2.1.0 # via stack-data -fastjsonschema==2.17.1 +fastjsonschema==2.20.0 # via nbformat -flask==2.2.5 +flask==3.0.3 # via # dash # flask-caching -flask-caching==2.0.2 - # via crystal-toolkit (pyproject.toml) -fonttools==4.41.0 +flask-caching==2.3.0 + # via crystal_toolkit (pyproject.toml) +fonttools==4.53.1 # via matplotlib fqdn==1.5.1 # via jsonschema -frozendict==2.3.8 - # via crystal-toolkit (pyproject.toml) -future==0.18.3 - # via uncertainties -idna==3.4 +frozendict==2.4.4 + # via crystal_toolkit (pyproject.toml) +idna==3.8 # via # anyio # jsonschema # requests -imageio==2.31.1 +imageio==2.35.1 # via scikit-image -importlib-metadata==6.8.0 - # via - # flask - # jupyter-client - # jupyter-ydoc - # jupyterlab-server - # nbconvert -importlib-resources==6.0.0 - # via - # jsonschema - # jsonschema-specifications - # matplotlib -ipykernel==6.24.0 +importlib-metadata==8.4.0 + # via dash +ipykernel==6.29.5 # via # nbclassic # notebook -ipython==8.12.2 +ipython==8.27.0 # via # ipykernel # jupyterlab @@ -128,258 +131,286 @@ ipython-genutils==0.2.0 # notebook isoduration==20.11.0 # via jsonschema -itsdangerous==2.1.2 +itsdangerous==2.2.0 # via flask -jedi==0.18.2 +jedi==0.19.1 # via ipython -jinja2==3.1.2 +jinja2==3.1.4 # via # flask # jupyter-server # jupyterlab # jupyterlab-server - # nbclassic # nbconvert # notebook -joblib==1.3.1 +jmespath==1.0.1 + # via + # boto3 + # botocore +joblib==1.4.2 # via # pymatgen # scikit-learn -json5==0.9.14 +json5==0.9.25 # via jupyterlab-server -jsonpointer==2.4 +jsonlines==4.0.0 + # via maggma +jsonpointer==3.0.0 # via jsonschema -jsonschema[format-nongpl]==4.18.3 +jsonschema[format-nongpl]==4.23.0 # via # jupyter-events # jupyterlab-server + # maggma # nbformat -jsonschema-specifications==2023.6.1 +jsonschema-specifications==2023.12.1 # via jsonschema -jupyter-client==8.3.0 +jupyter-client==7.4.9 # via # ipykernel # jupyter-server - # nbclassic # nbclient # notebook -jupyter-core==5.3.1 +jupyter-core==5.7.2 # via # ipykernel # jupyter-client # jupyter-server # jupyterlab - # nbclassic # nbclient # nbconvert # nbformat # notebook -jupyter-events==0.6.3 +jupyter-events==0.10.0 # via # jupyter-server # jupyter-server-fileid -jupyter-server==2.7.0 +jupyter-server==2.14.2 # via # jupyter-server-fileid # jupyterlab # jupyterlab-server - # nbclassic # notebook-shim -jupyter-server-fileid==0.9.0 +jupyter-server-fileid==0.9.2 # via jupyter-server-ydoc -jupyter-server-terminals==0.4.4 +jupyter-server-terminals==0.5.3 # via jupyter-server jupyter-server-ydoc==0.8.0 # via jupyterlab -jupyter-ydoc==0.2.4 +jupyter-ydoc==0.2.5 # via # jupyter-server-ydoc # jupyterlab -jupyterlab==3.6.5 +jupyterlab==3.6.8 # via crystaltoolkit-extension -jupyterlab-pygments==0.2.2 +jupyterlab-pygments==0.3.0 # via nbconvert -jupyterlab-server==2.23.0 +jupyterlab-server==2.27.3 # via jupyterlab -kiwisolver==1.4.4 +kiwisolver==1.4.6 # via matplotlib -latexcodec==2.0.1 +latexcodec==3.0.0 # via pybtex -lazy-loader==0.3 +lazy-loader==0.4 # via scikit-image -markupsafe==2.1.3 +maggma==0.69.3 + # via mp-api +markupsafe==2.1.5 # via # jinja2 # nbconvert # werkzeug -matplotlib==3.7.2 +matplotlib==3.9.2 # via pymatgen -matplotlib-inline==0.1.6 +matplotlib-inline==0.1.7 # via # ipykernel # ipython -mistune==3.0.1 +mistune==3.0.2 # via nbconvert -monty==2023.5.8 +mongomock==4.1.2 + # via maggma +monty==2024.7.30 # via # emmet-core + # maggma # mp-api # pymatgen -mp-api==0.33.3 - # via pymatgen +mp-api==0.42.1 + # via crystal_toolkit (pyproject.toml) mpmath==1.3.0 # via sympy -msgpack==1.0.5 - # via mp-api -nbclassic==1.0.0 +msgpack==1.0.8 + # via + # maggma + # mp-api +nbclassic==1.1.0 # via # jupyterlab # notebook -nbclient==0.8.0 +nbclient==0.10.0 # via nbconvert -nbconvert==7.7.1 +nbconvert==7.16.4 # via # jupyter-server - # nbclassic # notebook -nbformat==5.9.1 +nbformat==5.10.4 # via # jupyter-server - # nbclassic # nbclient # nbconvert # notebook -nest-asyncio==1.5.6 +nest-asyncio==1.6.0 # via # dash # ipykernel + # jupyter-client # nbclassic # notebook -networkx==3.1 +networkx==3.3 # via # pymatgen # scikit-image -notebook==6.5.4 +notebook==6.5.7 # via jupyterlab -notebook-shim==0.2.3 +notebook-shim==0.2.4 # via nbclassic -numpy==1.24.4 +numpy==1.26.4 # via # contourpy + # emmet-core # imageio + # maggma # matplotlib # pandas # pymatgen - # pywavelets # scikit-image # scikit-learn # scipy # shapely # spglib # tifffile -overrides==7.3.1 +orjson==3.10.7 + # via maggma +overrides==7.7.0 # via jupyter-server -packaging==23.1 +packaging==24.1 # via # ipykernel # jupyter-server # jupyterlab # jupyterlab-server + # lazy-loader # matplotlib + # mongomock # nbconvert # plotly # scikit-image palettable==3.3.3 # via pymatgen -pandas==2.0.3 - # via pymatgen -pandocfilters==1.5.0 +pandas==2.2.2 + # via + # maggma + # pymatgen +pandocfilters==1.5.1 # via nbconvert -parso==0.8.3 +paramiko==3.4.1 + # via sshtunnel +parso==0.8.4 # via jedi -pexpect==4.8.0 +pexpect==4.9.0 # via ipython -pickleshare==0.7.5 - # via ipython -pillow==10.0.0 +pillow==10.4.0 # via # imageio # matplotlib # scikit-image -pkgutil-resolve-name==1.3.10 - # via jsonschema -platformdirs==3.9.1 +platformdirs==4.2.2 # via jupyter-core -plotly==5.15.0 +plotly==5.24.0 # via # dash # pymatgen -prometheus-client==0.17.1 +prometheus-client==0.20.0 # via # jupyter-server - # nbclassic # notebook -prompt-toolkit==3.0.39 +prompt-toolkit==3.0.47 # via ipython -psutil==5.9.5 +psutil==6.0.0 # via ipykernel ptyprocess==0.7.0 # via # pexpect # terminado -pure-eval==0.2.2 +pure-eval==0.2.3 # via stack-data pybtex==0.24.0 # via # emmet-core # pymatgen -pycparser==2.21 +pycparser==2.22 # via cffi -pydantic==1.10.11 +pydantic==2.8.2 # via # emmet-core - # pymatgen -pygments==2.15.1 + # maggma + # pydantic-settings +pydantic-core==2.20.1 + # via pydantic +pydantic-settings==2.4.0 + # via + # crystal_toolkit (pyproject.toml) + # emmet-core + # maggma +pydash==8.0.3 + # via maggma +pygments==2.18.0 # via # ipython # nbconvert -pymatgen==2023.7.17 +pymatgen==2024.8.9 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # emmet-core # mp-api -pyparsing==3.0.9 +pymongo==4.8.0 + # via maggma +pynacl==1.5.0 + # via paramiko +pyparsing==3.1.4 # via matplotlib -python-dateutil==2.8.2 +python-dateutil==2.9.0.post0 # via # arrow + # botocore # jupyter-client + # maggma # matplotlib # pandas +python-dotenv==1.0.1 + # via pydantic-settings python-json-logger==2.0.7 # via jupyter-events -pytz==2023.3 - # via - # babel - # pandas -pywavelets==1.4.1 - # via scikit-image -pyyaml==6.0.1 +pytz==2024.1 + # via pandas +pyyaml==6.0.2 # via # jupyter-events # pybtex -pyzmq==25.1.0 +pyzmq==26.2.0 # via # ipykernel # jupyter-client # jupyter-server - # nbclassic + # maggma # notebook -referencing==0.29.1 +referencing==0.35.1 # via # jsonschema # jsonschema-specifications -requests==2.31.0 + # jupyter-events +requests==2.32.3 # via # dash # jupyterlab-server @@ -395,81 +426,85 @@ rfc3986-validator==0.1.1 # via # jsonschema # jupyter-events -rpds-py==0.8.11 +rpds-py==0.20.0 # via # jsonschema # referencing -ruamel-yaml==0.17.32 - # via pymatgen -ruamel-yaml-clib==0.2.7 +ruamel-yaml==0.18.6 + # via + # maggma + # pymatgen +ruamel-yaml-clib==0.2.8 # via ruamel-yaml -scikit-image==0.21.0 - # via crystal-toolkit (pyproject.toml) -scikit-learn==1.3.0 - # via crystal-toolkit (pyproject.toml) -scipy==1.10.1 +s3transfer==0.10.2 + # via boto3 +scikit-image==0.24.0 + # via crystal_toolkit (pyproject.toml) +scikit-learn==1.5.1 + # via crystal_toolkit (pyproject.toml) +scipy==1.14.1 # via # pymatgen # scikit-image # scikit-learn -send2trash==1.8.2 +send2trash==1.8.3 # via # jupyter-server - # nbclassic # notebook -shapely==2.0.1 - # via crystal-toolkit (pyproject.toml) +sentinels==1.0.0 + # via mongomock +shapely==2.0.6 + # via crystal_toolkit (pyproject.toml) six==1.16.0 # via # asttokens # bleach - # latexcodec # pybtex # python-dateutil # retrying # rfc3339-validator -sniffio==1.3.0 +smart-open==7.0.4 + # via mp-api +sniffio==1.3.1 # via anyio -soupsieve==2.4.1 +soupsieve==2.6 # via beautifulsoup4 -spglib==2.0.2 - # via - # emmet-core - # pymatgen -stack-data==0.6.2 +spglib==2.5.0 + # via pymatgen +sshtunnel==0.4.0 + # via maggma +stack-data==0.6.3 # via ipython -sympy==1.12 +sympy==1.13.2 # via pymatgen tabulate==0.9.0 # via pymatgen -tenacity==8.2.2 +tenacity==9.0.0 # via plotly -terminado==0.17.1 +terminado==0.18.1 # via # jupyter-server # jupyter-server-terminals - # nbclassic # notebook -threadpoolctl==3.2.0 +threadpoolctl==3.5.0 # via scikit-learn -tifffile==2023.7.10 +tifffile==2024.8.30 # via scikit-image -tinycss2==1.2.1 +tinycss2==1.3.0 # via nbconvert -tomli==2.0.1 - # via jupyterlab -tornado==6.3.2 +tornado==6.4.1 # via # ipykernel # jupyter-client # jupyter-server # jupyterlab - # nbclassic # notebook # terminado -tqdm==4.65.0 - # via pymatgen -traitlets==5.9.0 +tqdm==4.66.5 + # via + # maggma + # pymatgen +traitlets==5.14.3 # via # comm # ipykernel @@ -479,52 +514,58 @@ traitlets==5.9.0 # jupyter-events # jupyter-server # matplotlib-inline - # nbclassic # nbclient # nbconvert # nbformat # notebook -typing-extensions==4.7.1 +types-python-dateutil==2.9.0.20240821 + # via arrow +typing-extensions==4.12.2 # via + # aiosqlite # dash # emmet-core # ipython # mp-api # pydantic -tzdata==2023.3 + # pydantic-core + # pydash +tzdata==2024.1 # via pandas -uncertainties==3.1.7 +uncertainties==3.2.2 # via pymatgen uri-template==1.3.0 # via jsonschema -urllib3==2.0.3 - # via requests -wcwidth==0.2.6 +urllib3==2.2.2 + # via + # botocore + # requests +wcwidth==0.2.13 # via prompt-toolkit -webcolors==1.13 +webcolors==24.8.0 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # jsonschema webencodings==0.5.1 # via # bleach # tinycss2 -websocket-client==1.6.1 +websocket-client==1.8.0 # via jupyter-server -werkzeug==2.2.3 +werkzeug==3.0.4 # via # dash # flask -y-py==0.5.9 +wrapt==1.16.0 + # via smart-open +y-py==0.6.2 # via # jupyter-ydoc # ypy-websocket -ypy-websocket==0.8.2 +ypy-websocket==0.8.4 # via jupyter-server-ydoc -zipp==3.16.2 - # via - # importlib-metadata - # importlib-resources +zipp==3.20.1 + # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/requirements/macos-latest_py3.9_extras.txt b/requirements/ubuntu-latest_py3.11_extras.txt similarity index 61% rename from requirements/macos-latest_py3.9_extras.txt rename to requirements/ubuntu-latest_py3.11_extras.txt index 12910e02..a791bdc1 100644 --- a/requirements/macos-latest_py3.9_extras.txt +++ b/requirements/ubuntu-latest_py3.11_extras.txt @@ -1,50 +1,43 @@ # -# This file is autogenerated by pip-compile with Python 3.9 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # -# pip-compile --all-extras --output-file=requirements/macos-latest_py3.9_extras.txt pyproject.toml +# pip-compile --all-extras --output-file=requirements/ubuntu-latest_py3.11_extras.txt pyproject.toml # aiofiles==22.1.0 # via ypy-websocket -aiohttp==3.8.4 +aiohappyeyeballs==2.4.0 + # via aiohttp +aiohttp==3.10.5 # via dephell +aioitertools==0.12.0 + # via maggma aiosignal==1.3.1 # via aiohttp -aiosqlite==0.19.0 +aiosqlite==0.20.0 # via ypy-websocket -alabaster==0.7.13 +alabaster==0.7.16 # via sphinx -ansi2html==1.8.0 - # via dash -anyio==3.7.1 - # via - # httpcore - # jupyter-server -appnope==0.1.3 - # via - # ipykernel - # ipython -argon2-cffi==21.3.0 +annotated-types==0.7.0 + # via pydantic +anyio==4.4.0 + # via jupyter-server +argon2-cffi==23.1.0 # via # jupyter-server - # nbclassic # notebook argon2-cffi-bindings==21.2.0 # via argon2-cffi -arrow==1.2.3 +arrow==1.3.0 # via isoduration -ase==3.22.1 +ase==3.23.0 # via # boltztrap2 # dscribe # hiphive -asttokens==2.2.1 +asttokens==2.4.1 # via stack-data -async-timeout==4.0.2 - # via - # aiohttp - # redis -attrs==23.1.0 +attrs==24.2.0 # via # aiohttp # dephell @@ -56,106 +49,121 @@ attrs==23.1.0 # dephell-pythons # dephell-shells # dephell-venvs + # jsonlines # jsonschema # outcome # referencing # trio -babel==2.12.1 +babel==2.16.0 # via # jupyterlab-server # sphinx -backcall==0.2.0 - # via ipython -beautifulsoup4==4.12.2 +bcrypt==4.2.0 + # via paramiko +beautifulsoup4==4.12.3 # via # dash # gdown # nbconvert -black==23.7.0 - # via crystal-toolkit (pyproject.toml) -bleach==6.0.0 +black==24.8.0 + # via crystal_toolkit (pyproject.toml) +bleach==6.1.0 # via nbconvert -boltztrap2==22.12.1 +blinker==1.8.2 + # via flask +boltztrap2==24.7.2 # via ifermi +boto3==1.35.10 + # via maggma +botocore==1.35.10 + # via + # boto3 + # s3transfer cachelib==0.9.0 # via flask-caching -cerberus==1.3.4 +cerberus==1.3.5 # via dephell -certifi==2023.5.7 +certifi==2024.8.30 # via # dephell - # httpcore # netcdf4 # requests # urllib3 -cffi==1.15.1 +cffi==1.17.0 # via # argon2-cffi-bindings # cryptography -cfgv==3.3.1 + # pynacl +cfgv==3.4.0 # via pre-commit -cftime==1.6.2 +cftime==1.6.4 # via netcdf4 -charset-normalizer==3.2.0 - # via - # aiohttp - # requests -click==8.1.5 +charset-normalizer==3.3.2 + # via requests +click==8.1.7 # via # black # dask # distributed # flask # ifermi -cloudpickle==2.2.1 +cloudpickle==3.0.0 # via # dask # distributed -comm==0.1.3 +colorspacious==1.1.2 + # via py4dstem +comm==0.2.2 # via ipykernel commonmark==0.9.1 # via recommonmark -contourpy==1.1.0 +contourpy==1.3.0 # via matplotlib -cryptography==41.0.2 +cryptography==43.0.0 # via + # dash + # paramiko # pyopenssl # urllib3 crystaltoolkit-extension==0.6.0 - # via crystal-toolkit (pyproject.toml) -cycler==0.11.0 + # via crystal_toolkit (pyproject.toml) +cycler==0.12.1 # via matplotlib -dash[testing]==2.11.1 +cython==3.0.11 + # via boltztrap2 +dash[testing]==2.17.1 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # dash-extensions # dash-vtk dash-core-components==2.0.0 # via dash -dash-extensions==1.0.1 - # via crystal-toolkit (pyproject.toml) +dash-extensions==1.0.18 + # via crystal_toolkit (pyproject.toml) dash-html-components==2.0.0 # via dash -dash-mp-components==0.4.36 - # via crystal-toolkit (pyproject.toml) +dash-mp-components==0.4.45 + # via crystal_toolkit (pyproject.toml) dash-table==5.0.0 # via dash dash-testing-stub==0.0.2 # via dash dash-vtk==0.0.9 - # via crystal-toolkit (pyproject.toml) -dask==2023.7.0 + # via crystal_toolkit (pyproject.toml) +dask==2024.8.2 # via # distributed # py4dstem -debugpy==1.6.7 +dataclass-wizard==0.22.3 + # via dash-extensions +debugpy==1.8.5 # via ipykernel decorator==5.1.1 # via ipython defusedxml==0.7.1 # via nbconvert dephell==0.8.3 - # via crystal-toolkit (pyproject.toml) + # via crystal_toolkit (pyproject.toml) dephell-archive==0.1.7 # via dephell dephell-argparse==0.1.3 @@ -187,97 +195,92 @@ dephell-venvs==0.1.18 # via dephell dephell-versioning==0.1.2 # via dephell -dill==0.3.6 +dill==0.3.8 # via # multiprocess # py4dstem -distlib==0.3.7 +distlib==0.3.8 # via virtualenv -distributed==2023.7.0 +distributed==2024.8.2 # via py4dstem -dnspython==2.4.0 - # via pymongo -docutils==0.18.1 +dnspython==2.6.1 + # via + # maggma + # pymongo +docutils==0.20.1 # via # m2r # recommonmark # sphinx # sphinx-rtd-theme -dscribe==2.0.0 - # via crystal-toolkit (pyproject.toml) -editorconfig==0.12.3 +dscribe==2.1.1 + # via crystal_toolkit (pyproject.toml) +editorconfig==0.12.4 # via jsbeautifier -emdfile==0.0.8 +emdfile==0.0.15 # via py4dstem -emmet-core==0.60.1 +emmet-core==0.84.2rc6 # via mp-api entrypoints==0.4 - # via nbconvert -exceptiongroup==1.1.2 # via - # anyio - # pytest - # trio - # trio-websocket -executing==1.2.0 + # jupyter-client + # nbconvert +executing==2.1.0 # via stack-data -fastjsonschema==2.17.1 +fastjsonschema==2.20.0 # via nbformat -filelock==3.12.2 +filelock==3.15.4 # via # gdown # virtualenv -flask==2.2.5 +flask==3.0.3 # via # dash # flask-caching -flask-caching==2.0.2 +flask-caching==2.3.0 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # dash-extensions -fonttools==4.41.0 +fonttools==4.53.1 # via matplotlib fqdn==1.5.1 # via jsonschema -frozendict==2.3.8 - # via crystal-toolkit (pyproject.toml) -frozenlist==1.4.0 +frozendict==2.4.4 + # via crystal_toolkit (pyproject.toml) +frozenlist==1.4.1 # via # aiohttp # aiosignal -fsspec==2023.6.0 +fsspec==2024.6.1 # via dask -future==0.18.3 - # via - # matminer - # uncertainties -gdown==4.7.1 +gdown==5.2.0 # via py4dstem -gevent==23.7.0 +gevent==24.2.1 # via gunicorn -greenlet==2.0.2 - # via gevent -gunicorn[gevent]==21.0.1 - # via crystal-toolkit (pyproject.toml) -h11==0.14.0 +greenlet==3.0.3 # via - # httpcore - # wsproto -h5py==3.9.0 + # gevent + # playwright +gunicorn[gevent]==23.0.0 + # via crystal_toolkit (pyproject.toml) +h11==0.14.0 + # via wsproto +h5py==3.11.0 # via # emdfile + # hdf5plugin # hiphive # ncempy # py4dstem -habanero==1.2.3 - # via crystal-toolkit (pyproject.toml) -hiphive==1.1 - # via crystal-toolkit (pyproject.toml) -httpcore==0.17.3 - # via dnspython -identify==2.5.24 +habanero==1.2.6 + # via crystal_toolkit (pyproject.toml) +hdf5plugin==5.0.0 + # via py4dstem +hiphive==1.3.1 + # via crystal_toolkit (pyproject.toml) +identify==2.6.0 # via pre-commit -idna==3.4 +idna==3.8 # via # anyio # jsonschema @@ -285,154 +288,148 @@ idna==3.4 # trio # urllib3 # yarl -ifermi==0.3.1 - # via crystal-toolkit (pyproject.toml) -imageio==2.31.1 +ifermi==0.3.5 + # via crystal_toolkit (pyproject.toml) +imageio==2.35.1 # via scikit-image imagesize==1.4.1 # via sphinx -importlib-metadata==6.8.0 +importlib-metadata==8.4.0 # via + # dash # dask - # flask - # jupyter-client - # jupyter-ydoc - # jupyterlab-server - # sphinx -importlib-resources==6.0.0 - # via matplotlib -inflect==7.0.0 +inflect==7.3.1 # via robocrys iniconfig==2.0.0 # via pytest -ipykernel==6.24.0 +ipykernel==6.29.5 # via - # ipywidgets # nbclassic # notebook -ipython==8.14.0 +ipython==8.27.0 # via # ipykernel - # ipywidgets # jupyterlab ipython-genutils==0.2.0 # via # nbclassic # notebook -ipywidgets==8.0.7 - # via py4dstem isoduration==20.11.0 # via jsonschema -itsdangerous==2.1.2 +itsdangerous==2.2.0 # via flask -jedi==0.18.2 +jedi==0.19.1 # via ipython -jinja2==3.1.2 +jinja2==3.1.4 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # dephell # distributed # flask # jupyter-server # jupyterlab # jupyterlab-server - # nbclassic # nbconvert # notebook # sphinx -joblib==1.3.1 +jmespath==1.0.1 + # via + # boto3 + # botocore +joblib==1.4.2 # via # dscribe # pymatgen # scikit-learn -jsbeautifier==1.14.8 + # scikit-optimize +jsbeautifier==1.15.1 # via dash-extensions -json5==0.9.14 +json5==0.9.25 # via jupyterlab-server -jsonpointer==2.4 +jsonlines==4.0.0 + # via maggma +jsonpointer==3.0.0 # via jsonschema -jsonschema[format-nongpl]==4.18.3 +jsonschema[format-nongpl]==4.23.0 # via # jupyter-events # jupyterlab-server + # maggma # nbformat -jsonschema-specifications==2023.6.1 +jsonschema-specifications==2023.12.1 # via jsonschema -jupyter-client==8.3.0 +jupyter-client==7.4.9 # via # ipykernel # jupyter-server - # nbclassic # nbclient # notebook -jupyter-core==5.3.1 +jupyter-core==5.7.2 # via # ipykernel # jupyter-client # jupyter-server # jupyterlab - # nbclassic # nbclient # nbconvert # nbformat # notebook -jupyter-events==0.6.3 +jupyter-events==0.10.0 # via # jupyter-server # jupyter-server-fileid -jupyter-server==2.7.0 +jupyter-server==2.14.2 # via # jupyter-server-fileid # jupyterlab # jupyterlab-server - # nbclassic # notebook-shim -jupyter-server-fileid==0.9.0 +jupyter-server-fileid==0.9.2 # via jupyter-server-ydoc -jupyter-server-terminals==0.4.4 +jupyter-server-terminals==0.5.3 # via jupyter-server jupyter-server-ydoc==0.8.0 # via jupyterlab -jupyter-ydoc==0.2.4 +jupyter-ydoc==0.2.5 # via # jupyter-server-ydoc # jupyterlab -jupyterlab==3.6.5 +jupyterlab==3.6.8 # via crystaltoolkit-extension -jupyterlab-pygments==0.2.2 +jupyterlab-pygments==0.3.0 # via nbconvert -jupyterlab-server==2.23.0 +jupyterlab-server==2.27.3 # via jupyterlab -jupyterlab-widgets==3.0.8 - # via ipywidgets kaleido==0.2.1 - # via crystal-toolkit (pyproject.toml) -kiwisolver==1.4.4 + # via crystal_toolkit (pyproject.toml) +kiwisolver==1.4.6 # via matplotlib -latexcodec==2.0.1 +latexcodec==3.0.0 # via pybtex -lazy-loader==0.3 +lazy-loader==0.4 # via scikit-image -llvmlite==0.40.1 +llvmlite==0.43.0 # via numba locket==1.0.0 # via # distributed # partd -lxml==4.9.3 +lxml==5.3.0 # via # dash # nbconvert m2r==0.3.1 # via dephell -markupsafe==2.1.3 +maggma==0.69.3 + # via mp-api +markupsafe==2.1.5 # via # jinja2 # nbconvert # werkzeug -matminer==0.9.0 +matminer==0.9.2 # via robocrys -matplotlib==3.7.2 +matplotlib==3.9.2 # via # ase # boltztrap2 @@ -441,7 +438,7 @@ matplotlib==3.7.2 # py4dstem # pymatgen # vtk -matplotlib-inline==0.1.6 +matplotlib-inline==0.1.7 # via # ipykernel # ipython @@ -451,88 +448,100 @@ mistune==0.8.4 # via # m2r # nbconvert -monty==2023.5.8 +mongomock==4.1.2 + # via maggma +monty==2024.7.30 # via # emmet-core # ifermi + # maggma # matminer # mp-api # pymatgen # robocrys -more-itertools==9.1.0 - # via dash-extensions -mp-api==0.33.3 - # via pymatgen +more-itertools==10.4.0 + # via + # dash-extensions + # inflect +mp-api==0.42.1 + # via + # crystal_toolkit (pyproject.toml) + # robocrys +mpire==2.10.2 + # via py4dstem mpmath==1.3.0 # via sympy -msgpack==1.0.5 +msgpack==1.0.8 # via # distributed + # maggma # mp-api -multidict==6.0.4 +multidict==6.0.5 # via # aiohttp # yarl -multiprocess==0.70.14 +multiprocess==0.70.16 # via dash mypy-extensions==1.0.0 # via black -nbclassic==1.0.0 +nbclassic==1.1.0 # via # jupyterlab # notebook -nbclient==0.8.0 +nbclient==0.10.0 # via nbconvert nbconvert==6.5.4 # via # jupyter-server - # nbclassic # notebook -nbformat==5.9.1 +nbformat==5.10.4 # via # jupyter-server - # nbclassic # nbclient # nbconvert # notebook -ncempy==1.10.0 +ncempy==1.11.3 # via py4dstem -nest-asyncio==1.5.6 +nest-asyncio==1.6.0 # via # dash # ipykernel + # jupyter-client # nbclassic # notebook -netcdf4==1.6.4 +netcdf4==1.7.1.post2 # via boltztrap2 -networkx==3.1 +networkx==3.3 # via # ifermi # pymatgen # robocrys # scikit-image -nodeenv==1.8.0 +nodeenv==1.9.1 # via pre-commit -notebook==6.5.4 +notebook==6.5.7 # via jupyterlab -notebook-shim==0.2.3 +notebook-shim==0.2.4 # via nbclassic -numba==0.57.1 +numba==0.60.0 # via # hiphive # sparse -numpy==1.21.6 +numpy==1.26.4 # via # ase # boltztrap2 # cftime + # colorspacious # contourpy # dscribe # emdfile + # emmet-core # h5py # hiphive # ifermi # imageio + # maggma # matminer # matplotlib # meshcut @@ -543,11 +552,12 @@ numpy==1.21.6 # pandas # py4dstem # pyfftw + # pylops # pymatgen - # pywavelets # robocrys # scikit-image # scikit-learn + # scikit-optimize # scipy # shapely # sparse @@ -555,13 +565,15 @@ numpy==1.21.6 # tifffile # trainstation # trimesh -numpy-stl==3.0.1 +numpy-stl==3.1.2 # via meshcut -outcome==1.2.0 +orjson==3.10.7 + # via maggma +outcome==1.3.0.post0 # via trio -overrides==7.3.1 +overrides==7.7.0 # via jupyter-server -packaging==23.1 +packaging==24.1 # via # black # dask @@ -576,62 +588,69 @@ packaging==23.1 # jupyter-server # jupyterlab # jupyterlab-server + # lazy-loader # matplotlib + # mongomock # nbconvert # plotly # pytest # scikit-image + # scikit-optimize # sphinx palettable==3.3.3 # via pymatgen -pandas==1.5.3 +pandas==2.2.2 # via # hiphive + # maggma # matminer # pymatgen -pandocfilters==1.5.0 +pandocfilters==1.5.1 # via nbconvert -parso==0.8.3 +paramiko==3.4.1 + # via sshtunnel +parso==0.8.4 # via jedi -partd==1.4.0 +partd==1.4.2 # via dask -pathspec==0.11.1 +pathspec==0.12.1 # via black percy==2.0.2 # via dash -pexpect==4.8.0 +pexpect==4.9.0 # via # dephell-shells # ipython -pickleshare==0.7.5 - # via ipython -pillow==10.0.0 +pillow==10.4.0 # via # imageio # matplotlib # scikit-image -platformdirs==3.9.1 +platformdirs==4.2.2 # via # black # jupyter-core # virtualenv -plotly==5.15.0 +playwright==1.46.0 + # via + # crystal_toolkit (pyproject.toml) + # pytest-playwright +plotly==5.24.0 # via # dash # ifermi # pymatgen -pluggy==1.2.0 +pluggy==1.5.0 # via pytest -pre-commit==3.3.3 - # via crystal-toolkit (pyproject.toml) -prometheus-client==0.17.1 +pre-commit==3.8.0 + # via crystal_toolkit (pyproject.toml) +prometheus-client==0.20.0 # via # jupyter-server - # nbclassic # notebook -prompt-toolkit==3.0.39 +prompt-toolkit==3.0.47 # via ipython -psutil==5.9.5 +psutil==6.0.0 # via # dash # distributed @@ -643,90 +662,123 @@ ptyprocess==0.7.0 # terminado pubchempy==1.0.4 # via robocrys -pure-eval==0.2.2 +pure-eval==0.2.3 # via stack-data -py4dstem==0.14.2 - # via crystal-toolkit (pyproject.toml) -pybind11==2.11.1 - # via dscribe +py4dstem==0.14.16 + # via crystal_toolkit (pyproject.toml) +pyaml==24.7.0 + # via scikit-optimize pybtex==0.24.0 # via # emmet-core # pymatgen # robocrys -pycparser==2.21 +pycparser==2.22 # via cffi -pydantic==1.10.11 +pydantic==2.8.2 # via + # dash-extensions # emmet-core - # inflect - # pymatgen -pyfftw==0.13.1 + # maggma + # pydantic-settings +pydantic-core==2.20.1 + # via pydantic +pydantic-settings==2.4.0 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) + # emmet-core + # maggma +pydash==8.0.3 + # via maggma +pyee==11.1.0 + # via playwright +pyfftw==0.14.0 + # via + # crystal_toolkit (pyproject.toml) # ifermi -pygments==2.15.1 +pygments==2.18.0 # via # ipython + # mpire # nbconvert # sphinx -pymatgen==2023.7.17 +pylops==2.3.1 + # via py4dstem +pymatgen==2024.8.9 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # emmet-core # ifermi # matminer # mp-api # robocrys -pymongo==4.4.1 - # via matminer -pyopenssl==23.2.0 +pymongo==4.8.0 + # via + # maggma + # matminer +pynacl==1.5.0 + # via paramiko +pyopenssl==24.2.1 # via urllib3 -pyparsing==3.0.9 +pyparsing==3.1.4 # via matplotlib pysocks==1.7.1 # via # requests # urllib3 -pytest==7.4.0 - # via dash -python-dateutil==2.8.2 +pytest==8.3.2 + # via + # crystal_toolkit (pyproject.toml) + # dash + # pytest-base-url + # pytest-playwright +pytest-base-url==2.1.0 + # via pytest-playwright +pytest-playwright==0.5.1 + # via crystal_toolkit (pyproject.toml) +python-dateutil==2.9.0.post0 # via # arrow + # botocore # jupyter-client + # maggma # matplotlib # pandas +python-dotenv==1.0.1 + # via pydantic-settings python-json-logger==2.0.7 # via jupyter-events -python-utils==3.7.0 +python-slugify==8.0.4 + # via pytest-playwright +python-utils==3.8.2 # via numpy-stl -pytz==2023.3 +pytz==2024.1 # via pandas -pywavelets==1.4.1 - # via scikit-image -pyyaml==6.0.1 +pyyaml==6.0.2 # via # dask # distributed # jupyter-events # pre-commit + # pyaml # pybtex -pyzmq==25.1.0 +pyzmq==26.2.0 # via # ipykernel # jupyter-client # jupyter-server - # nbclassic + # maggma # notebook recommonmark==0.7.1 - # via crystal-toolkit (pyproject.toml) -redis==4.6.0 - # via crystal-toolkit (pyproject.toml) -referencing==0.29.1 + # via crystal_toolkit (pyproject.toml) +redis==5.0.8 + # via crystal_toolkit (pyproject.toml) +referencing==0.35.1 # via # jsonschema # jsonschema-specifications -requests[security,socks]==2.31.0 + # jupyter-events +requests[security,socks]==2.32.3 # via # dash # dephell @@ -740,6 +792,7 @@ requests[security,socks]==2.31.0 # mp-api # percy # pymatgen + # pytest-base-url # sphinx retrying==1.3.4 # via dash @@ -751,76 +804,84 @@ rfc3986-validator==0.1.1 # via # jsonschema # jupyter-events -robocrys==0.2.8 - # via crystal-toolkit (pyproject.toml) -rpds-py==0.8.11 +robocrys==0.2.9 + # via crystal_toolkit (pyproject.toml) +rpds-py==0.20.0 # via # jsonschema # referencing -ruamel-yaml==0.17.32 +ruamel-yaml==0.18.6 # via # dephell + # maggma # pymatgen # robocrys -ruamel-yaml-clib==0.2.7 +ruamel-yaml-clib==0.2.8 # via ruamel-yaml -scikit-image==0.21.0 +ruff==0.4.10 + # via dash-extensions +s3transfer==0.10.2 + # via boto3 +scikit-image==0.24.0 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # ifermi # py4dstem -scikit-learn==1.3.0 +scikit-learn==1.4.2 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # dscribe # hiphive # matminer # py4dstem + # scikit-optimize # trainstation -scipy==1.11.1 +scikit-optimize==0.10.2 + # via py4dstem +scipy==1.14.1 # via # ase # boltztrap2 # dscribe - # emdfile # hiphive # ifermi # meshcut # ncempy # py4dstem + # pylops # pymatgen # robocrys # scikit-image # scikit-learn + # scikit-optimize # sparse # trainstation selenium==4.2.0 # via dash -send2trash==1.8.2 +send2trash==1.8.3 # via # jupyter-server - # nbclassic # notebook -shapely==2.0.1 - # via crystal-toolkit (pyproject.toml) -shellingham==1.5.0.post1 +sentinels==1.0.0 + # via mongomock +shapely==2.0.6 + # via crystal_toolkit (pyproject.toml) +shellingham==1.5.4 # via dephell-shells six==1.16.0 # via # asttokens # bleach - # gdown # jsbeautifier - # latexcodec # pybtex # python-dateutil # retrying # rfc3339-validator -sniffio==1.3.0 +smart-open==7.0.4 + # via mp-api +sniffio==1.3.1 # via # anyio - # dnspython - # httpcore # trio snowballstemmer==2.2.0 # via sphinx @@ -828,42 +889,43 @@ sortedcontainers==2.4.0 # via # distributed # trio -soupsieve==2.4.1 +soupsieve==2.6 # via beautifulsoup4 -sparse==0.14.0 +sparse==0.15.4 # via dscribe -spglib==2.0.2 +spglib==2.5.0 # via # boltztrap2 - # emmet-core # hiphive # ifermi # pymatgen # robocrys -sphinx==6.2.1 +sphinx==7.4.7 # via # recommonmark # sphinx-rtd-theme # sphinxcontrib-jquery -sphinx-rtd-theme==1.2.2 - # via crystal-toolkit (pyproject.toml) -sphinxcontrib-applehelp==1.0.4 +sphinx-rtd-theme==2.0.0 + # via crystal_toolkit (pyproject.toml) +sphinxcontrib-applehelp==2.0.0 # via sphinx -sphinxcontrib-devhelp==1.0.2 +sphinxcontrib-devhelp==2.0.0 # via sphinx -sphinxcontrib-htmlhelp==2.0.1 +sphinxcontrib-htmlhelp==2.1.0 # via sphinx sphinxcontrib-jquery==4.1 # via sphinx-rtd-theme sphinxcontrib-jsmath==1.0.1 # via sphinx -sphinxcontrib-qthelp==1.0.3 +sphinxcontrib-qthelp==2.0.0 # via sphinx -sphinxcontrib-serializinghtml==1.1.5 +sphinxcontrib-serializinghtml==2.0.0 # via sphinx -stack-data==0.6.2 +sshtunnel==0.4.0 + # via maggma +stack-data==0.6.3 # via ipython -sympy==1.12 +sympy==1.13.2 # via # hiphive # matminer @@ -872,146 +934,151 @@ tabulate==0.9.0 # via # ifermi # pymatgen -tblib==2.0.0 +tblib==3.0.0 # via distributed -tenacity==8.2.2 +tenacity==9.0.0 # via plotly termcolor==2.3.0 # via yaspin -terminado==0.17.1 +terminado==0.18.1 # via # jupyter-server # jupyter-server-terminals - # nbclassic # notebook -threadpoolctl==3.2.0 - # via scikit-learn -tifffile==2023.7.10 +text-unidecode==1.3 + # via python-slugify +threadpoolctl==3.5.0 + # via + # py4dstem + # scikit-learn +tifffile==2024.8.30 # via scikit-image -tinycss2==1.2.1 +tinycss2==1.3.0 # via nbconvert -tomli==2.0.1 - # via - # black - # jupyterlab - # pytest -tomlkit==0.11.8 +tomlkit==0.13.2 # via dephell -toolz==0.12.0 +toolz==0.12.1 # via # dask # distributed # partd -tornado==6.3.2 +tornado==6.4.1 # via # distributed # ipykernel # jupyter-client # jupyter-server # jupyterlab - # nbclassic # notebook # terminado -tqdm==4.65.0 +tqdm==4.66.5 # via # emdfile # gdown # habanero + # maggma # matminer + # mpire # py4dstem # pymatgen -trainstation==1.0 +trainstation==1.1 # via hiphive -traitlets==5.9.0 +traitlets==5.14.3 # via # comm # ipykernel # ipython - # ipywidgets # jupyter-client # jupyter-core # jupyter-events # jupyter-server # matplotlib-inline - # nbclassic # nbclient # nbconvert # nbformat # notebook -trimesh==3.22.4 +trimesh==4.4.8 # via ifermi -trio==0.22.2 +trio==0.26.2 # via # selenium # trio-websocket -trio-websocket==0.10.3 +trio-websocket==0.11.1 # via selenium -typing-extensions==4.7.1 +typeguard==4.3.0 + # via inflect +types-python-dateutil==2.9.0.20240821 + # via arrow +typing-extensions==4.12.2 # via - # black + # aiosqlite # dash # emmet-core - # inflect # ipython # mp-api # pydantic + # pydantic-core + # pydash + # pyee # python-utils -uncertainties==3.1.7 + # typeguard +tzdata==2024.1 + # via pandas +uncertainties==3.2.2 # via pymatgen uri-template==1.3.0 # via jsonschema -urllib3[secure,socks]==1.26.16 +urllib3[secure,socks]==1.26.20 # via + # botocore # distributed # requests # selenium urllib3-secure-extra==0.1.0 # via urllib3 -virtualenv==20.24.0 +virtualenv==20.26.3 # via pre-commit -vtk==9.2.6 +vtk==9.3.1 # via dash-vtk -waitress==2.1.2 +waitress==3.0.0 # via dash -wcwidth==0.2.6 +wcwidth==0.2.13 # via prompt-toolkit -webcolors==1.13 +webcolors==24.8.0 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # jsonschema webencodings==0.5.1 # via # bleach # tinycss2 -websocket-client==1.6.1 +websocket-client==1.8.0 # via jupyter-server -werkzeug==2.2.3 +werkzeug==3.0.4 # via # dash # flask -widgetsnbextension==4.0.8 - # via ipywidgets +wrapt==1.16.0 + # via smart-open wsproto==1.2.0 # via trio-websocket -y-py==0.5.9 +y-py==0.6.2 # via # jupyter-ydoc # ypy-websocket -yarl==1.9.2 +yarl==1.9.7 # via aiohttp -yaspin==2.3.0 +yaspin==3.0.2 # via dephell -ypy-websocket==0.8.2 +ypy-websocket==0.8.4 # via jupyter-server-ydoc zict==3.0.0 # via distributed -zipp==3.16.2 - # via - # importlib-metadata - # importlib-resources +zipp==3.20.1 + # via importlib-metadata zope-event==5.0 # via gevent -zope-interface==6.0 +zope-interface==7.0.3 # via gevent # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/ubuntu-latest_py3.8.txt b/requirements/ubuntu-latest_py3.8.txt index 3dd9f29d..0a3e5a08 100644 --- a/requirements/ubuntu-latest_py3.8.txt +++ b/requirements/ubuntu-latest_py3.8.txt @@ -8,87 +8,93 @@ aiofiles==22.1.0 # via ypy-websocket aiosqlite==0.19.0 # via ypy-websocket +annotated-types==0.6.0 + # via pydantic ansi2html==1.8.0 # via dash -anyio==3.7.1 +anyio==4.0.0 # via jupyter-server -argon2-cffi==21.3.0 +argon2-cffi==23.1.0 # via # jupyter-server # nbclassic # notebook argon2-cffi-bindings==21.2.0 # via argon2-cffi -arrow==1.2.3 +arrow==1.3.0 # via isoduration -asttokens==2.2.1 +asttokens==2.4.0 # via stack-data attrs==23.1.0 # via # jsonschema # referencing -babel==2.12.1 +babel==2.13.0 # via jupyterlab-server backcall==0.2.0 # via ipython beautifulsoup4==4.12.2 # via nbconvert -bleach==6.0.0 +bleach==6.1.0 # via nbconvert cachelib==0.9.0 # via flask-caching -certifi==2023.5.7 +certifi==2023.7.22 # via requests -cffi==1.15.1 +cffi==1.16.0 # via argon2-cffi-bindings -charset-normalizer==3.2.0 +charset-normalizer==3.3.0 # via requests -click==8.1.5 +click==8.1.7 # via flask -comm==0.1.3 +comm==0.1.4 # via ipykernel -contourpy==1.1.0 +contourpy==1.1.1 # via matplotlib crystaltoolkit-extension==0.6.0 # via crystal-toolkit (pyproject.toml) -cycler==0.11.0 +cycler==0.12.1 # via matplotlib -dash==2.11.1 +dash==2.13.0 # via crystal-toolkit (pyproject.toml) dash-core-components==2.0.0 # via dash dash-html-components==2.0.0 # via dash -dash-mp-components==0.4.36 +dash-mp-components==0.4.37 # via crystal-toolkit (pyproject.toml) dash-table==5.0.0 # via dash -debugpy==1.6.7 +debugpy==1.8.0 # via ipykernel decorator==5.1.1 # via ipython defusedxml==0.7.1 # via nbconvert -emmet-core==0.60.1 +emmet-core==0.58.0 # via mp-api -exceptiongroup==1.1.2 +entrypoints==0.4 + # via jupyter-client +exceptiongroup==1.1.3 # via anyio -executing==1.2.0 +executing==2.0.0 # via stack-data -fastjsonschema==2.17.1 +fastjsonschema==2.18.1 # via nbformat flask==2.2.5 # via # dash # flask-caching -flask-caching==2.0.2 +flask-caching==2.1.0 # via crystal-toolkit (pyproject.toml) -fonttools==4.41.0 +fonttools==4.43.1 # via matplotlib fqdn==1.5.1 # via jsonschema frozendict==2.3.8 - # via crystal-toolkit (pyproject.toml) + # via + # crystal-toolkit (pyproject.toml) + # pymatgen future==0.18.3 # via uncertainties idna==3.4 @@ -96,25 +102,24 @@ idna==3.4 # anyio # jsonschema # requests -imageio==2.31.1 +imageio==2.31.5 # via scikit-image importlib-metadata==6.8.0 # via # flask - # jupyter-client # jupyter-ydoc # jupyterlab-server # nbconvert -importlib-resources==6.0.0 +importlib-resources==6.1.0 # via # jsonschema # jsonschema-specifications # matplotlib -ipykernel==6.24.0 +ipykernel==6.25.2 # via # nbclassic # notebook -ipython==8.12.2 +ipython==8.12.3 # via # ipykernel # jupyterlab @@ -126,7 +131,7 @@ isoduration==20.11.0 # via jsonschema itsdangerous==2.1.2 # via flask -jedi==0.18.2 +jedi==0.19.1 # via ipython jinja2==3.1.2 # via @@ -137,7 +142,7 @@ jinja2==3.1.2 # nbclassic # nbconvert # notebook -joblib==1.3.1 +joblib==1.3.2 # via # pymatgen # scikit-learn @@ -145,21 +150,21 @@ json5==0.9.14 # via jupyterlab-server jsonpointer==2.4 # via jsonschema -jsonschema[format-nongpl]==4.18.3 +jsonschema[format-nongpl]==4.19.1 # via # jupyter-events # jupyterlab-server # nbformat -jsonschema-specifications==2023.6.1 +jsonschema-specifications==2023.7.1 # via jsonschema -jupyter-client==8.3.0 +jupyter-client==7.4.9 # via # ipykernel # jupyter-server # nbclassic # nbclient # notebook -jupyter-core==5.3.1 +jupyter-core==5.3.2 # via # ipykernel # jupyter-client @@ -170,11 +175,11 @@ jupyter-core==5.3.1 # nbconvert # nbformat # notebook -jupyter-events==0.6.3 +jupyter-events==0.7.0 # via # jupyter-server # jupyter-server-fileid -jupyter-server==2.7.0 +jupyter-server==2.7.3 # via # jupyter-server-fileid # jupyterlab @@ -187,17 +192,17 @@ jupyter-server-terminals==0.4.4 # via jupyter-server jupyter-server-ydoc==0.8.0 # via jupyterlab -jupyter-ydoc==0.2.4 +jupyter-ydoc==0.2.5 # via # jupyter-server-ydoc # jupyterlab -jupyterlab==3.6.5 +jupyterlab==3.6.6 # via crystaltoolkit-extension jupyterlab-pygments==0.2.2 # via nbconvert -jupyterlab-server==2.23.0 +jupyterlab-server==2.25.0 # via jupyterlab -kiwisolver==1.4.4 +kiwisolver==1.4.5 # via matplotlib latexcodec==2.0.1 # via pybtex @@ -208,24 +213,26 @@ markupsafe==2.1.3 # jinja2 # nbconvert # werkzeug -matplotlib==3.7.2 +matplotlib==3.7.3 # via pymatgen matplotlib-inline==0.1.6 # via # ipykernel # ipython -mistune==3.0.1 +mistune==3.0.2 # via nbconvert -monty==2023.5.8 +monty==2023.9.25 # via # emmet-core # mp-api # pymatgen mp-api==0.33.3 - # via pymatgen + # via + # crystal-toolkit (pyproject.toml) + # pymatgen mpmath==1.3.0 # via sympy -msgpack==1.0.5 +msgpack==1.0.7 # via mp-api nbclassic==1.0.0 # via @@ -233,29 +240,30 @@ nbclassic==1.0.0 # notebook nbclient==0.8.0 # via nbconvert -nbconvert==7.7.1 +nbconvert==7.9.2 # via # jupyter-server # nbclassic # notebook -nbformat==5.9.1 +nbformat==5.9.2 # via # jupyter-server # nbclassic # nbclient # nbconvert # notebook -nest-asyncio==1.5.6 +nest-asyncio==1.5.8 # via # dash # ipykernel + # jupyter-client # nbclassic # notebook networkx==3.1 # via # pymatgen # scikit-image -notebook==6.5.4 +notebook==6.5.6 # via jupyterlab notebook-shim==0.2.3 # via nbclassic @@ -273,9 +281,9 @@ numpy==1.24.4 # shapely # spglib # tifffile -overrides==7.3.1 +overrides==7.4.0 # via jupyter-server -packaging==23.1 +packaging==23.2 # via # ipykernel # jupyter-server @@ -297,16 +305,16 @@ pexpect==4.8.0 # via ipython pickleshare==0.7.5 # via ipython -pillow==10.0.0 +pillow==10.0.1 # via # imageio # matplotlib # scikit-image pkgutil-resolve-name==1.3.10 # via jsonschema -platformdirs==3.9.1 +platformdirs==3.11.0 # via jupyter-core -plotly==5.15.0 +plotly==5.17.0 # via # dash # pymatgen @@ -331,20 +339,24 @@ pybtex==0.24.0 # pymatgen pycparser==2.21 # via cffi -pydantic==1.10.11 +pydantic==2.4.2 # via # emmet-core - # pymatgen -pygments==2.15.1 + # pydantic-settings +pydantic-core==2.10.1 + # via pydantic +pydantic-settings==2.0.3 + # via crystal-toolkit (pyproject.toml) +pygments==2.16.1 # via # ipython # nbconvert -pymatgen==2023.7.17 +pymatgen==2023.6.23 # via # crystal-toolkit (pyproject.toml) # emmet-core # mp-api -pyparsing==3.0.9 +pyparsing==3.1.1 # via matplotlib python-dateutil==2.8.2 # via @@ -352,9 +364,11 @@ python-dateutil==2.8.2 # jupyter-client # matplotlib # pandas +python-dotenv==1.0.0 + # via pydantic-settings python-json-logger==2.0.7 # via jupyter-events -pytz==2023.3 +pytz==2023.3.post1 # via # babel # pandas @@ -364,17 +378,18 @@ pyyaml==6.0.1 # via # jupyter-events # pybtex -pyzmq==25.1.0 +pyzmq==24.0.1 # via # ipykernel # jupyter-client # jupyter-server # nbclassic # notebook -referencing==0.29.1 +referencing==0.30.2 # via # jsonschema # jsonschema-specifications + # jupyter-events requests==2.31.0 # via # dash @@ -391,17 +406,17 @@ rfc3986-validator==0.1.1 # via # jsonschema # jupyter-events -rpds-py==0.8.11 +rpds-py==0.10.4 # via # jsonschema # referencing -ruamel-yaml==0.17.32 +ruamel-yaml==0.17.35 # via pymatgen -ruamel-yaml-clib==0.2.7 +ruamel-yaml-clib==0.2.8 # via ruamel-yaml scikit-image==0.21.0 # via crystal-toolkit (pyproject.toml) -scikit-learn==1.3.0 +scikit-learn==1.3.1 # via crystal-toolkit (pyproject.toml) scipy==1.10.1 # via @@ -426,19 +441,19 @@ six==1.16.0 # rfc3339-validator sniffio==1.3.0 # via anyio -soupsieve==2.4.1 +soupsieve==2.5 # via beautifulsoup4 -spglib==2.0.2 +spglib==2.1.0 # via # emmet-core # pymatgen -stack-data==0.6.2 +stack-data==0.6.3 # via ipython sympy==1.12 # via pymatgen tabulate==0.9.0 # via pymatgen -tenacity==8.2.2 +tenacity==8.2.3 # via plotly terminado==0.17.1 # via @@ -454,7 +469,7 @@ tinycss2==1.2.1 # via nbconvert tomli==2.0.1 # via jupyterlab -tornado==6.3.2 +tornado==6.3.3 # via # ipykernel # jupyter-client @@ -463,9 +478,9 @@ tornado==6.3.2 # nbclassic # notebook # terminado -tqdm==4.65.0 +tqdm==4.66.1 # via pymatgen -traitlets==5.9.0 +traitlets==5.11.2 # via # comm # ipykernel @@ -480,22 +495,26 @@ traitlets==5.9.0 # nbconvert # nbformat # notebook -typing-extensions==4.7.1 +types-python-dateutil==2.8.19.14 + # via arrow +typing-extensions==4.8.0 # via + # annotated-types # dash # emmet-core # ipython # mp-api # pydantic + # pydantic-core tzdata==2023.3 # via pandas uncertainties==3.1.7 # via pymatgen uri-template==1.3.0 # via jsonschema -urllib3==2.0.3 +urllib3==2.0.6 # via requests -wcwidth==0.2.6 +wcwidth==0.2.8 # via prompt-toolkit webcolors==1.13 # via @@ -505,19 +524,19 @@ webencodings==0.5.1 # via # bleach # tinycss2 -websocket-client==1.6.1 +websocket-client==1.6.4 # via jupyter-server werkzeug==2.2.3 # via # dash # flask -y-py==0.5.9 +y-py==0.6.2 # via # jupyter-ydoc # ypy-websocket -ypy-websocket==0.8.2 +ypy-websocket==0.8.4 # via jupyter-server-ydoc -zipp==3.16.2 +zipp==3.17.0 # via # importlib-metadata # importlib-resources diff --git a/requirements/ubuntu-latest_py3.8_extras.txt b/requirements/ubuntu-latest_py3.8_extras.txt index 00232bfb..36815a88 100644 --- a/requirements/ubuntu-latest_py3.8_extras.txt +++ b/requirements/ubuntu-latest_py3.8_extras.txt @@ -6,7 +6,7 @@ # aiofiles==22.1.0 # via ypy-websocket -aiohttp==3.8.4 +aiohttp==3.8.6 # via dephell aiosignal==1.3.1 # via aiohttp @@ -14,29 +14,29 @@ aiosqlite==0.19.0 # via ypy-websocket alabaster==0.7.13 # via sphinx +annotated-types==0.6.0 + # via pydantic ansi2html==1.8.0 # via dash -anyio==3.7.1 - # via - # httpcore - # jupyter-server -argon2-cffi==21.3.0 +anyio==4.0.0 + # via jupyter-server +argon2-cffi==23.1.0 # via # jupyter-server # nbclassic # notebook argon2-cffi-bindings==21.2.0 # via argon2-cffi -arrow==1.2.3 +arrow==1.3.0 # via isoduration ase==3.22.1 # via # boltztrap2 # dscribe # hiphive -asttokens==2.2.1 +asttokens==2.4.0 # via stack-data -async-timeout==4.0.2 +async-timeout==4.0.3 # via # aiohttp # redis @@ -56,7 +56,7 @@ attrs==23.1.0 # outcome # referencing # trio -babel==2.12.1 +babel==2.13.0 # via # jupyterlab-server # sphinx @@ -67,36 +67,35 @@ beautifulsoup4==4.12.2 # dash # gdown # nbconvert -black==23.7.0 +black==23.9.1 # via crystal-toolkit (pyproject.toml) -bleach==6.0.0 +bleach==6.1.0 # via nbconvert boltztrap2==22.12.1 # via ifermi cachelib==0.9.0 # via flask-caching -cerberus==1.3.4 +cerberus==1.3.5 # via dephell -certifi==2023.5.7 +certifi==2023.7.22 # via # dephell - # httpcore # netcdf4 # requests # urllib3 -cffi==1.15.1 +cffi==1.16.0 # via # argon2-cffi-bindings # cryptography -cfgv==3.3.1 +cfgv==3.4.0 # via pre-commit cftime==1.6.2 # via netcdf4 -charset-normalizer==3.2.0 +charset-normalizer==3.3.0 # via # aiohttp # requests -click==8.1.5 +click==8.1.7 # via # black # dask @@ -107,32 +106,34 @@ cloudpickle==2.2.1 # via # dask # distributed -comm==0.1.3 - # via ipykernel +comm==0.1.4 + # via + # ipykernel + # ipywidgets commonmark==0.9.1 # via recommonmark -contourpy==1.1.0 +contourpy==1.1.1 # via matplotlib -cryptography==41.0.2 +cryptography==41.0.4 # via # pyopenssl # urllib3 crystaltoolkit-extension==0.6.0 # via crystal-toolkit (pyproject.toml) -cycler==0.11.0 +cycler==0.12.1 # via matplotlib -dash[testing]==2.11.1 +dash[testing]==2.13.0 # via # crystal-toolkit (pyproject.toml) # dash-extensions # dash-vtk dash-core-components==2.0.0 # via dash -dash-extensions==1.0.1 +dash-extensions==1.0.4 # via crystal-toolkit (pyproject.toml) dash-html-components==2.0.0 # via dash -dash-mp-components==0.4.36 +dash-mp-components==0.4.37 # via crystal-toolkit (pyproject.toml) dash-table==5.0.0 # via dash @@ -144,7 +145,9 @@ dask==2023.5.0 # via # distributed # py4dstem -debugpy==1.6.7 +dataclass-wizard==0.22.2 + # via dash-extensions +debugpy==1.8.0 # via ipykernel decorator==5.1.1 # via ipython @@ -183,7 +186,7 @@ dephell-venvs==0.1.18 # via dephell dephell-versioning==0.1.2 # via dephell -dill==0.3.6 +dill==0.3.7 # via # multiprocess # py4dstem @@ -191,7 +194,7 @@ distlib==0.3.7 # via virtualenv distributed==2023.5.0 # via py4dstem -dnspython==2.4.0 +dnspython==2.4.2 # via pymongo docutils==0.18.1 # via @@ -199,25 +202,27 @@ docutils==0.18.1 # recommonmark # sphinx # sphinx-rtd-theme -dscribe==2.0.0 +dscribe==2.1.0 # via crystal-toolkit (pyproject.toml) editorconfig==0.12.3 # via jsbeautifier -emmet-core==0.60.1 +emmet-core==0.58.0 # via mp-api entrypoints==0.4 - # via nbconvert -exceptiongroup==1.1.2 + # via + # jupyter-client + # nbconvert +exceptiongroup==1.1.3 # via # anyio # pytest # trio # trio-websocket -executing==1.2.0 +executing==2.0.0 # via stack-data -fastjsonschema==2.17.1 +fastjsonschema==2.18.1 # via nbformat -filelock==3.12.2 +filelock==3.12.4 # via # gdown # virtualenv @@ -229,17 +234,19 @@ flask-caching==2.0.2 # via # crystal-toolkit (pyproject.toml) # dash-extensions -fonttools==4.41.0 +fonttools==4.43.1 # via matplotlib fqdn==1.5.1 # via jsonschema frozendict==2.3.8 - # via crystal-toolkit (pyproject.toml) + # via + # crystal-toolkit (pyproject.toml) + # pymatgen frozenlist==1.4.0 # via # aiohttp # aiosignal -fsspec==2023.6.0 +fsspec==2023.9.2 # via dask future==0.18.3 # via @@ -247,28 +254,24 @@ future==0.18.3 # uncertainties gdown==4.7.1 # via py4dstem -gevent==23.7.0 +gevent==23.9.1 # via gunicorn -greenlet==2.0.2 +greenlet==3.0.0 # via gevent -gunicorn[gevent]==21.0.1 +gunicorn[gevent]==21.2.0 # via crystal-toolkit (pyproject.toml) h11==0.14.0 - # via - # httpcore - # wsproto -h5py==3.9.0 + # via wsproto +h5py==3.10.0 # via # hiphive # ncempy # py4dstem habanero==1.2.3 # via crystal-toolkit (pyproject.toml) -hiphive==1.1 +hiphive==1.2 # via crystal-toolkit (pyproject.toml) -httpcore==0.17.3 - # via dnspython -identify==2.5.24 +identify==2.5.30 # via pre-commit idna==3.4 # via @@ -280,7 +283,7 @@ idna==3.4 # yarl ifermi==0.3.1 # via crystal-toolkit (pyproject.toml) -imageio==2.31.1 +imageio==2.31.5 # via scikit-image imagesize==1.4.1 # via sphinx @@ -288,12 +291,11 @@ importlib-metadata==6.8.0 # via # dask # flask - # jupyter-client # jupyter-ydoc # jupyterlab-server # numba # sphinx -importlib-resources==6.0.0 +importlib-resources==6.1.0 # via # jsonschema # jsonschema-specifications @@ -302,12 +304,11 @@ inflect==7.0.0 # via robocrys iniconfig==2.0.0 # via pytest -ipykernel==6.24.0 +ipykernel==6.25.2 # via - # ipywidgets # nbclassic # notebook -ipython==8.12.2 +ipython==8.12.3 # via # ipykernel # ipywidgets @@ -316,13 +317,13 @@ ipython-genutils==0.2.0 # via # nbclassic # notebook -ipywidgets==8.0.7 +ipywidgets==8.1.1 # via py4dstem isoduration==20.11.0 # via jsonschema itsdangerous==2.1.2 # via flask -jedi==0.18.2 +jedi==0.19.1 # via ipython jinja2==3.1.2 # via @@ -337,32 +338,32 @@ jinja2==3.1.2 # nbconvert # notebook # sphinx -joblib==1.3.1 +joblib==1.3.2 # via # dscribe # pymatgen # scikit-learn -jsbeautifier==1.14.8 +jsbeautifier==1.14.9 # via dash-extensions json5==0.9.14 # via jupyterlab-server jsonpointer==2.4 # via jsonschema -jsonschema[format-nongpl]==4.18.3 +jsonschema[format-nongpl]==4.19.1 # via # jupyter-events # jupyterlab-server # nbformat -jsonschema-specifications==2023.6.1 +jsonschema-specifications==2023.7.1 # via jsonschema -jupyter-client==8.3.0 +jupyter-client==7.4.9 # via # ipykernel # jupyter-server # nbclassic # nbclient # notebook -jupyter-core==5.3.1 +jupyter-core==5.3.2 # via # ipykernel # jupyter-client @@ -373,11 +374,11 @@ jupyter-core==5.3.1 # nbconvert # nbformat # notebook -jupyter-events==0.6.3 +jupyter-events==0.7.0 # via # jupyter-server # jupyter-server-fileid -jupyter-server==2.7.0 +jupyter-server==2.7.3 # via # jupyter-server-fileid # jupyterlab @@ -390,27 +391,27 @@ jupyter-server-terminals==0.4.4 # via jupyter-server jupyter-server-ydoc==0.8.0 # via jupyterlab -jupyter-ydoc==0.2.4 +jupyter-ydoc==0.2.5 # via # jupyter-server-ydoc # jupyterlab -jupyterlab==3.6.5 +jupyterlab==3.6.6 # via crystaltoolkit-extension jupyterlab-pygments==0.2.2 # via nbconvert -jupyterlab-server==2.23.0 +jupyterlab-server==2.25.0 # via jupyterlab -jupyterlab-widgets==3.0.8 +jupyterlab-widgets==3.0.9 # via ipywidgets kaleido==0.2.1 # via crystal-toolkit (pyproject.toml) -kiwisolver==1.4.4 +kiwisolver==1.4.5 # via matplotlib latexcodec==2.0.1 # via pybtex lazy-loader==0.3 # via scikit-image -llvmlite==0.40.1 +llvmlite==0.41.0 # via numba locket==1.0.0 # via @@ -429,7 +430,7 @@ markupsafe==2.1.3 # werkzeug matminer==0.9.0 # via robocrys -matplotlib==3.7.2 +matplotlib==3.7.3 # via # ase # boltztrap2 @@ -448,7 +449,7 @@ mistune==0.8.4 # via # m2r # nbconvert -monty==2023.5.8 +monty==2023.9.25 # via # emmet-core # ifermi @@ -459,10 +460,12 @@ monty==2023.5.8 more-itertools==9.1.0 # via dash-extensions mp-api==0.33.3 - # via pymatgen + # via + # crystal-toolkit (pyproject.toml) + # pymatgen mpmath==1.3.0 # via sympy -msgpack==1.0.5 +msgpack==1.0.7 # via # distributed # mp-api @@ -470,7 +473,7 @@ multidict==6.0.4 # via # aiohttp # yarl -multiprocess==0.70.14 +multiprocess==0.70.15 # via dash mypy-extensions==1.0.0 # via black @@ -485,7 +488,7 @@ nbconvert==6.5.4 # jupyter-server # nbclassic # notebook -nbformat==5.9.1 +nbformat==5.9.2 # via # jupyter-server # nbclassic @@ -494,10 +497,11 @@ nbformat==5.9.1 # notebook ncempy==1.10.0 # via py4dstem -nest-asyncio==1.5.6 +nest-asyncio==1.5.8 # via # dash # ipykernel + # jupyter-client # nbclassic # notebook netcdf4==1.6.4 @@ -510,15 +514,15 @@ networkx==3.1 # scikit-image nodeenv==1.8.0 # via pre-commit -notebook==6.5.4 +notebook==6.5.6 # via jupyterlab notebook-shim==0.2.3 # via nbclassic -numba==0.57.1 +numba==0.58.0 # via # hiphive # sparse -numpy==1.21.6 +numpy==1.24.4 # via # ase # boltztrap2 @@ -555,9 +559,9 @@ numpy-stl==3.0.1 # via meshcut outcome==1.2.0 # via trio -overrides==7.3.1 +overrides==7.4.0 # via jupyter-server -packaging==23.1 +packaging==23.2 # via # black # dask @@ -589,9 +593,9 @@ pandocfilters==1.5.0 # via nbconvert parso==0.8.3 # via jedi -partd==1.4.0 +partd==1.4.1 # via dask -pathspec==0.11.1 +pathspec==0.11.2 # via black percy==2.0.2 # via dash @@ -601,26 +605,26 @@ pexpect==4.8.0 # ipython pickleshare==0.7.5 # via ipython -pillow==10.0.0 +pillow==10.0.1 # via # imageio # matplotlib # scikit-image pkgutil-resolve-name==1.3.10 # via jsonschema -platformdirs==3.9.1 +platformdirs==3.11.0 # via # black # jupyter-core # virtualenv -plotly==5.15.0 +plotly==5.17.0 # via # dash # ifermi # pymatgen -pluggy==1.2.0 +pluggy==1.3.0 # via pytest -pre-commit==3.3.3 +pre-commit==3.4.0 # via crystal-toolkit (pyproject.toml) prometheus-client==0.17.1 # via @@ -654,21 +658,25 @@ pybtex==0.24.0 # robocrys pycparser==2.21 # via cffi -pydantic==1.10.11 +pydantic==2.4.2 # via # emmet-core # inflect - # pymatgen + # pydantic-settings +pydantic-core==2.10.1 + # via pydantic +pydantic-settings==2.0.3 + # via crystal-toolkit (pyproject.toml) pyfftw==0.13.1 # via # crystal-toolkit (pyproject.toml) # ifermi -pygments==2.15.1 +pygments==2.16.1 # via # ipython # nbconvert # sphinx -pymatgen==2023.7.17 +pymatgen==2023.6.23 # via # crystal-toolkit (pyproject.toml) # emmet-core @@ -676,17 +684,17 @@ pymatgen==2023.7.17 # matminer # mp-api # robocrys -pymongo==4.4.1 +pymongo==4.5.0 # via matminer pyopenssl==23.2.0 # via urllib3 -pyparsing==3.0.9 +pyparsing==3.1.1 # via matplotlib pysocks==1.7.1 # via # requests # urllib3 -pytest==7.4.0 +pytest==7.4.2 # via dash python-dateutil==2.8.2 # via @@ -694,11 +702,13 @@ python-dateutil==2.8.2 # jupyter-client # matplotlib # pandas +python-dotenv==1.0.0 + # via pydantic-settings python-json-logger==2.0.7 # via jupyter-events -python-utils==3.7.0 +python-utils==3.8.1 # via numpy-stl -pytz==2023.3 +pytz==2023.3.post1 # via # babel # pandas @@ -711,7 +721,7 @@ pyyaml==6.0.1 # jupyter-events # pre-commit # pybtex -pyzmq==25.1.0 +pyzmq==24.0.1 # via # ipykernel # jupyter-client @@ -720,12 +730,13 @@ pyzmq==25.1.0 # notebook recommonmark==0.7.1 # via crystal-toolkit (pyproject.toml) -redis==4.6.0 +redis==5.0.1 # via crystal-toolkit (pyproject.toml) -referencing==0.29.1 +referencing==0.30.2 # via # jsonschema # jsonschema-specifications + # jupyter-events requests[security,socks]==2.31.0 # via # dash @@ -753,23 +764,23 @@ rfc3986-validator==0.1.1 # jupyter-events robocrys==0.2.8 # via crystal-toolkit (pyproject.toml) -rpds-py==0.8.11 +rpds-py==0.10.4 # via # jsonschema # referencing -ruamel-yaml==0.17.32 +ruamel-yaml==0.17.35 # via # dephell # pymatgen # robocrys -ruamel-yaml-clib==0.2.7 +ruamel-yaml-clib==0.2.8 # via ruamel-yaml scikit-image==0.21.0 # via # crystal-toolkit (pyproject.toml) # ifermi # py4dstem -scikit-learn==1.3.0 +scikit-learn==1.3.1 # via # crystal-toolkit (pyproject.toml) # dscribe @@ -802,7 +813,7 @@ send2trash==1.8.2 # notebook shapely==2.0.1 # via crystal-toolkit (pyproject.toml) -shellingham==1.5.0.post1 +shellingham==1.5.3 # via dephell-shells six==1.16.0 # via @@ -818,8 +829,6 @@ six==1.16.0 sniffio==1.3.0 # via # anyio - # dnspython - # httpcore # trio snowballstemmer==2.2.0 # via sphinx @@ -827,11 +836,11 @@ sortedcontainers==2.4.0 # via # distributed # trio -soupsieve==2.4.1 +soupsieve==2.5 # via beautifulsoup4 sparse==0.14.0 # via dscribe -spglib==2.0.2 +spglib==2.1.0 # via # boltztrap2 # emmet-core @@ -839,12 +848,12 @@ spglib==2.0.2 # ifermi # pymatgen # robocrys -sphinx==6.2.1 +sphinx==7.1.2 # via # recommonmark # sphinx-rtd-theme # sphinxcontrib-jquery -sphinx-rtd-theme==1.2.2 +sphinx-rtd-theme==1.3.0 # via crystal-toolkit (pyproject.toml) sphinxcontrib-applehelp==1.0.4 # via sphinx @@ -860,7 +869,7 @@ sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx -stack-data==0.6.2 +stack-data==0.6.3 # via ipython sympy==1.12 # via @@ -873,7 +882,7 @@ tabulate==0.9.0 # pymatgen tblib==2.0.0 # via distributed -tenacity==8.2.2 +tenacity==8.2.3 # via plotly termcolor==2.3.0 # via yaspin @@ -894,14 +903,14 @@ tomli==2.0.1 # black # jupyterlab # pytest -tomlkit==0.11.8 +tomlkit==0.12.1 # via dephell toolz==0.12.0 # via # dask # distributed # partd -tornado==6.3.2 +tornado==6.3.3 # via # distributed # ipykernel @@ -911,7 +920,7 @@ tornado==6.3.2 # nbclassic # notebook # terminado -tqdm==4.65.0 +tqdm==4.66.1 # via # gdown # habanero @@ -920,7 +929,7 @@ tqdm==4.65.0 # pymatgen trainstation==1.0 # via hiphive -traitlets==5.9.0 +traitlets==5.11.2 # via # comm # ipykernel @@ -936,42 +945,47 @@ traitlets==5.9.0 # nbconvert # nbformat # notebook -trimesh==3.22.4 +trimesh==3.23.5 # via ifermi trio==0.22.2 # via # selenium # trio-websocket -trio-websocket==0.10.3 +trio-websocket==0.11.1 # via selenium -typing-extensions==4.7.1 +types-python-dateutil==2.8.19.14 + # via arrow +typing-extensions==4.8.0 # via + # annotated-types # black # dash + # dataclass-wizard # emmet-core # inflect # ipython # mp-api # pydantic + # pydantic-core # python-utils uncertainties==3.1.7 # via pymatgen uri-template==1.3.0 # via jsonschema -urllib3[secure,socks]==1.26.16 +urllib3[secure,socks]==1.26.17 # via # distributed # requests # selenium urllib3-secure-extra==0.1.0 # via urllib3 -virtualenv==20.24.0 +virtualenv==20.24.5 # via pre-commit vtk==9.2.6 # via dash-vtk waitress==2.1.2 # via dash -wcwidth==0.2.6 +wcwidth==0.2.8 # via prompt-toolkit webcolors==1.13 # via @@ -981,35 +995,35 @@ webencodings==0.5.1 # via # bleach # tinycss2 -websocket-client==1.6.1 +websocket-client==1.6.4 # via jupyter-server werkzeug==2.2.3 # via # dash # flask -widgetsnbextension==4.0.8 +widgetsnbextension==4.0.9 # via ipywidgets wsproto==1.2.0 # via trio-websocket -y-py==0.5.9 +y-py==0.6.2 # via # jupyter-ydoc # ypy-websocket yarl==1.9.2 # via aiohttp -yaspin==2.3.0 +yaspin==2.5.0 # via dephell -ypy-websocket==0.8.2 +ypy-websocket==0.8.4 # via jupyter-server-ydoc zict==3.0.0 # via distributed -zipp==3.16.2 +zipp==3.17.0 # via # importlib-metadata # importlib-resources zope-event==5.0 # via gevent -zope-interface==6.0 +zope-interface==6.1 # via gevent # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/ubuntu-latest_py3.9.txt b/requirements/ubuntu-latest_py3.9.txt index b6f2266f..cc2807a4 100644 --- a/requirements/ubuntu-latest_py3.9.txt +++ b/requirements/ubuntu-latest_py3.9.txt @@ -6,112 +6,135 @@ # aiofiles==22.1.0 # via ypy-websocket -aiosqlite==0.19.0 +aioitertools==0.12.0 + # via maggma +aiosqlite==0.20.0 # via ypy-websocket -ansi2html==1.8.0 - # via dash -anyio==3.7.1 +annotated-types==0.7.0 + # via pydantic +anyio==4.4.0 # via jupyter-server -argon2-cffi==21.3.0 +argon2-cffi==23.1.0 # via # jupyter-server - # nbclassic # notebook argon2-cffi-bindings==21.2.0 # via argon2-cffi -arrow==1.2.3 +arrow==1.3.0 # via isoduration -asttokens==2.2.1 +asttokens==2.4.1 # via stack-data -attrs==23.1.0 +attrs==24.2.0 # via + # jsonlines # jsonschema # referencing -babel==2.12.1 +babel==2.16.0 # via jupyterlab-server -backcall==0.2.0 - # via ipython -beautifulsoup4==4.12.2 +bcrypt==4.2.0 + # via paramiko +beautifulsoup4==4.12.3 # via nbconvert -bleach==6.0.0 +bleach==6.1.0 # via nbconvert +blinker==1.8.2 + # via flask +boto3==1.35.10 + # via maggma +botocore==1.35.10 + # via + # boto3 + # s3transfer cachelib==0.9.0 # via flask-caching -certifi==2023.5.7 +certifi==2024.8.30 # via requests -cffi==1.15.1 - # via argon2-cffi-bindings -charset-normalizer==3.2.0 +cffi==1.17.0 + # via + # argon2-cffi-bindings + # cryptography + # pynacl +charset-normalizer==3.3.2 # via requests -click==8.1.5 +click==8.1.7 # via flask -comm==0.1.3 +comm==0.2.2 # via ipykernel -contourpy==1.1.0 +contourpy==1.3.0 # via matplotlib +cryptography==43.0.0 + # via paramiko crystaltoolkit-extension==0.6.0 - # via crystal-toolkit (pyproject.toml) -cycler==0.11.0 + # via crystal_toolkit (pyproject.toml) +cycler==0.12.1 # via matplotlib -dash==2.11.1 - # via crystal-toolkit (pyproject.toml) +dash==2.17.1 + # via crystal_toolkit (pyproject.toml) dash-core-components==2.0.0 # via dash dash-html-components==2.0.0 # via dash -dash-mp-components==0.4.36 - # via crystal-toolkit (pyproject.toml) +dash-mp-components==0.4.45 + # via crystal_toolkit (pyproject.toml) dash-table==5.0.0 # via dash -debugpy==1.6.7 +debugpy==1.8.5 # via ipykernel decorator==5.1.1 # via ipython defusedxml==0.7.1 # via nbconvert -emmet-core==0.60.1 +dnspython==2.6.1 + # via + # maggma + # pymongo +emmet-core==0.84.2rc6 # via mp-api -exceptiongroup==1.1.2 - # via anyio -executing==1.2.0 +entrypoints==0.4 + # via jupyter-client +exceptiongroup==1.2.2 + # via + # anyio + # ipython +executing==2.1.0 # via stack-data -fastjsonschema==2.17.1 +fastjsonschema==2.20.0 # via nbformat -flask==2.2.5 +flask==3.0.3 # via # dash # flask-caching -flask-caching==2.0.2 - # via crystal-toolkit (pyproject.toml) -fonttools==4.41.0 +flask-caching==2.3.0 + # via crystal_toolkit (pyproject.toml) +fonttools==4.53.1 # via matplotlib fqdn==1.5.1 # via jsonschema -frozendict==2.3.8 - # via crystal-toolkit (pyproject.toml) -future==0.18.3 - # via uncertainties -idna==3.4 +frozendict==2.4.4 + # via crystal_toolkit (pyproject.toml) +idna==3.8 # via # anyio # jsonschema # requests -imageio==2.31.1 +imageio==2.35.1 # via scikit-image -importlib-metadata==6.8.0 +importlib-metadata==8.4.0 # via + # dash # flask - # jupyter-client # jupyter-ydoc # jupyterlab-server # nbconvert -importlib-resources==6.0.0 - # via matplotlib -ipykernel==6.24.0 +importlib-resources==6.4.4 + # via + # matplotlib + # spglib +ipykernel==6.29.5 # via # nbclassic # notebook -ipython==8.14.0 +ipython==8.18.1 # via # ipykernel # jupyterlab @@ -121,254 +144,286 @@ ipython-genutils==0.2.0 # notebook isoduration==20.11.0 # via jsonschema -itsdangerous==2.1.2 +itsdangerous==2.2.0 # via flask -jedi==0.18.2 +jedi==0.19.1 # via ipython -jinja2==3.1.2 +jinja2==3.1.4 # via # flask # jupyter-server # jupyterlab # jupyterlab-server - # nbclassic # nbconvert # notebook -joblib==1.3.1 +jmespath==1.0.1 + # via + # boto3 + # botocore +joblib==1.4.2 # via # pymatgen # scikit-learn -json5==0.9.14 +json5==0.9.25 # via jupyterlab-server -jsonpointer==2.4 +jsonlines==4.0.0 + # via maggma +jsonpointer==3.0.0 # via jsonschema -jsonschema[format-nongpl]==4.18.3 +jsonschema[format-nongpl]==4.23.0 # via # jupyter-events # jupyterlab-server + # maggma # nbformat -jsonschema-specifications==2023.6.1 +jsonschema-specifications==2023.12.1 # via jsonschema -jupyter-client==8.3.0 +jupyter-client==7.4.9 # via # ipykernel # jupyter-server - # nbclassic # nbclient # notebook -jupyter-core==5.3.1 +jupyter-core==5.7.2 # via # ipykernel # jupyter-client # jupyter-server # jupyterlab - # nbclassic # nbclient # nbconvert # nbformat # notebook -jupyter-events==0.6.3 +jupyter-events==0.10.0 # via # jupyter-server # jupyter-server-fileid -jupyter-server==2.7.0 +jupyter-server==2.14.2 # via # jupyter-server-fileid # jupyterlab # jupyterlab-server - # nbclassic # notebook-shim -jupyter-server-fileid==0.9.0 +jupyter-server-fileid==0.9.2 # via jupyter-server-ydoc -jupyter-server-terminals==0.4.4 +jupyter-server-terminals==0.5.3 # via jupyter-server jupyter-server-ydoc==0.8.0 # via jupyterlab -jupyter-ydoc==0.2.4 +jupyter-ydoc==0.2.5 # via # jupyter-server-ydoc # jupyterlab -jupyterlab==3.6.5 +jupyterlab==3.6.8 # via crystaltoolkit-extension -jupyterlab-pygments==0.2.2 +jupyterlab-pygments==0.3.0 # via nbconvert -jupyterlab-server==2.23.0 +jupyterlab-server==2.27.3 # via jupyterlab -kiwisolver==1.4.4 +kiwisolver==1.4.6 # via matplotlib -latexcodec==2.0.1 +latexcodec==3.0.0 # via pybtex -lazy-loader==0.3 +lazy-loader==0.4 # via scikit-image -markupsafe==2.1.3 +maggma==0.69.3 + # via mp-api +markupsafe==2.1.5 # via # jinja2 # nbconvert # werkzeug -matplotlib==3.7.2 +matplotlib==3.9.2 # via pymatgen -matplotlib-inline==0.1.6 +matplotlib-inline==0.1.7 # via # ipykernel # ipython -mistune==3.0.1 +mistune==3.0.2 # via nbconvert -monty==2023.5.8 +mongomock==4.1.2 + # via maggma +monty==2024.7.30 # via # emmet-core + # maggma # mp-api # pymatgen -mp-api==0.33.3 - # via pymatgen +mp-api==0.42.1 + # via crystal_toolkit (pyproject.toml) mpmath==1.3.0 # via sympy -msgpack==1.0.5 - # via mp-api -nbclassic==1.0.0 +msgpack==1.0.8 + # via + # maggma + # mp-api +nbclassic==1.1.0 # via # jupyterlab # notebook -nbclient==0.8.0 +nbclient==0.10.0 # via nbconvert -nbconvert==7.7.1 +nbconvert==7.16.4 # via # jupyter-server - # nbclassic # notebook -nbformat==5.9.1 +nbformat==5.10.4 # via # jupyter-server - # nbclassic # nbclient # nbconvert # notebook -nest-asyncio==1.5.6 +nest-asyncio==1.6.0 # via # dash # ipykernel + # jupyter-client # nbclassic # notebook -networkx==3.1 +networkx==3.2.1 # via # pymatgen # scikit-image -notebook==6.5.4 +notebook==6.5.7 # via jupyterlab -notebook-shim==0.2.3 +notebook-shim==0.2.4 # via nbclassic -numpy==1.25.1 +numpy==1.26.4 # via # contourpy + # emmet-core # imageio + # maggma # matplotlib # pandas # pymatgen - # pywavelets # scikit-image # scikit-learn # scipy # shapely # spglib # tifffile -overrides==7.3.1 +orjson==3.10.7 + # via maggma +overrides==7.7.0 # via jupyter-server -packaging==23.1 +packaging==24.1 # via # ipykernel # jupyter-server # jupyterlab # jupyterlab-server + # lazy-loader # matplotlib + # mongomock # nbconvert # plotly # scikit-image palettable==3.3.3 # via pymatgen -pandas==2.0.3 - # via pymatgen -pandocfilters==1.5.0 +pandas==2.2.2 + # via + # maggma + # pymatgen +pandocfilters==1.5.1 # via nbconvert -parso==0.8.3 +paramiko==3.4.1 + # via sshtunnel +parso==0.8.4 # via jedi -pexpect==4.8.0 - # via ipython -pickleshare==0.7.5 +pexpect==4.9.0 # via ipython -pillow==10.0.0 +pillow==10.4.0 # via # imageio # matplotlib # scikit-image -platformdirs==3.9.1 +platformdirs==4.2.2 # via jupyter-core -plotly==5.15.0 +plotly==5.24.0 # via # dash # pymatgen -prometheus-client==0.17.1 +prometheus-client==0.20.0 # via # jupyter-server - # nbclassic # notebook -prompt-toolkit==3.0.39 +prompt-toolkit==3.0.47 # via ipython -psutil==5.9.5 +psutil==6.0.0 # via ipykernel ptyprocess==0.7.0 # via # pexpect # terminado -pure-eval==0.2.2 +pure-eval==0.2.3 # via stack-data pybtex==0.24.0 # via # emmet-core # pymatgen -pycparser==2.21 +pycparser==2.22 # via cffi -pydantic==1.10.11 +pydantic==2.8.2 # via # emmet-core - # pymatgen -pygments==2.15.1 + # maggma + # pydantic-settings +pydantic-core==2.20.1 + # via pydantic +pydantic-settings==2.4.0 + # via + # crystal_toolkit (pyproject.toml) + # emmet-core + # maggma +pydash==8.0.3 + # via maggma +pygments==2.18.0 # via # ipython # nbconvert -pymatgen==2023.7.17 +pymatgen==2024.8.9 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # emmet-core # mp-api -pyparsing==3.0.9 +pymongo==4.8.0 + # via maggma +pynacl==1.5.0 + # via paramiko +pyparsing==3.1.4 # via matplotlib -python-dateutil==2.8.2 +python-dateutil==2.9.0.post0 # via # arrow + # botocore # jupyter-client + # maggma # matplotlib # pandas +python-dotenv==1.0.1 + # via pydantic-settings python-json-logger==2.0.7 # via jupyter-events -pytz==2023.3 +pytz==2024.1 # via pandas -pywavelets==1.4.1 - # via scikit-image -pyyaml==6.0.1 +pyyaml==6.0.2 # via # jupyter-events # pybtex -pyzmq==25.1.0 +pyzmq==26.2.0 # via # ipykernel # jupyter-client # jupyter-server - # nbclassic + # maggma # notebook -referencing==0.29.1 +referencing==0.35.1 # via # jsonschema # jsonschema-specifications -requests==2.31.0 + # jupyter-events +requests==2.32.3 # via # dash # jupyterlab-server @@ -384,81 +439,87 @@ rfc3986-validator==0.1.1 # via # jsonschema # jupyter-events -rpds-py==0.8.11 +rpds-py==0.20.0 # via # jsonschema # referencing -ruamel-yaml==0.17.32 - # via pymatgen -ruamel-yaml-clib==0.2.7 +ruamel-yaml==0.18.6 + # via + # maggma + # pymatgen +ruamel-yaml-clib==0.2.8 # via ruamel-yaml -scikit-image==0.21.0 - # via crystal-toolkit (pyproject.toml) -scikit-learn==1.3.0 - # via crystal-toolkit (pyproject.toml) -scipy==1.11.1 +s3transfer==0.10.2 + # via boto3 +scikit-image==0.24.0 + # via crystal_toolkit (pyproject.toml) +scikit-learn==1.5.1 + # via crystal_toolkit (pyproject.toml) +scipy==1.13.1 # via # pymatgen # scikit-image # scikit-learn -send2trash==1.8.2 +send2trash==1.8.3 # via # jupyter-server - # nbclassic # notebook -shapely==2.0.1 - # via crystal-toolkit (pyproject.toml) +sentinels==1.0.0 + # via mongomock +shapely==2.0.6 + # via crystal_toolkit (pyproject.toml) six==1.16.0 # via # asttokens # bleach - # latexcodec # pybtex # python-dateutil # retrying # rfc3339-validator -sniffio==1.3.0 +smart-open==7.0.4 + # via mp-api +sniffio==1.3.1 # via anyio -soupsieve==2.4.1 +soupsieve==2.6 # via beautifulsoup4 -spglib==2.0.2 - # via - # emmet-core - # pymatgen -stack-data==0.6.2 +spglib==2.5.0 + # via pymatgen +sshtunnel==0.4.0 + # via maggma +stack-data==0.6.3 # via ipython -sympy==1.12 +sympy==1.13.2 # via pymatgen tabulate==0.9.0 # via pymatgen -tenacity==8.2.2 +tenacity==9.0.0 # via plotly -terminado==0.17.1 +terminado==0.18.1 # via # jupyter-server # jupyter-server-terminals - # nbclassic # notebook -threadpoolctl==3.2.0 +threadpoolctl==3.5.0 # via scikit-learn -tifffile==2023.7.10 +tifffile==2024.8.30 # via scikit-image -tinycss2==1.2.1 +tinycss2==1.3.0 # via nbconvert tomli==2.0.1 # via jupyterlab -tornado==6.3.2 +tornado==6.4.1 # via # ipykernel # jupyter-client # jupyter-server # jupyterlab - # nbclassic # notebook # terminado -tqdm==4.65.0 - # via pymatgen -traitlets==5.9.0 +tqdm==4.66.5 + # via + # maggma + # pymatgen +traitlets==5.14.3 # via # comm # ipykernel @@ -468,49 +529,60 @@ traitlets==5.9.0 # jupyter-events # jupyter-server # matplotlib-inline - # nbclassic # nbclient # nbconvert # nbformat # notebook -typing-extensions==4.7.1 +types-python-dateutil==2.9.0.20240821 + # via arrow +typing-extensions==4.12.2 # via + # aioitertools + # aiosqlite + # anyio # dash # emmet-core # ipython # mp-api # pydantic -tzdata==2023.3 + # pydantic-core + # pydash + # spglib +tzdata==2024.1 # via pandas -uncertainties==3.1.7 +uncertainties==3.2.2 # via pymatgen uri-template==1.3.0 # via jsonschema -urllib3==2.0.3 - # via requests -wcwidth==0.2.6 +urllib3==1.26.20 + # via + # botocore + # requests +wcwidth==0.2.13 # via prompt-toolkit -webcolors==1.13 +webcolors==24.8.0 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # jsonschema webencodings==0.5.1 # via # bleach # tinycss2 -websocket-client==1.6.1 +websocket-client==1.8.0 # via jupyter-server -werkzeug==2.2.3 +werkzeug==3.0.4 # via # dash # flask -y-py==0.5.9 +wrapt==1.16.0 + # via smart-open +y-py==0.6.2 # via # jupyter-ydoc # ypy-websocket -ypy-websocket==0.8.2 +ypy-websocket==0.8.4 # via jupyter-server-ydoc -zipp==3.16.2 +zipp==3.20.1 # via # importlib-metadata # importlib-resources diff --git a/requirements/ubuntu-latest_py3.9_extras.txt b/requirements/ubuntu-latest_py3.9_extras.txt index d7ee60da..82699239 100644 --- a/requirements/ubuntu-latest_py3.9_extras.txt +++ b/requirements/ubuntu-latest_py3.9_extras.txt @@ -6,41 +6,42 @@ # aiofiles==22.1.0 # via ypy-websocket -aiohttp==3.8.4 +aiohappyeyeballs==2.4.0 + # via aiohttp +aiohttp==3.10.5 # via dephell +aioitertools==0.12.0 + # via maggma aiosignal==1.3.1 # via aiohttp -aiosqlite==0.19.0 +aiosqlite==0.20.0 # via ypy-websocket -alabaster==0.7.13 +alabaster==0.7.16 # via sphinx -ansi2html==1.8.0 - # via dash -anyio==3.7.1 - # via - # httpcore - # jupyter-server -argon2-cffi==21.3.0 +annotated-types==0.7.0 + # via pydantic +anyio==4.4.0 + # via jupyter-server +argon2-cffi==23.1.0 # via # jupyter-server - # nbclassic # notebook argon2-cffi-bindings==21.2.0 # via argon2-cffi -arrow==1.2.3 +arrow==1.3.0 # via isoduration -ase==3.22.1 +ase==3.23.0 # via # boltztrap2 # dscribe # hiphive -asttokens==2.2.1 +asttokens==2.4.1 # via stack-data -async-timeout==4.0.2 +async-timeout==4.0.3 # via # aiohttp # redis -attrs==23.1.0 +attrs==24.2.0 # via # aiohttp # dephell @@ -52,106 +53,121 @@ attrs==23.1.0 # dephell-pythons # dephell-shells # dephell-venvs + # jsonlines # jsonschema # outcome # referencing # trio -babel==2.12.1 +babel==2.16.0 # via # jupyterlab-server # sphinx -backcall==0.2.0 - # via ipython -beautifulsoup4==4.12.2 +bcrypt==4.2.0 + # via paramiko +beautifulsoup4==4.12.3 # via # dash # gdown # nbconvert -black==23.7.0 - # via crystal-toolkit (pyproject.toml) -bleach==6.0.0 +black==24.8.0 + # via crystal_toolkit (pyproject.toml) +bleach==6.1.0 # via nbconvert -boltztrap2==22.12.1 +blinker==1.8.2 + # via flask +boltztrap2==24.7.2 # via ifermi +boto3==1.35.10 + # via maggma +botocore==1.35.10 + # via + # boto3 + # s3transfer cachelib==0.9.0 # via flask-caching -cerberus==1.3.4 +cerberus==1.3.5 # via dephell -certifi==2023.5.7 +certifi==2024.8.30 # via # dephell - # httpcore # netcdf4 # requests # urllib3 -cffi==1.15.1 +cffi==1.17.0 # via # argon2-cffi-bindings # cryptography -cfgv==3.3.1 + # pynacl +cfgv==3.4.0 # via pre-commit -cftime==1.6.2 +cftime==1.6.4 # via netcdf4 -charset-normalizer==3.2.0 - # via - # aiohttp - # requests -click==8.1.5 +charset-normalizer==3.3.2 + # via requests +click==8.1.7 # via # black # dask # distributed # flask # ifermi -cloudpickle==2.2.1 +cloudpickle==3.0.0 # via # dask # distributed -comm==0.1.3 +colorspacious==1.1.2 + # via py4dstem +comm==0.2.2 # via ipykernel commonmark==0.9.1 # via recommonmark -contourpy==1.1.0 +contourpy==1.3.0 # via matplotlib -cryptography==41.0.2 +cryptography==43.0.0 # via + # dash + # paramiko # pyopenssl # urllib3 crystaltoolkit-extension==0.6.0 - # via crystal-toolkit (pyproject.toml) -cycler==0.11.0 + # via crystal_toolkit (pyproject.toml) +cycler==0.12.1 # via matplotlib -dash[testing]==2.11.1 +cython==3.0.11 + # via boltztrap2 +dash[testing]==2.17.1 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # dash-extensions # dash-vtk dash-core-components==2.0.0 # via dash -dash-extensions==1.0.1 - # via crystal-toolkit (pyproject.toml) +dash-extensions==1.0.18 + # via crystal_toolkit (pyproject.toml) dash-html-components==2.0.0 # via dash -dash-mp-components==0.4.36 - # via crystal-toolkit (pyproject.toml) +dash-mp-components==0.4.45 + # via crystal_toolkit (pyproject.toml) dash-table==5.0.0 # via dash dash-testing-stub==0.0.2 # via dash dash-vtk==0.0.9 - # via crystal-toolkit (pyproject.toml) -dask==2023.7.0 + # via crystal_toolkit (pyproject.toml) +dask==2024.8.0 # via # distributed # py4dstem -debugpy==1.6.7 +dataclass-wizard==0.22.3 + # via dash-extensions +debugpy==1.8.5 # via ipykernel decorator==5.1.1 # via ipython defusedxml==0.7.1 # via nbconvert dephell==0.8.3 - # via crystal-toolkit (pyproject.toml) + # via crystal_toolkit (pyproject.toml) dephell-archive==0.1.7 # via dephell dephell-argparse==0.1.3 @@ -183,97 +199,99 @@ dephell-venvs==0.1.18 # via dephell dephell-versioning==0.1.2 # via dephell -dill==0.3.6 +dill==0.3.8 # via # multiprocess # py4dstem -distlib==0.3.7 +distlib==0.3.8 # via virtualenv -distributed==2023.7.0 +distributed==2024.8.0 # via py4dstem -dnspython==2.4.0 - # via pymongo -docutils==0.18.1 +dnspython==2.6.1 + # via + # maggma + # pymongo +docutils==0.20.1 # via # m2r # recommonmark # sphinx # sphinx-rtd-theme -dscribe==2.0.0 - # via crystal-toolkit (pyproject.toml) -editorconfig==0.12.3 +dscribe==2.1.1 + # via crystal_toolkit (pyproject.toml) +editorconfig==0.12.4 # via jsbeautifier -emdfile==0.0.8 +emdfile==0.0.15 # via py4dstem -emmet-core==0.60.1 +emmet-core==0.84.2rc6 # via mp-api entrypoints==0.4 - # via nbconvert -exceptiongroup==1.1.2 + # via + # jupyter-client + # nbconvert +exceptiongroup==1.2.2 # via # anyio + # ipython # pytest # trio # trio-websocket -executing==1.2.0 +executing==2.1.0 # via stack-data -fastjsonschema==2.17.1 +fastjsonschema==2.20.0 # via nbformat -filelock==3.12.2 +filelock==3.15.4 # via # gdown # virtualenv -flask==2.2.5 +flask==3.0.3 # via # dash # flask-caching -flask-caching==2.0.2 +flask-caching==2.3.0 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # dash-extensions -fonttools==4.41.0 +fonttools==4.53.1 # via matplotlib fqdn==1.5.1 # via jsonschema -frozendict==2.3.8 - # via crystal-toolkit (pyproject.toml) -frozenlist==1.4.0 +frozendict==2.4.4 + # via crystal_toolkit (pyproject.toml) +frozenlist==1.4.1 # via # aiohttp # aiosignal -fsspec==2023.6.0 +fsspec==2024.6.1 # via dask -future==0.18.3 - # via - # matminer - # uncertainties -gdown==4.7.1 +gdown==5.2.0 # via py4dstem -gevent==23.7.0 +gevent==24.2.1 # via gunicorn -greenlet==2.0.2 - # via gevent -gunicorn[gevent]==21.0.1 - # via crystal-toolkit (pyproject.toml) -h11==0.14.0 +greenlet==3.0.3 # via - # httpcore - # wsproto -h5py==3.9.0 + # gevent + # playwright +gunicorn[gevent]==23.0.0 + # via crystal_toolkit (pyproject.toml) +h11==0.14.0 + # via wsproto +h5py==3.11.0 # via # emdfile + # hdf5plugin # hiphive # ncempy # py4dstem -habanero==1.2.3 - # via crystal-toolkit (pyproject.toml) -hiphive==1.1 - # via crystal-toolkit (pyproject.toml) -httpcore==0.17.3 - # via dnspython -identify==2.5.24 +habanero==1.2.6 + # via crystal_toolkit (pyproject.toml) +hdf5plugin==5.0.0 + # via py4dstem +hiphive==1.3.1 + # via crystal_toolkit (pyproject.toml) +identify==2.6.0 # via pre-commit -idna==3.4 +idna==3.8 # via # anyio # jsonschema @@ -281,154 +299,157 @@ idna==3.4 # trio # urllib3 # yarl -ifermi==0.3.1 - # via crystal-toolkit (pyproject.toml) -imageio==2.31.1 +ifermi==0.3.5 + # via crystal_toolkit (pyproject.toml) +imageio==2.35.1 # via scikit-image imagesize==1.4.1 # via sphinx -importlib-metadata==6.8.0 +importlib-metadata==8.4.0 # via + # dash # dask # flask - # jupyter-client # jupyter-ydoc # jupyterlab-server # sphinx -importlib-resources==6.0.0 - # via matplotlib -inflect==7.0.0 + # typeguard +importlib-resources==6.4.4 + # via + # matplotlib + # spglib +inflect==7.3.1 # via robocrys iniconfig==2.0.0 # via pytest -ipykernel==6.24.0 +ipykernel==6.29.5 # via - # ipywidgets # nbclassic # notebook -ipython==8.14.0 +ipython==8.18.1 # via # ipykernel - # ipywidgets # jupyterlab ipython-genutils==0.2.0 # via # nbclassic # notebook -ipywidgets==8.0.7 - # via py4dstem isoduration==20.11.0 # via jsonschema -itsdangerous==2.1.2 +itsdangerous==2.2.0 # via flask -jedi==0.18.2 +jedi==0.19.1 # via ipython -jinja2==3.1.2 +jinja2==3.1.4 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # dephell # distributed # flask # jupyter-server # jupyterlab # jupyterlab-server - # nbclassic # nbconvert # notebook # sphinx -joblib==1.3.1 +jmespath==1.0.1 + # via + # boto3 + # botocore +joblib==1.4.2 # via # dscribe # pymatgen # scikit-learn -jsbeautifier==1.14.8 + # scikit-optimize +jsbeautifier==1.15.1 # via dash-extensions -json5==0.9.14 +json5==0.9.25 # via jupyterlab-server -jsonpointer==2.4 +jsonlines==4.0.0 + # via maggma +jsonpointer==3.0.0 # via jsonschema -jsonschema[format-nongpl]==4.18.3 +jsonschema[format-nongpl]==4.23.0 # via # jupyter-events # jupyterlab-server + # maggma # nbformat -jsonschema-specifications==2023.6.1 +jsonschema-specifications==2023.12.1 # via jsonschema -jupyter-client==8.3.0 +jupyter-client==7.4.9 # via # ipykernel # jupyter-server - # nbclassic # nbclient # notebook -jupyter-core==5.3.1 +jupyter-core==5.7.2 # via # ipykernel # jupyter-client # jupyter-server # jupyterlab - # nbclassic # nbclient # nbconvert # nbformat # notebook -jupyter-events==0.6.3 +jupyter-events==0.10.0 # via # jupyter-server # jupyter-server-fileid -jupyter-server==2.7.0 +jupyter-server==2.14.2 # via # jupyter-server-fileid # jupyterlab # jupyterlab-server - # nbclassic # notebook-shim -jupyter-server-fileid==0.9.0 +jupyter-server-fileid==0.9.2 # via jupyter-server-ydoc -jupyter-server-terminals==0.4.4 +jupyter-server-terminals==0.5.3 # via jupyter-server jupyter-server-ydoc==0.8.0 # via jupyterlab -jupyter-ydoc==0.2.4 +jupyter-ydoc==0.2.5 # via # jupyter-server-ydoc # jupyterlab -jupyterlab==3.6.5 +jupyterlab==3.6.8 # via crystaltoolkit-extension -jupyterlab-pygments==0.2.2 +jupyterlab-pygments==0.3.0 # via nbconvert -jupyterlab-server==2.23.0 +jupyterlab-server==2.27.3 # via jupyterlab -jupyterlab-widgets==3.0.8 - # via ipywidgets kaleido==0.2.1 - # via crystal-toolkit (pyproject.toml) -kiwisolver==1.4.4 + # via crystal_toolkit (pyproject.toml) +kiwisolver==1.4.6 # via matplotlib -latexcodec==2.0.1 +latexcodec==3.0.0 # via pybtex -lazy-loader==0.3 +lazy-loader==0.4 # via scikit-image -llvmlite==0.40.1 +llvmlite==0.43.0 # via numba locket==1.0.0 # via # distributed # partd -lxml==4.9.3 +lxml==5.3.0 # via # dash # nbconvert m2r==0.3.1 # via dephell -markupsafe==2.1.3 +maggma==0.69.3 + # via mp-api +markupsafe==2.1.5 # via # jinja2 # nbconvert # werkzeug -matminer==0.9.0 +matminer==0.9.2 # via robocrys -matplotlib==3.7.2 +matplotlib==3.9.2 # via # ase # boltztrap2 @@ -437,7 +458,7 @@ matplotlib==3.7.2 # py4dstem # pymatgen # vtk -matplotlib-inline==0.1.6 +matplotlib-inline==0.1.7 # via # ipykernel # ipython @@ -447,88 +468,100 @@ mistune==0.8.4 # via # m2r # nbconvert -monty==2023.5.8 +mongomock==4.1.2 + # via maggma +monty==2024.7.30 # via # emmet-core # ifermi + # maggma # matminer # mp-api # pymatgen # robocrys -more-itertools==9.1.0 - # via dash-extensions -mp-api==0.33.3 - # via pymatgen +more-itertools==10.4.0 + # via + # dash-extensions + # inflect +mp-api==0.42.1 + # via + # crystal_toolkit (pyproject.toml) + # robocrys +mpire==2.10.2 + # via py4dstem mpmath==1.3.0 # via sympy -msgpack==1.0.5 +msgpack==1.0.8 # via # distributed + # maggma # mp-api -multidict==6.0.4 +multidict==6.0.5 # via # aiohttp # yarl -multiprocess==0.70.14 +multiprocess==0.70.16 # via dash mypy-extensions==1.0.0 # via black -nbclassic==1.0.0 +nbclassic==1.1.0 # via # jupyterlab # notebook -nbclient==0.8.0 +nbclient==0.10.0 # via nbconvert nbconvert==6.5.4 # via # jupyter-server - # nbclassic # notebook -nbformat==5.9.1 +nbformat==5.10.4 # via # jupyter-server - # nbclassic # nbclient # nbconvert # notebook -ncempy==1.10.0 +ncempy==1.11.3 # via py4dstem -nest-asyncio==1.5.6 +nest-asyncio==1.6.0 # via # dash # ipykernel + # jupyter-client # nbclassic # notebook -netcdf4==1.6.4 +netcdf4==1.7.1.post2 # via boltztrap2 -networkx==3.1 +networkx==3.2.1 # via # ifermi # pymatgen # robocrys # scikit-image -nodeenv==1.8.0 +nodeenv==1.9.1 # via pre-commit -notebook==6.5.4 +notebook==6.5.7 # via jupyterlab -notebook-shim==0.2.3 +notebook-shim==0.2.4 # via nbclassic -numba==0.57.1 +numba==0.60.0 # via # hiphive # sparse -numpy==1.21.6 +numpy==1.26.4 # via # ase # boltztrap2 # cftime + # colorspacious # contourpy # dscribe # emdfile + # emmet-core # h5py # hiphive # ifermi # imageio + # maggma # matminer # matplotlib # meshcut @@ -539,11 +572,12 @@ numpy==1.21.6 # pandas # py4dstem # pyfftw + # pylops # pymatgen - # pywavelets # robocrys # scikit-image # scikit-learn + # scikit-optimize # scipy # shapely # sparse @@ -551,13 +585,15 @@ numpy==1.21.6 # tifffile # trainstation # trimesh -numpy-stl==3.0.1 +numpy-stl==3.1.2 # via meshcut -outcome==1.2.0 +orjson==3.10.7 + # via maggma +outcome==1.3.0.post0 # via trio -overrides==7.3.1 +overrides==7.7.0 # via jupyter-server -packaging==23.1 +packaging==24.1 # via # black # dask @@ -572,62 +608,69 @@ packaging==23.1 # jupyter-server # jupyterlab # jupyterlab-server + # lazy-loader # matplotlib + # mongomock # nbconvert # plotly # pytest # scikit-image + # scikit-optimize # sphinx palettable==3.3.3 # via pymatgen -pandas==1.5.3 +pandas==2.2.2 # via # hiphive + # maggma # matminer # pymatgen -pandocfilters==1.5.0 +pandocfilters==1.5.1 # via nbconvert -parso==0.8.3 +paramiko==3.4.1 + # via sshtunnel +parso==0.8.4 # via jedi -partd==1.4.0 +partd==1.4.2 # via dask -pathspec==0.11.1 +pathspec==0.12.1 # via black percy==2.0.2 # via dash -pexpect==4.8.0 +pexpect==4.9.0 # via # dephell-shells # ipython -pickleshare==0.7.5 - # via ipython -pillow==10.0.0 +pillow==10.4.0 # via # imageio # matplotlib # scikit-image -platformdirs==3.9.1 +platformdirs==4.2.2 # via # black # jupyter-core # virtualenv -plotly==5.15.0 +playwright==1.46.0 + # via + # crystal_toolkit (pyproject.toml) + # pytest-playwright +plotly==5.24.0 # via # dash # ifermi # pymatgen -pluggy==1.2.0 +pluggy==1.5.0 # via pytest -pre-commit==3.3.3 - # via crystal-toolkit (pyproject.toml) -prometheus-client==0.17.1 +pre-commit==3.8.0 + # via crystal_toolkit (pyproject.toml) +prometheus-client==0.20.0 # via # jupyter-server - # nbclassic # notebook -prompt-toolkit==3.0.39 +prompt-toolkit==3.0.47 # via ipython -psutil==5.9.5 +psutil==6.0.0 # via # dash # distributed @@ -639,90 +682,123 @@ ptyprocess==0.7.0 # terminado pubchempy==1.0.4 # via robocrys -pure-eval==0.2.2 +pure-eval==0.2.3 # via stack-data -py4dstem==0.14.2 - # via crystal-toolkit (pyproject.toml) -pybind11==2.11.1 - # via dscribe +py4dstem==0.14.8 + # via crystal_toolkit (pyproject.toml) +pyaml==24.7.0 + # via scikit-optimize pybtex==0.24.0 # via # emmet-core # pymatgen # robocrys -pycparser==2.21 +pycparser==2.22 # via cffi -pydantic==1.10.11 +pydantic==2.8.2 # via + # dash-extensions # emmet-core - # inflect - # pymatgen -pyfftw==0.13.1 + # maggma + # pydantic-settings +pydantic-core==2.20.1 + # via pydantic +pydantic-settings==2.4.0 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) + # emmet-core + # maggma +pydash==8.0.3 + # via maggma +pyee==11.1.0 + # via playwright +pyfftw==0.14.0 + # via + # crystal_toolkit (pyproject.toml) # ifermi -pygments==2.15.1 +pygments==2.18.0 # via # ipython + # mpire # nbconvert # sphinx -pymatgen==2023.7.17 +pylops==2.3.1 + # via py4dstem +pymatgen==2024.8.9 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # emmet-core # ifermi # matminer # mp-api # robocrys -pymongo==4.4.1 - # via matminer -pyopenssl==23.2.0 +pymongo==4.8.0 + # via + # maggma + # matminer +pynacl==1.5.0 + # via paramiko +pyopenssl==24.2.1 # via urllib3 -pyparsing==3.0.9 +pyparsing==3.1.4 # via matplotlib pysocks==1.7.1 # via # requests # urllib3 -pytest==7.4.0 - # via dash -python-dateutil==2.8.2 +pytest==8.3.2 + # via + # crystal_toolkit (pyproject.toml) + # dash + # pytest-base-url + # pytest-playwright +pytest-base-url==2.1.0 + # via pytest-playwright +pytest-playwright==0.5.1 + # via crystal_toolkit (pyproject.toml) +python-dateutil==2.9.0.post0 # via # arrow + # botocore # jupyter-client + # maggma # matplotlib # pandas +python-dotenv==1.0.1 + # via pydantic-settings python-json-logger==2.0.7 # via jupyter-events -python-utils==3.7.0 +python-slugify==8.0.4 + # via pytest-playwright +python-utils==3.8.2 # via numpy-stl -pytz==2023.3 +pytz==2024.1 # via pandas -pywavelets==1.4.1 - # via scikit-image -pyyaml==6.0.1 +pyyaml==6.0.2 # via # dask # distributed # jupyter-events # pre-commit + # pyaml # pybtex -pyzmq==25.1.0 +pyzmq==26.2.0 # via # ipykernel # jupyter-client # jupyter-server - # nbclassic + # maggma # notebook recommonmark==0.7.1 - # via crystal-toolkit (pyproject.toml) -redis==4.6.0 - # via crystal-toolkit (pyproject.toml) -referencing==0.29.1 + # via crystal_toolkit (pyproject.toml) +redis==5.0.8 + # via crystal_toolkit (pyproject.toml) +referencing==0.35.1 # via # jsonschema # jsonschema-specifications -requests[security,socks]==2.31.0 + # jupyter-events +requests[security,socks]==2.32.3 # via # dash # dephell @@ -736,6 +812,7 @@ requests[security,socks]==2.31.0 # mp-api # percy # pymatgen + # pytest-base-url # sphinx retrying==1.3.4 # via dash @@ -747,76 +824,84 @@ rfc3986-validator==0.1.1 # via # jsonschema # jupyter-events -robocrys==0.2.8 - # via crystal-toolkit (pyproject.toml) -rpds-py==0.8.11 +robocrys==0.2.9 + # via crystal_toolkit (pyproject.toml) +rpds-py==0.20.0 # via # jsonschema # referencing -ruamel-yaml==0.17.32 +ruamel-yaml==0.18.6 # via # dephell + # maggma # pymatgen # robocrys -ruamel-yaml-clib==0.2.7 +ruamel-yaml-clib==0.2.8 # via ruamel-yaml -scikit-image==0.21.0 +ruff==0.4.10 + # via dash-extensions +s3transfer==0.10.2 + # via boto3 +scikit-image==0.24.0 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # ifermi # py4dstem -scikit-learn==1.3.0 +scikit-learn==1.5.1 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # dscribe # hiphive # matminer # py4dstem + # scikit-optimize # trainstation -scipy==1.11.1 +scikit-optimize==0.10.2 + # via py4dstem +scipy==1.13.1 # via # ase # boltztrap2 # dscribe - # emdfile # hiphive # ifermi # meshcut # ncempy # py4dstem + # pylops # pymatgen # robocrys # scikit-image # scikit-learn + # scikit-optimize # sparse # trainstation selenium==4.2.0 # via dash -send2trash==1.8.2 +send2trash==1.8.3 # via # jupyter-server - # nbclassic # notebook -shapely==2.0.1 - # via crystal-toolkit (pyproject.toml) -shellingham==1.5.0.post1 +sentinels==1.0.0 + # via mongomock +shapely==2.0.6 + # via crystal_toolkit (pyproject.toml) +shellingham==1.5.4 # via dephell-shells six==1.16.0 # via # asttokens # bleach - # gdown # jsbeautifier - # latexcodec # pybtex # python-dateutil # retrying # rfc3339-validator -sniffio==1.3.0 +smart-open==7.0.4 + # via mp-api +sniffio==1.3.1 # via # anyio - # dnspython - # httpcore # trio snowballstemmer==2.2.0 # via sphinx @@ -824,42 +909,43 @@ sortedcontainers==2.4.0 # via # distributed # trio -soupsieve==2.4.1 +soupsieve==2.6 # via beautifulsoup4 -sparse==0.14.0 +sparse==0.15.4 # via dscribe -spglib==2.0.2 +spglib==2.5.0 # via # boltztrap2 - # emmet-core # hiphive # ifermi # pymatgen # robocrys -sphinx==6.2.1 +sphinx==7.4.7 # via # recommonmark # sphinx-rtd-theme # sphinxcontrib-jquery -sphinx-rtd-theme==1.2.2 - # via crystal-toolkit (pyproject.toml) -sphinxcontrib-applehelp==1.0.4 +sphinx-rtd-theme==2.0.0 + # via crystal_toolkit (pyproject.toml) +sphinxcontrib-applehelp==2.0.0 # via sphinx -sphinxcontrib-devhelp==1.0.2 +sphinxcontrib-devhelp==2.0.0 # via sphinx -sphinxcontrib-htmlhelp==2.0.1 +sphinxcontrib-htmlhelp==2.1.0 # via sphinx sphinxcontrib-jquery==4.1 # via sphinx-rtd-theme sphinxcontrib-jsmath==1.0.1 # via sphinx -sphinxcontrib-qthelp==1.0.3 +sphinxcontrib-qthelp==2.0.0 # via sphinx -sphinxcontrib-serializinghtml==1.1.5 +sphinxcontrib-serializinghtml==2.0.0 # via sphinx -stack-data==0.6.2 +sshtunnel==0.4.0 + # via maggma +stack-data==0.6.3 # via ipython -sympy==1.12 +sympy==1.13.2 # via # hiphive # matminer @@ -868,146 +954,164 @@ tabulate==0.9.0 # via # ifermi # pymatgen -tblib==2.0.0 +tblib==3.0.0 # via distributed -tenacity==8.2.2 +tenacity==9.0.0 # via plotly termcolor==2.3.0 # via yaspin -terminado==0.17.1 +terminado==0.18.1 # via # jupyter-server # jupyter-server-terminals - # nbclassic # notebook -threadpoolctl==3.2.0 - # via scikit-learn -tifffile==2023.7.10 +text-unidecode==1.3 + # via python-slugify +threadpoolctl==3.5.0 + # via + # py4dstem + # scikit-learn +tifffile==2024.8.30 # via scikit-image -tinycss2==1.2.1 +tinycss2==1.3.0 # via nbconvert tomli==2.0.1 # via # black # jupyterlab # pytest -tomlkit==0.11.8 + # sphinx +tomlkit==0.13.2 # via dephell -toolz==0.12.0 +toolz==0.12.1 # via # dask # distributed # partd -tornado==6.3.2 +tornado==6.4.1 # via # distributed # ipykernel # jupyter-client # jupyter-server # jupyterlab - # nbclassic # notebook # terminado -tqdm==4.65.0 +tqdm==4.66.5 # via # emdfile # gdown # habanero + # maggma # matminer + # mpire # py4dstem # pymatgen -trainstation==1.0 +trainstation==1.1 # via hiphive -traitlets==5.9.0 +traitlets==5.14.3 # via # comm # ipykernel # ipython - # ipywidgets # jupyter-client # jupyter-core # jupyter-events # jupyter-server # matplotlib-inline - # nbclassic # nbclient # nbconvert # nbformat # notebook -trimesh==3.22.4 +trimesh==4.4.8 # via ifermi -trio==0.22.2 +trio==0.26.2 # via # selenium # trio-websocket -trio-websocket==0.10.3 +trio-websocket==0.11.1 # via selenium -typing-extensions==4.7.1 - # via +typeguard==4.3.0 + # via inflect +types-python-dateutil==2.9.0.20240821 + # via arrow +typing-extensions==4.12.2 + # via + # aioitertools + # aiosqlite + # anyio # black # dash + # dataclass-wizard # emmet-core - # inflect # ipython # mp-api # pydantic + # pydantic-core + # pydash + # pyee # python-utils -uncertainties==3.1.7 + # spglib + # typeguard +tzdata==2024.1 + # via pandas +uncertainties==3.2.2 # via pymatgen uri-template==1.3.0 # via jsonschema -urllib3[secure,socks]==1.26.16 +urllib3[secure,socks]==1.26.20 # via + # botocore # distributed # requests # selenium urllib3-secure-extra==0.1.0 # via urllib3 -virtualenv==20.24.0 +virtualenv==20.26.3 # via pre-commit -vtk==9.2.6 +vtk==9.3.1 # via dash-vtk -waitress==2.1.2 +waitress==3.0.0 # via dash -wcwidth==0.2.6 +wcwidth==0.2.13 # via prompt-toolkit -webcolors==1.13 +webcolors==24.8.0 # via - # crystal-toolkit (pyproject.toml) + # crystal_toolkit (pyproject.toml) # jsonschema webencodings==0.5.1 # via # bleach # tinycss2 -websocket-client==1.6.1 +websocket-client==1.8.0 # via jupyter-server -werkzeug==2.2.3 +werkzeug==3.0.4 # via # dash # flask -widgetsnbextension==4.0.8 - # via ipywidgets +wrapt==1.16.0 + # via smart-open wsproto==1.2.0 # via trio-websocket -y-py==0.5.9 +y-py==0.6.2 # via # jupyter-ydoc # ypy-websocket -yarl==1.9.2 +yarl==1.9.7 # via aiohttp -yaspin==2.3.0 +yaspin==3.0.2 # via dephell -ypy-websocket==0.8.2 +ypy-websocket==0.8.4 # via jupyter-server-ydoc zict==3.0.0 # via distributed -zipp==3.16.2 +zipp==3.20.1 # via # importlib-metadata # importlib-resources zope-event==5.0 # via gevent -zope-interface==6.0 +zope-interface==7.0.3 # via gevent # The following packages are considered to be unsafe in a requirements file: diff --git a/crystal_toolkit/core/tests/__init__.py b/tests/asy_test/core/__init__.py similarity index 100% rename from crystal_toolkit/core/tests/__init__.py rename to tests/asy_test/core/__init__.py diff --git a/tests/asy_test/core/test_jupyter.py b/tests/asy_test/core/test_jupyter.py new file mode 100644 index 00000000..f4f17f74 --- /dev/null +++ b/tests/asy_test/core/test_jupyter.py @@ -0,0 +1,35 @@ +import plotly.express as px +from monty.json import MSONable + +from crystal_toolkit.core.jupyter import patch_msonable +from crystal_toolkit.core.scene import Scene + + +def test_patch_msonable(): + patch_msonable() + + class GetSceneClass(MSONable): + def get_scene(self): + return Scene(name="test_scene") + + class GetPlotClass(MSONable): + def get_plot(self): + """Dummy plotly object""" + return px.scatter(x=[1, 2, 3], y=[1, 2, 3]) + + class AsDictClass(MSONable): + def __init__(self, a: int) -> None: + self.a = a + + # The output of _ipython_display_ is None + # However, the logic for the creating the different output + # dictionaries should be executed so the following tests + # are still valuable. + as_dict_class = AsDictClass(1) + assert as_dict_class._ipython_display_() is None + + get_scene_class = GetSceneClass() + assert get_scene_class._ipython_display_() is None + + get_plot_class = GetPlotClass() + assert get_plot_class._ipython_display_() is None diff --git a/crystal_toolkit/core/tests/test_legend.py b/tests/asy_test/core/test_legend.py similarity index 94% rename from crystal_toolkit/core/tests/test_legend.py rename to tests/asy_test/core/test_legend.py index f13eb451..ffd6e6d3 100644 --- a/crystal_toolkit/core/tests/test_legend.py +++ b/tests/asy_test/core/test_legend.py @@ -18,13 +18,13 @@ def setup_method(self, method): ) self.site0 = self.struct[0] - self.sp0 = list(self.site0.species)[0] + self.sp0 = next(iter(self.site0.species)) self.site1 = self.struct[1] - self.sp1 = list(self.site1.species)[0] + self.sp1 = next(iter(self.site1.species)) self.site2 = self.struct[2] - self.sp2 = list(self.site2.species)[0] + self.sp2 = next(iter(self.site2.species)) self.struct_disordered = Structure( Lattice.cubic(5), @@ -34,7 +34,7 @@ def setup_method(self, method): ) self.site_d = self.struct_disordered[2] - self.site_d_sp0 = list(self.site_d.species)[0] + self.site_d_sp0 = next(iter(self.site_d.species)) self.site_d_sp1 = list(self.site_d.species)[1] self.struct_manual = Structure( @@ -86,7 +86,7 @@ def test_get_color(self): assert color == "#b30326" color = legend.get_color(self.sp1, site=self.site1) - assert color == "#dddcdb" + assert color == "#000000" color = legend.get_color(self.sp2, site=self.site2) assert color == "#7b9ef8" @@ -94,7 +94,7 @@ def test_get_color(self): assert legend.get_legend()["colors"] == { "#7b9ef8": "-3.00", "#b30326": "5.00", - "#dddcdb": "0.00", + "#000000": "0.00", } # test accessible @@ -144,7 +144,7 @@ def test_get_color(self): legend = Legend(self.struct_manual) assert legend.get_legend()["colors"] == { - "#0000ff": "O2-", + "#0000ff": "O²⁻", "#00ff00": "In", "#ff0000": "H", }