workspace

This commit is contained in:
2026-06-09 17:28:25 +08:00
parent a651e08fff
commit 7eb3647539
6 changed files with 142 additions and 6 deletions
+21
View File
@@ -0,0 +1,21 @@
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "surugaya-common"
version = "0.1.0"
description = "Shared contracts (Redis keys, future models) for jp_surugaya services"
requires-python = ">=3.12"
dependencies = [
"pydantic>=2.0.0,<3.0.0",
"redis>=5.0.0,<6.0.0",
]
[tool.hatch.build.targets.wheel]
packages = ["src/surugaya_common"]
# NOTE (deferred): redis pin here intentionally matches the API service (<6).
# The worker's redis==8 requirement is NOT introduced in this increment, so there
# is no conflict to resolve yet. Do not add fastapi/playwright/opencv/numpy/
# pyautogui/pillow here — surugaya_common must stay light.
@@ -0,0 +1,5 @@
"""Shared contracts for jp_surugaya services (Redis keys, future models)."""
from surugaya_common import redis_keys
__all__ = ["redis_keys"]
@@ -0,0 +1,80 @@
"""Centralized Redis key contract shared across jp_surugaya services.
Single source of truth for every Redis key schema. Helper functions reproduce
the EXACT literals currently produced inline by the API service so behaviour is
byte-for-byte identical after refactoring.
Current literals (as of this extraction):
purchase task stream : jp_surugaya_purchase_task[_dev]
trade delay zset : jp_surugaya_trade_delay[_dev]:{node_id}
trade hash : jp_surugaya_trade
trade pending dedup : jp_surugaya_trade_pending:{trade_code}
trade fetch stream : jp_surugaya_trade_fetch
"""
from __future__ import annotations
# --- Base key constants (no suffixes applied) -------------------------------
PURCHASE_TASK_STREAM: str = "jp_surugaya_purchase_task"
TRADE_DELAY_ZSET: str = "jp_surugaya_trade_delay"
TRADE_HASH: str = "jp_surugaya_trade"
TRADE_PENDING_PREFIX: str = "jp_surugaya_trade_pending"
TRADE_FETCH_STREAM: str = "jp_surugaya_trade_fetch"
# Suffix appended to dev-mode keys.
_DEV_SUFFIX: str = "_dev"
def _is_dev(is_dev: object) -> bool:
"""Normalize the dev flag.
The API passes payload.is_dev which is the string "1" for dev mode.
Accepts the raw string flag ("1"), a bool, or anything truthy-comparable
while preserving the exact original semantics (is_dev == "1").
"""
if isinstance(is_dev, str):
return is_dev == "1"
return bool(is_dev)
def purchase_task_stream(is_dev: object = None) -> str:
"""Redis Stream key for the purchase task queue.
Reproduces:
"jp_surugaya_purchase_task_dev" if is_dev == "1" else "jp_surugaya_purchase_task"
"""
if _is_dev(is_dev):
return f"{PURCHASE_TASK_STREAM}{_DEV_SUFFIX}"
return PURCHASE_TASK_STREAM
def trade_delay_zset(node_id: object, is_dev: object = None) -> str:
"""Redis Sorted Set key for delayed trade monitoring, scoped by node_id.
Reproduces:
base = "jp_surugaya_trade_delay_dev" if is_dev == "1" else "jp_surugaya_trade_delay"
base + f":{node_id}"
"""
base = TRADE_DELAY_ZSET
if _is_dev(is_dev):
base = f"{base}{_DEV_SUFFIX}"
return f"{base}:{node_id}"
def trade_hash() -> str:
"""Redis Hash key storing trade order details keyed by trade_code."""
return TRADE_HASH
def trade_pending_key(trade_code: object) -> str:
"""TTL dedup key for a pending trade fetch.
Reproduces: f"jp_surugaya_trade_pending:{trade_code}"
"""
return f"{TRADE_PENDING_PREFIX}:{trade_code}"
def trade_fetch_stream() -> str:
"""Redis Stream key for trade fetch tasks."""
return TRADE_FETCH_STREAM