wiederverwendbar 0.8.4__tar.gz → 0.8.6__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 (177) hide show
  1. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/PKG-INFO +14 -14
  2. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/pyproject.toml +14 -14
  3. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/__init__.py +1 -1
  4. wiederverwendbar-0.8.6/src/wiederverwendbar/functions/get_pretty_str.py +9 -0
  5. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/logger/log_levels.py +5 -0
  6. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/pydantic/file_config.py +20 -4
  7. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/sqlalchemy/base.py +18 -5
  8. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/sqlalchemy/db.py +46 -8
  9. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/sqlalchemy/settings.py +6 -0
  10. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/task_manger/task.py +1 -4
  11. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/task_manger/task_manager.py +14 -19
  12. wiederverwendbar-0.8.6/src/wiederverwendbar/warnings.py +6 -0
  13. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/README.md +0 -0
  14. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/before_after_wrap.py +0 -0
  15. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/default.py +0 -0
  16. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/__init__.py +0 -0
  17. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/before_after_wrap.py +0 -0
  18. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/colors.py +0 -0
  19. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/extended_thread.py +0 -0
  20. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/file_config.py +0 -0
  21. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/indexable_model.py +0 -0
  22. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/logger.py +0 -0
  23. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/logger_context/__init__.py +0 -0
  24. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/logger_context/example.py +0 -0
  25. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/logger_context/example_module.py +0 -0
  26. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/mongoengine/__init__.py +0 -0
  27. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/mongoengine/automatic_reference.py +0 -0
  28. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/mongoengine/db.py +0 -0
  29. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/mongoengine/log_streamer.py +0 -0
  30. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/mongoengine/logger.py +0 -0
  31. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/post_init.py +0 -0
  32. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/route.py +0 -0
  33. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/singletons.py +0 -0
  34. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/sqlalchemy/__init__.py +0 -0
  35. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/sqlalchemy/db.py +0 -0
  36. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/starlette_admin/__init__.py +0 -0
  37. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/starlette_admin/action_log.py +0 -0
  38. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/starlette_admin/action_log_file_download.py +0 -0
  39. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/starlette_admin/action_log_form.py +0 -0
  40. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/starlette_admin/action_log_thread.py +0 -0
  41. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/starlette_admin/automatic_reference_admin.py +0 -0
  42. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/starlette_admin/generic_embedded_document_field.py +0 -0
  43. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/starlette_admin/multi_path_admin.py +0 -0
  44. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/task_manager.py +0 -0
  45. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/test_file.py +0 -0
  46. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/typer_resolve_defaults.py +0 -0
  47. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/examples/uvicorn_server.py +0 -0
  48. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/functions/__init__.py +0 -0
  49. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/functions/admin.py +0 -0
  50. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/functions/animal_name_generator.py +0 -0
  51. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/functions/case_converter.py +0 -0
  52. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/functions/check_hash_file.py +0 -0
  53. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/functions/colors.py +0 -0
  54. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/functions/datetime.py +0 -0
  55. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/functions/download_file.py +0 -0
  56. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/functions/eval.py +0 -0
  57. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/functions/find_class_method.py +0 -0
  58. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/functions/run_command.py +0 -0
  59. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/functions/security/__init__.py +0 -0
  60. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/functions/security/hashed_password.py +0 -0
  61. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/functions/test_file.py +0 -0
  62. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/functions/wait_ping.py +0 -0
  63. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/logger/__init__.py +0 -0
  64. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/logger/context.py +0 -0
  65. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/logger/file_modes.py +0 -0
  66. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/logger/handlers/__init__.py +0 -0
  67. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/logger/handlers/rich_console_handler.py +0 -0
  68. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/logger/handlers/stream_console_handler.py +0 -0
  69. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/logger/handlers/tar_rotating_file_handler.py +0 -0
  70. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/logger/helper.py +0 -0
  71. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/logger/logger.py +0 -0
  72. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/logger/settings.py +0 -0
  73. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/logger/singleton.py +0 -0
  74. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/logger/terminal_out_files.py +0 -0
  75. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/__init__.py +0 -0
  76. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/automatic_reference.py +0 -0
  77. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/backup.py +0 -0
  78. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/db.py +0 -0
  79. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/fields/__init__.py +0 -0
  80. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/fields/boolean_also_field.py +0 -0
  81. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/fields/domain_field.py +0 -0
  82. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/fields/ipv4_address_field.py +0 -0
  83. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/fields/ipv4_network_field.py +0 -0
  84. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/fields/port_field.py +0 -0
  85. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/fields/with_instance_field.py +0 -0
  86. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/logger/__init__.py +0 -0
  87. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/logger/documets.py +0 -0
  88. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/logger/formatters.py +0 -0
  89. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/logger/handlers.py +0 -0
  90. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/logger/streamer.py +0 -0
  91. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/property_document.py +0 -0
  92. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/security/__init__.py +0 -0
  93. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/security/hashed_password.py +0 -0
  94. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/settings.py +0 -0
  95. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/mongoengine/singleton.py +0 -0
  96. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/post_init.py +0 -0
  97. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/pydantic/__init__.py +0 -0
  98. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/pydantic/indexable_model.py +0 -0
  99. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/pydantic/printable_settings.py +0 -0
  100. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/pydantic/security/__init__.py +0 -0
  101. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/pydantic/security/hashed_password.py +0 -0
  102. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/pydantic/singleton.py +0 -0
  103. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/route.py +0 -0
  104. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/singleton.py +0 -0
  105. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/sqlalchemy/__init__.py +0 -0
  106. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/sqlalchemy/raise_has_not_attr.py +0 -0
  107. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/sqlalchemy/singleton.py +0 -0
  108. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/sqlalchemy/types.py +0 -0
  109. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/__init__.py +0 -0
  110. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/action_log/__init__.py +0 -0
  111. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/action_log/admin.py +0 -0
  112. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/action_log/logger.py +0 -0
  113. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/action_log/settings.py +0 -0
  114. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/action_log/statics/js/actions.js +0 -0
  115. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/action_log/templates/modals/loading.html +0 -0
  116. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/action_log/thread.py +0 -0
  117. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/admin.py +0 -0
  118. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/drop_down_icon_view/__init__.py +0 -0
  119. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/drop_down_icon_view/admin.py +0 -0
  120. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/drop_down_icon_view/templates/macros/views.html +0 -0
  121. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/drop_down_icon_view/views.py +0 -0
  122. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/form_max_fields/__init__.py +0 -0
  123. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/form_max_fields/admin.py +0 -0
  124. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/form_max_fields/settings.py +0 -0
  125. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/__init__.py +0 -0
  126. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/auth/__init__.py +0 -0
  127. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/auth/admin.py +0 -0
  128. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/auth/documents/__init__.py +0 -0
  129. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/auth/documents/session.py +0 -0
  130. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/auth/documents/user.py +0 -0
  131. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/auth/provider.py +0 -0
  132. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/auth/settings.py +0 -0
  133. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/auth/views/__init__.py +0 -0
  134. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/auth/views/auth.py +0 -0
  135. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/auth/views/session.py +0 -0
  136. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/auth/views/user.py +0 -0
  137. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/boolean_also_field/__init__.py +0 -0
  138. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/boolean_also_field/admin.py +0 -0
  139. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/boolean_also_field/converter.py +0 -0
  140. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/boolean_also_field/field.py +0 -0
  141. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/boolean_also_field/statics/js/boolean_also_field.js +0 -0
  142. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/boolean_also_field/templates/forms/boolean.html +0 -0
  143. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/converter.py +0 -0
  144. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/generic_embedded_document_field/__init__.py +0 -0
  145. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/generic_embedded_document_field/admin.py +0 -0
  146. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/generic_embedded_document_field/converter.py +0 -0
  147. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/generic_embedded_document_field/field.py +0 -0
  148. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/generic_embedded_document_field/statics/js/form.js +0 -0
  149. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/generic_embedded_document_field/statics/js/generic_embedded.js +0 -0
  150. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/generic_embedded_document_field/templates/displays/generic_embedded.html +0 -0
  151. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/generic_embedded_document_field/templates/forms/generic_embedded.html +0 -0
  152. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/generic_embedded_document_field/view.py +0 -0
  153. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/helper.py +0 -0
  154. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/ipv4_field/__init__.py +0 -0
  155. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/ipv4_field/converter.py +0 -0
  156. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/mongoengine/view.py +0 -0
  157. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/multi_path/__init__.py +0 -0
  158. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/multi_path/admin.py +0 -0
  159. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/settings/__init__.py +0 -0
  160. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/settings/admin.py +0 -0
  161. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/starlette_admin/settings/settings.py +0 -0
  162. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/task_manger/__init__.py +0 -0
  163. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/task_manger/singleton.py +0 -0
  164. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/task_manger/trigger.py +0 -0
  165. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/threading/__init__.py +0 -0
  166. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/threading/extended_thread.py +0 -0
  167. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/typer/__init__.py +0 -0
  168. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/typer/typer_resolve_defaults.py +0 -0
  169. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/uvicorn/__init__.py +0 -0
  170. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/uvicorn/server.py +0 -0
  171. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/src/wiederverwendbar/uvicorn/settings.py +0 -0
  172. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/tests/__init__.py +0 -0
  173. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/tests/frontend.py +0 -0
  174. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/tests/meta.py +0 -0
  175. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/tests/shared.py +0 -0
  176. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/tests/task_manager.py +0 -0
  177. {wiederverwendbar-0.8.4 → wiederverwendbar-0.8.6}/tests/worker.py +0 -0
@@ -1,49 +1,49 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wiederverwendbar
3
- Version: 0.8.4
3
+ Version: 0.8.6
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
7
7
  Requires-Python: >=3.9
8
- Requires-Dist: pydantic>=2.11.4
8
+ Requires-Dist: pydantic>=2.11.5
9
9
  Requires-Dist: pydantic-settings>=2.9.1
10
10
  Requires-Dist: devtools>=0.12.2
11
11
  Provides-Extra: full
12
12
  Requires-Dist: rich>=14.0.0; extra == "full"
13
- Requires-Dist: typer>=0.15.3; extra == "full"
13
+ Requires-Dist: typer>=0.16.0; extra == "full"
14
14
  Requires-Dist: pythonping>=1.1.4; extra == "full"
15
15
  Requires-Dist: mongoengine>=0.29.1; extra == "full"
16
- Requires-Dist: nicegui>=2.17.0; extra == "full"
17
- Requires-Dist: uvicorn>=0.34.2; extra == "full"
16
+ Requires-Dist: nicegui>=2.19.0; extra == "full"
17
+ Requires-Dist: uvicorn>=0.34.3; extra == "full"
18
18
  Requires-Dist: fastapi>=0.115.12; extra == "full"
19
- Requires-Dist: starlette-admin[i18n]>=0.14.1; extra == "full"
19
+ Requires-Dist: starlette-admin[i18n]>=0.15.1; extra == "full"
20
20
  Requires-Dist: pillow>=11.2.1; extra == "full"
21
21
  Requires-Dist: blinker>=1.9.0; extra == "full"
22
- Requires-Dist: kombu>=5.5.3; extra == "full"
22
+ Requires-Dist: kombu>=5.5.4; extra == "full"
23
23
  Requires-Dist: nest-asyncio>=1.6.0; extra == "full"
24
- Requires-Dist: sqlalchemy>=2.0.40; extra == "full"
24
+ Requires-Dist: sqlalchemy>=2.0.41; extra == "full"
25
25
  Provides-Extra: rich
26
26
  Requires-Dist: rich>=14.0.0; extra == "rich"
27
27
  Provides-Extra: typer
28
- Requires-Dist: typer>=0.15.3; extra == "typer"
28
+ Requires-Dist: typer>=0.16.0; extra == "typer"
29
29
  Provides-Extra: mongoengine
30
30
  Requires-Dist: mongoengine>=0.29.1; extra == "mongoengine"
31
31
  Requires-Dist: blinker>=1.9.0; extra == "mongoengine"
32
32
  Provides-Extra: uvicorn
33
- Requires-Dist: uvicorn>=0.34.2; extra == "uvicorn"
33
+ Requires-Dist: uvicorn>=0.34.3; extra == "uvicorn"
34
34
  Provides-Extra: fastapi
35
35
  Requires-Dist: fastapi>=0.115.12; extra == "fastapi"
36
36
  Provides-Extra: nicegui
37
- Requires-Dist: nicegui>=2.17.0; extra == "nicegui"
37
+ Requires-Dist: nicegui>=2.19.0; extra == "nicegui"
38
38
  Provides-Extra: starlette-admin
39
- Requires-Dist: starlette-admin[i18n]>=0.14.1; extra == "starlette-admin"
39
+ Requires-Dist: starlette-admin[i18n]>=0.15.1; extra == "starlette-admin"
40
40
  Requires-Dist: pillow>=11.2.1; extra == "starlette-admin"
41
- Requires-Dist: kombu>=5.5.3; extra == "starlette-admin"
41
+ Requires-Dist: kombu>=5.5.4; extra == "starlette-admin"
42
42
  Requires-Dist: nest-asyncio>=1.6.0; extra == "starlette-admin"
43
43
  Provides-Extra: fuctions
44
44
  Requires-Dist: pythonping>=1.1.4; extra == "fuctions"
45
45
  Provides-Extra: sqlalchemy
46
- Requires-Dist: sqlalchemy>=2.0.40; extra == "sqlalchemy"
46
+ Requires-Dist: sqlalchemy>=2.0.41; extra == "sqlalchemy"
47
47
  Description-Content-Type: text/markdown
48
48
 
49
49
  # wiederverwendbar
@@ -6,13 +6,13 @@ authors = [
6
6
  { name = "Julius Koenig", email = "info@bastelquartier.de" },
7
7
  ]
8
8
  dependencies = [
9
- "pydantic>=2.11.4",
9
+ "pydantic>=2.11.5",
10
10
  "pydantic-settings>=2.9.1",
11
11
  "devtools>=0.12.2",
12
12
  ]
13
13
  requires-python = ">=3.9"
14
14
  readme = "README.md"
15
- version = "0.8.4"
15
+ version = "0.8.6"
16
16
 
17
17
  [project.license]
18
18
  text = "GPL-3.0"
@@ -20,49 +20,49 @@ text = "GPL-3.0"
20
20
  [project.optional-dependencies]
21
21
  full = [
22
22
  "rich>=14.0.0",
23
- "typer>=0.15.3",
23
+ "typer>=0.16.0",
24
24
  "pythonping>=1.1.4",
25
25
  "mongoengine>=0.29.1",
26
- "nicegui>=2.17.0",
27
- "uvicorn>=0.34.2",
26
+ "nicegui>=2.19.0",
27
+ "uvicorn>=0.34.3",
28
28
  "fastapi>=0.115.12",
29
- "starlette-admin[i18n]>=0.14.1",
29
+ "starlette-admin[i18n]>=0.15.1",
30
30
  "pillow>=11.2.1",
31
31
  "blinker>=1.9.0",
32
- "kombu>=5.5.3",
32
+ "kombu>=5.5.4",
33
33
  "nest-asyncio>=1.6.0",
34
- "sqlalchemy>=2.0.40",
34
+ "sqlalchemy>=2.0.41",
35
35
  ]
36
36
  rich = [
37
37
  "rich>=14.0.0",
38
38
  ]
39
39
  typer = [
40
- "typer>=0.15.3",
40
+ "typer>=0.16.0",
41
41
  ]
42
42
  mongoengine = [
43
43
  "mongoengine>=0.29.1",
44
44
  "blinker>=1.9.0",
45
45
  ]
46
46
  uvicorn = [
47
- "uvicorn>=0.34.2",
47
+ "uvicorn>=0.34.3",
48
48
  ]
49
49
  fastapi = [
50
50
  "fastapi>=0.115.12",
51
51
  ]
52
52
  nicegui = [
53
- "nicegui>=2.17.0",
53
+ "nicegui>=2.19.0",
54
54
  ]
55
55
  starlette-admin = [
56
- "starlette-admin[i18n]>=0.14.1",
56
+ "starlette-admin[i18n]>=0.15.1",
57
57
  "pillow>=11.2.1",
58
- "kombu>=5.5.3",
58
+ "kombu>=5.5.4",
59
59
  "nest-asyncio>=1.6.0",
60
60
  ]
61
61
  fuctions = [
62
62
  "pythonping>=1.1.4",
63
63
  ]
64
64
  sqlalchemy = [
65
- "sqlalchemy>=2.0.40",
65
+ "sqlalchemy>=2.0.41",
66
66
  ]
67
67
 
68
68
  [build-system]
@@ -1,4 +1,4 @@
1
- __version__ = "0.8.4"
1
+ __version__ = "0.8.6"
2
2
  TITLE = "wiederverwendbar"
3
3
  VERSION = __version__
4
4
  AUTHOR = "Julius Koenig"
@@ -0,0 +1,9 @@
1
+ from enum import Enum
2
+
3
+
4
+ def get_pretty_str(value):
5
+ if type(value) is str:
6
+ return f"'{value}'"
7
+ elif isinstance(value, Enum):
8
+ return get_pretty_str(value.value)
9
+ return f"{value}"
@@ -1,3 +1,4 @@
1
+ import logging
1
2
  from enum import Enum
2
3
 
3
4
 
@@ -12,3 +13,7 @@ class LogLevels(str, Enum):
12
13
  WARNING = "WARNING"
13
14
  INFO = "INFO"
14
15
  DEBUG = "DEBUG"
16
+
17
+ @property
18
+ def logging_level(self) -> int:
19
+ return getattr(logging, self.value)
@@ -1,15 +1,19 @@
1
1
  import json
2
+ import sys
3
+ from warnings import warn
2
4
  from pathlib import Path
3
- from typing import Any, Union
5
+ from typing import Any, Union, Literal
4
6
 
5
7
  from pydantic import BaseModel, create_model
6
8
 
9
+ from wiederverwendbar.warnings import FileNotFoundWarning
10
+
7
11
 
8
12
  class FileConfig(BaseModel):
9
13
  def __init__(self,
10
14
  file_path: Union[Path, str, None] = None,
11
15
  file_postfix: str = ".json",
12
- file_must_exist: bool = False,
16
+ file_must_exist: Union[bool, Literal["yes_print", "yes_warn", "yes_raise", "no"]] = "no",
13
17
  **overwrite_data: Any):
14
18
  if file_path is None:
15
19
  file_path = Path(Path.cwd() / self.__class__.__name__.lower()).with_suffix(file_postfix)
@@ -17,6 +21,7 @@ class FileConfig(BaseModel):
17
21
  file_path = Path(file_path)
18
22
  if file_path.suffix == "":
19
23
  file_path = file_path.with_suffix(file_postfix)
24
+ file_path = file_path.absolute()
20
25
 
21
26
  # read data from file
22
27
  if file_path.is_file():
@@ -25,8 +30,19 @@ class FileConfig(BaseModel):
25
30
  elif file_path.is_dir():
26
31
  raise ValueError(f"{self.__class__.__name__} file path '{file_path}' is a directory.")
27
32
  else:
28
- if file_must_exist:
29
- raise FileNotFoundError(f"{self.__class__.__name__} file '{file_path}' not found.")
33
+ if file_must_exist is True:
34
+ file_must_exist = "yes_raise"
35
+ elif file_must_exist is False:
36
+ file_must_exist = "no"
37
+ msg = f"{self.__class__.__name__} file '{file_path}' not found."
38
+ if file_must_exist == "yes_print":
39
+ print(msg)
40
+ sys.exit(1)
41
+ elif file_must_exist == "yes_warn":
42
+ warn(msg, FileNotFoundWarning)
43
+ sys.exit(1)
44
+ elif file_must_exist == "yes_raise":
45
+ raise FileNotFoundError(msg)
30
46
  data = {}
31
47
 
32
48
  # overwrite data
@@ -1,3 +1,4 @@
1
+ import warnings
1
2
  from typing import Any, Optional, Callable, Union, TYPE_CHECKING
2
3
 
3
4
  from sqlalchemy import inspect
@@ -6,6 +7,7 @@ from sqlalchemy.orm import Session, QueryableAttribute
6
7
  from sqlalchemy.orm.exc import DetachedInstanceError
7
8
 
8
9
  from wiederverwendbar.default import Default
10
+ from wiederverwendbar.functions.get_pretty_str import get_pretty_str
9
11
  from wiederverwendbar.sqlalchemy.raise_has_not_attr import raise_has_not_attr
10
12
 
11
13
  if TYPE_CHECKING:
@@ -141,7 +143,18 @@ class Base:
141
143
  super().__init__(*args, **kwargs)
142
144
 
143
145
  def __str__(self):
144
- return f"{self.__class__.__name__}({', '.join([f'{column_name}={getattr(self, column_name)}' for column_name in self.__str_columns__])})"
146
+ out = f"{self.__class__.__name__}("
147
+ for attr_name in self.__str_columns__:
148
+ if type(attr_name) is tuple:
149
+ attr_view_name = attr_name[0]
150
+ attr_name = attr_name[1]
151
+ else:
152
+ attr_view_name = attr_name
153
+ if not hasattr(self, attr_name):
154
+ warnings.warn(f"Attribute '{attr_name}' is not set for {self}.")
155
+ out += f"{attr_view_name}={get_pretty_str(getattr(self, attr_name))}, "
156
+ out = out[:-2] + ")"
157
+ return out
145
158
 
146
159
  def __repr__(self):
147
160
  return self.__str__()
@@ -247,7 +260,7 @@ class Base:
247
260
  @classmethod
248
261
  def new(cls,
249
262
  session: Optional[Session] = None,
250
- **kwargs) -> "Base":
263
+ **kwargs) -> Union["Base", Any]:
251
264
  session_created, session = cls.session(session=session)
252
265
 
253
266
  # noinspection PyArgumentList
@@ -279,7 +292,7 @@ class Base:
279
292
  @classmethod
280
293
  def get_all(cls,
281
294
  *criterion: Union[ColumnExpressionArgument[bool], bool],
282
- order_by: Union[str, QueryableAttribute, None] = None,
295
+ order_by: Union[str, QueryableAttribute, Any, None] = None,
283
296
  order_desc: bool = False,
284
297
  rows_per_page: Optional[int] = None,
285
298
  page: int = 1,
@@ -287,7 +300,7 @@ class Base:
287
300
  as_dict: bool = False,
288
301
  dict_columns: Union[list[DictColumn], Default] = Default(),
289
302
  session: Optional[Session] = None,
290
- **kwargs: Any) -> list[Union["Base", None, dict[str, Any]]]:
303
+ **kwargs: Any) -> list[Union["Base", None, dict[str, Any], Any]]:
291
304
  session_created, session = cls.session(session=session)
292
305
 
293
306
  # get order by
@@ -351,7 +364,7 @@ class Base:
351
364
  as_dict: bool = False,
352
365
  dict_columns: Union[list[DictColumn], Default] = Default(),
353
366
  session: Optional[Session] = None,
354
- **kwargs: Any) -> Union["Base", None, dict[str, Any]]:
367
+ **kwargs: Any) -> Union["Base", None, dict[str, Any], Any]:
355
368
  session_created, session = cls.session(session=session)
356
369
 
357
370
  if criterion:
@@ -42,7 +42,9 @@ class SqlalchemyDb:
42
42
  username: Optional[str] = None,
43
43
  password: Optional[str] = None,
44
44
  echo: Optional[bool] = None,
45
- sqlite_handle_foreign_keys: bool = True,
45
+ test_on_startup: Optional[bool] = None,
46
+ sqlite_check_if_file_exist: Optional[bool] = None,
47
+ sqlite_handle_foreign_keys: Optional[bool] = None,
46
48
  settings: Optional[SqlalchemySettings] = None):
47
49
  """
48
50
  Create a new Sqlalchemy Database
@@ -54,6 +56,8 @@ class SqlalchemyDb:
54
56
  :param username: User to connect to database
55
57
  :param password: Password to connect to database
56
58
  :param echo: Echo SQL queries to console
59
+ :param test_on_startup: Test the database connection on startup.
60
+ :param sqlite_check_if_file_exist: Check if SQLite file exists before connecting to it.
57
61
  :param sqlite_handle_foreign_keys: Enable SQLite Foreign Keys
58
62
  :param settings: Sqlalchemy Settings
59
63
  """
@@ -67,16 +71,24 @@ class SqlalchemyDb:
67
71
  self._username: Optional[str] = username or self.settings.db_username
68
72
  self._password: Optional[str] = password or self.settings.db_password
69
73
  self._echo: bool = echo or self.settings.db_echo
74
+ self._test_on_startup: bool = test_on_startup or self.settings.db_test_on_startup
75
+ self._sqlite_check_if_file_exist: bool = sqlite_check_if_file_exist or self.settings.db_sqlite_check_if_file_exist
70
76
  self._sqlite_handle_foreign_keys: bool = sqlite_handle_foreign_keys or self.settings.db_sqlite_handle_foreign_keys
71
77
 
72
78
  logger.debug(f"Create {self}")
73
79
 
74
80
  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)
77
- self.session_maker = sessionmaker(bind=self.engine)
78
- self.Base: DeclarativeMeta = declarative_base(metaclass=DeclarativeMeta)
79
- self.session_maker.configure(binds={self.Base: self.engine})
81
+ if self.protocol == "sqlite":
82
+ if self.sqlite_check_if_file_exist:
83
+ self.listen("connect", self._sqlite_check_if_file_exist_func)
84
+ if self.sqlite_handle_foreign_keys:
85
+ self.listen("connect", self._sqlite_handle_foreign_keys_func)
86
+ self._session_maker = sessionmaker(bind=self.engine)
87
+ self._Base: DeclarativeMeta = declarative_base(metaclass=DeclarativeMeta)
88
+ self.session_maker.configure(binds={self._Base: self.engine})
89
+
90
+ if self.test_on_startup:
91
+ self.test()
80
92
 
81
93
  def __str__(self):
82
94
  return f"{self.__class__.__name__}({self.connection_string_printable})"
@@ -117,10 +129,27 @@ class SqlalchemyDb:
117
129
  def echo(self) -> bool:
118
130
  return self._echo
119
131
 
132
+ @property
133
+ def test_on_startup(self) -> bool:
134
+ return self._test_on_startup
135
+
136
+ @property
137
+ def sqlite_check_if_file_exist(self) -> bool:
138
+ return self._sqlite_check_if_file_exist
139
+
120
140
  @property
121
141
  def sqlite_handle_foreign_keys(self) -> bool:
122
142
  return self._sqlite_handle_foreign_keys
123
143
 
144
+ @property
145
+ def session_maker(self) -> sessionmaker:
146
+ return self._session_maker
147
+
148
+ # noinspection PyPep8Naming
149
+ @property
150
+ def Base(self) -> Any:
151
+ return self._Base
152
+
124
153
  def get_connection_string(self, printable: bool = False) -> str:
125
154
  """
126
155
  Get the Connection String
@@ -173,6 +202,10 @@ class SqlalchemyDb:
173
202
 
174
203
  return self.get_connection_string(printable=True)
175
204
 
205
+ def test(self):
206
+ self.engine.connect()
207
+ print()
208
+
176
209
  def create_all(self,
177
210
  tables: Optional[Sequence[Table]] = None,
178
211
  check_first: bool = True) -> None:
@@ -231,8 +264,13 @@ class SqlalchemyDb:
231
264
 
232
265
  return event.listens_for(self.engine, identifier, *args, **kw)
233
266
 
234
- @classmethod
235
- def _sqlite_set_handle_foreign_keys(cls, connection, _connection_record):
267
+ def _sqlite_check_if_file_exist_func(self, connection, _connection_record):
268
+ if self.file is not None:
269
+ if not self.file.is_file():
270
+ raise FileNotFoundError(f"Database file does not exist: {self.file}")
271
+
272
+ # noinspection PyMethodMayBeStatic
273
+ def _sqlite_handle_foreign_keys_func(self, connection, _connection_record):
236
274
  if not isinstance(connection, sqlite3.Connection):
237
275
  raise RuntimeError(f"Connection is not a sqlite3.Connection: {connection}")
238
276
  cursor = connection.cursor()
@@ -34,6 +34,12 @@ 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_test_on_startup: bool = Field(default=True,
38
+ title="Test Database on Startup",
39
+ description="Test database connection on startup")
40
+ db_sqlite_check_if_file_exist: bool = Field(default=True,
41
+ title="Database SQLite Check If File Exist",
42
+ description="Check if file exists in SQLite")
37
43
  db_sqlite_handle_foreign_keys: bool = Field(default=True,
38
44
  title="Database SQLite Handle Foreign Keys",
39
45
  description="Handle foreign keys in SQLite")
@@ -59,16 +59,13 @@ class Task:
59
59
  raise ValueError("Manager object is required.")
60
60
  manager.add_task(self)
61
61
 
62
- def __str__(self):
63
- return f"{self.manager.name}.{self.name}"
64
-
65
62
  def init(self, manager):
66
63
  self.manager = manager
67
64
  self.trigger.init(manager)
68
65
  self.set_next_run()
69
66
 
70
67
  # log task creation
71
- self.manager.logger.debug(f"{self}: Task created.")
68
+ self.manager.logger.debug(f"Task created.")
72
69
 
73
70
  @property
74
71
  def last_run(self) -> Optional[datetime]:
@@ -8,9 +8,6 @@ from typing import Any, Optional
8
8
  from wiederverwendbar.task_manger.task import Task
9
9
  from wiederverwendbar.task_manger.trigger import Trigger
10
10
 
11
- LOGGER = logging.getLogger(__name__)
12
-
13
-
14
11
  class TaskManager:
15
12
  lock = threading.Lock()
16
13
 
@@ -20,7 +17,8 @@ class TaskManager:
20
17
  daemon: bool = False,
21
18
  keep_done_tasks: bool = False,
22
19
  loop_delay: Optional[float] = None,
23
- logger: Optional[logging.Logger] = None):
20
+ logger: Optional[logging.Logger] = None,
21
+ log_self: bool = True):
24
22
  if name is None:
25
23
  name = self.__class__.__name__
26
24
  self.name = name
@@ -29,7 +27,7 @@ class TaskManager:
29
27
  self._stopped: bool = False
30
28
  self._creation_time: datetime = datetime.now()
31
29
  self._keep_done_tasks = keep_done_tasks
32
- self.logger = logger or LOGGER
30
+ self.logger = logger or logging.getLogger(self.name)
33
31
 
34
32
  # create workers
35
33
  if worker_count is None:
@@ -48,9 +46,6 @@ class TaskManager:
48
46
  loop_delay = 0.001
49
47
  self._loop_delay = loop_delay
50
48
 
51
- def __str__(self):
52
- return f"{self.__class__.__name__}({self.name})"
53
-
54
49
  def __del__(self):
55
50
  if not self.stopped:
56
51
  self.stop()
@@ -96,14 +91,14 @@ class TaskManager:
96
91
  :return: None
97
92
  """
98
93
 
99
- self.logger.debug(f"{self}: Starting manager ...")
94
+ self.logger.debug(f"Starting manager ...")
100
95
 
101
96
  # start workers
102
97
  for worker in self._workers:
103
- self.logger.debug(f"{self}: Starting worker '{worker.name}' ...")
98
+ self.logger.debug(f"Starting worker '{worker.name}' ...")
104
99
  worker.start()
105
100
 
106
- self.logger.debug(f"{self}: Manager started.")
101
+ self.logger.debug(f"Manager started.")
107
102
 
108
103
  def stop(self) -> None:
109
104
  """
@@ -112,7 +107,7 @@ class TaskManager:
112
107
  :return: None
113
108
  """
114
109
 
115
- self.logger.debug(f"{self}: Stopping manager ...")
110
+ self.logger.debug(f"Stopping manager ...")
116
111
 
117
112
  # set stopped flag
118
113
  with self.lock:
@@ -121,10 +116,10 @@ class TaskManager:
121
116
  # wait for workers to finish
122
117
  for worker in self._workers:
123
118
  if worker.is_alive():
124
- self.logger.debug(f"{self}: Waiting for worker '{worker.name}' to finish ...")
119
+ self.logger.debug(f"Waiting for worker '{worker.name}' to finish ...")
125
120
  worker.join()
126
121
 
127
- self.logger.debug(f"{self}: Manager stopped.")
122
+ self.logger.debug(f"Manager stopped.")
128
123
 
129
124
  def loop(self, stay_in_loop: Optional[bool] = None) -> None:
130
125
  """
@@ -155,7 +150,7 @@ class TaskManager:
155
150
  time.sleep(loop_delay)
156
151
  continue
157
152
 
158
- self.logger.debug(f"{self}: Running task '{current_task}' ...")
153
+ self.logger.debug(f"Running task '{current_task.name}' ...")
159
154
 
160
155
  with self.lock:
161
156
  if current_task.time_measurement_before_run:
@@ -165,7 +160,7 @@ class TaskManager:
165
160
  # run task
166
161
  current_task.payload()
167
162
 
168
- self.logger.debug(f"{self}: Task '{current_task}' successfully run.")
163
+ self.logger.debug(f"Task '{current_task.name}' successfully run.")
169
164
 
170
165
  with self.lock:
171
166
  if not current_task.time_measurement_before_run:
@@ -174,7 +169,7 @@ class TaskManager:
174
169
  if not current_task.is_done:
175
170
  self._tasks.append(current_task)
176
171
  else:
177
- self.logger.debug(f"{self}: Task '{current_task}' is done.")
172
+ self.logger.debug(f"Task '{current_task.name}' is done.")
178
173
  if self._keep_done_tasks:
179
174
  self._tasks.append(current_task)
180
175
 
@@ -192,7 +187,7 @@ class TaskManager:
192
187
  task.init(self)
193
188
  with self.lock:
194
189
  self._tasks.append(task)
195
- self.logger.debug(f"{self}: Task '{task}' added.")
190
+ self.logger.debug(f"Task '{task.name}' added.")
196
191
 
197
192
  def remove_task(self, task: Task):
198
193
  """
@@ -204,7 +199,7 @@ class TaskManager:
204
199
 
205
200
  with self.lock:
206
201
  self._tasks.remove(task)
207
- self.logger.debug(f"{self}: Task '{task}' removed.")
202
+ self.logger.debug(f"Task '{task.name}' removed.")
208
203
 
209
204
  def task(self,
210
205
  name: Optional[str] = None,
@@ -0,0 +1,6 @@
1
+ class WiederverwendbarWarning(Warning):
2
+ ...
3
+
4
+
5
+ class FileNotFoundWarning(WiederverwendbarWarning):
6
+ ...