sycommon-python-lib 0.2.5a25__tar.gz → 0.2.5a26__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.
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/pyproject.toml +1 -1
- sycommon_python_lib-0.2.5a26/src/sycommon/database/async_base_db_service.py +114 -0
- sycommon_python_lib-0.2.5a26/src/sycommon/database/base_db_service.py +114 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/logging/kafka_log.py +58 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/mqlistener_config.py +1 -1
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/rabbitmq/rabbitmq_client.py +1 -1
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/services.py +8 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon_python_lib.egg-info/SOURCES.txt +1 -0
- sycommon_python_lib-0.2.5a26/tests/test_asyncio_logging.py +116 -0
- sycommon_python_lib-0.2.5a25/src/sycommon/database/async_base_db_service.py +0 -36
- sycommon_python_lib-0.2.5a25/src/sycommon/database/base_db_service.py +0 -30
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/README.md +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/nexus/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/chat_events.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/deep_agent.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/mcp/tool_loader.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/multi_agent_team.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/sandbox/file_ops.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/summarization_utils.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/auth/ldap_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/auth/wecom_ldap_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/sandbox.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/tool_result_truncation.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/traceid.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/sandbox.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/deep_agent_server.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_consumer_recovery.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_deep_agent.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_encoding_cache.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_mcp_server.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_oa_login.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_real_summarization.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_summarization_config.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_summarization_real.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/tests/test_sycli.py +0 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from contextlib import asynccontextmanager
|
|
3
|
+
from sqlalchemy.exc import OperationalError, InterfaceError, InternalError
|
|
4
|
+
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker
|
|
5
|
+
from sycommon.config.Config import SingletonMeta
|
|
6
|
+
from sycommon.database.async_database_service import AsyncDatabaseService
|
|
7
|
+
from sycommon.logging.kafka_log import SYLogger
|
|
8
|
+
|
|
9
|
+
# 连接级错误:连接已断,事务必定已丢失,重试安全
|
|
10
|
+
_CONNECTION_ERROR_CODES = {2006, 2013}
|
|
11
|
+
# 事务级错误:死锁、锁等待超时,由调用方决定是否重试
|
|
12
|
+
_RETRYABLE_TX_ERROR_CODES = {1205, 1213, 1206}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _is_connection_error(exc: Exception) -> bool:
|
|
16
|
+
"""判断是否为连接级错误(断开、宕机),可安全重试"""
|
|
17
|
+
if isinstance(exc, (OperationalError, InterfaceError)):
|
|
18
|
+
if exc.orig and hasattr(exc.orig, 'errno'):
|
|
19
|
+
return exc.orig.errno in _CONNECTION_ERROR_CODES
|
|
20
|
+
return False
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _is_retryable_tx_error(exc: Exception) -> bool:
|
|
24
|
+
"""判断是否为可重试的事务级错误(死锁、锁超时)"""
|
|
25
|
+
if isinstance(exc, (OperationalError, InternalError)):
|
|
26
|
+
if exc.orig and hasattr(exc.orig, 'errno'):
|
|
27
|
+
return exc.orig.errno in _RETRYABLE_TX_ERROR_CODES
|
|
28
|
+
return False
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class AsyncBaseDBService(metaclass=SingletonMeta):
|
|
32
|
+
"""数据库操作基础服务类,封装异步会话管理功能"""
|
|
33
|
+
|
|
34
|
+
def __init__(self):
|
|
35
|
+
self.engine = AsyncDatabaseService.engine()
|
|
36
|
+
self.Session = async_sessionmaker(
|
|
37
|
+
bind=self.engine,
|
|
38
|
+
class_=AsyncSession,
|
|
39
|
+
expire_on_commit=False
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
@asynccontextmanager
|
|
43
|
+
async def session(self):
|
|
44
|
+
"""
|
|
45
|
+
异步数据库会话上下文管理器
|
|
46
|
+
自动处理会话的创建、提交、回滚和关闭
|
|
47
|
+
"""
|
|
48
|
+
async with self.Session() as session:
|
|
49
|
+
try:
|
|
50
|
+
yield session
|
|
51
|
+
await session.commit()
|
|
52
|
+
except Exception as e:
|
|
53
|
+
await session.rollback()
|
|
54
|
+
SYLogger.error(f"Database operation failed: {str(e)}")
|
|
55
|
+
raise
|
|
56
|
+
|
|
57
|
+
async def execute(self, fn, retry: int = 0):
|
|
58
|
+
"""
|
|
59
|
+
执行异步数据库操作,支持自动重试
|
|
60
|
+
|
|
61
|
+
连接级错误(连接断开 2006/2013)始终自动重试1次。
|
|
62
|
+
事务级错误(死锁 1213、锁超时 1205)按 retry 参数重试。
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
fn: 接收 session 参数的异步可调用对象,例如:
|
|
66
|
+
async def query(session): return (await session.execute(select(User))).scalars().all()
|
|
67
|
+
retry: 事务级错误最大重试次数,默认0不重试
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
fn 的返回值
|
|
71
|
+
|
|
72
|
+
Usage:
|
|
73
|
+
result = await self.execute(
|
|
74
|
+
lambda session: session.execute(select(User)),
|
|
75
|
+
retry=3
|
|
76
|
+
)
|
|
77
|
+
"""
|
|
78
|
+
attempt = 0
|
|
79
|
+
max_attempts = 1 + max(retry, 0)
|
|
80
|
+
connection_retried = False
|
|
81
|
+
last_exc = None
|
|
82
|
+
|
|
83
|
+
while True:
|
|
84
|
+
async with self.Session() as session:
|
|
85
|
+
try:
|
|
86
|
+
result = await fn(session)
|
|
87
|
+
await session.commit()
|
|
88
|
+
return result
|
|
89
|
+
except Exception as e:
|
|
90
|
+
await session.rollback()
|
|
91
|
+
last_exc = e
|
|
92
|
+
|
|
93
|
+
# 连接级错误:始终自动重试1次(不计入 max_attempts)
|
|
94
|
+
if _is_connection_error(e) and not connection_retried:
|
|
95
|
+
connection_retried = True
|
|
96
|
+
SYLogger.warning(
|
|
97
|
+
f"DB connection lost (errno={getattr(e.orig, 'errno', None)}), retrying..."
|
|
98
|
+
)
|
|
99
|
+
attempt += 1
|
|
100
|
+
continue
|
|
101
|
+
|
|
102
|
+
# 事务级错误:按 retry 参数重试
|
|
103
|
+
if retry > 0 and _is_retryable_tx_error(e) and attempt < max_attempts - 1:
|
|
104
|
+
attempt += 1
|
|
105
|
+
backoff = min(0.5 * (2 ** (attempt - 1)), 2.0)
|
|
106
|
+
SYLogger.warning(
|
|
107
|
+
f"DB retryable error (errno={getattr(e.orig, 'errno', None)}), "
|
|
108
|
+
f"attempt {attempt}/{max_attempts}, backoff {backoff}s"
|
|
109
|
+
)
|
|
110
|
+
await asyncio.sleep(backoff)
|
|
111
|
+
continue
|
|
112
|
+
|
|
113
|
+
SYLogger.error(f"Database operation failed: {str(e)}")
|
|
114
|
+
raise
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from contextlib import contextmanager
|
|
3
|
+
from sqlalchemy.orm import sessionmaker
|
|
4
|
+
from sqlalchemy.exc import OperationalError, InterfaceError, InternalError
|
|
5
|
+
from sycommon.config.Config import SingletonMeta
|
|
6
|
+
from sycommon.database.database_service import DatabaseService
|
|
7
|
+
from sycommon.logging.kafka_log import SYLogger
|
|
8
|
+
|
|
9
|
+
# 连接级错误:连接已断,事务必定已丢失,重试安全
|
|
10
|
+
_CONNECTION_ERROR_CODES = {2006, 2013}
|
|
11
|
+
# 事务级错误:死锁、锁等待超时,由调用方决定是否重试
|
|
12
|
+
_RETRYABLE_TX_ERROR_CODES = {1205, 1213, 1206}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _is_connection_error(exc: Exception) -> bool:
|
|
16
|
+
"""判断是否为连接级错误(断开、宕机),可安全重试"""
|
|
17
|
+
if isinstance(exc, (OperationalError, InterfaceError)):
|
|
18
|
+
if exc.orig and hasattr(exc.orig, 'errno'):
|
|
19
|
+
return exc.orig.errno in _CONNECTION_ERROR_CODES
|
|
20
|
+
return False
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _is_retryable_tx_error(exc: Exception) -> bool:
|
|
24
|
+
"""判断是否为可重试的事务级错误(死锁、锁超时)"""
|
|
25
|
+
if isinstance(exc, (OperationalError, InternalError)):
|
|
26
|
+
if exc.orig and hasattr(exc.orig, 'errno'):
|
|
27
|
+
return exc.orig.errno in _RETRYABLE_TX_ERROR_CODES
|
|
28
|
+
return False
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class BaseDBService(metaclass=SingletonMeta):
|
|
32
|
+
"""数据库操作基础服务类,封装会话管理功能"""
|
|
33
|
+
|
|
34
|
+
def __init__(self):
|
|
35
|
+
self.engine = DatabaseService.engine()
|
|
36
|
+
self.Session = sessionmaker(bind=self.engine)
|
|
37
|
+
|
|
38
|
+
@contextmanager
|
|
39
|
+
def session(self):
|
|
40
|
+
"""
|
|
41
|
+
数据库会话上下文管理器
|
|
42
|
+
自动处理会话的创建、提交、回滚和关闭
|
|
43
|
+
"""
|
|
44
|
+
session = self.Session()
|
|
45
|
+
try:
|
|
46
|
+
yield session
|
|
47
|
+
session.commit()
|
|
48
|
+
except Exception as e:
|
|
49
|
+
session.rollback()
|
|
50
|
+
SYLogger.error(f"Database operation failed: {str(e)}")
|
|
51
|
+
raise
|
|
52
|
+
finally:
|
|
53
|
+
session.close()
|
|
54
|
+
|
|
55
|
+
def execute(self, fn, retry: int = 0):
|
|
56
|
+
"""
|
|
57
|
+
执行数据库操作,支持自动重试
|
|
58
|
+
|
|
59
|
+
连接级错误(连接断开 2006/2013)始终自动重试1次。
|
|
60
|
+
事务级错误(死锁 1213、锁超时 1205)按 retry 参数重试。
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
fn: 接收 session 参数的可调用对象,例如:
|
|
64
|
+
lambda session: session.query(User).all()
|
|
65
|
+
retry: 事务级错误最大重试次数,默认0不重试
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
fn 的返回值
|
|
69
|
+
|
|
70
|
+
Usage:
|
|
71
|
+
result = self.execute(
|
|
72
|
+
lambda session: session.query(User).all(),
|
|
73
|
+
retry=3
|
|
74
|
+
)
|
|
75
|
+
"""
|
|
76
|
+
attempt = 0
|
|
77
|
+
max_attempts = 1 + max(retry, 0)
|
|
78
|
+
connection_retried = False
|
|
79
|
+
last_exc = None
|
|
80
|
+
|
|
81
|
+
while True:
|
|
82
|
+
session = self.Session()
|
|
83
|
+
try:
|
|
84
|
+
result = fn(session)
|
|
85
|
+
session.commit()
|
|
86
|
+
return result
|
|
87
|
+
except Exception as e:
|
|
88
|
+
session.rollback()
|
|
89
|
+
last_exc = e
|
|
90
|
+
|
|
91
|
+
# 连接级错误:始终自动重试1次(不计入 max_attempts)
|
|
92
|
+
if _is_connection_error(e) and not connection_retried:
|
|
93
|
+
connection_retried = True
|
|
94
|
+
SYLogger.warning(
|
|
95
|
+
f"DB connection lost (errno={getattr(e.orig, 'errno', None)}), retrying..."
|
|
96
|
+
)
|
|
97
|
+
attempt += 1
|
|
98
|
+
continue
|
|
99
|
+
|
|
100
|
+
# 事务级错误:按 retry 参数重试
|
|
101
|
+
if retry > 0 and _is_retryable_tx_error(e) and attempt < max_attempts - 1:
|
|
102
|
+
attempt += 1
|
|
103
|
+
backoff = min(0.5 * (2 ** (attempt - 1)), 2.0)
|
|
104
|
+
SYLogger.warning(
|
|
105
|
+
f"DB retryable error (errno={getattr(e.orig, 'errno', None)}), "
|
|
106
|
+
f"attempt {attempt}/{max_attempts}, backoff {backoff}s"
|
|
107
|
+
)
|
|
108
|
+
time.sleep(backoff)
|
|
109
|
+
continue
|
|
110
|
+
|
|
111
|
+
SYLogger.error(f"Database operation failed: {str(e)}")
|
|
112
|
+
raise
|
|
113
|
+
finally:
|
|
114
|
+
session.close()
|
{sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/logging/kafka_log.py
RENAMED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import sys
|
|
3
3
|
import json
|
|
4
|
+
import logging
|
|
4
5
|
import socket
|
|
5
6
|
import threading
|
|
6
7
|
import traceback
|
|
@@ -176,6 +177,23 @@ class KafkaSink:
|
|
|
176
177
|
pass
|
|
177
178
|
|
|
178
179
|
|
|
180
|
+
class _InterceptHandler(logging.Handler):
|
|
181
|
+
"""将 stdlib logging 日志桥接到 Loguru,使 asyncio 等第三方库的日志进入 Kafka 管道"""
|
|
182
|
+
|
|
183
|
+
def emit(self, record: logging.LogRecord) -> None:
|
|
184
|
+
try:
|
|
185
|
+
level = logger.level(record.levelname).name
|
|
186
|
+
except ValueError:
|
|
187
|
+
level = record.levelno
|
|
188
|
+
|
|
189
|
+
frame, depth = logging.currentframe(), 2
|
|
190
|
+
while frame and frame.f_code.co_filename == logging.__file__:
|
|
191
|
+
frame = frame.f_back
|
|
192
|
+
depth += 1
|
|
193
|
+
|
|
194
|
+
logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage())
|
|
195
|
+
|
|
196
|
+
|
|
179
197
|
class KafkaLogger(metaclass=SingletonMeta):
|
|
180
198
|
_sink_instance = None
|
|
181
199
|
|
|
@@ -206,8 +224,48 @@ class KafkaLogger(metaclass=SingletonMeta):
|
|
|
206
224
|
diagnose=True
|
|
207
225
|
)
|
|
208
226
|
|
|
227
|
+
# 桥接 stdlib logging → Loguru,捕获 asyncio 等第三方库的日志
|
|
228
|
+
intercept_handler = _InterceptHandler()
|
|
229
|
+
logging.root.handlers = [intercept_handler]
|
|
230
|
+
logging.root.setLevel(logging.WARNING)
|
|
231
|
+
|
|
209
232
|
sys.excepthook = KafkaLogger._handle_exception
|
|
210
233
|
|
|
234
|
+
# 注册 asyncio 异常处理器,捕获未处理的 Task 异常
|
|
235
|
+
KafkaLogger._setup_asyncio_exception_handler()
|
|
236
|
+
|
|
237
|
+
@staticmethod
|
|
238
|
+
def _setup_asyncio_exception_handler():
|
|
239
|
+
"""注册 asyncio 事件循环异常处理器,将未处理的 Task 异常导入 Kafka"""
|
|
240
|
+
try:
|
|
241
|
+
loop = asyncio.get_running_loop()
|
|
242
|
+
loop.set_exception_handler(KafkaLogger._asyncio_exception_handler)
|
|
243
|
+
except RuntimeError:
|
|
244
|
+
pass
|
|
245
|
+
|
|
246
|
+
@staticmethod
|
|
247
|
+
def _asyncio_exception_handler(loop, context):
|
|
248
|
+
"""asyncio 未处理异常回调,通过 SYLogger 记录到 Kafka"""
|
|
249
|
+
message = context.get("exception", context.get("message", "Unknown asyncio error"))
|
|
250
|
+
exception = context.get("exception")
|
|
251
|
+
|
|
252
|
+
if exception:
|
|
253
|
+
tb_str = "".join(traceback.format_exception(
|
|
254
|
+
type(exception), exception, exception.__traceback__
|
|
255
|
+
))
|
|
256
|
+
else:
|
|
257
|
+
tb_str = str(message)
|
|
258
|
+
|
|
259
|
+
trace_id = current_trace_id.get() or str(Snowflake.id)
|
|
260
|
+
error_msg = json.dumps({
|
|
261
|
+
"trace_id": trace_id,
|
|
262
|
+
"message": f"asyncio unhandled: {message}",
|
|
263
|
+
"level": "ERROR",
|
|
264
|
+
"detail": tb_str,
|
|
265
|
+
}, ensure_ascii=False)
|
|
266
|
+
|
|
267
|
+
logger.opt(exception=True).error(error_msg)
|
|
268
|
+
|
|
211
269
|
@staticmethod
|
|
212
270
|
def _handle_exception(exc_type, exc_value, exc_traceback):
|
|
213
271
|
if issubclass(exc_type, KeyboardInterrupt):
|
|
@@ -33,7 +33,7 @@ class RabbitMQListenerConfig(BaseModel):
|
|
|
33
33
|
auto_parse_json: bool = Field(True, description="是否自动解析JSON消息")
|
|
34
34
|
prefetch_count: int = Field(2, description="同时消费并发数(控制MQ预取与handler并发上限)")
|
|
35
35
|
max_priority: Optional[int] = Field(
|
|
36
|
-
|
|
36
|
+
10, description="队列支持的最大优先级(对应 x-max-priority)")
|
|
37
37
|
|
|
38
38
|
class Config:
|
|
39
39
|
"""模型配置"""
|
|
@@ -265,6 +265,14 @@ class Services(metaclass=SingletonMeta):
|
|
|
265
265
|
sandbox_cleanup_task = None
|
|
266
266
|
|
|
267
267
|
try:
|
|
268
|
+
# 注册 asyncio 异常处理器(需在事件循环运行后)
|
|
269
|
+
try:
|
|
270
|
+
from sycommon.logging.kafka_log import KafkaLogger
|
|
271
|
+
loop = asyncio.get_running_loop()
|
|
272
|
+
loop.set_exception_handler(KafkaLogger._asyncio_exception_handler)
|
|
273
|
+
except Exception as e:
|
|
274
|
+
logging.debug(f"注册 asyncio 异常处理器失败: {e}")
|
|
275
|
+
|
|
268
276
|
# 1. 处理数据库服务
|
|
269
277
|
if database_service:
|
|
270
278
|
instance._pending_async_db_setup = []
|
|
@@ -286,4 +286,5 @@ src/sycommon_python_lib.egg-info/dependency_links.txt
|
|
|
286
286
|
src/sycommon_python_lib.egg-info/entry_points.txt
|
|
287
287
|
src/sycommon_python_lib.egg-info/requires.txt
|
|
288
288
|
src/sycommon_python_lib.egg-info/top_level.txt
|
|
289
|
+
tests/test_asyncio_logging.py
|
|
289
290
|
tests/test_sycli.py
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"""
|
|
2
|
+
验证 asyncio 错误能被 Kafka 日志管道捕获。
|
|
3
|
+
|
|
4
|
+
覆盖两类场景:
|
|
5
|
+
1. stdlib logging 输出的 asyncio 错误 (如 Unclosed client session)
|
|
6
|
+
2. 未处理的 Task 异常 (Task exception was never retrieved)
|
|
7
|
+
|
|
8
|
+
直接从已安装的包导入,绕过外部服务依赖。
|
|
9
|
+
"""
|
|
10
|
+
import asyncio
|
|
11
|
+
import logging
|
|
12
|
+
|
|
13
|
+
import pytest
|
|
14
|
+
from loguru import logger
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@pytest.fixture(autouse=True)
|
|
18
|
+
def _reset_loguru():
|
|
19
|
+
logger.remove()
|
|
20
|
+
yield
|
|
21
|
+
logger.remove()
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _setup_loguru_spy():
|
|
25
|
+
captured = []
|
|
26
|
+
logger.add(lambda msg: captured.append(str(msg)), level="DEBUG", format="{message}")
|
|
27
|
+
return captured
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# 直接从已安装的 sycommon 包导入(需要 nacos 等服务可用)
|
|
31
|
+
# 这些类不依赖外部连接,可以直接实例化/使用
|
|
32
|
+
from sycommon.logging.kafka_log import _InterceptHandler, KafkaLogger
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def test_intercept_handler_bridges_stdlib_logging():
|
|
36
|
+
"""_InterceptHandler 能将 stdlib logging 的 ERROR 桥接到 loguru"""
|
|
37
|
+
captured = _setup_loguru_spy()
|
|
38
|
+
|
|
39
|
+
handler = _InterceptHandler()
|
|
40
|
+
old_handlers = logging.root.handlers[:]
|
|
41
|
+
old_level = logging.root.level
|
|
42
|
+
logging.root.handlers = [handler]
|
|
43
|
+
logging.root.setLevel(logging.WARNING)
|
|
44
|
+
|
|
45
|
+
logging.getLogger("asyncio").error("Unclosed client session")
|
|
46
|
+
|
|
47
|
+
logging.root.handlers = old_handlers
|
|
48
|
+
logging.root.setLevel(old_level)
|
|
49
|
+
|
|
50
|
+
assert any("Unclosed client session" in msg for msg in captured), \
|
|
51
|
+
f"InterceptHandler 未捕获 asyncio stdlib 日志, captured: {captured}"
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def test_asyncio_exception_handler_captures_task_error():
|
|
55
|
+
"""_asyncio_exception_handler 能捕获未处理的 Task 异常"""
|
|
56
|
+
captured = _setup_loguru_spy()
|
|
57
|
+
|
|
58
|
+
loop = asyncio.new_event_loop()
|
|
59
|
+
loop.set_exception_handler(KafkaLogger._asyncio_exception_handler)
|
|
60
|
+
|
|
61
|
+
async def _fail():
|
|
62
|
+
raise RuntimeError("boom from task")
|
|
63
|
+
|
|
64
|
+
loop.create_task(_fail())
|
|
65
|
+
loop.run_until_complete(asyncio.sleep(0.1))
|
|
66
|
+
loop.close()
|
|
67
|
+
|
|
68
|
+
assert any("asyncio unhandled" in msg and "boom from task" in msg for msg in captured), \
|
|
69
|
+
f"asyncio exception handler 未捕获 Task 异常, captured: {captured}"
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def test_asyncio_exception_handler_captures_non_exception_context():
|
|
73
|
+
"""_asyncio_exception_handler 处理无 exception 的 context"""
|
|
74
|
+
captured = _setup_loguru_spy()
|
|
75
|
+
|
|
76
|
+
loop = asyncio.new_event_loop()
|
|
77
|
+
loop.set_exception_handler(KafkaLogger._asyncio_exception_handler)
|
|
78
|
+
KafkaLogger._asyncio_exception_handler(loop, {"message": "something went wrong"})
|
|
79
|
+
loop.close()
|
|
80
|
+
|
|
81
|
+
assert any("asyncio unhandled" in msg and "something went wrong" in msg for msg in captured), \
|
|
82
|
+
f"asyncio exception handler 未处理纯 message context, captured: {captured}"
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def test_full_pipeline_both_error_types():
|
|
86
|
+
"""完整管道:stdlib 和 Task 两类 asyncio 错误都能进入 loguru"""
|
|
87
|
+
captured = _setup_loguru_spy()
|
|
88
|
+
|
|
89
|
+
handler = _InterceptHandler()
|
|
90
|
+
old_handlers = logging.root.handlers[:]
|
|
91
|
+
old_level = logging.root.level
|
|
92
|
+
logging.root.handlers = [handler]
|
|
93
|
+
logging.root.setLevel(logging.WARNING)
|
|
94
|
+
|
|
95
|
+
loop = asyncio.new_event_loop()
|
|
96
|
+
loop.set_exception_handler(KafkaLogger._asyncio_exception_handler)
|
|
97
|
+
|
|
98
|
+
async def _scenario():
|
|
99
|
+
# 场景1: stdlib logging 输出的 asyncio 错误
|
|
100
|
+
logging.getLogger("asyncio").error("Unclosed connector")
|
|
101
|
+
# 场景2: 未处理的 Task 异常
|
|
102
|
+
async def _fail():
|
|
103
|
+
raise AttributeError("'NoneType' object has no attribute 'get'")
|
|
104
|
+
loop.create_task(_fail())
|
|
105
|
+
await asyncio.sleep(0.1)
|
|
106
|
+
|
|
107
|
+
loop.run_until_complete(_scenario())
|
|
108
|
+
loop.close()
|
|
109
|
+
|
|
110
|
+
logging.root.handlers = old_handlers
|
|
111
|
+
logging.root.setLevel(old_level)
|
|
112
|
+
|
|
113
|
+
assert any("Unclosed connector" in msg for msg in captured), \
|
|
114
|
+
f"stdlib asyncio 错误未进入 loguru, captured: {captured}"
|
|
115
|
+
assert any("asyncio unhandled" in msg and "NoneType" in msg for msg in captured), \
|
|
116
|
+
f"Task 异常未进入 loguru, captured: {captured}"
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
from contextlib import asynccontextmanager
|
|
2
|
-
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker
|
|
3
|
-
from sycommon.config.Config import SingletonMeta
|
|
4
|
-
from sycommon.database.async_database_service import AsyncDatabaseService
|
|
5
|
-
from sycommon.logging.kafka_log import SYLogger
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class AsyncBaseDBService(metaclass=SingletonMeta):
|
|
9
|
-
"""数据库操作基础服务类,封装异步会话管理功能"""
|
|
10
|
-
|
|
11
|
-
def __init__(self):
|
|
12
|
-
# 获取异步引擎 (假设 DatabaseService.engine() 返回的是 AsyncEngine)
|
|
13
|
-
self.engine = AsyncDatabaseService.engine()
|
|
14
|
-
|
|
15
|
-
# 创建异步 Session 工厂
|
|
16
|
-
# class_=AsyncSession 是必须的,用于指定生成的是异步会话
|
|
17
|
-
self.Session = async_sessionmaker(
|
|
18
|
-
bind=self.engine,
|
|
19
|
-
class_=AsyncSession,
|
|
20
|
-
expire_on_commit=False
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
@asynccontextmanager
|
|
24
|
-
async def session(self):
|
|
25
|
-
"""
|
|
26
|
-
异步数据库会话上下文管理器
|
|
27
|
-
自动处理会话的创建、提交、回滚和关闭
|
|
28
|
-
"""
|
|
29
|
-
async with self.Session() as session:
|
|
30
|
-
try:
|
|
31
|
-
yield session
|
|
32
|
-
await session.commit()
|
|
33
|
-
except Exception as e:
|
|
34
|
-
await session.rollback()
|
|
35
|
-
SYLogger.error(f"Database operation failed: {str(e)}")
|
|
36
|
-
raise
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
from contextlib import contextmanager
|
|
2
|
-
from sqlalchemy.orm import sessionmaker
|
|
3
|
-
from sycommon.config.Config import SingletonMeta
|
|
4
|
-
from sycommon.database.database_service import DatabaseService
|
|
5
|
-
from sycommon.logging.kafka_log import SYLogger
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class BaseDBService(metaclass=SingletonMeta):
|
|
9
|
-
"""数据库操作基础服务类,封装会话管理功能"""
|
|
10
|
-
|
|
11
|
-
def __init__(self):
|
|
12
|
-
self.engine = DatabaseService.engine()
|
|
13
|
-
self.Session = sessionmaker(bind=self.engine)
|
|
14
|
-
|
|
15
|
-
@contextmanager
|
|
16
|
-
def session(self):
|
|
17
|
-
"""
|
|
18
|
-
数据库会话上下文管理器
|
|
19
|
-
自动处理会话的创建、提交、回滚和关闭
|
|
20
|
-
"""
|
|
21
|
-
session = self.Session()
|
|
22
|
-
try:
|
|
23
|
-
yield session
|
|
24
|
-
session.commit()
|
|
25
|
-
except Exception as e:
|
|
26
|
-
session.rollback()
|
|
27
|
-
SYLogger.error(f"Database operation failed: {str(e)}")
|
|
28
|
-
raise
|
|
29
|
-
finally:
|
|
30
|
-
session.close()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/__init__.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
|
{sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/app.py.tpl
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
|
{sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/.env.tpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/__init__.py
RENAMED
|
File without changes
|
{sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/app.py.tpl
RENAMED
|
File without changes
|