sfapi-client 0.0.4__tar.gz → 0.0.6__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.
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/PKG-INFO +2 -2
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/pyproject.toml +1 -1
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/scripts/run.py +3 -1
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_async/projects.py +5 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_async/users.py +29 -2
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_models/__init__.py +7 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_sync/projects.py +5 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_sync/users.py +29 -2
- sfapi_client-0.0.6/src/sfapi_client/projects.py +2 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_projects.py +18 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_projects_async.py +20 -0
- sfapi_client-0.0.4/src/sfapi_client/projects.py +0 -2
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/.github/workflows/mkdocs.yml +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/.github/workflows/pypi.yml +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/.github/workflows/pytest.yml +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/.gitignore +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/LEGAL +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/LICENSE +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/README.md +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/community/contributing.md +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/examples/check_current_and_past_jobs.ipynb +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/examples/getting_bearer_token.ipynb +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/examples/run_job_and_check_status.ipynb +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/gen_examples.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/gen_sync.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/index.md +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/javascript/apiselector.js +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/quickstart/index.md +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/SUMMARY.txt +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/async/client/index.md +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/async/compute/index.md +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/async/exceptions/index.md +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/async/groups/index.md +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/async/jobs/index.md +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/async/paths/index.md +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/async/projects/index.md +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/async/resources/index.md +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/async/users/index.md +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/mkdocs.yml +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/pytest.ini +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/requirements-dev.txt +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/__init__.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_async/__init__.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_async/client.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_async/compute.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_async/groups.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_async/jobs.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_async/paths.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_compute.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_jobs.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_models/job_status_response_sacct.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_models/job_status_response_squeue.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_models/resources.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_monitor.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_sync/__init__.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_sync/_models.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_sync/client.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_sync/compute.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_sync/groups.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_sync/jobs.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_sync/paths.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_utils.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/client.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/compute.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/exceptions.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/groups.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/jobs.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/paths.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/resources.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/users.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/conftest.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_api.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_api_async.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_client.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_client_async.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_compute.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_compute_async.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_groups.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_groups_async.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_jobs.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_jobs_async.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_paths.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_paths_async.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_resources.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_resources_async.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_users.py +0 -0
- {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_users_async.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: sfapi_client
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.6
|
|
4
4
|
Summary: Python client for NERSC SF API
|
|
5
5
|
Author-email: Chris Harris <cjh@lbl.gov>, Nicholas Tyler <tylern@lbl.gov>
|
|
6
6
|
License-File: LICENSE
|
|
@@ -10,7 +10,7 @@ Classifier: Programming Language :: Python :: 3
|
|
|
10
10
|
Requires-Python: >=3.7
|
|
11
11
|
Requires-Dist: authlib
|
|
12
12
|
Requires-Dist: httpx
|
|
13
|
-
Requires-Dist: pydantic
|
|
13
|
+
Requires-Dist: pydantic==v1.10.10
|
|
14
14
|
Requires-Dist: tenacity
|
|
15
15
|
Provides-Extra: docs
|
|
16
16
|
Requires-Dist: mkdocs-gen-files; extra == 'docs'
|
|
@@ -31,6 +31,7 @@ def run_unasync():
|
|
|
31
31
|
"AsyncGroupMember": "GroupMember",
|
|
32
32
|
"AsyncRemotePath": "RemotePath",
|
|
33
33
|
"AsyncProject": "Project",
|
|
34
|
+
"AsyncRole": "Role",
|
|
34
35
|
"AsyncUser": "User",
|
|
35
36
|
"AsyncJob": "Job",
|
|
36
37
|
"AsyncJobSacct": "JobSacct",
|
|
@@ -151,7 +152,8 @@ def resources_codegen(
|
|
|
151
152
|
),
|
|
152
153
|
):
|
|
153
154
|
|
|
154
|
-
import requests
|
|
155
|
+
import requests
|
|
156
|
+
import datetime
|
|
155
157
|
api_url = "https://api.nersc.gov/api/v1.2/status"
|
|
156
158
|
response = requests.get(api_url)
|
|
157
159
|
status = response.json()
|
|
@@ -3,10 +3,15 @@ from pydantic import ValidationError, Field
|
|
|
3
3
|
|
|
4
4
|
from .._models import (
|
|
5
5
|
ProjectStats as ProjectBase,
|
|
6
|
+
RoleStats as RoleBase
|
|
6
7
|
)
|
|
7
8
|
from ..exceptions import SfApiError
|
|
8
9
|
|
|
9
10
|
|
|
11
|
+
class AsyncRole(RoleBase):
|
|
12
|
+
client: Optional["AsyncClient"]
|
|
13
|
+
|
|
14
|
+
|
|
10
15
|
class AsyncProject(ProjectBase):
|
|
11
16
|
client: Optional["AsyncClient"]
|
|
12
17
|
name: str = Field(alias="repo_name")
|
|
@@ -5,7 +5,7 @@ from .._models import (
|
|
|
5
5
|
UserInfo as UserBase,
|
|
6
6
|
GroupList as GroupsResponse,
|
|
7
7
|
)
|
|
8
|
-
from .projects import AsyncProject
|
|
8
|
+
from .projects import AsyncProject, AsyncRole
|
|
9
9
|
from ..exceptions import SfApiError
|
|
10
10
|
|
|
11
11
|
|
|
@@ -40,6 +40,8 @@ class AsyncUser(UserBase):
|
|
|
40
40
|
async def groups(self) -> List["AsyncGroup"]:
|
|
41
41
|
"""
|
|
42
42
|
The groups that the user is a member of.
|
|
43
|
+
|
|
44
|
+
:return: the groups
|
|
43
45
|
"""
|
|
44
46
|
# Avoid circular import
|
|
45
47
|
from .groups import AsyncGroup
|
|
@@ -65,11 +67,13 @@ class AsyncUser(UserBase):
|
|
|
65
67
|
async def projects(self) -> List[AsyncProject]:
|
|
66
68
|
"""
|
|
67
69
|
The projects the user is associate with.
|
|
70
|
+
|
|
71
|
+
:return: the projects
|
|
68
72
|
"""
|
|
69
73
|
if self.name != (await self.client._user()).name:
|
|
70
74
|
raise SfApiError(f"Can only fetch projects for authenticated user.")
|
|
71
75
|
|
|
72
|
-
r = await self.client.get("account/
|
|
76
|
+
r = await self.client.get("account/projects")
|
|
73
77
|
|
|
74
78
|
json_response = r.json()
|
|
75
79
|
|
|
@@ -82,3 +86,26 @@ class AsyncUser(UserBase):
|
|
|
82
86
|
projects = map(_set_client, projects)
|
|
83
87
|
|
|
84
88
|
return list(projects)
|
|
89
|
+
|
|
90
|
+
async def roles(self) -> List[AsyncRole]:
|
|
91
|
+
"""
|
|
92
|
+
The roles the user is associate with.
|
|
93
|
+
|
|
94
|
+
:return: the roles
|
|
95
|
+
"""
|
|
96
|
+
if self.name != (await self.client._user()).name:
|
|
97
|
+
raise SfApiError(f"Can only fetch roles for authenticated user.")
|
|
98
|
+
|
|
99
|
+
r = await self.client.get("account/roles")
|
|
100
|
+
|
|
101
|
+
json_response = r.json()
|
|
102
|
+
|
|
103
|
+
roles = [AsyncRole.parse_obj(p) for p in json_response]
|
|
104
|
+
|
|
105
|
+
def _set_client(p):
|
|
106
|
+
p.client = self.client
|
|
107
|
+
return p
|
|
108
|
+
|
|
109
|
+
roles = map(_set_client, roles)
|
|
110
|
+
|
|
111
|
+
return list(roles)
|
|
@@ -91,6 +91,13 @@ class PublicHost(str, Enum):
|
|
|
91
91
|
perlmutter = "perlmutter"
|
|
92
92
|
|
|
93
93
|
|
|
94
|
+
class RoleStats(BaseModel):
|
|
95
|
+
id: int = Field(..., title="Id")
|
|
96
|
+
description: str = Field(..., title="Description")
|
|
97
|
+
repo_name: str = Field(..., title="Repo Name")
|
|
98
|
+
iris_role: Optional[str] = Field(None, title="Iris Role")
|
|
99
|
+
|
|
100
|
+
|
|
94
101
|
class StatusValue(str, Enum):
|
|
95
102
|
active = "active"
|
|
96
103
|
unavailable = "unavailable"
|
|
@@ -3,10 +3,15 @@ from pydantic import ValidationError, Field
|
|
|
3
3
|
|
|
4
4
|
from .._models import (
|
|
5
5
|
ProjectStats as ProjectBase,
|
|
6
|
+
RoleStats as RoleBase
|
|
6
7
|
)
|
|
7
8
|
from ..exceptions import SfApiError
|
|
8
9
|
|
|
9
10
|
|
|
11
|
+
class Role(RoleBase):
|
|
12
|
+
client: Optional["Client"]
|
|
13
|
+
|
|
14
|
+
|
|
10
15
|
class Project(ProjectBase):
|
|
11
16
|
client: Optional["Client"]
|
|
12
17
|
name: str = Field(alias="repo_name")
|
|
@@ -5,7 +5,7 @@ from .._models import (
|
|
|
5
5
|
UserInfo as UserBase,
|
|
6
6
|
GroupList as GroupsResponse,
|
|
7
7
|
)
|
|
8
|
-
from .projects import Project
|
|
8
|
+
from .projects import Project, Role
|
|
9
9
|
from ..exceptions import SfApiError
|
|
10
10
|
|
|
11
11
|
|
|
@@ -40,6 +40,8 @@ class User(UserBase):
|
|
|
40
40
|
def groups(self) -> List["Group"]:
|
|
41
41
|
"""
|
|
42
42
|
The groups that the user is a member of.
|
|
43
|
+
|
|
44
|
+
:return: the groups
|
|
43
45
|
"""
|
|
44
46
|
# Avoid circular import
|
|
45
47
|
from .groups import Group
|
|
@@ -65,11 +67,13 @@ class User(UserBase):
|
|
|
65
67
|
def projects(self) -> List[Project]:
|
|
66
68
|
"""
|
|
67
69
|
The projects the user is associate with.
|
|
70
|
+
|
|
71
|
+
:return: the projects
|
|
68
72
|
"""
|
|
69
73
|
if self.name != (self.client._user()).name:
|
|
70
74
|
raise SfApiError(f"Can only fetch projects for authenticated user.")
|
|
71
75
|
|
|
72
|
-
r = self.client.get("account/
|
|
76
|
+
r = self.client.get("account/projects")
|
|
73
77
|
|
|
74
78
|
json_response = r.json()
|
|
75
79
|
|
|
@@ -82,3 +86,26 @@ class User(UserBase):
|
|
|
82
86
|
projects = map(_set_client, projects)
|
|
83
87
|
|
|
84
88
|
return list(projects)
|
|
89
|
+
|
|
90
|
+
def roles(self) -> List[Role]:
|
|
91
|
+
"""
|
|
92
|
+
The roles the user is associate with.
|
|
93
|
+
|
|
94
|
+
:return: the roles
|
|
95
|
+
"""
|
|
96
|
+
if self.name != (self.client._user()).name:
|
|
97
|
+
raise SfApiError(f"Can only fetch roles for authenticated user.")
|
|
98
|
+
|
|
99
|
+
r = self.client.get("account/roles")
|
|
100
|
+
|
|
101
|
+
json_response = r.json()
|
|
102
|
+
|
|
103
|
+
roles = [Role.parse_obj(p) for p in json_response]
|
|
104
|
+
|
|
105
|
+
def _set_client(p):
|
|
106
|
+
p.client = self.client
|
|
107
|
+
return p
|
|
108
|
+
|
|
109
|
+
roles = map(_set_client, roles)
|
|
110
|
+
|
|
111
|
+
return list(roles)
|
|
@@ -24,3 +24,21 @@ async def test_create_group(
|
|
|
24
24
|
group = project.create_group(test_group_create)
|
|
25
25
|
|
|
26
26
|
assert group.name == test_create_group
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def test_projects(
|
|
30
|
+
client_id, client_secret
|
|
31
|
+
):
|
|
32
|
+
with Client(client_id, client_secret) as client:
|
|
33
|
+
user = client.user()
|
|
34
|
+
projects = user.projects()
|
|
35
|
+
assert projects
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_roles(
|
|
39
|
+
client_id, client_secret
|
|
40
|
+
):
|
|
41
|
+
with Client(client_id, client_secret) as client:
|
|
42
|
+
user = client.user()
|
|
43
|
+
roles = user.roles()
|
|
44
|
+
assert roles
|
|
@@ -26,3 +26,23 @@ async def test_create_group(
|
|
|
26
26
|
group = await project.create_group(test_group_create)
|
|
27
27
|
|
|
28
28
|
assert group.name == test_create_group
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@pytest.mark.asyncio
|
|
32
|
+
async def test_projects(
|
|
33
|
+
client_id, client_secret
|
|
34
|
+
):
|
|
35
|
+
async with AsyncClient(client_id, client_secret) as client:
|
|
36
|
+
user = await client.user()
|
|
37
|
+
projects = await user.projects()
|
|
38
|
+
assert projects
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@pytest.mark.asyncio
|
|
42
|
+
async def test_roles(
|
|
43
|
+
client_id, client_secret
|
|
44
|
+
):
|
|
45
|
+
async with AsyncClient(client_id, client_secret) as client:
|
|
46
|
+
user = await client.user()
|
|
47
|
+
roles = await user.roles()
|
|
48
|
+
assert roles
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_models/job_status_response_sacct.py
RENAMED
|
File without changes
|
{sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_models/job_status_response_squeue.py
RENAMED
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|