springbootAI 1.8.6__tar.gz → 1.8.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {springbootai-1.8.6/springbootAI.egg-info → springbootai-1.8.7}/PKG-INFO +1 -1
- {springbootai-1.8.6 → springbootai-1.8.7}/pyproject.toml +1 -1
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/__init__.py +1 -1
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/logging/loguru_logger.py +26 -8
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/utils/banner.py +1 -1
- {springbootai-1.8.6 → springbootai-1.8.7/springbootAI.egg-info}/PKG-INFO +1 -1
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_logging_config.py +34 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/LICENSE +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/MANIFEST.in +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/README.md +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/requirements.txt +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/setup.cfg +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/setup.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/advisors.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/annotations.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/autoconfig.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/core.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/etl.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/memory.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/observability.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/providers.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/resilience.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/tools.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/ai/vectorstore.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/annotations/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/annotations/cache.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/annotations/cloud.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/annotations/conditional.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/annotations/core.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/annotations/messaging.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/aop/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/aop/cloud_aop.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/aop/comprehensive_aop.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/aop/method_interceptor.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/aop/proxy_factory.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/cloud/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/cloud/discovery.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/cloud/feign.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/cloud/gateway.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/cloud/load_balancer.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/cloud/seata.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/cloud/sentinel.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/cloud/tracer.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/cloud/transaction_store.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/config/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/config/binding.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/config/config_loader.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/context/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/context/application_context.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/context/bean_definition.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/context/bean_factory.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/context/registry.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/context/scanner.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/core/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/core/graceful_shutdown.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/core/typing_utils.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/csv/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/csv/annotations.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/csv/converters.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/csv/easy_csv.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/csv/exceptions.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/csv/reader.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/csv/writer.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/data/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/data/page.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/data/repository.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/data/specification.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/datasource/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/datasource/annotations.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/datasource/context.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/datasource/dynamic.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/event/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/event/publisher.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/excel/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/excel/annotations.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/excel/converters.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/excel/easy_excel.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/excel/exceptions.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/excel/reader.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/excel/style.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/excel/writer.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/accessor.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/auto_config.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/holder.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/locale.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/locale_resolver.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/message_source.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/middleware.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/properties.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/i18n/sources.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/logging/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/main.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/messaging/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/messaging/rabbitmq.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/monitoring/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/monitoring/prometheus.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/database.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/ddl_auto.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/migration.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/mybatis_integration.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/annotations/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/annotations/annotations.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/cache/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/cache/cache.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/cache/redis_cache.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/circuit_breaker/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/circuit_breaker/circuit_breaker.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/configuration.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/core/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/core/sql_session.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/core/sql_session_factory.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/dialect/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/dialect/dialect.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/dynamic_sql/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/dynamic_sql/dynamic_sql.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/interceptor/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/interceptor/interceptor.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/mapper/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/mapper/mapper.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/metrics/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/metrics/metrics.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/pool/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/pool/connection_pool.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/security/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/security/access_control.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/security/password_encoder.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/security/sensitive_data_masker.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/security/sql_injection_detector.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/transaction/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/transaction/transaction.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/type_handler/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/type_handler/type_handler.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/version.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/xml_parser/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/xml_parser/xml_parser.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/retry/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/retry/retry_annotations.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/retry/retry_decorator.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/scheduling/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/scheduling/scheduler.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/security/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/security/jwt_utils.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/security/replay_protection.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/security/secret_manager.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/security/security_aop.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/security/security_context.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/test/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/test/slicing.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/tracing/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/tracing/skywalking.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/tx/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/tx/events.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/tx/synchronization.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/utils/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/utils/bean_utils.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/utils/logger.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/utils/redis_client.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/validation/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/validation/aop.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/validation/constraints.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/validation/exceptions.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/validation/validator.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/web/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/web/actuator.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/web/exception_handler.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/web/health.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/web/interceptor.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/web/result.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/web/swagger.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/web/web_context.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/websocket/__init__.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/websocket/annotations.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/websocket/broker.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/websocket/exceptions.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/websocket/handler.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/websocket/router.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/spring/websocket/session.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/springbootAI.egg-info/SOURCES.txt +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/springbootAI.egg-info/dependency_links.txt +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/springbootAI.egg-info/entry_points.txt +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/springbootAI.egg-info/requires.txt +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/springbootAI.egg-info/top_level.txt +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/sql/seata_undo_log.sql +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_actuator.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_ai_module.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_annotation_combinations.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_annotations_contract.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_aop_annotations_full.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_bean_utils.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_cache_annotations.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_cloud_embedded_full.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_component_init_error.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_conditional_annotations.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_config_binding.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_config_fixes_185.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_connection_resilience.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_core_annotations_full.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_csv_module.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_data_repository.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_datasource_routing.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_ddl_auto.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_di_config_event_full.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_excel_module.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_i18n_module.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_jpa_version_transient.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_new_features.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_orm_pymybatis_full.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_production_readiness.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_pymybatis_contract.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_seata_durable_store.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_security.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_security_full.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_swagger_module.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_test_slicing.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_transactional_events.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_validation_module.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_web_annotations_full.py +0 -0
- {springbootai-1.8.6 → springbootai-1.8.7}/tests/test_websocket_module.py +0 -0
|
@@ -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.
|
|
15
|
+
version = "1.8.7"
|
|
16
16
|
description = "Python版Spring Boot框架,集成PyMyBatis ORM"
|
|
17
17
|
readme = "README.md"
|
|
18
18
|
license = "MIT"
|
|
@@ -81,11 +81,15 @@ class SpringLogger:
|
|
|
81
81
|
self._use_loguru = _loguru_available
|
|
82
82
|
self.log_format = log_format or self._default_format()
|
|
83
83
|
|
|
84
|
-
#
|
|
84
|
+
# import 时只设置控制台输出,不创建文件 handler(不创建 logs/ 目录)。
|
|
85
|
+
# 文件 handler 在 init_logging → reconfigure 读取用户配置后创建,
|
|
86
|
+
# 避免在 CWD 下提前生成 logs/ 目录与用户配置的 log_dir 产生双份日志。
|
|
85
87
|
if self._use_loguru:
|
|
86
|
-
|
|
88
|
+
loguru_logger.remove()
|
|
89
|
+
loguru_logger.add(
|
|
90
|
+
sys.stdout, format=self.log_format, level=self.level, colorize=True)
|
|
87
91
|
else:
|
|
88
|
-
self._setup_std_logging(strict=False)
|
|
92
|
+
self._setup_std_logging(strict=False, enable_file=False)
|
|
89
93
|
|
|
90
94
|
def reconfigure(self, level: Optional[str] = None, log_format: Optional[str] = None,
|
|
91
95
|
log_dir: Optional[str] = None, retention: Optional[str] = None,
|
|
@@ -125,12 +129,14 @@ class SpringLogger:
|
|
|
125
129
|
if rotation is not None:
|
|
126
130
|
self.rotation = rotation
|
|
127
131
|
# 重建日志处理器:用户显式配置 log_dir 时 strict=True(路径错必须报错),
|
|
128
|
-
# 否则 strict=False
|
|
132
|
+
# 否则 strict=False(保留旧值/默认值时允许降级)。
|
|
133
|
+
# reconfigure 始终启用文件 handler(enable_file=True),
|
|
134
|
+
# 因为此时用户配置已读取,应该创建日志文件。
|
|
129
135
|
strict_mode = log_dir_explicitly_set
|
|
130
136
|
if self._use_loguru:
|
|
131
|
-
self._setup_loguru(strict=strict_mode)
|
|
137
|
+
self._setup_loguru(strict=strict_mode, enable_file=True)
|
|
132
138
|
else:
|
|
133
|
-
self._setup_std_logging(strict=strict_mode)
|
|
139
|
+
self._setup_std_logging(strict=strict_mode, enable_file=True)
|
|
134
140
|
|
|
135
141
|
def _validate_log_dir(self, strict: bool) -> bool:
|
|
136
142
|
"""校验日志目录可创建且可写入。
|
|
@@ -223,12 +229,14 @@ class SpringLogger:
|
|
|
223
229
|
)
|
|
224
230
|
return "%(asctime)s | %(levelname)-8s | %(name)s:%(funcName)s:%(lineno)d | %(message)s"
|
|
225
231
|
|
|
226
|
-
def _setup_loguru(self, strict: bool = False):
|
|
232
|
+
def _setup_loguru(self, strict: bool = False, enable_file: bool = True):
|
|
227
233
|
"""配置Loguru。
|
|
228
234
|
|
|
229
235
|
Args:
|
|
230
236
|
strict: True 时日志目录校验失败抛 ``LoggingConfigError``(用户配置路径);
|
|
231
237
|
False 时降级为仅控制台日志(import 时默认配置,保证不崩溃)
|
|
238
|
+
enable_file: True 时添加文件 handler(创建日志目录+文件);
|
|
239
|
+
False 时仅控制台输出(import 时避免提前创建 logs/ 目录)
|
|
232
240
|
"""
|
|
233
241
|
# 清除默认处理器
|
|
234
242
|
loguru_logger.remove()
|
|
@@ -241,6 +249,10 @@ class SpringLogger:
|
|
|
241
249
|
colorize=True,
|
|
242
250
|
)
|
|
243
251
|
|
|
252
|
+
# enable_file=False 时只输出到控制台(import 时使用,不创建 logs/ 目录)
|
|
253
|
+
if not enable_file:
|
|
254
|
+
return
|
|
255
|
+
|
|
244
256
|
# 校验日志目录:strict 模式下失败会抛异常(由 reconfigure 捕获并输出),
|
|
245
257
|
# 非 strict 模式下返回 False 则仅使用控制台日志
|
|
246
258
|
if not self._validate_log_dir(strict=strict):
|
|
@@ -267,12 +279,14 @@ class SpringLogger:
|
|
|
267
279
|
encoding="utf-8",
|
|
268
280
|
)
|
|
269
281
|
|
|
270
|
-
def _setup_std_logging(self, strict: bool = False):
|
|
282
|
+
def _setup_std_logging(self, strict: bool = False, enable_file: bool = True):
|
|
271
283
|
"""配置标准logging(fallback)。
|
|
272
284
|
|
|
273
285
|
Args:
|
|
274
286
|
strict: True 时日志目录校验失败抛 ``LoggingConfigError``;
|
|
275
287
|
False 时降级为仅控制台日志(import 时保证不崩溃)
|
|
288
|
+
enable_file: True 时添加文件 handler;False 时仅控制台输出
|
|
289
|
+
(import 时避免提前创建 logs/ 目录)
|
|
276
290
|
"""
|
|
277
291
|
self._logger = logging.getLogger("Spring")
|
|
278
292
|
self._logger.setLevel(getattr(logging, self.level))
|
|
@@ -285,6 +299,10 @@ class SpringLogger:
|
|
|
285
299
|
console_handler.setFormatter(logging.Formatter(self.log_format))
|
|
286
300
|
self._logger.addHandler(console_handler)
|
|
287
301
|
|
|
302
|
+
# enable_file=False 时只输出到控制台
|
|
303
|
+
if not enable_file:
|
|
304
|
+
return
|
|
305
|
+
|
|
288
306
|
# 校验日志目录
|
|
289
307
|
if not self._validate_log_dir(strict=strict):
|
|
290
308
|
return
|
|
@@ -150,3 +150,37 @@ class TestLogDirStrictValidation:
|
|
|
150
150
|
assert spring_logger.level == "DEBUG"
|
|
151
151
|
# 恢复
|
|
152
152
|
spring_logger.reconfigure(level="INFO")
|
|
153
|
+
|
|
154
|
+
def test_import_does_not_create_logs_directory(self, tmp_path):
|
|
155
|
+
"""SpringLogger 构造时不应创建 logs/ 目录(文件 handler 延迟到 init_logging)。
|
|
156
|
+
|
|
157
|
+
回归场景:模块级 ``spring_logger = SpringLogger()`` 在 import 时执行,
|
|
158
|
+
旧代码会立即创建 ``logs/`` 目录和文件 handler,导致即使用户配置了
|
|
159
|
+
``logging.log_dir``,CWD 下仍会多出一份 ``logs/``。
|
|
160
|
+
修复后 ``__init__`` 只添加控制台 handler,文件 handler 由
|
|
161
|
+
``reconfigure`` (即 ``init_logging``) 创建。
|
|
162
|
+
"""
|
|
163
|
+
import os
|
|
164
|
+
original_cwd = os.getcwd()
|
|
165
|
+
os.chdir(str(tmp_path))
|
|
166
|
+
try:
|
|
167
|
+
# 构造 SpringLogger(模拟 import 时的模块级构造)
|
|
168
|
+
SpringLogger._instance = None
|
|
169
|
+
import spring.logging.loguru_logger as ll
|
|
170
|
+
ll.spring_logger = SpringLogger()
|
|
171
|
+
# logs/ 目录不应被创建
|
|
172
|
+
assert not (tmp_path / 'logs').exists(), \
|
|
173
|
+
"SpringLogger() 构造时不应创建 logs/ 目录"
|
|
174
|
+
finally:
|
|
175
|
+
SpringLogger._instance = None
|
|
176
|
+
os.chdir(original_cwd)
|
|
177
|
+
|
|
178
|
+
def test_enable_file_false_does_not_create_directory(self, tmp_path):
|
|
179
|
+
"""_setup_loguru(enable_file=False) 不应创建日志目录。"""
|
|
180
|
+
SpringLogger._instance = None
|
|
181
|
+
import spring.logging.loguru_logger as ll
|
|
182
|
+
logger = SpringLogger()
|
|
183
|
+
logger.log_dir = str(tmp_path / 'should_not_exist')
|
|
184
|
+
logger._setup_loguru(strict=False, enable_file=False)
|
|
185
|
+
assert not (tmp_path / 'should_not_exist').exists(), \
|
|
186
|
+
"enable_file=False 时不应创建日志目录"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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
|
{springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/circuit_breaker/circuit_breaker.py
RENAMED
|
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
|
{springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/security/sensitive_data_masker.py
RENAMED
|
File without changes
|
{springbootai-1.8.6 → springbootai-1.8.7}/spring/orm/pymybatis/security/sql_injection_detector.py
RENAMED
|
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
|