springbootAI 1.8.6__tar.gz → 1.8.7__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 (222) hide show
  1. {springbootai-1.8.6/springbootAI.egg-info → springbootai-1.8.7}/PKG-INFO +1 -1
  2. {springbootai-1.8.6 → springbootai-1.8.7}/pyproject.toml +1 -1
  3. {springbootai-1.8.6 → springbootai-1.8.7}/spring/__init__.py +1 -1
  4. {springbootai-1.8.6 → springbootai-1.8.7}/spring/logging/loguru_logger.py +26 -8
  5. {springbootai-1.8.6 → springbootai-1.8.7}/spring/utils/banner.py +1 -1
  6. {springbootai-1.8.6 → springbootai-1.8.7/springbootAI.egg-info}/PKG-INFO +1 -1
  7. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_logging_config.py +34 -0
  8. {springbootai-1.8.6 → springbootai-1.8.7}/LICENSE +0 -0
  9. {springbootai-1.8.6 → springbootai-1.8.7}/MANIFEST.in +0 -0
  10. {springbootai-1.8.6 → springbootai-1.8.7}/README.md +0 -0
  11. {springbootai-1.8.6 → springbootai-1.8.7}/requirements.txt +0 -0
  12. {springbootai-1.8.6 → springbootai-1.8.7}/setup.cfg +0 -0
  13. {springbootai-1.8.6 → springbootai-1.8.7}/setup.py +0 -0
  14. {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/__init__.py +0 -0
  15. {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/advisors.py +0 -0
  16. {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/annotations.py +0 -0
  17. {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/autoconfig.py +0 -0
  18. {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/core.py +0 -0
  19. {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/etl.py +0 -0
  20. {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/memory.py +0 -0
  21. {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/observability.py +0 -0
  22. {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/providers.py +0 -0
  23. {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/resilience.py +0 -0
  24. {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/tools.py +0 -0
  25. {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/vectorstore.py +0 -0
  26. {springbootai-1.8.6 → springbootai-1.8.7}/spring/annotations/__init__.py +0 -0
  27. {springbootai-1.8.6 → springbootai-1.8.7}/spring/annotations/cache.py +0 -0
  28. {springbootai-1.8.6 → springbootai-1.8.7}/spring/annotations/cloud.py +0 -0
  29. {springbootai-1.8.6 → springbootai-1.8.7}/spring/annotations/conditional.py +0 -0
  30. {springbootai-1.8.6 → springbootai-1.8.7}/spring/annotations/core.py +0 -0
  31. {springbootai-1.8.6 → springbootai-1.8.7}/spring/annotations/messaging.py +0 -0
  32. {springbootai-1.8.6 → springbootai-1.8.7}/spring/aop/__init__.py +0 -0
  33. {springbootai-1.8.6 → springbootai-1.8.7}/spring/aop/cloud_aop.py +0 -0
  34. {springbootai-1.8.6 → springbootai-1.8.7}/spring/aop/comprehensive_aop.py +0 -0
  35. {springbootai-1.8.6 → springbootai-1.8.7}/spring/aop/method_interceptor.py +0 -0
  36. {springbootai-1.8.6 → springbootai-1.8.7}/spring/aop/proxy_factory.py +0 -0
  37. {springbootai-1.8.6 → springbootai-1.8.7}/spring/cloud/__init__.py +0 -0
  38. {springbootai-1.8.6 → springbootai-1.8.7}/spring/cloud/discovery.py +0 -0
  39. {springbootai-1.8.6 → springbootai-1.8.7}/spring/cloud/feign.py +0 -0
  40. {springbootai-1.8.6 → springbootai-1.8.7}/spring/cloud/gateway.py +0 -0
  41. {springbootai-1.8.6 → springbootai-1.8.7}/spring/cloud/load_balancer.py +0 -0
  42. {springbootai-1.8.6 → springbootai-1.8.7}/spring/cloud/seata.py +0 -0
  43. {springbootai-1.8.6 → springbootai-1.8.7}/spring/cloud/sentinel.py +0 -0
  44. {springbootai-1.8.6 → springbootai-1.8.7}/spring/cloud/tracer.py +0 -0
  45. {springbootai-1.8.6 → springbootai-1.8.7}/spring/cloud/transaction_store.py +0 -0
  46. {springbootai-1.8.6 → springbootai-1.8.7}/spring/config/__init__.py +0 -0
  47. {springbootai-1.8.6 → springbootai-1.8.7}/spring/config/binding.py +0 -0
  48. {springbootai-1.8.6 → springbootai-1.8.7}/spring/config/config_loader.py +0 -0
  49. {springbootai-1.8.6 → springbootai-1.8.7}/spring/context/__init__.py +0 -0
  50. {springbootai-1.8.6 → springbootai-1.8.7}/spring/context/application_context.py +0 -0
  51. {springbootai-1.8.6 → springbootai-1.8.7}/spring/context/bean_definition.py +0 -0
  52. {springbootai-1.8.6 → springbootai-1.8.7}/spring/context/bean_factory.py +0 -0
  53. {springbootai-1.8.6 → springbootai-1.8.7}/spring/context/registry.py +0 -0
  54. {springbootai-1.8.6 → springbootai-1.8.7}/spring/context/scanner.py +0 -0
  55. {springbootai-1.8.6 → springbootai-1.8.7}/spring/core/__init__.py +0 -0
  56. {springbootai-1.8.6 → springbootai-1.8.7}/spring/core/graceful_shutdown.py +0 -0
  57. {springbootai-1.8.6 → springbootai-1.8.7}/spring/core/typing_utils.py +0 -0
  58. {springbootai-1.8.6 → springbootai-1.8.7}/spring/csv/__init__.py +0 -0
  59. {springbootai-1.8.6 → springbootai-1.8.7}/spring/csv/annotations.py +0 -0
  60. {springbootai-1.8.6 → springbootai-1.8.7}/spring/csv/converters.py +0 -0
  61. {springbootai-1.8.6 → springbootai-1.8.7}/spring/csv/easy_csv.py +0 -0
  62. {springbootai-1.8.6 → springbootai-1.8.7}/spring/csv/exceptions.py +0 -0
  63. {springbootai-1.8.6 → springbootai-1.8.7}/spring/csv/reader.py +0 -0
  64. {springbootai-1.8.6 → springbootai-1.8.7}/spring/csv/writer.py +0 -0
  65. {springbootai-1.8.6 → springbootai-1.8.7}/spring/data/__init__.py +0 -0
  66. {springbootai-1.8.6 → springbootai-1.8.7}/spring/data/page.py +0 -0
  67. {springbootai-1.8.6 → springbootai-1.8.7}/spring/data/repository.py +0 -0
  68. {springbootai-1.8.6 → springbootai-1.8.7}/spring/data/specification.py +0 -0
  69. {springbootai-1.8.6 → springbootai-1.8.7}/spring/datasource/__init__.py +0 -0
  70. {springbootai-1.8.6 → springbootai-1.8.7}/spring/datasource/annotations.py +0 -0
  71. {springbootai-1.8.6 → springbootai-1.8.7}/spring/datasource/context.py +0 -0
  72. {springbootai-1.8.6 → springbootai-1.8.7}/spring/datasource/dynamic.py +0 -0
  73. {springbootai-1.8.6 → springbootai-1.8.7}/spring/event/__init__.py +0 -0
  74. {springbootai-1.8.6 → springbootai-1.8.7}/spring/event/publisher.py +0 -0
  75. {springbootai-1.8.6 → springbootai-1.8.7}/spring/excel/__init__.py +0 -0
  76. {springbootai-1.8.6 → springbootai-1.8.7}/spring/excel/annotations.py +0 -0
  77. {springbootai-1.8.6 → springbootai-1.8.7}/spring/excel/converters.py +0 -0
  78. {springbootai-1.8.6 → springbootai-1.8.7}/spring/excel/easy_excel.py +0 -0
  79. {springbootai-1.8.6 → springbootai-1.8.7}/spring/excel/exceptions.py +0 -0
  80. {springbootai-1.8.6 → springbootai-1.8.7}/spring/excel/reader.py +0 -0
  81. {springbootai-1.8.6 → springbootai-1.8.7}/spring/excel/style.py +0 -0
  82. {springbootai-1.8.6 → springbootai-1.8.7}/spring/excel/writer.py +0 -0
  83. {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/__init__.py +0 -0
  84. {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/accessor.py +0 -0
  85. {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/auto_config.py +0 -0
  86. {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/holder.py +0 -0
  87. {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/locale.py +0 -0
  88. {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/locale_resolver.py +0 -0
  89. {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/message_source.py +0 -0
  90. {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/middleware.py +0 -0
  91. {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/properties.py +0 -0
  92. {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/sources.py +0 -0
  93. {springbootai-1.8.6 → springbootai-1.8.7}/spring/logging/__init__.py +0 -0
  94. {springbootai-1.8.6 → springbootai-1.8.7}/spring/main.py +0 -0
  95. {springbootai-1.8.6 → springbootai-1.8.7}/spring/messaging/__init__.py +0 -0
  96. {springbootai-1.8.6 → springbootai-1.8.7}/spring/messaging/rabbitmq.py +0 -0
  97. {springbootai-1.8.6 → springbootai-1.8.7}/spring/monitoring/__init__.py +0 -0
  98. {springbootai-1.8.6 → springbootai-1.8.7}/spring/monitoring/prometheus.py +0 -0
  99. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/__init__.py +0 -0
  100. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/database.py +0 -0
  101. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/ddl_auto.py +0 -0
  102. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/migration.py +0 -0
  103. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/mybatis_integration.py +0 -0
  104. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/__init__.py +0 -0
  105. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/annotations/__init__.py +0 -0
  106. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/annotations/annotations.py +0 -0
  107. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/cache/__init__.py +0 -0
  108. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/cache/cache.py +0 -0
  109. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/cache/redis_cache.py +0 -0
  110. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/circuit_breaker/__init__.py +0 -0
  111. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/circuit_breaker/circuit_breaker.py +0 -0
  112. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/configuration.py +0 -0
  113. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/core/__init__.py +0 -0
  114. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/core/sql_session.py +0 -0
  115. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/core/sql_session_factory.py +0 -0
  116. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/dialect/__init__.py +0 -0
  117. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/dialect/dialect.py +0 -0
  118. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/dynamic_sql/__init__.py +0 -0
  119. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/dynamic_sql/dynamic_sql.py +0 -0
  120. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/interceptor/__init__.py +0 -0
  121. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/interceptor/interceptor.py +0 -0
  122. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/mapper/__init__.py +0 -0
  123. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/mapper/mapper.py +0 -0
  124. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/metrics/__init__.py +0 -0
  125. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/metrics/metrics.py +0 -0
  126. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/pool/__init__.py +0 -0
  127. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/pool/connection_pool.py +0 -0
  128. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/security/__init__.py +0 -0
  129. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/security/access_control.py +0 -0
  130. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/security/password_encoder.py +0 -0
  131. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/security/sensitive_data_masker.py +0 -0
  132. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/security/sql_injection_detector.py +0 -0
  133. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/transaction/__init__.py +0 -0
  134. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/transaction/transaction.py +0 -0
  135. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/type_handler/__init__.py +0 -0
  136. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/type_handler/type_handler.py +0 -0
  137. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/version.py +0 -0
  138. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/xml_parser/__init__.py +0 -0
  139. {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/xml_parser/xml_parser.py +0 -0
  140. {springbootai-1.8.6 → springbootai-1.8.7}/spring/retry/__init__.py +0 -0
  141. {springbootai-1.8.6 → springbootai-1.8.7}/spring/retry/retry_annotations.py +0 -0
  142. {springbootai-1.8.6 → springbootai-1.8.7}/spring/retry/retry_decorator.py +0 -0
  143. {springbootai-1.8.6 → springbootai-1.8.7}/spring/scheduling/__init__.py +0 -0
  144. {springbootai-1.8.6 → springbootai-1.8.7}/spring/scheduling/scheduler.py +0 -0
  145. {springbootai-1.8.6 → springbootai-1.8.7}/spring/security/__init__.py +0 -0
  146. {springbootai-1.8.6 → springbootai-1.8.7}/spring/security/jwt_utils.py +0 -0
  147. {springbootai-1.8.6 → springbootai-1.8.7}/spring/security/replay_protection.py +0 -0
  148. {springbootai-1.8.6 → springbootai-1.8.7}/spring/security/secret_manager.py +0 -0
  149. {springbootai-1.8.6 → springbootai-1.8.7}/spring/security/security_aop.py +0 -0
  150. {springbootai-1.8.6 → springbootai-1.8.7}/spring/security/security_context.py +0 -0
  151. {springbootai-1.8.6 → springbootai-1.8.7}/spring/test/__init__.py +0 -0
  152. {springbootai-1.8.6 → springbootai-1.8.7}/spring/test/slicing.py +0 -0
  153. {springbootai-1.8.6 → springbootai-1.8.7}/spring/tracing/__init__.py +0 -0
  154. {springbootai-1.8.6 → springbootai-1.8.7}/spring/tracing/skywalking.py +0 -0
  155. {springbootai-1.8.6 → springbootai-1.8.7}/spring/tx/__init__.py +0 -0
  156. {springbootai-1.8.6 → springbootai-1.8.7}/spring/tx/events.py +0 -0
  157. {springbootai-1.8.6 → springbootai-1.8.7}/spring/tx/synchronization.py +0 -0
  158. {springbootai-1.8.6 → springbootai-1.8.7}/spring/utils/__init__.py +0 -0
  159. {springbootai-1.8.6 → springbootai-1.8.7}/spring/utils/bean_utils.py +0 -0
  160. {springbootai-1.8.6 → springbootai-1.8.7}/spring/utils/logger.py +0 -0
  161. {springbootai-1.8.6 → springbootai-1.8.7}/spring/utils/redis_client.py +0 -0
  162. {springbootai-1.8.6 → springbootai-1.8.7}/spring/validation/__init__.py +0 -0
  163. {springbootai-1.8.6 → springbootai-1.8.7}/spring/validation/aop.py +0 -0
  164. {springbootai-1.8.6 → springbootai-1.8.7}/spring/validation/constraints.py +0 -0
  165. {springbootai-1.8.6 → springbootai-1.8.7}/spring/validation/exceptions.py +0 -0
  166. {springbootai-1.8.6 → springbootai-1.8.7}/spring/validation/validator.py +0 -0
  167. {springbootai-1.8.6 → springbootai-1.8.7}/spring/web/__init__.py +0 -0
  168. {springbootai-1.8.6 → springbootai-1.8.7}/spring/web/actuator.py +0 -0
  169. {springbootai-1.8.6 → springbootai-1.8.7}/spring/web/exception_handler.py +0 -0
  170. {springbootai-1.8.6 → springbootai-1.8.7}/spring/web/health.py +0 -0
  171. {springbootai-1.8.6 → springbootai-1.8.7}/spring/web/interceptor.py +0 -0
  172. {springbootai-1.8.6 → springbootai-1.8.7}/spring/web/result.py +0 -0
  173. {springbootai-1.8.6 → springbootai-1.8.7}/spring/web/swagger.py +0 -0
  174. {springbootai-1.8.6 → springbootai-1.8.7}/spring/web/web_context.py +0 -0
  175. {springbootai-1.8.6 → springbootai-1.8.7}/spring/websocket/__init__.py +0 -0
  176. {springbootai-1.8.6 → springbootai-1.8.7}/spring/websocket/annotations.py +0 -0
  177. {springbootai-1.8.6 → springbootai-1.8.7}/spring/websocket/broker.py +0 -0
  178. {springbootai-1.8.6 → springbootai-1.8.7}/spring/websocket/exceptions.py +0 -0
  179. {springbootai-1.8.6 → springbootai-1.8.7}/spring/websocket/handler.py +0 -0
  180. {springbootai-1.8.6 → springbootai-1.8.7}/spring/websocket/router.py +0 -0
  181. {springbootai-1.8.6 → springbootai-1.8.7}/spring/websocket/session.py +0 -0
  182. {springbootai-1.8.6 → springbootai-1.8.7}/springbootAI.egg-info/SOURCES.txt +0 -0
  183. {springbootai-1.8.6 → springbootai-1.8.7}/springbootAI.egg-info/dependency_links.txt +0 -0
  184. {springbootai-1.8.6 → springbootai-1.8.7}/springbootAI.egg-info/entry_points.txt +0 -0
  185. {springbootai-1.8.6 → springbootai-1.8.7}/springbootAI.egg-info/requires.txt +0 -0
  186. {springbootai-1.8.6 → springbootai-1.8.7}/springbootAI.egg-info/top_level.txt +0 -0
  187. {springbootai-1.8.6 → springbootai-1.8.7}/sql/seata_undo_log.sql +0 -0
  188. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_actuator.py +0 -0
  189. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_ai_module.py +0 -0
  190. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_annotation_combinations.py +0 -0
  191. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_annotations_contract.py +0 -0
  192. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_aop_annotations_full.py +0 -0
  193. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_bean_utils.py +0 -0
  194. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_cache_annotations.py +0 -0
  195. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_cloud_embedded_full.py +0 -0
  196. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_component_init_error.py +0 -0
  197. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_conditional_annotations.py +0 -0
  198. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_config_binding.py +0 -0
  199. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_config_fixes_185.py +0 -0
  200. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_connection_resilience.py +0 -0
  201. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_core_annotations_full.py +0 -0
  202. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_csv_module.py +0 -0
  203. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_data_repository.py +0 -0
  204. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_datasource_routing.py +0 -0
  205. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_ddl_auto.py +0 -0
  206. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_di_config_event_full.py +0 -0
  207. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_excel_module.py +0 -0
  208. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_i18n_module.py +0 -0
  209. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_jpa_version_transient.py +0 -0
  210. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_new_features.py +0 -0
  211. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_orm_pymybatis_full.py +0 -0
  212. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_production_readiness.py +0 -0
  213. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_pymybatis_contract.py +0 -0
  214. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_seata_durable_store.py +0 -0
  215. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_security.py +0 -0
  216. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_security_full.py +0 -0
  217. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_swagger_module.py +0 -0
  218. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_test_slicing.py +0 -0
  219. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_transactional_events.py +0 -0
  220. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_validation_module.py +0 -0
  221. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_web_annotations_full.py +0 -0
  222. {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_websocket_module.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: springbootAI
3
- Version: 1.8.6
3
+ Version: 1.8.7
4
4
  Summary: Python版Spring Boot框架,集成PyMyBatis ORM
5
5
  Author-email: YuConggen <1516933915@qq.com>
6
6
  License-Expression: MIT
@@ -12,7 +12,7 @@ build-backend = "setuptools.build_meta"
12
12
  [project]
13
13
  # 发行名 springbootAI(PyPI 包名,pip install springbootAI);导入包名仍为 spring
14
14
  name = "springbootAI"
15
- version = "1.8.6"
15
+ version = "1.8.7"
16
16
  description = "Python版Spring Boot框架,集成PyMyBatis ORM"
17
17
  readme = "README.md"
18
18
  license = "MIT"
@@ -5,7 +5,7 @@ from .config import *
5
5
  from .utils import *
6
6
  from .main import create_app, run, SpringApplication, run_cli
7
7
 
8
- __version__ = "1.8.6"
8
+ __version__ = "1.8.7"
9
9
  __author__ = "yuconggen"
10
10
  __license__ = "MIT"
11
11
 
@@ -81,11 +81,15 @@ class SpringLogger:
81
81
  self._use_loguru = _loguru_available
82
82
  self.log_format = log_format or self._default_format()
83
83
 
84
- # 初始化日志配置(import 时用默认 'logs',strict=False 允许降级保证不崩溃)
84
+ # import 时只设置控制台输出,不创建文件 handler(不创建 logs/ 目录)。
85
+ # 文件 handler 在 init_logging → reconfigure 读取用户配置后创建,
86
+ # 避免在 CWD 下提前生成 logs/ 目录与用户配置的 log_dir 产生双份日志。
85
87
  if self._use_loguru:
86
- self._setup_loguru(strict=False)
88
+ loguru_logger.remove()
89
+ loguru_logger.add(
90
+ sys.stdout, format=self.log_format, level=self.level, colorize=True)
87
91
  else:
88
- self._setup_std_logging(strict=False)
92
+ self._setup_std_logging(strict=False, enable_file=False)
89
93
 
90
94
  def reconfigure(self, level: Optional[str] = None, log_format: Optional[str] = None,
91
95
  log_dir: Optional[str] = None, retention: Optional[str] = None,
@@ -125,12 +129,14 @@ class SpringLogger:
125
129
  if rotation is not None:
126
130
  self.rotation = rotation
127
131
  # 重建日志处理器:用户显式配置 log_dir 时 strict=True(路径错必须报错),
128
- # 否则 strict=False(保留旧值/默认值时允许降级)
132
+ # 否则 strict=False(保留旧值/默认值时允许降级)。
133
+ # reconfigure 始终启用文件 handler(enable_file=True),
134
+ # 因为此时用户配置已读取,应该创建日志文件。
129
135
  strict_mode = log_dir_explicitly_set
130
136
  if self._use_loguru:
131
- self._setup_loguru(strict=strict_mode)
137
+ self._setup_loguru(strict=strict_mode, enable_file=True)
132
138
  else:
133
- self._setup_std_logging(strict=strict_mode)
139
+ self._setup_std_logging(strict=strict_mode, enable_file=True)
134
140
 
135
141
  def _validate_log_dir(self, strict: bool) -> bool:
136
142
  """校验日志目录可创建且可写入。
@@ -223,12 +229,14 @@ class SpringLogger:
223
229
  )
224
230
  return "%(asctime)s | %(levelname)-8s | %(name)s:%(funcName)s:%(lineno)d | %(message)s"
225
231
 
226
- def _setup_loguru(self, strict: bool = False):
232
+ def _setup_loguru(self, strict: bool = False, enable_file: bool = True):
227
233
  """配置Loguru。
228
234
 
229
235
  Args:
230
236
  strict: True 时日志目录校验失败抛 ``LoggingConfigError``(用户配置路径);
231
237
  False 时降级为仅控制台日志(import 时默认配置,保证不崩溃)
238
+ enable_file: True 时添加文件 handler(创建日志目录+文件);
239
+ False 时仅控制台输出(import 时避免提前创建 logs/ 目录)
232
240
  """
233
241
  # 清除默认处理器
234
242
  loguru_logger.remove()
@@ -241,6 +249,10 @@ class SpringLogger:
241
249
  colorize=True,
242
250
  )
243
251
 
252
+ # enable_file=False 时只输出到控制台(import 时使用,不创建 logs/ 目录)
253
+ if not enable_file:
254
+ return
255
+
244
256
  # 校验日志目录:strict 模式下失败会抛异常(由 reconfigure 捕获并输出),
245
257
  # 非 strict 模式下返回 False 则仅使用控制台日志
246
258
  if not self._validate_log_dir(strict=strict):
@@ -267,12 +279,14 @@ class SpringLogger:
267
279
  encoding="utf-8",
268
280
  )
269
281
 
270
- def _setup_std_logging(self, strict: bool = False):
282
+ def _setup_std_logging(self, strict: bool = False, enable_file: bool = True):
271
283
  """配置标准logging(fallback)。
272
284
 
273
285
  Args:
274
286
  strict: True 时日志目录校验失败抛 ``LoggingConfigError``;
275
287
  False 时降级为仅控制台日志(import 时保证不崩溃)
288
+ enable_file: True 时添加文件 handler;False 时仅控制台输出
289
+ (import 时避免提前创建 logs/ 目录)
276
290
  """
277
291
  self._logger = logging.getLogger("Spring")
278
292
  self._logger.setLevel(getattr(logging, self.level))
@@ -285,6 +299,10 @@ class SpringLogger:
285
299
  console_handler.setFormatter(logging.Formatter(self.log_format))
286
300
  self._logger.addHandler(console_handler)
287
301
 
302
+ # enable_file=False 时只输出到控制台
303
+ if not enable_file:
304
+ return
305
+
288
306
  # 校验日志目录
289
307
  if not self._validate_log_dir(strict=strict):
290
308
  return
@@ -11,7 +11,7 @@ class BannerPrinter:
11
11
  |_| |___/
12
12
  """
13
13
 
14
- def __init__(self, version: str = "1.8.6"): # v1.8.6 配置严格校验 + 统一异常捕获
14
+ def __init__(self, version: str = "1.8.7"): # v1.8.7 修复 import 时提前创建 logs/ 目录
15
15
  self.version = version
16
16
  self.logger = SpringLogger()
17
17
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: springbootAI
3
- Version: 1.8.6
3
+ Version: 1.8.7
4
4
  Summary: Python版Spring Boot框架,集成PyMyBatis ORM
5
5
  Author-email: YuConggen <1516933915@qq.com>
6
6
  License-Expression: MIT
@@ -150,3 +150,37 @@ class TestLogDirStrictValidation:
150
150
  assert spring_logger.level == "DEBUG"
151
151
  # 恢复
152
152
  spring_logger.reconfigure(level="INFO")
153
+
154
+ def test_import_does_not_create_logs_directory(self, tmp_path):
155
+ """SpringLogger 构造时不应创建 logs/ 目录(文件 handler 延迟到 init_logging)。
156
+
157
+ 回归场景:模块级 ``spring_logger = SpringLogger()`` 在 import 时执行,
158
+ 旧代码会立即创建 ``logs/`` 目录和文件 handler,导致即使用户配置了
159
+ ``logging.log_dir``,CWD 下仍会多出一份 ``logs/``。
160
+ 修复后 ``__init__`` 只添加控制台 handler,文件 handler 由
161
+ ``reconfigure`` (即 ``init_logging``) 创建。
162
+ """
163
+ import os
164
+ original_cwd = os.getcwd()
165
+ os.chdir(str(tmp_path))
166
+ try:
167
+ # 构造 SpringLogger(模拟 import 时的模块级构造)
168
+ SpringLogger._instance = None
169
+ import spring.logging.loguru_logger as ll
170
+ ll.spring_logger = SpringLogger()
171
+ # logs/ 目录不应被创建
172
+ assert not (tmp_path / 'logs').exists(), \
173
+ "SpringLogger() 构造时不应创建 logs/ 目录"
174
+ finally:
175
+ SpringLogger._instance = None
176
+ os.chdir(original_cwd)
177
+
178
+ def test_enable_file_false_does_not_create_directory(self, tmp_path):
179
+ """_setup_loguru(enable_file=False) 不应创建日志目录。"""
180
+ SpringLogger._instance = None
181
+ import spring.logging.loguru_logger as ll
182
+ logger = SpringLogger()
183
+ logger.log_dir = str(tmp_path / 'should_not_exist')
184
+ logger._setup_loguru(strict=False, enable_file=False)
185
+ assert not (tmp_path / 'should_not_exist').exists(), \
186
+ "enable_file=False 时不应创建日志目录"
File without changes
File without changes
File without changes
File without changes
File without changes