statikk 0.1.8__py3-none-any.whl → 0.1.10__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.
statikk/engine.py CHANGED
@@ -1,6 +1,6 @@
1
1
  import os
2
2
  from datetime import datetime
3
- from typing import Any, Dict, Type, Optional, List, Union
3
+ from typing import Any, Dict, Type, Optional, List, Union, get_type_hints, get_origin, get_args
4
4
 
5
5
  import boto3
6
6
  from botocore.config import Config
@@ -307,15 +307,20 @@ class Table:
307
307
  subtree_copy._parent = new_parent
308
308
  for node in subtree_copy.dfs_traverse_hierarchy():
309
309
  for idx in self.indexes:
310
- new_index_values = self._compose_index_values(node, idx)
311
- new_sort_key_value = new_index_values[idx.sort_key.name]
312
- setattr(node, idx.sort_key.name, new_sort_key_value)
313
- new_hash_key_value = new_index_values[idx.hash_key.name]
314
- setattr(node, idx.hash_key.name, new_hash_key_value)
310
+ self.build_model_indexes(node)
315
311
  setattr(node, FIELD_STATIKK_PARENT_ID, new_parent.id)
316
312
 
317
313
  return subtree_copy
318
314
 
315
+ def build_model_indexes(self, model: T) -> T:
316
+ for idx in self.indexes:
317
+ new_index_values = self._compose_index_values(model, idx)
318
+ new_sort_key_value = new_index_values[idx.sort_key.name]
319
+ setattr(model, idx.sort_key.name, new_sort_key_value)
320
+ new_hash_key_value = new_index_values[idx.hash_key.name]
321
+ setattr(model, idx.hash_key.name, new_hash_key_value)
322
+ return model
323
+
319
324
  def batch_write(self):
320
325
  """
321
326
  Returns a context manager for batch writing items to the database. This method handles all the buffering of the
@@ -623,6 +628,26 @@ class Table:
623
628
  data = self._serialize_item(enriched_item)
624
629
  batch.delete_item(Key=data)
625
630
 
631
+ def inspect_optional_field(self, model_class, field_name):
632
+ field_type = model_class.model_fields[field_name].annotation
633
+
634
+ is_optional = False
635
+ inner_type = field_type
636
+
637
+ if get_origin(field_type) is Union:
638
+ args = get_args(field_type)
639
+ if len(args) == 2 and args[1] is type(None):
640
+ is_optional = True
641
+ inner_type = args[0]
642
+
643
+ elif hasattr(field_type, "__origin__") and field_type.__origin__ is Union:
644
+ args = getattr(field_type, "__args__", [])
645
+ if len(args) == 2 and args[1] is type(None):
646
+ is_optional = True
647
+ inner_type = args[0]
648
+
649
+ return (is_optional, inner_type)
650
+
626
651
  def reconstruct_hierarchy(self, items: list[dict]) -> Optional[dict]:
627
652
  """
628
653
  Reconstructs a hierarchical dictionary structure from a flat list of dictionaries
@@ -704,7 +729,9 @@ class Table:
704
729
  if field_name.startswith("_"):
705
730
  continue
706
731
 
707
- field_type = field_info.annotation
732
+ is_optional, inner_type = self.inspect_optional_field(parent_model_class, field_name)
733
+
734
+ field_type = inner_type if is_optional else field_info.annotation
708
735
 
709
736
  if field_type == child_model_class:
710
737
  matching_fields.append((field_name, "single"))
statikk/models.py CHANGED
@@ -204,8 +204,22 @@ class DatabaseModel(BaseModel, TrackingMixin, extra=Extra.allow):
204
204
 
205
205
  @property
206
206
  def should_delete(self) -> bool:
207
+ if self._is_any_parent_marked_for_deletion():
208
+ return True
209
+
207
210
  return self._should_delete or self.is_parent_changed()
208
211
 
212
+ def _is_any_parent_marked_for_deletion(self) -> bool:
213
+ current = self._parent
214
+ while current is not None:
215
+ if current._should_delete:
216
+ return True
217
+ current = current._parent
218
+ return False
219
+
220
+ def build_model_indexes(self) -> T:
221
+ return self._table.build_model_indexes(self)
222
+
209
223
  @classmethod
210
224
  def query(
211
225
  cls: Type[T],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: statikk
3
- Version: 0.1.8
3
+ Version: 0.1.10
4
4
  Summary: statikk is a single table application (STA) library for DynamoDb.
5
5
  Home-page: https://github.com/terinia/statikk
6
6
  Author: Balint Biro
@@ -0,0 +1,12 @@
1
+ statikk/__init__.py,sha256=pH5i4Fj1tbXLqLtTVIdoojiplZssQn0nnud8-HXodRE,577
2
+ statikk/conditions.py,sha256=63FYMR-UUaE-ZJEb_8CU721CQTwhajq39-BbokmKeMA,2166
3
+ statikk/engine.py,sha256=zJ7PsHOUTVh4nbDghMYknLJb7pwByrNfUJIsAh6LFUk,33387
4
+ statikk/expressions.py,sha256=boAeGxZj2cDsXxoiX3IIEzfX9voSMQngi4-rE_jYeuE,12233
5
+ statikk/fields.py,sha256=LkMP5NnX7WS0HSLxI3Q-dMOrfaJ0SD7SayZxJU5Acgg,86
6
+ statikk/models.py,sha256=98TUhCqembdjJj7r5-IUJ-TxEcVjcOB5DY38GenG6bQ,16209
7
+ statikk/typing.py,sha256=qfpegORcdODuILK3gvuD4SdcZA1a7Myn0yvscOLPHOM,68
8
+ statikk-0.1.10.dist-info/LICENSE.txt,sha256=uSH_2Hpb2Bigy5_HhBliN2fZbBU64G3ERM5zzhKPUEE,1078
9
+ statikk-0.1.10.dist-info/METADATA,sha256=ziqy9pX9Rmz27ea1jcMbl2pBo9_MYDMHky-JrvqniQc,3161
10
+ statikk-0.1.10.dist-info/WHEEL,sha256=beeZ86-EfXScwlR_HKu4SllMC9wUEj_8Z_4FJ3egI2w,91
11
+ statikk-0.1.10.dist-info/top_level.txt,sha256=etKmBbjzIlLpSefXoiOfhWGEgvqUEALaFwCjFDBD9YI,8
12
+ statikk-0.1.10.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (76.0.0)
2
+ Generator: setuptools (76.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,12 +0,0 @@
1
- statikk/__init__.py,sha256=pH5i4Fj1tbXLqLtTVIdoojiplZssQn0nnud8-HXodRE,577
2
- statikk/conditions.py,sha256=63FYMR-UUaE-ZJEb_8CU721CQTwhajq39-BbokmKeMA,2166
3
- statikk/engine.py,sha256=x3TB4iMXSpLudwv0dRBGFapttbc8etg36SA_tSq0tGY,32362
4
- statikk/expressions.py,sha256=boAeGxZj2cDsXxoiX3IIEzfX9voSMQngi4-rE_jYeuE,12233
5
- statikk/fields.py,sha256=LkMP5NnX7WS0HSLxI3Q-dMOrfaJ0SD7SayZxJU5Acgg,86
6
- statikk/models.py,sha256=X2MRFn3TAmKdxUQ9KDO9oNoekct4F3QBdcB1COtCpDU,15785
7
- statikk/typing.py,sha256=qfpegORcdODuILK3gvuD4SdcZA1a7Myn0yvscOLPHOM,68
8
- statikk-0.1.8.dist-info/LICENSE.txt,sha256=uSH_2Hpb2Bigy5_HhBliN2fZbBU64G3ERM5zzhKPUEE,1078
9
- statikk-0.1.8.dist-info/METADATA,sha256=9TYBs4MKqRMN2TJN6iRyl3g8nWSIG_zBlVnAAUtfClc,3160
10
- statikk-0.1.8.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
11
- statikk-0.1.8.dist-info/top_level.txt,sha256=etKmBbjzIlLpSefXoiOfhWGEgvqUEALaFwCjFDBD9YI,8
12
- statikk-0.1.8.dist-info/RECORD,,