statikk 0.1.19__tar.gz → 0.1.21__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.
- {statikk-0.1.19 → statikk-0.1.21}/PKG-INFO +1 -1
- {statikk-0.1.19 → statikk-0.1.21}/src/statikk/engine.py +12 -1
- {statikk-0.1.19 → statikk-0.1.21}/src/statikk.egg-info/PKG-INFO +1 -1
- {statikk-0.1.19 → statikk-0.1.21}/tests/test_engine.py +20 -2
- {statikk-0.1.19 → statikk-0.1.21}/.coveragerc +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/.gitignore +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/.readthedocs.yml +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/AUTHORS.rst +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/CHANGELOG.rst +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/CONTRIBUTING.rst +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/LICENSE.txt +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/README.rst +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/assets/favicon.png +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/assets/logo.png +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/docs/Makefile +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/docs/_static/.gitignore +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/docs/authors.rst +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/docs/changelog.rst +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/docs/conf.py +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/docs/contributing.rst +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/docs/index.rst +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/docs/license.rst +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/docs/readme.rst +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/docs/requirements.txt +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/docs/usage.rst +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/pyproject.toml +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/setup.cfg +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/setup.py +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/src/statikk/__init__.py +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/src/statikk/conditions.py +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/src/statikk/expressions.py +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/src/statikk/fields.py +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/src/statikk/models.py +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/src/statikk/typing.py +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/src/statikk.egg-info/SOURCES.txt +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/src/statikk.egg-info/dependency_links.txt +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/src/statikk.egg-info/not-zip-safe +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/src/statikk.egg-info/requires.txt +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/src/statikk.egg-info/top_level.txt +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/tests/conftest.py +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/tests/test_expressions.py +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/tests/test_models.py +0 -0
- {statikk-0.1.19 → statikk-0.1.21}/tox.ini +0 -0
@@ -1,4 +1,5 @@
|
|
1
1
|
import os
|
2
|
+
import decimal
|
2
3
|
from datetime import datetime
|
3
4
|
from typing import Any, Dict, Type, Optional, List, Union
|
4
5
|
|
@@ -23,6 +24,14 @@ from aws_xray_sdk.core import patch_all
|
|
23
24
|
patch_all()
|
24
25
|
|
25
26
|
|
27
|
+
DYNAMODB_CONTEXT = decimal.Context(
|
28
|
+
prec=38, # precision
|
29
|
+
rounding=decimal.ROUND_HALF_EVEN,
|
30
|
+
traps=[decimal.Overflow, decimal.Underflow, decimal.InvalidOperation],
|
31
|
+
)
|
32
|
+
decimal.setcontext(DYNAMODB_CONTEXT)
|
33
|
+
|
34
|
+
|
26
35
|
class InvalidIndexNameError(Exception):
|
27
36
|
pass
|
28
37
|
|
@@ -535,6 +544,8 @@ class Table:
|
|
535
544
|
|
536
545
|
if actual_annotation is datetime or "datetime" in str(annotation) and value is not None:
|
537
546
|
return datetime.fromtimestamp(int(value))
|
547
|
+
if isinstance(value, decimal.Decimal):
|
548
|
+
return float(value)
|
538
549
|
if actual_annotation is float:
|
539
550
|
return float(value)
|
540
551
|
if actual_annotation is list:
|
@@ -555,7 +566,7 @@ class Table:
|
|
555
566
|
if isinstance(value, datetime):
|
556
567
|
return int(value.timestamp())
|
557
568
|
if isinstance(value, float):
|
558
|
-
return
|
569
|
+
return DYNAMODB_CONTEXT.create_decimal_from_float(value)
|
559
570
|
if isinstance(value, list):
|
560
571
|
return [self._serialize_value(item) for item in value]
|
561
572
|
if isinstance(value, set):
|
@@ -1,6 +1,6 @@
|
|
1
1
|
from _decimal import Decimal
|
2
2
|
from datetime import datetime, timezone
|
3
|
-
from typing import List, Optional, Type
|
3
|
+
from typing import List, Optional, Type, Any
|
4
4
|
|
5
5
|
import pytest
|
6
6
|
from boto3.dynamodb.conditions import Attr
|
@@ -996,4 +996,22 @@ def test_add_child_node():
|
|
996
996
|
my_database_model = MyDatabaseModel.query_hierarchy(hash_key=Equals("foo"))
|
997
997
|
assert len(my_database_model.nested.list_nested) == 1
|
998
998
|
assert len(my_database_model.nested.other_list_nested) == 1
|
999
|
-
|
999
|
+
|
1000
|
+
|
1001
|
+
def test_nested_model_with_decimal():
|
1002
|
+
class MyModel(DatabaseModel):
|
1003
|
+
id: str
|
1004
|
+
foo: str = "foo"
|
1005
|
+
values: dict[str, Any]
|
1006
|
+
|
1007
|
+
@classmethod
|
1008
|
+
def index_definitions(cls) -> dict[str, IndexFieldConfig]:
|
1009
|
+
return {"main-index": IndexFieldConfig(pk_fields=["foo"], sk_fields=[FIELD_STATIKK_TYPE])}
|
1010
|
+
|
1011
|
+
_create_default_dynamodb_table([MyModel])
|
1012
|
+
|
1013
|
+
my_model = MyModel(id="foo", values={"bar": 1.23})
|
1014
|
+
my_model.save()
|
1015
|
+
my_model_deserialized = MyModel.get("foo")
|
1016
|
+
assert type(my_model_deserialized.values["bar"]) == float
|
1017
|
+
assert my_model_deserialized.values["bar"] == 1.23
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|