refactor: address high-priority debt and publish to PyPI
- Fix TOCTOU race conditions by wrapping read-modify-write cycles under single-file locks in execution_state, portfolio_service, precheck_state, state_manager, and precheck_service. - Add missing test coverage (96 tests total): - test_review_service.py (15 tests) - test_check_api.py (6 tests) - test_external_gate.py main branches (+10 tests) - test_trade_execution.py new commands (+8 tests) - Unify all agent-consumed JSON messages to English. - Config-ize hardcoded values (volume filter, schema_version) via get_user_config with sensible defaults. - Add 1-hour TTL to exchange cache with force_new override. - Add ruff and mypy to dev dependencies; fix all type errors. - Add __all__ declarations to 11 service modules. - Sync README with new commands, config tuning docs, and PyPI badge. - Publish package as coinhunter==1.0.0 on PyPI with MIT license. - Deprecate coinhunter-cli==1.0.1 with runtime warning. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -18,14 +18,19 @@ from __future__ import annotations
|
||||
|
||||
from importlib import import_module
|
||||
|
||||
from ..runtime import get_runtime_paths
|
||||
|
||||
_PATH_ALIASES = {
|
||||
"PATHS": lambda: get_runtime_paths(),
|
||||
"BASE_DIR": lambda: get_runtime_paths().root,
|
||||
"STATE_DIR": lambda: get_runtime_paths().state_dir,
|
||||
"STATE_FILE": lambda: get_runtime_paths().precheck_state_file,
|
||||
"POSITIONS_FILE": lambda: get_runtime_paths().positions_file,
|
||||
"CONFIG_FILE": lambda: get_runtime_paths().config_file,
|
||||
"ENV_FILE": lambda: get_runtime_paths().env_file,
|
||||
}
|
||||
|
||||
_MODULE_MAP = {
|
||||
"PATHS": ".precheck_constants",
|
||||
"BASE_DIR": ".precheck_constants",
|
||||
"STATE_DIR": ".precheck_constants",
|
||||
"STATE_FILE": ".precheck_constants",
|
||||
"POSITIONS_FILE": ".precheck_constants",
|
||||
"CONFIG_FILE": ".precheck_constants",
|
||||
"ENV_FILE": ".precheck_constants",
|
||||
"BASE_PRICE_MOVE_TRIGGER_PCT": ".precheck_constants",
|
||||
"BASE_PNL_TRIGGER_PCT": ".precheck_constants",
|
||||
"BASE_PORTFOLIO_MOVE_TRIGGER_PCT": ".precheck_constants",
|
||||
@@ -74,10 +79,12 @@ _MODULE_MAP = {
|
||||
"analyze_trigger": ".trigger_analyzer",
|
||||
}
|
||||
|
||||
__all__ = sorted(set(_MODULE_MAP) | {"main"})
|
||||
__all__ = sorted(set(_MODULE_MAP) | set(_PATH_ALIASES) | {"main"})
|
||||
|
||||
|
||||
def __getattr__(name: str):
|
||||
if name in _PATH_ALIASES:
|
||||
return _PATH_ALIASES[name]()
|
||||
if name not in _MODULE_MAP:
|
||||
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
||||
module_name = _MODULE_MAP[name]
|
||||
@@ -90,8 +97,9 @@ def __dir__():
|
||||
|
||||
|
||||
def main():
|
||||
from .precheck_service import run as _run_service
|
||||
import sys
|
||||
|
||||
from .precheck_service import run as _run_service
|
||||
return _run_service(sys.argv[1:])
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user