mp-api 0.46.2rc11__tar.gz → 0.46.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. {mp_api-0.46.2rc11 → mp_api-0.46.3}/PKG-INFO +3 -3
  2. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/core/client.py +67 -16
  3. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/materials.py +4 -1
  4. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api.egg-info/PKG-INFO +3 -3
  5. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api.egg-info/requires.txt +2 -2
  6. {mp_api-0.46.2rc11 → mp_api-0.46.3}/pyproject.toml +2 -2
  7. {mp_api-0.46.2rc11 → mp_api-0.46.3}/requirements/requirements-ubuntu-latest_py3.11.txt +3 -3
  8. {mp_api-0.46.2rc11 → mp_api-0.46.3}/requirements/requirements-ubuntu-latest_py3.11_extras.txt +9 -9
  9. {mp_api-0.46.2rc11 → mp_api-0.46.3}/requirements/requirements-ubuntu-latest_py3.12.txt +3 -3
  10. {mp_api-0.46.2rc11 → mp_api-0.46.3}/requirements/requirements-ubuntu-latest_py3.12_extras.txt +9 -9
  11. {mp_api-0.46.2rc11 → mp_api-0.46.3}/requirements/requirements-ubuntu-latest_py3.13.txt +3 -3
  12. {mp_api-0.46.2rc11 → mp_api-0.46.3}/requirements/requirements-ubuntu-latest_py3.13_extras.txt +9 -9
  13. {mp_api-0.46.2rc11 → mp_api-0.46.3}/requirements/requirements-ubuntu-latest_py3.14.txt +3 -3
  14. {mp_api-0.46.2rc11 → mp_api-0.46.3}/requirements/requirements-ubuntu-latest_py3.14_extras.txt +9 -9
  15. {mp_api-0.46.2rc11 → mp_api-0.46.3}/.coveragerc +0 -0
  16. {mp_api-0.46.2rc11 → mp_api-0.46.3}/.github/workflows/lint.yml +0 -0
  17. {mp_api-0.46.2rc11 → mp_api-0.46.3}/.github/workflows/release.yml +0 -0
  18. {mp_api-0.46.2rc11 → mp_api-0.46.3}/.github/workflows/testing.yml +0 -0
  19. {mp_api-0.46.2rc11 → mp_api-0.46.3}/.github/workflows/upgrade_dependencies.yml +0 -0
  20. {mp_api-0.46.2rc11 → mp_api-0.46.3}/.gitignore +0 -0
  21. {mp_api-0.46.2rc11 → mp_api-0.46.3}/.pre-commit-config.yaml +0 -0
  22. {mp_api-0.46.2rc11 → mp_api-0.46.3}/CODE_OF_CONDUCT.md +0 -0
  23. {mp_api-0.46.2rc11 → mp_api-0.46.3}/LICENSE +0 -0
  24. {mp_api-0.46.2rc11 → mp_api-0.46.3}/README.md +0 -0
  25. {mp_api-0.46.2rc11 → mp_api-0.46.3}/dev/generate_mcp_tools.py +0 -0
  26. {mp_api-0.46.2rc11 → mp_api-0.46.3}/dev/inspect_mcp.sh +0 -0
  27. {mp_api-0.46.2rc11 → mp_api-0.46.3}/docs/Makefile +0 -0
  28. {mp_api-0.46.2rc11 → mp_api-0.46.3}/docs/_templates/custom-class-template.rst +0 -0
  29. {mp_api-0.46.2rc11 → mp_api-0.46.3}/docs/_templates/custom-module-template.rst +0 -0
  30. {mp_api-0.46.2rc11 → mp_api-0.46.3}/docs/conf.py +0 -0
  31. {mp_api-0.46.2rc11 → mp_api-0.46.3}/docs/index.rst +0 -0
  32. {mp_api-0.46.2rc11 → mp_api-0.46.3}/docs/make.bat +0 -0
  33. {mp_api-0.46.2rc11 → mp_api-0.46.3}/docs/modules.rst +0 -0
  34. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/__init__.py +0 -0
  35. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/_test_utils.py +0 -0
  36. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/__init__.py +0 -0
  37. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/_server_utils.py +0 -0
  38. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/contribs/__init__.py +0 -0
  39. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/contribs/_logger.py +0 -0
  40. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/contribs/_types.py +0 -0
  41. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/contribs/_units.py +0 -0
  42. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/contribs/client.py +0 -0
  43. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/contribs/schemas.py +0 -0
  44. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/contribs/settings.py +0 -0
  45. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/contribs/utils.py +0 -0
  46. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/core/__init__.py +0 -0
  47. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/core/_oxygen_evolution.py +0 -0
  48. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/core/exceptions.py +0 -0
  49. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/core/schemas.py +0 -0
  50. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/core/settings.py +0 -0
  51. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/core/utils.py +0 -0
  52. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/mprester.py +0 -0
  53. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/__init__.py +0 -0
  54. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/_server.py +0 -0
  55. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/__init__.py +0 -0
  56. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/absorption.py +0 -0
  57. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/alloys.py +0 -0
  58. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/bonds.py +0 -0
  59. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/chemenv.py +0 -0
  60. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/dielectric.py +0 -0
  61. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/doi.py +0 -0
  62. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/elasticity.py +0 -0
  63. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/electrodes.py +0 -0
  64. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/electronic_structure.py +0 -0
  65. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/eos.py +0 -0
  66. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/grain_boundaries.py +0 -0
  67. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/magnetism.py +0 -0
  68. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/oxidation_states.py +0 -0
  69. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/phonon.py +0 -0
  70. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/piezo.py +0 -0
  71. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/provenance.py +0 -0
  72. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/robocrys.py +0 -0
  73. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/similarity.py +0 -0
  74. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/substrates.py +0 -0
  75. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/summary.py +0 -0
  76. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/surface_properties.py +0 -0
  77. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/synthesis.py +0 -0
  78. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/tasks.py +0 -0
  79. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/thermo.py +0 -0
  80. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/materials/xas.py +0 -0
  81. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/molecules/__init__.py +0 -0
  82. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/molecules/jcesr.py +0 -0
  83. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/molecules/molecules.py +0 -0
  84. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/client/routes/molecules/summary.py +0 -0
  85. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/mcp/__init__.py +0 -0
  86. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/mcp/_schemas.py +0 -0
  87. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/mcp/mp_mcp.py +0 -0
  88. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/mcp/server.py +0 -0
  89. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/mcp/tools.py +0 -0
  90. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/mcp/utils.py +0 -0
  91. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api/py.typed +0 -0
  92. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api.egg-info/SOURCES.txt +0 -0
  93. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api.egg-info/dependency_links.txt +0 -0
  94. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api.egg-info/entry_points.txt +0 -0
  95. {mp_api-0.46.2rc11 → mp_api-0.46.3}/mp_api.egg-info/top_level.txt +0 -0
  96. {mp_api-0.46.2rc11 → mp_api-0.46.3}/setup.cfg +0 -0
  97. {mp_api-0.46.2rc11 → mp_api-0.46.3}/test_files/Si_mp_149.cif +0 -0
  98. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/__init__.py +0 -0
  99. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/__init__.py +0 -0
  100. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/contribs/conftest.py +0 -0
  101. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/contribs/test_client.py +0 -0
  102. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/contribs/test_contribs_schemas.py +0 -0
  103. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/contribs/test_contribs_utils.py +0 -0
  104. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/contribs/test_types.py +0 -0
  105. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/core/test_oxygen_evolution.py +0 -0
  106. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/core/test_schemas.py +0 -0
  107. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/core/test_utils.py +0 -0
  108. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/__init__.py +0 -0
  109. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_absorption.py +0 -0
  110. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_alloys.py +0 -0
  111. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_bonds.py +0 -0
  112. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_chemenv.py +0 -0
  113. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_dielectric.py +0 -0
  114. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_doi.py +0 -0
  115. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_elasticity.py +0 -0
  116. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_electrodes.py +0 -0
  117. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_electronic_structure.py +0 -0
  118. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_eos.py +0 -0
  119. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_grain_boundary.py +0 -0
  120. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_magnetism.py +0 -0
  121. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_materials.py +0 -0
  122. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_oxidation_states.py +0 -0
  123. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_phonon.py +0 -0
  124. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_piezo.py +0 -0
  125. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_provenance.py +0 -0
  126. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_robocrys.py +0 -0
  127. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_similarity.py +0 -0
  128. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_substrates.py +0 -0
  129. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_summary.py +0 -0
  130. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_surface_properties.py +0 -0
  131. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_synthesis.py +0 -0
  132. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_tasks.py +0 -0
  133. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_thermo.py +0 -0
  134. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/materials/test_xas.py +0 -0
  135. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/molecules/__init__.py +0 -0
  136. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/molecules/test_jcesr.py +0 -0
  137. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/molecules/test_molecules.py +0 -0
  138. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/molecules/test_summary.py +0 -0
  139. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/test_client.py +0 -0
  140. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/test_core_client.py +0 -0
  141. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/test_heartbeat.py +0 -0
  142. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/client/test_mprester.py +0 -0
  143. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/mcp/__init__.py +0 -0
  144. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/mcp/test_server.py +0 -0
  145. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/mcp/test_tools.py +0 -0
  146. {mp_api-0.46.2rc11 → mp_api-0.46.3}/tests/mcp/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mp-api
3
- Version: 0.46.2rc11
3
+ Version: 0.46.3
4
4
  Summary: API Client for the Materials Project
5
5
  Author-email: The Materials Project <feedback@materialsproject.org>
6
6
  License-Expression: BSD-3-Clause-LBNL
@@ -17,7 +17,7 @@ Requires-Dist: pymatgen>2024.2.20
17
17
  Requires-Dist: typing-extensions>=3.7.4.1
18
18
  Requires-Dist: requests>=2.23.0
19
19
  Requires-Dist: monty>=2024.12.10
20
- Requires-Dist: emmet-core<0.87.2,>=0.87.0rc11
20
+ Requires-Dist: emmet-core<0.87.2,>=0.87.0
21
21
  Requires-Dist: boto3
22
22
  Requires-Dist: orjson<4,>=3.10
23
23
  Requires-Dist: pyarrow>=20.0.0
@@ -40,7 +40,7 @@ Requires-Dist: cachetools; extra == "contribs"
40
40
  Requires-Dist: pymongo; extra == "contribs"
41
41
  Provides-Extra: all
42
42
  Requires-Dist: custodian; extra == "all"
43
- Requires-Dist: emmet-core[all]<0.87.2,>=0.87.0rc11; extra == "all"
43
+ Requires-Dist: emmet-core[all]<0.87.2,>=0.87.0; extra == "all"
44
44
  Requires-Dist: fastmcp; extra == "all"
45
45
  Requires-Dist: flask; extra == "all"
46
46
  Provides-Extra: test
@@ -33,7 +33,7 @@ import requests
33
33
  from botocore import UNSIGNED
34
34
  from botocore.config import Config
35
35
  from botocore.exceptions import ClientError
36
- from deltalake import DeltaTable, QueryBuilder, convert_to_deltalake
36
+ from deltalake import DeltaTable, QueryBuilder, Schema, convert_to_deltalake
37
37
  from emmet.core.arrow import arrowize
38
38
  from emmet.core.utils import jsanitize
39
39
  from pydantic import BaseModel
@@ -79,6 +79,14 @@ STATIC_COLLECTIONS = [
79
79
  "synth-descriptions",
80
80
  "xas",
81
81
  ]
82
+ CONTROLLED_COLLECTIONS = [
83
+ "chemenv",
84
+ "materials",
85
+ "oxidation-states",
86
+ "summary",
87
+ "tasks",
88
+ "thermo",
89
+ ]
82
90
 
83
91
  hdlr = logging.StreamHandler()
84
92
  fmt = logging.Formatter("%(name)s - %(levelname)s - %(message)s")
@@ -605,7 +613,7 @@ class BaseRester(_Rester):
605
613
  DeltaTable : If one exists at the specified bucket / prefix,
606
614
  will retrieve the cached instance.
607
615
  """
608
- delta_timeout = f"{self.timeout}s"
616
+ delta_timeout = f"{self.timeout * 3}s"
609
617
  full_key = f"{bucket}/{prefix}"
610
618
  qb_label = label or full_key.replace("/", "_").replace("-", "_")
611
619
 
@@ -630,6 +638,7 @@ class BaseRester(_Rester):
630
638
  "AWS_REGION": "us-east-1",
631
639
  "timeout": delta_timeout,
632
640
  "connect_timeout": delta_timeout,
641
+ "pool_idle_timeout": delta_timeout,
633
642
  "retry_delay": "3",
634
643
  "max_retries": f"{MAPI_CLIENT_SETTINGS.MAX_RETRIES}",
635
644
  },
@@ -683,6 +692,7 @@ class BaseRester(_Rester):
683
692
  bucket: str,
684
693
  prefix: str,
685
694
  access_controlled: bool = True,
695
+ versioned: bool = False,
686
696
  timeout: int | None = None,
687
697
  label: str | None = None,
688
698
  ) -> dict[str, Any]:
@@ -692,12 +702,16 @@ class BaseRester(_Rester):
692
702
  bucket (str) : S3 OpenData bucket
693
703
  prefix (str) : S3 object prefix
694
704
  access_controlled (bool): whether or not table has access controlled data
705
+ versioned (bool): whether or not table is partitioned on db version
695
706
  timeout (int or None) : timeout on getting access-controlled groups
696
707
  label (str or None) : label of the table in QueryBuilder
697
708
 
698
709
  Returns:
699
710
  dict of str to Any
700
711
  """
712
+ # just in case
713
+ prefix = prefix.rstrip("/")
714
+
701
715
  # Check if user has access to GNoMe
702
716
  # temp suppress tqdm
703
717
  re_enable = not self.mute_progress_bars
@@ -755,11 +769,15 @@ class BaseRester(_Rester):
755
769
  controlled_batch_str = ",".join(
756
770
  [f"'{tag}'" for tag in self.access_controlled_batch_ids]
757
771
  )
772
+ _coll = prefix.split("/")[-1]
773
+
774
+ if _coll == "tasks":
775
+ condition = f"batch_id NOT IN ({controlled_batch_str})"
776
+ else:
777
+ condition = "builder_meta.license != 'BY-NC'"
758
778
 
759
779
  predicate = (
760
- f"WHERE batch_id NOT IN ({controlled_batch_str})"
761
- if not has_gnome_access and controlled_batch_str and access_controlled
762
- else ""
780
+ f"WHERE {condition}" if not has_gnome_access and access_controlled else ""
763
781
  )
764
782
  # TODO: do we need something like this?
765
783
  # predicate += f"{' AND ' if predicate else 'WHERE '}version='{self.db_version}'"
@@ -768,10 +786,13 @@ class BaseRester(_Rester):
768
786
  num_docs_needed: int = tbl.count()
769
787
 
770
788
  if not has_gnome_access:
789
+ mongo_predicate = (
790
+ {"batch_id_neq_any": self.access_controlled_batch_ids}
791
+ if _coll == "tasks"
792
+ else {"license": "BY-NC"}
793
+ )
771
794
  try:
772
- num_docs_needed = self.count(
773
- {"batch_id_neq_any": self.access_controlled_batch_ids}
774
- )
795
+ num_docs_needed = self.count(mongo_predicate)
775
796
  except MPRestError:
776
797
  # batch_id isn't a valid field
777
798
  num_docs_needed = self.count()
@@ -793,7 +814,12 @@ class BaseRester(_Rester):
793
814
 
794
815
  file_options = ds.ParquetFileFormat().make_write_options(compression="zstd")
795
816
 
796
- def _flush(accumulator: list[pa.RecordBatch], group: int, schema: pa.Schema):
817
+ def _flush(
818
+ accumulator: list[pa.RecordBatch],
819
+ group: int,
820
+ schema: pa.Schema,
821
+ partitioning: pa.dataset.Partitioning,
822
+ ):
797
823
  # somewhere post datafusion 51.0.0 and arrow-rs 57.0.0
798
824
  # casts to *View types began, need to cast back to base schema
799
825
  # -> pyarrow is behind on implementation support for *View types
@@ -807,6 +833,7 @@ class BaseRester(_Rester):
807
833
  tbl,
808
834
  base_dir=target_path,
809
835
  format="parquet",
836
+ partitioning=partitioning,
810
837
  basename_template=f"group-{group}-" + "part-{i}.zstd.parquet",
811
838
  existing_data_behavior="overwrite_or_ignore",
812
839
  max_rows_per_group=1024,
@@ -816,7 +843,18 @@ class BaseRester(_Rester):
816
843
  group = 1
817
844
  size = 0
818
845
  accumulator = []
819
- schema = pa.schema(arrowize(self.document_model))
846
+ _schema = pa.schema(arrowize(self.document_model))
847
+ schema = (
848
+ _schema.insert(0, pa.field("version", pa.string()))
849
+ if versioned
850
+ else _schema
851
+ )
852
+ partitioning_schema = pa.schema([pa.field("version", pa.string())])
853
+ partitioning = (
854
+ pa.dataset.partitioning(partitioning_schema, flavor="hive")
855
+ if versioned
856
+ else None
857
+ )
820
858
  for page in iterator:
821
859
  # arro3 rb to pyarrow rb for compat w/ pyarrow ds writer
822
860
  rg = pa.record_batch(page)
@@ -828,13 +866,13 @@ class BaseRester(_Rester):
828
866
  pbar.update(page_size)
829
867
 
830
868
  if size >= MAPI_CLIENT_SETTINGS.DATASET_FLUSH_THRESHOLD:
831
- _flush(accumulator, group, schema)
869
+ _flush(accumulator, group, schema, partitioning)
832
870
  group += 1
833
871
  size = 0
834
872
  accumulator.clear()
835
873
 
836
874
  if accumulator:
837
- _flush(accumulator, group + 1, schema)
875
+ _flush(accumulator, group + 1, schema, partitioning)
838
876
 
839
877
  if pbar is not None:
840
878
  pbar.close()
@@ -842,7 +880,13 @@ class BaseRester(_Rester):
842
880
  logger.info(f"Dataset for {suffix} written to {target_path}")
843
881
  logger.info("Converting to DeltaTable...")
844
882
 
845
- convert_to_deltalake(target_path)
883
+ delta_paritioning = Schema.from_arrow(partitioning_schema)
884
+
885
+ convert_to_deltalake(
886
+ target_path,
887
+ partition_by=delta_paritioning if versioned else None,
888
+ partition_strategy="hive" if versioned else None,
889
+ )
846
890
 
847
891
  logger.info(
848
892
  "Consult the delta-rs and pyarrow documentation for advanced usage: "
@@ -928,13 +972,15 @@ class BaseRester(_Rester):
928
972
  suffix = self.suffix
929
973
  elif self.suffix == "molecules/summary":
930
974
  suffix = "molecules"
975
+ elif self.suffix == "molecules/jcesr":
976
+ suffix = "jcesr"
931
977
  else:
932
978
  infix, suffix = self.suffix.split("/", 1)
933
979
  suffix = infix if suffix == "core" else suffix
934
980
  suffix = suffix.replace("_", "-")
935
981
 
936
982
  if "tasks" in suffix:
937
- bucket_suffix, prefix = ("parsed", "core/tasks/")
983
+ bucket_suffix, prefix = ("parsed", "core/tasks")
938
984
  elif suffix in STATIC_COLLECTIONS:
939
985
  bucket_suffix = "build"
940
986
  prefix = f"static-collections/{suffix}"
@@ -946,9 +992,14 @@ class BaseRester(_Rester):
946
992
  bucket = f"materialsproject-{bucket_suffix}"
947
993
 
948
994
  if self.delta_backed:
949
- access_controlled = suffix not in STATIC_COLLECTIONS
995
+ access_controlled = suffix in CONTROLLED_COLLECTIONS
996
+ versioned = suffix != "tasks" and suffix not in STATIC_COLLECTIONS
950
997
  return self._query_delta_backed(
951
- bucket, prefix, access_controlled, timeout=timeout
998
+ bucket=bucket,
999
+ prefix=prefix,
1000
+ access_controlled=access_controlled,
1001
+ versioned=versioned,
1002
+ timeout=timeout,
952
1003
  )
953
1004
 
954
1005
  # Paginate over all entries in the bucket.
@@ -102,7 +102,7 @@ class MaterialsRester(CoreRester):
102
102
  Returns:
103
103
  ([MaterialsDoc], [dict]) List of material documents or dictionaries.
104
104
  """
105
- query_params: dict = {"deprecated": deprecated}
105
+ query_params: dict = dict()
106
106
 
107
107
  if material_ids:
108
108
  if isinstance(material_ids, str):
@@ -163,6 +163,9 @@ class MaterialsRester(CoreRester):
163
163
  if query_params[entry] is not None
164
164
  }
165
165
 
166
+ if query_params:
167
+ query_params.update({"deprecated": deprecated})
168
+
166
169
  return super()._search( # type: ignore[return-value]
167
170
  num_chunks=num_chunks,
168
171
  chunk_size=chunk_size,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mp-api
3
- Version: 0.46.2rc11
3
+ Version: 0.46.3
4
4
  Summary: API Client for the Materials Project
5
5
  Author-email: The Materials Project <feedback@materialsproject.org>
6
6
  License-Expression: BSD-3-Clause-LBNL
@@ -17,7 +17,7 @@ Requires-Dist: pymatgen>2024.2.20
17
17
  Requires-Dist: typing-extensions>=3.7.4.1
18
18
  Requires-Dist: requests>=2.23.0
19
19
  Requires-Dist: monty>=2024.12.10
20
- Requires-Dist: emmet-core<0.87.2,>=0.87.0rc11
20
+ Requires-Dist: emmet-core<0.87.2,>=0.87.0
21
21
  Requires-Dist: boto3
22
22
  Requires-Dist: orjson<4,>=3.10
23
23
  Requires-Dist: pyarrow>=20.0.0
@@ -40,7 +40,7 @@ Requires-Dist: cachetools; extra == "contribs"
40
40
  Requires-Dist: pymongo; extra == "contribs"
41
41
  Provides-Extra: all
42
42
  Requires-Dist: custodian; extra == "all"
43
- Requires-Dist: emmet-core[all]<0.87.2,>=0.87.0rc11; extra == "all"
43
+ Requires-Dist: emmet-core[all]<0.87.2,>=0.87.0; extra == "all"
44
44
  Requires-Dist: fastmcp; extra == "all"
45
45
  Requires-Dist: flask; extra == "all"
46
46
  Provides-Extra: test
@@ -2,7 +2,7 @@ pymatgen>2024.2.20
2
2
  typing-extensions>=3.7.4.1
3
3
  requests>=2.23.0
4
4
  monty>=2024.12.10
5
- emmet-core<0.87.2,>=0.87.0rc11
5
+ emmet-core<0.87.2,>=0.87.0
6
6
  boto3
7
7
  orjson<4,>=3.10
8
8
  pyarrow>=20.0.0
@@ -10,7 +10,7 @@ deltalake<1.6.0,>=1.4.0
10
10
 
11
11
  [all]
12
12
  custodian
13
- emmet-core[all]<0.87.2,>=0.87.0rc11
13
+ emmet-core[all]<0.87.2,>=0.87.0
14
14
  fastmcp
15
15
  flask
16
16
 
@@ -24,7 +24,7 @@ dependencies = [
24
24
  "typing-extensions>=3.7.4.1",
25
25
  "requests>=2.23.0",
26
26
  "monty>=2024.12.10",
27
- "emmet-core>=0.87.0rc11,<0.87.2",
27
+ "emmet-core>=0.87.0,<0.87.2",
28
28
  "boto3",
29
29
  "orjson >= 3.10,<4",
30
30
  "pyarrow >= 20.0.0",
@@ -50,7 +50,7 @@ contribs = [
50
50
  ]
51
51
  all = [
52
52
  "custodian",
53
- "emmet-core[all]>=0.87.0rc11,<0.87.2",
53
+ "emmet-core[all]>=0.87.0,<0.87.2",
54
54
  "fastmcp",
55
55
  "flask",
56
56
  ]
@@ -12,9 +12,9 @@ bibtexparser==1.4.4
12
12
  # via pymatgen-core
13
13
  blake3==1.0.8
14
14
  # via emmet-core
15
- boto3==1.43.24
15
+ boto3==1.43.25
16
16
  # via mp-api (pyproject.toml)
17
- botocore==1.43.24
17
+ botocore==1.43.25
18
18
  # via
19
19
  # boto3
20
20
  # s3transfer
@@ -30,7 +30,7 @@ deltalake==1.5.1
30
30
  # via mp-api (pyproject.toml)
31
31
  deprecated==1.3.1
32
32
  # via deltalake
33
- emmet-core==0.87.0rc13
33
+ emmet-core==0.87.0
34
34
  # via mp-api (pyproject.toml)
35
35
  fonttools==4.63.0
36
36
  # via matplotlib
@@ -50,9 +50,9 @@ blinker==1.9.0
50
50
  # via flask
51
51
  boltons==25.0.0
52
52
  # via mp-api (pyproject.toml)
53
- boto3==1.43.24
53
+ boto3==1.43.25
54
54
  # via mp-api (pyproject.toml)
55
- botocore==1.43.24
55
+ botocore==1.43.25
56
56
  # via
57
57
  # boto3
58
58
  # s3transfer
@@ -103,7 +103,7 @@ deltalake==1.5.1
103
103
  # via mp-api (pyproject.toml)
104
104
  deprecated==1.3.1
105
105
  # via deltalake
106
- distlib==0.4.1
106
+ distlib==0.4.2
107
107
  # via virtualenv
108
108
  dnspython==2.8.0
109
109
  # via
@@ -116,7 +116,7 @@ docutils==0.22.4
116
116
  # via sphinx
117
117
  email-validator==2.3.0
118
118
  # via pydantic
119
- emmet-core[all]==0.87.0rc13
119
+ emmet-core[all]==0.87.0
120
120
  # via mp-api (pyproject.toml)
121
121
  exceptiongroup==1.3.1
122
122
  # via fastmcp-slim
@@ -124,9 +124,9 @@ execnet==2.1.2
124
124
  # via pytest-xdist
125
125
  executing==2.2.1
126
126
  # via stack-data
127
- fastmcp==3.4.1
127
+ fastmcp==3.4.2
128
128
  # via mp-api (pyproject.toml)
129
- fastmcp-slim[client,server]==3.4.1
129
+ fastmcp-slim[client,server]==3.4.2
130
130
  # via fastmcp
131
131
  filelock==3.29.1
132
132
  # via
@@ -215,7 +215,7 @@ joblib==1.5.3
215
215
  # via
216
216
  # pymatgen-analysis-diffusion
217
217
  # pymatgen-core
218
- joserfc==1.7.0
218
+ joserfc==1.7.1
219
219
  # via
220
220
  # authlib
221
221
  # fastmcp-slim
@@ -644,7 +644,7 @@ types-requests==2.33.0.20260518
644
644
  # types-tqdm
645
645
  types-setuptools==82.0.0.20260518
646
646
  # via mp-api (pyproject.toml)
647
- types-tqdm==4.67.3.20260518
647
+ types-tqdm==4.68.0.20260608
648
648
  # via mp-api (pyproject.toml)
649
649
  typing-extensions==4.15.0
650
650
  # via
@@ -699,7 +699,7 @@ virtualenv==21.4.2
699
699
  # via pre-commit
700
700
  watchfiles==1.2.0
701
701
  # via fastmcp-slim
702
- wcwidth==0.7.0
702
+ wcwidth==0.8.1
703
703
  # via prompt-toolkit
704
704
  webcolors==25.10.0
705
705
  # via jsonschema
@@ -12,9 +12,9 @@ bibtexparser==1.4.4
12
12
  # via pymatgen-core
13
13
  blake3==1.0.8
14
14
  # via emmet-core
15
- boto3==1.43.24
15
+ boto3==1.43.25
16
16
  # via mp-api (pyproject.toml)
17
- botocore==1.43.24
17
+ botocore==1.43.25
18
18
  # via
19
19
  # boto3
20
20
  # s3transfer
@@ -30,7 +30,7 @@ deltalake==1.5.1
30
30
  # via mp-api (pyproject.toml)
31
31
  deprecated==1.3.1
32
32
  # via deltalake
33
- emmet-core==0.87.0rc13
33
+ emmet-core==0.87.0
34
34
  # via mp-api (pyproject.toml)
35
35
  fonttools==4.63.0
36
36
  # via matplotlib
@@ -48,9 +48,9 @@ blinker==1.9.0
48
48
  # via flask
49
49
  boltons==25.0.0
50
50
  # via mp-api (pyproject.toml)
51
- boto3==1.43.24
51
+ boto3==1.43.25
52
52
  # via mp-api (pyproject.toml)
53
- botocore==1.43.24
53
+ botocore==1.43.25
54
54
  # via
55
55
  # boto3
56
56
  # s3transfer
@@ -101,7 +101,7 @@ deltalake==1.5.1
101
101
  # via mp-api (pyproject.toml)
102
102
  deprecated==1.3.1
103
103
  # via deltalake
104
- distlib==0.4.1
104
+ distlib==0.4.2
105
105
  # via virtualenv
106
106
  dnspython==2.8.0
107
107
  # via
@@ -114,7 +114,7 @@ docutils==0.22.4
114
114
  # via sphinx
115
115
  email-validator==2.3.0
116
116
  # via pydantic
117
- emmet-core[all]==0.87.0rc13
117
+ emmet-core[all]==0.87.0
118
118
  # via mp-api (pyproject.toml)
119
119
  exceptiongroup==1.3.1
120
120
  # via fastmcp-slim
@@ -122,9 +122,9 @@ execnet==2.1.2
122
122
  # via pytest-xdist
123
123
  executing==2.2.1
124
124
  # via stack-data
125
- fastmcp==3.4.1
125
+ fastmcp==3.4.2
126
126
  # via mp-api (pyproject.toml)
127
- fastmcp-slim[client,server]==3.4.1
127
+ fastmcp-slim[client,server]==3.4.2
128
128
  # via fastmcp
129
129
  filelock==3.29.1
130
130
  # via
@@ -211,7 +211,7 @@ joblib==1.5.3
211
211
  # via
212
212
  # pymatgen-analysis-diffusion
213
213
  # pymatgen-core
214
- joserfc==1.7.0
214
+ joserfc==1.7.1
215
215
  # via
216
216
  # authlib
217
217
  # fastmcp-slim
@@ -640,7 +640,7 @@ types-requests==2.33.0.20260518
640
640
  # types-tqdm
641
641
  types-setuptools==82.0.0.20260518
642
642
  # via mp-api (pyproject.toml)
643
- types-tqdm==4.67.3.20260518
643
+ types-tqdm==4.68.0.20260608
644
644
  # via mp-api (pyproject.toml)
645
645
  typing-extensions==4.15.0
646
646
  # via
@@ -692,7 +692,7 @@ virtualenv==21.4.2
692
692
  # via pre-commit
693
693
  watchfiles==1.2.0
694
694
  # via fastmcp-slim
695
- wcwidth==0.7.0
695
+ wcwidth==0.8.1
696
696
  # via prompt-toolkit
697
697
  webcolors==25.10.0
698
698
  # via jsonschema
@@ -12,9 +12,9 @@ bibtexparser==1.4.4
12
12
  # via pymatgen-core
13
13
  blake3==1.0.8
14
14
  # via emmet-core
15
- boto3==1.43.24
15
+ boto3==1.43.25
16
16
  # via mp-api (pyproject.toml)
17
- botocore==1.43.24
17
+ botocore==1.43.25
18
18
  # via
19
19
  # boto3
20
20
  # s3transfer
@@ -30,7 +30,7 @@ deltalake==1.5.1
30
30
  # via mp-api (pyproject.toml)
31
31
  deprecated==1.3.1
32
32
  # via deltalake
33
- emmet-core==0.87.0rc13
33
+ emmet-core==0.87.0
34
34
  # via mp-api (pyproject.toml)
35
35
  fonttools==4.63.0
36
36
  # via matplotlib
@@ -48,9 +48,9 @@ blinker==1.9.0
48
48
  # via flask
49
49
  boltons==25.0.0
50
50
  # via mp-api (pyproject.toml)
51
- boto3==1.43.24
51
+ boto3==1.43.25
52
52
  # via mp-api (pyproject.toml)
53
- botocore==1.43.24
53
+ botocore==1.43.25
54
54
  # via
55
55
  # boto3
56
56
  # s3transfer
@@ -101,7 +101,7 @@ deltalake==1.5.1
101
101
  # via mp-api (pyproject.toml)
102
102
  deprecated==1.3.1
103
103
  # via deltalake
104
- distlib==0.4.1
104
+ distlib==0.4.2
105
105
  # via virtualenv
106
106
  dnspython==2.8.0
107
107
  # via
@@ -114,7 +114,7 @@ docutils==0.22.4
114
114
  # via sphinx
115
115
  email-validator==2.3.0
116
116
  # via pydantic
117
- emmet-core[all]==0.87.0rc13
117
+ emmet-core[all]==0.87.0
118
118
  # via mp-api (pyproject.toml)
119
119
  exceptiongroup==1.3.1
120
120
  # via fastmcp-slim
@@ -122,9 +122,9 @@ execnet==2.1.2
122
122
  # via pytest-xdist
123
123
  executing==2.2.1
124
124
  # via stack-data
125
- fastmcp==3.4.1
125
+ fastmcp==3.4.2
126
126
  # via mp-api (pyproject.toml)
127
- fastmcp-slim[client,server]==3.4.1
127
+ fastmcp-slim[client,server]==3.4.2
128
128
  # via fastmcp
129
129
  filelock==3.29.1
130
130
  # via
@@ -211,7 +211,7 @@ joblib==1.5.3
211
211
  # via
212
212
  # pymatgen-analysis-diffusion
213
213
  # pymatgen-core
214
- joserfc==1.7.0
214
+ joserfc==1.7.1
215
215
  # via
216
216
  # authlib
217
217
  # fastmcp-slim
@@ -640,7 +640,7 @@ types-requests==2.33.0.20260518
640
640
  # types-tqdm
641
641
  types-setuptools==82.0.0.20260518
642
642
  # via mp-api (pyproject.toml)
643
- types-tqdm==4.67.3.20260518
643
+ types-tqdm==4.68.0.20260608
644
644
  # via mp-api (pyproject.toml)
645
645
  typing-extensions==4.15.0
646
646
  # via
@@ -686,7 +686,7 @@ virtualenv==21.4.2
686
686
  # via pre-commit
687
687
  watchfiles==1.2.0
688
688
  # via fastmcp-slim
689
- wcwidth==0.7.0
689
+ wcwidth==0.8.1
690
690
  # via prompt-toolkit
691
691
  webcolors==25.10.0
692
692
  # via jsonschema
@@ -12,9 +12,9 @@ bibtexparser==1.4.4
12
12
  # via pymatgen-core
13
13
  blake3==1.0.8
14
14
  # via emmet-core
15
- boto3==1.43.24
15
+ boto3==1.43.25
16
16
  # via mp-api (pyproject.toml)
17
- botocore==1.43.24
17
+ botocore==1.43.25
18
18
  # via
19
19
  # boto3
20
20
  # s3transfer
@@ -30,7 +30,7 @@ deltalake==1.5.1
30
30
  # via mp-api (pyproject.toml)
31
31
  deprecated==1.3.1
32
32
  # via deltalake
33
- emmet-core==0.87.0rc13
33
+ emmet-core==0.87.0
34
34
  # via mp-api (pyproject.toml)
35
35
  fonttools==4.63.0
36
36
  # via matplotlib
@@ -48,9 +48,9 @@ blinker==1.9.0
48
48
  # via flask
49
49
  boltons==25.0.0
50
50
  # via mp-api (pyproject.toml)
51
- boto3==1.43.24
51
+ boto3==1.43.25
52
52
  # via mp-api (pyproject.toml)
53
- botocore==1.43.24
53
+ botocore==1.43.25
54
54
  # via
55
55
  # boto3
56
56
  # s3transfer
@@ -101,7 +101,7 @@ deltalake==1.5.1
101
101
  # via mp-api (pyproject.toml)
102
102
  deprecated==1.3.1
103
103
  # via deltalake
104
- distlib==0.4.1
104
+ distlib==0.4.2
105
105
  # via virtualenv
106
106
  dnspython==2.8.0
107
107
  # via
@@ -114,7 +114,7 @@ docutils==0.22.4
114
114
  # via sphinx
115
115
  email-validator==2.3.0
116
116
  # via pydantic
117
- emmet-core[all]==0.87.0rc13
117
+ emmet-core[all]==0.87.0
118
118
  # via mp-api (pyproject.toml)
119
119
  exceptiongroup==1.3.1
120
120
  # via fastmcp-slim
@@ -122,9 +122,9 @@ execnet==2.1.2
122
122
  # via pytest-xdist
123
123
  executing==2.2.1
124
124
  # via stack-data
125
- fastmcp==3.4.1
125
+ fastmcp==3.4.2
126
126
  # via mp-api (pyproject.toml)
127
- fastmcp-slim[client,server]==3.4.1
127
+ fastmcp-slim[client,server]==3.4.2
128
128
  # via fastmcp
129
129
  filelock==3.29.1
130
130
  # via
@@ -211,7 +211,7 @@ joblib==1.5.3
211
211
  # via
212
212
  # pymatgen-analysis-diffusion
213
213
  # pymatgen-core
214
- joserfc==1.7.0
214
+ joserfc==1.7.1
215
215
  # via
216
216
  # authlib
217
217
  # fastmcp-slim
@@ -640,7 +640,7 @@ types-requests==2.33.0.20260518
640
640
  # types-tqdm
641
641
  types-setuptools==82.0.0.20260518
642
642
  # via mp-api (pyproject.toml)
643
- types-tqdm==4.67.3.20260518
643
+ types-tqdm==4.68.0.20260608
644
644
  # via mp-api (pyproject.toml)
645
645
  typing-extensions==4.15.0
646
646
  # via
@@ -686,7 +686,7 @@ virtualenv==21.4.2
686
686
  # via pre-commit
687
687
  watchfiles==1.2.0
688
688
  # via fastmcp-slim
689
- wcwidth==0.7.0
689
+ wcwidth==0.8.1
690
690
  # via prompt-toolkit
691
691
  webcolors==25.10.0
692
692
  # via jsonschema
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes