springbootAI 2.2.1__tar.gz → 2.2.2__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.
- {springbootai-2.2.1 → springbootai-2.2.2}/CHANGELOG.md +16 -0
- {springbootai-2.2.1/springbootAI.egg-info → springbootai-2.2.2}/PKG-INFO +1 -1
- {springbootai-2.2.1 → springbootai-2.2.2}/pyproject.toml +1 -1
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/ddl_auto.py +111 -33
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/version.py +1 -1
- {springbootai-2.2.1 → springbootai-2.2.2/springbootAI.egg-info}/PKG-INFO +1 -1
- {springbootai-2.2.1 → springbootai-2.2.2}/LICENSE +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/MANIFEST.in +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/README.md +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/SECURITY.md +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/requirements-ai.txt +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/requirements-langgraph.txt +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/requirements-mcp.txt +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/requirements.txt +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/setup.cfg +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/setup.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/ai/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/ai/advisors.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/ai/annotations.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/ai/autoconfig.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/ai/core.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/ai/etl.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/ai/memory.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/ai/observability.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/ai/providers.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/ai/resilience.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/ai/tools.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/ai/vectorstore.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/annotations/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/annotations/cache.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/annotations/cloud.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/annotations/conditional.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/annotations/core.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/annotations/langchain.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/annotations/langgraph.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/annotations/messaging.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/aop/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/aop/aspect.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/aop/cloud_aop.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/aop/comprehensive_aop.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/aop/method_interceptor.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/aop/proxy_factory.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/cloud/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/cloud/discovery.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/cloud/feign.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/cloud/gateway.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/cloud/load_balancer.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/cloud/seata.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/cloud/seata_bridge.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/cloud/sentinel.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/cloud/tracer.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/cloud/transaction_store.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/config/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/config/binding.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/config/config_loader.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/context/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/context/application_context.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/context/bean_definition.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/context/bean_factory.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/context/registry.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/context/scanner.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/core/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/core/graceful_shutdown.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/core/typing_utils.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/csv/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/csv/annotations.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/csv/converters.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/csv/easy_csv.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/csv/exceptions.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/csv/reader.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/csv/writer.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/data/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/data/page.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/data/repository.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/data/specification.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/datasource/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/datasource/annotations.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/datasource/context.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/datasource/dynamic.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/event/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/event/publisher.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/excel/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/excel/annotations.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/excel/converters.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/excel/easy_excel.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/excel/exceptions.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/excel/reader.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/excel/style.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/excel/writer.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/i18n/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/i18n/accessor.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/i18n/auto_config.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/i18n/holder.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/i18n/locale.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/i18n/locale_resolver.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/i18n/message_source.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/i18n/middleware.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/i18n/properties.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/i18n/sources.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/adapters.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/agents/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/agents/services.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/annotations.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/autoconfig.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/callbacks/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/callbacks/handlers.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/chains/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/chains/services.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/core.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/indexes/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/indexes/index.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/loaders/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/loaders/loaders.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/memory/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/memory/memory.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/parsers/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/parsers/parsers.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/partners.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/prompts/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/prompts/templates.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/retrievers/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/retrievers/retrievers.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/tools/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/tools/tools.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/utilities/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/utilities/utils.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/vectorstores/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langchain/vectorstores/stores.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langgraph/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langgraph/annotation_runtime.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langgraph/annotations.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langgraph/autoconfig.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langgraph/checkpoint.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langgraph/config.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/langgraph/runtime.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/logging/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/logging/loguru_logger.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/main.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/mcp/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/mcp/annotation_runtime.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/mcp/annotations.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/mcp/autoconfig.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/mcp/client.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/mcp/config.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/mcp/server.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/messaging/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/messaging/rabbitmq.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/monitoring/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/monitoring/prometheus.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/database.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/migration.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/mybatis_integration.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/annotations/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/annotations/annotations.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/cache/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/cache/cache.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/cache/redis_cache.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/circuit_breaker/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/circuit_breaker/circuit_breaker.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/configuration.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/core/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/core/sql_session.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/core/sql_session_factory.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/dialect/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/dialect/dialect.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/dynamic_sql/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/dynamic_sql/dynamic_sql.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/interceptor/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/interceptor/interceptor.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/mapper/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/mapper/mapper.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/metrics/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/metrics/metrics.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/pool/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/pool/connection_pool.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/security/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/security/access_control.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/security/password_encoder.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/security/sensitive_data_masker.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/security/sql_injection_detector.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/transaction/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/transaction/transaction.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/type_handler/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/type_handler/type_handler.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/xml_parser/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/orm/pymybatis/xml_parser/xml_parser.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/retry/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/retry/recovery.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/retry/retry_annotations.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/retry/retry_decorator.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/scheduling/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/scheduling/scheduler.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/security/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/security/jwt_utils.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/security/replay_protection.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/security/secret_manager.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/security/security_aop.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/security/security_context.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/test/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/test/slicing.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/tracing/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/tracing/skywalking.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/tx/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/tx/events.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/tx/synchronization.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/utils/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/utils/banner.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/utils/bean_utils.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/utils/logger.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/utils/redis_client.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/validation/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/validation/aop.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/validation/constraints.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/validation/exceptions.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/validation/validator.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/web/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/web/actuator.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/web/exception_handler.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/web/health.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/web/interceptor.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/web/result.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/web/swagger.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/web/web_context.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/websocket/__init__.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/websocket/annotations.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/websocket/broker.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/websocket/exceptions.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/websocket/handler.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/websocket/router.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/spring/websocket/session.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/springbootAI.egg-info/SOURCES.txt +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/springbootAI.egg-info/dependency_links.txt +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/springbootAI.egg-info/entry_points.txt +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/springbootAI.egg-info/requires.txt +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/springbootAI.egg-info/top_level.txt +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/sql/seata_undo_log.sql +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_actuator.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_ai_comprehensive.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_ai_declarative_annotations.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_ai_module.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_annotation_combinations.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_annotations_contract.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_aop_annotations_full.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_audit_time.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_bean_utils.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_cache_annotations.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_cloud_embedded_full.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_component_init_error.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_conditional_annotations.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_config_binding.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_config_fixes_185.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_connection_resilience.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_core_annotations_full.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_csv_module.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_data_repository.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_datasource_routing.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_ddl_auto.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_declarative_aop_post_authorize_recover.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_di_config_event_full.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_excel_module.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_i18n_module.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_jpa_version_transient.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_langchain_comprehensive.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_langchain_ext.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_langchain_module.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_langgraph_comprehensive.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_langgraph_module.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_logging_config.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_mcp_module.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_new_features.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_orm_pymybatis_full.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_production_readiness.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_pymybatis_contract.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_seata_bridge.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_seata_durable_store.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_security.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_security_full.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_security_hardening.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_swagger_module.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_test_slicing.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_transactional_events.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_validation_module.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_web_annotations_full.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_web_root_mapping.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_web_static_files.py +0 -0
- {springbootai-2.2.1 → springbootai-2.2.2}/tests/test_websocket_module.py +0 -0
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.2.2] - 2026-08-13
|
|
4
|
+
|
|
5
|
+
### 新增
|
|
6
|
+
|
|
7
|
+
- ORM `@Entity` / `@Table` 注解对齐 Java JPA 分离风格,支持三种写法(均向后兼容):
|
|
8
|
+
|
|
9
|
+
| 写法 | 说明 | 对齐 Java |
|
|
10
|
+
|------|------|-----------|
|
|
11
|
+
| `@Entity` + `@Table(...)` | 分离风格(推荐) | `@Entity` + `@Table` |
|
|
12
|
+
| `@Entity` 无括号 | 表名自动推导为 snake_case | `@Entity`(无 `@Table`) |
|
|
13
|
+
| `@Entity("name", ...)` | 一体化风格(完全兼容) | 原有写法不变 |
|
|
14
|
+
|
|
15
|
+
- `Table` 类新增 `__call__`,可直接作为类装饰器使用(`@Table(name=..., indexes=[...], comment=...)`)。
|
|
16
|
+
- `@Entity` 支持无括号形式(`@Entity`),检测到已有 `@Table` 时不覆盖表元数据。
|
|
17
|
+
- 提取 `_auto_generate_init` 辅助函数,消除 `Entity` 与 `Table.__call__` 间的重复代码。
|
|
18
|
+
|
|
3
19
|
## [2.2.1] - 2026-08-13
|
|
4
20
|
|
|
5
21
|
### 修复
|
|
@@ -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.
|
|
15
|
+
version = "2.2.2"
|
|
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
|
"""索引定义"""
|
|
@@ -1046,43 +1081,86 @@ class DdlAutoManager:
|
|
|
1046
1081
|
|
|
1047
1082
|
# ==================== 装饰器API(便捷使用) ====================
|
|
1048
1083
|
|
|
1049
|
-
def
|
|
1084
|
+
def _auto_generate_init(cls):
|
|
1085
|
+
"""为描述符风格实体类自动生成 ``__init__``(若类未显式声明)。
|
|
1086
|
+
|
|
1087
|
+
扫描 MRO 中所有 ``Column`` 实例属性,生成关键字构造器。
|
|
1088
|
+
若类已显式声明 ``__init__`` 则跳过,保持兼容。
|
|
1050
1089
|
"""
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1090
|
+
if '__init__' in cls.__dict__:
|
|
1091
|
+
return
|
|
1092
|
+
fields = {}
|
|
1093
|
+
for cls_base in reversed(cls.__mro__):
|
|
1094
|
+
for name, value in cls_base.__dict__.items():
|
|
1095
|
+
if isinstance(value, Column):
|
|
1096
|
+
fields[name] = value
|
|
1097
|
+
|
|
1098
|
+
def __init__(self, **values):
|
|
1099
|
+
unknown = set(values) - set(fields)
|
|
1100
|
+
if unknown:
|
|
1101
|
+
names = ', '.join(sorted(unknown))
|
|
1102
|
+
raise TypeError(f"Unexpected entity field(s): {names}")
|
|
1103
|
+
for name, column in fields.items():
|
|
1104
|
+
setattr(self, name, values.get(name, column.default))
|
|
1105
|
+
|
|
1106
|
+
cls.__init__ = __init__
|
|
1107
|
+
|
|
1108
|
+
|
|
1109
|
+
def Entity(table_name: str = "", indexes: List[Index] = None, comment: str = ""):
|
|
1110
|
+
"""``@Entity`` 装饰器,标注一个类为 JPA 风格的实体类。
|
|
1111
|
+
|
|
1112
|
+
三种用法(均向后兼容):
|
|
1113
|
+
|
|
1114
|
+
1. **Java JPA 风格**(``@Entity`` + ``@Table`` 分离,推荐)::
|
|
1115
|
+
|
|
1116
|
+
@Entity
|
|
1117
|
+
@Table(name="sys_user", indexes=[Index("idx_name", ["name"])], comment="用户表")
|
|
1118
|
+
class User:
|
|
1119
|
+
id: int = Id()
|
|
1120
|
+
name: str = Column(length=50)
|
|
1121
|
+
|
|
1122
|
+
2. **简化风格**(仅 ``@Entity``,表名自动推导为类名 snake_case)::
|
|
1123
|
+
|
|
1124
|
+
@Entity
|
|
1125
|
+
class User:
|
|
1126
|
+
id: int = Id()
|
|
1127
|
+
name: str = Column(length=50)
|
|
1128
|
+
# 表名自动推导为 "user"
|
|
1129
|
+
|
|
1130
|
+
3. **一体化风格**(当前写法,完全兼容)::
|
|
1131
|
+
|
|
1132
|
+
@Entity("sys_user", indexes=[...], comment="用户表")
|
|
1055
1133
|
class User:
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
self.username = username
|
|
1059
|
-
self.email = email
|
|
1134
|
+
id: int = Id()
|
|
1135
|
+
name: str = Column(length=50)
|
|
1060
1136
|
"""
|
|
1061
|
-
|
|
1062
|
-
|
|
1137
|
+
# 支持 @Entity 无括号形式:直接接收类
|
|
1138
|
+
if inspect.isclass(table_name):
|
|
1139
|
+
cls = table_name
|
|
1063
1140
|
setattr(cls, '__entity__', True)
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1141
|
+
# 未显式指定表信息时,不覆盖已有 @Table 设置的 __table__
|
|
1142
|
+
existing = getattr(cls, '__table__', None)
|
|
1143
|
+
if not isinstance(existing, Table):
|
|
1144
|
+
setattr(cls, '__table__', Table(name=_camel_to_snake(cls.__name__)))
|
|
1145
|
+
_auto_generate_init(cls)
|
|
1146
|
+
return cls
|
|
1067
1147
|
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
cls.__init__ = __init__
|
|
1148
|
+
# @Entity("table_name", ...) 或 @Entity() 形式
|
|
1149
|
+
has_explicit_meta = bool(table_name or indexes or comment)
|
|
1150
|
+
t = Table(name=table_name, indexes=indexes, comment=comment) if has_explicit_meta else None
|
|
1151
|
+
|
|
1152
|
+
def decorator(cls):
|
|
1153
|
+
setattr(cls, '__entity__', True)
|
|
1154
|
+
if t is not None:
|
|
1155
|
+
if not t.name:
|
|
1156
|
+
t.name = _camel_to_snake(cls.__name__)
|
|
1157
|
+
setattr(cls, '__table__', t)
|
|
1158
|
+
else:
|
|
1159
|
+
# 无显式表信息:不覆盖已有 @Table 设置
|
|
1160
|
+
existing = getattr(cls, '__table__', None)
|
|
1161
|
+
if not isinstance(existing, Table):
|
|
1162
|
+
setattr(cls, '__table__', Table(name=_camel_to_snake(cls.__name__)))
|
|
1163
|
+
_auto_generate_init(cls)
|
|
1086
1164
|
return cls
|
|
1087
1165
|
return decorator
|
|
1088
1166
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|