Skip to content

Commit

Permalink
Add materials route nesting (#787)
Browse files Browse the repository at this point in the history
* Add materials route nesting

* Linting
  • Loading branch information
munrojm committed May 2, 2023
1 parent d5190ff commit 570dbfc
Show file tree
Hide file tree
Showing 31 changed files with 96 additions and 53 deletions.
9 changes: 9 additions & 0 deletions mp_api/client/core/settings.py
Expand Up @@ -78,5 +78,14 @@ class MAPIClientSettings(BaseSettings):
description="Number of characters to use to define the maximum length of a given HTTP URL.",
)

MAX_HTTP_URL_LENGTH: int = Field(
_MAX_HTTP_URL_LENGTH,
description="Number of characters to use to define the maximum length of a given HTTP URL.",
)

MIN_EMMET_VERSION: str = Field(
"0.54.0", description="Minimum compatible version of emmet-core for the client."
)

class Config:
env_prefix = "MPRESTER_"
46 changes: 41 additions & 5 deletions mp_api/client/mprester.py
Expand Up @@ -10,6 +10,7 @@
from emmet.core.mpid import MPID
from emmet.core.settings import EmmetSettings
from emmet.core.vasp.calc_types import CalcType
from packaging import version
from pymatgen.analysis.phase_diagram import PhaseDiagram
from pymatgen.analysis.pourbaix_diagram import IonEntry
from pymatgen.core import Element, Structure
Expand All @@ -20,6 +21,7 @@
from requests import Session, get

from mp_api.client.core import BaseRester, MPRestError
from mp_api.client.core.settings import MAPIClientSettings
from mp_api.client.core.utils import validate_ids
from mp_api.client.routes import (
AbsorptionRester,
Expand Down Expand Up @@ -64,6 +66,7 @@
)

_EMMET_SETTINGS = EmmetSettings()
_MAPI_SETTINGS = MAPIClientSettings()

DEFAULT_API_KEY = environ.get("MP_API_KEY", None)
DEFAULT_ENDPOINT = environ.get("MP_API_ENDPOINT", "https://api.materialsproject.org/")
Expand Down Expand Up @@ -185,6 +188,17 @@ def __init__(
self.contribs = None
warnings.warn(f"Problem loading MPContribs client: {error}")

# Check if emmet version of server os compatible
emmet_version = version.parse(self.get_emmet_version())

if version.parse(emmet_version.base_version) < version.parse(
_MAPI_SETTINGS.MIN_EMMET_VERSION
):
warnings.warn(
"The installed version of the mp-api client may not be compatible with the API server. "
"Please install a previous version if any problems occur."
)

self._all_resters = []

if notify_db_version:
Expand All @@ -208,11 +222,24 @@ def __init__(

self._all_resters.append(rester)

setattr(
self,
cls.suffix.replace("/", "_"), # type: ignore
rester,
)
suffix_split = cls.suffix.split("/")

if len(suffix_split) == 1 or cls.suffix in [
"materials/core",
"molecules/core",
]:
setattr(
self,
cls.suffix.split("/")[0],
rester,
)

else:
setattr(
self,
"_".join(suffix_split[1:]),
rester,
)

def __enter__(self):
"""Support for "with" context."""
Expand Down Expand Up @@ -303,6 +330,15 @@ def get_database_version(self):
"""
return get(url=self.endpoint + "heartbeat").json()["db_version"]

def get_emmet_version(self):
"""
Get the latest version emmet-core and emmet-api used in the
current API service.
Returns: version as a string
"""
return get(url=self.endpoint + "heartbeat").json()["version"]

def get_material_id_from_task_id(self, task_id: str) -> Union[str, None]:
"""Returns the current material_id from a given task_id. The
material_id should rarely change, and is usually chosen from
Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/absorption.py
Expand Up @@ -8,7 +8,7 @@


class AbsorptionRester(BaseRester[AbsorptionDoc]):
suffix = "absorption"
suffix = "materials/absorption"
document_model = AbsorptionDoc # type: ignore
primary_key = "material_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/alloys.py
Expand Up @@ -8,7 +8,7 @@


class AlloysRester(BaseRester[AlloyPairDoc]):
suffix = "alloys"
suffix = "materials/alloys"
document_model = AlloyPairDoc # type: ignore
primary_key = "pair_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/bonds.py
Expand Up @@ -9,7 +9,7 @@


class BondsRester(BaseRester[BondingDoc]):
suffix = "bonds"
suffix = "materials/bonds"
document_model = BondingDoc # type: ignore
primary_key = "material_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/charge_density.py
Expand Up @@ -16,7 +16,7 @@


class ChargeDensityRester(BaseRester[ChgcarDataDoc]):
suffix = "charge_density"
suffix = "materials/charge_density"
primary_key = "fs_id"
document_model = ChgcarDataDoc # type: ignore
boto_resource = None
Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/chemenv.py
Expand Up @@ -8,7 +8,7 @@


class ChemenvRester(BaseRester[ChemEnvDoc]):
suffix = "chemenv"
suffix = "materials/chemenv"
document_model = ChemEnvDoc # type: ignore
primary_key = "material_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/dielectric.py
Expand Up @@ -9,7 +9,7 @@


class DielectricRester(BaseRester[DielectricDoc]):
suffix = "dielectric"
suffix = "materials/dielectric"
document_model = DielectricDoc # type: ignore
primary_key = "material_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/elasticity.py
Expand Up @@ -8,7 +8,7 @@


class ElasticityRester(BaseRester[ElasticityDoc]):
suffix = "elasticity"
suffix = "materials/elasticity"
document_model = ElasticityDoc # type: ignore
primary_key = "task_id"

Expand Down
6 changes: 2 additions & 4 deletions mp_api/client/routes/electrodes.py
Expand Up @@ -10,7 +10,7 @@


class ElectrodeRester(BaseRester[InsertionElectrodeDoc]):
suffix = "insertion_electrodes"
suffix = "materials/insertion_electrodes"
document_model = InsertionElectrodeDoc # type: ignore
primary_key = "battery_id"

Expand Down Expand Up @@ -113,9 +113,7 @@ def search( # pragma: ignore
if isinstance(working_ion, (str, Element)):
working_ion = [working_ion] # type: ignore

query_params.update(
{"working_ion": ",".join([str(ele) for ele in working_ion])} # type: ignore
)
query_params.update({"working_ion": ",".join([str(ele) for ele in working_ion])}) # type: ignore

if formula:
if isinstance(formula, str):
Expand Down
6 changes: 3 additions & 3 deletions mp_api/client/routes/electronic_structure.py
Expand Up @@ -20,7 +20,7 @@


class ElectronicStructureRester(BaseRester[ElectronicStructureDoc]):
suffix = "electronic_structure"
suffix = "materials/electronic_structure"
document_model = ElectronicStructureDoc # type: ignore
primary_key = "material_id"

Expand Down Expand Up @@ -153,7 +153,7 @@ def search(


class BandStructureRester(BaseRester):
suffix = "electronic_structure/bandstructure"
suffix = "materials/electronic_structure/bandstructure"
document_model = ElectronicStructureDoc # type: ignore

def search_bandstructure_summary(self, *args, **kwargs): # pragma: no cover
Expand Down Expand Up @@ -333,7 +333,7 @@ def get_bandstructure_from_material_id(


class DosRester(BaseRester):
suffix = "electronic_structure/dos"
suffix = "materials/electronic_structure/dos"
document_model = ElectronicStructureDoc # type: ignore

def search_dos_summary(self, *args, **kwargs): # pragma: no cover
Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/eos.py
Expand Up @@ -8,7 +8,7 @@


class EOSRester(BaseRester[EOSDoc]):
suffix = "eos"
suffix = "materials/eos"
document_model = EOSDoc # type: ignore
primary_key = "task_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/fermi.py
Expand Up @@ -6,7 +6,7 @@


class FermiRester(BaseRester[FermiDoc]):
suffix = "fermi"
suffix = "materials/fermi"
document_model = FermiDoc # type: ignore
primary_key = "task_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/grain_boundary.py
Expand Up @@ -9,7 +9,7 @@


class GrainBoundaryRester(BaseRester[GrainBoundaryDoc]):
suffix = "grain_boundary"
suffix = "materials/grain_boundary"
document_model = GrainBoundaryDoc # type: ignore
primary_key = "task_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/magnetism.py
Expand Up @@ -10,7 +10,7 @@


class MagnetismRester(BaseRester[MagnetismDoc]):
suffix = "magnetism"
suffix = "materials/magnetism"
document_model = MagnetismDoc # type: ignore
primary_key = "material_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/materials.py
Expand Up @@ -13,7 +13,7 @@


class MaterialsRester(BaseRester[MaterialsDoc]):
suffix = "materials"
suffix = "materials/core"
document_model = MaterialsDoc # type: ignore
supports_versions = True
primary_key = "material_id"
Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/molecules.py
Expand Up @@ -9,7 +9,7 @@


class MoleculesRester(BaseRester[MoleculesDoc]):
suffix = "molecules"
suffix = "legacy/jcesr"
document_model = MoleculesDoc # type: ignore
primary_key = "task_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/oxidation_states.py
Expand Up @@ -8,7 +8,7 @@


class OxidationStatesRester(BaseRester[OxidationStateDoc]):
suffix = "oxidation_states"
suffix = "materials/oxidation_states"
document_model = OxidationStateDoc # type: ignore
primary_key = "material_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/phonon.py
Expand Up @@ -4,7 +4,7 @@


class PhononRester(BaseRester[PhononBSDOSDoc]):
suffix = "phonon"
suffix = "materials/phonon"
document_model = PhononBSDOSDoc # type: ignore
primary_key = "material_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/piezo.py
Expand Up @@ -9,7 +9,7 @@


class PiezoRester(BaseRester[PiezoelectricDoc]):
suffix = "piezoelectric"
suffix = "materials/piezoelectric"
document_model = PiezoelectricDoc # type: ignore
primary_key = "material_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/provenance.py
Expand Up @@ -7,7 +7,7 @@


class ProvenanceRester(BaseRester[ProvenanceDoc]):
suffix = "provenance"
suffix = "materials/provenance"
document_model = ProvenanceDoc # type: ignore
primary_key = "material_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/robocrys.py
Expand Up @@ -7,7 +7,7 @@


class RobocrysRester(BaseRester[RobocrystallogapherDoc]):
suffix = "robocrys"
suffix = "materials/robocrys"
document_model = RobocrystallogapherDoc # type: ignore
primary_key = "material_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/similarity.py
Expand Up @@ -4,7 +4,7 @@


class SimilarityRester(BaseRester[SimilarityDoc]):
suffix = "similarity"
suffix = "materials/similarity"
document_model = SimilarityDoc # type: ignore
primary_key = "material_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/substrates.py
Expand Up @@ -8,7 +8,7 @@


class SubstratesRester(BaseRester[SubstratesDoc]):
suffix = "substrates"
suffix = "materials/substrates"
document_model = SubstratesDoc # type: ignore
primary_key = "film_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/summary.py
Expand Up @@ -12,7 +12,7 @@


class SummaryRester(BaseRester[SummaryDoc]):
suffix = "summary"
suffix = "materials/summary"
document_model = SummaryDoc # type: ignore
primary_key = "material_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/surface_properties.py
Expand Up @@ -8,7 +8,7 @@


class SurfacePropertiesRester(BaseRester[SurfacePropDoc]):
suffix = "surface_properties"
suffix = "materials/surface_properties"
document_model = SurfacePropDoc # type: ignore
primary_key = "task_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/synthesis.py
Expand Up @@ -11,7 +11,7 @@


class SynthesisRester(BaseRester[SynthesisSearchResultModel]):
suffix = "synthesis"
suffix = "materials/synthesis"
document_model = SynthesisSearchResultModel # type: ignore

def search_synthesis_text(self, *args, **kwargs): # pragma: no cover
Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/tasks.py
Expand Up @@ -8,7 +8,7 @@


class TaskRester(BaseRester[TaskDoc]):
suffix = "tasks"
suffix = "materials/tasks"
document_model = TaskDoc # type: ignore
primary_key = "task_id"

Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/thermo.py
Expand Up @@ -12,7 +12,7 @@


class ThermoRester(BaseRester[ThermoDoc]):
suffix = "thermo"
suffix = "materials/thermo"
document_model = ThermoDoc # type: ignore
supports_versions = True
primary_key = "thermo_id"
Expand Down
2 changes: 1 addition & 1 deletion mp_api/client/routes/xas.py
Expand Up @@ -9,7 +9,7 @@


class XASRester(BaseRester[XASDoc]):
suffix = "xas"
suffix = "materials/xas"
document_model = XASDoc # type: ignore
primary_key = "spectrum_id"

Expand Down

0 comments on commit 570dbfc

Please sign in to comment.