hubble-sdk-python 0.3.0__py3-none-any.whl → 0.3.2__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.
@@ -16,6 +16,7 @@ from ...types import UNSET, Response, Unset
16
16
  def _get_kwargs(
17
17
  *,
18
18
  consent: UUID | Unset = UNSET,
19
+ connection: UUID | Unset = UNSET,
19
20
  field_count: int | Unset = UNSET,
20
21
  field_offset: int | Unset = UNSET,
21
22
  prefer: ExportPatientFhirPrefer | Unset = UNSET,
@@ -31,6 +32,11 @@ def _get_kwargs(
31
32
  json_consent = str(consent)
32
33
  params["consent"] = json_consent
33
34
 
35
+ json_connection: str | Unset = UNSET
36
+ if not isinstance(connection, Unset):
37
+ json_connection = str(connection)
38
+ params["connection"] = json_connection
39
+
34
40
  params["_count"] = field_count
35
41
 
36
42
  params["_offset"] = field_offset
@@ -111,6 +117,7 @@ def sync_detailed(
111
117
  *,
112
118
  client: AuthenticatedClient,
113
119
  consent: UUID | Unset = UNSET,
120
+ connection: UUID | Unset = UNSET,
114
121
  field_count: int | Unset = UNSET,
115
122
  field_offset: int | Unset = UNSET,
116
123
  prefer: ExportPatientFhirPrefer | Unset = UNSET,
@@ -127,6 +134,7 @@ def sync_detailed(
127
134
 
128
135
  Args:
129
136
  consent (UUID | Unset):
137
+ connection (UUID | Unset):
130
138
  field_count (int | Unset):
131
139
  field_offset (int | Unset):
132
140
  prefer (ExportPatientFhirPrefer | Unset):
@@ -141,6 +149,7 @@ def sync_detailed(
141
149
 
142
150
  kwargs = _get_kwargs(
143
151
  consent=consent,
152
+ connection=connection,
144
153
  field_count=field_count,
145
154
  field_offset=field_offset,
146
155
  prefer=prefer,
@@ -157,6 +166,7 @@ def sync(
157
166
  *,
158
167
  client: AuthenticatedClient,
159
168
  consent: UUID | Unset = UNSET,
169
+ connection: UUID | Unset = UNSET,
160
170
  field_count: int | Unset = UNSET,
161
171
  field_offset: int | Unset = UNSET,
162
172
  prefer: ExportPatientFhirPrefer | Unset = UNSET,
@@ -173,6 +183,7 @@ def sync(
173
183
 
174
184
  Args:
175
185
  consent (UUID | Unset):
186
+ connection (UUID | Unset):
176
187
  field_count (int | Unset):
177
188
  field_offset (int | Unset):
178
189
  prefer (ExportPatientFhirPrefer | Unset):
@@ -188,6 +199,7 @@ def sync(
188
199
  return sync_detailed(
189
200
  client=client,
190
201
  consent=consent,
202
+ connection=connection,
191
203
  field_count=field_count,
192
204
  field_offset=field_offset,
193
205
  prefer=prefer,
@@ -198,6 +210,7 @@ async def asyncio_detailed(
198
210
  *,
199
211
  client: AuthenticatedClient,
200
212
  consent: UUID | Unset = UNSET,
213
+ connection: UUID | Unset = UNSET,
201
214
  field_count: int | Unset = UNSET,
202
215
  field_offset: int | Unset = UNSET,
203
216
  prefer: ExportPatientFhirPrefer | Unset = UNSET,
@@ -214,6 +227,7 @@ async def asyncio_detailed(
214
227
 
215
228
  Args:
216
229
  consent (UUID | Unset):
230
+ connection (UUID | Unset):
217
231
  field_count (int | Unset):
218
232
  field_offset (int | Unset):
219
233
  prefer (ExportPatientFhirPrefer | Unset):
@@ -228,6 +242,7 @@ async def asyncio_detailed(
228
242
 
229
243
  kwargs = _get_kwargs(
230
244
  consent=consent,
245
+ connection=connection,
231
246
  field_count=field_count,
232
247
  field_offset=field_offset,
233
248
  prefer=prefer,
@@ -242,6 +257,7 @@ async def asyncio(
242
257
  *,
243
258
  client: AuthenticatedClient,
244
259
  consent: UUID | Unset = UNSET,
260
+ connection: UUID | Unset = UNSET,
245
261
  field_count: int | Unset = UNSET,
246
262
  field_offset: int | Unset = UNSET,
247
263
  prefer: ExportPatientFhirPrefer | Unset = UNSET,
@@ -258,6 +274,7 @@ async def asyncio(
258
274
 
259
275
  Args:
260
276
  consent (UUID | Unset):
277
+ connection (UUID | Unset):
261
278
  field_count (int | Unset):
262
279
  field_offset (int | Unset):
263
280
  prefer (ExportPatientFhirPrefer | Unset):
@@ -274,6 +291,7 @@ async def asyncio(
274
291
  await asyncio_detailed(
275
292
  client=client,
276
293
  consent=consent,
294
+ connection=connection,
277
295
  field_count=field_count,
278
296
  field_offset=field_offset,
279
297
  prefer=prefer,
@@ -6,6 +6,8 @@ import httpx
6
6
 
7
7
  from ... import errors
8
8
  from ...client import AuthenticatedClient, Client
9
+ from ...models.export_patient_pdf_combined import ExportPatientPdfCombined
10
+ from ...models.export_patient_pdf_hubble_version import ExportPatientPdfHubbleVersion
9
11
  from ...models.export_patient_pdf_prefer import ExportPatientPdfPrefer
10
12
  from ...models.export_patient_pdf_response_202 import ExportPatientPdfResponse202
11
13
  from ...models.operation_outcome import OperationOutcome
@@ -16,9 +18,14 @@ def _get_kwargs(
16
18
  *,
17
19
  consent: UUID | Unset = UNSET,
18
20
  connection: str | Unset = UNSET,
21
+ combined: ExportPatientPdfCombined | Unset = UNSET,
22
+ hubble_version: ExportPatientPdfHubbleVersion | Unset = UNSET,
19
23
  prefer: ExportPatientPdfPrefer | Unset = UNSET,
20
24
  ) -> dict[str, Any]:
21
25
  headers: dict[str, Any] = {}
26
+ if not isinstance(hubble_version, Unset):
27
+ headers["Hubble-Version"] = str(hubble_version)
28
+
22
29
  if not isinstance(prefer, Unset):
23
30
  headers["Prefer"] = str(prefer)
24
31
 
@@ -31,6 +38,12 @@ def _get_kwargs(
31
38
 
32
39
  params["connection"] = connection
33
40
 
41
+ json_combined: str | Unset = UNSET
42
+ if not isinstance(combined, Unset):
43
+ json_combined = combined.value
44
+
45
+ params["combined"] = json_combined
46
+
34
47
  params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
35
48
 
36
49
  _kwargs: dict[str, Any] = {
@@ -103,6 +116,8 @@ def sync_detailed(
103
116
  client: AuthenticatedClient,
104
117
  consent: UUID | Unset = UNSET,
105
118
  connection: str | Unset = UNSET,
119
+ combined: ExportPatientPdfCombined | Unset = UNSET,
120
+ hubble_version: ExportPatientPdfHubbleVersion | Unset = UNSET,
106
121
  prefer: ExportPatientPdfPrefer | Unset = UNSET,
107
122
  ) -> Response[ExportPatientPdfResponse202 | OperationOutcome]:
108
123
  """Export records as PDF (one per source)
@@ -115,11 +130,18 @@ def sync_detailed(
115
130
  Prefer: respond-async to prepare the export in a background worker. Poll Content-Location with the
116
131
  same token no sooner than Retry-After until it returns a 303 redirect to a short-lived download URL.
117
132
  An organization can hold 20 exports in flight at once; a repeat request for one already running
118
- reuses it. Without Prefer, the synchronous response is unchanged.
133
+ reuses it. Without Prefer, the synchronous response is unchanged. Send `Hubble-Version: 2026-11-01`
134
+ with Prefer: respond-async for the records archive (preview) instead: always a zip, with or without
135
+ `connection`, holding a folder per source and a `manifest.json` that lists every file. It is only
136
+ built asynchronously. Find files through the manifest rather than by path; new files may appear. Add
137
+ `combined=true` with `connection` for one PDF of that source instead of the zip: its summary
138
+ followed by its documents, in no guaranteed order.
119
139
 
120
140
  Args:
121
141
  consent (UUID | Unset):
122
142
  connection (str | Unset):
143
+ combined (ExportPatientPdfCombined | Unset):
144
+ hubble_version (ExportPatientPdfHubbleVersion | Unset):
123
145
  prefer (ExportPatientPdfPrefer | Unset):
124
146
 
125
147
  Raises:
@@ -133,6 +155,8 @@ def sync_detailed(
133
155
  kwargs = _get_kwargs(
134
156
  consent=consent,
135
157
  connection=connection,
158
+ combined=combined,
159
+ hubble_version=hubble_version,
136
160
  prefer=prefer,
137
161
  )
138
162
 
@@ -148,6 +172,8 @@ def sync(
148
172
  client: AuthenticatedClient,
149
173
  consent: UUID | Unset = UNSET,
150
174
  connection: str | Unset = UNSET,
175
+ combined: ExportPatientPdfCombined | Unset = UNSET,
176
+ hubble_version: ExportPatientPdfHubbleVersion | Unset = UNSET,
151
177
  prefer: ExportPatientPdfPrefer | Unset = UNSET,
152
178
  ) -> ExportPatientPdfResponse202 | OperationOutcome | None:
153
179
  """Export records as PDF (one per source)
@@ -160,11 +186,18 @@ def sync(
160
186
  Prefer: respond-async to prepare the export in a background worker. Poll Content-Location with the
161
187
  same token no sooner than Retry-After until it returns a 303 redirect to a short-lived download URL.
162
188
  An organization can hold 20 exports in flight at once; a repeat request for one already running
163
- reuses it. Without Prefer, the synchronous response is unchanged.
189
+ reuses it. Without Prefer, the synchronous response is unchanged. Send `Hubble-Version: 2026-11-01`
190
+ with Prefer: respond-async for the records archive (preview) instead: always a zip, with or without
191
+ `connection`, holding a folder per source and a `manifest.json` that lists every file. It is only
192
+ built asynchronously. Find files through the manifest rather than by path; new files may appear. Add
193
+ `combined=true` with `connection` for one PDF of that source instead of the zip: its summary
194
+ followed by its documents, in no guaranteed order.
164
195
 
165
196
  Args:
166
197
  consent (UUID | Unset):
167
198
  connection (str | Unset):
199
+ combined (ExportPatientPdfCombined | Unset):
200
+ hubble_version (ExportPatientPdfHubbleVersion | Unset):
168
201
  prefer (ExportPatientPdfPrefer | Unset):
169
202
 
170
203
  Raises:
@@ -179,6 +212,8 @@ def sync(
179
212
  client=client,
180
213
  consent=consent,
181
214
  connection=connection,
215
+ combined=combined,
216
+ hubble_version=hubble_version,
182
217
  prefer=prefer,
183
218
  ).parsed
184
219
 
@@ -188,6 +223,8 @@ async def asyncio_detailed(
188
223
  client: AuthenticatedClient,
189
224
  consent: UUID | Unset = UNSET,
190
225
  connection: str | Unset = UNSET,
226
+ combined: ExportPatientPdfCombined | Unset = UNSET,
227
+ hubble_version: ExportPatientPdfHubbleVersion | Unset = UNSET,
191
228
  prefer: ExportPatientPdfPrefer | Unset = UNSET,
192
229
  ) -> Response[ExportPatientPdfResponse202 | OperationOutcome]:
193
230
  """Export records as PDF (one per source)
@@ -200,11 +237,18 @@ async def asyncio_detailed(
200
237
  Prefer: respond-async to prepare the export in a background worker. Poll Content-Location with the
201
238
  same token no sooner than Retry-After until it returns a 303 redirect to a short-lived download URL.
202
239
  An organization can hold 20 exports in flight at once; a repeat request for one already running
203
- reuses it. Without Prefer, the synchronous response is unchanged.
240
+ reuses it. Without Prefer, the synchronous response is unchanged. Send `Hubble-Version: 2026-11-01`
241
+ with Prefer: respond-async for the records archive (preview) instead: always a zip, with or without
242
+ `connection`, holding a folder per source and a `manifest.json` that lists every file. It is only
243
+ built asynchronously. Find files through the manifest rather than by path; new files may appear. Add
244
+ `combined=true` with `connection` for one PDF of that source instead of the zip: its summary
245
+ followed by its documents, in no guaranteed order.
204
246
 
205
247
  Args:
206
248
  consent (UUID | Unset):
207
249
  connection (str | Unset):
250
+ combined (ExportPatientPdfCombined | Unset):
251
+ hubble_version (ExportPatientPdfHubbleVersion | Unset):
208
252
  prefer (ExportPatientPdfPrefer | Unset):
209
253
 
210
254
  Raises:
@@ -218,6 +262,8 @@ async def asyncio_detailed(
218
262
  kwargs = _get_kwargs(
219
263
  consent=consent,
220
264
  connection=connection,
265
+ combined=combined,
266
+ hubble_version=hubble_version,
221
267
  prefer=prefer,
222
268
  )
223
269
 
@@ -231,6 +277,8 @@ async def asyncio(
231
277
  client: AuthenticatedClient,
232
278
  consent: UUID | Unset = UNSET,
233
279
  connection: str | Unset = UNSET,
280
+ combined: ExportPatientPdfCombined | Unset = UNSET,
281
+ hubble_version: ExportPatientPdfHubbleVersion | Unset = UNSET,
234
282
  prefer: ExportPatientPdfPrefer | Unset = UNSET,
235
283
  ) -> ExportPatientPdfResponse202 | OperationOutcome | None:
236
284
  """Export records as PDF (one per source)
@@ -243,11 +291,18 @@ async def asyncio(
243
291
  Prefer: respond-async to prepare the export in a background worker. Poll Content-Location with the
244
292
  same token no sooner than Retry-After until it returns a 303 redirect to a short-lived download URL.
245
293
  An organization can hold 20 exports in flight at once; a repeat request for one already running
246
- reuses it. Without Prefer, the synchronous response is unchanged.
294
+ reuses it. Without Prefer, the synchronous response is unchanged. Send `Hubble-Version: 2026-11-01`
295
+ with Prefer: respond-async for the records archive (preview) instead: always a zip, with or without
296
+ `connection`, holding a folder per source and a `manifest.json` that lists every file. It is only
297
+ built asynchronously. Find files through the manifest rather than by path; new files may appear. Add
298
+ `combined=true` with `connection` for one PDF of that source instead of the zip: its summary
299
+ followed by its documents, in no guaranteed order.
247
300
 
248
301
  Args:
249
302
  consent (UUID | Unset):
250
303
  connection (str | Unset):
304
+ combined (ExportPatientPdfCombined | Unset):
305
+ hubble_version (ExportPatientPdfHubbleVersion | Unset):
251
306
  prefer (ExportPatientPdfPrefer | Unset):
252
307
 
253
308
  Raises:
@@ -263,6 +318,8 @@ async def asyncio(
263
318
  client=client,
264
319
  consent=consent,
265
320
  connection=connection,
321
+ combined=combined,
322
+ hubble_version=hubble_version,
266
323
  prefer=prefer,
267
324
  )
268
325
  ).parsed
@@ -129,8 +129,10 @@ def sync_detailed(
129
129
  when the export started already includes it. Pending work returns 202. Ready work returns 303 to a
130
130
  download URL valid for at most 60 seconds. Do not forward the Hubble Bearer token to the storage
131
131
  host. Accept: application/json returns a ready status and same-origin downloadUrl instead; navigate
132
- to that URL for the redirect. Exports expire two hours after creation. Revoked or expired source
133
- authorization invalidates the artifact.
132
+ to that URL for the redirect. Preparation must finish within two hours of creation. On completion,
133
+ expiresAt becomes the download deadline, 30 days later. Revoked or expired source authorization
134
+ invalidates the artifact. An export started with `Hubble-Version` carries that version in a `Hubble-
135
+ Version` response header.
134
136
 
135
137
  Args:
136
138
  id (UUID):
@@ -175,8 +177,10 @@ def sync(
175
177
  when the export started already includes it. Pending work returns 202. Ready work returns 303 to a
176
178
  download URL valid for at most 60 seconds. Do not forward the Hubble Bearer token to the storage
177
179
  host. Accept: application/json returns a ready status and same-origin downloadUrl instead; navigate
178
- to that URL for the redirect. Exports expire two hours after creation. Revoked or expired source
179
- authorization invalidates the artifact.
180
+ to that URL for the redirect. Preparation must finish within two hours of creation. On completion,
181
+ expiresAt becomes the download deadline, 30 days later. Revoked or expired source authorization
182
+ invalidates the artifact. An export started with `Hubble-Version` carries that version in a `Hubble-
183
+ Version` response header.
180
184
 
181
185
  Args:
182
186
  id (UUID):
@@ -216,8 +220,10 @@ async def asyncio_detailed(
216
220
  when the export started already includes it. Pending work returns 202. Ready work returns 303 to a
217
221
  download URL valid for at most 60 seconds. Do not forward the Hubble Bearer token to the storage
218
222
  host. Accept: application/json returns a ready status and same-origin downloadUrl instead; navigate
219
- to that URL for the redirect. Exports expire two hours after creation. Revoked or expired source
220
- authorization invalidates the artifact.
223
+ to that URL for the redirect. Preparation must finish within two hours of creation. On completion,
224
+ expiresAt becomes the download deadline, 30 days later. Revoked or expired source authorization
225
+ invalidates the artifact. An export started with `Hubble-Version` carries that version in a `Hubble-
226
+ Version` response header.
221
227
 
222
228
  Args:
223
229
  id (UUID):
@@ -260,8 +266,10 @@ async def asyncio(
260
266
  when the export started already includes it. Pending work returns 202. Ready work returns 303 to a
261
267
  download URL valid for at most 60 seconds. Do not forward the Hubble Bearer token to the storage
262
268
  host. Accept: application/json returns a ready status and same-origin downloadUrl instead; navigate
263
- to that URL for the redirect. Exports expire two hours after creation. Revoked or expired source
264
- authorization invalidates the artifact.
269
+ to that URL for the redirect. Preparation must finish within two hours of creation. On completion,
270
+ expiresAt becomes the download deadline, 30 days later. Revoked or expired source authorization
271
+ invalidates the artifact. An export started with `Hubble-Version` carries that version in a `Hubble-
272
+ Version` response header.
265
273
 
266
274
  Args:
267
275
  id (UUID):
@@ -16,6 +16,7 @@ def _get_kwargs(
16
16
  path: str,
17
17
  *,
18
18
  consent: UUID | Unset = UNSET,
19
+ connection: UUID | Unset = UNSET,
19
20
  ) -> dict[str, Any]:
20
21
 
21
22
  params: dict[str, Any] = {}
@@ -25,6 +26,11 @@ def _get_kwargs(
25
26
  json_consent = str(consent)
26
27
  params["consent"] = json_consent
27
28
 
29
+ json_connection: str | Unset = UNSET
30
+ if not isinstance(connection, Unset):
31
+ json_connection = str(connection)
32
+ params["connection"] = json_connection
33
+
28
34
  params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
29
35
 
30
36
  _kwargs: dict[str, Any] = {
@@ -88,16 +94,19 @@ def sync_detailed(
88
94
  *,
89
95
  client: AuthenticatedClient,
90
96
  consent: UUID | Unset = UNSET,
97
+ connection: UUID | Unset = UNSET,
91
98
  ) -> Response[FhirResource | OperationOutcome]:
92
99
  """Read FHIR data
93
100
 
94
101
  The FHIR R4 data plane. Authenticated by a consent token, which determines the consent, or an
95
102
  application token with `consent=<id>` naming it. Returns arbitrary FHIR resources; type responses
96
- against @types/fhir (TS) or fhir.resources (Python) rather than this spec.
103
+ against @types/fhir (TS) or fhir.resources (Python) rather than this spec. Reads merge every source
104
+ on the consent unless `connection` names one.
97
105
 
98
106
  Args:
99
107
  path (str):
100
108
  consent (UUID | Unset):
109
+ connection (UUID | Unset):
101
110
 
102
111
  Raises:
103
112
  errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
@@ -110,6 +119,7 @@ def sync_detailed(
110
119
  kwargs = _get_kwargs(
111
120
  path=path,
112
121
  consent=consent,
122
+ connection=connection,
113
123
  )
114
124
 
115
125
  response = client.get_httpx_client().request(
@@ -124,16 +134,19 @@ def sync(
124
134
  *,
125
135
  client: AuthenticatedClient,
126
136
  consent: UUID | Unset = UNSET,
137
+ connection: UUID | Unset = UNSET,
127
138
  ) -> FhirResource | OperationOutcome | None:
128
139
  """Read FHIR data
129
140
 
130
141
  The FHIR R4 data plane. Authenticated by a consent token, which determines the consent, or an
131
142
  application token with `consent=<id>` naming it. Returns arbitrary FHIR resources; type responses
132
- against @types/fhir (TS) or fhir.resources (Python) rather than this spec.
143
+ against @types/fhir (TS) or fhir.resources (Python) rather than this spec. Reads merge every source
144
+ on the consent unless `connection` names one.
133
145
 
134
146
  Args:
135
147
  path (str):
136
148
  consent (UUID | Unset):
149
+ connection (UUID | Unset):
137
150
 
138
151
  Raises:
139
152
  errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
@@ -147,6 +160,7 @@ def sync(
147
160
  path=path,
148
161
  client=client,
149
162
  consent=consent,
163
+ connection=connection,
150
164
  ).parsed
151
165
 
152
166
 
@@ -155,16 +169,19 @@ async def asyncio_detailed(
155
169
  *,
156
170
  client: AuthenticatedClient,
157
171
  consent: UUID | Unset = UNSET,
172
+ connection: UUID | Unset = UNSET,
158
173
  ) -> Response[FhirResource | OperationOutcome]:
159
174
  """Read FHIR data
160
175
 
161
176
  The FHIR R4 data plane. Authenticated by a consent token, which determines the consent, or an
162
177
  application token with `consent=<id>` naming it. Returns arbitrary FHIR resources; type responses
163
- against @types/fhir (TS) or fhir.resources (Python) rather than this spec.
178
+ against @types/fhir (TS) or fhir.resources (Python) rather than this spec. Reads merge every source
179
+ on the consent unless `connection` names one.
164
180
 
165
181
  Args:
166
182
  path (str):
167
183
  consent (UUID | Unset):
184
+ connection (UUID | Unset):
168
185
 
169
186
  Raises:
170
187
  errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
@@ -177,6 +194,7 @@ async def asyncio_detailed(
177
194
  kwargs = _get_kwargs(
178
195
  path=path,
179
196
  consent=consent,
197
+ connection=connection,
180
198
  )
181
199
 
182
200
  response = await client.get_async_httpx_client().request(**kwargs)
@@ -189,16 +207,19 @@ async def asyncio(
189
207
  *,
190
208
  client: AuthenticatedClient,
191
209
  consent: UUID | Unset = UNSET,
210
+ connection: UUID | Unset = UNSET,
192
211
  ) -> FhirResource | OperationOutcome | None:
193
212
  """Read FHIR data
194
213
 
195
214
  The FHIR R4 data plane. Authenticated by a consent token, which determines the consent, or an
196
215
  application token with `consent=<id>` naming it. Returns arbitrary FHIR resources; type responses
197
- against @types/fhir (TS) or fhir.resources (Python) rather than this spec.
216
+ against @types/fhir (TS) or fhir.resources (Python) rather than this spec. Reads merge every source
217
+ on the consent unless `connection` names one.
198
218
 
199
219
  Args:
200
220
  path (str):
201
221
  consent (UUID | Unset):
222
+ connection (UUID | Unset):
202
223
 
203
224
  Raises:
204
225
  errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
@@ -213,5 +234,6 @@ async def asyncio(
213
234
  path=path,
214
235
  client=client,
215
236
  consent=consent,
237
+ connection=connection,
216
238
  )
217
239
  ).parsed
@@ -22,6 +22,8 @@ from .device_authorization_response import DeviceAuthorizationResponse
22
22
  from .export_patient_fhir_prefer import ExportPatientFhirPrefer
23
23
  from .export_patient_fhir_response_202 import ExportPatientFhirResponse202
24
24
  from .export_patient_fhir_response_202_status import ExportPatientFhirResponse202Status
25
+ from .export_patient_pdf_combined import ExportPatientPdfCombined
26
+ from .export_patient_pdf_hubble_version import ExportPatientPdfHubbleVersion
25
27
  from .export_patient_pdf_prefer import ExportPatientPdfPrefer
26
28
  from .export_patient_pdf_response_202 import ExportPatientPdfResponse202
27
29
  from .export_patient_pdf_response_202_status import ExportPatientPdfResponse202Status
@@ -68,6 +70,8 @@ __all__ = (
68
70
  "ExportPatientFhirPrefer",
69
71
  "ExportPatientFhirResponse202",
70
72
  "ExportPatientFhirResponse202Status",
73
+ "ExportPatientPdfCombined",
74
+ "ExportPatientPdfHubbleVersion",
71
75
  "ExportPatientPdfPrefer",
72
76
  "ExportPatientPdfResponse202",
73
77
  "ExportPatientPdfResponse202Status",
@@ -0,0 +1,27 @@
1
+ from enum import StrEnum
2
+
3
+
4
+ class ExportPatientPdfCombined(StrEnum):
5
+ TRUE = "true"
6
+
7
+ def __str__(self) -> str:
8
+ return str(self.value)
9
+
10
+ # How API responses are parsed. The API may add values to this enum without a
11
+ # new SDK release, so a value this version does not know becomes a member
12
+ # carrying the raw string instead of raising. It compares equal to that string
13
+ # and is absent from list(ExportPatientPdfCombined), which is how to tell it apart.
14
+ # A value that is not a string is a malformed response and still raises.
15
+ # Constructing the enum directly stays strict, so a typo in a value you pass
16
+ # in still raises and membership checks are unchanged.
17
+ @classmethod
18
+ def _from_value(cls, value: object) -> "ExportPatientPdfCombined":
19
+ try:
20
+ return cls(value)
21
+ except ValueError:
22
+ if not isinstance(value, str):
23
+ raise
24
+ member = str.__new__(cls, value)
25
+ member._name_ = value
26
+ member._value_ = value
27
+ return member
@@ -0,0 +1,27 @@
1
+ from enum import StrEnum
2
+
3
+
4
+ class ExportPatientPdfHubbleVersion(StrEnum):
5
+ VALUE_0 = "2026-11-01"
6
+
7
+ def __str__(self) -> str:
8
+ return str(self.value)
9
+
10
+ # How API responses are parsed. The API may add values to this enum without a
11
+ # new SDK release, so a value this version does not know becomes a member
12
+ # carrying the raw string instead of raising. It compares equal to that string
13
+ # and is absent from list(ExportPatientPdfHubbleVersion), which is how to tell it apart.
14
+ # A value that is not a string is a malformed response and still raises.
15
+ # Constructing the enum directly stays strict, so a typo in a value you pass
16
+ # in still raises and membership checks are unchanged.
17
+ @classmethod
18
+ def _from_value(cls, value: object) -> "ExportPatientPdfHubbleVersion":
19
+ try:
20
+ return cls(value)
21
+ except ValueError:
22
+ if not isinstance(value, str):
23
+ raise
24
+ member = str.__new__(cls, value)
25
+ member._name_ = value
26
+ member._value_ = value
27
+ return member
@@ -51,9 +51,7 @@ class OperationOutcome:
51
51
 
52
52
  @classmethod
53
53
  def from_dict(cls, src_dict: Mapping[str, Any]) -> Self:
54
- from ..models.operation_outcome_issue_item import (
55
- OperationOutcomeIssueItem,
56
- )
54
+ from ..models.operation_outcome_issue_item import OperationOutcomeIssueItem
57
55
 
58
56
  d = dict(src_dict)
59
57
  resource_type = cast(Literal["OperationOutcome"], d.pop("resourceType"))
hubble_sdk/_hubble.py CHANGED
@@ -65,6 +65,8 @@ _APP_TOKEN_RENEW_MARGIN = 60.0
65
65
  # goes into a URL, so neither can add path segments or a query string.
66
66
  _RESOURCE_TYPE_RE = re.compile(r"[A-Z][A-Za-z]+")
67
67
  _RESOURCE_ID_RE = re.compile(r"[A-Za-z0-9\-.]{1,64}")
68
+ # How long export_pdf waits by default for a versioned export to be built.
69
+ _EXPORT_TIMEOUT = 600.0
68
70
 
69
71
 
70
72
 
@@ -130,22 +132,81 @@ def _require_fhir_namespace(base_url: str, url: httpx.URL, shown: str) -> None:
130
132
  raise HubbleError(f"Invalid FHIR path: {shown!r}")
131
133
 
132
134
 
133
- def _pdf_export(resp: httpx.Response) -> PdfExport:
135
+ def _pdf_export_url(
136
+ base_url: str, connection: str | None, version: str | None, combined: bool
137
+ ) -> httpx.URL:
138
+ if combined and (not version or not connection):
139
+ raise HubbleError("A combined PDF requires version and connection.")
140
+ url = _fhir_url(base_url, "Patient/$pdf")
141
+ if connection is not None:
142
+ url = url.copy_set_param("connection", connection)
143
+ if combined:
144
+ url = url.copy_set_param("combined", "true")
145
+ return url
146
+
147
+
148
+ def _pdf_export(
149
+ resp: httpx.Response, file: httpx.Response | None = None, version: str | None = None
150
+ ) -> PdfExport:
151
+ # The counts come from Hubble's response; the body from `file` when the export
152
+ # was downloaded separately.
134
153
  def _count(header: str) -> int | None:
135
154
  try:
136
155
  return int(resp.headers[header])
137
156
  except (KeyError, ValueError):
138
157
  return None
139
158
 
159
+ body = file if file is not None else resp
140
160
  return PdfExport(
141
- content=resp.content,
142
- content_type=resp.headers.get("content-type", ""),
161
+ content=body.content,
162
+ content_type=body.headers.get("content-type", ""),
143
163
  sources_total=_count("X-Hubble-Sources-Total"),
144
164
  sources_failed=_count("X-Hubble-Sources-Failed"),
145
165
  resource_count=_count("X-Hubble-Resource-Count"),
166
+ version=version,
146
167
  )
147
168
 
148
169
 
170
+ def _versioned_pdf_export(
171
+ send: Callable[[httpx.URL, dict[str, str]], httpx.Response],
172
+ base_url: str,
173
+ start: httpx.URL,
174
+ version: str,
175
+ timeout: float,
176
+ ) -> PdfExport:
177
+ # A versioned export is only built in the background: start it, poll
178
+ # Content-Location until the 303 to the file, then download the file without
179
+ # the access token, which must never reach the storage host.
180
+ deadline = time.monotonic() + timeout
181
+ resp = send(start, {"Hubble-Version": version, "Prefer": "respond-async"})
182
+ while True:
183
+ if resp.status_code not in (202, 303):
184
+ raise HubbleError(f"PDF export failed: {resp.status_code}")
185
+ # Any other version would be a file in a layout the caller did not ask for.
186
+ served = resp.headers.get("Hubble-Version")
187
+ if served != version:
188
+ raise HubbleError(f"Asked for Hubble-Version {version}, got {served!r}")
189
+ if resp.status_code == 303:
190
+ break
191
+ location = resp.headers.get("Content-Location")
192
+ wait = resp.headers.get("Retry-After")
193
+ if location is None or wait is None or not wait.isdigit():
194
+ raise HubbleError("PDF export response has no Content-Location or Retry-After")
195
+ poll = start.join(location)
196
+ _require_fhir_namespace(base_url, poll, location)
197
+ if time.monotonic() + int(wait) > deadline:
198
+ raise HubbleError("PDF export was not ready before the timeout.")
199
+ time.sleep(int(wait))
200
+ resp = send(poll, {})
201
+ download = resp.headers.get("Location")
202
+ if download is None:
203
+ raise HubbleError("PDF export redirect has no Location")
204
+ file = httpx.get(download)
205
+ if not file.is_success:
206
+ raise HubbleError(f"PDF export download failed: {file.status_code}")
207
+ return _pdf_export(resp, file, version)
208
+
209
+
149
210
  class Hubble:
150
211
  """Client for the Hubble Patient Access API.
151
212
 
@@ -276,34 +337,56 @@ class Hubble:
276
337
  ``{"_count": ..., "_offset": ...}``."""
277
338
  return self.fhir(consent_id, "Patient/$everything", params=params)
278
339
 
279
- def export_pdf(self, consent_id: str, *, connection: str | None = None) -> PdfExport:
340
+ def export_pdf(
341
+ self,
342
+ consent_id: str,
343
+ *,
344
+ connection: str | None = None,
345
+ version: str | None = None,
346
+ combined: bool = False,
347
+ timeout: float = _EXPORT_TIMEOUT,
348
+ ) -> PdfExport:
280
349
  """The patient's records as PDF via ``Patient/$pdf``: a ZIP of per-source
281
- PDFs, or one source's PDF when ``connection`` selects it. See `PdfExport`."""
282
- params = {"connection": connection} if connection is not None else None
283
- return _pdf_export(
284
- self._consent_get(consent_id, _fhir_url(self.base_url, "Patient/$pdf"), params)
350
+ PDFs, or one source's PDF when ``connection`` selects it. See `PdfExport`.
351
+
352
+ Pass ``version`` (a ``Hubble-Version``, such as ``"2026-11-01"``) for that
353
+ version's export instead. It is built in the background, so this waits up
354
+ to ``timeout`` seconds for it, then downloads it. Set ``combined=True``
355
+ with ``version`` and ``connection`` for one PDF containing that source's
356
+ summary and documents instead of the archive. Defaults to false."""
357
+ url = _pdf_export_url(self.base_url, connection, version, combined)
358
+ if version is None:
359
+ return _pdf_export(self._consent_get(consent_id, url, None))
360
+ return _versioned_pdf_export(
361
+ lambda u, headers: self._consent_request(consent_id, u, headers),
362
+ self.base_url,
363
+ url,
364
+ version,
365
+ timeout,
285
366
  )
286
367
 
287
368
  def _consent_get(
288
- self,
289
- consent_id: str,
290
- url: httpx.URL,
291
- params: Mapping[str, Any] | None,
292
- retry: bool = True,
369
+ self, consent_id: str, url: httpx.URL, params: Mapping[str, Any] | None
370
+ ) -> httpx.Response:
371
+ resp = self._consent_request(consent_id, url.copy_merge_params(dict(params or {})), {})
372
+ if not resp.is_success:
373
+ raise HubbleError(f"FHIR request failed: {resp.status_code}")
374
+ return resp
375
+
376
+ def _consent_request(
377
+ self, consent_id: str, url: httpx.URL, headers: dict[str, str], retry: bool = True
293
378
  ) -> httpx.Response:
294
379
  # The control client's connection pool, with the Bearer token replacing its
295
380
  # Basic credentials for this one request. `consent` is set last, so a
296
381
  # caller's params or a followed link cannot point it at another consent.
297
382
  token = self._application_token()
298
383
  resp = self._control.get_httpx_client().get(
299
- url.copy_merge_params(dict(params or {})).copy_set_param("consent", consent_id),
300
- headers={"Authorization": f"Bearer {token}"},
384
+ url.copy_set_param("consent", consent_id),
385
+ headers={**headers, "Authorization": f"Bearer {token}"},
301
386
  )
302
387
  if resp.status_code == 401 and retry:
303
388
  self._application_token(stale=token)
304
- return self._consent_get(consent_id, url, params, retry=False)
305
- if not resp.is_success:
306
- raise HubbleError(f"FHIR request failed: {resp.status_code}")
389
+ return self._consent_request(consent_id, url, headers, retry=False)
307
390
  return resp
308
391
 
309
392
  def _usable_app_token(self, stale: str | None) -> str | None:
@@ -602,7 +685,14 @@ class PatientSession:
602
685
  """Read the patient summary via ``Patient/$summary`` (a FHIR Bundle)."""
603
686
  return self.fhir("Patient/$summary")
604
687
 
605
- def export_pdf(self, *, connection: str | None = None) -> PdfExport:
688
+ def export_pdf(
689
+ self,
690
+ *,
691
+ connection: str | None = None,
692
+ version: str | None = None,
693
+ combined: bool = False,
694
+ timeout: float = _EXPORT_TIMEOUT,
695
+ ) -> PdfExport:
606
696
  """Export the patient's records as PDF via ``Patient/$pdf``.
607
697
 
608
698
  Returns a `PdfExport`: the raw body (a ZIP of per-source PDFs plus a
@@ -610,27 +700,42 @@ class PatientSession:
610
700
  single PDF when ``connection`` selects one source) together with the
611
701
  per-source counts from the response headers, so you can tell how many
612
702
  sources failed without opening the archive. Refreshes and retries once
613
- on 401."""
614
- params = {"connection": connection} if connection is not None else None
615
- return _pdf_export(
616
- self._fhir_request("Patient/$pdf", params, retry=self.refresh_token is not None)
703
+ on 401.
704
+
705
+ Pass ``version`` (a ``Hubble-Version``, such as ``"2026-11-01"``) for that
706
+ version's export instead. It is built in the background, so this waits up
707
+ to ``timeout`` seconds for it, then downloads it. Set ``combined=True``
708
+ with ``version`` and ``connection`` for one PDF containing that source's
709
+ summary and documents instead of the archive. Defaults to false."""
710
+ retry = self.refresh_token is not None
711
+ url = _pdf_export_url(self._hubble.base_url, connection, version, combined)
712
+ if version is None:
713
+ return _pdf_export(self._fhir_request(url, retry))
714
+ return _versioned_pdf_export(
715
+ lambda u, headers: self._send(u, headers, retry),
716
+ self._hubble.base_url,
717
+ url,
718
+ version,
719
+ timeout,
617
720
  )
618
721
 
619
722
  def _fhir_get(self, path: str, params: dict[str, Any] | None, retry: bool) -> dict[str, Any]:
620
- return self._fhir_request(path, params, retry).json()
723
+ url = _fhir_url(self._hubble.base_url, path).copy_merge_params(params or {})
724
+ return self._fhir_request(url, retry).json()
621
725
 
622
- def _fhir_request(
623
- self, path: str, params: dict[str, Any] | None, retry: bool
624
- ) -> httpx.Response:
625
- url = _fhir_url(self._hubble.base_url, path)
626
- resp = self._data.get_httpx_client().get(url, params=params)
627
- if resp.status_code == 401 and retry:
628
- self.refresh()
629
- return self._fhir_request(path, params, retry=False)
726
+ def _fhir_request(self, url: httpx.URL, retry: bool) -> httpx.Response:
727
+ resp = self._send(url, {}, retry)
630
728
  if not resp.is_success:
631
729
  raise HubbleError(f"FHIR request failed: {resp.status_code}")
632
730
  return resp
633
731
 
732
+ def _send(self, url: httpx.URL, headers: dict[str, str], retry: bool) -> httpx.Response:
733
+ resp = self._data.get_httpx_client().get(url, headers=headers)
734
+ if resp.status_code == 401 and retry:
735
+ self.refresh()
736
+ return self._send(url, headers, retry=False)
737
+ return resp
738
+
634
739
  def refresh(self) -> None:
635
740
  """Exchange the refresh token for a fresh access token (rotating)."""
636
741
  if not self.refresh_token:
@@ -688,15 +793,18 @@ class PdfExport:
688
793
 
689
794
  ``content`` is the raw body — a ZIP of per-source PDFs (with a
690
795
  ``manifest.json`` naming each file and marking it complete/partial/failed),
691
- or a single PDF when ``connection`` was set. The counts come from the
692
- response headers; a non-zero ``sources_failed`` means some records are
693
- missing."""
796
+ or a single PDF when ``connection`` was set. With a ``version``, it is that
797
+ version's archive, or one PDF if ``combined=True`` was requested. The counts
798
+ come from the response headers; a non-zero ``sources_failed`` means some records are
799
+ missing. ``version`` is the ``Hubble-Version`` served, or ``None`` when none
800
+ was asked for."""
694
801
 
695
802
  content: bytes
696
803
  content_type: str
697
804
  sources_total: int | None = None
698
805
  sources_failed: int | None = None
699
806
  resource_count: int | None = None
807
+ version: str | None = None
700
808
 
701
809
 
702
810
  # Invoked whenever a session rotates its tokens (on refresh), so callers can
hubble_sdk/_webhooks.py CHANGED
@@ -60,8 +60,8 @@ class WebhookEvent:
60
60
  ``type`` is one of:
61
61
 
62
62
  - ``consent.created``: a consent was created, from the API or the portal.
63
- - ``consent.completed``: the patient finished the link flow, so the device
64
- code can be redeemed.
63
+ - ``consent.completed``: the patient finished the link flow and is done
64
+ adding sources. Sources still pending keep settling afterwards.
65
65
  - ``consent.source.created``: a source was added; ``source.status`` is the
66
66
  status it starts in (``available`` if the patient connected it directly,
67
67
  ``pending`` if it is retrieved on the patient's behalf).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: hubble-sdk-python
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: Python client for the Hubble Patient Access API.
5
5
  Project-URL: Homepage, https://github.com/hubble-dot-ai/hubble-sdks
6
6
  Project-URL: Repository, https://github.com/hubble-dot-ai/hubble-sdks
@@ -81,6 +81,27 @@ export = hub.export_pdf(consent_id, connection=connection_id) # one sour
81
81
 
82
82
  Reuse one `Hubble` client so its token is reused too.
83
83
 
84
+ ### Combined PDF exports
85
+
86
+ Pass `version`, `connection`, and `combined=True` to download one PDF containing
87
+ the source's summary and documents. The helper requests background generation,
88
+ waits for completion, and downloads the file.
89
+
90
+ ```python
91
+ export = hub.export_pdf(
92
+ consent_id,
93
+ version="2026-11-01",
94
+ connection=connection_id,
95
+ combined=True,
96
+ )
97
+ # export.content contains the PDF bytes; export.content_type is "application/pdf".
98
+ ```
99
+
100
+ `session.export_pdf` accepts the same options without the consent ID. With a
101
+ version and `combined` omitted or false, the result is a records archive (ZIP).
102
+ Calls without a version keep their existing behavior. `timeout` controls the
103
+ wait for background generation in seconds and defaults to ten minutes.
104
+
84
105
  ### The device flow
85
106
 
86
107
  Existing integrations can keep using the device flow, which waits for the
@@ -1,7 +1,7 @@
1
1
  hubble_sdk/__init__.py,sha256=ZWHqgD53YvB-IHk4GT26Z9J6IZGd-OdmjraHePXDcj4,1789
2
- hubble_sdk/_hubble.py,sha256=I3zZmWr1GK4-64082e8e551Am09Jsnwl30NAa-FAEJs,31525
2
+ hubble_sdk/_hubble.py,sha256=PYtitUsIX0kYIRthJZMlUgT8w792a9TsuinfArCm8fU,36199
3
3
  hubble_sdk/_params.py,sha256=CeR3ksQk2QOoRAFmy8Pu1kGICcrBQ_wnOLpo9Yfiwlo,3046
4
- hubble_sdk/_webhooks.py,sha256=K3Zw3unBdTdiWSqZojBGniYpuTGxxMPRNNrCsBiYHUA,8111
4
+ hubble_sdk/_webhooks.py,sha256=5luPbiJwfozo7q1t95oyWGnphZhtlW27RpuHviuGMJI,8150
5
5
  hubble_sdk/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  hubble_sdk/_generated/__init__.py,sha256=vHzWGo0njcFBcxGMOUuCWyhYdJi_xldILX7pdrPzdYA,168
7
7
  hubble_sdk/_generated/client.py,sha256=1T9SkCV9kmuiwOQqpXNCw9M1pQ94LV5q8FZGwuN0ftM,12438
@@ -13,15 +13,15 @@ hubble_sdk/_generated/api/default/attach_client_authorization.py,sha256=S9ZCl4gt
13
13
  hubble_sdk/_generated/api/default/create_consent.py,sha256=layrHeSWXTD-gde84MjOzMXb2IHw7_IRoC6qRyZhd4Q,5606
14
14
  hubble_sdk/_generated/api/default/create_consent_link.py,sha256=8h0t6ie6FxsVOVY0YohpXVzfsAUZx6W4R-JI8yMED7U,6885
15
15
  hubble_sdk/_generated/api/default/exchange_token.py,sha256=86ysMEnY2jOUItEHEv06zeszFe4k2vxjn4h0nzvR8zk,5268
16
- hubble_sdk/_generated/api/default/export_patient_fhir.py,sha256=G4DGeZDOajOkOHxyofNZOm5J9bYjrXOolo60mluo-es,10227
17
- hubble_sdk/_generated/api/default/export_patient_pdf.py,sha256=3e0L8V9gfsEpbIcxUszY5HydSeaTqkKNVgLcWHqEMtM,10073
16
+ hubble_sdk/_generated/api/default/export_patient_fhir.py,sha256=aSgtoq-k_fIKRxQEDQK-o8qpL9lhO_NPxbi6Bm1HADM,10854
17
+ hubble_sdk/_generated/api/default/export_patient_pdf.py,sha256=5Q_ILSophlAP7tsHrgdw0xFEcqOSufZiE08K3-XZmBA,13839
18
18
  hubble_sdk/_generated/api/default/get_application_token.py,sha256=Dz0moNxvOQvfyj6oSOg1vMEwnrGtiyid4mD6bMUBPuU,6673
19
19
  hubble_sdk/_generated/api/default/get_consent.py,sha256=UkH6LMTsx2Mmqg9xgkIymw08QuJvcu1DMzuevi6z4pM,3808
20
- hubble_sdk/_generated/api/default/get_patient_pdf_export.py,sha256=J4PqX6qU0nZg9ZBx_bh65s03cSA0cDX2VgUFRuI7Pvs,9927
20
+ hubble_sdk/_generated/api/default/get_patient_pdf_export.py,sha256=Q7i6lxRAHmshSUXPVLrOD0GqxWTKPSa-AHadTWM05dE,10699
21
21
  hubble_sdk/_generated/api/default/list_consents.py,sha256=JAY3CkEC496UCC2dp7q9fvD74p9uTkhCsc7M3iC4fyo,8320
22
- hubble_sdk/_generated/api/default/read_fhir.py,sha256=S0M2uhjTudGJ4TRYkS1vuqFUGL81choQG4S590BsV1M,6160
22
+ hubble_sdk/_generated/api/default/read_fhir.py,sha256=XPTJ95Y6V3XejWSsQQOh9FEQqSbmT3UnLP0rLQLLmDw,7087
23
23
  hubble_sdk/_generated/api/default/revoke_consent.py,sha256=ocFu3svKMa-E2EKIPTE-JYZ7D0-ye9mR_XUNj58mwWE,3966
24
- hubble_sdk/_generated/models/__init__.py,sha256=G9hWenEVD_UWTEFtYkikguoLwTLfyLNhA0uNnY2fhQ4,3692
24
+ hubble_sdk/_generated/models/__init__.py,sha256=3wn0a9OkYtkW6eEW2Skf3i8yl00ewK_tvirFN-XAWDk,3904
25
25
  hubble_sdk/_generated/models/api_error.py,sha256=RrgLT6j31RWPbyMsgkFcu5DWaWi1aJooVL7C24gbGhw,780
26
26
  hubble_sdk/_generated/models/application_token_error.py,sha256=YOUDffSta7s9yJ_-PiAisATiat8OmO5E3gWj76PkBUQ,1363
27
27
  hubble_sdk/_generated/models/application_token_error_error.py,sha256=aqgU4eP30jnnVycuVeaexFmXnwLqm4IPkU0kDDZ1rf8,1250
@@ -44,6 +44,8 @@ hubble_sdk/_generated/models/device_authorization_response.py,sha256=LWsLmhthCw_
44
44
  hubble_sdk/_generated/models/export_patient_fhir_prefer.py,sha256=cT0Bc-seiOxCYgnV47VV7iLOk5RU3rCkNzhXpyr_8V4,1075
45
45
  hubble_sdk/_generated/models/export_patient_fhir_response_202.py,sha256=2yfuuHHr6J0Ml9JnfLDEpxKkJAcAVP_f3GbTtoEdrxM,3189
46
46
  hubble_sdk/_generated/models/export_patient_fhir_response_202_status.py,sha256=5A344SfoyVesuQThsyYzG23BQcHHQGoKNZfEehDKoAo,1120
47
+ hubble_sdk/_generated/models/export_patient_pdf_combined.py,sha256=aN1NpnMGNOhSNxs8aYbf18GBNYc_Riu4CR1Mdnhccog,1060
48
+ hubble_sdk/_generated/models/export_patient_pdf_hubble_version.py,sha256=nwWZn0IgyeN8_rSBqhAL30S2zd1Z7GaksDQzoDZH7aE,1084
47
49
  hubble_sdk/_generated/models/export_patient_pdf_prefer.py,sha256=5MtaZ9h9XJyWZjRIJc0p7VUN43oODvnLWlCeDJfRGB8,1072
48
50
  hubble_sdk/_generated/models/export_patient_pdf_response_202.py,sha256=_XlYC28S8RSQAekleXjgsDxQoVLv_ssT2TS_8C9Pbts,3178
49
51
  hubble_sdk/_generated/models/export_patient_pdf_response_202_status.py,sha256=Yp2LfC78CweiQ-bGzmwDWV9oAjGW-WLe1dxzmuzgENI,1117
@@ -55,7 +57,7 @@ hubble_sdk/_generated/models/get_patient_pdf_export_response_200.py,sha256=zg5M3
55
57
  hubble_sdk/_generated/models/get_patient_pdf_export_response_200_status.py,sha256=GjZMRlGGKsD6HUuYZhJVzCibIpbsJyyP9ph713PnQRk,1098
56
58
  hubble_sdk/_generated/models/o_auth_error.py,sha256=2KdLBi8X-S8YVxCcwfFDoTFgE6UwOrWLp-QgHh5c8Zk,1264
57
59
  hubble_sdk/_generated/models/o_auth_error_error.py,sha256=lUrrXD05v4YIA0HYtJF7-YZeqj6zBqbcRVy8XHSKRI8,1369
58
- hubble_sdk/_generated/models/operation_outcome.py,sha256=aOvD-g-BDTDyvqOcsgk_DQHI3DKAG8DwWfR3-hutqAM,1902
60
+ hubble_sdk/_generated/models/operation_outcome.py,sha256=oGYvHr9__XZ3wOP_LADPH9P8CCSjtvppAz6AS40az9U,1877
59
61
  hubble_sdk/_generated/models/operation_outcome_issue_item.py,sha256=wmV4n_E0880pwYchBbWH8f9PXRbR8atuzjK5Ep-54y0,1318
60
62
  hubble_sdk/_generated/models/patient_address.py,sha256=IFWvNlTR-6rhhggR-in-6vquYjQxVtYrF5iIvzh8fCY,2337
61
63
  hubble_sdk/_generated/models/patient_address_state.py,sha256=f_IDQjmPVCr3099fW_1ExJEEA9qLMTmd-V-W7L9hlYM,1741
@@ -64,7 +66,7 @@ hubble_sdk/_generated/models/provider_seed.py,sha256=H-OqWFvhcwwp9dNMsYDlAQdk_LN
64
66
  hubble_sdk/_generated/models/token_request.py,sha256=6gDAneGZQymGmK41_fpm0mwLoyz5kP_JokqWs-u0JRY,2403
65
67
  hubble_sdk/_generated/models/token_request_grant_type.py,sha256=B0M3WPS5YhXOc4Cc9ZQXId4pjCtFGYwZ-Aofz2Cq6fk,1178
66
68
  hubble_sdk/_generated/models/token_response.py,sha256=HORaPEpLNuPdCtGMlR-CXt8sQEYQH6gEp0gNTpQoFeE,2121
67
- hubble_sdk_python-0.3.0.dist-info/METADATA,sha256=Wr1N_lN_ZhcyM3armTHFwgtmlP1WJDGwBJ1fR38dpf8,6231
68
- hubble_sdk_python-0.3.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
69
- hubble_sdk_python-0.3.0.dist-info/licenses/LICENSE,sha256=S8zTUFi7pK2HOg-wSn6bFAWbNAO4Lt1UiyDu_vcqO6w,1063
70
- hubble_sdk_python-0.3.0.dist-info/RECORD,,
69
+ hubble_sdk_python-0.3.2.dist-info/METADATA,sha256=fNKv0Xm1G2x1Ck-1Y6bpbzvhrvIF7mn0i1TyT7_Iri4,6986
70
+ hubble_sdk_python-0.3.2.dist-info/WHEEL,sha256=2iZrJkDIkeDh0k9SikKMqFuRP-ua6mb4Ir1AsER4BEw,87
71
+ hubble_sdk_python-0.3.2.dist-info/licenses/LICENSE,sha256=S8zTUFi7pK2HOg-wSn6bFAWbNAO4Lt1UiyDu_vcqO6w,1063
72
+ hubble_sdk_python-0.3.2.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.32.4
2
+ Generator: hatchling 1.33.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any