wiederverwendbar 0.8.3__tar.gz → 0.8.4__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.
Files changed (176) hide show
  1. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/PKG-INFO +1 -1
  2. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/pyproject.toml +1 -1
  3. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/__init__.py +1 -1
  4. wiederverwendbar-0.8.4/src/wiederverwendbar/examples/sqlalchemy/db.py +89 -0
  5. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/sqlalchemy/base.py +17 -1
  6. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/sqlalchemy/db.py +99 -11
  7. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/sqlalchemy/settings.py +3 -0
  8. wiederverwendbar-0.8.3/src/wiederverwendbar/examples/sqlalchemy/db.py +0 -31
  9. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/README.md +0 -0
  10. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/before_after_wrap.py +0 -0
  11. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/default.py +0 -0
  12. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/__init__.py +0 -0
  13. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/before_after_wrap.py +0 -0
  14. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/colors.py +0 -0
  15. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/extended_thread.py +0 -0
  16. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/file_config.py +0 -0
  17. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/indexable_model.py +0 -0
  18. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/logger.py +0 -0
  19. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/logger_context/__init__.py +0 -0
  20. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/logger_context/example.py +0 -0
  21. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/logger_context/example_module.py +0 -0
  22. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/mongoengine/__init__.py +0 -0
  23. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/mongoengine/automatic_reference.py +0 -0
  24. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/mongoengine/db.py +0 -0
  25. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/mongoengine/log_streamer.py +0 -0
  26. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/mongoengine/logger.py +0 -0
  27. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/post_init.py +0 -0
  28. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/route.py +0 -0
  29. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/singletons.py +0 -0
  30. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/sqlalchemy/__init__.py +0 -0
  31. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/starlette_admin/__init__.py +0 -0
  32. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/starlette_admin/action_log.py +0 -0
  33. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/starlette_admin/action_log_file_download.py +0 -0
  34. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/starlette_admin/action_log_form.py +0 -0
  35. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/starlette_admin/action_log_thread.py +0 -0
  36. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/starlette_admin/automatic_reference_admin.py +0 -0
  37. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/starlette_admin/generic_embedded_document_field.py +0 -0
  38. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/starlette_admin/multi_path_admin.py +0 -0
  39. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/task_manager.py +0 -0
  40. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/test_file.py +0 -0
  41. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/typer_resolve_defaults.py +0 -0
  42. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/examples/uvicorn_server.py +0 -0
  43. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/functions/__init__.py +0 -0
  44. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/functions/admin.py +0 -0
  45. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/functions/animal_name_generator.py +0 -0
  46. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/functions/case_converter.py +0 -0
  47. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/functions/check_hash_file.py +0 -0
  48. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/functions/colors.py +0 -0
  49. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/functions/datetime.py +0 -0
  50. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/functions/download_file.py +0 -0
  51. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/functions/eval.py +0 -0
  52. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/functions/find_class_method.py +0 -0
  53. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/functions/run_command.py +0 -0
  54. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/functions/security/__init__.py +0 -0
  55. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/functions/security/hashed_password.py +0 -0
  56. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/functions/test_file.py +0 -0
  57. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/functions/wait_ping.py +0 -0
  58. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/logger/__init__.py +0 -0
  59. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/logger/context.py +0 -0
  60. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/logger/file_modes.py +0 -0
  61. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/logger/handlers/__init__.py +0 -0
  62. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/logger/handlers/rich_console_handler.py +0 -0
  63. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/logger/handlers/stream_console_handler.py +0 -0
  64. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/logger/handlers/tar_rotating_file_handler.py +0 -0
  65. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/logger/helper.py +0 -0
  66. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/logger/log_levels.py +0 -0
  67. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/logger/logger.py +0 -0
  68. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/logger/settings.py +0 -0
  69. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/logger/singleton.py +0 -0
  70. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/logger/terminal_out_files.py +0 -0
  71. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/__init__.py +0 -0
  72. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/automatic_reference.py +0 -0
  73. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/backup.py +0 -0
  74. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/db.py +0 -0
  75. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/fields/__init__.py +0 -0
  76. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/fields/boolean_also_field.py +0 -0
  77. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/fields/domain_field.py +0 -0
  78. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/fields/ipv4_address_field.py +0 -0
  79. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/fields/ipv4_network_field.py +0 -0
  80. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/fields/port_field.py +0 -0
  81. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/fields/with_instance_field.py +0 -0
  82. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/logger/__init__.py +0 -0
  83. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/logger/documets.py +0 -0
  84. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/logger/formatters.py +0 -0
  85. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/logger/handlers.py +0 -0
  86. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/logger/streamer.py +0 -0
  87. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/property_document.py +0 -0
  88. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/security/__init__.py +0 -0
  89. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/security/hashed_password.py +0 -0
  90. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/settings.py +0 -0
  91. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/mongoengine/singleton.py +0 -0
  92. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/post_init.py +0 -0
  93. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/pydantic/__init__.py +0 -0
  94. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/pydantic/file_config.py +0 -0
  95. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/pydantic/indexable_model.py +0 -0
  96. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/pydantic/printable_settings.py +0 -0
  97. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/pydantic/security/__init__.py +0 -0
  98. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/pydantic/security/hashed_password.py +0 -0
  99. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/pydantic/singleton.py +0 -0
  100. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/route.py +0 -0
  101. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/singleton.py +0 -0
  102. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/sqlalchemy/__init__.py +0 -0
  103. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/sqlalchemy/raise_has_not_attr.py +0 -0
  104. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/sqlalchemy/singleton.py +0 -0
  105. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/sqlalchemy/types.py +0 -0
  106. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/__init__.py +0 -0
  107. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/action_log/__init__.py +0 -0
  108. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/action_log/admin.py +0 -0
  109. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/action_log/logger.py +0 -0
  110. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/action_log/settings.py +0 -0
  111. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/action_log/statics/js/actions.js +0 -0
  112. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/action_log/templates/modals/loading.html +0 -0
  113. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/action_log/thread.py +0 -0
  114. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/admin.py +0 -0
  115. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/drop_down_icon_view/__init__.py +0 -0
  116. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/drop_down_icon_view/admin.py +0 -0
  117. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/drop_down_icon_view/templates/macros/views.html +0 -0
  118. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/drop_down_icon_view/views.py +0 -0
  119. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/form_max_fields/__init__.py +0 -0
  120. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/form_max_fields/admin.py +0 -0
  121. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/form_max_fields/settings.py +0 -0
  122. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/__init__.py +0 -0
  123. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/auth/__init__.py +0 -0
  124. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/auth/admin.py +0 -0
  125. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/auth/documents/__init__.py +0 -0
  126. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/auth/documents/session.py +0 -0
  127. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/auth/documents/user.py +0 -0
  128. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/auth/provider.py +0 -0
  129. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/auth/settings.py +0 -0
  130. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/auth/views/__init__.py +0 -0
  131. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/auth/views/auth.py +0 -0
  132. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/auth/views/session.py +0 -0
  133. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/auth/views/user.py +0 -0
  134. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/boolean_also_field/__init__.py +0 -0
  135. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/boolean_also_field/admin.py +0 -0
  136. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/boolean_also_field/converter.py +0 -0
  137. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/boolean_also_field/field.py +0 -0
  138. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/boolean_also_field/statics/js/boolean_also_field.js +0 -0
  139. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/boolean_also_field/templates/forms/boolean.html +0 -0
  140. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/converter.py +0 -0
  141. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/generic_embedded_document_field/__init__.py +0 -0
  142. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/generic_embedded_document_field/admin.py +0 -0
  143. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/generic_embedded_document_field/converter.py +0 -0
  144. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/generic_embedded_document_field/field.py +0 -0
  145. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/generic_embedded_document_field/statics/js/form.js +0 -0
  146. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/generic_embedded_document_field/statics/js/generic_embedded.js +0 -0
  147. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/generic_embedded_document_field/templates/displays/generic_embedded.html +0 -0
  148. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/generic_embedded_document_field/templates/forms/generic_embedded.html +0 -0
  149. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/generic_embedded_document_field/view.py +0 -0
  150. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/helper.py +0 -0
  151. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/ipv4_field/__init__.py +0 -0
  152. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/ipv4_field/converter.py +0 -0
  153. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/mongoengine/view.py +0 -0
  154. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/multi_path/__init__.py +0 -0
  155. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/multi_path/admin.py +0 -0
  156. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/settings/__init__.py +0 -0
  157. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/settings/admin.py +0 -0
  158. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/starlette_admin/settings/settings.py +0 -0
  159. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/task_manger/__init__.py +0 -0
  160. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/task_manger/singleton.py +0 -0
  161. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/task_manger/task.py +0 -0
  162. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/task_manger/task_manager.py +0 -0
  163. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/task_manger/trigger.py +0 -0
  164. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/threading/__init__.py +0 -0
  165. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/threading/extended_thread.py +0 -0
  166. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/typer/__init__.py +0 -0
  167. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/typer/typer_resolve_defaults.py +0 -0
  168. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/uvicorn/__init__.py +0 -0
  169. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/uvicorn/server.py +0 -0
  170. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/src/wiederverwendbar/uvicorn/settings.py +0 -0
  171. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/tests/__init__.py +0 -0
  172. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/tests/frontend.py +0 -0
  173. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/tests/meta.py +0 -0
  174. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/tests/shared.py +0 -0
  175. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/tests/task_manager.py +0 -0
  176. {wiederverwendbar-0.8.3 → wiederverwendbar-0.8.4}/tests/worker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wiederverwendbar
3
- Version: 0.8.3
3
+ Version: 0.8.4
4
4
  Summary: A collection of scripts, classes and tools they are \"wiederverwendbar\".
5
5
  Author-Email: Julius Koenig <info@bastelquartier.de>
6
6
  License: GPL-3.0
@@ -12,7 +12,7 @@ dependencies = [
12
12
  ]
13
13
  requires-python = ">=3.9"
14
14
  readme = "README.md"
15
- version = "0.8.3"
15
+ version = "0.8.4"
16
16
 
17
17
  [project.license]
18
18
  text = "GPL-3.0"
@@ -1,4 +1,4 @@
1
- __version__ = "0.8.3"
1
+ __version__ = "0.8.4"
2
2
  TITLE = "wiederverwendbar"
3
3
  VERSION = __version__
4
4
  AUTHOR = "Julius Koenig"
@@ -0,0 +1,89 @@
1
+ from pathlib import Path
2
+ from typing import Optional
3
+
4
+ from sqlalchemy import Column, ForeignKey, Integer, Text
5
+
6
+ from sqlalchemy.orm import relationship
7
+
8
+ from wiederverwendbar.logger import LoggerSingleton, LoggerSettings, LogLevels
9
+ from wiederverwendbar.sqlalchemy import Base, SqlalchemySettings, SqlalchemyDbSingleton
10
+
11
+ LoggerSingleton(name="test", settings=LoggerSettings(log_level=LogLevels.DEBUG), init=True)
12
+ SqlalchemyDbSingleton(settings=SqlalchemySettings(db_file=Path("test.db")), init=True)
13
+
14
+
15
+ class MyBase(Base, SqlalchemyDbSingleton().Base):
16
+ __abstract__ = True
17
+
18
+
19
+ class Parent(MyBase):
20
+ __tablename__ = "parent"
21
+ __str_columns__: list[str] = ["id", "name"]
22
+
23
+ id: int = Column(Integer(), primary_key=True, autoincrement=True, name="parent_id")
24
+ name: str = Column(Text(50), nullable=False, unique=True)
25
+ children: list["Child"] = relationship("Child",
26
+ foreign_keys="Child.parent_id",
27
+ primaryjoin="Parent.id == Child.parent_id",
28
+ viewonly=True)
29
+
30
+
31
+ class Child(MyBase):
32
+ __tablename__ = "child"
33
+ __str_columns__: list[str] = ["id", "name"]
34
+
35
+ id: int = Column(Integer(), primary_key=True, autoincrement=True, name="parent_id")
36
+ name: str = Column(Text(50), nullable=False, unique=True)
37
+ parent_id: int = Column(Integer(), ForeignKey("parent.parent_id"), nullable=False, name="child_parent_id")
38
+ parent: Optional[Parent] = relationship("Parent",
39
+ foreign_keys="Parent.id",
40
+ primaryjoin="Child.parent_id == Parent.id")
41
+
42
+
43
+ if __name__ == '__main__':
44
+ SqlalchemyDbSingleton().create_all()
45
+
46
+ parent1 = Parent.get(name="parent1")
47
+ if parent1 is None:
48
+ parent1 = Parent(name="parent1")
49
+ parent1.save()
50
+
51
+ child1 = Child.get(name="child1")
52
+ if child1 is None:
53
+ child1 = Child(name="child1", parent_id=parent1.id)
54
+ child1.save()
55
+
56
+ child2 = Child.get(name="child2")
57
+ if child2 is None:
58
+ child2 = Child(name="child2", parent_id=parent1.id)
59
+ child2.save()
60
+
61
+ child3 = Child.get(name="child3")
62
+ if child3 is None:
63
+ child3 = Child(name="child3", parent_id=parent1.id)
64
+ child3.save()
65
+
66
+ parent2 = Parent.get(name="parent2")
67
+ if parent2 is None:
68
+ parent2 = Parent(name="parent2")
69
+ parent2.save()
70
+
71
+ child4 = Child.get(name="child4")
72
+ if child4 is None:
73
+ child4 = Child(name="child4", parent_id=parent2.id)
74
+ child4.save()
75
+
76
+ child5 = Child.get(name="child5")
77
+ if child5 is None:
78
+ child5 = Child(name="child5", parent_id=parent2.id)
79
+ child5.save()
80
+
81
+ child6 = Child.get(name="child6")
82
+ if child6 is None:
83
+ child6 = Child(name="child6", parent_id=parent2.id)
84
+ child6.save()
85
+
86
+ Parent.delete_all() # Should raise an IntegrityError --> FOREIGN KEY constraint failed
87
+ parent2.delete() # Should raise an IntegrityError --> FOREIGN KEY constraint failed
88
+
89
+ print()
@@ -2,7 +2,7 @@ from typing import Any, Optional, Callable, Union, TYPE_CHECKING
2
2
 
3
3
  from sqlalchemy import inspect
4
4
  from sqlalchemy.sql import ColumnExpressionArgument
5
- from sqlalchemy.orm import Session, QueryableAttribute, InstrumentedAttribute
5
+ from sqlalchemy.orm import Session, QueryableAttribute
6
6
  from sqlalchemy.orm.exc import DetachedInstanceError
7
7
 
8
8
  from wiederverwendbar.default import Default
@@ -399,3 +399,19 @@ class Base:
399
399
  session.commit()
400
400
 
401
401
  self.session_close(session_created=session_created, session=session)
402
+
403
+ @classmethod
404
+ def delete_all(cls,
405
+ *criterion: Union[ColumnExpressionArgument[bool], bool],
406
+ session: Optional[Session] = None,
407
+ **kwargs: Any) -> None:
408
+ session_created, session = cls.session(session=session)
409
+
410
+ # delete rows
411
+ if criterion:
412
+ session.query(cls).filter(*criterion, **kwargs).delete()
413
+ else:
414
+ session.query(cls).filter_by(**kwargs).delete()
415
+ session.commit()
416
+
417
+ cls.session_close(session_created=session_created, session=session)
@@ -1,10 +1,11 @@
1
1
  import inspect
2
2
  import logging
3
+ import sqlite3
3
4
  from ipaddress import IPv4Address
4
5
  from pathlib import Path
5
- from typing import Any, Optional, Union, Sequence
6
+ from typing import Any, Optional, Union, Sequence, Callable
6
7
 
7
- from sqlalchemy import create_engine, Table
8
+ from sqlalchemy import create_engine, Table, event
8
9
  from sqlalchemy.orm import sessionmaker, declarative_base, DeclarativeMeta as _DeclarativeMeta, Session
9
10
  from sqlalchemy.ext.declarative import declarative_base
10
11
 
@@ -41,6 +42,7 @@ class SqlalchemyDb:
41
42
  username: Optional[str] = None,
42
43
  password: Optional[str] = None,
43
44
  echo: Optional[bool] = None,
45
+ sqlite_handle_foreign_keys: bool = True,
44
46
  settings: Optional[SqlalchemySettings] = None):
45
47
  """
46
48
  Create a new Sqlalchemy Database
@@ -52,22 +54,26 @@ class SqlalchemyDb:
52
54
  :param username: User to connect to database
53
55
  :param password: Password to connect to database
54
56
  :param echo: Echo SQL queries to console
57
+ :param sqlite_handle_foreign_keys: Enable SQLite Foreign Keys
55
58
  :param settings: Sqlalchemy Settings
56
59
  """
57
60
 
58
- self.settings: SqlalchemySettings = settings or SqlalchemySettings()
59
- self.file: Optional[Path] = file or self.settings.db_file
60
- self.host: Union[IPv4Address, str, None] = host or self.settings.db_host
61
- self.port: Optional[int] = port or self.settings.db_port
62
- self.protocol: Optional[str] = protocol or self.settings.db_protocol
63
- self.name: Optional[str] = name or self.settings.db_name
64
- self.username: Optional[str] = username or self.settings.db_username
65
- self.password: Optional[str] = password or self.settings.db_password
66
- self.echo: bool = echo or self.settings.db_echo
61
+ self._settings: SqlalchemySettings = settings or SqlalchemySettings()
62
+ self._file: Optional[Path] = file or self.settings.db_file
63
+ self._host: Union[IPv4Address, str, None] = host or self.settings.db_host
64
+ self._port: Optional[int] = port or self.settings.db_port
65
+ self._protocol: Optional[str] = protocol or self.settings.db_protocol
66
+ self._name: Optional[str] = name or self.settings.db_name
67
+ self._username: Optional[str] = username or self.settings.db_username
68
+ self._password: Optional[str] = password or self.settings.db_password
69
+ self._echo: bool = echo or self.settings.db_echo
70
+ self._sqlite_handle_foreign_keys: bool = sqlite_handle_foreign_keys or self.settings.db_sqlite_handle_foreign_keys
67
71
 
68
72
  logger.debug(f"Create {self}")
69
73
 
70
74
  self.engine = create_engine(self.connection_string, echo=self.echo)
75
+ if self.protocol == "sqlite" and self.sqlite_handle_foreign_keys:
76
+ self.listen("connect", self._sqlite_set_handle_foreign_keys)
71
77
  self.session_maker = sessionmaker(bind=self.engine)
72
78
  self.Base: DeclarativeMeta = declarative_base(metaclass=DeclarativeMeta)
73
79
  self.session_maker.configure(binds={self.Base: self.engine})
@@ -75,6 +81,46 @@ class SqlalchemyDb:
75
81
  def __str__(self):
76
82
  return f"{self.__class__.__name__}({self.connection_string_printable})"
77
83
 
84
+ @property
85
+ def settings(self) -> SqlalchemySettings:
86
+ return self._settings
87
+
88
+ @property
89
+ def file(self) -> Optional[Path]:
90
+ return self._file
91
+
92
+ @property
93
+ def host(self) -> Union[IPv4Address, str, None]:
94
+ return self._host
95
+
96
+ @property
97
+ def port(self) -> Optional[int]:
98
+ return self._port
99
+
100
+ @property
101
+ def protocol(self) -> Optional[str]:
102
+ return self._protocol
103
+
104
+ @property
105
+ def name(self) -> Optional[str]:
106
+ return self._name
107
+
108
+ @property
109
+ def username(self) -> Optional[str]:
110
+ return self._username
111
+
112
+ @property
113
+ def password(self) -> Optional[str]:
114
+ return self._password
115
+
116
+ @property
117
+ def echo(self) -> bool:
118
+ return self._echo
119
+
120
+ @property
121
+ def sqlite_handle_foreign_keys(self) -> bool:
122
+ return self._sqlite_handle_foreign_keys
123
+
78
124
  def get_connection_string(self, printable: bool = False) -> str:
79
125
  """
80
126
  Get the Connection String
@@ -150,3 +196,45 @@ class SqlalchemyDb:
150
196
 
151
197
  logger.debug(f"Create Session for {self}")
152
198
  return self.session_maker()
199
+
200
+ def listen(self,
201
+ identifier: str,
202
+ func: Callable[..., Any],
203
+ *args: Any,
204
+ **kwargs: Any) -> None:
205
+ """
206
+ Register a listener function for the engine.
207
+
208
+ :param identifier: String name of the event.
209
+ :param func: Callable function.
210
+ :return: None
211
+
212
+ .. Seealso::
213
+ sqlalchemy.event.api.listen for more.
214
+ """
215
+
216
+ event.listen(self.engine, identifier, func, *args, **kwargs)
217
+
218
+ def listens_for(self,
219
+ identifier: str,
220
+ *args: Any,
221
+ **kw: Any) -> Callable[[Callable[..., Any]], Callable[..., Any]]:
222
+ """
223
+ Decorate a function as a listener for the engine.
224
+
225
+ :param identifier: String name of the event.
226
+ :return: Callable[[Callable[..., Any]], Callable[..., Any]]
227
+
228
+ .. Seealso::
229
+ sqlalchemy.event.api.listens_for for more.
230
+ """
231
+
232
+ return event.listens_for(self.engine, identifier, *args, **kw)
233
+
234
+ @classmethod
235
+ def _sqlite_set_handle_foreign_keys(cls, connection, _connection_record):
236
+ if not isinstance(connection, sqlite3.Connection):
237
+ raise RuntimeError(f"Connection is not a sqlite3.Connection: {connection}")
238
+ cursor = connection.cursor()
239
+ cursor.execute("PRAGMA foreign_keys=ON")
240
+ cursor.close()
@@ -34,3 +34,6 @@ class SqlalchemySettings(PrintableSettings):
34
34
  db_echo: bool = Field(default=False,
35
35
  title="Database echo.",
36
36
  description="Echo SQL queries to console")
37
+ db_sqlite_handle_foreign_keys: bool = Field(default=True,
38
+ title="Database SQLite Handle Foreign Keys",
39
+ description="Handle foreign keys in SQLite")
@@ -1,31 +0,0 @@
1
- from pathlib import Path
2
-
3
- from sqlalchemy import Column, Text, Integer
4
-
5
- from wiederverwendbar.logger import LoggerSingleton, LoggerSettings
6
- from wiederverwendbar.sqlalchemy import Base, SqlalchemySettings, SqlalchemyDbSingleton
7
-
8
- LoggerSingleton(name="test", settings=LoggerSettings(log_level=LoggerSettings.LogLevels.DEBUG), init=True)
9
-
10
-
11
- class MyBase(Base, SqlalchemyDbSingleton(settings=SqlalchemySettings(db_file=Path("test.db")), init=True).Base):
12
- __abstract__ = True
13
-
14
-
15
- class MyTable(MyBase):
16
- __tablename__ = "my_table"
17
- __str_columns__: list[str] = ["name"]
18
-
19
- name = Column(Text(50), primary_key=True)
20
- value = Column(Integer)
21
-
22
-
23
- if __name__ == '__main__':
24
- SqlalchemyDbSingleton().create_all()
25
-
26
- my_table = MyTable(name="test", value=1)
27
-
28
- d = my_table.as_dict()
29
- my_table.save()
30
-
31
- print()