Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
default_stages: [commit]
default_stages: [pre-commit]
default_install_hook_types: [pre-commit, commit-msg]

ci:
Expand Down Expand Up @@ -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"]
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
maggma Copyright (c) 2017, The Regents of the University of
Copyright (c) 2017, The Regents of the University of
California, through Lawrence Berkeley National Laboratory (subject
to receipt of any required approvals from the U.S. Dept. of Energy).
All rights reserved.
Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/core/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from functools import cache
from typing import Optional, get_args

from maggma.utils import get_flat_models_from_model
from emmet.core.utils import get_flat_models_from_model
from monty.json import MSONable
from pydantic import BaseModel
from pydantic._internal._utils import lenient_issubclass
Expand Down
2 changes: 2 additions & 0 deletions mp_api/client/mprester.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
BandStructureRester,
BondsRester,
ChemenvRester,
ConversionElectrodeRester,
DielectricRester,
DOIRester,
DosRester,
Expand Down Expand Up @@ -99,6 +100,7 @@ class MPRester:
robocrys: RobocrysRester
synthesis: SynthesisRester
insertion_electrodes: ElectrodeRester
conversion_electrodes: ConversionElectrodeRester
electronic_structure: ElectronicStructureRester
electronic_structure_bandstructure: BandStructureRester
electronic_structure_dos: DosRester
Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/materials/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from .dielectric import DielectricRester
from .doi import DOIRester
from .elasticity import ElasticityRester
from .electrodes import ElectrodeRester
from .electrodes import ConversionElectrodeRester, ElectrodeRester
from .electronic_structure import (
BandStructureRester,
DosRester,
Expand Down
48 changes: 41 additions & 7 deletions mp_api/client/routes/materials/electrodes.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
from __future__ import annotations

import warnings
from collections import defaultdict

from emmet.core.electrode import InsertionElectrodeDoc
from emmet.core.electrode import ConversionElectrodeDoc, InsertionElectrodeDoc
from pymatgen.core.periodic_table import Element

from mp_api.client.core import BaseRester
from mp_api.client.core.utils import validate_ids


class ElectrodeRester(BaseRester[InsertionElectrodeDoc]):
suffix = "materials/insertion_electrodes"
document_model = InsertionElectrodeDoc # type: ignore
class BaseElectrodeRester(BaseRester):
primary_key = "battery_id"
_exclude_search_fields: list[str] | None = None

def search( # pragma: ignore
self,
Expand All @@ -39,7 +39,7 @@ def search( # pragma: ignore
chunk_size: int = 1000,
all_fields: bool = True,
fields: list[str] | None = None,
) -> list[InsertionElectrodeDoc] | list[dict]:
) -> list[InsertionElectrodeDoc | ConversionElectrodeDoc] | list[dict]:
"""Query using a variety of search criteria.

Arguments:
Expand Down Expand Up @@ -77,11 +77,11 @@ def search( # pragma: ignore
num_chunks (int): Maximum number of chunks of data to yield. None will yield all possible.
chunk_size (int): Number of data entries per chunk.
all_fields (bool): Whether to return all fields in the document. Defaults to True.
fields (List[str]): List of fields in InsertionElectrodeDoc to return data for.
fields (List[str]): List of fields in InsertionElectrodeDoc or ConversionElectrodeDoc to return data for.
Default is battery_id and last_updated if all_fields is False.

Returns:
([InsertionElectrodeDoc], [dict]) List of insertion electrode documents or dictionaries.
([InsertionElectrodeDoc or ConversionElectrodeDoc], [dict]) List of insertion/conversion electrode documents or dictionaries.
"""
query_params = defaultdict(dict) # type: dict

Expand Down Expand Up @@ -143,10 +143,44 @@ def search( # pragma: ignore
else:
query_params.update({param: value})

excluded_fields = self._exclude_search_fields or []
ignored_fields = {
entry
for entry in excluded_fields
if query_params.pop(entry, None) is not None
}
if ignored_fields:
warnings.warn(
f"Ignoring fields {', '.join(ignored_fields)} which are not valid options for {self.__class__.__name__}"
)

query_params = {
entry: query_params[entry]
for entry in query_params
if query_params[entry] is not None
}

return super()._search(**query_params)


class ElectrodeRester(BaseElectrodeRester):
"""Search insertion electrode documents."""

suffix = "materials/insertion_electrodes"
document_model = InsertionElectrodeDoc # type: ignore


class ConversionElectrodeRester(BaseElectrodeRester):
"""Search conversion electrode documents."""

suffix = "materials/conversion_electrodes"
document_model = ConversionElectrodeDoc # type: ignore
# TODO: formula, chemsys, and elements do not appear to work in the API
_exclude_search_fields = [
"material_ids",
"formula",
"chemsys",
"elements",
"stability_charge",
"stability_discharge",
]
3 changes: 3 additions & 0 deletions mp_api/client/routes/materials/materials.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
BandStructureRester,
BondsRester,
ChemenvRester,
ConversionElectrodeRester,
DielectricRester,
DosRester,
ElasticityRester,
Expand Down Expand Up @@ -62,6 +63,7 @@ class MaterialsRester(BaseRester[MaterialsDoc]):
"robocrys",
"synthesis",
"insertion_electrodes",
"conversion_electrodes",
"electronic_structure",
"electronic_structure_bandstructure",
"electronic_structure_dos",
Expand Down Expand Up @@ -92,6 +94,7 @@ class MaterialsRester(BaseRester[MaterialsDoc]):
robocrys: RobocrysRester
synthesis: SynthesisRester
insertion_electrodes: ElectrodeRester
conversion_electrodes: ConversionElectrodeRester
electronic_structure: ElectronicStructureRester
electronic_structure_bandstructure: BandStructureRester
electronic_structure_dos: DosRester
Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/materials/robocrys.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def search(
robocrys_docs = self._query_resource(
criteria={"keywords": keyword_string, "_limit": chunk_size},
suburl="text_search",
use_document_model=True,
use_document_model=self.use_document_model,
chunk_size=chunk_size,
num_chunks=num_chunks,
).get("data", None)
Expand Down
5 changes: 2 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,17 @@ classifiers = [
dependencies = [
"setuptools",
"msgpack",
"maggma>=0.57.1",
"pymatgen>=2022.3.7,!=2024.2.20",
"typing-extensions>=3.7.4.1",
"requests>=2.23.0",
"monty>=2024.12.10",
"emmet-core>=0.84.3rc6",
"emmet-core>=0.84.10rc1",
"smart_open",
]
dynamic = ["version"]

[project.optional-dependencies]
all = ["emmet-core[all]>=0.69.1", "custodian", "mpcontribs-client", "boto3"]
all = ["emmet-core[all]>=0.84.10rc1", "custodian", "mpcontribs-client", "boto3"]
test = [
"pre-commit",
"pytest",
Expand Down
Loading
Loading