Skip to content

Commit f26b03e

Browse files
authored
chore: add coverage and uv.lock
chore: add coverage config and uv.lock
2 parents cb90c9b + 10371b6 commit f26b03e

3 files changed

Lines changed: 42 additions & 23 deletions

File tree

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ jobs:
6060
set -euo pipefail
6161
python -m pip install --upgrade pip
6262
python -m pip install -r requirements.txt
63-
python -m pip install pytest ruff
63+
python -m pip install pytest pytest-cov ruff
6464
6565
- name: Smoke import pinned shared packages
6666
run: |
@@ -89,4 +89,4 @@ jobs:
8989
- name: Run unit tests
9090
run: |
9191
set -euo pipefail
92-
PYTHONPATH=. python -m pytest -q tests
92+
PYTHONPATH=. python -m pytest -q tests --cov --cov-report=term --cov-report=xml

pyproject.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
[build-system]
2+
requires = ["setuptools>=68"]
3+
build-backend = "setuptools.build_meta"
4+
15
[project]
26
name = "longbridge-platform"
37
version = "0.1.0"
@@ -15,3 +19,11 @@ dependencies = [
1519
"google-auth",
1620
"longport",
1721
]
22+
23+
[tool.coverage.run]
24+
branch = true
25+
source = ["src"]
26+
omit = ["tests/*", "*/external/*"]
27+
28+
[tool.coverage.report]
29+
show_missing = true

runtime_config_support.py

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,14 @@
1010
resolve_bool_value,
1111
resolve_cash_only_execution_env,
1212
resolve_dry_run_env,
13+
resolve_optional_bool_env,
14+
resolve_optional_dca_mode_env,
1315
resolve_optional_float_env,
16+
resolve_optional_ibit_zscore_exit_mode_env,
17+
resolve_optional_positive_float_env,
18+
resolve_optional_ratio_env,
19+
resolve_optional_symbol_env,
20+
resolve_split_env_list,
1421
resolve_strategy_runtime_path_settings,
1522
)
1623
from quant_platform_kit.common.runtime_target import (
@@ -327,19 +334,19 @@ def load_platform_runtime_settings(
327334
debug_position_snapshot=resolve_bool_value(os.getenv("LONGBRIDGE_DEBUG_POSITION_SNAPSHOT")),
328335
income_threshold_usd=resolve_optional_float_env(os.environ, "INCOME_THRESHOLD_USD"),
329336
qqqi_income_ratio=_qqqi_income_ratio_env(),
330-
income_layer_enabled=_optional_bool_env("INCOME_LAYER_ENABLED"),
337+
income_layer_enabled=resolve_optional_bool_env("INCOME_LAYER_ENABLED"),
331338
income_layer_start_usd=_optional_non_negative_float_env("INCOME_LAYER_START_USD"),
332-
income_layer_max_ratio=_optional_ratio_env("INCOME_LAYER_MAX_RATIO"),
333-
dca_mode=_optional_dca_mode_env("DCA_MODE"),
334-
dca_base_investment_usd=_optional_positive_float_env("DCA_BASE_INVESTMENT_USD"),
335-
ibit_zscore_exit_enabled=_optional_bool_env("IBIT_ZSCORE_EXIT_ENABLED"),
336-
ibit_zscore_exit_mode=_optional_ibit_zscore_exit_mode_env("IBIT_ZSCORE_EXIT_MODE"),
337-
ibit_zscore_exit_parking_symbol=_optional_symbol_env("IBIT_ZSCORE_EXIT_PARKING_SYMBOL"),
338-
ibit_zscore_exit_risk_reduced_exposure=_optional_ratio_env(
339+
income_layer_max_ratio=resolve_optional_ratio_env("INCOME_LAYER_MAX_RATIO"),
340+
dca_mode=resolve_optional_dca_mode_env("DCA_MODE"),
341+
dca_base_investment_usd=resolve_optional_positive_float_env("DCA_BASE_INVESTMENT_USD"),
342+
ibit_zscore_exit_enabled=resolve_optional_bool_env("IBIT_ZSCORE_EXIT_ENABLED"),
343+
ibit_zscore_exit_mode=resolve_optional_ibit_zscore_exit_mode_env("IBIT_ZSCORE_EXIT_MODE"),
344+
ibit_zscore_exit_parking_symbol=resolve_optional_symbol_env("IBIT_ZSCORE_EXIT_PARKING_SYMBOL"),
345+
ibit_zscore_exit_risk_reduced_exposure=resolve_optional_ratio_env(
339346
"IBIT_ZSCORE_EXIT_RISK_REDUCED_EXPOSURE"
340347
),
341-
ibit_zscore_exit_risk_off_exposure=_optional_ratio_env("IBIT_ZSCORE_EXIT_RISK_OFF_EXPOSURE"),
342-
ibit_zscore_exit_allow_outside_execution_window=_optional_bool_env(
348+
ibit_zscore_exit_risk_off_exposure=resolve_optional_ratio_env("IBIT_ZSCORE_EXIT_RISK_OFF_EXPOSURE"),
349+
ibit_zscore_exit_allow_outside_execution_window=resolve_optional_bool_env(
343350
"IBIT_ZSCORE_EXIT_ALLOW_OUTSIDE_EXECUTION_WINDOW"
344351
),
345352
runtime_execution_window_trading_days=_runtime_execution_window_trading_days_env(
@@ -404,8 +411,8 @@ def load_platform_runtime_settings(
404411
os.getenv("LONGBRIDGE_STRATEGY_PLUGIN_MOUNTS_JSON")
405412
or os.getenv("STRATEGY_PLUGIN_MOUNTS_JSON")
406413
),
407-
strategy_plugin_alert_channels=_split_env_list(os.getenv("STRATEGY_PLUGIN_ALERT_CHANNELS")),
408-
strategy_plugin_alert_email_recipients=_split_env_list(os.getenv("STRATEGY_PLUGIN_ALERT_EMAIL_RECIPIENTS")),
414+
strategy_plugin_alert_channels=resolve_split_env_list("STRATEGY_PLUGIN_ALERT_CHANNELS")),
415+
strategy_plugin_alert_email_recipients=resolve_split_env_list("STRATEGY_PLUGIN_ALERT_EMAIL_RECIPIENTS")),
409416
strategy_plugin_alert_email_sender_email=_first_non_empty(os.getenv("STRATEGY_PLUGIN_ALERT_EMAIL_SENDER_EMAIL")),
410417
strategy_plugin_alert_email_sender_password=_first_non_empty(
411418
os.getenv("STRATEGY_PLUGIN_ALERT_EMAIL_SENDER_PASSWORD")
@@ -415,7 +422,7 @@ def load_platform_runtime_settings(
415422
strategy_plugin_alert_email_smtp_security=_first_non_empty(
416423
os.getenv("STRATEGY_PLUGIN_ALERT_EMAIL_SMTP_SECURITY")
417424
),
418-
strategy_plugin_alert_sms_recipients=_split_env_list(os.getenv("STRATEGY_PLUGIN_ALERT_SMS_RECIPIENTS")),
425+
strategy_plugin_alert_sms_recipients=resolve_split_env_list("STRATEGY_PLUGIN_ALERT_SMS_RECIPIENTS")),
419426
strategy_plugin_alert_sms_provider=_first_non_empty(os.getenv("STRATEGY_PLUGIN_ALERT_SMS_PROVIDER")),
420427
strategy_plugin_alert_sms_account_id=_first_non_empty(os.getenv("STRATEGY_PLUGIN_ALERT_SMS_ACCOUNT_ID")),
421428
strategy_plugin_alert_sms_auth_token=_first_non_empty(os.getenv("STRATEGY_PLUGIN_ALERT_SMS_AUTH_TOKEN")),
@@ -427,7 +434,7 @@ def load_platform_runtime_settings(
427434
strategy_plugin_alert_sms_body_max_chars=_first_non_empty(
428435
os.getenv("STRATEGY_PLUGIN_ALERT_SMS_BODY_MAX_CHARS")
429436
),
430-
strategy_plugin_alert_push_recipients=_split_env_list(os.getenv("STRATEGY_PLUGIN_ALERT_PUSH_RECIPIENTS")),
437+
strategy_plugin_alert_push_recipients=resolve_split_env_list("STRATEGY_PLUGIN_ALERT_PUSH_RECIPIENTS")),
431438
strategy_plugin_alert_push_provider=_first_non_empty(os.getenv("STRATEGY_PLUGIN_ALERT_PUSH_PROVIDER")),
432439
strategy_plugin_alert_push_app_token=_first_non_empty(os.getenv("STRATEGY_PLUGIN_ALERT_PUSH_APP_TOKEN")),
433440
strategy_plugin_alert_push_access_token=_first_non_empty(os.getenv("STRATEGY_PLUGIN_ALERT_PUSH_ACCESS_TOKEN")),
@@ -477,7 +484,7 @@ def _qqqi_income_ratio_env() -> float | None:
477484
return value
478485

479486

480-
def _optional_bool_env(name: str) -> bool | None:
487+
def resolve_optional_bool_env(name: str) -> bool | None:
481488
raw_value = os.getenv(name)
482489
if raw_value is None or str(raw_value).strip() == "":
483490
return None
@@ -490,11 +497,11 @@ def _optional_bool_env(name: str) -> bool | None:
490497

491498

492499
def _runtime_target_enabled_env() -> bool:
493-
value = _optional_bool_env("RUNTIME_TARGET_ENABLED")
500+
value = resolve_optional_bool_env("RUNTIME_TARGET_ENABLED")
494501
return True if value is None else value
495502

496503

497-
def _optional_ratio_env(name: str) -> float | None:
504+
def resolve_optional_ratio_env(name: str) -> float | None:
498505
value = resolve_optional_float_env(os.environ, name)
499506
if value is None:
500507
return None
@@ -516,7 +523,7 @@ def _optional_non_negative_float_env(name: str) -> float | None:
516523
return float(value)
517524

518525

519-
def _optional_positive_float_env(name: str) -> float | None:
526+
def resolve_optional_positive_float_env(name: str) -> float | None:
520527
value = resolve_optional_float_env(os.environ, name)
521528
if value is None:
522529
return None
@@ -527,7 +534,7 @@ def _optional_positive_float_env(name: str) -> float | None:
527534
return float(value)
528535

529536

530-
def _optional_dca_mode_env(name: str) -> str | None:
537+
def resolve_optional_dca_mode_env(name: str) -> str | None:
531538
raw_value = os.getenv(name)
532539
if raw_value is None or str(raw_value).strip() == "":
533540
return None
@@ -544,7 +551,7 @@ def _optional_dca_mode_env(name: str) -> str | None:
544551
return mode
545552

546553

547-
def _optional_ibit_zscore_exit_mode_env(name: str) -> str | None:
554+
def resolve_optional_ibit_zscore_exit_mode_env(name: str) -> str | None:
548555
raw_value = os.getenv(name)
549556
if raw_value is None or str(raw_value).strip() == "":
550557
return None
@@ -565,7 +572,7 @@ def _optional_ibit_zscore_exit_mode_env(name: str) -> str | None:
565572
return mode
566573

567574

568-
def _optional_symbol_env(name: str) -> str | None:
575+
def resolve_optional_symbol_env(name: str) -> str | None:
569576
raw_value = os.getenv(name)
570577
if raw_value is None or str(raw_value).strip() == "":
571578
return None

0 commit comments

Comments
 (0)