Source code for kuhl_haus.mdp.enum.market_data_cache_ttl
"""Redis cache TTL values in seconds for internal market data artifacts (MDC).
Defines expiration times for all MDC-resident cached data types in the
real-time pipeline. TTLs are tuned based on data volatility, API rate limits,
and frontend refresh requirements. Shorter TTLs for high-frequency data,
longer for reference data.
For WDC-facing TTLs (scanner results, quote feed, news feeds), use
:class:`~kuhl_haus.mdp.enum.widget_data_cache_ttl.WidgetDataCacheTTL` instead.
The following members are deprecated as of v0.4.0 and will be removed in the
next minor release (no active usages found in src/, tests/, or mdp-servers):
- ``NEGATIVE_CACHE_THROTTLE``
- ``LEADERBOARD_TOP_VOLUME``
- ``LEADERBOARD_TOP_GAPPERS``
- ``LEADERBOARD_TOP_GAINERS``
- ``TOP_STOCKS_SCANNER`` → :attr:`~kuhl_haus.mdp.enum.widget_data_cache_ttl.WidgetDataCacheTTL.TOP_STOCKS_SCANNER`
- ``TOP_VOLUME_SCANNER`` → :attr:`~kuhl_haus.mdp.enum.widget_data_cache_ttl.WidgetDataCacheTTL.TOP_VOLUME_SCANNER`
- ``TOP_GAINERS_SCANNER`` → :attr:`~kuhl_haus.mdp.enum.widget_data_cache_ttl.WidgetDataCacheTTL.TOP_GAINERS_SCANNER`
- ``TOP_GAPPERS_SCANNER`` → :attr:`~kuhl_haus.mdp.enum.widget_data_cache_ttl.WidgetDataCacheTTL.TOP_GAPPERS_SCANNER`
"""
import warnings
from enum import Enum
from kuhl_haus.mdp.enum.constants import (
EIGHT_HOURS,
FIVE_MINUTES,
FOUR_DAYS,
ONE_DAY,
ONE_HOUR,
ONE_MINUTE,
SEVEN_DAYS,
SIX_HOURS,
THIRTY_SECONDS,
THREE_DAYS,
TWELVE_HOURS,
TWO_DAYS,
)
[docs]
class MarketDataCacheTTL(Enum):
"""Time-to-live durations for Redis cache entries across all data types.
TTL selection balances freshness requirements against API quotas and memory
pressure. High-velocity trade data expires quickly; reference data like
float shares persists for hours. Negative cache prevents retry storms on
API failures.
.. deprecated::
The following members are deprecated as of v0.4.0 and will be removed in
the next minor release (no active usages found):
- ``NEGATIVE_CACHE_THROTTLE``
- ``LEADERBOARD_TOP_VOLUME``
- ``LEADERBOARD_TOP_GAPPERS``
- ``LEADERBOARD_TOP_GAINERS``
- ``TOP_STOCKS_SCANNER`` → use ``WidgetDataCacheTTL.TOP_STOCKS_SCANNER``
- ``TOP_VOLUME_SCANNER`` → use ``WidgetDataCacheTTL.TOP_VOLUME_SCANNER``
- ``TOP_GAINERS_SCANNER`` → use ``WidgetDataCacheTTL.TOP_GAINERS_SCANNER``
- ``TOP_GAPPERS_SCANNER`` → use ``WidgetDataCacheTTL.TOP_GAPPERS_SCANNER``
"""
# @deprecated — no active usages
NEGATIVE_CACHE_THROTTLE = ONE_MINUTE
NEGATIVE_CACHE_SESSION = SIX_HOURS
# Raw market data caches
AGGREGATE = FIVE_MINUTES
HALTS = ONE_DAY
QUOTES = ONE_HOUR
TRADES = ONE_HOUR
UNKNOWN = ONE_DAY
# Ticker caches
TICKER_AVG_VOLUME = TWELVE_HOURS
TICKER_FREE_FLOAT = TWELVE_HOURS
TICKER_SNAPSHOTS = EIGHT_HOURS
TICKER_SNAPSHOT_LOCK = THIRTY_SECONDS
TICKER_AVG_VOLUME_LOCK = THIRTY_SECONDS
TICKER_FREE_FLOAT_LOCK = THIRTY_SECONDS
# Leaderboard caches
LEADERBOARD_ANALYZER = ONE_HOUR
# @deprecated — no active usages
LEADERBOARD_TOP_VOLUME = THREE_DAYS
# @deprecated — no active usages
LEADERBOARD_TOP_GAPPERS = THREE_DAYS
# @deprecated — no active usages
LEADERBOARD_TOP_GAINERS = THREE_DAYS
# Top Trades caches
TOP_TRADES_TRADE_TTL = FIVE_MINUTES
TOP_TRADES_WIDGET_CACHE_TTL = ONE_MINUTE
TOP_TRADES_ALL_SYMBOLS_CACHE_TTL = ONE_MINUTE
# Quote feed cache
QUOTE = FOUR_DAYS # Stale data > no data; timestamp in payload shows freshness
# @deprecated — no active usages; use WidgetDataCacheTTL.TOP_STOCKS_SCANNER
TOP_STOCKS_SCANNER = EIGHT_HOURS
# @deprecated — no active usages; use WidgetDataCacheTTL.TOP_VOLUME_SCANNER
TOP_VOLUME_SCANNER = FOUR_DAYS
# @deprecated — no active usages; use WidgetDataCacheTTL.TOP_GAINERS_SCANNER
TOP_GAINERS_SCANNER = FOUR_DAYS
# @deprecated — no active usages; use WidgetDataCacheTTL.TOP_GAPPERS_SCANNER
TOP_GAPPERS_SCANNER = FOUR_DAYS
# Finlight news caches
NEWS_FEED_LATEST = TWO_DAYS
NEWS_TICKER = SEVEN_DAYS
def _warn_deprecated_member(name: str) -> None:
warnings.warn(
f"MarketDataCacheTTL.{name} is deprecated as of v0.4.0 and will be removed in the "
f"next minor release. Use WidgetDataCacheTTL.{name} instead.",
DeprecationWarning,
stacklevel=3,
)
_DEPRECATED_TTL_MEMBERS = frozenset({
"NEGATIVE_CACHE_THROTTLE",
"LEADERBOARD_TOP_VOLUME",
"LEADERBOARD_TOP_GAPPERS",
"LEADERBOARD_TOP_GAINERS",
"TOP_STOCKS_SCANNER",
"TOP_VOLUME_SCANNER",
"TOP_GAINERS_SCANNER",
"TOP_GAPPERS_SCANNER",
})
[docs]
def __getattr__(name: str):
"""Module-level __getattr__ to warn on access of deprecated enum members via module."""
if name in _DEPRECATED_TTL_MEMBERS:
_warn_deprecated_member(name)
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")