ul-api-utils 10.0.0.dev4__tar.gz → 10.0.0.dev6__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 (146) hide show
  1. {ul_api_utils-10.0.0.dev4/ul_api_utils.egg-info → ul_api_utils-10.0.0.dev6}/PKG-INFO +7 -3
  2. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/pyproject.toml +5 -3
  3. ul_api_utils-10.0.0.dev6/setup.py +94 -0
  4. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/api_resource/api_resource_fn_typing.py +10 -1
  5. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/commands/cmd_start.py +4 -2
  6. ul_api_utils-10.0.0.dev6/ul_api_utils/commands/start/gunicorn.conf.local.py +40 -0
  7. ul_api_utils-10.0.0.dev6/ul_api_utils/commands/start/gunicorn.conf.py +53 -0
  8. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/const.py +5 -5
  9. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/modules/api_sdk.py +0 -7
  10. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/modules/api_sdk_config.py +0 -6
  11. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6/ul_api_utils.egg-info}/PKG-INFO +7 -3
  12. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils.egg-info/SOURCES.txt +1 -0
  13. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils.egg-info/requires.txt +3 -2
  14. ul_api_utils-10.0.0.dev4/ul_api_utils/commands/start/gunicorn.conf.local.py +0 -0
  15. ul_api_utils-10.0.0.dev4/ul_api_utils/commands/start/gunicorn.conf.py +0 -26
  16. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/LICENSE +0 -0
  17. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/README.md +0 -0
  18. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/setup.cfg +0 -0
  19. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/__init__.py +0 -0
  20. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/access/__init__.py +0 -0
  21. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/api_resource/__init__.py +0 -0
  22. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/api_resource/api_request.py +0 -0
  23. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/api_resource/api_resource.py +0 -0
  24. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/api_resource/api_resource_config.py +0 -0
  25. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/api_resource/api_resource_error_handling.py +0 -0
  26. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/api_resource/api_resource_type.py +0 -0
  27. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/api_resource/api_response.py +0 -0
  28. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/api_resource/api_response_db.py +0 -0
  29. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/api_resource/api_response_payload_alias.py +0 -0
  30. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/api_resource/db_types.py +0 -0
  31. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/api_resource/signature_check.py +0 -0
  32. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/commands/__init__.py +0 -0
  33. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/commands/cmd_enc_keys.py +0 -0
  34. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/commands/cmd_gen_api_user_token.py +0 -0
  35. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/commands/cmd_gen_new_api_user.py +0 -0
  36. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/commands/cmd_generate_api_docs.py +0 -0
  37. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/commands/cmd_worker_start.py +0 -0
  38. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/commands/start/__init__.py +0 -0
  39. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/commands/start/wsgi.py +0 -0
  40. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/conf/ul-debugger-main.js +0 -0
  41. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/conf/ul-debugger-ui.js +0 -0
  42. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/conf.py +0 -0
  43. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/debug/__init__.py +0 -0
  44. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/debug/debugger.py +0 -0
  45. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/debug/malloc.py +0 -0
  46. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/debug/stat.py +0 -0
  47. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/encrypt/__init__.py +0 -0
  48. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/encrypt/encrypt_decrypt_abstract.py +0 -0
  49. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/encrypt/encrypt_decrypt_aes_xtea.py +0 -0
  50. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/errors.py +0 -0
  51. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/internal_api/__init__.py +0 -0
  52. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/internal_api/__tests__/__init__.py +0 -0
  53. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/internal_api/__tests__/internal_api.py +0 -0
  54. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/internal_api/__tests__/internal_api_content_type.py +0 -0
  55. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/internal_api/internal_api.py +0 -0
  56. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/internal_api/internal_api_check_context.py +0 -0
  57. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/internal_api/internal_api_error.py +0 -0
  58. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/internal_api/internal_api_response.py +0 -0
  59. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/main.py +0 -0
  60. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/modules/__init__.py +0 -0
  61. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/modules/__tests__/__init__.py +0 -0
  62. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/modules/__tests__/test_api_sdk_jwt.py +0 -0
  63. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/modules/api_sdk_jwt.py +0 -0
  64. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/modules/intermediate_state.py +0 -0
  65. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/modules/worker_context.py +0 -0
  66. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/modules/worker_sdk.py +0 -0
  67. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/modules/worker_sdk_config.py +0 -0
  68. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/py.typed +0 -0
  69. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/__init__.py +0 -0
  70. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/caching.py +0 -0
  71. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/debugger_scripts.py +0 -0
  72. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/health_check/__init__.py +0 -0
  73. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/health_check/const.py +0 -0
  74. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/health_check/health_check.py +0 -0
  75. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/health_check/health_check_template.py +0 -0
  76. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/health_check/resource.py +0 -0
  77. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/not_implemented.py +0 -0
  78. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/permissions.py +0 -0
  79. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/rate_limitter.py +0 -0
  80. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/socketio.py +0 -0
  81. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/swagger.py +0 -0
  82. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/web_forms/__init__.py +0 -0
  83. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/web_forms/custom_fields/__init__.py +0 -0
  84. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/web_forms/custom_fields/custom_checkbox_select.py +0 -0
  85. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/web_forms/custom_widgets/__init__.py +0 -0
  86. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/web_forms/custom_widgets/custom_select_widget.py +0 -0
  87. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/web_forms/custom_widgets/custom_text_input_widget.py +0 -0
  88. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/resources/web_forms/uni_form.py +0 -0
  89. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/sentry.py +0 -0
  90. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/__init__.py +0 -0
  91. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/__tests__/__init__.py +0 -0
  92. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/__tests__/api_path_version.py +0 -0
  93. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/__tests__/unwrap_typing.py +0 -0
  94. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/api_encoding.py +0 -0
  95. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/api_format.py +0 -0
  96. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/api_method.py +0 -0
  97. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/api_pagination.py +0 -0
  98. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/api_path_version.py +0 -0
  99. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/api_request_info.py +0 -0
  100. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/avro.py +0 -0
  101. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/broker_topics_message_count.py +0 -0
  102. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/cached_per_request.py +0 -0
  103. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/colors.py +0 -0
  104. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/constants.py +0 -0
  105. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/decode_base64.py +0 -0
  106. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/deprecated.py +0 -0
  107. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/flags.py +0 -0
  108. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/flask_swagger_generator/__init__.py +0 -0
  109. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/flask_swagger_generator/conf.py +0 -0
  110. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/flask_swagger_generator/exceptions.py +0 -0
  111. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/flask_swagger_generator/specifiers/__init__.py +0 -0
  112. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_models.py +0 -0
  113. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_specifier.py +0 -0
  114. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_three_specifier.py +0 -0
  115. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/flask_swagger_generator/specifiers/swagger_version.py +0 -0
  116. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/flask_swagger_generator/utils/__init__.py +0 -0
  117. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/flask_swagger_generator/utils/input_type.py +0 -0
  118. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/flask_swagger_generator/utils/parameter_type.py +0 -0
  119. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/flask_swagger_generator/utils/replace_in_dict.py +0 -0
  120. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/flask_swagger_generator/utils/request_type.py +0 -0
  121. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/flask_swagger_generator/utils/schema_type.py +0 -0
  122. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/flask_swagger_generator/utils/security_type.py +0 -0
  123. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/imports.py +0 -0
  124. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/instance_checks.py +0 -0
  125. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/jinja/__init__.py +0 -0
  126. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/jinja/t_url_for.py +0 -0
  127. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/jinja/to_pretty_json.py +0 -0
  128. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/json_encoder.py +0 -0
  129. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/load_modules.py +0 -0
  130. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/memory_db/__init__.py +0 -0
  131. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/memory_db/__tests__/__init__.py +0 -0
  132. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/memory_db/errors.py +0 -0
  133. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/memory_db/repository.py +0 -0
  134. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/token_check.py +0 -0
  135. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/token_check_through_request.py +0 -0
  136. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/unwrap_typing.py +0 -0
  137. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/utils/uuid_converter.py +0 -0
  138. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/validators/__init__.py +0 -0
  139. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/validators/__tests__/__init__.py +0 -0
  140. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/validators/__tests__/test_custom_fields.py +0 -0
  141. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/validators/custom_fields.py +0 -0
  142. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/validators/validate_empty_object.py +0 -0
  143. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils/validators/validate_uuid.py +0 -0
  144. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils.egg-info/dependency_links.txt +0 -0
  145. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils.egg-info/entry_points.txt +0 -0
  146. {ul_api_utils-10.0.0.dev4 → ul_api_utils-10.0.0.dev6}/ul_api_utils.egg-info/top_level.txt +0 -0
@@ -1,9 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ul_api_utils
3
- Version: 10.0.0.dev4
3
+ Version: 10.0.0.dev6
4
4
  Summary: Python api utils
5
5
  Author: Unic-lab
6
+ Author-email:
6
7
  License: MIT
8
+ Platform: any
7
9
  Classifier: Intended Audience :: Developers
8
10
  Classifier: License :: OSI Approved :: MIT License
9
11
  Classifier: Programming Language :: Python
@@ -12,9 +14,9 @@ Classifier: Operating System :: OS Independent
12
14
  Requires-Python: >=3.14
13
15
  Description-Content-Type: text/markdown
14
16
  License-File: LICENSE
15
- Requires-Dist: ul-db-utils==6.0.0.dev2
17
+ Requires-Dist: ul-db-utils==6.0.0.dev3
16
18
  Requires-Dist: ul-py-tool==3.0.2.dev1
17
- Requires-Dist: ul-unipipeline>=3.0.2.dev0
19
+ Requires-Dist: ul-unipipeline>=3.0.2.dev1
18
20
  Requires-Dist: frozendict>=2.4.4
19
21
  Requires-Dist: jinja2>=3.1.6
20
22
  Requires-Dist: flask>=3.1.0
@@ -27,6 +29,7 @@ Requires-Dist: pyjwt>=2.10.1
27
29
  Requires-Dist: gunicorn>=23.0.0
28
30
  Requires-Dist: gevent>=25.9.1
29
31
  Requires-Dist: gevent-websocket>=0.10.1
32
+ Requires-Dist: psycogreen>=1.0.2
30
33
  Requires-Dist: flask-socketio>=5.5.1
31
34
  Requires-Dist: pyyaml>=6.0
32
35
  Requires-Dist: requests>=2.31.0
@@ -49,6 +52,7 @@ Requires-Dist: wtforms-alchemy>=0.18.0
49
52
  Provides-Extra: dev
50
53
  Requires-Dist: uv-script>=0.1.9; extra == "dev"
51
54
  Dynamic: license-file
55
+ Dynamic: platform
52
56
 
53
57
  # Generic library api-utils
54
58
 
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
7
7
 
8
8
  [project]
9
9
  name = "ul_api_utils"
10
- version = "10.0.0.dev4"
10
+ version = "10.0.0.dev6"
11
11
  description = "Python api utils"
12
12
  readme = "README.md"
13
13
  license = { text = "MIT" }
@@ -21,9 +21,10 @@ classifiers = [
21
21
  "Operating System :: OS Independent",
22
22
  ]
23
23
  dependencies = [
24
- "ul-db-utils==6.0.0.dev2",
24
+ "ul-db-utils==6.0.0.dev3",
25
25
  "ul-py-tool==3.0.2.dev1",
26
- "ul-unipipeline>=3.0.2.dev0",
26
+ "ul-unipipeline>=3.0.2.dev1",
27
+
27
28
  "frozendict>=2.4.4",
28
29
  "jinja2>=3.1.6",
29
30
  "flask>=3.1.0",
@@ -36,6 +37,7 @@ dependencies = [
36
37
  "gunicorn>=23.0.0",
37
38
  "gevent>=25.9.1",
38
39
  "gevent-websocket>=0.10.1",
40
+ "psycogreen>=1.0.2",
39
41
  "flask-socketio>=5.5.1",
40
42
  "pyyaml>=6.0",
41
43
  "requests>=2.31.0",
@@ -0,0 +1,94 @@
1
+ from os import path
2
+ from setuptools import setup, find_packages
3
+
4
+ HERE = path.abspath(path.dirname(__file__))
5
+
6
+ with open(path.join(HERE, 'README.md'), encoding='utf-8') as f:
7
+ long_description = f.read()
8
+
9
+
10
+ setup(
11
+ name='ul_api_utils',
12
+ version='9.4.0',
13
+ description='Python api utils',
14
+ author='Unic-lab',
15
+ long_description=long_description,
16
+ long_description_content_type="text/markdown",
17
+ author_email='',
18
+ packages=find_packages(),
19
+ package_data={
20
+ "ul_api_utils": [
21
+ 'py.typed',
22
+ "utils/flask_swagger_ui/templates/*.html",
23
+ "utils/flask_swagger_ui/static/*.html",
24
+ "utils/flask_swagger_ui/static/*.js",
25
+ "utils/flask_swagger_ui/static/*.css",
26
+ "utils/flask_swagger_ui/static/*.png",
27
+ "utils/flask_swagger_ui/static/*.map",
28
+ "conf/ul-debugger-main.js",
29
+ "conf/ul-debugger-ui.js",
30
+ ],
31
+ },
32
+ entry_points={
33
+ "console_scripts": [
34
+ 'ulapiutls=ul_api_utils.main:main',
35
+ ],
36
+ },
37
+ include_package_data=True,
38
+ license="MIT",
39
+ classifiers=[
40
+ "Intended Audience :: Developers",
41
+ "License :: OSI Approved :: MIT License",
42
+ "Programming Language :: Python",
43
+ "Programming Language :: Python :: 3.8",
44
+ "Programming Language :: Python :: 3.9",
45
+ "Programming Language :: Python :: 3.10",
46
+ "Operating System :: OS Independent",
47
+ ],
48
+ platforms='any',
49
+ install_requires=[
50
+ "ul-unipipeline==2.0.6",
51
+ "jinja2==3.1.6",
52
+ "flask==3.1.0",
53
+ "flask-wtf==1.2.2",
54
+ "flask-limiter==3.10.1",
55
+ "flask-caching==2.3.1",
56
+ "flask-swagger-ui==4.11.1",
57
+ "flask-monitoringdashboard>=5.0.0",
58
+ "pycryptodome==3.21.0",
59
+ "pyjwt==2.10.1",
60
+ "gunicorn==23.0.0",
61
+ "gevent==24.11.1",
62
+ "gevent-websocket==0.10.1",
63
+ "psycogreen==1.0.2",
64
+ "pyyaml==6.0",
65
+ "requests>=2.32.0",
66
+ "cryptography==44.0.2",
67
+ "colored==1.4.3",
68
+ "flask-socketio==5.5.1",
69
+ "ormsgpack==1.8.0",
70
+ "msgpack==1.1.0",
71
+ "msgpack-types==0.5.0",
72
+ "fastavro==1.10.0",
73
+ "factory-boy==3.3.0",
74
+ "sentry-sdk[flask]==2.22.0",
75
+ "faker==37.0.0",
76
+ "types-requests==2.32.0.20250306",
77
+ "types-jinja2==2.11.9",
78
+ "xlsxwriter==3.2.2",
79
+ "werkzeug==3.1.3",
80
+ "frozendict==2.4.4",
81
+ "wtforms==3.0.1",
82
+ "wtforms-alchemy==0.18.0",
83
+ "pathvalidate==3.2.3",
84
+
85
+ # "opentelemetry-sdk==1.8.0",
86
+ # "opentelemetry-api==1.8.0",
87
+ # "opentelemetry-instrumentation-flask==0.27b0",
88
+ # "opentelemetry-instrumentation-requests==0.27b0",
89
+ # "opentelemetry-exporter-jaeger==1.8.0",
90
+ # "opentelemetry-instrumentation-sqlalchemy==0.27b0",
91
+ # "ul-db-utils==5.1.0", # ACTUALIZE, BUT DO NOT UNCOMMENT PLEASE
92
+ # "ul-py-tool==2.1.4", # ACTUALIZE, BUT DO NOT UNCOMMENT PLEASE
93
+ ],
94
+ )
@@ -3,7 +3,6 @@ from typing import NamedTuple, Any, Callable, Optional, List, Dict, Type, Tuple,
3
3
 
4
4
  from flask import request
5
5
  from pydantic import BaseModel, ValidationError, validate_call, TypeAdapter, RootModel
6
- from pydantic.v1.utils import deep_update
7
6
  from pydantic_core import ErrorDetails
8
7
 
9
8
  from ul_api_utils.api_resource.api_request import ApiRequestQuery
@@ -25,6 +24,16 @@ if TYPE_CHECKING:
25
24
  FN_SYSTEM_PROPS = {"api_resource", "query", "body", "return", "body_validation_error", "query_validation_error"}
26
25
 
27
26
 
27
+ def deep_update(mapping: Dict[str, Any], updating_mapping: Dict[str, Any]) -> Dict[str, Any]:
28
+ updated_mapping = mapping.copy()
29
+ for k, v in updating_mapping.items():
30
+ if k in updated_mapping and isinstance(updated_mapping[k], dict) and isinstance(v, dict):
31
+ updated_mapping[k] = deep_update(updated_mapping[k], v)
32
+ else:
33
+ updated_mapping[k] = v
34
+ return updated_mapping
35
+
36
+
28
37
  def _is_complex_type(annotation: Any) -> bool:
29
38
  origin = get_origin(annotation)
30
39
 
@@ -55,7 +55,7 @@ class CmdStart(Cmd):
55
55
  parser.add_argument('--debug', dest='debug', type=arg_str2bool, default=False, required=False)
56
56
  parser.add_argument('--max-requests', dest='max_requests', type=int, default=1000, required=False)
57
57
  parser.add_argument('--max-requests-jitter', dest='max_requests_jitter', type=int, default=50, required=False)
58
- parser.add_argument('--worker-class', dest='worker_class', type=str, default='sync', required=False)
58
+ parser.add_argument('--worker-class', dest='worker_class', type=str, default='gevent', required=False)
59
59
  parser.add_argument('--statsd_endpoint', dest='statsd_endpoint', type=str, default=None, required=False)
60
60
  parser.add_argument('--statsd_prefix', dest='statsd_prefix', type=str, default=None, required=False)
61
61
  parser.add_argument('--freeze-gc', dest='freeze_gc', type=bool, default=False, required=False)
@@ -77,8 +77,10 @@ class CmdStart(Cmd):
77
77
  assert len(APPLICATION_GUNICORN_WORKERS) > 0
78
78
 
79
79
  debug = (self.debug and self.env == ENV_LOCAL)
80
+
80
81
  local_conf = os.path.abspath(os.path.normpath(os.path.join(THIS_LIB_CWD, "commands", "start", "gunicorn.conf.local.py")))
81
82
  prod_conf = os.path.abspath(os.path.normpath(os.path.join(THIS_LIB_CWD, "commands", "start", "gunicorn.conf.py")))
83
+
82
84
  gunicorn_config = prod_conf if self.freeze_gc and not debug else local_conf
83
85
 
84
86
  args = [
@@ -94,7 +96,7 @@ class CmdStart(Cmd):
94
96
  '--access-logfile=-',
95
97
  '--error-logfile=-',
96
98
  '--disable-redirect-access-to-syslog',
97
- *(['--reload'] if debug else ['--preload']),
99
+ *(['--reload'] if debug else ([] if self.worker_class.lower().startswith('gevent') else ['--preload'])), # gevent workers do monkey-patching in init_process; --preload loads app in master before that
98
100
  f'{self.app_module}:{self.app_name}',
99
101
  ]
100
102
 
@@ -0,0 +1,40 @@
1
+ import gc
2
+ from typing import Any
3
+
4
+ from ul_py_tool.utils.write_stdout import write_stdout
5
+
6
+ try:
7
+ import gevent.monkey # type: ignore
8
+ _gevent_available = True
9
+ except ImportError:
10
+ _gevent_available = False
11
+
12
+
13
+ def post_fork(server: Any, worker: Any) -> None:
14
+ """
15
+ Called just after a worker has been forked.
16
+ Applies gevent monkey-patching so that all stdlib I/O is cooperative
17
+ from the very start of the worker process (local / debug mode).
18
+ https://docs.gunicorn.org/en/20.1.0/settings.html?highlight=preload#post-fork
19
+ """
20
+ if _gevent_available and not gevent.monkey.is_module_patched('os'):
21
+ gevent.monkey.patch_all()
22
+ write_stdout("gevent monkey-patching applied for worker", worker.pid)
23
+ write_stdout("Enabling GC for worker", worker.pid)
24
+ gc.enable()
25
+
26
+
27
+ def post_worker_init(worker: Any) -> None:
28
+ """
29
+ Called just after a worker has been initialized (inside the worker process).
30
+ Patches psycopg2 to use a gevent-friendly wait callback so that database I/O
31
+ through libpq (C extension) yields to the gevent event loop instead of blocking.
32
+ https://docs.gunicorn.org/en/stable/settings.html#post-worker-init
33
+ """
34
+ if _gevent_available and gevent.monkey.is_module_patched('socket'):
35
+ try:
36
+ from psycogreen.gevent import patch_psycopg # type: ignore
37
+ patch_psycopg()
38
+ write_stdout("psycogreen patch applied for worker", worker.pid)
39
+ except ImportError:
40
+ pass
@@ -0,0 +1,53 @@
1
+ import gc
2
+ from typing import Any
3
+
4
+ from ul_py_tool.utils.write_stdout import write_stdout
5
+
6
+ try:
7
+ import gevent.monkey # type: ignore
8
+ _gevent_available = True
9
+ except ImportError:
10
+ _gevent_available = False
11
+
12
+
13
+ def when_ready(server: Any) -> None:
14
+ """
15
+ Use only with --preload option.
16
+ Called just after the server is started.
17
+ Freeze garbage collector objects after preloading the application.
18
+ https://docs.gunicorn.org/en/20.1.0/settings.html?highlight=preload#when-ready
19
+ """
20
+ gc.freeze()
21
+ write_stdout("Objects frozen in permanent generation: ", gc.get_freeze_count())
22
+
23
+
24
+ def post_fork(server: Any, worker: Any) -> None:
25
+ """
26
+ Works only with --preload.
27
+ Called just after a worker has been forked.
28
+ Enable garbage collection on each worker if it's not enabled for some reason.
29
+ Also applies gevent monkey-patching when using a gevent-based worker class so
30
+ that all stdlib I/O is cooperative from the very start of the worker process.
31
+ https://docs.gunicorn.org/en/20.1.0/settings.html?highlight=preload#post-fork
32
+ """
33
+ if _gevent_available and not gevent.monkey.is_module_patched('os'):
34
+ gevent.monkey.patch_all()
35
+ write_stdout("gevent monkey-patching applied for worker", worker.pid)
36
+ write_stdout("Enabling GC for worker", worker.pid)
37
+ gc.enable()
38
+
39
+
40
+ def post_worker_init(worker: Any) -> None:
41
+ """
42
+ Called just after a worker has been initialized (inside the worker process).
43
+ Patches psycopg2 to use a gevent-friendly wait callback so that database I/O
44
+ through libpq (C extension) yields to the gevent event loop instead of blocking.
45
+ https://docs.gunicorn.org/en/stable/settings.html#post-worker-init
46
+ """
47
+ if _gevent_available and gevent.monkey.is_module_patched('socket'):
48
+ try:
49
+ from psycogreen.gevent import patch_psycopg # type: ignore
50
+ patch_psycopg()
51
+ write_stdout("psycogreen patch applied for worker", worker.pid)
52
+ except ImportError:
53
+ pass
@@ -68,11 +68,11 @@ INTERNAL_API__DEFAULT_PATH_PREFIX = '/api'
68
68
 
69
69
  AUTO_GZIP_THRESHOLD_LENGTH = 1000
70
70
 
71
- CRON_EXPRESSION_VALIDATION_REGEX = "(^((\*\/)?([0-5]?[0-9])((\,|\-|\/)([0-5]?[0-9]))*|\*)\s+((\*\/)?((2[0-3]|1[0-9]|[0-9]|00))" \
72
- "((\,|\-|\/)(2[0-3]|1[0-9]|[0-9]|00))*|\*)\s+((\*\/)?([1-9]|[12][0-9]|3[01])((\,|\-|\/)" \
73
- "([1-9]|[12][0-9]|3[01]))*|\*)\s+((\*\/)?([1-9]|1[0-2])((\,|\-|\/)" \
74
- "([1-9]|1[0-2]))*|\*|(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|des))\s+((\*\/)?[0-6]" \
75
- "((\,|\-|\/)[0-6])*|\*|00|(sun|mon|tue|wed|thu|fri|sat))\s*$)|@(annually|yearly|monthly|weekly|daily|hourly|reboot)" # noqa
71
+ CRON_EXPRESSION_VALIDATION_REGEX = (r"(^((\*\/)?([0-5]?[0-9])((\,|\-|\/)([0-5]?[0-9]))*|\*)\s+((\*\/)?((2[0-3]|1[0-9]|[0-9]|00))"
72
+ r"((\,|\-|\/)(2[0-3]|1[0-9]|[0-9]|00))*|\*)\s+((\*\/)?([1-9]|[12][0-9]|3[01])((\,|\-|\/)"
73
+ r"([1-9]|[12][0-9]|3[01]))*|\*)\s+((\*\/)?([1-9]|1[0-2])((\,|\-|\/)"
74
+ r"([1-9]|1[0-2]))*|\*|(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|des))\s+((\*\/)?[0-6]"
75
+ r"((\,|\-|\/)[0-6])*|\*|00|(sun|mon|tue|wed|thu|fri|sat))\s*$)|@(annually|yearly|monthly|weekly|daily|hourly|reboot)") # noqa
76
76
 
77
77
  MAX_UTC_OFFSET_SECONDS = 50400
78
78
  MIN_UTC_OFFSET_SECONDS = -43200
@@ -194,13 +194,6 @@ class ApiSdk:
194
194
  if APPLICATION_DEBUG:
195
195
  arg_files_print(1000, route_files, ignored_files=ignored_route_files, name='files loaded')
196
196
 
197
- if (plugins_config := self.config.flask_debugging_plugins) is not None:
198
- if plugins_config.flask_monitoring_dashboard:
199
- import flask_monitoringdashboard as dashboard # type: ignore
200
- if os.environ.get('FLASK_MONITORING_DASHBOARD_CONFIG'):
201
- dashboard.config.init_from(envvar='FLASK_MONITORING_DASHBOARD_CONFIG', log_verbose=True)
202
- dashboard.bind(self._flask_app)
203
-
204
197
  load_permissions(self, self._initialized_flask_name, self._config.permissions)
205
198
 
206
199
  load_debugger_static_scripts(self)
@@ -26,10 +26,6 @@ class ApiSdkHttpAuth(BaseModel):
26
26
  scheme: str = 'Basic'
27
27
 
28
28
 
29
- class ApiSdkFlaskDebuggingPluginsEnabled(BaseModel):
30
- flask_monitoring_dashboard: bool = False
31
-
32
-
33
29
  class ApiSdkConfig(BaseModel):
34
30
  service_name: str
35
31
  permissions: Optional[Union[Callable[[], PermissionRegistry], PermissionRegistry]] = None
@@ -52,8 +48,6 @@ class ApiSdkConfig(BaseModel):
52
48
  cache_storage_uri: str = '' # supports only redis
53
49
  cache_default_ttl: int = 60 # seconds
54
50
 
55
- flask_debugging_plugins: Optional[ApiSdkFlaskDebuggingPluginsEnabled] = None
56
-
57
51
  api_route_path_prefix: str = '/api'
58
52
 
59
53
  model_config = ConfigDict(
@@ -1,9 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ul_api_utils
3
- Version: 10.0.0.dev4
3
+ Version: 10.0.0.dev6
4
4
  Summary: Python api utils
5
5
  Author: Unic-lab
6
+ Author-email:
6
7
  License: MIT
8
+ Platform: any
7
9
  Classifier: Intended Audience :: Developers
8
10
  Classifier: License :: OSI Approved :: MIT License
9
11
  Classifier: Programming Language :: Python
@@ -12,9 +14,9 @@ Classifier: Operating System :: OS Independent
12
14
  Requires-Python: >=3.14
13
15
  Description-Content-Type: text/markdown
14
16
  License-File: LICENSE
15
- Requires-Dist: ul-db-utils==6.0.0.dev2
17
+ Requires-Dist: ul-db-utils==6.0.0.dev3
16
18
  Requires-Dist: ul-py-tool==3.0.2.dev1
17
- Requires-Dist: ul-unipipeline>=3.0.2.dev0
19
+ Requires-Dist: ul-unipipeline>=3.0.2.dev1
18
20
  Requires-Dist: frozendict>=2.4.4
19
21
  Requires-Dist: jinja2>=3.1.6
20
22
  Requires-Dist: flask>=3.1.0
@@ -27,6 +29,7 @@ Requires-Dist: pyjwt>=2.10.1
27
29
  Requires-Dist: gunicorn>=23.0.0
28
30
  Requires-Dist: gevent>=25.9.1
29
31
  Requires-Dist: gevent-websocket>=0.10.1
32
+ Requires-Dist: psycogreen>=1.0.2
30
33
  Requires-Dist: flask-socketio>=5.5.1
31
34
  Requires-Dist: pyyaml>=6.0
32
35
  Requires-Dist: requests>=2.31.0
@@ -49,6 +52,7 @@ Requires-Dist: wtforms-alchemy>=0.18.0
49
52
  Provides-Extra: dev
50
53
  Requires-Dist: uv-script>=0.1.9; extra == "dev"
51
54
  Dynamic: license-file
55
+ Dynamic: platform
52
56
 
53
57
  # Generic library api-utils
54
58
 
@@ -1,6 +1,7 @@
1
1
  LICENSE
2
2
  README.md
3
3
  pyproject.toml
4
+ setup.py
4
5
  ul_api_utils/__init__.py
5
6
  ul_api_utils/conf.py
6
7
  ul_api_utils/const.py
@@ -1,6 +1,6 @@
1
- ul-db-utils==6.0.0.dev2
1
+ ul-db-utils==6.0.0.dev3
2
2
  ul-py-tool==3.0.2.dev1
3
- ul-unipipeline>=3.0.2.dev0
3
+ ul-unipipeline>=3.0.2.dev1
4
4
  frozendict>=2.4.4
5
5
  jinja2>=3.1.6
6
6
  flask>=3.1.0
@@ -13,6 +13,7 @@ pyjwt>=2.10.1
13
13
  gunicorn>=23.0.0
14
14
  gevent>=25.9.1
15
15
  gevent-websocket>=0.10.1
16
+ psycogreen>=1.0.2
16
17
  flask-socketio>=5.5.1
17
18
  pyyaml>=6.0
18
19
  requests>=2.31.0
@@ -1,26 +0,0 @@
1
- import gc
2
- from typing import Any
3
-
4
- from ul_py_tool.utils.write_stdout import write_stdout
5
-
6
-
7
- def when_ready(server: Any) -> None:
8
- """
9
- Use only with --preload option.
10
- Called just after the server is started.
11
- Freeze garbage collector objects after preloading the application.
12
- https://docs.gunicorn.org/en/20.1.0/settings.html?highlight=preload#when-ready
13
- """
14
- gc.freeze()
15
- write_stdout("Objects frozen in permanent generation: ", gc.get_freeze_count())
16
-
17
-
18
- def post_fork(server: Any, worker: Any) -> None:
19
- """
20
- Works only with --preload.
21
- Called just after a worker has been forked.
22
- Enable garbage collection on each worker if it's not enabled for some reason.
23
- https://docs.gunicorn.org/en/20.1.0/settings.html?highlight=preload#post-fork
24
- """
25
- write_stdout("Enabling GC for worker", worker.pid)
26
- gc.enable()