springbootAI 1.8.2__tar.gz → 1.8.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. {springbootai-1.8.2/springbootAI.egg-info → springbootai-1.8.4}/PKG-INFO +15 -5
  2. {springbootai-1.8.2 → springbootai-1.8.4}/README.md +14 -4
  3. {springbootai-1.8.2 → springbootai-1.8.4}/pyproject.toml +1 -1
  4. {springbootai-1.8.2 → springbootai-1.8.4}/spring/__init__.py +1 -1
  5. {springbootai-1.8.2 → springbootai-1.8.4}/spring/aop/cloud_aop.py +32 -4
  6. {springbootai-1.8.2 → springbootai-1.8.4}/spring/cloud/__init__.py +2 -0
  7. {springbootai-1.8.2 → springbootai-1.8.4}/spring/cloud/gateway.py +25 -8
  8. {springbootai-1.8.2 → springbootai-1.8.4}/spring/cloud/seata.py +309 -40
  9. springbootai-1.8.4/spring/cloud/transaction_store.py +275 -0
  10. {springbootai-1.8.2 → springbootai-1.8.4}/spring/main.py +25 -4
  11. {springbootai-1.8.2 → springbootai-1.8.4}/spring/utils/banner.py +7 -7
  12. {springbootai-1.8.2 → springbootai-1.8.4}/spring/web/health.py +12 -2
  13. {springbootai-1.8.2 → springbootai-1.8.4}/spring/web/swagger.py +96 -7
  14. {springbootai-1.8.2 → springbootai-1.8.4}/spring/web/web_context.py +4 -1
  15. {springbootai-1.8.2 → springbootai-1.8.4/springbootAI.egg-info}/PKG-INFO +15 -5
  16. {springbootai-1.8.2 → springbootai-1.8.4}/springbootAI.egg-info/SOURCES.txt +2 -0
  17. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_new_features.py +2 -2
  18. springbootai-1.8.4/tests/test_seata_durable_store.py +168 -0
  19. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_swagger_module.py +29 -14
  20. {springbootai-1.8.2 → springbootai-1.8.4}/LICENSE +0 -0
  21. {springbootai-1.8.2 → springbootai-1.8.4}/MANIFEST.in +0 -0
  22. {springbootai-1.8.2 → springbootai-1.8.4}/requirements.txt +0 -0
  23. {springbootai-1.8.2 → springbootai-1.8.4}/setup.cfg +0 -0
  24. {springbootai-1.8.2 → springbootai-1.8.4}/setup.py +0 -0
  25. {springbootai-1.8.2 → springbootai-1.8.4}/spring/ai/__init__.py +0 -0
  26. {springbootai-1.8.2 → springbootai-1.8.4}/spring/ai/advisors.py +0 -0
  27. {springbootai-1.8.2 → springbootai-1.8.4}/spring/ai/annotations.py +0 -0
  28. {springbootai-1.8.2 → springbootai-1.8.4}/spring/ai/autoconfig.py +0 -0
  29. {springbootai-1.8.2 → springbootai-1.8.4}/spring/ai/core.py +0 -0
  30. {springbootai-1.8.2 → springbootai-1.8.4}/spring/ai/etl.py +0 -0
  31. {springbootai-1.8.2 → springbootai-1.8.4}/spring/ai/memory.py +0 -0
  32. {springbootai-1.8.2 → springbootai-1.8.4}/spring/ai/observability.py +0 -0
  33. {springbootai-1.8.2 → springbootai-1.8.4}/spring/ai/providers.py +0 -0
  34. {springbootai-1.8.2 → springbootai-1.8.4}/spring/ai/resilience.py +0 -0
  35. {springbootai-1.8.2 → springbootai-1.8.4}/spring/ai/tools.py +0 -0
  36. {springbootai-1.8.2 → springbootai-1.8.4}/spring/ai/vectorstore.py +0 -0
  37. {springbootai-1.8.2 → springbootai-1.8.4}/spring/annotations/__init__.py +0 -0
  38. {springbootai-1.8.2 → springbootai-1.8.4}/spring/annotations/cache.py +0 -0
  39. {springbootai-1.8.2 → springbootai-1.8.4}/spring/annotations/cloud.py +0 -0
  40. {springbootai-1.8.2 → springbootai-1.8.4}/spring/annotations/conditional.py +0 -0
  41. {springbootai-1.8.2 → springbootai-1.8.4}/spring/annotations/core.py +0 -0
  42. {springbootai-1.8.2 → springbootai-1.8.4}/spring/annotations/messaging.py +0 -0
  43. {springbootai-1.8.2 → springbootai-1.8.4}/spring/aop/__init__.py +0 -0
  44. {springbootai-1.8.2 → springbootai-1.8.4}/spring/aop/comprehensive_aop.py +0 -0
  45. {springbootai-1.8.2 → springbootai-1.8.4}/spring/aop/method_interceptor.py +0 -0
  46. {springbootai-1.8.2 → springbootai-1.8.4}/spring/aop/proxy_factory.py +0 -0
  47. {springbootai-1.8.2 → springbootai-1.8.4}/spring/cloud/discovery.py +0 -0
  48. {springbootai-1.8.2 → springbootai-1.8.4}/spring/cloud/feign.py +0 -0
  49. {springbootai-1.8.2 → springbootai-1.8.4}/spring/cloud/load_balancer.py +0 -0
  50. {springbootai-1.8.2 → springbootai-1.8.4}/spring/cloud/sentinel.py +0 -0
  51. {springbootai-1.8.2 → springbootai-1.8.4}/spring/cloud/tracer.py +0 -0
  52. {springbootai-1.8.2 → springbootai-1.8.4}/spring/config/__init__.py +0 -0
  53. {springbootai-1.8.2 → springbootai-1.8.4}/spring/config/binding.py +0 -0
  54. {springbootai-1.8.2 → springbootai-1.8.4}/spring/config/config_loader.py +0 -0
  55. {springbootai-1.8.2 → springbootai-1.8.4}/spring/context/__init__.py +0 -0
  56. {springbootai-1.8.2 → springbootai-1.8.4}/spring/context/application_context.py +0 -0
  57. {springbootai-1.8.2 → springbootai-1.8.4}/spring/context/bean_definition.py +0 -0
  58. {springbootai-1.8.2 → springbootai-1.8.4}/spring/context/bean_factory.py +0 -0
  59. {springbootai-1.8.2 → springbootai-1.8.4}/spring/context/registry.py +0 -0
  60. {springbootai-1.8.2 → springbootai-1.8.4}/spring/context/scanner.py +0 -0
  61. {springbootai-1.8.2 → springbootai-1.8.4}/spring/core/__init__.py +0 -0
  62. {springbootai-1.8.2 → springbootai-1.8.4}/spring/core/graceful_shutdown.py +0 -0
  63. {springbootai-1.8.2 → springbootai-1.8.4}/spring/core/typing_utils.py +0 -0
  64. {springbootai-1.8.2 → springbootai-1.8.4}/spring/csv/__init__.py +0 -0
  65. {springbootai-1.8.2 → springbootai-1.8.4}/spring/csv/annotations.py +0 -0
  66. {springbootai-1.8.2 → springbootai-1.8.4}/spring/csv/converters.py +0 -0
  67. {springbootai-1.8.2 → springbootai-1.8.4}/spring/csv/easy_csv.py +0 -0
  68. {springbootai-1.8.2 → springbootai-1.8.4}/spring/csv/exceptions.py +0 -0
  69. {springbootai-1.8.2 → springbootai-1.8.4}/spring/csv/reader.py +0 -0
  70. {springbootai-1.8.2 → springbootai-1.8.4}/spring/csv/writer.py +0 -0
  71. {springbootai-1.8.2 → springbootai-1.8.4}/spring/data/__init__.py +0 -0
  72. {springbootai-1.8.2 → springbootai-1.8.4}/spring/data/page.py +0 -0
  73. {springbootai-1.8.2 → springbootai-1.8.4}/spring/data/repository.py +0 -0
  74. {springbootai-1.8.2 → springbootai-1.8.4}/spring/data/specification.py +0 -0
  75. {springbootai-1.8.2 → springbootai-1.8.4}/spring/datasource/__init__.py +0 -0
  76. {springbootai-1.8.2 → springbootai-1.8.4}/spring/datasource/annotations.py +0 -0
  77. {springbootai-1.8.2 → springbootai-1.8.4}/spring/datasource/context.py +0 -0
  78. {springbootai-1.8.2 → springbootai-1.8.4}/spring/datasource/dynamic.py +0 -0
  79. {springbootai-1.8.2 → springbootai-1.8.4}/spring/event/__init__.py +0 -0
  80. {springbootai-1.8.2 → springbootai-1.8.4}/spring/event/publisher.py +0 -0
  81. {springbootai-1.8.2 → springbootai-1.8.4}/spring/excel/__init__.py +0 -0
  82. {springbootai-1.8.2 → springbootai-1.8.4}/spring/excel/annotations.py +0 -0
  83. {springbootai-1.8.2 → springbootai-1.8.4}/spring/excel/converters.py +0 -0
  84. {springbootai-1.8.2 → springbootai-1.8.4}/spring/excel/easy_excel.py +0 -0
  85. {springbootai-1.8.2 → springbootai-1.8.4}/spring/excel/exceptions.py +0 -0
  86. {springbootai-1.8.2 → springbootai-1.8.4}/spring/excel/reader.py +0 -0
  87. {springbootai-1.8.2 → springbootai-1.8.4}/spring/excel/style.py +0 -0
  88. {springbootai-1.8.2 → springbootai-1.8.4}/spring/excel/writer.py +0 -0
  89. {springbootai-1.8.2 → springbootai-1.8.4}/spring/i18n/__init__.py +0 -0
  90. {springbootai-1.8.2 → springbootai-1.8.4}/spring/i18n/accessor.py +0 -0
  91. {springbootai-1.8.2 → springbootai-1.8.4}/spring/i18n/auto_config.py +0 -0
  92. {springbootai-1.8.2 → springbootai-1.8.4}/spring/i18n/holder.py +0 -0
  93. {springbootai-1.8.2 → springbootai-1.8.4}/spring/i18n/locale.py +0 -0
  94. {springbootai-1.8.2 → springbootai-1.8.4}/spring/i18n/locale_resolver.py +0 -0
  95. {springbootai-1.8.2 → springbootai-1.8.4}/spring/i18n/message_source.py +0 -0
  96. {springbootai-1.8.2 → springbootai-1.8.4}/spring/i18n/middleware.py +0 -0
  97. {springbootai-1.8.2 → springbootai-1.8.4}/spring/i18n/properties.py +0 -0
  98. {springbootai-1.8.2 → springbootai-1.8.4}/spring/i18n/sources.py +0 -0
  99. {springbootai-1.8.2 → springbootai-1.8.4}/spring/logging/__init__.py +0 -0
  100. {springbootai-1.8.2 → springbootai-1.8.4}/spring/logging/loguru_logger.py +0 -0
  101. {springbootai-1.8.2 → springbootai-1.8.4}/spring/messaging/__init__.py +0 -0
  102. {springbootai-1.8.2 → springbootai-1.8.4}/spring/messaging/rabbitmq.py +0 -0
  103. {springbootai-1.8.2 → springbootai-1.8.4}/spring/monitoring/__init__.py +0 -0
  104. {springbootai-1.8.2 → springbootai-1.8.4}/spring/monitoring/prometheus.py +0 -0
  105. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/__init__.py +0 -0
  106. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/database.py +0 -0
  107. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/ddl_auto.py +0 -0
  108. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/migration.py +0 -0
  109. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/mybatis_integration.py +0 -0
  110. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/__init__.py +0 -0
  111. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/annotations/__init__.py +0 -0
  112. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/annotations/annotations.py +0 -0
  113. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/cache/__init__.py +0 -0
  114. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/cache/cache.py +0 -0
  115. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/cache/redis_cache.py +0 -0
  116. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/circuit_breaker/__init__.py +0 -0
  117. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/circuit_breaker/circuit_breaker.py +0 -0
  118. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/configuration.py +0 -0
  119. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/core/__init__.py +0 -0
  120. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/core/sql_session.py +0 -0
  121. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/core/sql_session_factory.py +0 -0
  122. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/dialect/__init__.py +0 -0
  123. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/dialect/dialect.py +0 -0
  124. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/dynamic_sql/__init__.py +0 -0
  125. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/dynamic_sql/dynamic_sql.py +0 -0
  126. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/interceptor/__init__.py +0 -0
  127. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/interceptor/interceptor.py +0 -0
  128. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/mapper/__init__.py +0 -0
  129. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/mapper/mapper.py +0 -0
  130. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/metrics/__init__.py +0 -0
  131. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/metrics/metrics.py +0 -0
  132. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/pool/__init__.py +0 -0
  133. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/pool/connection_pool.py +0 -0
  134. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/security/__init__.py +0 -0
  135. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/security/access_control.py +0 -0
  136. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/security/password_encoder.py +0 -0
  137. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/security/sensitive_data_masker.py +0 -0
  138. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/security/sql_injection_detector.py +0 -0
  139. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/transaction/__init__.py +0 -0
  140. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/transaction/transaction.py +0 -0
  141. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/type_handler/__init__.py +0 -0
  142. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/type_handler/type_handler.py +0 -0
  143. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/version.py +0 -0
  144. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/xml_parser/__init__.py +0 -0
  145. {springbootai-1.8.2 → springbootai-1.8.4}/spring/orm/pymybatis/xml_parser/xml_parser.py +0 -0
  146. {springbootai-1.8.2 → springbootai-1.8.4}/spring/retry/__init__.py +0 -0
  147. {springbootai-1.8.2 → springbootai-1.8.4}/spring/retry/retry_annotations.py +0 -0
  148. {springbootai-1.8.2 → springbootai-1.8.4}/spring/retry/retry_decorator.py +0 -0
  149. {springbootai-1.8.2 → springbootai-1.8.4}/spring/scheduling/__init__.py +0 -0
  150. {springbootai-1.8.2 → springbootai-1.8.4}/spring/scheduling/scheduler.py +0 -0
  151. {springbootai-1.8.2 → springbootai-1.8.4}/spring/security/__init__.py +0 -0
  152. {springbootai-1.8.2 → springbootai-1.8.4}/spring/security/jwt_utils.py +0 -0
  153. {springbootai-1.8.2 → springbootai-1.8.4}/spring/security/replay_protection.py +0 -0
  154. {springbootai-1.8.2 → springbootai-1.8.4}/spring/security/secret_manager.py +0 -0
  155. {springbootai-1.8.2 → springbootai-1.8.4}/spring/security/security_aop.py +0 -0
  156. {springbootai-1.8.2 → springbootai-1.8.4}/spring/security/security_context.py +0 -0
  157. {springbootai-1.8.2 → springbootai-1.8.4}/spring/test/__init__.py +0 -0
  158. {springbootai-1.8.2 → springbootai-1.8.4}/spring/test/slicing.py +0 -0
  159. {springbootai-1.8.2 → springbootai-1.8.4}/spring/tracing/__init__.py +0 -0
  160. {springbootai-1.8.2 → springbootai-1.8.4}/spring/tracing/skywalking.py +0 -0
  161. {springbootai-1.8.2 → springbootai-1.8.4}/spring/tx/__init__.py +0 -0
  162. {springbootai-1.8.2 → springbootai-1.8.4}/spring/tx/events.py +0 -0
  163. {springbootai-1.8.2 → springbootai-1.8.4}/spring/tx/synchronization.py +0 -0
  164. {springbootai-1.8.2 → springbootai-1.8.4}/spring/utils/__init__.py +0 -0
  165. {springbootai-1.8.2 → springbootai-1.8.4}/spring/utils/bean_utils.py +0 -0
  166. {springbootai-1.8.2 → springbootai-1.8.4}/spring/utils/logger.py +0 -0
  167. {springbootai-1.8.2 → springbootai-1.8.4}/spring/utils/redis_client.py +0 -0
  168. {springbootai-1.8.2 → springbootai-1.8.4}/spring/validation/__init__.py +0 -0
  169. {springbootai-1.8.2 → springbootai-1.8.4}/spring/validation/aop.py +0 -0
  170. {springbootai-1.8.2 → springbootai-1.8.4}/spring/validation/constraints.py +0 -0
  171. {springbootai-1.8.2 → springbootai-1.8.4}/spring/validation/exceptions.py +0 -0
  172. {springbootai-1.8.2 → springbootai-1.8.4}/spring/validation/validator.py +0 -0
  173. {springbootai-1.8.2 → springbootai-1.8.4}/spring/web/__init__.py +0 -0
  174. {springbootai-1.8.2 → springbootai-1.8.4}/spring/web/actuator.py +0 -0
  175. {springbootai-1.8.2 → springbootai-1.8.4}/spring/web/exception_handler.py +0 -0
  176. {springbootai-1.8.2 → springbootai-1.8.4}/spring/web/interceptor.py +0 -0
  177. {springbootai-1.8.2 → springbootai-1.8.4}/spring/web/result.py +0 -0
  178. {springbootai-1.8.2 → springbootai-1.8.4}/spring/websocket/__init__.py +0 -0
  179. {springbootai-1.8.2 → springbootai-1.8.4}/spring/websocket/annotations.py +0 -0
  180. {springbootai-1.8.2 → springbootai-1.8.4}/spring/websocket/broker.py +0 -0
  181. {springbootai-1.8.2 → springbootai-1.8.4}/spring/websocket/exceptions.py +0 -0
  182. {springbootai-1.8.2 → springbootai-1.8.4}/spring/websocket/handler.py +0 -0
  183. {springbootai-1.8.2 → springbootai-1.8.4}/spring/websocket/router.py +0 -0
  184. {springbootai-1.8.2 → springbootai-1.8.4}/spring/websocket/session.py +0 -0
  185. {springbootai-1.8.2 → springbootai-1.8.4}/springbootAI.egg-info/dependency_links.txt +0 -0
  186. {springbootai-1.8.2 → springbootai-1.8.4}/springbootAI.egg-info/entry_points.txt +0 -0
  187. {springbootai-1.8.2 → springbootai-1.8.4}/springbootAI.egg-info/requires.txt +0 -0
  188. {springbootai-1.8.2 → springbootai-1.8.4}/springbootAI.egg-info/top_level.txt +0 -0
  189. {springbootai-1.8.2 → springbootai-1.8.4}/sql/seata_undo_log.sql +0 -0
  190. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_actuator.py +0 -0
  191. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_ai_module.py +0 -0
  192. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_annotation_combinations.py +0 -0
  193. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_annotations_contract.py +0 -0
  194. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_aop_annotations_full.py +0 -0
  195. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_bean_utils.py +0 -0
  196. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_cache_annotations.py +0 -0
  197. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_cloud_embedded_full.py +0 -0
  198. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_conditional_annotations.py +0 -0
  199. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_config_binding.py +0 -0
  200. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_connection_resilience.py +0 -0
  201. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_core_annotations_full.py +0 -0
  202. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_csv_module.py +0 -0
  203. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_data_repository.py +0 -0
  204. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_datasource_routing.py +0 -0
  205. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_ddl_auto.py +0 -0
  206. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_di_config_event_full.py +0 -0
  207. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_excel_module.py +0 -0
  208. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_i18n_module.py +0 -0
  209. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_jpa_version_transient.py +0 -0
  210. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_orm_pymybatis_full.py +0 -0
  211. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_production_readiness.py +0 -0
  212. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_pymybatis_contract.py +0 -0
  213. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_security.py +0 -0
  214. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_security_full.py +0 -0
  215. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_test_slicing.py +0 -0
  216. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_transactional_events.py +0 -0
  217. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_validation_module.py +0 -0
  218. {springbootai-1.8.2 → springbootai-1.8.4}/tests/test_web_annotations_full.py +0 -0
  219. {springbootai-1.8.2 → springbootai-1.8.4}/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.2
3
+ Version: 1.8.4
4
4
  Summary: Python版Spring Boot框架,集成PyMyBatis ORM
5
5
  Author-email: YuConggen <1516933915@qq.com>
6
6
  License-Expression: MIT
@@ -86,7 +86,7 @@ Dynamic: license-file
86
86
 
87
87
  SpringBootAI 是一个借鉴 Spring Boot 编程模型的 Python Web 框架,提供装饰器式组件扫描、依赖注入、FastAPI 路由、配置加载、安全能力、内嵌的 PyMyBatis ORM,以及企业级 AI 模块(对齐 Spring AI 2.0:ChatClient/Advisor/Tools/RAG/Function Calling)。本指南为框架核心综合使用文档;**AI / ORM / Cloud / Excel 等模块的完整注解与功能说明已分离为独立文档**(见下方“模块文档”),本指南相应章节保留概览与跳转链接。
88
88
 
89
- - SpringBootAI 版本:`1.8.2`
89
+ - SpringBootAI 版本:`1.8.4`
90
90
  - 内嵌 PyMyBatis 版本:`1.4.0`
91
91
  - Python:3.10+
92
92
  - 状态:Beta(企业试点)
@@ -95,10 +95,12 @@ SpringBootAI 是一个借鉴 Spring Boot 编程模型的 Python Web 框架,提
95
95
 
96
96
  ## 模块文档
97
97
 
98
- 各模块的注解参考与功能说明已从本指南分离为独立文档,按需查阅:
98
+ 第一次使用请先读 [新手入门指南](doc/BEGINNER_GUIDE.md)。它从安装开始,带你创建第一个接口,并解释 Controller、Service、Bean、依赖注入和配置文件是什么。各模块文档统一按“解决什么问题 -> 如何启用 -> 最小示例 -> 如何验证 -> 常见错误 -> 生产边界”组织,按需查阅即可,不要求一次读完。
99
99
 
100
100
  | 模块 | 文档 | 安装 | 说明 |
101
101
  |------|------|------|------|
102
+ | 新手入门 | [BEGINNER_GUIDE.md](doc/BEGINNER_GUIDE.md) | 随核心包 | 从零安装、创建项目、运行接口、打开 Swagger、选择后续模块 |
103
+ | 常用注解模块 | [ANNOTATION_MODULES.md](doc/ANNOTATION_MODULES.md) | 随核心包 | Bean Validation / 条件装配 / 缓存增强 / CSV / `@Version` / `@Transient` |
102
104
  | AI(对齐 Spring AI 2.0) | [AI_MODULE.md](doc/AI_MODULE.md) | `pip install springbootAI[ai]` | ChatClient / Advisor / Tools / RAG / Function Calling / ETL / 多厂商 LangChain 化 / 韧性 / 观测 |
103
105
  | 内嵌 PyMyBatis ORM 与 DDL | [ORM_MODULE.md](doc/ORM_MODULE.md) | 随核心包 | Mapper 注解 / XML Mapper / 分页 / SQL 安全 / DDL 自动建表 |
104
106
  | Spring Cloud(对齐 Cloud Alibaba) | [CLOUD_MODULE.md](doc/CLOUD_MODULE.md) | 随核心包 | 服务注册发现 / 配置刷新 / Feign / Sentinel / Gateway / 负载均衡 / 分布式事务 |
@@ -112,6 +114,14 @@ SpringBootAI 是一个借鉴 Spring Boot 编程模型的 Python Web 框架,提
112
114
 
113
115
  > 所有模块文档统一存放于 [`doc/`](doc/) 目录。本指南正文中出现的"已分离至独立文档"链接均指向 `doc/` 下的对应文件。
114
116
 
117
+ ### 新手推荐阅读顺序
118
+
119
+ 1. 按 [新手入门指南](doc/BEGINNER_GUIDE.md) 跑通 `/api/hello/{name}`。
120
+ 2. 阅读本页第 4、6、7 章,理解配置、依赖注入和 Controller。
121
+ 3. 做数据库 CRUD 时阅读 [ORM_MODULE.md](doc/ORM_MODULE.md)。
122
+ 4. 需要输入校验、缓存或条件开关时阅读 [ANNOTATION_MODULES.md](doc/ANNOTATION_MODULES.md)。
123
+ 5. 最后再按业务需要选择安全、Cloud、AI、Excel、WebSocket 或性能测试文档。
124
+
115
125
  ## 目录
116
126
 
117
127
  1. [框架概述与定位](#1-框架概述与定位)
@@ -143,7 +153,7 @@ SpringBootAI 借鉴了 Spring Boot 的注解和分层习惯,但运行时是 Py
143
153
 
144
154
  | 组件 | 当前版本 |
145
155
  |------|----------|
146
- | `spring` 框架 API | 1.8.2 |
156
+ | `spring` 框架 API | 1.8.4 |
147
157
  | `spring.orm.pymybatis` | 1.4.0 |
148
158
  | Python | 3.10+ |
149
159
 
@@ -1965,7 +1975,7 @@ class AdminController:
1965
1975
 
1966
1976
  ### 11.1 @Cacheable
1967
1977
 
1968
- 当前 `@Cacheable` 使用 `BeanFactory` 内的本地缓存,默认最多 1000 项、TTL 300 秒。`value` 是缓存命名空间;`key="user_id"` 取同名参数,`key="user_{user_id}"` 使用模板,其他字符串作为固定键;`condition="enabled"`、`condition="!skip_cache"` 或 callable 决定是否缓存。同步方法缓存普通返回值,异步方法会先 `await` 再缓存最终结果,不会缓存 coroutine。缓存不跨进程,也没有对应的自动驱逐注解。写操作后的业务缓存失效不由 ORM 查询缓存自动替代。
1978
+ 当前缓存默认由 `BeanFactory` 提供本地内存实现,最多 1000 项、TTL 300 秒,不跨进程。`@Cacheable` 负责“先查缓存,未命中才执行方法”;`@CachePut` 负责执行方法后写入新值;`@CacheEvict` 负责删除一个键或清空一个命名空间;`@CacheConfig` 和 `@Caching` 用于统一命名空间或组合多个操作。`value` 是缓存命名空间;`key="user_id"` 取同名参数,`key="user_{user_id}"` 使用模板,其他字符串作为固定键;`condition="enabled"`、`condition="!skip_cache"` 或 callable 决定是否缓存。同步方法缓存普通返回值,异步方法会先 `await` 再缓存最终结果,不会缓存 coroutine。写操作后的业务缓存失效仍需由业务方法显式使用 `@CachePut`/`@CacheEvict`;生产多 worker 或多实例应接入共享 Redis,并自行验证一致性和故障降级。
1969
1979
 
1970
1980
  ### 11.2 @Retryable
1971
1981
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  SpringBootAI 是一个借鉴 Spring Boot 编程模型的 Python Web 框架,提供装饰器式组件扫描、依赖注入、FastAPI 路由、配置加载、安全能力、内嵌的 PyMyBatis ORM,以及企业级 AI 模块(对齐 Spring AI 2.0:ChatClient/Advisor/Tools/RAG/Function Calling)。本指南为框架核心综合使用文档;**AI / ORM / Cloud / Excel 等模块的完整注解与功能说明已分离为独立文档**(见下方“模块文档”),本指南相应章节保留概览与跳转链接。
4
4
 
5
- - SpringBootAI 版本:`1.8.2`
5
+ - SpringBootAI 版本:`1.8.4`
6
6
  - 内嵌 PyMyBatis 版本:`1.4.0`
7
7
  - Python:3.10+
8
8
  - 状态:Beta(企业试点)
@@ -11,10 +11,12 @@ SpringBootAI 是一个借鉴 Spring Boot 编程模型的 Python Web 框架,提
11
11
 
12
12
  ## 模块文档
13
13
 
14
- 各模块的注解参考与功能说明已从本指南分离为独立文档,按需查阅:
14
+ 第一次使用请先读 [新手入门指南](doc/BEGINNER_GUIDE.md)。它从安装开始,带你创建第一个接口,并解释 Controller、Service、Bean、依赖注入和配置文件是什么。各模块文档统一按“解决什么问题 -> 如何启用 -> 最小示例 -> 如何验证 -> 常见错误 -> 生产边界”组织,按需查阅即可,不要求一次读完。
15
15
 
16
16
  | 模块 | 文档 | 安装 | 说明 |
17
17
  |------|------|------|------|
18
+ | 新手入门 | [BEGINNER_GUIDE.md](doc/BEGINNER_GUIDE.md) | 随核心包 | 从零安装、创建项目、运行接口、打开 Swagger、选择后续模块 |
19
+ | 常用注解模块 | [ANNOTATION_MODULES.md](doc/ANNOTATION_MODULES.md) | 随核心包 | Bean Validation / 条件装配 / 缓存增强 / CSV / `@Version` / `@Transient` |
18
20
  | AI(对齐 Spring AI 2.0) | [AI_MODULE.md](doc/AI_MODULE.md) | `pip install springbootAI[ai]` | ChatClient / Advisor / Tools / RAG / Function Calling / ETL / 多厂商 LangChain 化 / 韧性 / 观测 |
19
21
  | 内嵌 PyMyBatis ORM 与 DDL | [ORM_MODULE.md](doc/ORM_MODULE.md) | 随核心包 | Mapper 注解 / XML Mapper / 分页 / SQL 安全 / DDL 自动建表 |
20
22
  | Spring Cloud(对齐 Cloud Alibaba) | [CLOUD_MODULE.md](doc/CLOUD_MODULE.md) | 随核心包 | 服务注册发现 / 配置刷新 / Feign / Sentinel / Gateway / 负载均衡 / 分布式事务 |
@@ -28,6 +30,14 @@ SpringBootAI 是一个借鉴 Spring Boot 编程模型的 Python Web 框架,提
28
30
 
29
31
  > 所有模块文档统一存放于 [`doc/`](doc/) 目录。本指南正文中出现的"已分离至独立文档"链接均指向 `doc/` 下的对应文件。
30
32
 
33
+ ### 新手推荐阅读顺序
34
+
35
+ 1. 按 [新手入门指南](doc/BEGINNER_GUIDE.md) 跑通 `/api/hello/{name}`。
36
+ 2. 阅读本页第 4、6、7 章,理解配置、依赖注入和 Controller。
37
+ 3. 做数据库 CRUD 时阅读 [ORM_MODULE.md](doc/ORM_MODULE.md)。
38
+ 4. 需要输入校验、缓存或条件开关时阅读 [ANNOTATION_MODULES.md](doc/ANNOTATION_MODULES.md)。
39
+ 5. 最后再按业务需要选择安全、Cloud、AI、Excel、WebSocket 或性能测试文档。
40
+
31
41
  ## 目录
32
42
 
33
43
  1. [框架概述与定位](#1-框架概述与定位)
@@ -59,7 +69,7 @@ SpringBootAI 借鉴了 Spring Boot 的注解和分层习惯,但运行时是 Py
59
69
 
60
70
  | 组件 | 当前版本 |
61
71
  |------|----------|
62
- | `spring` 框架 API | 1.8.2 |
72
+ | `spring` 框架 API | 1.8.4 |
63
73
  | `spring.orm.pymybatis` | 1.4.0 |
64
74
  | Python | 3.10+ |
65
75
 
@@ -1881,7 +1891,7 @@ class AdminController:
1881
1891
 
1882
1892
  ### 11.1 @Cacheable
1883
1893
 
1884
- 当前 `@Cacheable` 使用 `BeanFactory` 内的本地缓存,默认最多 1000 项、TTL 300 秒。`value` 是缓存命名空间;`key="user_id"` 取同名参数,`key="user_{user_id}"` 使用模板,其他字符串作为固定键;`condition="enabled"`、`condition="!skip_cache"` 或 callable 决定是否缓存。同步方法缓存普通返回值,异步方法会先 `await` 再缓存最终结果,不会缓存 coroutine。缓存不跨进程,也没有对应的自动驱逐注解。写操作后的业务缓存失效不由 ORM 查询缓存自动替代。
1894
+ 当前缓存默认由 `BeanFactory` 提供本地内存实现,最多 1000 项、TTL 300 秒,不跨进程。`@Cacheable` 负责“先查缓存,未命中才执行方法”;`@CachePut` 负责执行方法后写入新值;`@CacheEvict` 负责删除一个键或清空一个命名空间;`@CacheConfig` 和 `@Caching` 用于统一命名空间或组合多个操作。`value` 是缓存命名空间;`key="user_id"` 取同名参数,`key="user_{user_id}"` 使用模板,其他字符串作为固定键;`condition="enabled"`、`condition="!skip_cache"` 或 callable 决定是否缓存。同步方法缓存普通返回值,异步方法会先 `await` 再缓存最终结果,不会缓存 coroutine。写操作后的业务缓存失效仍需由业务方法显式使用 `@CachePut`/`@CacheEvict`;生产多 worker 或多实例应接入共享 Redis,并自行验证一致性和故障降级。
1885
1895
 
1886
1896
  ### 11.2 @Retryable
1887
1897
 
@@ -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.2"
15
+ version = "1.8.4"
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.2"
8
+ __version__ = "1.8.4"
9
9
  __author__ = "yuconggen"
10
10
  __license__ = "MIT"
11
11
 
@@ -3,6 +3,7 @@ Spring Cloud AOP 切面实现(企业级版本)
3
3
  使用真实的分布式组件:Seata事务、Nacos服务发现、Sentinel限流熔断等
4
4
  """
5
5
  from typing import Any, Callable, Dict, List, Optional, Type
6
+ import asyncio
6
7
  import time
7
8
  import functools
8
9
  import threading
@@ -139,17 +140,44 @@ def global_transactional_decorator(annotation: GlobalTransactional):
139
140
  if seata_manager.is_in_transaction():
140
141
  logger.warning("[GlobalTransactional] Nested transaction detected, skipping")
141
142
  return await func(*args, **kwargs)
142
- tx_id = begin_transaction()
143
+ if seata_manager.get_mode() == "http":
144
+ tx_id = await asyncio.to_thread(begin_transaction)
145
+ transaction_context = await asyncio.to_thread(
146
+ seata_manager.get_transaction_context, tx_id
147
+ )
148
+ if transaction_context is None:
149
+ seata_manager._cleanup_context()
150
+ raise RuntimeError(
151
+ f"Unable to bind durable HTTP transaction context: {tx_id}"
152
+ )
153
+ seata_manager.bind_transaction_context(transaction_context)
154
+ else:
155
+ tx_id = begin_transaction()
143
156
  start_time = time.monotonic()
144
157
  try:
145
158
  result = await func(*args, **kwargs)
146
- commit_transaction(tx_id, time.monotonic() - start_time)
147
- return result
148
159
  except Exception:
149
160
  if seata_manager.is_in_transaction():
150
- seata_manager.rollback_transaction(tx_id)
161
+ try:
162
+ await asyncio.to_thread(
163
+ seata_manager.rollback_transaction, tx_id
164
+ )
165
+ finally:
166
+ # Context changes in to_thread stay in its copied
167
+ # context, so clear the event-loop task explicitly.
168
+ seata_manager._cleanup_context()
151
169
  raise
152
170
 
171
+ try:
172
+ await asyncio.to_thread(
173
+ commit_transaction,
174
+ tx_id,
175
+ time.monotonic() - start_time,
176
+ )
177
+ return result
178
+ finally:
179
+ seata_manager._cleanup_context()
180
+
153
181
  return async_wrapper
154
182
 
155
183
  @functools.wraps(func)
@@ -18,6 +18,7 @@ from spring.cloud.seata import (
18
18
  SeataTransactionManager,
19
19
  BranchStatus,
20
20
  )
21
+ from spring.cloud.transaction_store import SQLiteTransactionStore
21
22
  from spring.cloud.sentinel import (
22
23
  sentinel_engine,
23
24
  SentinelEngine,
@@ -63,6 +64,7 @@ __all__ = [
63
64
  'FeignClientProxy', 'FeignClientFactory', 'create_feign_client', 'create_declared_feign_client',
64
65
  # 分布式事务
65
66
  'seata_manager', 'init_seata', 'SeataTransactionManager', 'BranchStatus',
67
+ 'SQLiteTransactionStore',
66
68
  # 熔断限流
67
69
  'sentinel_engine', 'SentinelEngine', 'FlowRule', 'DegradeRule',
68
70
  'SystemRule', 'HotParamRule', 'BlockException', 'sentinel_protect',
@@ -185,9 +185,10 @@ class GatewayRouter:
185
185
  作为异步 Starlette/FastAPI endpoint 使用。上游 I/O 不会阻塞事件循环。
186
186
 
187
187
  Usage:
188
- gateway = GatewayRouter(discovery_client=nacos_discovery)
189
- gateway.route("/api/users/**", "user-service", strip_prefix=True)
190
- app.add_route("/api/{path:path}", gateway.handle_asgi, methods=["GET","POST","PUT","DELETE"])
188
+ gateway = GatewayRouter(timeout=5)
189
+ gateway.route("/api/users/**", uri="http://127.0.0.1:8081",
190
+ strip_prefix=True)
191
+ gateway.install(app, "/api/{path:path}")
191
192
  """
192
193
 
193
194
  _HOP_BY_HOP_HEADERS = {
@@ -216,11 +217,27 @@ class GatewayRouter:
216
217
  def install(self, app, path: str = "/{path:path}",
217
218
  methods: Optional[List[str]] = None) -> "GatewayRouter":
218
219
  """Register the gateway route and its HTTP-client shutdown hook."""
219
- app.add_api_route(
220
- path,
221
- self.handle_asgi,
222
- methods=methods or ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"],
223
- )
220
+ route_methods = methods or ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"]
221
+ path_id = re.sub(r"[^a-zA-Z0-9]+", "_", path).strip("_") or "root"
222
+ existing_operation_ids = {
223
+ getattr(route, "operation_id", None) for route in app.routes
224
+ }
225
+ for method in route_methods:
226
+ normalized_method = method.upper()
227
+ base_operation_id = f"gateway_{normalized_method.lower()}_{path_id}"
228
+ operation_id = base_operation_id
229
+ suffix = 2
230
+ while operation_id in existing_operation_ids:
231
+ operation_id = f"{base_operation_id}_{suffix}"
232
+ suffix += 1
233
+ existing_operation_ids.add(operation_id)
234
+ app.add_api_route(
235
+ path,
236
+ self.handle_asgi,
237
+ methods=[normalized_method],
238
+ name=operation_id,
239
+ operation_id=operation_id,
240
+ )
224
241
  app.router.add_event_handler("shutdown", self.aclose)
225
242
  return self
226
243