mpcontribs-client 5.10.5rc0__tar.gz → 5.10.5rc1__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.
- {mpcontribs_client-5.10.5rc0/mpcontribs_client.egg-info → mpcontribs_client-5.10.5rc1}/PKG-INFO +1 -1
- {mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/mpcontribs/client/__init__.py +160 -114
- {mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1/mpcontribs_client.egg-info}/PKG-INFO +1 -1
- {mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/requirements/deployment.txt +41 -49
- {mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/requirements/ubuntu-latest_py3.11.txt +2 -2
- {mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/requirements/ubuntu-latest_py3.11_extras.txt +3 -3
- {mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/requirements/ubuntu-latest_py3.12.txt +2 -2
- {mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/requirements/ubuntu-latest_py3.12_extras.txt +3 -3
- {mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/LICENSE +0 -0
- {mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/README.md +0 -0
- {mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/mpcontribs_client.egg-info/SOURCES.txt +0 -0
- {mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/mpcontribs_client.egg-info/dependency_links.txt +0 -0
- {mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/mpcontribs_client.egg-info/requires.txt +0 -0
- {mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/mpcontribs_client.egg-info/top_level.txt +0 -0
- {mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/pyproject.toml +0 -0
- {mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/setup.cfg +0 -0
- {mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/tests/conftest.py +0 -0
- {mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/tests/test_client.py +0 -0
{mpcontribs_client-5.10.5rc0/mpcontribs_client.egg-info → mpcontribs_client-5.10.5rc1}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mpcontribs-client
|
|
3
|
-
Version: 5.10.
|
|
3
|
+
Version: 5.10.5rc1
|
|
4
4
|
Summary: Client library for MPContribs API
|
|
5
5
|
Author-email: Patrick Huck <phuck@lbl.gov>, The Materials Project <feedback@materialsproject.org>
|
|
6
6
|
License-Expression: BSD-3-Clause-LBNL
|
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
import
|
|
1
|
+
import functools
|
|
2
|
+
import gzip
|
|
2
3
|
import importlib.metadata
|
|
3
|
-
import
|
|
4
|
+
import io
|
|
5
|
+
import itertools
|
|
6
|
+
import logging
|
|
4
7
|
import os
|
|
5
|
-
import
|
|
8
|
+
import sys
|
|
6
9
|
import time
|
|
7
|
-
import gzip
|
|
8
10
|
import warnings
|
|
9
|
-
import
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import requests
|
|
15
|
-
import logging
|
|
16
|
-
|
|
11
|
+
from base64 import b64decode, b64encode, urlsafe_b64encode
|
|
12
|
+
from collections import defaultdict
|
|
13
|
+
from concurrent.futures import as_completed
|
|
14
|
+
from copy import deepcopy
|
|
15
|
+
from hashlib import md5
|
|
17
16
|
from inspect import getfullargspec
|
|
18
17
|
from math import isclose
|
|
19
|
-
from requests.exceptions import RequestException
|
|
20
|
-
from bson.objectid import ObjectId
|
|
21
|
-
from typing import Type
|
|
22
|
-
from tqdm.auto import tqdm
|
|
23
|
-
from hashlib import md5
|
|
24
18
|
from pathlib import Path
|
|
25
|
-
from
|
|
26
|
-
from
|
|
27
|
-
from flatten_dict import flatten, unflatten
|
|
28
|
-
from base64 import b64encode, b64decode, urlsafe_b64encode
|
|
19
|
+
from tempfile import gettempdir
|
|
20
|
+
from typing import Type
|
|
29
21
|
from urllib.parse import urlparse
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
22
|
+
|
|
23
|
+
import numpy as np
|
|
24
|
+
import pandas as pd
|
|
25
|
+
import plotly.io as pio
|
|
26
|
+
import requests
|
|
27
|
+
import ujson
|
|
28
|
+
from boltons.iterutils import remap
|
|
36
29
|
from bravado.client import SwaggerClient
|
|
30
|
+
from bravado.config import bravado_config_from_config_dict
|
|
31
|
+
from bravado.exception import HTTPNotFound
|
|
37
32
|
from bravado.requests_client import RequestsClient
|
|
38
33
|
from bravado.swagger_model import Loader
|
|
39
|
-
from
|
|
40
|
-
from bravado_core.spec import Spec, build_api_serving_url, _identity
|
|
34
|
+
from bravado_core.formatter import SwaggerFormat
|
|
41
35
|
from bravado_core.model import model_discovery
|
|
42
36
|
from bravado_core.resource import build_resources
|
|
43
|
-
from
|
|
37
|
+
from bravado_core.spec import Spec, _identity, build_api_serving_url
|
|
44
38
|
from bravado_core.validate import validate_object
|
|
45
|
-
from
|
|
46
|
-
from
|
|
47
|
-
from
|
|
48
|
-
from
|
|
49
|
-
from concurrent.futures import as_completed
|
|
50
|
-
from requests_futures.sessions import FuturesSession
|
|
51
|
-
from urllib3.util.retry import Retry
|
|
39
|
+
from bson.objectid import ObjectId
|
|
40
|
+
from cachetools import LRUCache, cached
|
|
41
|
+
from cachetools.keys import hashkey
|
|
42
|
+
from filetype import guess
|
|
52
43
|
from filetype.types.archive import Gz
|
|
53
|
-
from filetype.types.image import Jpeg, Png,
|
|
44
|
+
from filetype.types.image import Gif, Jpeg, Png, Tiff
|
|
45
|
+
from flatten_dict import flatten, unflatten
|
|
46
|
+
from IPython.display import HTML, FileLink, Image, display
|
|
47
|
+
from json2html import Json2Html
|
|
48
|
+
from jsonschema.exceptions import ValidationError
|
|
54
49
|
from pint import UnitRegistry
|
|
55
50
|
from pint.errors import DimensionalityError
|
|
56
|
-
from tempfile import gettempdir
|
|
57
51
|
from plotly.express._chart_types import line as line_chart
|
|
58
|
-
from
|
|
59
|
-
from
|
|
52
|
+
from pyisemail import is_email
|
|
53
|
+
from pyisemail.diagnosis import BaseDiagnosis
|
|
54
|
+
from pymatgen.core import Structure as PmgStructure
|
|
55
|
+
from requests.exceptions import RequestException
|
|
56
|
+
from requests_futures.sessions import FuturesSession
|
|
57
|
+
from swagger_spec_validator.common import SwaggerValidationError
|
|
58
|
+
from tqdm.auto import tqdm
|
|
59
|
+
from urllib3.util.retry import Retry
|
|
60
60
|
|
|
61
61
|
try:
|
|
62
62
|
__version__ = importlib.metadata.version("mpcontribs-client")
|
|
@@ -1128,10 +1128,10 @@ class Client(SwaggerClient):
|
|
|
1128
1128
|
Returns:
|
|
1129
1129
|
List of projects
|
|
1130
1130
|
"""
|
|
1131
|
-
|
|
1131
|
+
q = deepcopy(query) or {}
|
|
1132
1132
|
|
|
1133
|
-
if self.project or "name" in
|
|
1134
|
-
return [self.get_project(name=
|
|
1133
|
+
if self.project or "name" in q:
|
|
1134
|
+
return [self.get_project(name=q.get("name"), fields=fields)]
|
|
1135
1135
|
|
|
1136
1136
|
if term:
|
|
1137
1137
|
|
|
@@ -1148,41 +1148,78 @@ class Client(SwaggerClient):
|
|
|
1148
1148
|
responses = _run_futures(
|
|
1149
1149
|
[search_future(term)], timeout=timeout, disable=True
|
|
1150
1150
|
)
|
|
1151
|
-
|
|
1151
|
+
q["name__in"] = responses["search"].get("result", [])
|
|
1152
1152
|
|
|
1153
1153
|
if fields:
|
|
1154
|
-
|
|
1154
|
+
q["_fields"] = fields
|
|
1155
1155
|
if sort:
|
|
1156
|
-
|
|
1156
|
+
q["_sort"] = sort
|
|
1157
1157
|
|
|
1158
|
-
ret = self.projects.queryProjects(**
|
|
1158
|
+
ret = self.projects.queryProjects(**q).result() # first page
|
|
1159
|
+
"""
|
|
1160
|
+
'ret' type:
|
|
1161
|
+
{
|
|
1162
|
+
"data": [
|
|
1163
|
+
...
|
|
1164
|
+
],
|
|
1165
|
+
"has_more": <bool>,
|
|
1166
|
+
"total_count": <int>,
|
|
1167
|
+
"total_pages": <int>
|
|
1168
|
+
}
|
|
1169
|
+
"""
|
|
1159
1170
|
total_count, total_pages = ret["total_count"], ret["total_pages"]
|
|
1160
1171
|
|
|
1161
1172
|
if total_pages < 2:
|
|
1162
1173
|
return ret["data"]
|
|
1163
1174
|
|
|
1164
|
-
|
|
1175
|
+
q.update(
|
|
1165
1176
|
{
|
|
1166
|
-
field: ",".join(
|
|
1177
|
+
field: ",".join(q[field])
|
|
1167
1178
|
for field in ["name__in", "_fields"]
|
|
1168
|
-
if field in
|
|
1179
|
+
if field in q
|
|
1169
1180
|
}
|
|
1170
1181
|
)
|
|
1171
1182
|
|
|
1172
1183
|
queries = []
|
|
1173
1184
|
|
|
1174
1185
|
for page in range(2, total_pages + 1):
|
|
1175
|
-
queries.append(deepcopy(
|
|
1186
|
+
queries.append(deepcopy(q))
|
|
1176
1187
|
queries[-1]["page"] = page
|
|
1177
1188
|
|
|
1178
1189
|
futures = [
|
|
1179
|
-
self._get_future(i,
|
|
1190
|
+
self._get_future(i, _q, rel_url="projects") for i, _q in enumerate(queries)
|
|
1180
1191
|
]
|
|
1181
1192
|
responses = _run_futures(futures, total=total_count, timeout=timeout)
|
|
1193
|
+
"""
|
|
1194
|
+
'responses' type:
|
|
1195
|
+
{
|
|
1196
|
+
"0": {
|
|
1197
|
+
"result": {
|
|
1198
|
+
"data": [
|
|
1199
|
+
...
|
|
1200
|
+
],
|
|
1201
|
+
"has_more": <bool>,
|
|
1202
|
+
"total_count": <int>,
|
|
1203
|
+
"total_pages": <int>
|
|
1204
|
+
},
|
|
1205
|
+
"count": <int>
|
|
1206
|
+
},
|
|
1207
|
+
"1": ...
|
|
1208
|
+
}
|
|
1209
|
+
"""
|
|
1182
1210
|
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1211
|
+
return list(
|
|
1212
|
+
itertools.chain.from_iterable(
|
|
1213
|
+
[
|
|
1214
|
+
ret["data"],
|
|
1215
|
+
itertools.chain.from_iterable(
|
|
1216
|
+
# did not hit early return, guaranteed
|
|
1217
|
+
# to have additional pages w/ data
|
|
1218
|
+
map(lambda x: x["result"]["data"], iter(responses.values()))
|
|
1219
|
+
),
|
|
1220
|
+
]
|
|
1221
|
+
)
|
|
1222
|
+
)
|
|
1186
1223
|
|
|
1187
1224
|
def create_project(
|
|
1188
1225
|
self, name: str, title: str, authors: str, description: str, url: str
|
|
@@ -1584,25 +1621,25 @@ class Client(SwaggerClient):
|
|
|
1584
1621
|
)
|
|
1585
1622
|
|
|
1586
1623
|
tic = time.perf_counter()
|
|
1587
|
-
|
|
1624
|
+
q = deepcopy(query) or {}
|
|
1588
1625
|
|
|
1589
1626
|
if self.project:
|
|
1590
|
-
|
|
1627
|
+
q["project"] = self.project
|
|
1591
1628
|
|
|
1592
|
-
name =
|
|
1593
|
-
cids = list(self.get_all_ids(
|
|
1629
|
+
name = q["project"]
|
|
1630
|
+
cids = list(self.get_all_ids(q).get(name, {}).get("ids", set()))
|
|
1594
1631
|
|
|
1595
1632
|
if not cids:
|
|
1596
1633
|
logger.info(f"There aren't any contributions to delete for {name}")
|
|
1597
1634
|
return
|
|
1598
1635
|
|
|
1599
1636
|
total = len(cids)
|
|
1600
|
-
|
|
1601
|
-
_, total_pages = self.get_totals(query=
|
|
1602
|
-
queries = self._split_query(
|
|
1603
|
-
futures = [self._get_future(i,
|
|
1637
|
+
id_query = {"id__in": cids}
|
|
1638
|
+
_, total_pages = self.get_totals(query=id_query)
|
|
1639
|
+
queries = self._split_query(id_query, op="delete", pages=total_pages)
|
|
1640
|
+
futures = [self._get_future(i, _q, op="delete") for i, _q in enumerate(queries)]
|
|
1604
1641
|
_run_futures(futures, total=total, timeout=timeout)
|
|
1605
|
-
left, _ = self.get_totals(query=
|
|
1642
|
+
left, _ = self.get_totals(query=id_query)
|
|
1606
1643
|
deleted = total - left
|
|
1607
1644
|
self.init_columns(name=name)
|
|
1608
1645
|
self._reinit()
|
|
@@ -1638,16 +1675,16 @@ class Client(SwaggerClient):
|
|
|
1638
1675
|
if op not in ops:
|
|
1639
1676
|
raise MPContribsClientError(f"`op` has to be one of {ops}")
|
|
1640
1677
|
|
|
1641
|
-
|
|
1642
|
-
if self.project and "project" not in
|
|
1643
|
-
|
|
1678
|
+
q = deepcopy(query) or {}
|
|
1679
|
+
if self.project and "project" not in q:
|
|
1680
|
+
q["project"] = self.project
|
|
1644
1681
|
|
|
1645
1682
|
skip_keys = {"per_page", "_fields", "format", "_sort"}
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
queries = self._split_query(
|
|
1683
|
+
q = {k: v for k, v in q.items() if k not in skip_keys}
|
|
1684
|
+
q["_fields"] = [] # only need totals -> explicitly request no fields
|
|
1685
|
+
queries = self._split_query(q, resource=resource, op=op) # don't paginate
|
|
1649
1686
|
futures = [
|
|
1650
|
-
self._get_future(i,
|
|
1687
|
+
self._get_future(i, _q, rel_url=resource) for i, _q in enumerate(queries)
|
|
1651
1688
|
]
|
|
1652
1689
|
responses = _run_futures(futures, timeout=timeout, desc="Totals")
|
|
1653
1690
|
|
|
@@ -1759,11 +1796,11 @@ class Client(SwaggerClient):
|
|
|
1759
1796
|
)
|
|
1760
1797
|
|
|
1761
1798
|
ret = {}
|
|
1762
|
-
|
|
1763
|
-
if self.project and "project" not in
|
|
1764
|
-
|
|
1799
|
+
q = deepcopy(query) or {}
|
|
1800
|
+
if self.project and "project" not in q:
|
|
1801
|
+
q["project"] = self.project
|
|
1765
1802
|
|
|
1766
|
-
[
|
|
1803
|
+
[q.pop(k, None) for k in ["page", "per_page", "_fields"]]
|
|
1767
1804
|
id_fields = {"project", "id", "identifier"}
|
|
1768
1805
|
|
|
1769
1806
|
if data_id_fields:
|
|
@@ -1771,10 +1808,10 @@ class Client(SwaggerClient):
|
|
|
1771
1808
|
f"data.{data_id_field}" for data_id_field in data_id_fields.values()
|
|
1772
1809
|
)
|
|
1773
1810
|
|
|
1774
|
-
|
|
1775
|
-
_, total_pages = self.get_totals(query=
|
|
1776
|
-
queries = self._split_query(
|
|
1777
|
-
futures = [self._get_future(i,
|
|
1811
|
+
q["_fields"] = list(id_fields | components)
|
|
1812
|
+
_, total_pages = self.get_totals(query=q, timeout=timeout)
|
|
1813
|
+
queries = self._split_query(q, op=op, pages=total_pages)
|
|
1814
|
+
futures = [self._get_future(i, _q) for i, _q in enumerate(queries)]
|
|
1778
1815
|
responses = _run_futures(futures, timeout=timeout, desc="Identifiers")
|
|
1779
1816
|
|
|
1780
1817
|
for resp in responses.values():
|
|
@@ -1870,15 +1907,15 @@ class Client(SwaggerClient):
|
|
|
1870
1907
|
Returns:
|
|
1871
1908
|
List of contributions
|
|
1872
1909
|
"""
|
|
1873
|
-
|
|
1910
|
+
q: dict = deepcopy(query) or {}
|
|
1874
1911
|
|
|
1875
|
-
if self.project and "project" not in
|
|
1876
|
-
|
|
1912
|
+
if self.project and "project" not in q:
|
|
1913
|
+
q["project"] = self.project
|
|
1877
1914
|
|
|
1878
1915
|
if paginate:
|
|
1879
1916
|
cids = [
|
|
1880
1917
|
idx
|
|
1881
|
-
for v in self.get_all_ids(
|
|
1918
|
+
for v in self.get_all_ids(q).values()
|
|
1882
1919
|
for idx in (v.get("ids") or [])
|
|
1883
1920
|
]
|
|
1884
1921
|
|
|
@@ -1889,17 +1926,26 @@ class Client(SwaggerClient):
|
|
|
1889
1926
|
cids_query = {"id__in": cids, "_fields": fields, "_sort": sort}
|
|
1890
1927
|
_, total_pages = self.get_totals(query=cids_query)
|
|
1891
1928
|
queries = self._split_query(cids_query, pages=total_pages)
|
|
1892
|
-
futures = [self._get_future(i,
|
|
1893
|
-
responses =
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1929
|
+
futures = [self._get_future(i, _q) for i, _q in enumerate(queries)]
|
|
1930
|
+
responses = [
|
|
1931
|
+
resp
|
|
1932
|
+
for resp in _run_futures(futures, total=total, timeout=timeout).values()
|
|
1933
|
+
if resp.get("result")
|
|
1934
|
+
]
|
|
1935
|
+
ret = {
|
|
1936
|
+
"total_count": sum(
|
|
1937
|
+
resp["result"].get("total_count", 0) for resp in responses
|
|
1938
|
+
),
|
|
1939
|
+
"data": list(
|
|
1940
|
+
itertools.chain.from_iterable(
|
|
1941
|
+
[resp["result"].get("data", []) for resp in responses]
|
|
1942
|
+
)
|
|
1943
|
+
),
|
|
1944
|
+
}
|
|
1945
|
+
|
|
1900
1946
|
else:
|
|
1901
1947
|
ret = self.contributions.queryContributions(
|
|
1902
|
-
_fields=fields, _sort=sort, **
|
|
1948
|
+
_fields=fields, _sort=sort, **q
|
|
1903
1949
|
).result()
|
|
1904
1950
|
|
|
1905
1951
|
return ret
|
|
@@ -1925,22 +1971,22 @@ class Client(SwaggerClient):
|
|
|
1925
1971
|
if "data" in data:
|
|
1926
1972
|
self._is_serializable_dict(data["data"])
|
|
1927
1973
|
|
|
1928
|
-
|
|
1974
|
+
q = deepcopy(query) or {}
|
|
1929
1975
|
|
|
1930
1976
|
if self.project:
|
|
1931
|
-
if "project" in
|
|
1977
|
+
if "project" in q and self.project != q["project"]:
|
|
1932
1978
|
raise MPContribsClientError(
|
|
1933
1979
|
f"client initialized with different project {self.project}!"
|
|
1934
1980
|
)
|
|
1935
|
-
|
|
1981
|
+
q["project"] = self.project
|
|
1936
1982
|
else:
|
|
1937
|
-
if not
|
|
1983
|
+
if not q or "project" not in q:
|
|
1938
1984
|
raise MPContribsClientError(
|
|
1939
1985
|
"initialize client with project, or include project in query!"
|
|
1940
1986
|
)
|
|
1941
1987
|
|
|
1942
|
-
name =
|
|
1943
|
-
cids = list(self.get_all_ids(
|
|
1988
|
+
name = q["project"]
|
|
1989
|
+
cids = list(self.get_all_ids(q).get(name, {}).get("ids", set()))
|
|
1944
1990
|
|
|
1945
1991
|
if not cids:
|
|
1946
1992
|
raise MPContribsClientError(
|
|
@@ -1956,8 +2002,8 @@ class Client(SwaggerClient):
|
|
|
1956
2002
|
_, total_pages = self.get_totals(query=cids_query)
|
|
1957
2003
|
queries = self._split_query(cids_query, op="update", pages=total_pages)
|
|
1958
2004
|
futures = [
|
|
1959
|
-
self._get_future(i,
|
|
1960
|
-
for i,
|
|
2005
|
+
self._get_future(i, _q, op="update", data=data)
|
|
2006
|
+
for i, _q in enumerate(queries)
|
|
1961
2007
|
]
|
|
1962
2008
|
responses = _run_futures(futures, total=total, timeout=timeout)
|
|
1963
2009
|
updated = sum(resp["count"] for _, resp in responses.items())
|
|
@@ -2019,23 +2065,23 @@ class Client(SwaggerClient):
|
|
|
2019
2065
|
"initialize client with project, or include project in query!"
|
|
2020
2066
|
)
|
|
2021
2067
|
|
|
2022
|
-
|
|
2068
|
+
q = deepcopy(query) or {}
|
|
2023
2069
|
|
|
2024
2070
|
if self.project:
|
|
2025
|
-
|
|
2071
|
+
q["project"] = self.project
|
|
2026
2072
|
|
|
2027
2073
|
try:
|
|
2028
2074
|
resp = self.projects.getProjectByName(
|
|
2029
|
-
pk=
|
|
2075
|
+
pk=q["project"], _fields=["is_public", "is_approved"]
|
|
2030
2076
|
).result()
|
|
2031
2077
|
except HTTPNotFound:
|
|
2032
2078
|
raise MPContribsClientError(
|
|
2033
|
-
f"project `{
|
|
2079
|
+
f"project `{q['project']}` not found or access denied!"
|
|
2034
2080
|
)
|
|
2035
2081
|
|
|
2036
2082
|
if not recursive and resp["is_public"] == is_public:
|
|
2037
2083
|
return {
|
|
2038
|
-
"warning": f"`is_public` already set to {is_public} for `{
|
|
2084
|
+
"warning": f"`is_public` already set to {is_public} for `{q['project']}`."
|
|
2039
2085
|
}
|
|
2040
2086
|
|
|
2041
2087
|
ret = {}
|
|
@@ -2043,19 +2089,19 @@ class Client(SwaggerClient):
|
|
|
2043
2089
|
if resp["is_public"] != is_public:
|
|
2044
2090
|
if is_public and not resp["is_approved"]:
|
|
2045
2091
|
raise MPContribsClientError(
|
|
2046
|
-
f"project `{
|
|
2092
|
+
f"project `{q['project']}` is not approved yet!"
|
|
2047
2093
|
)
|
|
2048
2094
|
|
|
2049
2095
|
resp = self.projects.updateProjectByName(
|
|
2050
|
-
pk=
|
|
2096
|
+
pk=q["project"], project={"is_public": is_public}
|
|
2051
2097
|
).result()
|
|
2052
2098
|
ret["published"] = resp["count"] == 1
|
|
2053
2099
|
|
|
2054
2100
|
if recursive:
|
|
2055
|
-
|
|
2056
|
-
|
|
2101
|
+
q = deepcopy(query) or {}
|
|
2102
|
+
q["is_public"] = not is_public
|
|
2057
2103
|
ret["contributions"] = self.update_contributions(
|
|
2058
|
-
{"is_public": is_public}, query=
|
|
2104
|
+
{"is_public": is_public}, query=q, timeout=timeout
|
|
2059
2105
|
)
|
|
2060
2106
|
|
|
2061
2107
|
return ret
|
|
@@ -2450,7 +2496,7 @@ class Client(SwaggerClient):
|
|
|
2450
2496
|
Number of new downloads written to disk.
|
|
2451
2497
|
"""
|
|
2452
2498
|
start = time.perf_counter()
|
|
2453
|
-
|
|
2499
|
+
q = deepcopy(query) or {}
|
|
2454
2500
|
include = include or []
|
|
2455
2501
|
outdir = Path(outdir) or Path(".")
|
|
2456
2502
|
outdir.mkdir(parents=True, exist_ok=True)
|
|
@@ -2458,8 +2504,8 @@ class Client(SwaggerClient):
|
|
|
2458
2504
|
if include and not components:
|
|
2459
2505
|
raise MPContribsClientError(f"`include` must be subset of {COMPONENTS}!")
|
|
2460
2506
|
|
|
2461
|
-
all_ids = self.get_all_ids(
|
|
2462
|
-
fmt =
|
|
2507
|
+
all_ids = self.get_all_ids(q, include=list(components), timeout=timeout)
|
|
2508
|
+
fmt = q.get("format", "json")
|
|
2463
2509
|
contributions, components_loaded = [], defaultdict(dict)
|
|
2464
2510
|
|
|
2465
2511
|
for name, values in all_ids.items():
|
{mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1/mpcontribs_client.egg-info}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mpcontribs-client
|
|
3
|
-
Version: 5.10.
|
|
3
|
+
Version: 5.10.5rc1
|
|
4
4
|
Summary: Client library for MPContribs API
|
|
5
5
|
Author-email: Patrick Huck <phuck@lbl.gov>, The Materials Project <feedback@materialsproject.org>
|
|
6
6
|
License-Expression: BSD-3-Clause-LBNL
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# This file is autogenerated by pip-compile with Python 3.11
|
|
3
3
|
# by the following command:
|
|
4
4
|
#
|
|
5
|
-
# pip-compile --output-file=MPContribs/mpcontribs-client/requirements/deployment.txt MPContribs/mpcontribs-client/
|
|
5
|
+
# pip-compile --output-file=MPContribs/mpcontribs-client/requirements/deployment.txt MPContribs/mpcontribs-client/pyproject.toml python/requirements.txt
|
|
6
6
|
#
|
|
7
7
|
arrow==1.4.0
|
|
8
8
|
# via isoduration
|
|
@@ -15,14 +15,14 @@ attrs==25.4.0
|
|
|
15
15
|
bibtexparser==1.4.3
|
|
16
16
|
# via pymatgen
|
|
17
17
|
boltons==25.0.0
|
|
18
|
-
# via mpcontribs-client (MPContribs/mpcontribs-client/
|
|
18
|
+
# via mpcontribs-client (MPContribs/mpcontribs-client/pyproject.toml)
|
|
19
19
|
bravado==12.0.1
|
|
20
|
-
# via mpcontribs-client (MPContribs/mpcontribs-client/
|
|
20
|
+
# via mpcontribs-client (MPContribs/mpcontribs-client/pyproject.toml)
|
|
21
21
|
bravado-core==6.1.1
|
|
22
22
|
# via bravado
|
|
23
|
-
cachetools==6.2.
|
|
24
|
-
# via mpcontribs-client (MPContribs/mpcontribs-client/
|
|
25
|
-
certifi==
|
|
23
|
+
cachetools==6.2.5
|
|
24
|
+
# via mpcontribs-client (MPContribs/mpcontribs-client/pyproject.toml)
|
|
25
|
+
certifi==2026.1.4
|
|
26
26
|
# via requests
|
|
27
27
|
charset-normalizer==3.4.4
|
|
28
28
|
# via requests
|
|
@@ -39,14 +39,14 @@ dnspython==2.8.0
|
|
|
39
39
|
executing==2.2.1
|
|
40
40
|
# via stack-data
|
|
41
41
|
filetype==1.2.0
|
|
42
|
-
# via mpcontribs-client (MPContribs/mpcontribs-client/
|
|
42
|
+
# via mpcontribs-client (MPContribs/mpcontribs-client/pyproject.toml)
|
|
43
43
|
flatten-dict==0.4.2
|
|
44
|
-
# via mpcontribs-client (MPContribs/mpcontribs-client/
|
|
44
|
+
# via mpcontribs-client (MPContribs/mpcontribs-client/pyproject.toml)
|
|
45
45
|
flexcache==0.3
|
|
46
46
|
# via pint
|
|
47
47
|
flexparser==0.4
|
|
48
48
|
# via pint
|
|
49
|
-
fonttools==4.61.
|
|
49
|
+
fonttools==4.61.1
|
|
50
50
|
# via matplotlib
|
|
51
51
|
fqdn==1.5.1
|
|
52
52
|
# via jsonschema
|
|
@@ -56,18 +56,18 @@ idna==3.11
|
|
|
56
56
|
# requests
|
|
57
57
|
importlib-resources==6.5.2
|
|
58
58
|
# via swagger-spec-validator
|
|
59
|
-
ipython==9.
|
|
60
|
-
# via mpcontribs-client (MPContribs/mpcontribs-client/
|
|
59
|
+
ipython==9.9.0
|
|
60
|
+
# via mpcontribs-client (MPContribs/mpcontribs-client/pyproject.toml)
|
|
61
61
|
ipython-pygments-lexers==1.1.1
|
|
62
62
|
# via ipython
|
|
63
63
|
isoduration==20.11.0
|
|
64
64
|
# via jsonschema
|
|
65
65
|
jedi==0.19.2
|
|
66
66
|
# via ipython
|
|
67
|
-
joblib==1.5.
|
|
67
|
+
joblib==1.5.3
|
|
68
68
|
# via pymatgen
|
|
69
69
|
json2html==1.3.0
|
|
70
|
-
# via mpcontribs-client (MPContribs/mpcontribs-client/
|
|
70
|
+
# via mpcontribs-client (MPContribs/mpcontribs-client/pyproject.toml)
|
|
71
71
|
jsonpointer==3.0.0
|
|
72
72
|
# via jsonschema
|
|
73
73
|
jsonref==1.1.0
|
|
@@ -76,13 +76,13 @@ jsonref==1.1.0
|
|
|
76
76
|
# swagger-spec-validator
|
|
77
77
|
jsonschema-specifications==2025.9.1
|
|
78
78
|
# via bravado-core
|
|
79
|
-
jsonschema[format-nongpl]==4.
|
|
79
|
+
jsonschema[format-nongpl]==4.26.0
|
|
80
80
|
# via jsonschema
|
|
81
81
|
kiwisolver==1.4.9
|
|
82
82
|
# via matplotlib
|
|
83
83
|
lark==1.3.1
|
|
84
84
|
# via rfc3987-syntax
|
|
85
|
-
matplotlib==3.10.
|
|
85
|
+
matplotlib==3.10.8
|
|
86
86
|
# via
|
|
87
87
|
# -r python/requirements.txt
|
|
88
88
|
# pymatgen
|
|
@@ -98,7 +98,7 @@ msgpack==1.1.2
|
|
|
98
98
|
# via
|
|
99
99
|
# bravado
|
|
100
100
|
# bravado-core
|
|
101
|
-
narwhals==2.
|
|
101
|
+
narwhals==2.15.0
|
|
102
102
|
# via plotly
|
|
103
103
|
networkx==3.6.1
|
|
104
104
|
# via pymatgen
|
|
@@ -108,37 +108,37 @@ numpy==1.26.4
|
|
|
108
108
|
# contourpy
|
|
109
109
|
# matplotlib
|
|
110
110
|
# monty
|
|
111
|
-
# mpcontribs-client (MPContribs/mpcontribs-client/
|
|
111
|
+
# mpcontribs-client (MPContribs/mpcontribs-client/pyproject.toml)
|
|
112
112
|
# pandas
|
|
113
113
|
# pymatgen
|
|
114
114
|
# scipy
|
|
115
115
|
# spglib
|
|
116
116
|
orjson==3.11.5
|
|
117
117
|
# via pymatgen
|
|
118
|
-
packaging==
|
|
118
|
+
packaging==26.0
|
|
119
119
|
# via
|
|
120
120
|
# matplotlib
|
|
121
121
|
# plotly
|
|
122
122
|
palettable==3.3.3
|
|
123
123
|
# via pymatgen
|
|
124
|
-
pandas==
|
|
124
|
+
pandas==3.0.0
|
|
125
125
|
# via
|
|
126
126
|
# -r python/requirements.txt
|
|
127
|
-
# mpcontribs-client (MPContribs/mpcontribs-client/
|
|
127
|
+
# mpcontribs-client (MPContribs/mpcontribs-client/pyproject.toml)
|
|
128
128
|
# pymatgen
|
|
129
129
|
parso==0.8.5
|
|
130
130
|
# via jedi
|
|
131
131
|
pexpect==4.9.0
|
|
132
132
|
# via ipython
|
|
133
|
-
pillow==12.
|
|
133
|
+
pillow==12.1.0
|
|
134
134
|
# via matplotlib
|
|
135
135
|
pint==0.25.2
|
|
136
|
-
# via mpcontribs-client (MPContribs/mpcontribs-client/
|
|
136
|
+
# via mpcontribs-client (MPContribs/mpcontribs-client/pyproject.toml)
|
|
137
137
|
platformdirs==4.5.1
|
|
138
138
|
# via pint
|
|
139
|
-
plotly==6.5.
|
|
139
|
+
plotly==6.5.2
|
|
140
140
|
# via
|
|
141
|
-
# mpcontribs-client (MPContribs/mpcontribs-client/
|
|
141
|
+
# mpcontribs-client (MPContribs/mpcontribs-client/pyproject.toml)
|
|
142
142
|
# pymatgen
|
|
143
143
|
prompt-toolkit==3.0.52
|
|
144
144
|
# via ipython
|
|
@@ -151,12 +151,12 @@ pygments==2.19.2
|
|
|
151
151
|
# ipython
|
|
152
152
|
# ipython-pygments-lexers
|
|
153
153
|
pyisemail==2.0.1
|
|
154
|
-
# via mpcontribs-client (MPContribs/mpcontribs-client/
|
|
154
|
+
# via mpcontribs-client (MPContribs/mpcontribs-client/pyproject.toml)
|
|
155
155
|
pymatgen==2025.10.7
|
|
156
|
-
# via mpcontribs-client (MPContribs/mpcontribs-client/
|
|
157
|
-
pymongo==4.
|
|
158
|
-
# via mpcontribs-client (MPContribs/mpcontribs-client/
|
|
159
|
-
pyparsing==3.2
|
|
156
|
+
# via mpcontribs-client (MPContribs/mpcontribs-client/pyproject.toml)
|
|
157
|
+
pymongo==4.16.0
|
|
158
|
+
# via mpcontribs-client (MPContribs/mpcontribs-client/pyproject.toml)
|
|
159
|
+
pyparsing==3.3.2
|
|
160
160
|
# via
|
|
161
161
|
# bibtexparser
|
|
162
162
|
# matplotlib
|
|
@@ -168,9 +168,7 @@ python-dateutil==2.9.0.post0
|
|
|
168
168
|
# matplotlib
|
|
169
169
|
# pandas
|
|
170
170
|
pytz==2025.2
|
|
171
|
-
# via
|
|
172
|
-
# bravado-core
|
|
173
|
-
# pandas
|
|
171
|
+
# via bravado-core
|
|
174
172
|
pyyaml==6.0.3
|
|
175
173
|
# via
|
|
176
174
|
# bravado
|
|
@@ -187,7 +185,7 @@ requests==2.32.5
|
|
|
187
185
|
# pymatgen
|
|
188
186
|
# requests-futures
|
|
189
187
|
requests-futures==1.0.2
|
|
190
|
-
# via mpcontribs-client (MPContribs/mpcontribs-client/
|
|
188
|
+
# via mpcontribs-client (MPContribs/mpcontribs-client/pyproject.toml)
|
|
191
189
|
rfc3339-validator==0.1.4
|
|
192
190
|
# via jsonschema
|
|
193
191
|
rfc3986-validator==0.1.1
|
|
@@ -198,18 +196,14 @@ rpds-py==0.30.0
|
|
|
198
196
|
# via
|
|
199
197
|
# jsonschema
|
|
200
198
|
# referencing
|
|
201
|
-
ruamel-yaml==0.
|
|
199
|
+
ruamel-yaml==0.19.1
|
|
202
200
|
# via
|
|
203
201
|
# monty
|
|
204
202
|
# pymatgen
|
|
205
|
-
|
|
206
|
-
# via ruamel-yaml
|
|
207
|
-
scipy==1.16.3
|
|
203
|
+
scipy==1.17.0
|
|
208
204
|
# via
|
|
209
205
|
# -r python/requirements.txt
|
|
210
206
|
# pymatgen
|
|
211
|
-
semantic-version==2.10.0
|
|
212
|
-
# via mpcontribs-client (MPContribs/mpcontribs-client/setup.py)
|
|
213
207
|
simplejson==3.20.2
|
|
214
208
|
# via
|
|
215
209
|
# bravado
|
|
@@ -221,21 +215,21 @@ six==1.17.0
|
|
|
221
215
|
# flatten-dict
|
|
222
216
|
# python-dateutil
|
|
223
217
|
# rfc3339-validator
|
|
224
|
-
spglib==2.
|
|
218
|
+
spglib==2.7.0
|
|
225
219
|
# via pymatgen
|
|
226
220
|
stack-data==0.6.3
|
|
227
221
|
# via ipython
|
|
228
222
|
swagger-spec-validator==3.0.4
|
|
229
223
|
# via
|
|
230
224
|
# bravado-core
|
|
231
|
-
# mpcontribs-client (MPContribs/mpcontribs-client/
|
|
225
|
+
# mpcontribs-client (MPContribs/mpcontribs-client/pyproject.toml)
|
|
232
226
|
sympy==1.14.0
|
|
233
227
|
# via pymatgen
|
|
234
228
|
tabulate==0.9.0
|
|
235
229
|
# via pymatgen
|
|
236
230
|
tqdm==4.67.1
|
|
237
231
|
# via
|
|
238
|
-
# mpcontribs-client (MPContribs/mpcontribs-client/
|
|
232
|
+
# mpcontribs-client (MPContribs/mpcontribs-client/pyproject.toml)
|
|
239
233
|
# pymatgen
|
|
240
234
|
traitlets==5.14.3
|
|
241
235
|
# via
|
|
@@ -251,19 +245,17 @@ typing-extensions==4.15.0
|
|
|
251
245
|
# referencing
|
|
252
246
|
# spglib
|
|
253
247
|
# swagger-spec-validator
|
|
254
|
-
tzdata==2025.
|
|
255
|
-
# via
|
|
256
|
-
# arrow
|
|
257
|
-
# pandas
|
|
248
|
+
tzdata==2025.3
|
|
249
|
+
# via arrow
|
|
258
250
|
ujson==5.11.0
|
|
259
|
-
# via mpcontribs-client (MPContribs/mpcontribs-client/
|
|
251
|
+
# via mpcontribs-client (MPContribs/mpcontribs-client/pyproject.toml)
|
|
260
252
|
uncertainties==3.2.3
|
|
261
253
|
# via pymatgen
|
|
262
254
|
uri-template==1.3.0
|
|
263
255
|
# via jsonschema
|
|
264
|
-
urllib3==2.6.
|
|
256
|
+
urllib3==2.6.3
|
|
265
257
|
# via requests
|
|
266
|
-
wcwidth==0.
|
|
258
|
+
wcwidth==0.4.0
|
|
267
259
|
# via prompt-toolkit
|
|
268
260
|
webcolors==25.10.0
|
|
269
261
|
# via jsonschema
|
{mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/requirements/ubuntu-latest_py3.11.txt
RENAMED
|
@@ -20,7 +20,7 @@ bravado==12.0.1
|
|
|
20
20
|
# via mpcontribs-client (pyproject.toml)
|
|
21
21
|
bravado-core==6.1.1
|
|
22
22
|
# via bravado
|
|
23
|
-
cachetools==6.2.
|
|
23
|
+
cachetools==6.2.5
|
|
24
24
|
# via mpcontribs-client (pyproject.toml)
|
|
25
25
|
certifi==2026.1.4
|
|
26
26
|
# via requests
|
|
@@ -249,7 +249,7 @@ uri-template==1.3.0
|
|
|
249
249
|
# via jsonschema
|
|
250
250
|
urllib3==2.6.3
|
|
251
251
|
# via requests
|
|
252
|
-
wcwidth==0.
|
|
252
|
+
wcwidth==0.4.0
|
|
253
253
|
# via prompt-toolkit
|
|
254
254
|
webcolors==25.10.0
|
|
255
255
|
# via jsonschema
|
|
@@ -24,7 +24,7 @@ bravado==12.0.1
|
|
|
24
24
|
# mpcontribs-client (pyproject.toml)
|
|
25
25
|
bravado-core==6.1.1
|
|
26
26
|
# via bravado
|
|
27
|
-
cachetools==6.2.
|
|
27
|
+
cachetools==6.2.5
|
|
28
28
|
# via
|
|
29
29
|
# mpcontribs-client
|
|
30
30
|
# mpcontribs-client (pyproject.toml)
|
|
@@ -34,7 +34,7 @@ charset-normalizer==3.4.4
|
|
|
34
34
|
# via requests
|
|
35
35
|
contourpy==1.3.3
|
|
36
36
|
# via matplotlib
|
|
37
|
-
coverage[toml]==7.13.
|
|
37
|
+
coverage[toml]==7.13.2
|
|
38
38
|
# via pytest-cov
|
|
39
39
|
cycler==0.12.1
|
|
40
40
|
# via matplotlib
|
|
@@ -335,7 +335,7 @@ uri-template==1.3.0
|
|
|
335
335
|
# via jsonschema
|
|
336
336
|
urllib3==2.6.3
|
|
337
337
|
# via requests
|
|
338
|
-
wcwidth==0.
|
|
338
|
+
wcwidth==0.4.0
|
|
339
339
|
# via prompt-toolkit
|
|
340
340
|
webcolors==25.10.0
|
|
341
341
|
# via jsonschema
|
{mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/requirements/ubuntu-latest_py3.12.txt
RENAMED
|
@@ -20,7 +20,7 @@ bravado==12.0.1
|
|
|
20
20
|
# via mpcontribs-client (pyproject.toml)
|
|
21
21
|
bravado-core==6.1.1
|
|
22
22
|
# via bravado
|
|
23
|
-
cachetools==6.2.
|
|
23
|
+
cachetools==6.2.5
|
|
24
24
|
# via mpcontribs-client (pyproject.toml)
|
|
25
25
|
certifi==2026.1.4
|
|
26
26
|
# via requests
|
|
@@ -248,7 +248,7 @@ uri-template==1.3.0
|
|
|
248
248
|
# via jsonschema
|
|
249
249
|
urllib3==2.6.3
|
|
250
250
|
# via requests
|
|
251
|
-
wcwidth==0.
|
|
251
|
+
wcwidth==0.4.0
|
|
252
252
|
# via prompt-toolkit
|
|
253
253
|
webcolors==25.10.0
|
|
254
254
|
# via jsonschema
|
|
@@ -24,7 +24,7 @@ bravado==12.0.1
|
|
|
24
24
|
# mpcontribs-client (pyproject.toml)
|
|
25
25
|
bravado-core==6.1.1
|
|
26
26
|
# via bravado
|
|
27
|
-
cachetools==6.2.
|
|
27
|
+
cachetools==6.2.5
|
|
28
28
|
# via
|
|
29
29
|
# mpcontribs-client
|
|
30
30
|
# mpcontribs-client (pyproject.toml)
|
|
@@ -34,7 +34,7 @@ charset-normalizer==3.4.4
|
|
|
34
34
|
# via requests
|
|
35
35
|
contourpy==1.3.3
|
|
36
36
|
# via matplotlib
|
|
37
|
-
coverage[toml]==7.13.
|
|
37
|
+
coverage[toml]==7.13.2
|
|
38
38
|
# via pytest-cov
|
|
39
39
|
cycler==0.12.1
|
|
40
40
|
# via matplotlib
|
|
@@ -334,7 +334,7 @@ uri-template==1.3.0
|
|
|
334
334
|
# via jsonschema
|
|
335
335
|
urllib3==2.6.3
|
|
336
336
|
# via requests
|
|
337
|
-
wcwidth==0.
|
|
337
|
+
wcwidth==0.4.0
|
|
338
338
|
# via prompt-toolkit
|
|
339
339
|
webcolors==25.10.0
|
|
340
340
|
# via jsonschema
|
|
File without changes
|
|
File without changes
|
{mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/mpcontribs_client.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
{mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/mpcontribs_client.egg-info/requires.txt
RENAMED
|
File without changes
|
{mpcontribs_client-5.10.5rc0 → mpcontribs_client-5.10.5rc1}/mpcontribs_client.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|