compressedfhir 1.0.7__py3-none-any.whl → 1.0.9__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 compressedfhir might be problematic. Click here for more details.

@@ -1,4 +1,4 @@
1
- from datetime import datetime, date
1
+ from datetime import datetime, date, time
2
2
  from decimal import Decimal
3
3
  from typing import Type, Any, Dict, Optional
4
4
  import pytest
@@ -40,7 +40,22 @@ class TestCustomObject:
40
40
  {"__type__": "datetime", "iso": "2023-01-01T00:00:00+00:00"},
41
41
  datetime,
42
42
  ),
43
+ (
44
+ "datetime",
45
+ {
46
+ "__type__": "datetime",
47
+ "iso": "2023-01-01T00:00:00-08:00",
48
+ "tzinfo": "Pacific/Honolulu",
49
+ },
50
+ datetime,
51
+ ),
43
52
  ("date", {"__type__": "date", "iso": "2023-01-01"}, date),
53
+ ("time", {"__type__": "time", "iso": "14:30:15"}, time),
54
+ (
55
+ "time",
56
+ {"__type__": "time", "iso": "14:30:15", "tzinfo": "Pacific/Honolulu"},
57
+ time,
58
+ ),
44
59
  ("decimal", {"__type__": "decimal", "value": "3.14"}, Decimal),
45
60
  ("complex", {"__type__": "complex", "real": 3, "imag": 4}, complex),
46
61
  ("bytes", {"__type__": "bytes", "value": "test"}, bytes),
@@ -1,6 +1,9 @@
1
- from datetime import datetime, timezone, date
1
+ import logging
2
+ from datetime import datetime, timezone, date, time
2
3
  from decimal import Decimal
4
+ from logging import Logger
3
5
  from typing import Type, Any
6
+ from zoneinfo import ZoneInfo
4
7
 
5
8
  import pytest
6
9
 
@@ -24,7 +27,14 @@ class TestCustomObject:
24
27
  "input_type, input_value, expected_type",
25
28
  [
26
29
  (datetime, datetime(2023, 1, 1, tzinfo=timezone.utc), "datetime"),
30
+ (
31
+ datetime,
32
+ datetime(2023, 1, 1, tzinfo=ZoneInfo("Pacific/Honolulu")),
33
+ "datetime",
34
+ ),
27
35
  (date, date(2023, 1, 1), "date"),
36
+ (time, time(14, 30, 15), "time"),
37
+ (time, time(14, 30, 15, tzinfo=ZoneInfo("Pacific/Honolulu")), "time"),
28
38
  (Decimal, Decimal("3.14"), "decimal"),
29
39
  (complex, 3 + 4j, "complex"),
30
40
  (bytes, b"test", "bytes"),
@@ -37,9 +47,11 @@ def test_complex_type_serialization(
37
47
  """
38
48
  Test serialization of various complex types
39
49
  """
50
+ logger: Logger = logging.getLogger(__name__)
40
51
  encoder = TypePreservationEncoder()
41
52
  serialized = encoder.default(input_value)
42
53
 
54
+ logger.info(serialized)
43
55
  assert isinstance(serialized, dict)
44
56
  assert serialized.get("__type__") == expected_type
45
57
 
@@ -1,9 +1,10 @@
1
1
  import logging
2
2
  from collections import OrderedDict
3
- from datetime import datetime, timezone, date
3
+ from datetime import datetime, timezone, date, time
4
4
  from decimal import Decimal
5
5
  from logging import Logger
6
6
  from typing import Any
7
+ from zoneinfo import ZoneInfo
7
8
 
8
9
  from compressedfhir.utilities.json_serializers.type_preservation_serializer import (
9
10
  TypePreservationSerializer,
@@ -26,8 +27,12 @@ def test_complex_data_serialization() -> None:
26
27
  Test serialization and deserialization of complex data
27
28
  """
28
29
  complex_data = {
30
+ "timestamp_no_tz": datetime.now(),
29
31
  "timestamp": datetime.now(timezone.utc),
32
+ "timestamp_pst": datetime.now(ZoneInfo("Pacific/Honolulu")),
30
33
  "today": date.today(),
34
+ "my_time": time(14, 30, 15),
35
+ "my_time_pst": time(14, 30, 15, tzinfo=ZoneInfo("Pacific/Honolulu")),
31
36
  "precise_value": Decimal("3.14159"),
32
37
  "complex_number": 3 + 4j,
33
38
  "byte_data": b"Hello",
@@ -42,13 +47,29 @@ def test_complex_data_serialization() -> None:
42
47
  deserialized = TypePreservationSerializer.deserialize(serialized)
43
48
 
44
49
  # Verify types
50
+ assert isinstance(deserialized, OrderedDict)
51
+ assert isinstance(deserialized["timestamp_no_tz"], datetime)
52
+ assert deserialized["timestamp_no_tz"] == complex_data["timestamp_no_tz"]
45
53
  assert isinstance(deserialized["timestamp"], datetime)
54
+ assert deserialized["timestamp"] == complex_data["timestamp"]
55
+ assert isinstance(deserialized["timestamp_pst"], datetime)
56
+ assert deserialized["timestamp_pst"] == complex_data["timestamp_pst"]
46
57
  assert isinstance(deserialized["today"], date)
58
+ assert deserialized["today"] == complex_data["today"]
59
+ assert isinstance(deserialized["my_time"], time)
60
+ assert deserialized["my_time"] == complex_data["my_time"]
61
+ assert isinstance(deserialized["my_time_pst"], time)
62
+ assert deserialized["my_time_pst"] == complex_data["my_time_pst"]
47
63
  assert isinstance(deserialized["precise_value"], Decimal)
64
+ assert deserialized["precise_value"] == complex_data["precise_value"]
48
65
  assert isinstance(deserialized["complex_number"], complex)
66
+ assert deserialized["complex_number"] == complex_data["complex_number"]
49
67
  assert isinstance(deserialized["byte_data"], bytes)
68
+ assert deserialized["byte_data"] == complex_data["byte_data"]
50
69
  assert isinstance(deserialized["unique_items"], set)
70
+ assert deserialized["unique_items"] == complex_data["unique_items"]
51
71
  assert isinstance(deserialized["custom_obj"], TestCustomObject)
72
+ assert deserialized["custom_obj"] == complex_data["custom_obj"]
52
73
 
53
74
 
54
75
  def test_nested_complex_data() -> None:
@@ -1,9 +1,10 @@
1
1
  import logging
2
2
  from collections import OrderedDict
3
- from datetime import datetime, date
3
+ from datetime import datetime, date, time
4
4
  from decimal import Decimal
5
5
  from logging import Logger
6
6
  from typing import Any, Dict, Callable, Optional, Union, cast, List
7
+ from zoneinfo import ZoneInfo
7
8
 
8
9
 
9
10
  class TypePreservationDecoder:
@@ -46,9 +47,33 @@ class TypePreservationDecoder:
46
47
  return date.fromisoformat(d["iso"])
47
48
  return cast(date, d)
48
49
 
50
+ def time_decoder(d: Union[str, Dict[str, Any]]) -> time:
51
+ if isinstance(d, str):
52
+ return time.fromisoformat(d)
53
+ elif isinstance(d, dict) and "iso" in d:
54
+ # Extract ISO time string
55
+ iso_time: str = d["iso"]
56
+
57
+ # Parse time from ISO format
58
+ parsed_time = time.fromisoformat(iso_time)
59
+
60
+ # Add timezone if specified
61
+ tz_info = d.get("tzinfo")
62
+ if tz_info:
63
+ try:
64
+ tz_aware_time = parsed_time.replace(tzinfo=ZoneInfo(tz_info))
65
+ return tz_aware_time
66
+ except Exception as e:
67
+ raise ValueError(f"Invalid timezone: {tz_info}") from e
68
+ else:
69
+ # If no timezone info, return naive time
70
+ return parsed_time
71
+ return cast(time, d)
72
+
49
73
  default_decoders: Dict[str, Callable[[Any], Any]] = {
50
74
  "datetime": datetime_decoder,
51
75
  "date": date_decoder,
76
+ "time": time_decoder,
52
77
  "decimal": lambda d: Decimal(d["value"] if isinstance(d, dict) else d),
53
78
  "complex": lambda d: complex(d["real"], d["imag"])
54
79
  if isinstance(d, dict)
@@ -1,6 +1,6 @@
1
1
  import json
2
2
  from collections.abc import Callable
3
- from datetime import datetime, date
3
+ from datetime import datetime, date, time
4
4
  from decimal import Decimal
5
5
  from typing import Any, Dict, Type
6
6
 
@@ -17,6 +17,11 @@ class TypePreservationEncoder(json.JSONEncoder):
17
17
  "tzinfo": str(dt.tzinfo) if dt.tzinfo else None,
18
18
  },
19
19
  date: lambda d: {"__type__": "date", "iso": d.isoformat()},
20
+ time: lambda t: {
21
+ "__type__": "time",
22
+ "iso": t.isoformat(),
23
+ "tzinfo": str(t.tzinfo) if t.tzinfo else None,
24
+ },
20
25
  Decimal: lambda d: {"__type__": "decimal", "value": str(d)},
21
26
  complex: lambda c: {"__type__": "complex", "real": c.real, "imag": c.imag},
22
27
  bytes: lambda b: {"__type__": "bytes", "value": b.decode("latin-1")},
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: compressedfhir
3
- Version: 1.0.7
3
+ Version: 1.0.9
4
4
  Summary: Stores FHIR JSON resources in compressed form in memory
5
5
  Home-page: https://github.com/icanbwell/compressed-fhir
6
6
  Author: Imran Qureshi
@@ -34,13 +34,13 @@ compressedfhir/utilities/compressed_dict/v1/compressed_dict_storage_mode.py,sha2
34
34
  compressedfhir/utilities/compressed_dict/v1/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  compressedfhir/utilities/compressed_dict/v1/test/test_compressed_dict.py,sha256=5yUnjkmP3A4dSPzDXY3u1YBQ8BxCANdtCF9uGF1T9i4,15840
36
36
  compressedfhir/utilities/json_serializers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- compressedfhir/utilities/json_serializers/type_preservation_decoder.py,sha256=Af2ZsLZiUF9kUhRvkV7i6Ctf_OtTND_lb5PezHtolJU,4382
38
- compressedfhir/utilities/json_serializers/type_preservation_encoder.py,sha256=f7RL67l7QtDbijCPq1ki6axrLte1vH--bi1AsN7Y3yk,1646
37
+ compressedfhir/utilities/json_serializers/type_preservation_decoder.py,sha256=3s9oc_gMWCgBxV_PYkHMMknLWzpEYn09FaJw9s8E-A4,5388
38
+ compressedfhir/utilities/json_serializers/type_preservation_encoder.py,sha256=tJ6HnrwxRqyqYBYxpfHXZ6EzKyTPgbWZE9QJZCYLYdM,1814
39
39
  compressedfhir/utilities/json_serializers/type_preservation_serializer.py,sha256=cE1ka2RxKy_8P0xhgqvPyWqJ3C0Br-aqIHP9BPkCg7A,1523
40
40
  compressedfhir/utilities/json_serializers/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- compressedfhir/utilities/json_serializers/test/test_type_preservation_decoder.py,sha256=GQotwYQJe9VZQotvLWmQWMkSIBne53bolmgflBoR7DU,4752
42
- compressedfhir/utilities/json_serializers/test/test_type_preservation_encoder.py,sha256=O4VczBdsJF35WozZiwSdJ8638qDn01JQsai2wTXu5Vo,1737
43
- compressedfhir/utilities/json_serializers/test/test_type_preservation_serializer.py,sha256=jRl0UEzvsjj1Kl2_7VYCf3kaJch9UZ2-8VHdKZC69xo,6171
41
+ compressedfhir/utilities/json_serializers/test/test_type_preservation_decoder.py,sha256=tmCOZUo6nmnzzxEY0m3-l5szSBRwXovH5z1JOx_AUiE,5199
42
+ compressedfhir/utilities/json_serializers/test/test_type_preservation_encoder.py,sha256=Kr_DFRFm0FtOWMts6sT4r95q0XXeTggQTSgTpAl6p_s,2151
43
+ compressedfhir/utilities/json_serializers/test/test_type_preservation_serializer.py,sha256=rRnd1K1cyIHA2101_ip5bE-s6syBhyiIyoVB_-FKs8c,7485
44
44
  compressedfhir/utilities/ordered_dict_to_dict_converter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
45
  compressedfhir/utilities/ordered_dict_to_dict_converter/ordered_dict_to_dict_converter.py,sha256=CMerJQD7O0vMyGtUp1rKSerZA1tDZeY5GTQT3AykL4w,831
46
46
  compressedfhir/utilities/string_compressor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -51,9 +51,9 @@ compressedfhir/utilities/string_compressor/v1/test/test_string_compressor.py,sha
51
51
  compressedfhir/utilities/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
52
  compressedfhir/utilities/test/test_fhir_json_encoder.py,sha256=6pbNmZp5eBWY66bHjgjm_pZVhs5HDKP8hCGnwNFzpEw,5171
53
53
  compressedfhir/utilities/test/test_json_helpers.py,sha256=V0R9oHDQAs0m0012niEz50sHJxMSUQvA3km7kK8HgjE,3860
54
- compressedfhir-1.0.7.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
54
+ compressedfhir-1.0.9.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
55
55
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
- compressedfhir-1.0.7.dist-info/METADATA,sha256=9KZZ4ummH8dgEpDshUgDVmwg2MY87xjZ8qVsII9IPx4,3456
57
- compressedfhir-1.0.7.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
58
- compressedfhir-1.0.7.dist-info/top_level.txt,sha256=YMKdvBBdiCzFbpI9fG8BUDjaRd-f4R0qAvUoVETpoWw,21
59
- compressedfhir-1.0.7.dist-info/RECORD,,
56
+ compressedfhir-1.0.9.dist-info/METADATA,sha256=jyVUG8uegq0Wu5fMZB8gN-ELkjFFgK7fSJIbsssDEFY,3456
57
+ compressedfhir-1.0.9.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
58
+ compressedfhir-1.0.9.dist-info/top_level.txt,sha256=YMKdvBBdiCzFbpI9fG8BUDjaRd-f4R0qAvUoVETpoWw,21
59
+ compressedfhir-1.0.9.dist-info/RECORD,,