Skip to content

Commit 4fa80ae

Browse files
backwards + forwards compat
1 parent ba938fa commit 4fa80ae

File tree

9 files changed

+269
-813
lines changed

9 files changed

+269
-813
lines changed

mp_api/client/core/JANAF_O2_data.json

Lines changed: 0 additions & 1 deletion
This file was deleted.

mp_api/client/core/utils.py

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,47 @@
11
from __future__ import annotations
22

3-
from typing import TYPE_CHECKING
3+
import re
4+
from typing import TYPE_CHECKING, Literal
45

56
import orjson
6-
from emmet.core.mpid_ext import validate_identifier
7+
from emmet.core import __version__ as _EMMET_CORE_VER
78
from monty.json import MontyDecoder
9+
from packaging.version import parse as parse_version
810

911
from mp_api.client.core.settings import MAPIClientSettings
1012

1113
if TYPE_CHECKING:
1214
from monty.json import MSONable
1315

1416

17+
def _compare_emmet_ver(
18+
ref_version: str, op: Literal["==", ">", ">=", "<", "<="]
19+
) -> bool:
20+
"""Compare the current emmet-core version to a reference for version guarding.
21+
22+
Example:
23+
_compare_emmet_ver("0.84.0rc0","<") returns
24+
emmet.core.__version__ < "0.84.0rc0"
25+
26+
Parameters
27+
-----------
28+
ref_version : str
29+
A reference version of emmet-core
30+
op : A mathematical operator
31+
"""
32+
op_to_op = {"==": "eq", ">": "gt", ">=": "ge", "<": "lt", "<=": "le"}
33+
return getattr(
34+
parse_version(_EMMET_CORE_VER),
35+
f"__{op_to_op.get(op,op)}__",
36+
)(parse_version(ref_version))
37+
38+
39+
if _compare_emmet_ver("0.85.0", ">="):
40+
from emmet.core.mpid_ext import validate_identifier
41+
else:
42+
validate_identifier = None
43+
44+
1545
def load_json(json_like: str | bytes, deser: bool = False, encoding: str = "utf-8"):
1646
"""Utility to load json in consistent manner."""
1747
data = orjson.loads(
@@ -20,6 +50,26 @@ def load_json(json_like: str | bytes, deser: bool = False, encoding: str = "utf-
2050
return MontyDecoder().process_decoded(data) if deser else data
2151

2252

53+
def _legacy_id_validation(id_list: list[str]) -> list[str]:
54+
"""Legacy utility to validate IDs, pre-AlphaID transition.
55+
56+
This function is temporarily maintained to allow for
57+
backwards compatibility with older versions of emmet, and will
58+
not be preserved.
59+
"""
60+
pattern = "(mp|mvc|mol|mpcule)-.*"
61+
if malformed_ids := {
62+
entry for entry in id_list if re.match(pattern, entry) is None
63+
}:
64+
raise ValueError(
65+
f"{'Entry' if len(malformed_ids) == 1 else 'Entries'}\n"
66+
f" {', '.join(malformed_ids)}\n"
67+
f"{'is' if len(malformed_ids) == 1 else 'are'} not formatted correctly!"
68+
)
69+
70+
return id_list
71+
72+
2373
def validate_ids(id_list: list[str]):
2474
"""Function to validate material and task IDs.
2575
@@ -41,7 +91,9 @@ def validate_ids(id_list: list[str]):
4191
# TODO: after the transition to AlphaID in the document models,
4292
# The following line should be changed to
4393
# return [validate_identifier(idx,serialize=True) for idx in id_list]
44-
return [str(validate_identifier(idx)) for idx in id_list]
94+
if validate_identifier:
95+
return [str(validate_identifier(idx)) for idx in id_list]
96+
return _legacy_id_validation(id_list)
4597

4698

4799
def allow_msonable_dict(monty_cls: type[MSONable]):

mp_api/client/mprester.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from emmet.core.mpid import MPID, AlphaID
1111
from emmet.core.settings import EmmetSettings
1212
from emmet.core.tasks import TaskDoc
13-
from emmet.core.types.enums import ThermoType
1413
from emmet.core.vasp.calc_types import CalcType
1514
from packaging import version
1615
from pymatgen.analysis.phase_diagram import PhaseDiagram
@@ -24,7 +23,7 @@
2423

2524
from mp_api.client.core import BaseRester, MPRestError
2625
from mp_api.client.core.settings import MAPIClientSettings
27-
from mp_api.client.core.utils import load_json, validate_ids
26+
from mp_api.client.core.utils import _compare_emmet_ver, load_json, validate_ids
2827
from mp_api.client.routes import GeneralStoreRester, MessagesRester, UserSettingsRester
2928
from mp_api.client.routes.materials import (
3029
AbsorptionRester,
@@ -59,6 +58,11 @@
5958
from mp_api.client.routes.materials.materials import MaterialsRester
6059
from mp_api.client.routes.molecules import MoleculeRester
6160

61+
if _compare_emmet_ver("0.85.0", ">="):
62+
from emmet.core.types.enums import ThermoType
63+
else:
64+
from emmet.core.thermo import ThermoType
65+
6266
if TYPE_CHECKING:
6367
from typing import Any, Literal
6468

mp_api/client/routes/materials/thermo.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@
44

55
import numpy as np
66
from emmet.core.thermo import ThermoDoc
7-
from emmet.core.types.enums import ThermoType
87
from pymatgen.analysis.phase_diagram import PhaseDiagram
98
from pymatgen.core import Element
109

1110
from mp_api.client.core import BaseRester
12-
from mp_api.client.core.utils import load_json, validate_ids
11+
from mp_api.client.core.utils import _compare_emmet_ver, load_json, validate_ids
12+
13+
if _compare_emmet_ver("0.85.0", ">="):
14+
from emmet.core.types.enums import ThermoType
15+
else:
16+
from emmet.core.thermo import ThermoType
1317

1418

1519
class ThermoRester(BaseRester[ThermoDoc]):

mp_api/client/routes/materials/xas.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,17 @@
99
from mp_api.client.core.utils import validate_ids
1010

1111
if TYPE_CHECKING:
12-
from emmet.core.types.enums import XasEdge, XasType
12+
from mp_api.client.core.utils import _compare_emmet_ver
13+
14+
if _compare_emmet_ver("0.85.0", ">="):
15+
from emmet.core.types.enums import XasEdge, XasType
16+
else:
17+
from emmet.core.xas import (
18+
Edge as XasEdge,
19+
)
20+
from emmet.core.xas import (
21+
Type as XasType,
22+
)
1323

1424

1525
class XASRester(BaseRester[XASDoc]):

tests/materials/test_thermo.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,15 @@
22
from core_function import client_search_testing
33

44
import pytest
5-
from emmet.core.types.enums import ThermoType
65
from pymatgen.analysis.phase_diagram import PhaseDiagram
76

87
from mp_api.client.routes.materials.thermo import ThermoRester
8+
from mp_api.client.core.utils import _compare_emmet_ver
9+
10+
if _compare_emmet_ver("0.85.0", ">="):
11+
from emmet.core.types.enums import ThermoType
12+
else:
13+
from emmet.core.thermo import ThermoType
914

1015

1116
@pytest.fixture

tests/materials/test_xas.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,18 @@
22
from core_function import client_search_testing
33

44
import pytest
5-
from emmet.core.types.enums import XasEdge, XasType
65
from pymatgen.core.periodic_table import Element
76

87
from mp_api.client.routes.materials.xas import XASRester
8+
from mp_api.client.core.utils import _compare_emmet_ver
9+
10+
if _compare_emmet_ver("0.85.0", ">="):
11+
from emmet.core.types.enums import XasEdge, XasType
12+
else:
13+
from emmet.core.xas import (
14+
Type as XasType,
15+
Edge as XasEdge,
16+
)
917

1018

1119
@pytest.fixture

tests/test_mprester.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import numpy as np
77
import pytest
88
from emmet.core.tasks import TaskDoc
9-
from emmet.core.types.enums import ThermoType
109
from emmet.core.vasp.calc_types import CalcType
1110
from pymatgen.analysis.phase_diagram import PhaseDiagram
1211
from pymatgen.analysis.pourbaix_diagram import IonEntry, PourbaixDiagram, PourbaixEntry
@@ -32,6 +31,12 @@
3231
from mp_api.client import MPRester
3332
from mp_api.client.core.client import MPRestError
3433
from mp_api.client.core.settings import MAPIClientSettings
34+
from mp_api.client.core.utils import _compare_emmet_ver
35+
36+
if _compare_emmet_ver("0.85.0", ">="):
37+
from emmet.core.types.enums import ThermoType
38+
else:
39+
from emmet.core.thermo import ThermoType
3540

3641

3742
@pytest.fixture()

0 commit comments

Comments
 (0)