trismik 0.9.6__tar.gz → 0.9.8__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trismik
3
- Version: 0.9.6
3
+ Version: 0.9.8
4
4
  Summary:
5
5
  License-File: LICENSE
6
6
  Author: Bartosz Kielczewski
@@ -10,7 +10,7 @@ authors = [
10
10
  ]
11
11
  readme = "README.md"
12
12
  requires-python = ">=3.9"
13
- version = "0.9.6"
13
+ version = "0.9.8"
14
14
 
15
15
  [project.optional-dependencies]
16
16
  examples = [
@@ -9,6 +9,7 @@ from trismik.types import (
9
9
  TrismikMeResponse,
10
10
  TrismikMultipleChoiceTextItem,
11
11
  TrismikOrganization,
12
+ TrismikProject,
12
13
  TrismikReplayResponse,
13
14
  TrismikResponse,
14
15
  TrismikResult,
@@ -336,3 +337,23 @@ class TrismikResponseMapper:
336
337
  user=user_info,
337
338
  responseCount=json["responseCount"],
338
339
  )
340
+
341
+ @staticmethod
342
+ def to_project(json: Dict[str, Any]) -> TrismikProject:
343
+ """
344
+ Convert JSON response to a TrismikProject object.
345
+
346
+ Args:
347
+ json (Dict[str, Any]): JSON response from project creation endpoint.
348
+
349
+ Returns:
350
+ TrismikProject: Project object.
351
+ """
352
+ return TrismikProject(
353
+ id=json["id"],
354
+ name=json["name"],
355
+ description=json.get("description"),
356
+ organizationId=json["organizationId"],
357
+ createdAt=json["createdAt"],
358
+ updatedAt=json["updatedAt"],
359
+ )
@@ -22,6 +22,7 @@ from trismik.types import (
22
22
  TrismikDataset,
23
23
  TrismikItem,
24
24
  TrismikMeResponse,
25
+ TrismikProject,
25
26
  TrismikReplayRequest,
26
27
  TrismikReplayRequestItem,
27
28
  TrismikRunMetadata,
@@ -140,6 +141,59 @@ class AdaptiveTest:
140
141
  """
141
142
  return await self._client.me()
142
143
 
144
+ def create_project(
145
+ self,
146
+ name: str,
147
+ organization_id: str,
148
+ description: Optional[str] = None,
149
+ ) -> TrismikProject:
150
+ """
151
+ Create a new project synchronously.
152
+
153
+ Args:
154
+ name (str): Name of the project.
155
+ organization_id (str): ID of the organization to create the
156
+ project in.
157
+ description (Optional[str]): Optional description of the project.
158
+
159
+ Returns:
160
+ TrismikProject: Created project information.
161
+
162
+ Raises:
163
+ TrismikValidationError: If the request fails validation.
164
+ TrismikApiError: If API request fails.
165
+ """
166
+ loop = self._get_loop()
167
+ return loop.run_until_complete(
168
+ self.create_project_async(name, organization_id, description)
169
+ )
170
+
171
+ async def create_project_async(
172
+ self,
173
+ name: str,
174
+ organization_id: str,
175
+ description: Optional[str] = None,
176
+ ) -> TrismikProject:
177
+ """
178
+ Create a new project asynchronously.
179
+
180
+ Args:
181
+ name (str): Name of the project.
182
+ organization_id (str): ID of the organization to create the
183
+ project in.
184
+ description (Optional[str]): Optional description of the project.
185
+
186
+ Returns:
187
+ TrismikProject: Created project information.
188
+
189
+ Raises:
190
+ TrismikValidationError: If the request fails validation.
191
+ TrismikApiError: If API request fails.
192
+ """
193
+ return await self._client.create_project(
194
+ name, organization_id, description
195
+ )
196
+
143
197
  @overload
144
198
  def run( # noqa: E704
145
199
  self,
@@ -22,6 +22,7 @@ from trismik.types import (
22
22
  TrismikClassicEvalResponse,
23
23
  TrismikDataset,
24
24
  TrismikMeResponse,
25
+ TrismikProject,
25
26
  TrismikReplayRequest,
26
27
  TrismikReplayResponse,
27
28
  TrismikRunMetadata,
@@ -71,7 +72,7 @@ class TrismikAsyncClient:
71
72
  default_headers = {"x-api-key": self._api_key}
72
73
 
73
74
  self._http_client = http_client or httpx.AsyncClient(
74
- base_url=self._service_url, headers=default_headers
75
+ base_url=self._service_url, headers=default_headers, timeout=30.0
75
76
  )
76
77
 
77
78
  def _handle_http_error(self, e: httpx.HTTPStatusError) -> Exception:
@@ -360,3 +361,44 @@ class TrismikAsyncClient:
360
361
  raise self._handle_http_error(e) from e
361
362
  except httpx.HTTPError as e:
362
363
  raise TrismikApiError(str(e)) from e
364
+
365
+ async def create_project(
366
+ self,
367
+ name: str,
368
+ organization_id: str,
369
+ description: Optional[str] = None,
370
+ ) -> TrismikProject:
371
+ """
372
+ Create a new project.
373
+
374
+ Args:
375
+ name (str): Name of the project.
376
+ organization_id (str): ID of the organization to create the
377
+ project in.
378
+ description (Optional[str]): Optional description of the project.
379
+
380
+ Returns:
381
+ TrismikProject: Created project information.
382
+
383
+ Raises:
384
+ TrismikValidationError: If the request fails validation.
385
+ TrismikApiError: If API request fails.
386
+ """
387
+ try:
388
+ url = "../admin/public/projects"
389
+
390
+ body = {"name": name}
391
+ if description is not None:
392
+ body["description"] = description
393
+
394
+ headers = {"x-organization-id": organization_id}
395
+ response = await self._http_client.post(
396
+ url, json=body, headers=headers
397
+ )
398
+ response.raise_for_status()
399
+ json = response.json()
400
+ return TrismikResponseMapper.to_project(json)
401
+ except httpx.HTTPStatusError as e:
402
+ raise self._handle_http_error(e) from e
403
+ except httpx.HTTPError as e:
404
+ raise TrismikApiError(str(e)) from e
@@ -299,3 +299,23 @@ class TrismikClassicEvalResponse:
299
299
  createdAt: str
300
300
  user: TrismikUserInfo
301
301
  responseCount: int
302
+
303
+
304
+ @dataclass
305
+ class TrismikProjectRequest:
306
+ """Request to create a new project."""
307
+
308
+ name: str
309
+ description: Optional[str] = None
310
+
311
+
312
+ @dataclass
313
+ class TrismikProject:
314
+ """Project information."""
315
+
316
+ id: str
317
+ name: str
318
+ description: Optional[str]
319
+ organizationId: str
320
+ createdAt: str
321
+ updatedAt: str
File without changes
File without changes
File without changes
File without changes
File without changes