From 3ac873830954c1e969444a8c58b1c4b85bae8442 Mon Sep 17 00:00:00 2001 From: esoteric-ephemera Date: Tue, 24 Jun 2025 10:50:31 -0700 Subject: [PATCH 1/8] ensure that MPDataDoc picks up on model-excluded fields --- mp_api/client/core/utils.py | 13 +++++++++---- mp_api/client/routes/materials/phonon.py | 4 ++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/mp_api/client/core/utils.py b/mp_api/client/core/utils.py index fb25221ff..1bba91954 100644 --- a/mp_api/client/core/utils.py +++ b/mp_api/client/core/utils.py @@ -71,9 +71,7 @@ def api_sanitize( for model in models: model_fields_to_leave = {f[1] for f in fields_tuples if model.__name__ == f[0]} - for name in model.model_fields: - field = model.model_fields[name] - field_json_extra = field.json_schema_extra + for name, field in model.model_fields.items(): field_type = field.annotation if field_type is not None and allow_dict_msonable: @@ -88,7 +86,14 @@ def api_sanitize( new_field = FieldInfo.from_annotated_attribute( Optional[field_type], None ) - new_field.json_schema_extra = field_json_extra or {} + + for attr in ( + "json_schema_extra", + "exclude", + ): + if (val := getattr(field, attr)) is not None: + setattr(new_field, attr, val) + model.model_fields[name] = new_field model.model_rebuild(force=True) diff --git a/mp_api/client/routes/materials/phonon.py b/mp_api/client/routes/materials/phonon.py index f9d9ac9a5..4ce52950e 100644 --- a/mp_api/client/routes/materials/phonon.py +++ b/mp_api/client/routes/materials/phonon.py @@ -1,11 +1,11 @@ from __future__ import annotations import json -import numpy as np from collections import defaultdict +import numpy as np +from emmet.core.phonon import PhononBS, PhononBSDOSDoc, PhononDOS from monty.json import MontyDecoder -from emmet.core.phonon import PhononBSDOSDoc, PhononBS, PhononDOS from mp_api.client.core import BaseRester, MPRestError from mp_api.client.core.utils import validate_ids From df5e52e08fbb1c016b5c4b81fff7372ac64f6547 Mon Sep 17 00:00:00 2001 From: esoteric-ephemera Date: Fri, 27 Jun 2025 13:51:40 -0700 Subject: [PATCH 2/8] add user_entries to pourbaix --- mp_api/client/mprester.py | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/mp_api/client/mprester.py b/mp_api/client/mprester.py index 6a000c4e0..5d47d3ebb 100644 --- a/mp_api/client/mprester.py +++ b/mp_api/client/mprester.py @@ -783,7 +783,8 @@ def get_entries( def get_pourbaix_entries( self, - chemsys: str | list, + chemsys: str | list | None = None, + user_entries: list[ComputedEntry | ComputedStructureEntry] | None = None, solid_compat="MaterialsProject2020Compatibility", use_gibbs: Literal[300] | None = None, ): @@ -791,9 +792,14 @@ def get_pourbaix_entries( a Pourbaix diagram from the rest interface. Args: - chemsys (str or [str]): Chemical system string comprising element + chemsys (str or [str] or None): Chemical system string comprising element symbols separated by dashes, e.g., "Li-Fe-O" or List of element symbols, e.g., ["Li", "Fe", "O"]. + Does not need to be set if user_entries is set. + user_entries : list of Computed(Structure)Entry or None + Can be specified instead of chemsys to allow for adding extra + calculation data to the Pourbaix Diagram. + If this is set, the chemsys will be inferred from user_entries. solid_compat: Compatibility scheme used to pre-process solid DFT energies prior to applying aqueous energy adjustments. May be passed as a class (e.g. MaterialsProject2020Compatibility) or an instance @@ -816,6 +822,23 @@ def get_pourbaix_entries( ) from pymatgen.entries.computed_entries import ComputedEntry + if not chemsys and not user_entries: + raise ValueError( + "You must supply either a chemical system, or a list of " + "Computed(Structure)Entry objects to determine the chemical " + "system from!" + ) + elif chemsys and user_entries: + warnings.warn( + "You have set both `chemsys` and `user_entries`; the " + "chemical system will be determined from `user_entries`." + ) + + if user_entries: + chemsys = [ + ele.name for ele in set([entry.elements for entry in user_entries]) + ] + if solid_compat == "MaterialsProjectCompatibility": solid_compat = MaterialsProjectCompatibility() elif solid_compat == "MaterialsProject2020Compatibility": @@ -855,6 +878,8 @@ def get_pourbaix_entries( list([str(e) for e in ion_ref_elts] + ["O", "H"]), # use_gibbs=use_gibbs ) + if user_entries: + ion_ref_entries += user_entries # suppress the warning about supplying the required energies; they will be calculated from the # entries we get from MPRester From 2ecdb754267b908cf23970688b75581667d2f7da Mon Sep 17 00:00:00 2001 From: esoteric-ephemera Date: Fri, 27 Jun 2025 14:12:02 -0700 Subject: [PATCH 3/8] add feature to add user computed entries to pourbaix --- mp_api/client/mprester.py | 61 +++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/mp_api/client/mprester.py b/mp_api/client/mprester.py index 5d47d3ebb..4e15ec32d 100644 --- a/mp_api/client/mprester.py +++ b/mp_api/client/mprester.py @@ -783,8 +783,7 @@ def get_entries( def get_pourbaix_entries( self, - chemsys: str | list | None = None, - user_entries: list[ComputedEntry | ComputedStructureEntry] | None = None, + chemsys: str | list[str] | list[ComputedEntry | ComputedStructureEntry], solid_compat="MaterialsProject2020Compatibility", use_gibbs: Literal[300] | None = None, ): @@ -792,14 +791,14 @@ def get_pourbaix_entries( a Pourbaix diagram from the rest interface. Args: - chemsys (str or [str] or None): Chemical system string comprising element + chemsys (str or [str] or Computed(Structure)Entry): + Chemical system string comprising element symbols separated by dashes, e.g., "Li-Fe-O" or List of element symbols, e.g., ["Li", "Fe", "O"]. - Does not need to be set if user_entries is set. - user_entries : list of Computed(Structure)Entry or None - Can be specified instead of chemsys to allow for adding extra - calculation data to the Pourbaix Diagram. - If this is set, the chemsys will be inferred from user_entries. + + Can also be a list of Computed(Structure)Entry objects to allow + for adding extra calculation data to the Pourbaix Diagram. + If this is set, the chemsys will be inferred from the entries. solid_compat: Compatibility scheme used to pre-process solid DFT energies prior to applying aqueous energy adjustments. May be passed as a class (e.g. MaterialsProject2020Compatibility) or an instance @@ -822,22 +821,26 @@ def get_pourbaix_entries( ) from pymatgen.entries.computed_entries import ComputedEntry - if not chemsys and not user_entries: - raise ValueError( - "You must supply either a chemical system, or a list of " - "Computed(Structure)Entry objects to determine the chemical " - "system from!" - ) - elif chemsys and user_entries: - warnings.warn( - "You have set both `chemsys` and `user_entries`; the " - "chemical system will be determined from `user_entries`." - ) + thermo_types = ["GGA_GGA+U"] + user_entries: list[ComputedEntry | ComputedStructureEntry] = [] + if isinstance(chemsys, list) and all( + isinstance(v, ComputedEntry | ComputedStructureEntry) for v in chemsys + ): + user_entries = [ce.copy() for ce in chemsys] - if user_entries: - chemsys = [ - ele.name for ele in set([entry.elements for entry in user_entries]) - ] + elements = set() + for entry in user_entries: + elements.update(entry.elements) + chemsys = [ele.name for ele in elements] + + user_run_types = set( + [ + entry.parameters.get("run_type", "unknown").lower() + for entry in user_entries + ] + ) + if any("r2scan" in rt for rt in user_run_types): + thermo_types = ["GGA_GGA+U_R2SCAN"] if solid_compat == "MaterialsProjectCompatibility": solid_compat = MaterialsProjectCompatibility() @@ -874,12 +877,14 @@ def get_pourbaix_entries( # TODO - would be great if the commented line below would work # However for some reason you cannot process GibbsComputedStructureEntry with # MaterialsProjectAqueousCompatibility - ion_ref_entries = self.get_entries_in_chemsys( - list([str(e) for e in ion_ref_elts] + ["O", "H"]), - # use_gibbs=use_gibbs + ion_ref_entries = ( + self.get_entries_in_chemsys( + list([str(e) for e in ion_ref_elts] + ["O", "H"]), + additional_criteria={"thermo_types": thermo_types} + # use_gibbs=use_gibbs + ) + + user_entries ) - if user_entries: - ion_ref_entries += user_entries # suppress the warning about supplying the required energies; they will be calculated from the # entries we get from MPRester From b622cbdd5d7e0d0f22cf422fe09fb280470d1c73 Mon Sep 17 00:00:00 2001 From: esoteric-ephemera Date: Fri, 27 Jun 2025 14:16:26 -0700 Subject: [PATCH 4/8] undo unrelated changes --- mp_api/client/mprester.py | 40 +++++---------------------------------- 1 file changed, 5 insertions(+), 35 deletions(-) diff --git a/mp_api/client/mprester.py b/mp_api/client/mprester.py index 4e15ec32d..6a000c4e0 100644 --- a/mp_api/client/mprester.py +++ b/mp_api/client/mprester.py @@ -783,7 +783,7 @@ def get_entries( def get_pourbaix_entries( self, - chemsys: str | list[str] | list[ComputedEntry | ComputedStructureEntry], + chemsys: str | list, solid_compat="MaterialsProject2020Compatibility", use_gibbs: Literal[300] | None = None, ): @@ -791,14 +791,9 @@ def get_pourbaix_entries( a Pourbaix diagram from the rest interface. Args: - chemsys (str or [str] or Computed(Structure)Entry): - Chemical system string comprising element + chemsys (str or [str]): Chemical system string comprising element symbols separated by dashes, e.g., "Li-Fe-O" or List of element symbols, e.g., ["Li", "Fe", "O"]. - - Can also be a list of Computed(Structure)Entry objects to allow - for adding extra calculation data to the Pourbaix Diagram. - If this is set, the chemsys will be inferred from the entries. solid_compat: Compatibility scheme used to pre-process solid DFT energies prior to applying aqueous energy adjustments. May be passed as a class (e.g. MaterialsProject2020Compatibility) or an instance @@ -821,27 +816,6 @@ def get_pourbaix_entries( ) from pymatgen.entries.computed_entries import ComputedEntry - thermo_types = ["GGA_GGA+U"] - user_entries: list[ComputedEntry | ComputedStructureEntry] = [] - if isinstance(chemsys, list) and all( - isinstance(v, ComputedEntry | ComputedStructureEntry) for v in chemsys - ): - user_entries = [ce.copy() for ce in chemsys] - - elements = set() - for entry in user_entries: - elements.update(entry.elements) - chemsys = [ele.name for ele in elements] - - user_run_types = set( - [ - entry.parameters.get("run_type", "unknown").lower() - for entry in user_entries - ] - ) - if any("r2scan" in rt for rt in user_run_types): - thermo_types = ["GGA_GGA+U_R2SCAN"] - if solid_compat == "MaterialsProjectCompatibility": solid_compat = MaterialsProjectCompatibility() elif solid_compat == "MaterialsProject2020Compatibility": @@ -877,13 +851,9 @@ def get_pourbaix_entries( # TODO - would be great if the commented line below would work # However for some reason you cannot process GibbsComputedStructureEntry with # MaterialsProjectAqueousCompatibility - ion_ref_entries = ( - self.get_entries_in_chemsys( - list([str(e) for e in ion_ref_elts] + ["O", "H"]), - additional_criteria={"thermo_types": thermo_types} - # use_gibbs=use_gibbs - ) - + user_entries + ion_ref_entries = self.get_entries_in_chemsys( + list([str(e) for e in ion_ref_elts] + ["O", "H"]), + # use_gibbs=use_gibbs ) # suppress the warning about supplying the required energies; they will be calculated from the From c41a954d5ed7de6670d1699266b45c2ede8b4d8b Mon Sep 17 00:00:00 2001 From: esoteric-ephemera Date: Mon, 15 Sep 2025 10:50:53 -0700 Subject: [PATCH 5/8] fix forwardref resolution? --- .pre-commit-config.yaml | 4 ++-- mp_api/client/core/client.py | 28 +++++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a3f20b1a0..d7983abcf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,4 @@ -default_stages: [commit] +default_stages: [pre-commit] default_install_hook_types: [pre-commit, commit-msg] ci: @@ -37,6 +37,6 @@ repos: rev: v2.2.6 hooks: - id: codespell - stages: [commit, commit-msg] + stages: [pre-commit, commit-msg] exclude_types: [json, bib, svg] args: [--ignore-words-list, "mater,fwe,te"] diff --git a/mp_api/client/core/client.py b/mp_api/client/core/client.py index 53024ca6d..6b0ffbc1d 100644 --- a/mp_api/client/core/client.py +++ b/mp_api/client/core/client.py @@ -15,10 +15,18 @@ from concurrent.futures import FIRST_COMPLETED, ThreadPoolExecutor, wait from copy import copy from functools import cache +from importlib import import_module from importlib.metadata import PackageNotFoundError, version from json import JSONDecodeError from math import ceil -from typing import TYPE_CHECKING, Generic, TypeVar +from typing import ( + TYPE_CHECKING, + ForwardRef, + Generic, + TypeVar, + _eval_type, + get_args, +) from urllib.parse import quote, urljoin import requests @@ -65,7 +73,7 @@ class BaseRester(Generic[T]): """Base client class with core stubs.""" suffix: str = "" - document_model: BaseModel = None # type: ignore + document_model: type[BaseModel] | None = None supports_versions: bool = False primary_key: str = "material_id" @@ -1070,10 +1078,24 @@ def _convert_to_model(self, data: list[dict]): def _generate_returned_model(self, doc): model_fields = self.document_model.model_fields + set_fields = doc.model_fields_set unset_fields = [field for field in model_fields if field not in set_fields] + + # Update with locals() from external module if needed + other_vars = {} + if any( + isinstance(typ, ForwardRef) + for name in set_fields + for typ in get_args(model_fields[name].annotation) + ): + other_vars = vars(import_module(self.document_model.__module__)) + include_fields = { - name: (model_fields[name].annotation, model_fields[name]) + name: ( + _eval_type(model_fields[name].annotation, other_vars, {}, frozenset()), + model_fields[name], + ) for name in set_fields } From a9af1b37316f7a09e25567a7cad1a60472654d9a Mon Sep 17 00:00:00 2001 From: esoteric-ephemera Date: Tue, 16 Sep 2025 09:16:42 -0700 Subject: [PATCH 6/8] ensure external locals are imported on excluded fields --- mp_api/client/core/client.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mp_api/client/core/client.py b/mp_api/client/core/client.py index 6b0ffbc1d..3ee0b32e4 100644 --- a/mp_api/client/core/client.py +++ b/mp_api/client/core/client.py @@ -24,7 +24,6 @@ ForwardRef, Generic, TypeVar, - _eval_type, get_args, ) from urllib.parse import quote, urljoin @@ -1086,14 +1085,14 @@ def _generate_returned_model(self, doc): other_vars = {} if any( isinstance(typ, ForwardRef) - for name in set_fields - for typ in get_args(model_fields[name].annotation) + for field_meta in model_fields.values() + for typ in get_args(field_meta.annotation) ): other_vars = vars(import_module(self.document_model.__module__)) include_fields = { name: ( - _eval_type(model_fields[name].annotation, other_vars, {}, frozenset()), + model_fields[name].annotation, model_fields[name], ) for name in set_fields @@ -1107,6 +1106,8 @@ def _generate_returned_model(self, doc): fields_not_requested=(list[str], unset_fields), __base__=self.document_model, ) + if other_vars: + data_model.model_rebuild(_types_namespace=other_vars) def new_repr(self) -> str: extra = ",\n".join( From f0aedb0bc2906c524da64db96a2b069c0aeb15ff Mon Sep 17 00:00:00 2001 From: esoteric-ephemera Date: Tue, 16 Sep 2025 09:32:22 -0700 Subject: [PATCH 7/8] typos + pytest-xdist --- .github/workflows/testing.yml | 2 +- pyproject.toml | 1 + tests/materials/test_electronic_structure.py | 6 +++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index c5e7328c8..788371ed0 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -60,7 +60,7 @@ jobs: #MP_API_ENDPOINT: https://api-preview.materialsproject.org/ run: | pip install -e . - pytest -x --cov=mp_api --cov-report=xml + pytest -n auto -x --cov=mp_api --cov-report=xml - uses: codecov/codecov-action@v1 with: token: ${{ secrets.CODECOV_TOKEN }} diff --git a/pyproject.toml b/pyproject.toml index b75c1f67d..b257994d2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,6 +40,7 @@ test = [ "pytest-asyncio", "pytest-cov", "pytest-mock", + "pytest-xdist", "flake8", "pycodestyle", "mypy", diff --git a/tests/materials/test_electronic_structure.py b/tests/materials/test_electronic_structure.py index 576784258..99b2060ca 100644 --- a/tests/materials/test_electronic_structure.py +++ b/tests/materials/test_electronic_structure.py @@ -47,7 +47,7 @@ def es_rester(): @pytest.mark.skipif(os.getenv("MP_API_KEY", None) is None, reason="No API key found.") -@pytest.mark.skip(reason="magnetic ordering fields not build correctly") +@pytest.mark.skip(reason="magnetic ordering fields not built correctly") def test_es_client(es_rester): search_method = es_rester.search @@ -81,7 +81,7 @@ def bs_rester(): @pytest.mark.skipif(os.getenv("MP_API_KEY", None) is None, reason="No API key found.") -@pytest.mark.skip(reason="magnetic ordering fields not build correctly") +@pytest.mark.skip(reason="magnetic ordering fields not built correctly") def test_bs_client(bs_rester): # Get specific search method search_method = bs_rester.search @@ -127,7 +127,7 @@ def dos_rester(): @pytest.mark.skipif(os.getenv("MP_API_KEY", None) is None, reason="No API key found.") -@pytest.mark.skip(reason="magnetic ordering fields not build correctly") +@pytest.mark.skip(reason="magnetic ordering fields not built correctly") def test_dos_client(dos_rester): search_method = dos_rester.search From 458e126c19965d9ac508a894968dc88ca1dcdf9f Mon Sep 17 00:00:00 2001 From: esoteric-ephemera Date: Tue, 16 Sep 2025 09:37:44 -0700 Subject: [PATCH 8/8] bump up dependencies --- .../requirements-ubuntu-latest_py3.11.txt | 10 +++++----- ...quirements-ubuntu-latest_py3.11_extras.txt | 20 ++++++++++++------- .../requirements-ubuntu-latest_py3.12.txt | 10 +++++----- ...quirements-ubuntu-latest_py3.12_extras.txt | 20 ++++++++++++------- 4 files changed, 36 insertions(+), 24 deletions(-) diff --git a/requirements/requirements-ubuntu-latest_py3.11.txt b/requirements/requirements-ubuntu-latest_py3.11.txt index f5519ba17..f624f0b93 100644 --- a/requirements/requirements-ubuntu-latest_py3.11.txt +++ b/requirements/requirements-ubuntu-latest_py3.11.txt @@ -17,9 +17,9 @@ bcrypt==4.3.0 # via paramiko bibtexparser==1.4.3 # via pymatgen -boto3==1.40.29 +boto3==1.40.31 # via maggma -botocore==1.40.29 +botocore==1.40.31 # via # boto3 # s3transfer @@ -83,7 +83,7 @@ msgpack==1.1.1 # via # maggma # mp-api (pyproject.toml) -narwhals==2.4.0 +narwhals==2.5.0 # via plotly networkx==3.5 # via pymatgen @@ -123,7 +123,7 @@ pybtex==0.25.1 # via emmet-core pycparser==2.23 # via cffi -pydantic==2.11.7 +pydantic==2.11.9 # via # emmet-core # maggma @@ -149,7 +149,7 @@ pymongo==4.10.1 # via maggma pynacl==1.6.0 # via paramiko -pyparsing==3.2.3 +pyparsing==3.2.4 # via # bibtexparser # matplotlib diff --git a/requirements/requirements-ubuntu-latest_py3.11_extras.txt b/requirements/requirements-ubuntu-latest_py3.11_extras.txt index 7b2a2d2cd..a6ef0f277 100644 --- a/requirements/requirements-ubuntu-latest_py3.11_extras.txt +++ b/requirements/requirements-ubuntu-latest_py3.11_extras.txt @@ -29,11 +29,11 @@ bibtexparser==1.4.3 # via pymatgen boltons==25.0.0 # via mpcontribs-client -boto3==1.40.29 +boto3==1.40.31 # via # maggma # mp-api (pyproject.toml) -botocore==1.40.29 +botocore==1.40.31 # via # boto3 # s3transfer @@ -76,6 +76,8 @@ docutils==0.21.2 # via sphinx emmet-core[all]==0.84.10rc2 # via mp-api (pyproject.toml) +execnet==2.1.1 + # via pytest-xdist executing==2.2.1 # via stack-data filelock==3.19.1 @@ -221,7 +223,7 @@ mypy-extensions==1.1.0 # via # mp-api (pyproject.toml) # mypy -narwhals==2.4.0 +narwhals==2.5.0 # via plotly networkx==3.5 # via @@ -343,7 +345,7 @@ pycodestyle==2.14.0 # mp-api (pyproject.toml) pycparser==2.23 # via cffi -pydantic==2.11.7 +pydantic==2.11.9 # via # emmet-core # maggma @@ -395,7 +397,7 @@ pymongo==4.10.1 # mpcontribs-client pynacl==1.6.0 # via paramiko -pyparsing==3.2.3 +pyparsing==3.2.4 # via # bibtexparser # matplotlib @@ -405,13 +407,16 @@ pytest==8.4.2 # pytest-asyncio # pytest-cov # pytest-mock + # pytest-xdist # solvation-analysis -pytest-asyncio==1.1.0 +pytest-asyncio==1.2.0 # via mp-api (pyproject.toml) pytest-cov==7.0.0 # via mp-api (pyproject.toml) pytest-mock==3.15.0 # via mp-api (pyproject.toml) +pytest-xdist==3.8.0 + # via mp-api (pyproject.toml) python-dateutil==2.9.0.post0 # via # arrow @@ -582,7 +587,7 @@ typeguard==4.4.4 # via inflect types-python-dateutil==2.9.0.20250822 # via arrow -types-requests==2.32.4.20250809 +types-requests==2.32.4.20250913 # via mp-api (pyproject.toml) types-setuptools==80.9.0.20250822 # via mp-api (pyproject.toml) @@ -599,6 +604,7 @@ typing-extensions==4.15.0 # pydantic # pydantic-core # pydash + # pytest-asyncio # referencing # spglib # swagger-spec-validator diff --git a/requirements/requirements-ubuntu-latest_py3.12.txt b/requirements/requirements-ubuntu-latest_py3.12.txt index 5668df40c..272f068a4 100644 --- a/requirements/requirements-ubuntu-latest_py3.12.txt +++ b/requirements/requirements-ubuntu-latest_py3.12.txt @@ -17,9 +17,9 @@ bcrypt==4.3.0 # via paramiko bibtexparser==1.4.3 # via pymatgen -boto3==1.40.29 +boto3==1.40.31 # via maggma -botocore==1.40.29 +botocore==1.40.31 # via # boto3 # s3transfer @@ -83,7 +83,7 @@ msgpack==1.1.1 # via # maggma # mp-api (pyproject.toml) -narwhals==2.4.0 +narwhals==2.5.0 # via plotly networkx==3.5 # via pymatgen @@ -123,7 +123,7 @@ pybtex==0.25.1 # via emmet-core pycparser==2.23 # via cffi -pydantic==2.11.7 +pydantic==2.11.9 # via # emmet-core # maggma @@ -149,7 +149,7 @@ pymongo==4.10.1 # via maggma pynacl==1.6.0 # via paramiko -pyparsing==3.2.3 +pyparsing==3.2.4 # via # bibtexparser # matplotlib diff --git a/requirements/requirements-ubuntu-latest_py3.12_extras.txt b/requirements/requirements-ubuntu-latest_py3.12_extras.txt index 3770d3d18..a2d27d1ac 100644 --- a/requirements/requirements-ubuntu-latest_py3.12_extras.txt +++ b/requirements/requirements-ubuntu-latest_py3.12_extras.txt @@ -29,11 +29,11 @@ bibtexparser==1.4.3 # via pymatgen boltons==25.0.0 # via mpcontribs-client -boto3==1.40.29 +boto3==1.40.31 # via # maggma # mp-api (pyproject.toml) -botocore==1.40.29 +botocore==1.40.31 # via # boto3 # s3transfer @@ -76,6 +76,8 @@ docutils==0.21.2 # via sphinx emmet-core[all]==0.84.10rc2 # via mp-api (pyproject.toml) +execnet==2.1.1 + # via pytest-xdist executing==2.2.1 # via stack-data filelock==3.19.1 @@ -221,7 +223,7 @@ mypy-extensions==1.1.0 # via # mp-api (pyproject.toml) # mypy -narwhals==2.4.0 +narwhals==2.5.0 # via plotly networkx==3.5 # via @@ -343,7 +345,7 @@ pycodestyle==2.14.0 # mp-api (pyproject.toml) pycparser==2.23 # via cffi -pydantic==2.11.7 +pydantic==2.11.9 # via # emmet-core # maggma @@ -395,7 +397,7 @@ pymongo==4.10.1 # mpcontribs-client pynacl==1.6.0 # via paramiko -pyparsing==3.2.3 +pyparsing==3.2.4 # via # bibtexparser # matplotlib @@ -405,13 +407,16 @@ pytest==8.4.2 # pytest-asyncio # pytest-cov # pytest-mock + # pytest-xdist # solvation-analysis -pytest-asyncio==1.1.0 +pytest-asyncio==1.2.0 # via mp-api (pyproject.toml) pytest-cov==7.0.0 # via mp-api (pyproject.toml) pytest-mock==3.15.0 # via mp-api (pyproject.toml) +pytest-xdist==3.8.0 + # via mp-api (pyproject.toml) python-dateutil==2.9.0.post0 # via # arrow @@ -582,7 +587,7 @@ typeguard==4.4.4 # via inflect types-python-dateutil==2.9.0.20250822 # via arrow -types-requests==2.32.4.20250809 +types-requests==2.32.4.20250913 # via mp-api (pyproject.toml) types-setuptools==80.9.0.20250822 # via mp-api (pyproject.toml) @@ -598,6 +603,7 @@ typing-extensions==4.15.0 # pydantic # pydantic-core # pydash + # pytest-asyncio # referencing # spglib # swagger-spec-validator