Skip to content

Commit 4871f2c

Browse files
committed
Add pluggable client-level dump
1 parent a3be32e commit 4871f2c

File tree

5 files changed

+24
-13
lines changed

5 files changed

+24
-13
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 2.0.8
2+
3+
* Add experimental pluggable client-level dump function
4+
15
## 2.0.7
26

37
* Preserve null values for resource in save() with fields passed

fhirpy/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from .lib import AsyncFHIRClient, SyncFHIRClient
22

33
__title__ = "fhir-py"
4-
__version__ = "2.0.7"
4+
__version__ = "2.0.8"
55
__author__ = "beda.software"
66
__license__ = "None"
77
__copyright__ = "Copyright 2024 beda.software"

fhirpy/base/lib_async.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import json
33
import warnings
44
from abc import ABC
5-
from collections.abc import AsyncGenerator
5+
from collections.abc import AsyncGenerator, Callable
66
from typing import Any, Generic, Literal, TypeVar, Union, cast, overload
77

88
import aiohttp
@@ -29,8 +29,10 @@ def __init__(
2929
authorization: Union[str, None] = None,
3030
extra_headers: Union[dict, None] = None,
3131
aiohttp_config: Union[dict, None] = None,
32+
dump: Callable[[Any], Any] = lambda x: x,
3233
):
3334
self.aiohttp_config = aiohttp_config or {}
35+
self.dump = dump
3436

3537
super().__init__(url, authorization, extra_headers)
3638

@@ -109,7 +111,7 @@ async def save(
109111
# _as_dict is a private api used internally
110112
_as_dict: bool = False,
111113
) -> Union[TResource, Any]:
112-
data = serialize(resource, drop_dict_null_values=fields is None)
114+
data = serialize(self.dump(resource), drop_dict_null_values=fields is None)
113115
if fields:
114116
if not resource.id:
115117
raise TypeError("Resource `id` is required for update operation")
@@ -169,7 +171,7 @@ async def patch(
169171
response_data = await self._do_request(
170172
"patch",
171173
f"{resource_type}/{resource_id}",
172-
data=serialize(kwargs, drop_dict_null_values=False),
174+
data=serialize(self.dump(kwargs), drop_dict_null_values=False),
173175
)
174176

175177
if custom_resource_class:
@@ -442,7 +444,7 @@ async def get_or_create(self, resource: TResource) -> tuple[TResource, bool]:
442444
response_data, status_code = await self.client._do_request(
443445
"post",
444446
self.resource_type,
445-
serialize(resource),
447+
serialize(self.client.dump(resource)),
446448
self.params,
447449
returning_status=True,
448450
)
@@ -455,7 +457,7 @@ async def update(self, resource: TResource) -> tuple[TResource, bool]:
455457
response_data, status_code = await self.client._do_request(
456458
"put",
457459
self.resource_type,
458-
serialize(resource),
460+
serialize(self.client.dump(resource)),
459461
self.params,
460462
returning_status=True,
461463
)
@@ -470,7 +472,8 @@ async def patch(self, _resource: Any = None, **kwargs) -> TResource:
470472
stacklevel=2,
471473
)
472474
data = serialize(
473-
_resource if _resource is not None else kwargs, drop_dict_null_values=False
475+
self.client.dump(_resource if _resource is not None else kwargs),
476+
drop_dict_null_values=False,
474477
)
475478
response_data = await self.client._do_request(
476479
"PATCH", self.resource_type, data, self.params

fhirpy/base/lib_sync.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import json
33
import warnings
44
from abc import ABC
5-
from collections.abc import Generator
5+
from collections.abc import Callable, Generator
66
from typing import Any, Generic, Literal, TypeVar, Union, cast, overload
77

88
import requests
@@ -29,8 +29,10 @@ def __init__(
2929
authorization: Union[str, None] = None,
3030
extra_headers: Union[dict, None] = None,
3131
requests_config: Union[dict, None] = None,
32+
dump: Callable[[Any], Any] = lambda x: x,
3233
):
3334
self.requests_config = requests_config or {}
35+
self.dump = dump
3436

3537
super().__init__(url, authorization, extra_headers)
3638

@@ -109,7 +111,7 @@ def save(
109111
# _as_dict is a private api used internally
110112
_as_dict: bool = False,
111113
) -> Union[TResource, Any]:
112-
data = serialize(resource, drop_dict_null_values=fields is None)
114+
data = serialize(self.dump(resource), drop_dict_null_values=fields is None)
113115
if fields:
114116
if not resource.id:
115117
raise TypeError("Resource `id` is required for update operation")
@@ -165,7 +167,7 @@ def patch(
165167
response_data = self._do_request(
166168
"patch",
167169
f"{resource_type}/{resource_id}",
168-
data=serialize(kwargs, drop_dict_null_values=False),
170+
data=serialize(self.dump(kwargs), drop_dict_null_values=False),
169171
)
170172

171173
if custom_resource_class:
@@ -440,7 +442,7 @@ def get_or_create(self, resource: TResource) -> tuple[TResource, int]:
440442
response_data, status_code = self.client._do_request(
441443
"post",
442444
self.resource_type,
443-
serialize(resource),
445+
serialize(self.client.dump(resource)),
444446
self.params,
445447
returning_status=True,
446448
)
@@ -453,7 +455,7 @@ def update(self, resource: TResource) -> tuple[TResource, int]:
453455
response_data, status_code = self.client._do_request(
454456
"put",
455457
self.resource_type,
456-
serialize(resource),
458+
serialize(self.client.dump(resource)),
457459
self.params,
458460
returning_status=True,
459461
)
@@ -470,7 +472,8 @@ def patch(self, _resource: Any = None, **kwargs) -> TResource:
470472
)
471473

472474
data = serialize(
473-
_resource if _resource is not None else kwargs, drop_dict_null_values=False
475+
self.client.dump(_resource if _resource is not None else kwargs),
476+
drop_dict_null_values=False,
474477
)
475478
response_data = self.client._do_request("patch", self.resource_type, data, self.params)
476479
return self._dict_to_resource(response_data)

fhirpy/base/resource.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ def is_local(self):
253253

254254
def serialize(resource: Any, drop_dict_null_values=True) -> dict:
255255
# TODO: make serialization pluggable
256+
# TODO: add empty dict/array cleanup
256257

257258
def convert_fn(item):
258259
if isinstance(item, BaseResource):

0 commit comments

Comments
 (0)