trismik 0.9.0__py3-none-any.whl → 0.9.1__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.
trismik/client_async.py CHANGED
@@ -1,280 +1,338 @@
1
- from typing import List, Any, Optional
2
-
3
- import httpx
4
-
5
- from ._mapper import TrismikResponseMapper
6
- from ._utils import TrismikUtils
7
- from .exceptions import TrismikApiError
8
- from .types import (
9
- TrismikTest,
10
- TrismikAuth,
11
- TrismikSession,
12
- TrismikItem,
13
- TrismikResult,
14
- TrismikResponse,
15
- )
16
-
17
-
18
- class TrismikAsyncClient:
19
- _serviceUrl: str = "https://trismik.e-psychometrics.com/api"
20
-
21
- def __init__(
22
- self,
23
- service_url: Optional[str] = None,
24
- api_key: Optional[str] = None,
25
- http_client: Optional[httpx.AsyncClient] | None = None,
26
- ) -> None:
27
- """
28
- Initializes a new Trismik client (async version).
29
-
30
- Args:
31
- service_url (Optional[str]): URL of the Trismik service.
32
- api_key (Optional[str]): API key for the Trismik service.
33
- http_client (Optional[httpx.Client]): HTTP client to use for requests.
34
-
35
- Raises:
36
- TrismikError: If service_url or api_key are not provided and not found in environment.
37
- TrismikApiError: If API request fails.
38
- """
39
- self._service_url = TrismikUtils.option(
40
- service_url, self._serviceUrl, "TRISMIK_SERVICE_URL"
41
- )
42
- self._api_key = TrismikUtils.required_option(
43
- api_key, "api_key", "TRISMIK_API_KEY"
44
- )
45
- self._http_client = http_client or httpx.AsyncClient(
46
- base_url=self._service_url)
47
-
48
- async def authenticate(self) -> TrismikAuth:
49
- """
50
- Authenticates with the Trismik service.
51
-
52
- Returns:
53
- TrismikAuth: Authentication token.
54
-
55
- Raises:
56
- TrismikApiError: If API request fails.
57
- """
58
- try:
59
- url = "/client/auth"
60
- body = {"apiKey": self._api_key}
61
- response = await self._http_client.post(url, json=body)
62
- response.raise_for_status()
63
- json = response.json()
64
- return TrismikResponseMapper.to_auth(json)
65
- except httpx.HTTPStatusError as e:
66
- raise TrismikApiError(
67
- TrismikUtils.get_error_message(e.response)) from e
68
- except httpx.HTTPError as e:
69
- raise TrismikApiError(str(e)) from e
70
-
71
- async def refresh_token(self, token: str) -> TrismikAuth:
72
- """
73
- Refreshes the authentication token.
74
-
75
- Args:
76
- token (str): Current authentication token.
77
-
78
- Returns:
79
- TrismikAuth: New authentication token.
80
-
81
- Raises:
82
- TrismikApiError: If API request fails.
83
- """
84
- try:
85
- url = "/client/token"
86
- headers = {"Authorization": f"Bearer {token}"}
87
- response = await self._http_client.get(url, headers=headers)
88
- response.raise_for_status()
89
- json = response.json()
90
- return TrismikResponseMapper.to_auth(json)
91
- except httpx.HTTPStatusError as e:
92
- raise TrismikApiError(
93
- TrismikUtils.get_error_message(e.response)) from e
94
- except httpx.HTTPError as e:
95
- raise TrismikApiError(str(e)) from e
96
-
97
- async def available_tests(self, token: str) -> List[TrismikTest]:
98
- """
99
- Retrieves a list of available tests.
100
-
101
- Args:
102
- token (str): Authentication token.
103
-
104
- Returns:
105
- List[TrismikTest]: List of available tests.
106
-
107
- Raises:
108
- TrismikApiError: If API request fails.
109
- """
110
- try:
111
- url = "/client/tests"
112
- headers = {"Authorization": f"Bearer {token}"}
113
- response = await self._http_client.get(url, headers=headers)
114
- response.raise_for_status()
115
- json = response.json()
116
- return TrismikResponseMapper.to_tests(json)
117
- except httpx.HTTPStatusError as e:
118
- raise TrismikApiError(
119
- TrismikUtils.get_error_message(e.response)) from e
120
- except httpx.HTTPError as e:
121
- raise TrismikApiError(str(e)) from e
122
-
123
- async def create_session(self, test_id: str, token: str) -> TrismikSession:
124
- """
125
- Creates a new session for a test.
126
-
127
- Args:
128
- test_id (str): ID of the test.
129
- token (str): Authentication token.
130
-
131
- Returns:
132
- TrismikSession: New session
133
-
134
- Raises:
135
- TrismikApiError: If API request fails.
136
- """
137
- try:
138
- url = "/client/sessions"
139
- headers = {"Authorization": f"Bearer {token}"}
140
- body = {"testId": test_id}
141
- response = await self._http_client.post(url, headers=headers,
142
- json=body)
143
- response.raise_for_status()
144
- json = response.json()
145
- return TrismikResponseMapper.to_session(json)
146
- except httpx.HTTPStatusError as e:
147
- raise TrismikApiError(
148
- TrismikUtils.get_error_message(e.response)) from e
149
- except httpx.HTTPError as e:
150
- raise TrismikApiError(str(e)) from e
151
-
152
- async def current_item(
153
- self,
154
- session_url: str,
155
- token: str
156
- ) -> TrismikItem:
157
- """
158
- Retrieves the current test item.
159
-
160
- Args:
161
- session_url (str): URL of the session.
162
- token (str): Authentication token.
163
-
164
- Returns:
165
- TrismikItem: Current test item.
166
-
167
- Raises:
168
- TrismikApiError: If API request fails.
169
- """
170
- try:
171
- url = f"{session_url}/item"
172
- headers = {"Authorization": f"Bearer {token}"}
173
- response = await self._http_client.get(url, headers=headers)
174
- response.raise_for_status()
175
- json = response.json()
176
- return TrismikResponseMapper.to_item(json)
177
- except httpx.HTTPStatusError as e:
178
- raise TrismikApiError(
179
- TrismikUtils.get_error_message(e.response)) from e
180
- except httpx.HTTPError as e:
181
- raise TrismikApiError(str(e)) from e
182
-
183
- async def respond_to_current_item(
184
- self,
185
- session_url: str,
186
- value: Any,
187
- token: str
188
- ) -> TrismikItem | None:
189
- """
190
- Responds to the current test item.
191
-
192
- Args:
193
- session_url (str): URL of the session.
194
- value (Any): Response value.
195
- token (str): Authentication token.
196
-
197
- Returns:
198
- TrismikItem | None: Next test item or None if session is finished.
199
-
200
- Raises:
201
- TrismikApiError: If API request fails.
202
- """
203
- try:
204
- url = f"{session_url}/item"
205
- body = {"value": value}
206
- headers = {"Authorization": f"Bearer {token}"}
207
- response = await self._http_client.post(
208
- url, headers=headers, json=body
209
- )
210
- response.raise_for_status()
211
- if response.status_code == 204:
212
- return None
213
- else:
214
- json = response.json()
215
- return TrismikResponseMapper.to_item(json)
216
- except httpx.HTTPStatusError as e:
217
- raise TrismikApiError(
218
- TrismikUtils.get_error_message(e.response)) from e
219
- except httpx.HTTPError as e:
220
- raise TrismikApiError(str(e)) from e
221
-
222
- async def results(self,
223
- session_url: str,
224
- token: str
225
- ) -> List[TrismikResult]:
226
- """
227
- Retrieves the results of a session.
228
-
229
- Args:
230
- session_url (str): URL of the session.
231
- token (str): Authentication token.
232
-
233
- Returns:
234
- List[TrismikResult]: Results of the session.
235
-
236
- Raises:
237
- TrismikApiError: If API request fails.
238
- """
239
- try:
240
- url = f"{session_url}/results"
241
- headers = {"Authorization": f"Bearer {token}"}
242
- response = await self._http_client.get(url, headers=headers)
243
- response.raise_for_status()
244
- json = response.json()
245
- return TrismikResponseMapper.to_results(json)
246
- except httpx.HTTPStatusError as e:
247
- raise TrismikApiError(
248
- TrismikUtils.get_error_message(e.response)) from e
249
- except httpx.HTTPError as e:
250
- raise TrismikApiError(str(e)) from e
251
-
252
- async def responses(self,
253
- session_url: str,
254
- token: str
255
- ) -> List[TrismikResponse]:
256
- """
257
- Retrieves responses to session items.
258
-
259
- Args:
260
- session_url (str): URL of the session.
261
- token (str): Authentication token.
262
-
263
- Returns:
264
- List[TrismikResponse]: Responses of the session.
265
-
266
- Raises:
267
- TrismikApiError: If API request fails.
268
- """
269
- try:
270
- url = f"{session_url}/responses"
271
- headers = {"Authorization": f"Bearer {token}"}
272
- response = await self._http_client.get(url, headers=headers)
273
- response.raise_for_status()
274
- json = response.json()
275
- return TrismikResponseMapper.to_responses(json)
276
- except httpx.HTTPStatusError as e:
277
- raise TrismikApiError(
278
- TrismikUtils.get_error_message(e.response)) from e
279
- except httpx.HTTPError as e:
280
- raise TrismikApiError(str(e)) from e
1
+ from typing import List, Any, Optional
2
+
3
+ import httpx
4
+
5
+ from ._mapper import TrismikResponseMapper
6
+ from ._utils import TrismikUtils
7
+ from .exceptions import TrismikApiError
8
+ from .types import (
9
+ TrismikSessionMetadata,
10
+ TrismikTest,
11
+ TrismikAuth,
12
+ TrismikSession,
13
+ TrismikItem,
14
+ TrismikResult,
15
+ TrismikResponse,
16
+ )
17
+
18
+
19
+ class TrismikAsyncClient:
20
+ _serviceUrl: str = "https://trismik.e-psychometrics.com/api"
21
+
22
+ def __init__(
23
+ self,
24
+ service_url: Optional[str] = None,
25
+ api_key: Optional[str] = None,
26
+ http_client: Optional[httpx.AsyncClient] | None = None,
27
+ ) -> None:
28
+ """
29
+ Initializes a new Trismik client (async version).
30
+
31
+ Args:
32
+ service_url (Optional[str]): URL of the Trismik service.
33
+ api_key (Optional[str]): API key for the Trismik service.
34
+ http_client (Optional[httpx.Client]): HTTP client to use for requests.
35
+
36
+ Raises:
37
+ TrismikError: If service_url or api_key are not provided and not found in environment.
38
+ TrismikApiError: If API request fails.
39
+ """
40
+ self._service_url = TrismikUtils.option(
41
+ service_url, self._serviceUrl, "TRISMIK_SERVICE_URL"
42
+ )
43
+ self._api_key = TrismikUtils.required_option(
44
+ api_key, "api_key", "TRISMIK_API_KEY"
45
+ )
46
+ self._http_client = http_client or httpx.AsyncClient(
47
+ base_url=self._service_url)
48
+
49
+ async def authenticate(self) -> TrismikAuth:
50
+ """
51
+ Authenticates with the Trismik service.
52
+
53
+ Returns:
54
+ TrismikAuth: Authentication token.
55
+
56
+ Raises:
57
+ TrismikApiError: If API request fails.
58
+ """
59
+ try:
60
+ url = "/client/auth"
61
+ body = {"apiKey": self._api_key}
62
+ response = await self._http_client.post(url, json=body)
63
+ response.raise_for_status()
64
+ json = response.json()
65
+ return TrismikResponseMapper.to_auth(json)
66
+ except httpx.HTTPStatusError as e:
67
+ raise TrismikApiError(
68
+ TrismikUtils.get_error_message(e.response)) from e
69
+ except httpx.HTTPError as e:
70
+ raise TrismikApiError(str(e)) from e
71
+
72
+ async def refresh_token(self, token: str) -> TrismikAuth:
73
+ """
74
+ Refreshes the authentication token.
75
+
76
+ Args:
77
+ token (str): Current authentication token.
78
+
79
+ Returns:
80
+ TrismikAuth: New authentication token.
81
+
82
+ Raises:
83
+ TrismikApiError: If API request fails.
84
+ """
85
+ try:
86
+ url = "/client/token"
87
+ headers = {"Authorization": f"Bearer {token}"}
88
+ response = await self._http_client.get(url, headers=headers)
89
+ response.raise_for_status()
90
+ json = response.json()
91
+ return TrismikResponseMapper.to_auth(json)
92
+ except httpx.HTTPStatusError as e:
93
+ raise TrismikApiError(
94
+ TrismikUtils.get_error_message(e.response)) from e
95
+ except httpx.HTTPError as e:
96
+ raise TrismikApiError(str(e)) from e
97
+
98
+ async def available_tests(self, token: str) -> List[TrismikTest]:
99
+ """
100
+ Retrieves a list of available tests.
101
+
102
+ Args:
103
+ token (str): Authentication token.
104
+
105
+ Returns:
106
+ List[TrismikTest]: List of available tests.
107
+
108
+ Raises:
109
+ TrismikApiError: If API request fails.
110
+ """
111
+ try:
112
+ url = "/client/tests"
113
+ headers = {"Authorization": f"Bearer {token}"}
114
+ response = await self._http_client.get(url, headers=headers)
115
+ response.raise_for_status()
116
+ json = response.json()
117
+ return TrismikResponseMapper.to_tests(json)
118
+ except httpx.HTTPStatusError as e:
119
+ raise TrismikApiError(
120
+ TrismikUtils.get_error_message(e.response)) from e
121
+ except httpx.HTTPError as e:
122
+ raise TrismikApiError(str(e)) from e
123
+
124
+ async def create_session(self, test_id: str, metadata: TrismikSessionMetadata, token: str) -> TrismikSession:
125
+ """
126
+ Creates a new session for a test.
127
+
128
+ Args:
129
+ test_id (str): ID of the test.
130
+ token (str): Authentication token.
131
+
132
+ Returns:
133
+ TrismikSession: New session
134
+
135
+ Raises:
136
+ TrismikApiError: If API request fails.
137
+ """
138
+ try:
139
+ url = "/client/sessions"
140
+ headers = {"Authorization": f"Bearer {token}"}
141
+ body = {"testId": test_id, "metadata": metadata.toDict()}
142
+ response = await self._http_client.post(url, headers=headers,
143
+ json=body)
144
+ response.raise_for_status()
145
+ json = response.json()
146
+ return TrismikResponseMapper.to_session(json)
147
+ except httpx.HTTPStatusError as e:
148
+ raise TrismikApiError(
149
+ TrismikUtils.get_error_message(e.response)) from e
150
+ except httpx.HTTPError as e:
151
+ raise TrismikApiError(str(e)) from e
152
+
153
+ async def create_replay_session(self, previous_session_id: str, metadata: TrismikSessionMetadata, token: str) -> TrismikSession:
154
+ """
155
+ Creates a new session that replays exactly the question sequence of a previous session
156
+
157
+ Args:
158
+ previous_session_id (str): Session id of the session to replay.
159
+ token (str): Authentication token.
160
+
161
+ Returns:
162
+ TrismikSession: New session
163
+
164
+ Raises:
165
+ TrismikApiError: If API request fails.
166
+ """
167
+ try:
168
+ url = "/client/sessions/replay"
169
+ headers = {"Authorization": f"Bearer {token}"}
170
+ body = {"previousSessionToken": previous_session_id, "metadata": metadata.toDict(), }
171
+ response = await self._http_client.post(url, headers=headers,
172
+ json=body)
173
+ response.raise_for_status()
174
+ json = response.json()
175
+ return TrismikResponseMapper.to_session(json)
176
+ except httpx.HTTPStatusError as e:
177
+ raise TrismikApiError(
178
+ TrismikUtils.get_error_message(e.response)) from e
179
+ except httpx.HTTPError as e:
180
+ raise TrismikApiError(str(e)) from e
181
+
182
+ async def add_metadata(self, session_id: str, metadata: TrismikSessionMetadata, token: str) -> None:
183
+ """
184
+ Adds metadata to the session, merging it with any already stored
185
+
186
+ Args:
187
+ session_id (str): id of the session object
188
+ metadata: object cotaining the metadata to add
189
+ token (str): Authentication token.
190
+
191
+ Returns:
192
+ None
193
+
194
+ Raises:
195
+ TrismikApiError: If API request fails.
196
+ """
197
+ try:
198
+ url = f"/client/sessions/{session_id}/metadata"
199
+ headers = {"Authorization": f"Bearer {token}"}
200
+ body = metadata.toDict()
201
+ response = await self._http_client.post(url, headers=headers,
202
+ json=body)
203
+ response.raise_for_status()
204
+ except httpx.HTTPStatusError as e:
205
+ raise TrismikApiError(
206
+ TrismikUtils.get_error_message(e.response)) from e
207
+ except httpx.HTTPError as e:
208
+ raise TrismikApiError(str(e)) from e
209
+
210
+ async def current_item(
211
+ self,
212
+ session_url: str,
213
+ token: str
214
+ ) -> TrismikItem:
215
+ """
216
+ Retrieves the current test item.
217
+
218
+ Args:
219
+ session_url (str): URL of the session.
220
+ token (str): Authentication token.
221
+
222
+ Returns:
223
+ TrismikItem: Current test item.
224
+
225
+ Raises:
226
+ TrismikApiError: If API request fails.
227
+ """
228
+ try:
229
+ url = f"{session_url}/item"
230
+ headers = {"Authorization": f"Bearer {token}"}
231
+ response = await self._http_client.get(url, headers=headers)
232
+ response.raise_for_status()
233
+ json = response.json()
234
+ return TrismikResponseMapper.to_item(json)
235
+ except httpx.HTTPStatusError as e:
236
+ raise TrismikApiError(
237
+ TrismikUtils.get_error_message(e.response)) from e
238
+ except httpx.HTTPError as e:
239
+ raise TrismikApiError(str(e)) from e
240
+
241
+ async def respond_to_current_item(
242
+ self,
243
+ session_url: str,
244
+ value: Any,
245
+ token: str
246
+ ) -> TrismikItem | None:
247
+ """
248
+ Responds to the current test item.
249
+
250
+ Args:
251
+ session_url (str): URL of the session.
252
+ value (Any): Response value.
253
+ token (str): Authentication token.
254
+
255
+ Returns:
256
+ TrismikItem | None: Next test item or None if session is finished.
257
+
258
+ Raises:
259
+ TrismikApiError: If API request fails.
260
+ """
261
+ try:
262
+ url = f"{session_url}/item"
263
+ body = {"value": value}
264
+ headers = {"Authorization": f"Bearer {token}"}
265
+ response = await self._http_client.post(
266
+ url, headers=headers, json=body
267
+ )
268
+ response.raise_for_status()
269
+ if response.status_code == 204:
270
+ return None
271
+ else:
272
+ json = response.json()
273
+ return TrismikResponseMapper.to_item(json)
274
+ except httpx.HTTPStatusError as e:
275
+ raise TrismikApiError(
276
+ TrismikUtils.get_error_message(e.response)) from e
277
+ except httpx.HTTPError as e:
278
+ raise TrismikApiError(str(e)) from e
279
+
280
+ async def results(self,
281
+ session_url: str,
282
+ token: str
283
+ ) -> List[TrismikResult]:
284
+ """
285
+ Retrieves the results of a session.
286
+
287
+ Args:
288
+ session_url (str): URL of the session.
289
+ token (str): Authentication token.
290
+
291
+ Returns:
292
+ List[TrismikResult]: Results of the session.
293
+
294
+ Raises:
295
+ TrismikApiError: If API request fails.
296
+ """
297
+ try:
298
+ url = f"{session_url}/results"
299
+ headers = {"Authorization": f"Bearer {token}"}
300
+ response = await self._http_client.get(url, headers=headers)
301
+ response.raise_for_status()
302
+ json = response.json()
303
+ return TrismikResponseMapper.to_results(json)
304
+ except httpx.HTTPStatusError as e:
305
+ raise TrismikApiError(
306
+ TrismikUtils.get_error_message(e.response)) from e
307
+ except httpx.HTTPError as e:
308
+ raise TrismikApiError(str(e)) from e
309
+
310
+ async def responses(self,
311
+ session_url: str,
312
+ token: str
313
+ ) -> List[TrismikResponse]:
314
+ """
315
+ Retrieves responses to session items.
316
+
317
+ Args:
318
+ session_url (str): URL of the session.
319
+ token (str): Authentication token.
320
+
321
+ Returns:
322
+ List[TrismikResponse]: Responses of the session.
323
+
324
+ Raises:
325
+ TrismikApiError: If API request fails.
326
+ """
327
+ try:
328
+ url = f"{session_url}/responses"
329
+ headers = {"Authorization": f"Bearer {token}"}
330
+ response = await self._http_client.get(url, headers=headers)
331
+ response.raise_for_status()
332
+ json = response.json()
333
+ return TrismikResponseMapper.to_responses(json)
334
+ except httpx.HTTPStatusError as e:
335
+ raise TrismikApiError(
336
+ TrismikUtils.get_error_message(e.response)) from e
337
+ except httpx.HTTPError as e:
338
+ raise TrismikApiError(str(e)) from e