label-studio-sdk 2.0.4__py3-none-any.whl → 2.0.5__py3-none-any.whl
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.
Potentially problematic release.
This version of label-studio-sdk might be problematic. Click here for more details.
- label_studio_sdk/__init__.py +10 -0
- label_studio_sdk/activity_logs/__init__.py +5 -0
- label_studio_sdk/activity_logs/client.py +246 -0
- label_studio_sdk/activity_logs/types/__init__.py +5 -0
- label_studio_sdk/activity_logs/types/activity_logs_list_request_method.py +5 -0
- label_studio_sdk/base_client.py +4 -0
- label_studio_sdk/errors/internal_server_error.py +2 -1
- label_studio_sdk/ml/client.py +4 -4
- label_studio_sdk/projects/__init__.py +14 -2
- label_studio_sdk/projects/client.py +4 -0
- label_studio_sdk/projects/metrics/__init__.py +6 -0
- label_studio_sdk/projects/metrics/client.py +282 -0
- label_studio_sdk/projects/metrics/custom/__init__.py +5 -0
- label_studio_sdk/projects/metrics/custom/client.py +535 -0
- label_studio_sdk/projects/metrics/custom/types/__init__.py +5 -0
- label_studio_sdk/projects/metrics/custom/types/custom_get_lambda_response.py +19 -0
- label_studio_sdk/projects/stats/__init__.py +18 -2
- label_studio_sdk/projects/stats/client.py +129 -0
- label_studio_sdk/projects/stats/types/__init__.py +12 -1
- label_studio_sdk/projects/stats/types/stats_total_agreement_response.py +7 -0
- label_studio_sdk/projects/stats/types/stats_total_agreement_response_one.py +19 -0
- label_studio_sdk/projects/stats/types/stats_total_agreement_response_zero.py +19 -0
- label_studio_sdk/types/__init__.py +6 -0
- label_studio_sdk/types/activity_log.py +49 -0
- label_studio_sdk/types/activity_log_response.py +28 -0
- label_studio_sdk/types/metric_param.py +31 -0
- label_studio_sdk/workspaces/members/__init__.py +4 -0
- label_studio_sdk/workspaces/members/bulk/__init__.py +5 -0
- label_studio_sdk/workspaces/members/bulk/client.py +273 -0
- label_studio_sdk/workspaces/members/bulk/types/__init__.py +6 -0
- label_studio_sdk/workspaces/members/bulk/types/bulk_delete_response.py +19 -0
- label_studio_sdk/workspaces/members/bulk/types/bulk_post_response.py +19 -0
- label_studio_sdk/workspaces/members/client.py +4 -0
- {label_studio_sdk-2.0.4.dist-info → label_studio_sdk-2.0.5.dist-info}/METADATA +1 -1
- {label_studio_sdk-2.0.4.dist-info → label_studio_sdk-2.0.5.dist-info}/RECORD +37 -16
- {label_studio_sdk-2.0.4.dist-info → label_studio_sdk-2.0.5.dist-info}/LICENSE +0 -0
- {label_studio_sdk-2.0.4.dist-info → label_studio_sdk-2.0.5.dist-info}/WHEEL +0 -0
label_studio_sdk/__init__.py
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
from .types import (
|
|
4
4
|
ActionsEnum,
|
|
5
|
+
ActivityLog,
|
|
6
|
+
ActivityLogResponse,
|
|
5
7
|
AllRolesProjectList,
|
|
6
8
|
AllRolesProjectListSampling,
|
|
7
9
|
AllRolesProjectListSkipQueue,
|
|
@@ -98,6 +100,7 @@ from .types import (
|
|
|
98
100
|
LseapiTokenList,
|
|
99
101
|
LsejwtSettings,
|
|
100
102
|
MaybeExpandedComment,
|
|
103
|
+
MetricParam,
|
|
101
104
|
MlBackend,
|
|
102
105
|
ModeEnum,
|
|
103
106
|
ModelInterface,
|
|
@@ -199,6 +202,7 @@ from .errors import (
|
|
|
199
202
|
)
|
|
200
203
|
from . import (
|
|
201
204
|
actions,
|
|
205
|
+
activity_logs,
|
|
202
206
|
annotations,
|
|
203
207
|
billing,
|
|
204
208
|
comments,
|
|
@@ -237,6 +241,7 @@ from .actions import (
|
|
|
237
241
|
ActionsListResponseItem,
|
|
238
242
|
ActionsListResponseItemDialog,
|
|
239
243
|
)
|
|
244
|
+
from .activity_logs import ActivityLogsListRequestMethod
|
|
240
245
|
from .annotations import AnnotationBulkSerializerWithSelectedItemsRequestLastAction, AnnotationsCreateBulkResponseItem
|
|
241
246
|
from .client import AsyncLabelStudio, LabelStudio
|
|
242
247
|
from .environment import LabelStudioEnvironment
|
|
@@ -309,6 +314,9 @@ __all__ = [
|
|
|
309
314
|
"ActionsEnum",
|
|
310
315
|
"ActionsListResponseItem",
|
|
311
316
|
"ActionsListResponseItemDialog",
|
|
317
|
+
"ActivityLog",
|
|
318
|
+
"ActivityLogResponse",
|
|
319
|
+
"ActivityLogsListRequestMethod",
|
|
312
320
|
"AllRolesProjectList",
|
|
313
321
|
"AllRolesProjectListSampling",
|
|
314
322
|
"AllRolesProjectListSkipQueue",
|
|
@@ -419,6 +427,7 @@ __all__ = [
|
|
|
419
427
|
"LsejwtSettings",
|
|
420
428
|
"MaybeExpandedComment",
|
|
421
429
|
"MethodNotAllowedError",
|
|
430
|
+
"MetricParam",
|
|
422
431
|
"MlBackend",
|
|
423
432
|
"MlCreateRequestAuthMethod",
|
|
424
433
|
"MlListModelVersionsResponse",
|
|
@@ -558,6 +567,7 @@ __all__ = [
|
|
|
558
567
|
"WorkspaceMemberList",
|
|
559
568
|
"__version__",
|
|
560
569
|
"actions",
|
|
570
|
+
"activity_logs",
|
|
561
571
|
"annotations",
|
|
562
572
|
"billing",
|
|
563
573
|
"comments",
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# This file was auto-generated by Fern from our API Definition.
|
|
2
|
+
|
|
3
|
+
from ..core.client_wrapper import SyncClientWrapper
|
|
4
|
+
import typing
|
|
5
|
+
from .types.activity_logs_list_request_method import ActivityLogsListRequestMethod
|
|
6
|
+
from ..core.request_options import RequestOptions
|
|
7
|
+
from ..types.activity_log_response import ActivityLogResponse
|
|
8
|
+
from ..core.unchecked_base_model import construct_type
|
|
9
|
+
from ..errors.not_found_error import NotFoundError
|
|
10
|
+
from json.decoder import JSONDecodeError
|
|
11
|
+
from ..core.api_error import ApiError
|
|
12
|
+
from ..core.client_wrapper import AsyncClientWrapper
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ActivityLogsClient:
|
|
16
|
+
def __init__(self, *, client_wrapper: SyncClientWrapper):
|
|
17
|
+
self._client_wrapper = client_wrapper
|
|
18
|
+
|
|
19
|
+
def list(
|
|
20
|
+
self,
|
|
21
|
+
*,
|
|
22
|
+
end_date: typing.Optional[str] = None,
|
|
23
|
+
method: typing.Optional[ActivityLogsListRequestMethod] = None,
|
|
24
|
+
ordering: typing.Optional[str] = None,
|
|
25
|
+
page: typing.Optional[int] = None,
|
|
26
|
+
page_size: typing.Optional[int] = None,
|
|
27
|
+
project: typing.Optional[int] = None,
|
|
28
|
+
search: typing.Optional[str] = None,
|
|
29
|
+
start_date: typing.Optional[str] = None,
|
|
30
|
+
user: typing.Optional[int] = None,
|
|
31
|
+
workspace: typing.Optional[int] = None,
|
|
32
|
+
request_options: typing.Optional[RequestOptions] = None,
|
|
33
|
+
) -> typing.List[ActivityLogResponse]:
|
|
34
|
+
"""
|
|
35
|
+
Retrieve activity logs filtered by workspace, project, user, HTTP method, date range or search query.
|
|
36
|
+
|
|
37
|
+
Parameters
|
|
38
|
+
----------
|
|
39
|
+
end_date : typing.Optional[str]
|
|
40
|
+
End date/time (ISO-8601) for log filtering.
|
|
41
|
+
|
|
42
|
+
method : typing.Optional[ActivityLogsListRequestMethod]
|
|
43
|
+
HTTP request method used in the log.
|
|
44
|
+
|
|
45
|
+
ordering : typing.Optional[str]
|
|
46
|
+
Which field to use when ordering the results.
|
|
47
|
+
|
|
48
|
+
page : typing.Optional[int]
|
|
49
|
+
[or "start"] Current page index.
|
|
50
|
+
|
|
51
|
+
page_size : typing.Optional[int]
|
|
52
|
+
[or "length"] Logs per page, use -1 to obtain all logs (might be slow).
|
|
53
|
+
|
|
54
|
+
project : typing.Optional[int]
|
|
55
|
+
Project ID to filter logs.
|
|
56
|
+
|
|
57
|
+
search : typing.Optional[str]
|
|
58
|
+
Search expression using "AND"/"OR" to filter by request URL.
|
|
59
|
+
|
|
60
|
+
start_date : typing.Optional[str]
|
|
61
|
+
Start date/time (ISO-8601) for log filtering.
|
|
62
|
+
|
|
63
|
+
user : typing.Optional[int]
|
|
64
|
+
User ID to filter logs.
|
|
65
|
+
|
|
66
|
+
workspace : typing.Optional[int]
|
|
67
|
+
Workspace owner ID to filter logs.
|
|
68
|
+
|
|
69
|
+
request_options : typing.Optional[RequestOptions]
|
|
70
|
+
Request-specific configuration.
|
|
71
|
+
|
|
72
|
+
Returns
|
|
73
|
+
-------
|
|
74
|
+
typing.List[ActivityLogResponse]
|
|
75
|
+
Activity logs
|
|
76
|
+
|
|
77
|
+
Examples
|
|
78
|
+
--------
|
|
79
|
+
from label_studio_sdk import LabelStudio
|
|
80
|
+
|
|
81
|
+
client = LabelStudio(
|
|
82
|
+
api_key="YOUR_API_KEY",
|
|
83
|
+
)
|
|
84
|
+
client.activity_logs.list()
|
|
85
|
+
"""
|
|
86
|
+
_response = self._client_wrapper.httpx_client.request(
|
|
87
|
+
"api/activity-logs/",
|
|
88
|
+
method="GET",
|
|
89
|
+
params={
|
|
90
|
+
"end_date": end_date,
|
|
91
|
+
"method": method,
|
|
92
|
+
"ordering": ordering,
|
|
93
|
+
"page": page,
|
|
94
|
+
"page_size": page_size,
|
|
95
|
+
"project": project,
|
|
96
|
+
"search": search,
|
|
97
|
+
"start_date": start_date,
|
|
98
|
+
"user": user,
|
|
99
|
+
"workspace": workspace,
|
|
100
|
+
},
|
|
101
|
+
request_options=request_options,
|
|
102
|
+
)
|
|
103
|
+
try:
|
|
104
|
+
if 200 <= _response.status_code < 300:
|
|
105
|
+
return typing.cast(
|
|
106
|
+
typing.List[ActivityLogResponse],
|
|
107
|
+
construct_type(
|
|
108
|
+
type_=typing.List[ActivityLogResponse], # type: ignore
|
|
109
|
+
object_=_response.json(),
|
|
110
|
+
),
|
|
111
|
+
)
|
|
112
|
+
if _response.status_code == 404:
|
|
113
|
+
raise NotFoundError(
|
|
114
|
+
typing.cast(
|
|
115
|
+
typing.Optional[typing.Any],
|
|
116
|
+
construct_type(
|
|
117
|
+
type_=typing.Optional[typing.Any], # type: ignore
|
|
118
|
+
object_=_response.json(),
|
|
119
|
+
),
|
|
120
|
+
)
|
|
121
|
+
)
|
|
122
|
+
_response_json = _response.json()
|
|
123
|
+
except JSONDecodeError:
|
|
124
|
+
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
125
|
+
raise ApiError(status_code=_response.status_code, body=_response_json)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class AsyncActivityLogsClient:
|
|
129
|
+
def __init__(self, *, client_wrapper: AsyncClientWrapper):
|
|
130
|
+
self._client_wrapper = client_wrapper
|
|
131
|
+
|
|
132
|
+
async def list(
|
|
133
|
+
self,
|
|
134
|
+
*,
|
|
135
|
+
end_date: typing.Optional[str] = None,
|
|
136
|
+
method: typing.Optional[ActivityLogsListRequestMethod] = None,
|
|
137
|
+
ordering: typing.Optional[str] = None,
|
|
138
|
+
page: typing.Optional[int] = None,
|
|
139
|
+
page_size: typing.Optional[int] = None,
|
|
140
|
+
project: typing.Optional[int] = None,
|
|
141
|
+
search: typing.Optional[str] = None,
|
|
142
|
+
start_date: typing.Optional[str] = None,
|
|
143
|
+
user: typing.Optional[int] = None,
|
|
144
|
+
workspace: typing.Optional[int] = None,
|
|
145
|
+
request_options: typing.Optional[RequestOptions] = None,
|
|
146
|
+
) -> typing.List[ActivityLogResponse]:
|
|
147
|
+
"""
|
|
148
|
+
Retrieve activity logs filtered by workspace, project, user, HTTP method, date range or search query.
|
|
149
|
+
|
|
150
|
+
Parameters
|
|
151
|
+
----------
|
|
152
|
+
end_date : typing.Optional[str]
|
|
153
|
+
End date/time (ISO-8601) for log filtering.
|
|
154
|
+
|
|
155
|
+
method : typing.Optional[ActivityLogsListRequestMethod]
|
|
156
|
+
HTTP request method used in the log.
|
|
157
|
+
|
|
158
|
+
ordering : typing.Optional[str]
|
|
159
|
+
Which field to use when ordering the results.
|
|
160
|
+
|
|
161
|
+
page : typing.Optional[int]
|
|
162
|
+
[or "start"] Current page index.
|
|
163
|
+
|
|
164
|
+
page_size : typing.Optional[int]
|
|
165
|
+
[or "length"] Logs per page, use -1 to obtain all logs (might be slow).
|
|
166
|
+
|
|
167
|
+
project : typing.Optional[int]
|
|
168
|
+
Project ID to filter logs.
|
|
169
|
+
|
|
170
|
+
search : typing.Optional[str]
|
|
171
|
+
Search expression using "AND"/"OR" to filter by request URL.
|
|
172
|
+
|
|
173
|
+
start_date : typing.Optional[str]
|
|
174
|
+
Start date/time (ISO-8601) for log filtering.
|
|
175
|
+
|
|
176
|
+
user : typing.Optional[int]
|
|
177
|
+
User ID to filter logs.
|
|
178
|
+
|
|
179
|
+
workspace : typing.Optional[int]
|
|
180
|
+
Workspace owner ID to filter logs.
|
|
181
|
+
|
|
182
|
+
request_options : typing.Optional[RequestOptions]
|
|
183
|
+
Request-specific configuration.
|
|
184
|
+
|
|
185
|
+
Returns
|
|
186
|
+
-------
|
|
187
|
+
typing.List[ActivityLogResponse]
|
|
188
|
+
Activity logs
|
|
189
|
+
|
|
190
|
+
Examples
|
|
191
|
+
--------
|
|
192
|
+
import asyncio
|
|
193
|
+
|
|
194
|
+
from label_studio_sdk import AsyncLabelStudio
|
|
195
|
+
|
|
196
|
+
client = AsyncLabelStudio(
|
|
197
|
+
api_key="YOUR_API_KEY",
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
async def main() -> None:
|
|
202
|
+
await client.activity_logs.list()
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
asyncio.run(main())
|
|
206
|
+
"""
|
|
207
|
+
_response = await self._client_wrapper.httpx_client.request(
|
|
208
|
+
"api/activity-logs/",
|
|
209
|
+
method="GET",
|
|
210
|
+
params={
|
|
211
|
+
"end_date": end_date,
|
|
212
|
+
"method": method,
|
|
213
|
+
"ordering": ordering,
|
|
214
|
+
"page": page,
|
|
215
|
+
"page_size": page_size,
|
|
216
|
+
"project": project,
|
|
217
|
+
"search": search,
|
|
218
|
+
"start_date": start_date,
|
|
219
|
+
"user": user,
|
|
220
|
+
"workspace": workspace,
|
|
221
|
+
},
|
|
222
|
+
request_options=request_options,
|
|
223
|
+
)
|
|
224
|
+
try:
|
|
225
|
+
if 200 <= _response.status_code < 300:
|
|
226
|
+
return typing.cast(
|
|
227
|
+
typing.List[ActivityLogResponse],
|
|
228
|
+
construct_type(
|
|
229
|
+
type_=typing.List[ActivityLogResponse], # type: ignore
|
|
230
|
+
object_=_response.json(),
|
|
231
|
+
),
|
|
232
|
+
)
|
|
233
|
+
if _response.status_code == 404:
|
|
234
|
+
raise NotFoundError(
|
|
235
|
+
typing.cast(
|
|
236
|
+
typing.Optional[typing.Any],
|
|
237
|
+
construct_type(
|
|
238
|
+
type_=typing.Optional[typing.Any], # type: ignore
|
|
239
|
+
object_=_response.json(),
|
|
240
|
+
),
|
|
241
|
+
)
|
|
242
|
+
)
|
|
243
|
+
_response_json = _response.json()
|
|
244
|
+
except JSONDecodeError:
|
|
245
|
+
raise ApiError(status_code=_response.status_code, body=_response.text)
|
|
246
|
+
raise ApiError(status_code=_response.status_code, body=_response_json)
|
label_studio_sdk/base_client.py
CHANGED
|
@@ -6,6 +6,7 @@ import os
|
|
|
6
6
|
import httpx
|
|
7
7
|
from .core.api_error import ApiError
|
|
8
8
|
from .core.client_wrapper import SyncClientWrapper
|
|
9
|
+
from .activity_logs.client import ActivityLogsClient
|
|
9
10
|
from .annotations.client import AnnotationsClient
|
|
10
11
|
from .billing.client import BillingClient
|
|
11
12
|
from .comments.client import CommentsClient
|
|
@@ -29,6 +30,7 @@ from .webhooks.client import WebhooksClient
|
|
|
29
30
|
from .workspaces.client import WorkspacesClient
|
|
30
31
|
from .sso.client import SsoClient
|
|
31
32
|
from .core.client_wrapper import AsyncClientWrapper
|
|
33
|
+
from .activity_logs.client import AsyncActivityLogsClient
|
|
32
34
|
from .annotations.client import AsyncAnnotationsClient
|
|
33
35
|
from .billing.client import AsyncBillingClient
|
|
34
36
|
from .comments.client import AsyncCommentsClient
|
|
@@ -115,6 +117,7 @@ class LabelStudioBase:
|
|
|
115
117
|
else httpx.Client(timeout=_defaulted_timeout),
|
|
116
118
|
timeout=_defaulted_timeout,
|
|
117
119
|
)
|
|
120
|
+
self.activity_logs = ActivityLogsClient(client_wrapper=self._client_wrapper)
|
|
118
121
|
self.annotations = AnnotationsClient(client_wrapper=self._client_wrapper)
|
|
119
122
|
self.billing = BillingClient(client_wrapper=self._client_wrapper)
|
|
120
123
|
self.comments = CommentsClient(client_wrapper=self._client_wrapper)
|
|
@@ -201,6 +204,7 @@ class AsyncLabelStudioBase:
|
|
|
201
204
|
else httpx.AsyncClient(timeout=_defaulted_timeout),
|
|
202
205
|
timeout=_defaulted_timeout,
|
|
203
206
|
)
|
|
207
|
+
self.activity_logs = AsyncActivityLogsClient(client_wrapper=self._client_wrapper)
|
|
204
208
|
self.annotations = AsyncAnnotationsClient(client_wrapper=self._client_wrapper)
|
|
205
209
|
self.billing = AsyncBillingClient(client_wrapper=self._client_wrapper)
|
|
206
210
|
self.comments = AsyncCommentsClient(client_wrapper=self._client_wrapper)
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# This file was auto-generated by Fern from our API Definition.
|
|
2
2
|
|
|
3
3
|
from ..core.api_error import ApiError
|
|
4
|
+
import typing
|
|
4
5
|
|
|
5
6
|
|
|
6
7
|
class InternalServerError(ApiError):
|
|
7
|
-
def __init__(self, body:
|
|
8
|
+
def __init__(self, body: typing.Optional[typing.Any]):
|
|
8
9
|
super().__init__(status_code=500, body=body)
|
label_studio_sdk/ml/client.py
CHANGED
|
@@ -516,9 +516,9 @@ class MlClient:
|
|
|
516
516
|
if _response.status_code == 500:
|
|
517
517
|
raise InternalServerError(
|
|
518
518
|
typing.cast(
|
|
519
|
-
|
|
519
|
+
typing.Optional[typing.Any],
|
|
520
520
|
construct_type(
|
|
521
|
-
type_=
|
|
521
|
+
type_=typing.Optional[typing.Any], # type: ignore
|
|
522
522
|
object_=_response.json(),
|
|
523
523
|
),
|
|
524
524
|
)
|
|
@@ -1131,9 +1131,9 @@ class AsyncMlClient:
|
|
|
1131
1131
|
if _response.status_code == 500:
|
|
1132
1132
|
raise InternalServerError(
|
|
1133
1133
|
typing.cast(
|
|
1134
|
-
|
|
1134
|
+
typing.Optional[typing.Any],
|
|
1135
1135
|
construct_type(
|
|
1136
|
-
type_=
|
|
1136
|
+
type_=typing.Optional[typing.Any], # type: ignore
|
|
1137
1137
|
object_=_response.json(),
|
|
1138
1138
|
),
|
|
1139
1139
|
)
|
|
@@ -9,7 +9,7 @@ from .types import (
|
|
|
9
9
|
ProjectsImportTasksResponse,
|
|
10
10
|
ProjectsListRequestFilter,
|
|
11
11
|
)
|
|
12
|
-
from . import assignments, exports, members, pauses, stats
|
|
12
|
+
from . import assignments, exports, members, metrics, pauses, stats
|
|
13
13
|
from .assignments import (
|
|
14
14
|
AssignmentsAssignRequestType,
|
|
15
15
|
AssignmentsBulkAssignRequestFilters,
|
|
@@ -27,7 +27,15 @@ from .assignments import (
|
|
|
27
27
|
AssignmentsUpdateRequestType,
|
|
28
28
|
)
|
|
29
29
|
from .exports import ExportsConvertResponse
|
|
30
|
-
from .stats import
|
|
30
|
+
from .stats import (
|
|
31
|
+
StatsIaaResponse,
|
|
32
|
+
StatsIaaResponseCommonTasks,
|
|
33
|
+
StatsIaaResponseIaa,
|
|
34
|
+
StatsIaaResponseStd,
|
|
35
|
+
StatsTotalAgreementResponse,
|
|
36
|
+
StatsTotalAgreementResponseOne,
|
|
37
|
+
StatsTotalAgreementResponseZero,
|
|
38
|
+
)
|
|
31
39
|
|
|
32
40
|
__all__ = [
|
|
33
41
|
"AssignmentsAssignRequestType",
|
|
@@ -56,9 +64,13 @@ __all__ = [
|
|
|
56
64
|
"StatsIaaResponseCommonTasks",
|
|
57
65
|
"StatsIaaResponseIaa",
|
|
58
66
|
"StatsIaaResponseStd",
|
|
67
|
+
"StatsTotalAgreementResponse",
|
|
68
|
+
"StatsTotalAgreementResponseOne",
|
|
69
|
+
"StatsTotalAgreementResponseZero",
|
|
59
70
|
"assignments",
|
|
60
71
|
"exports",
|
|
61
72
|
"members",
|
|
73
|
+
"metrics",
|
|
62
74
|
"pauses",
|
|
63
75
|
"stats",
|
|
64
76
|
]
|
|
@@ -4,6 +4,7 @@ import typing
|
|
|
4
4
|
from ..core.client_wrapper import SyncClientWrapper
|
|
5
5
|
from .exports.client import ExportsClient
|
|
6
6
|
from .members.client import MembersClient
|
|
7
|
+
from .metrics.client import MetricsClient
|
|
7
8
|
from .stats.client import StatsClient
|
|
8
9
|
from .assignments.client import AssignmentsClient
|
|
9
10
|
from .pauses.client import PausesClient
|
|
@@ -37,6 +38,7 @@ from ..types.project_label_config import ProjectLabelConfig
|
|
|
37
38
|
from ..core.client_wrapper import AsyncClientWrapper
|
|
38
39
|
from .exports.client import AsyncExportsClient
|
|
39
40
|
from .members.client import AsyncMembersClient
|
|
41
|
+
from .metrics.client import AsyncMetricsClient
|
|
40
42
|
from .stats.client import AsyncStatsClient
|
|
41
43
|
from .assignments.client import AsyncAssignmentsClient
|
|
42
44
|
from .pauses.client import AsyncPausesClient
|
|
@@ -51,6 +53,7 @@ class ProjectsClient:
|
|
|
51
53
|
self._client_wrapper = client_wrapper
|
|
52
54
|
self.exports = ExportsClient(client_wrapper=self._client_wrapper)
|
|
53
55
|
self.members = MembersClient(client_wrapper=self._client_wrapper)
|
|
56
|
+
self.metrics = MetricsClient(client_wrapper=self._client_wrapper)
|
|
54
57
|
self.stats = StatsClient(client_wrapper=self._client_wrapper)
|
|
55
58
|
self.assignments = AssignmentsClient(client_wrapper=self._client_wrapper)
|
|
56
59
|
self.pauses = PausesClient(client_wrapper=self._client_wrapper)
|
|
@@ -980,6 +983,7 @@ class AsyncProjectsClient:
|
|
|
980
983
|
self._client_wrapper = client_wrapper
|
|
981
984
|
self.exports = AsyncExportsClient(client_wrapper=self._client_wrapper)
|
|
982
985
|
self.members = AsyncMembersClient(client_wrapper=self._client_wrapper)
|
|
986
|
+
self.metrics = AsyncMetricsClient(client_wrapper=self._client_wrapper)
|
|
983
987
|
self.stats = AsyncStatsClient(client_wrapper=self._client_wrapper)
|
|
984
988
|
self.assignments = AsyncAssignmentsClient(client_wrapper=self._client_wrapper)
|
|
985
989
|
self.pauses = AsyncPausesClient(client_wrapper=self._client_wrapper)
|