springbootAI 2.2.1__tar.gz → 2.2.3__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 (290) hide show
  1. {springbootai-2.2.1 → springbootai-2.2.3}/CHANGELOG.md +40 -0
  2. {springbootai-2.2.1/springbootAI.egg-info → springbootai-2.2.3}/PKG-INFO +1 -1
  3. {springbootai-2.2.1 → springbootai-2.2.3}/pyproject.toml +1 -1
  4. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/ddl_auto.py +174 -33
  5. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/version.py +1 -1
  6. {springbootai-2.2.1 → springbootai-2.2.3/springbootAI.egg-info}/PKG-INFO +1 -1
  7. {springbootai-2.2.1 → springbootai-2.2.3}/LICENSE +0 -0
  8. {springbootai-2.2.1 → springbootai-2.2.3}/MANIFEST.in +0 -0
  9. {springbootai-2.2.1 → springbootai-2.2.3}/README.md +0 -0
  10. {springbootai-2.2.1 → springbootai-2.2.3}/SECURITY.md +0 -0
  11. {springbootai-2.2.1 → springbootai-2.2.3}/requirements-ai.txt +0 -0
  12. {springbootai-2.2.1 → springbootai-2.2.3}/requirements-langgraph.txt +0 -0
  13. {springbootai-2.2.1 → springbootai-2.2.3}/requirements-mcp.txt +0 -0
  14. {springbootai-2.2.1 → springbootai-2.2.3}/requirements.txt +0 -0
  15. {springbootai-2.2.1 → springbootai-2.2.3}/setup.cfg +0 -0
  16. {springbootai-2.2.1 → springbootai-2.2.3}/setup.py +0 -0
  17. {springbootai-2.2.1 → springbootai-2.2.3}/spring/__init__.py +0 -0
  18. {springbootai-2.2.1 → springbootai-2.2.3}/spring/ai/__init__.py +0 -0
  19. {springbootai-2.2.1 → springbootai-2.2.3}/spring/ai/advisors.py +0 -0
  20. {springbootai-2.2.1 → springbootai-2.2.3}/spring/ai/annotations.py +0 -0
  21. {springbootai-2.2.1 → springbootai-2.2.3}/spring/ai/autoconfig.py +0 -0
  22. {springbootai-2.2.1 → springbootai-2.2.3}/spring/ai/core.py +0 -0
  23. {springbootai-2.2.1 → springbootai-2.2.3}/spring/ai/etl.py +0 -0
  24. {springbootai-2.2.1 → springbootai-2.2.3}/spring/ai/memory.py +0 -0
  25. {springbootai-2.2.1 → springbootai-2.2.3}/spring/ai/observability.py +0 -0
  26. {springbootai-2.2.1 → springbootai-2.2.3}/spring/ai/providers.py +0 -0
  27. {springbootai-2.2.1 → springbootai-2.2.3}/spring/ai/resilience.py +0 -0
  28. {springbootai-2.2.1 → springbootai-2.2.3}/spring/ai/tools.py +0 -0
  29. {springbootai-2.2.1 → springbootai-2.2.3}/spring/ai/vectorstore.py +0 -0
  30. {springbootai-2.2.1 → springbootai-2.2.3}/spring/annotations/__init__.py +0 -0
  31. {springbootai-2.2.1 → springbootai-2.2.3}/spring/annotations/cache.py +0 -0
  32. {springbootai-2.2.1 → springbootai-2.2.3}/spring/annotations/cloud.py +0 -0
  33. {springbootai-2.2.1 → springbootai-2.2.3}/spring/annotations/conditional.py +0 -0
  34. {springbootai-2.2.1 → springbootai-2.2.3}/spring/annotations/core.py +0 -0
  35. {springbootai-2.2.1 → springbootai-2.2.3}/spring/annotations/langchain.py +0 -0
  36. {springbootai-2.2.1 → springbootai-2.2.3}/spring/annotations/langgraph.py +0 -0
  37. {springbootai-2.2.1 → springbootai-2.2.3}/spring/annotations/messaging.py +0 -0
  38. {springbootai-2.2.1 → springbootai-2.2.3}/spring/aop/__init__.py +0 -0
  39. {springbootai-2.2.1 → springbootai-2.2.3}/spring/aop/aspect.py +0 -0
  40. {springbootai-2.2.1 → springbootai-2.2.3}/spring/aop/cloud_aop.py +0 -0
  41. {springbootai-2.2.1 → springbootai-2.2.3}/spring/aop/comprehensive_aop.py +0 -0
  42. {springbootai-2.2.1 → springbootai-2.2.3}/spring/aop/method_interceptor.py +0 -0
  43. {springbootai-2.2.1 → springbootai-2.2.3}/spring/aop/proxy_factory.py +0 -0
  44. {springbootai-2.2.1 → springbootai-2.2.3}/spring/cloud/__init__.py +0 -0
  45. {springbootai-2.2.1 → springbootai-2.2.3}/spring/cloud/discovery.py +0 -0
  46. {springbootai-2.2.1 → springbootai-2.2.3}/spring/cloud/feign.py +0 -0
  47. {springbootai-2.2.1 → springbootai-2.2.3}/spring/cloud/gateway.py +0 -0
  48. {springbootai-2.2.1 → springbootai-2.2.3}/spring/cloud/load_balancer.py +0 -0
  49. {springbootai-2.2.1 → springbootai-2.2.3}/spring/cloud/seata.py +0 -0
  50. {springbootai-2.2.1 → springbootai-2.2.3}/spring/cloud/seata_bridge.py +0 -0
  51. {springbootai-2.2.1 → springbootai-2.2.3}/spring/cloud/sentinel.py +0 -0
  52. {springbootai-2.2.1 → springbootai-2.2.3}/spring/cloud/tracer.py +0 -0
  53. {springbootai-2.2.1 → springbootai-2.2.3}/spring/cloud/transaction_store.py +0 -0
  54. {springbootai-2.2.1 → springbootai-2.2.3}/spring/config/__init__.py +0 -0
  55. {springbootai-2.2.1 → springbootai-2.2.3}/spring/config/binding.py +0 -0
  56. {springbootai-2.2.1 → springbootai-2.2.3}/spring/config/config_loader.py +0 -0
  57. {springbootai-2.2.1 → springbootai-2.2.3}/spring/context/__init__.py +0 -0
  58. {springbootai-2.2.1 → springbootai-2.2.3}/spring/context/application_context.py +0 -0
  59. {springbootai-2.2.1 → springbootai-2.2.3}/spring/context/bean_definition.py +0 -0
  60. {springbootai-2.2.1 → springbootai-2.2.3}/spring/context/bean_factory.py +0 -0
  61. {springbootai-2.2.1 → springbootai-2.2.3}/spring/context/registry.py +0 -0
  62. {springbootai-2.2.1 → springbootai-2.2.3}/spring/context/scanner.py +0 -0
  63. {springbootai-2.2.1 → springbootai-2.2.3}/spring/core/__init__.py +0 -0
  64. {springbootai-2.2.1 → springbootai-2.2.3}/spring/core/graceful_shutdown.py +0 -0
  65. {springbootai-2.2.1 → springbootai-2.2.3}/spring/core/typing_utils.py +0 -0
  66. {springbootai-2.2.1 → springbootai-2.2.3}/spring/csv/__init__.py +0 -0
  67. {springbootai-2.2.1 → springbootai-2.2.3}/spring/csv/annotations.py +0 -0
  68. {springbootai-2.2.1 → springbootai-2.2.3}/spring/csv/converters.py +0 -0
  69. {springbootai-2.2.1 → springbootai-2.2.3}/spring/csv/easy_csv.py +0 -0
  70. {springbootai-2.2.1 → springbootai-2.2.3}/spring/csv/exceptions.py +0 -0
  71. {springbootai-2.2.1 → springbootai-2.2.3}/spring/csv/reader.py +0 -0
  72. {springbootai-2.2.1 → springbootai-2.2.3}/spring/csv/writer.py +0 -0
  73. {springbootai-2.2.1 → springbootai-2.2.3}/spring/data/__init__.py +0 -0
  74. {springbootai-2.2.1 → springbootai-2.2.3}/spring/data/page.py +0 -0
  75. {springbootai-2.2.1 → springbootai-2.2.3}/spring/data/repository.py +0 -0
  76. {springbootai-2.2.1 → springbootai-2.2.3}/spring/data/specification.py +0 -0
  77. {springbootai-2.2.1 → springbootai-2.2.3}/spring/datasource/__init__.py +0 -0
  78. {springbootai-2.2.1 → springbootai-2.2.3}/spring/datasource/annotations.py +0 -0
  79. {springbootai-2.2.1 → springbootai-2.2.3}/spring/datasource/context.py +0 -0
  80. {springbootai-2.2.1 → springbootai-2.2.3}/spring/datasource/dynamic.py +0 -0
  81. {springbootai-2.2.1 → springbootai-2.2.3}/spring/event/__init__.py +0 -0
  82. {springbootai-2.2.1 → springbootai-2.2.3}/spring/event/publisher.py +0 -0
  83. {springbootai-2.2.1 → springbootai-2.2.3}/spring/excel/__init__.py +0 -0
  84. {springbootai-2.2.1 → springbootai-2.2.3}/spring/excel/annotations.py +0 -0
  85. {springbootai-2.2.1 → springbootai-2.2.3}/spring/excel/converters.py +0 -0
  86. {springbootai-2.2.1 → springbootai-2.2.3}/spring/excel/easy_excel.py +0 -0
  87. {springbootai-2.2.1 → springbootai-2.2.3}/spring/excel/exceptions.py +0 -0
  88. {springbootai-2.2.1 → springbootai-2.2.3}/spring/excel/reader.py +0 -0
  89. {springbootai-2.2.1 → springbootai-2.2.3}/spring/excel/style.py +0 -0
  90. {springbootai-2.2.1 → springbootai-2.2.3}/spring/excel/writer.py +0 -0
  91. {springbootai-2.2.1 → springbootai-2.2.3}/spring/i18n/__init__.py +0 -0
  92. {springbootai-2.2.1 → springbootai-2.2.3}/spring/i18n/accessor.py +0 -0
  93. {springbootai-2.2.1 → springbootai-2.2.3}/spring/i18n/auto_config.py +0 -0
  94. {springbootai-2.2.1 → springbootai-2.2.3}/spring/i18n/holder.py +0 -0
  95. {springbootai-2.2.1 → springbootai-2.2.3}/spring/i18n/locale.py +0 -0
  96. {springbootai-2.2.1 → springbootai-2.2.3}/spring/i18n/locale_resolver.py +0 -0
  97. {springbootai-2.2.1 → springbootai-2.2.3}/spring/i18n/message_source.py +0 -0
  98. {springbootai-2.2.1 → springbootai-2.2.3}/spring/i18n/middleware.py +0 -0
  99. {springbootai-2.2.1 → springbootai-2.2.3}/spring/i18n/properties.py +0 -0
  100. {springbootai-2.2.1 → springbootai-2.2.3}/spring/i18n/sources.py +0 -0
  101. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/__init__.py +0 -0
  102. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/adapters.py +0 -0
  103. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/agents/__init__.py +0 -0
  104. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/agents/services.py +0 -0
  105. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/annotations.py +0 -0
  106. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/autoconfig.py +0 -0
  107. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/callbacks/__init__.py +0 -0
  108. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/callbacks/handlers.py +0 -0
  109. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/chains/__init__.py +0 -0
  110. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/chains/services.py +0 -0
  111. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/core.py +0 -0
  112. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/indexes/__init__.py +0 -0
  113. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/indexes/index.py +0 -0
  114. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/loaders/__init__.py +0 -0
  115. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/loaders/loaders.py +0 -0
  116. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/memory/__init__.py +0 -0
  117. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/memory/memory.py +0 -0
  118. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/parsers/__init__.py +0 -0
  119. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/parsers/parsers.py +0 -0
  120. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/partners.py +0 -0
  121. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/prompts/__init__.py +0 -0
  122. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/prompts/templates.py +0 -0
  123. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/retrievers/__init__.py +0 -0
  124. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/retrievers/retrievers.py +0 -0
  125. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/tools/__init__.py +0 -0
  126. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/tools/tools.py +0 -0
  127. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/utilities/__init__.py +0 -0
  128. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/utilities/utils.py +0 -0
  129. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/vectorstores/__init__.py +0 -0
  130. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langchain/vectorstores/stores.py +0 -0
  131. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langgraph/__init__.py +0 -0
  132. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langgraph/annotation_runtime.py +0 -0
  133. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langgraph/annotations.py +0 -0
  134. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langgraph/autoconfig.py +0 -0
  135. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langgraph/checkpoint.py +0 -0
  136. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langgraph/config.py +0 -0
  137. {springbootai-2.2.1 → springbootai-2.2.3}/spring/langgraph/runtime.py +0 -0
  138. {springbootai-2.2.1 → springbootai-2.2.3}/spring/logging/__init__.py +0 -0
  139. {springbootai-2.2.1 → springbootai-2.2.3}/spring/logging/loguru_logger.py +0 -0
  140. {springbootai-2.2.1 → springbootai-2.2.3}/spring/main.py +0 -0
  141. {springbootai-2.2.1 → springbootai-2.2.3}/spring/mcp/__init__.py +0 -0
  142. {springbootai-2.2.1 → springbootai-2.2.3}/spring/mcp/annotation_runtime.py +0 -0
  143. {springbootai-2.2.1 → springbootai-2.2.3}/spring/mcp/annotations.py +0 -0
  144. {springbootai-2.2.1 → springbootai-2.2.3}/spring/mcp/autoconfig.py +0 -0
  145. {springbootai-2.2.1 → springbootai-2.2.3}/spring/mcp/client.py +0 -0
  146. {springbootai-2.2.1 → springbootai-2.2.3}/spring/mcp/config.py +0 -0
  147. {springbootai-2.2.1 → springbootai-2.2.3}/spring/mcp/server.py +0 -0
  148. {springbootai-2.2.1 → springbootai-2.2.3}/spring/messaging/__init__.py +0 -0
  149. {springbootai-2.2.1 → springbootai-2.2.3}/spring/messaging/rabbitmq.py +0 -0
  150. {springbootai-2.2.1 → springbootai-2.2.3}/spring/monitoring/__init__.py +0 -0
  151. {springbootai-2.2.1 → springbootai-2.2.3}/spring/monitoring/prometheus.py +0 -0
  152. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/__init__.py +0 -0
  153. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/database.py +0 -0
  154. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/migration.py +0 -0
  155. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/mybatis_integration.py +0 -0
  156. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/__init__.py +0 -0
  157. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/annotations/__init__.py +0 -0
  158. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/annotations/annotations.py +0 -0
  159. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/cache/__init__.py +0 -0
  160. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/cache/cache.py +0 -0
  161. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/cache/redis_cache.py +0 -0
  162. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/circuit_breaker/__init__.py +0 -0
  163. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/circuit_breaker/circuit_breaker.py +0 -0
  164. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/configuration.py +0 -0
  165. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/core/__init__.py +0 -0
  166. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/core/sql_session.py +0 -0
  167. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/core/sql_session_factory.py +0 -0
  168. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/dialect/__init__.py +0 -0
  169. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/dialect/dialect.py +0 -0
  170. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/dynamic_sql/__init__.py +0 -0
  171. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/dynamic_sql/dynamic_sql.py +0 -0
  172. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/interceptor/__init__.py +0 -0
  173. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/interceptor/interceptor.py +0 -0
  174. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/mapper/__init__.py +0 -0
  175. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/mapper/mapper.py +0 -0
  176. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/metrics/__init__.py +0 -0
  177. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/metrics/metrics.py +0 -0
  178. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/pool/__init__.py +0 -0
  179. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/pool/connection_pool.py +0 -0
  180. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/security/__init__.py +0 -0
  181. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/security/access_control.py +0 -0
  182. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/security/password_encoder.py +0 -0
  183. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/security/sensitive_data_masker.py +0 -0
  184. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/security/sql_injection_detector.py +0 -0
  185. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/transaction/__init__.py +0 -0
  186. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/transaction/transaction.py +0 -0
  187. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/type_handler/__init__.py +0 -0
  188. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/type_handler/type_handler.py +0 -0
  189. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/xml_parser/__init__.py +0 -0
  190. {springbootai-2.2.1 → springbootai-2.2.3}/spring/orm/pymybatis/xml_parser/xml_parser.py +0 -0
  191. {springbootai-2.2.1 → springbootai-2.2.3}/spring/retry/__init__.py +0 -0
  192. {springbootai-2.2.1 → springbootai-2.2.3}/spring/retry/recovery.py +0 -0
  193. {springbootai-2.2.1 → springbootai-2.2.3}/spring/retry/retry_annotations.py +0 -0
  194. {springbootai-2.2.1 → springbootai-2.2.3}/spring/retry/retry_decorator.py +0 -0
  195. {springbootai-2.2.1 → springbootai-2.2.3}/spring/scheduling/__init__.py +0 -0
  196. {springbootai-2.2.1 → springbootai-2.2.3}/spring/scheduling/scheduler.py +0 -0
  197. {springbootai-2.2.1 → springbootai-2.2.3}/spring/security/__init__.py +0 -0
  198. {springbootai-2.2.1 → springbootai-2.2.3}/spring/security/jwt_utils.py +0 -0
  199. {springbootai-2.2.1 → springbootai-2.2.3}/spring/security/replay_protection.py +0 -0
  200. {springbootai-2.2.1 → springbootai-2.2.3}/spring/security/secret_manager.py +0 -0
  201. {springbootai-2.2.1 → springbootai-2.2.3}/spring/security/security_aop.py +0 -0
  202. {springbootai-2.2.1 → springbootai-2.2.3}/spring/security/security_context.py +0 -0
  203. {springbootai-2.2.1 → springbootai-2.2.3}/spring/test/__init__.py +0 -0
  204. {springbootai-2.2.1 → springbootai-2.2.3}/spring/test/slicing.py +0 -0
  205. {springbootai-2.2.1 → springbootai-2.2.3}/spring/tracing/__init__.py +0 -0
  206. {springbootai-2.2.1 → springbootai-2.2.3}/spring/tracing/skywalking.py +0 -0
  207. {springbootai-2.2.1 → springbootai-2.2.3}/spring/tx/__init__.py +0 -0
  208. {springbootai-2.2.1 → springbootai-2.2.3}/spring/tx/events.py +0 -0
  209. {springbootai-2.2.1 → springbootai-2.2.3}/spring/tx/synchronization.py +0 -0
  210. {springbootai-2.2.1 → springbootai-2.2.3}/spring/utils/__init__.py +0 -0
  211. {springbootai-2.2.1 → springbootai-2.2.3}/spring/utils/banner.py +0 -0
  212. {springbootai-2.2.1 → springbootai-2.2.3}/spring/utils/bean_utils.py +0 -0
  213. {springbootai-2.2.1 → springbootai-2.2.3}/spring/utils/logger.py +0 -0
  214. {springbootai-2.2.1 → springbootai-2.2.3}/spring/utils/redis_client.py +0 -0
  215. {springbootai-2.2.1 → springbootai-2.2.3}/spring/validation/__init__.py +0 -0
  216. {springbootai-2.2.1 → springbootai-2.2.3}/spring/validation/aop.py +0 -0
  217. {springbootai-2.2.1 → springbootai-2.2.3}/spring/validation/constraints.py +0 -0
  218. {springbootai-2.2.1 → springbootai-2.2.3}/spring/validation/exceptions.py +0 -0
  219. {springbootai-2.2.1 → springbootai-2.2.3}/spring/validation/validator.py +0 -0
  220. {springbootai-2.2.1 → springbootai-2.2.3}/spring/web/__init__.py +0 -0
  221. {springbootai-2.2.1 → springbootai-2.2.3}/spring/web/actuator.py +0 -0
  222. {springbootai-2.2.1 → springbootai-2.2.3}/spring/web/exception_handler.py +0 -0
  223. {springbootai-2.2.1 → springbootai-2.2.3}/spring/web/health.py +0 -0
  224. {springbootai-2.2.1 → springbootai-2.2.3}/spring/web/interceptor.py +0 -0
  225. {springbootai-2.2.1 → springbootai-2.2.3}/spring/web/result.py +0 -0
  226. {springbootai-2.2.1 → springbootai-2.2.3}/spring/web/swagger.py +0 -0
  227. {springbootai-2.2.1 → springbootai-2.2.3}/spring/web/web_context.py +0 -0
  228. {springbootai-2.2.1 → springbootai-2.2.3}/spring/websocket/__init__.py +0 -0
  229. {springbootai-2.2.1 → springbootai-2.2.3}/spring/websocket/annotations.py +0 -0
  230. {springbootai-2.2.1 → springbootai-2.2.3}/spring/websocket/broker.py +0 -0
  231. {springbootai-2.2.1 → springbootai-2.2.3}/spring/websocket/exceptions.py +0 -0
  232. {springbootai-2.2.1 → springbootai-2.2.3}/spring/websocket/handler.py +0 -0
  233. {springbootai-2.2.1 → springbootai-2.2.3}/spring/websocket/router.py +0 -0
  234. {springbootai-2.2.1 → springbootai-2.2.3}/spring/websocket/session.py +0 -0
  235. {springbootai-2.2.1 → springbootai-2.2.3}/springbootAI.egg-info/SOURCES.txt +0 -0
  236. {springbootai-2.2.1 → springbootai-2.2.3}/springbootAI.egg-info/dependency_links.txt +0 -0
  237. {springbootai-2.2.1 → springbootai-2.2.3}/springbootAI.egg-info/entry_points.txt +0 -0
  238. {springbootai-2.2.1 → springbootai-2.2.3}/springbootAI.egg-info/requires.txt +0 -0
  239. {springbootai-2.2.1 → springbootai-2.2.3}/springbootAI.egg-info/top_level.txt +0 -0
  240. {springbootai-2.2.1 → springbootai-2.2.3}/sql/seata_undo_log.sql +0 -0
  241. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_actuator.py +0 -0
  242. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_ai_comprehensive.py +0 -0
  243. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_ai_declarative_annotations.py +0 -0
  244. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_ai_module.py +0 -0
  245. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_annotation_combinations.py +0 -0
  246. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_annotations_contract.py +0 -0
  247. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_aop_annotations_full.py +0 -0
  248. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_audit_time.py +0 -0
  249. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_bean_utils.py +0 -0
  250. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_cache_annotations.py +0 -0
  251. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_cloud_embedded_full.py +0 -0
  252. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_component_init_error.py +0 -0
  253. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_conditional_annotations.py +0 -0
  254. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_config_binding.py +0 -0
  255. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_config_fixes_185.py +0 -0
  256. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_connection_resilience.py +0 -0
  257. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_core_annotations_full.py +0 -0
  258. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_csv_module.py +0 -0
  259. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_data_repository.py +0 -0
  260. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_datasource_routing.py +0 -0
  261. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_ddl_auto.py +0 -0
  262. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_declarative_aop_post_authorize_recover.py +0 -0
  263. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_di_config_event_full.py +0 -0
  264. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_excel_module.py +0 -0
  265. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_i18n_module.py +0 -0
  266. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_jpa_version_transient.py +0 -0
  267. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_langchain_comprehensive.py +0 -0
  268. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_langchain_ext.py +0 -0
  269. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_langchain_module.py +0 -0
  270. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_langgraph_comprehensive.py +0 -0
  271. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_langgraph_module.py +0 -0
  272. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_logging_config.py +0 -0
  273. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_mcp_module.py +0 -0
  274. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_new_features.py +0 -0
  275. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_orm_pymybatis_full.py +0 -0
  276. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_production_readiness.py +0 -0
  277. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_pymybatis_contract.py +0 -0
  278. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_seata_bridge.py +0 -0
  279. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_seata_durable_store.py +0 -0
  280. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_security.py +0 -0
  281. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_security_full.py +0 -0
  282. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_security_hardening.py +0 -0
  283. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_swagger_module.py +0 -0
  284. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_test_slicing.py +0 -0
  285. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_transactional_events.py +0 -0
  286. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_validation_module.py +0 -0
  287. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_web_annotations_full.py +0 -0
  288. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_web_root_mapping.py +0 -0
  289. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_web_static_files.py +0 -0
  290. {springbootai-2.2.1 → springbootai-2.2.3}/tests/test_websocket_module.py +0 -0
@@ -1,5 +1,45 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.2.3] - 2026-08-13
4
+
5
+ ### 新增
6
+
7
+ - ORM 实体字段自动推断:类型注解无需显式 `= Column(...)` 赋值,对齐 Java JPA 字段自动映射。
8
+ - `name: str` → 自动创建 `Column(default=None)`
9
+ - `name: str = ""` → 自动创建 `Column(default="")`
10
+ - `name: int = 0` → 自动创建 `Column(default=0)`
11
+ - 已有 `Column()`/`Id()`/`CreateTime()` 等描述符的字段保留不覆盖
12
+ - 以 `_` 开头的私有字段自动跳过
13
+
14
+ ```python
15
+ @Entity
16
+ @Table(name="sys_user", comment="用户表")
17
+ class User:
18
+ id: int = Id()
19
+ username: str = "" # 自动推断 Column(default="")
20
+ display_name: str = "系统管理员" # 自动推断 Column(default="系统管理员")
21
+ enabled: bool = True # 自动推断 Column(default=True)
22
+ _cache: dict = {} # 私有字段,跳过
23
+ ```
24
+
25
+ - `_parse_entity` 跳过以 `_` 开头的私有字段,不生成 DDL 列。
26
+
27
+ ## [2.2.2] - 2026-08-13
28
+
29
+ ### 新增
30
+
31
+ - ORM `@Entity` / `@Table` 注解对齐 Java JPA 分离风格,支持三种写法(均向后兼容):
32
+
33
+ | 写法 | 说明 | 对齐 Java |
34
+ |------|------|-----------|
35
+ | `@Entity` + `@Table(...)` | 分离风格(推荐) | `@Entity` + `@Table` |
36
+ | `@Entity` 无括号 | 表名自动推导为 snake_case | `@Entity`(无 `@Table`) |
37
+ | `@Entity("name", ...)` | 一体化风格(完全兼容) | 原有写法不变 |
38
+
39
+ - `Table` 类新增 `__call__`,可直接作为类装饰器使用(`@Table(name=..., indexes=[...], comment=...)`)。
40
+ - `@Entity` 支持无括号形式(`@Entity`),检测到已有 `@Table` 时不覆盖表元数据。
41
+ - 提取 `_auto_generate_init` 辅助函数,消除 `Entity` 与 `Table.__call__` 间的重复代码。
42
+
3
43
  ## [2.2.1] - 2026-08-13
4
44
 
5
45
  ### 修复
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: springbootAI
3
- Version: 2.2.1
3
+ Version: 2.2.3
4
4
  Summary: Spring-style Python framework with Web, ORM, Cloud and AI integrations
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 = "2.2.1"
15
+ version = "2.2.3"
16
16
  description = "Spring-style Python framework with Web, ORM, Cloud and AI integrations"
17
17
  readme = "README.md"
18
18
  license = "MIT"
@@ -244,12 +244,47 @@ class Transient:
244
244
 
245
245
 
246
246
  class Table:
247
- """表注解"""
247
+ """``@Table`` 表注解(对齐 JPA ``javax.persistence.Table``)。
248
+
249
+ 既可作为元数据类使用(内部 ``EntityTable`` 解析),也可直接作为类装饰器使用。
250
+ 作为装饰器时等价于 JPA 的 ``@Table``,与 ``@Entity`` 组合使用::
251
+
252
+ @Entity
253
+ @Table(name="sys_user", indexes=[Index("idx_name", ["name"])], comment="用户表")
254
+ class User:
255
+ id: int = Id()
256
+ name: str = Column(length=50)
257
+
258
+ 也可单独使用(隐含 ``@Entity`` 语义,与 ``@Entity("sys_user")`` 等价)::
259
+
260
+ @Table(name="sys_user", comment="用户表")
261
+ class User:
262
+ id: int = Id()
263
+ """
248
264
  def __init__(self, name: str = "", indexes: List['Index'] = None, comment: str = ""):
249
265
  self.name = name
250
266
  self.indexes = indexes or []
251
267
  self.comment = comment
252
268
 
269
+ def __call__(self, cls):
270
+ """装饰器形式:将表元数据挂载到类上并标记为实体,返回类本身。
271
+
272
+ 装饰器应用顺序(Python 底向上)::
273
+
274
+ @Entity # 外层,后执行
275
+ @Table(...) # 内层,先执行
276
+ class User: ...
277
+
278
+ ``@Table`` 先设置 ``__table__`` 与 ``__entity__``,随后 ``@Entity``
279
+ 检测到已有 ``__table__`` 则不覆盖。
280
+ """
281
+ if not self.name:
282
+ self.name = _camel_to_snake(cls.__name__)
283
+ setattr(cls, '__table__', self)
284
+ setattr(cls, '__entity__', True)
285
+ _auto_generate_init(cls)
286
+ return cls
287
+
253
288
 
254
289
  class Index:
255
290
  """索引定义"""
@@ -509,6 +544,9 @@ class DdlAutoManager:
509
544
  # @Transient 字段不持久化,跳过
510
545
  if _is_transient_field(cls, attr_name):
511
546
  continue
547
+ # 私有字段(以 _ 开头)不持久化,跳过
548
+ if attr_name.startswith('_'):
549
+ continue
512
550
  py_type = init_hints.get(attr_name) or cls_annotations.get(attr_name)
513
551
  # 解包 Optional[X]:Python 3.10 的 get_type_hints 会把带 None 默认值的
514
552
  # 参数注解自动包装为 Optional[X],3.11+ 不再包装。此处统一解包为承载类型,
@@ -1046,43 +1084,146 @@ class DdlAutoManager:
1046
1084
 
1047
1085
  # ==================== 装饰器API(便捷使用) ====================
1048
1086
 
1049
- def Entity(table_name: str = "", indexes: List[Index] = None, comment: str = ""):
1087
+ def _auto_infer_columns(cls):
1088
+ """扫描类型注解,为未显式赋 ``Column`` 描述符的字段自动创建 ``Column`` 实例。
1089
+
1090
+ 对齐 Java JPA:实体类中所有非 ``@Transient`` 字段自动映射为数据库列,
1091
+ 无需显式 ``= Column(...)`` 赋值。
1092
+
1093
+ 推断规则:
1094
+ - ``name: str`` → ``Column(default=None)``
1095
+ - ``name: str = ""`` → ``Column(default="")``
1096
+ - ``name: int = 0`` → ``Column(default=0)``
1097
+ - ``name: str = Column(...)`` → 保留原 Column,不覆盖
1098
+ - ``name: int = Id()`` → 保留原 Id,不覆盖
1099
+ - 以 ``_`` 开头的字段 → 跳过(私有/内部字段)
1100
+ - ``@Transient`` 标记字段 → 跳过
1050
1101
  """
1051
- @Entity 装饰器,标注一个类为JPA风格的实体类
1052
-
1053
- Usage:
1054
- @Entity("sys_user")
1102
+ # 收集 MRO 中所有类型注解
1103
+ all_annotations = {}
1104
+ for cls_base in reversed(cls.__mro__):
1105
+ base_anns = getattr(cls_base, '__annotations__', {})
1106
+ all_annotations.update(base_anns)
1107
+
1108
+ for attr_name in all_annotations:
1109
+ # 跳过私有字段
1110
+ if attr_name.startswith('_'):
1111
+ continue
1112
+ # 跳过 @Transient 字段
1113
+ if _is_transient_field(cls, attr_name):
1114
+ continue
1115
+
1116
+ # 查找 MRO 中最近的类属性值
1117
+ existing = None
1118
+ for cls_base in cls.__mro__:
1119
+ if attr_name in cls_base.__dict__:
1120
+ existing = cls_base.__dict__[attr_name]
1121
+ break
1122
+
1123
+ # 已有 Column/Id/Version/CreateTime/UpdateTime 描述符,不覆盖
1124
+ if isinstance(existing, Column):
1125
+ continue
1126
+ # 已有 @column 装饰器标记
1127
+ if hasattr(existing, '__column__'):
1128
+ continue
1129
+ # 已有 Transient 标记
1130
+ if isinstance(existing, Transient):
1131
+ continue
1132
+
1133
+ # 推断默认值:非 None 的类属性值作为 Column default
1134
+ default_val = None
1135
+ if existing is not None and not callable(existing) \
1136
+ and not isinstance(existing, (classmethod, staticmethod)):
1137
+ default_val = existing
1138
+
1139
+ # 创建 Column 描述符并挂到类上
1140
+ setattr(cls, attr_name, Column(default=default_val))
1141
+
1142
+
1143
+ def _auto_generate_init(cls):
1144
+ """为描述符风格实体类自动生成 ``__init__``(若类未显式声明)。
1145
+
1146
+ 先调用 ``_auto_infer_columns`` 补全类型注解对应的 ``Column`` 描述符,
1147
+ 再扫描 MRO 中所有 ``Column`` 实例属性,生成关键字构造器。
1148
+ 若类已显式声明 ``__init__`` 则跳过,保持兼容。
1149
+ """
1150
+ # 无论是否有自定义 __init__,都先补全 Column 描述符(DDL 解析依赖)
1151
+ _auto_infer_columns(cls)
1152
+
1153
+ if '__init__' in cls.__dict__:
1154
+ return
1155
+ fields = {}
1156
+ for cls_base in reversed(cls.__mro__):
1157
+ for name, value in cls_base.__dict__.items():
1158
+ if isinstance(value, Column):
1159
+ fields[name] = value
1160
+
1161
+ def __init__(self, **values):
1162
+ unknown = set(values) - set(fields)
1163
+ if unknown:
1164
+ names = ', '.join(sorted(unknown))
1165
+ raise TypeError(f"Unexpected entity field(s): {names}")
1166
+ for name, column in fields.items():
1167
+ setattr(self, name, values.get(name, column.default))
1168
+
1169
+ cls.__init__ = __init__
1170
+
1171
+
1172
+ def Entity(table_name: str = "", indexes: List[Index] = None, comment: str = ""):
1173
+ """``@Entity`` 装饰器,标注一个类为 JPA 风格的实体类。
1174
+
1175
+ 三种用法(均向后兼容):
1176
+
1177
+ 1. **Java JPA 风格**(``@Entity`` + ``@Table`` 分离,推荐)::
1178
+
1179
+ @Entity
1180
+ @Table(name="sys_user", indexes=[Index("idx_name", ["name"])], comment="用户表")
1055
1181
  class User:
1056
- def __init__(self, id: int = None, username: str = "", email: str = ""):
1057
- self.id = id
1058
- self.username = username
1059
- self.email = email
1182
+ id: int = Id()
1183
+ name: str = Column(length=50)
1184
+
1185
+ 2. **简化风格**(仅 ``@Entity``,表名自动推导为类名 snake_case)::
1186
+
1187
+ @Entity
1188
+ class User:
1189
+ id: int = Id()
1190
+ name: str = Column(length=50)
1191
+ # 表名自动推导为 "user"
1192
+
1193
+ 3. **一体化风格**(当前写法,完全兼容)::
1194
+
1195
+ @Entity("sys_user", indexes=[...], comment="用户表")
1196
+ class User:
1197
+ id: int = Id()
1198
+ name: str = Column(length=50)
1060
1199
  """
1061
- t = Table(name=table_name, indexes=indexes, comment=comment)
1062
- def decorator(cls):
1200
+ # 支持 @Entity 无括号形式:直接接收类
1201
+ if inspect.isclass(table_name):
1202
+ cls = table_name
1063
1203
  setattr(cls, '__entity__', True)
1064
- setattr(cls, '__table__', t)
1065
- if not table_name:
1066
- t.name = _camel_to_snake(cls.__name__)
1204
+ # 未显式指定表信息时,不覆盖已有 @Table 设置的 __table__
1205
+ existing = getattr(cls, '__table__', None)
1206
+ if not isinstance(existing, Table):
1207
+ setattr(cls, '__table__', Table(name=_camel_to_snake(cls.__name__)))
1208
+ _auto_generate_init(cls)
1209
+ return cls
1067
1210
 
1068
- # Descriptor-style entities do not need repetitive constructors.
1069
- # Keep an explicitly declared __init__ unchanged for compatibility.
1070
- if '__init__' not in cls.__dict__:
1071
- fields = {}
1072
- for cls_base in reversed(cls.__mro__):
1073
- for name, value in cls_base.__dict__.items():
1074
- if isinstance(value, Column):
1075
- fields[name] = value
1076
-
1077
- def __init__(self, **values):
1078
- unknown = set(values) - set(fields)
1079
- if unknown:
1080
- names = ', '.join(sorted(unknown))
1081
- raise TypeError(f"Unexpected entity field(s): {names}")
1082
- for name, column in fields.items():
1083
- setattr(self, name, values.get(name, column.default))
1084
-
1085
- cls.__init__ = __init__
1211
+ # @Entity("table_name", ...) @Entity() 形式
1212
+ has_explicit_meta = bool(table_name or indexes or comment)
1213
+ t = Table(name=table_name, indexes=indexes, comment=comment) if has_explicit_meta else None
1214
+
1215
+ def decorator(cls):
1216
+ setattr(cls, '__entity__', True)
1217
+ if t is not None:
1218
+ if not t.name:
1219
+ t.name = _camel_to_snake(cls.__name__)
1220
+ setattr(cls, '__table__', t)
1221
+ else:
1222
+ # 无显式表信息:不覆盖已有 @Table 设置
1223
+ existing = getattr(cls, '__table__', None)
1224
+ if not isinstance(existing, Table):
1225
+ setattr(cls, '__table__', Table(name=_camel_to_snake(cls.__name__)))
1226
+ _auto_generate_init(cls)
1086
1227
  return cls
1087
1228
  return decorator
1088
1229
 
@@ -2,7 +2,7 @@
2
2
  PyMyBatis版本信息
3
3
  """
4
4
 
5
- __version__ = '2.2.1'
5
+ __version__ = '2.2.3'
6
6
  __author__ = 'PyMyBatis Team'
7
7
  __email__ = 'dev@pymybatis.org'
8
8
  __license__ = 'MIT'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: springbootAI
3
- Version: 2.2.1
3
+ Version: 2.2.3
4
4
  Summary: Spring-style Python framework with Web, ORM, Cloud and AI integrations
5
5
  Author-email: YuConggen <1516933915@qq.com>
6
6
  License-Expression: MIT
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes