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.
Files changed (87) hide show
  1. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/PKG-INFO +2 -2
  2. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/pyproject.toml +1 -1
  3. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/scripts/run.py +3 -1
  4. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_async/projects.py +5 -0
  5. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_async/users.py +29 -2
  6. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_models/__init__.py +7 -0
  7. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_sync/projects.py +5 -0
  8. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_sync/users.py +29 -2
  9. sfapi_client-0.0.6/src/sfapi_client/projects.py +2 -0
  10. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_projects.py +18 -0
  11. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_projects_async.py +20 -0
  12. sfapi_client-0.0.4/src/sfapi_client/projects.py +0 -2
  13. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/.github/workflows/mkdocs.yml +0 -0
  14. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/.github/workflows/pypi.yml +0 -0
  15. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/.github/workflows/pytest.yml +0 -0
  16. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/.gitignore +0 -0
  17. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/LEGAL +0 -0
  18. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/LICENSE +0 -0
  19. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/README.md +0 -0
  20. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/community/contributing.md +0 -0
  21. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/examples/check_current_and_past_jobs.ipynb +0 -0
  22. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/examples/getting_bearer_token.ipynb +0 -0
  23. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/examples/run_job_and_check_status.ipynb +0 -0
  24. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/gen_examples.py +0 -0
  25. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/gen_sync.py +0 -0
  26. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/index.md +0 -0
  27. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/javascript/apiselector.js +0 -0
  28. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/quickstart/index.md +0 -0
  29. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/SUMMARY.txt +0 -0
  30. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/async/client/index.md +0 -0
  31. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/async/compute/index.md +0 -0
  32. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/async/exceptions/index.md +0 -0
  33. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/async/groups/index.md +0 -0
  34. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/async/jobs/index.md +0 -0
  35. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/async/paths/index.md +0 -0
  36. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/async/projects/index.md +0 -0
  37. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/async/resources/index.md +0 -0
  38. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/docs/reference/async/users/index.md +0 -0
  39. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/mkdocs.yml +0 -0
  40. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/pytest.ini +0 -0
  41. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/requirements-dev.txt +0 -0
  42. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/__init__.py +0 -0
  43. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_async/__init__.py +0 -0
  44. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_async/client.py +0 -0
  45. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_async/compute.py +0 -0
  46. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_async/groups.py +0 -0
  47. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_async/jobs.py +0 -0
  48. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_async/paths.py +0 -0
  49. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_compute.py +0 -0
  50. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_jobs.py +0 -0
  51. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_models/job_status_response_sacct.py +0 -0
  52. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_models/job_status_response_squeue.py +0 -0
  53. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_models/resources.py +0 -0
  54. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_monitor.py +0 -0
  55. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_sync/__init__.py +0 -0
  56. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_sync/_models.py +0 -0
  57. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_sync/client.py +0 -0
  58. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_sync/compute.py +0 -0
  59. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_sync/groups.py +0 -0
  60. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_sync/jobs.py +0 -0
  61. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_sync/paths.py +0 -0
  62. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/_utils.py +0 -0
  63. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/client.py +0 -0
  64. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/compute.py +0 -0
  65. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/exceptions.py +0 -0
  66. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/groups.py +0 -0
  67. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/jobs.py +0 -0
  68. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/paths.py +0 -0
  69. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/resources.py +0 -0
  70. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/src/sfapi_client/users.py +0 -0
  71. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/conftest.py +0 -0
  72. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_api.py +0 -0
  73. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_api_async.py +0 -0
  74. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_client.py +0 -0
  75. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_client_async.py +0 -0
  76. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_compute.py +0 -0
  77. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_compute_async.py +0 -0
  78. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_groups.py +0 -0
  79. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_groups_async.py +0 -0
  80. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_jobs.py +0 -0
  81. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_jobs_async.py +0 -0
  82. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_paths.py +0 -0
  83. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_paths_async.py +0 -0
  84. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_resources.py +0 -0
  85. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_resources_async.py +0 -0
  86. {sfapi_client-0.0.4 → sfapi_client-0.0.6}/tests/test_users.py +0 -0
  87. {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.4
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'
@@ -18,7 +18,7 @@ requires-python = ">=3.7"
18
18
  dependencies = [
19
19
  "authlib",
20
20
  "httpx",
21
- "pydantic",
21
+ "pydantic==v1.10.10",
22
22
  "tenacity"
23
23
  ]
24
24
  classifiers = [
@@ -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, datetime
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/roles")
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/roles")
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)
@@ -0,0 +1,2 @@
1
+ from ._async.projects import AsyncProject, AsyncRole
2
+ from ._sync.projects import Project, Role
@@ -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
@@ -1,2 +0,0 @@
1
- from ._async.projects import AsyncProject
2
- from ._sync.projects import Project
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes