kuhl-haus-mdp 0.1.10__py3-none-any.whl → 0.1.12__py3-none-any.whl

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.
Files changed (26) hide show
  1. kuhl_haus/mdp/analyzers/analyzer.py +1 -1
  2. kuhl_haus/mdp/analyzers/massive_data_analyzer.py +52 -28
  3. kuhl_haus/mdp/analyzers/top_stocks.py +9 -6
  4. kuhl_haus/mdp/components/market_data_cache.py +33 -11
  5. kuhl_haus/mdp/components/market_data_scanner.py +1 -1
  6. kuhl_haus/mdp/{integ → components}/massive_data_processor.py +2 -2
  7. kuhl_haus/mdp/{integ → components}/massive_data_queues.py +2 -2
  8. kuhl_haus/mdp/{models → enum}/market_data_cache_keys.py +1 -1
  9. kuhl_haus/mdp/{models → enum}/market_data_cache_ttl.py +1 -2
  10. kuhl_haus/mdp/{models → enum}/market_data_pubsub_keys.py +1 -1
  11. kuhl_haus/mdp/helpers/queue_name_resolver.py +1 -1
  12. {kuhl_haus_mdp-0.1.10.dist-info → kuhl_haus_mdp-0.1.12.dist-info}/METADATA +1 -1
  13. kuhl_haus_mdp-0.1.12.dist-info/RECORD +32 -0
  14. kuhl_haus_mdp-0.1.10.dist-info/RECORD +0 -32
  15. /kuhl_haus/mdp/{integ → components}/massive_data_listener.py +0 -0
  16. /kuhl_haus/mdp/{integ → data}/__init__.py +0 -0
  17. /kuhl_haus/mdp/{models → data}/market_data_analyzer_result.py +0 -0
  18. /kuhl_haus/mdp/{models → data}/top_stocks_cache_item.py +0 -0
  19. /kuhl_haus/mdp/{models → enum}/__init__.py +0 -0
  20. /kuhl_haus/mdp/{models → enum}/constants.py +0 -0
  21. /kuhl_haus/mdp/{models → enum}/market_data_scanner_names.py +0 -0
  22. /kuhl_haus/mdp/{models → enum}/massive_data_queue.py +0 -0
  23. /kuhl_haus/mdp/{integ → helpers}/web_socket_message_serde.py +0 -0
  24. {kuhl_haus_mdp-0.1.10.dist-info → kuhl_haus_mdp-0.1.12.dist-info}/WHEEL +0 -0
  25. {kuhl_haus_mdp-0.1.10.dist-info → kuhl_haus_mdp-0.1.12.dist-info}/entry_points.txt +0 -0
  26. {kuhl_haus_mdp-0.1.10.dist-info → kuhl_haus_mdp-0.1.12.dist-info}/licenses/LICENSE.txt +0 -0
@@ -1,5 +1,5 @@
1
1
  from typing import Optional, List
2
- from kuhl_haus.mdp.models.market_data_analyzer_result import MarketDataAnalyzerResult
2
+ from kuhl_haus.mdp.data.market_data_analyzer_result import MarketDataAnalyzerResult
3
3
  from kuhl_haus.mdp.components.market_data_cache import MarketDataCache
4
4
 
5
5
 
@@ -3,14 +3,21 @@ from time import time
3
3
  from typing import List, Optional
4
4
  from massive.websocket.models import EventType
5
5
 
6
- from kuhl_haus.mdp.models.market_data_analyzer_result import MarketDataAnalyzerResult
7
- from kuhl_haus.mdp.models.market_data_cache_keys import MarketDataCacheKeys
8
- from kuhl_haus.mdp.models.market_data_cache_ttl import MarketDataCacheTTL
6
+ from kuhl_haus.mdp.data.market_data_analyzer_result import MarketDataAnalyzerResult
7
+ from kuhl_haus.mdp.enum.market_data_cache_keys import MarketDataCacheKeys
8
+ from kuhl_haus.mdp.enum.market_data_cache_ttl import MarketDataCacheTTL
9
9
 
10
10
 
11
11
  class MassiveDataAnalyzer:
12
- def __init__(self):
12
+ cache_agg_event: bool
13
+ cache_trade_event: bool
14
+ cache_quote_event: bool
15
+
16
+ def __init__(self, cache_agg_event: bool = False, cache_trade_event: bool = False, cache_quote_event: bool = False):
13
17
  self.logger = logging.getLogger(__name__)
18
+ self.cache_agg_event = cache_agg_event
19
+ self.cache_trade_event = cache_trade_event
20
+ self.cache_quote_event = cache_quote_event
14
21
  self.event_handlers = {
15
22
  EventType.LimitUpLimitDown.value: self.handle_luld_event,
16
23
  EventType.EquityAgg.value: self.handle_equity_agg_event,
@@ -54,32 +61,49 @@ class MassiveDataAnalyzer:
54
61
  publish_key=f"{MarketDataCacheKeys.HALTS.value}:{symbol}",
55
62
  )]
56
63
 
57
- @staticmethod
58
- def handle_equity_agg_event(data: dict, symbol: str) -> Optional[List[MarketDataAnalyzerResult]]:
59
- return [MarketDataAnalyzerResult(
60
- data=data,
61
- # cache_key=f"{MarketDataCacheKeys.AGGREGATE.value}:{symbol}",
62
- # cache_ttl=MarketDataCacheTTL.AGGREGATE.value,
63
- publish_key=f"{MarketDataCacheKeys.AGGREGATE.value}:{symbol}",
64
- )]
64
+ def handle_equity_agg_event(self, data: dict, symbol: str) -> Optional[List[MarketDataAnalyzerResult]]:
65
+ if self.cache_agg_event:
66
+ return [MarketDataAnalyzerResult(
67
+ data=data,
68
+ cache_key=f"{MarketDataCacheKeys.AGGREGATE.value}:{symbol}",
69
+ cache_ttl=MarketDataCacheTTL.AGGREGATE.value,
70
+ publish_key=f"{MarketDataCacheKeys.AGGREGATE.value}:{symbol}",
71
+ )]
72
+ else:
73
+ return [MarketDataAnalyzerResult(
74
+ data=data,
75
+ publish_key=f"{MarketDataCacheKeys.AGGREGATE.value}:{symbol}",
76
+ )]
65
77
 
66
- @staticmethod
67
- def handle_equity_trade_event(data: dict, symbol: str) -> Optional[List[MarketDataAnalyzerResult]]:
68
- return [MarketDataAnalyzerResult(
69
- data=data,
70
- # cache_key=f"{MarketDataCacheKeys.TRADES.value}:{symbol}",
71
- # cache_ttl=MarketDataCacheTTL.TRADES.value,
72
- publish_key=f"{MarketDataCacheKeys.TRADES.value}:{symbol}",
73
- )]
78
+ def handle_equity_trade_event(self, data: dict, symbol: str) -> Optional[List[MarketDataAnalyzerResult]]:
79
+ if self.cache_trade_event:
80
+ return [MarketDataAnalyzerResult(
81
+ data=data,
82
+ cache_key=f"{MarketDataCacheKeys.TRADES.value}:{symbol}",
83
+ cache_ttl=MarketDataCacheTTL.TRADES.value,
84
+ publish_key=f"{MarketDataCacheKeys.TRADES.value}:{symbol}",
85
+ )]
86
+ else:
87
+ return [MarketDataAnalyzerResult(
88
+ data=data,
89
+ publish_key=f"{MarketDataCacheKeys.TRADES.value}:{symbol}",
90
+ )]
74
91
 
75
- @staticmethod
76
- def handle_equity_quote_event(data: dict, symbol: str) -> Optional[List[MarketDataAnalyzerResult]]:
77
- return [MarketDataAnalyzerResult(
78
- data=data,
79
- # cache_key=f"{MarketDataCacheKeys.QUOTES.value}:{symbol}",
80
- # cache_ttl=MarketDataCacheTTL.QUOTES.value,
81
- publish_key=f"{MarketDataCacheKeys.QUOTES.value}:{symbol}",
82
- )]
92
+ def handle_equity_quote_event(self, data: dict, symbol: str) -> Optional[List[MarketDataAnalyzerResult]]:
93
+ if self.cache_quote_event:
94
+ return [MarketDataAnalyzerResult(
95
+ data=data,
96
+ cache_key=f"{MarketDataCacheKeys.QUOTES.value}:{symbol}",
97
+ cache_ttl=MarketDataCacheTTL.QUOTES.value,
98
+ publish_key=f"{MarketDataCacheKeys.QUOTES.value}:{symbol}",
99
+ )]
100
+ else:
101
+ return [MarketDataAnalyzerResult(
102
+ data=data,
103
+ # cache_key=f"{MarketDataCacheKeys.QUOTES.value}:{symbol}",
104
+ # cache_ttl=MarketDataCacheTTL.QUOTES.value,
105
+ publish_key=f"{MarketDataCacheKeys.QUOTES.value}:{symbol}",
106
+ )]
83
107
 
84
108
  @staticmethod
85
109
  def handle_unknown_event(data: dict) -> Optional[List[MarketDataAnalyzerResult]]:
@@ -11,11 +11,11 @@ from massive.websocket.models import (
11
11
 
12
12
  from kuhl_haus.mdp.analyzers.analyzer import Analyzer
13
13
  from kuhl_haus.mdp.components.market_data_cache import MarketDataCache
14
- from kuhl_haus.mdp.models.market_data_analyzer_result import MarketDataAnalyzerResult
15
- from kuhl_haus.mdp.models.market_data_cache_keys import MarketDataCacheKeys
16
- from kuhl_haus.mdp.models.market_data_cache_ttl import MarketDataCacheTTL
17
- from kuhl_haus.mdp.models.market_data_pubsub_keys import MarketDataPubSubKeys
18
- from kuhl_haus.mdp.models.top_stocks_cache_item import TopStocksCacheItem
14
+ from kuhl_haus.mdp.data.market_data_analyzer_result import MarketDataAnalyzerResult
15
+ from kuhl_haus.mdp.data.top_stocks_cache_item import TopStocksCacheItem
16
+ from kuhl_haus.mdp.enum.market_data_cache_keys import MarketDataCacheKeys
17
+ from kuhl_haus.mdp.enum.market_data_cache_ttl import MarketDataCacheTTL
18
+ from kuhl_haus.mdp.enum.market_data_pubsub_keys import MarketDataPubSubKeys
19
19
 
20
20
 
21
21
  class TopStocksAnalyzer(Analyzer):
@@ -41,7 +41,7 @@ class TopStocksAnalyzer(Analyzer):
41
41
  self.cache_item = TopStocksCacheItem()
42
42
  self.logger.info(f"Outside market hours ({et_now.strftime('%H:%M:%S %Z')}), clearing cache.")
43
43
  return
44
- data = await self.cache.get_cache(self.cache_key)
44
+ data = await self.cache.read(self.cache_key)
45
45
  if not data:
46
46
  self.cache_item = TopStocksCacheItem()
47
47
  self.logger.info("No data to rehydrate TopStocksCacheItem.")
@@ -136,6 +136,9 @@ class TopStocksAnalyzer(Analyzer):
136
136
  prev_day_volume = snapshot.prev_day.volume
137
137
  prev_day_vwap = snapshot.prev_day.vwap
138
138
  break
139
+ except KeyError:
140
+ retry_count += 1
141
+ await self.cache.delete_ticker_snapshot(event.symbol)
139
142
  except Exception as e:
140
143
  self.logger.error(f"Failed to get snapshot for {event.symbol}: {e}")
141
144
  retry_count += 1
@@ -14,8 +14,8 @@ from massive.rest.models import (
14
14
  )
15
15
 
16
16
  from kuhl_haus.mdp.helpers.utils import ticker_snapshot_to_dict
17
- from kuhl_haus.mdp.models.market_data_cache_keys import MarketDataCacheKeys
18
- from kuhl_haus.mdp.models.market_data_cache_ttl import MarketDataCacheTTL
17
+ from kuhl_haus.mdp.enum.market_data_cache_keys import MarketDataCacheKeys
18
+ from kuhl_haus.mdp.enum.market_data_cache_ttl import MarketDataCacheTTL
19
19
 
20
20
 
21
21
  class MarketDataCache:
@@ -26,28 +26,50 @@ class MarketDataCache:
26
26
  self.redis_client = redis_client
27
27
  self.http_session = None
28
28
 
29
- async def get_cache(self, cache_key: str) -> Optional[dict]:
29
+ async def delete(self, cache_key: str):
30
+ """
31
+ Delete cache entry.
32
+
33
+ :arg cache_key: Cache key to delete
34
+ """
35
+ try:
36
+ await self.redis_client.delete(cache_key)
37
+ self.logger.info(f"Deleted cache entry: {cache_key}")
38
+ except Exception as e:
39
+ self.logger.error(f"Error deleting cache entry: {e}")
40
+
41
+ async def read(self, cache_key: str) -> Optional[dict]:
30
42
  """Fetch current value from Redis cache (for snapshot requests)."""
31
43
  value = await self.redis_client.get(cache_key)
32
44
  if value:
33
45
  return json.loads(value)
34
46
  return None
35
47
 
36
- async def cache_data(self, data: Any, cache_key: str, cache_ttl: int = 0):
48
+ async def write(self, data: Any, cache_key: str, cache_ttl: int = 0):
37
49
  if cache_ttl > 0:
38
50
  await self.redis_client.setex(cache_key, cache_ttl, json.dumps(data))
39
51
  else:
40
52
  await self.redis_client.set(cache_key, json.dumps(data))
41
53
  self.logger.info(f"Cached data for {cache_key}")
42
54
 
43
- async def publish_data(self, data: Any, publish_key: str = None):
55
+ async def broadcast(self, data: Any, publish_key: str = None):
44
56
  await self.redis_client.publish(publish_key, json.dumps(data))
45
57
  self.logger.info(f"Published data for {publish_key}")
46
58
 
59
+ async def delete_ticker_snapshot(self, ticker: str):
60
+ """
61
+ Delete ticker snapshot from cache.
62
+
63
+ :param ticker: symbol of ticker to delete snapshot for
64
+ :return: None
65
+ """
66
+ cache_key = f"{MarketDataCacheKeys.TICKER_SNAPSHOTS.value}:{ticker}"
67
+ await self.delete(cache_key=cache_key)
68
+
47
69
  async def get_ticker_snapshot(self, ticker: str) -> TickerSnapshot:
48
70
  self.logger.info(f"Getting snapshot for {ticker}")
49
71
  cache_key = f"{MarketDataCacheKeys.TICKER_SNAPSHOTS.value}:{ticker}"
50
- result = await self.get_cache(cache_key=cache_key)
72
+ result = await self.read(cache_key=cache_key)
51
73
  if result:
52
74
  self.logger.info(f"Returning cached snapshot for {ticker}")
53
75
  snapshot = TickerSnapshot(**result)
@@ -58,7 +80,7 @@ class MarketDataCache:
58
80
  )
59
81
  self.logger.info(f"Snapshot result: {snapshot}")
60
82
  data = ticker_snapshot_to_dict(snapshot)
61
- await self.cache_data(
83
+ await self.write(
62
84
  data=data,
63
85
  cache_key=cache_key,
64
86
  cache_ttl=MarketDataCacheTTL.TICKER_SNAPSHOTS.value
@@ -68,7 +90,7 @@ class MarketDataCache:
68
90
  async def get_avg_volume(self, ticker: str):
69
91
  self.logger.info(f"Getting average volume for {ticker}")
70
92
  cache_key = f"{MarketDataCacheKeys.TICKER_AVG_VOLUME.value}:{ticker}"
71
- avg_volume = await self.get_cache(cache_key=cache_key)
93
+ avg_volume = await self.read(cache_key=cache_key)
72
94
  if avg_volume:
73
95
  self.logger.info(f"Returning cached value for {ticker}: {avg_volume}")
74
96
  return avg_volume
@@ -114,7 +136,7 @@ class MarketDataCache:
114
136
  avg_volume = total_volume / periods_calculated
115
137
 
116
138
  self.logger.info(f"average volume {ticker}: {avg_volume}")
117
- await self.cache_data(
139
+ await self.write(
118
140
  data=avg_volume,
119
141
  cache_key=cache_key,
120
142
  cache_ttl=MarketDataCacheTTL.TICKER_AVG_VOLUME.value
@@ -124,7 +146,7 @@ class MarketDataCache:
124
146
  async def get_free_float(self, ticker: str):
125
147
  self.logger.info(f"Getting free float for {ticker}")
126
148
  cache_key = f"{MarketDataCacheKeys.TICKER_FREE_FLOAT.value}:{ticker}"
127
- free_float = await self.get_cache(cache_key=cache_key)
149
+ free_float = await self.read(cache_key=cache_key)
128
150
  if free_float:
129
151
  self.logger.info(f"Returning cached value for {ticker}: {free_float}")
130
152
  return free_float
@@ -161,7 +183,7 @@ class MarketDataCache:
161
183
  raise
162
184
 
163
185
  self.logger.info(f"free float {ticker}: {free_float}")
164
- await self.cache_data(
186
+ await self.write(
165
187
  data=free_float,
166
188
  cache_key=cache_key,
167
189
  cache_ttl=MarketDataCacheTTL.TICKER_FREE_FLOAT.value
@@ -9,7 +9,7 @@ from redis.exceptions import ConnectionError
9
9
  from massive.rest import RESTClient
10
10
 
11
11
  from kuhl_haus.mdp.analyzers.analyzer import Analyzer
12
- from kuhl_haus.mdp.models.market_data_analyzer_result import MarketDataAnalyzerResult
12
+ from kuhl_haus.mdp.data.market_data_analyzer_result import MarketDataAnalyzerResult
13
13
  from kuhl_haus.mdp.components.market_data_cache import MarketDataCache
14
14
 
15
15
 
@@ -7,8 +7,8 @@ import redis.asyncio as aioredis
7
7
  from aio_pika.abc import AbstractIncomingMessage
8
8
 
9
9
  from kuhl_haus.mdp.analyzers.massive_data_analyzer import MassiveDataAnalyzer
10
- from kuhl_haus.mdp.integ.web_socket_message_serde import WebSocketMessageSerde
11
- from kuhl_haus.mdp.models.market_data_analyzer_result import MarketDataAnalyzerResult
10
+ from kuhl_haus.mdp.helpers.web_socket_message_serde import WebSocketMessageSerde
11
+ from kuhl_haus.mdp.data.market_data_analyzer_result import MarketDataAnalyzerResult
12
12
 
13
13
 
14
14
  class MassiveDataProcessor:
@@ -6,9 +6,9 @@ from aio_pika import DeliveryMode
6
6
  from aio_pika.abc import AbstractConnection, AbstractChannel
7
7
  from massive.websocket.models import WebSocketMessage
8
8
 
9
- from kuhl_haus.mdp.models.massive_data_queue import MassiveDataQueue
9
+ from kuhl_haus.mdp.enum.massive_data_queue import MassiveDataQueue
10
10
  from kuhl_haus.mdp.helpers.queue_name_resolver import QueueNameResolver
11
- from kuhl_haus.mdp.integ.web_socket_message_serde import WebSocketMessageSerde
11
+ from kuhl_haus.mdp.helpers.web_socket_message_serde import WebSocketMessageSerde
12
12
 
13
13
 
14
14
  class MassiveDataQueues:
@@ -1,6 +1,6 @@
1
1
  from enum import Enum
2
2
 
3
- from kuhl_haus.mdp.models.market_data_scanner_names import MarketDataScannerNames
3
+ from kuhl_haus.mdp.enum.market_data_scanner_names import MarketDataScannerNames
4
4
 
5
5
 
6
6
  class MarketDataCacheKeys(Enum):
@@ -1,5 +1,5 @@
1
1
  from enum import Enum
2
- from kuhl_haus.mdp.models.constants import (
2
+ from kuhl_haus.mdp.enum.constants import (
3
3
  EIGHT_HOURS,
4
4
  FIVE_MINUTES,
5
5
  ONE_DAY,
@@ -27,4 +27,3 @@ class MarketDataCacheTTL(Enum):
27
27
  TOP_VOLUME_SCANNER = THREE_DAYS
28
28
  TOP_GAINERS_SCANNER = THREE_DAYS
29
29
  TOP_GAPPERS_SCANNER = THREE_DAYS
30
-
@@ -1,6 +1,6 @@
1
1
  from enum import Enum
2
2
 
3
- from kuhl_haus.mdp.models.market_data_scanner_names import MarketDataScannerNames
3
+ from kuhl_haus.mdp.enum.market_data_scanner_names import MarketDataScannerNames
4
4
 
5
5
 
6
6
  class MarketDataPubSubKeys(Enum):
@@ -6,7 +6,7 @@ from massive.websocket.models import (
6
6
  LimitUpLimitDown,
7
7
  )
8
8
 
9
- from kuhl_haus.mdp.models.massive_data_queue import MassiveDataQueue
9
+ from kuhl_haus.mdp.enum.massive_data_queue import MassiveDataQueue
10
10
 
11
11
 
12
12
  class QueueNameResolver:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kuhl-haus-mdp
3
- Version: 0.1.10
3
+ Version: 0.1.12
4
4
  Summary: Market data processing pipeline for stock market scanner
5
5
  Author-Email: Tom Pounders <git@oldschool.engineer>
6
6
  License: The MIT License (MIT)
@@ -0,0 +1,32 @@
1
+ kuhl_haus/mdp/__init__.py,sha256=5dEpAdB3kypH8tCRECoXwbly1WV9kFU5kh8ldGSa0VI,349
2
+ kuhl_haus/mdp/analyzers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ kuhl_haus/mdp/analyzers/analyzer.py,sha256=StUxVZ-IWwO-ALVbakfGVTor-t03kj4QIRHPB8BvcHU,469
4
+ kuhl_haus/mdp/analyzers/massive_data_analyzer.py,sha256=mLnqMq84oWetqXZUPuIGab4bl45FpElNg3MrcSDBrvw,4987
5
+ kuhl_haus/mdp/analyzers/top_stocks.py,sha256=t38kVWvOUmWIiIXFGwbpgJZ6Ng1ErFzS454mhZ7XGdo,10240
6
+ kuhl_haus/mdp/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ kuhl_haus/mdp/components/market_data_cache.py,sha256=9A126CVr3XGBnkBbIMucHfh4GUp2u8vaq5KQJpmLO_M,8005
8
+ kuhl_haus/mdp/components/market_data_scanner.py,sha256=gFPkXYotftDMZWb1JM53X3xWRaf66tkJgvSJVd3DTjc,9743
9
+ kuhl_haus/mdp/components/massive_data_listener.py,sha256=fPEYc6zZzHzFFjbP3zFInajKtEGInj8UQKKo3nKQEwQ,5098
10
+ kuhl_haus/mdp/components/massive_data_processor.py,sha256=HCHoKqG2toLZFhNMI5tuLUC8fYuVY6SclodGs3QK9E0,8605
11
+ kuhl_haus/mdp/components/massive_data_queues.py,sha256=U3gqwbwVeBR4ZdaLbYd3_Ph5Jmc4FO3L_9S3RRxuo4A,5050
12
+ kuhl_haus/mdp/components/widget_data_service.py,sha256=ikygD9NRpidcXBEqft5Q11rHy_eUOwKGyOLEezo-Dd4,7439
13
+ kuhl_haus/mdp/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ kuhl_haus/mdp/data/market_data_analyzer_result.py,sha256=iICb5GVCtuqARNbR1JNCAfbxMijM3uppDNdL8_FB3eI,422
15
+ kuhl_haus/mdp/data/top_stocks_cache_item.py,sha256=Zn9LociBatP2a1OUfjXDFlWM7tCudO-CR4oj6jYfEEM,7916
16
+ kuhl_haus/mdp/enum/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ kuhl_haus/mdp/enum/constants.py,sha256=t55gVHl3IVDSA5Y-mu7zdA8FXAuw4TbOEkI2r2U__1Y,420
18
+ kuhl_haus/mdp/enum/market_data_cache_keys.py,sha256=ahLmwvDziR9XLvs_WHYb7XCo8Kvhs2X44lCoLtoduG0,1065
19
+ kuhl_haus/mdp/enum/market_data_cache_ttl.py,sha256=vwaawSKJEMGNs-V6C2DKKtoPVPVxs6r2zYNOnyfTFM0,640
20
+ kuhl_haus/mdp/enum/market_data_pubsub_keys.py,sha256=WIhBlBE_8sQw1EET7oguxW56tPMomX8J-xn_kkHAdk0,1304
21
+ kuhl_haus/mdp/enum/market_data_scanner_names.py,sha256=BYn1C0rYgGF1Sq583BkHADKUu-28ytNZQ-XgptuCH-Y,260
22
+ kuhl_haus/mdp/enum/massive_data_queue.py,sha256=MfYBcjVc4Fi61DWIvvhhWLUOiLmRpE9egtW-2KH6FTE,188
23
+ kuhl_haus/mdp/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ kuhl_haus/mdp/helpers/process_manager.py,sha256=Is3Jx8nlBWvywQ1acdsdaSJTAG0olKskpPvrRB4VMDE,9024
25
+ kuhl_haus/mdp/helpers/queue_name_resolver.py,sha256=d4Fr5zE98bIWxvis-bUbvn0r7iscS8GNtNj3X7FTzd0,768
26
+ kuhl_haus/mdp/helpers/utils.py,sha256=2jECmezuDBABcB1Fhe1_GPnlEAFnld2bZ1vSdaCZApg,5203
27
+ kuhl_haus/mdp/helpers/web_socket_message_serde.py,sha256=XdaoaByc7IhtzbPDXBtXKOTjyDzfPSDuZVCoHSIaTl4,5468
28
+ kuhl_haus_mdp-0.1.12.dist-info/METADATA,sha256=amyXFWrdzTkCKBazGas2wZgmSD_A4C9UTB4Q5A2cOcg,8888
29
+ kuhl_haus_mdp-0.1.12.dist-info/WHEEL,sha256=tsUv_t7BDeJeRHaSrczbGeuK-TtDpGsWi_JfpzD255I,90
30
+ kuhl_haus_mdp-0.1.12.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
31
+ kuhl_haus_mdp-0.1.12.dist-info/licenses/LICENSE.txt,sha256=DRkJftAJcMqoTkQ_Y6-HtKj3nm4pZah_p8XBZiYnw-c,1079
32
+ kuhl_haus_mdp-0.1.12.dist-info/RECORD,,
@@ -1,32 +0,0 @@
1
- kuhl_haus/mdp/__init__.py,sha256=5dEpAdB3kypH8tCRECoXwbly1WV9kFU5kh8ldGSa0VI,349
2
- kuhl_haus/mdp/analyzers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- kuhl_haus/mdp/analyzers/analyzer.py,sha256=rIU1lcHwP2IBai0QLt0y-4ySg_ibWsutNU8JUgSxa1U,471
4
- kuhl_haus/mdp/analyzers/massive_data_analyzer.py,sha256=i3XFnornuGGhe6nbk6QqIupND0MYTxwKPjvyFw_UBDU,3863
5
- kuhl_haus/mdp/analyzers/top_stocks.py,sha256=ZZy7legxmLYad-p_a7N6hqj2mN7bn-ZdPEt9xgk4mrQ,10111
6
- kuhl_haus/mdp/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- kuhl_haus/mdp/components/market_data_cache.py,sha256=jhBdR8rJEvby7eXTTvXn_PceMSf_gS71oEZV1bK7HdM,7337
8
- kuhl_haus/mdp/components/market_data_scanner.py,sha256=45MgprFlq03MvmIRYXENsrc7UlTcBE_hIsPyOvNs1zc,9745
9
- kuhl_haus/mdp/components/widget_data_service.py,sha256=ikygD9NRpidcXBEqft5Q11rHy_eUOwKGyOLEezo-Dd4,7439
10
- kuhl_haus/mdp/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- kuhl_haus/mdp/helpers/process_manager.py,sha256=Is3Jx8nlBWvywQ1acdsdaSJTAG0olKskpPvrRB4VMDE,9024
12
- kuhl_haus/mdp/helpers/queue_name_resolver.py,sha256=l_zfRLxrjR9uwRCV2VDO4vPWLK_lj5KVG2p4Lh8xWiw,770
13
- kuhl_haus/mdp/helpers/utils.py,sha256=2jECmezuDBABcB1Fhe1_GPnlEAFnld2bZ1vSdaCZApg,5203
14
- kuhl_haus/mdp/integ/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- kuhl_haus/mdp/integ/massive_data_listener.py,sha256=fPEYc6zZzHzFFjbP3zFInajKtEGInj8UQKKo3nKQEwQ,5098
16
- kuhl_haus/mdp/integ/massive_data_processor.py,sha256=H1WlbGtuSF45n7qLTLleuNlG-OlIXz4llJ7q3XRSS-s,8605
17
- kuhl_haus/mdp/integ/massive_data_queues.py,sha256=zC_uV2vwZCMyVerDQ18RAQwIMMF75iK4qUSqwuWqgwc,5050
18
- kuhl_haus/mdp/integ/web_socket_message_serde.py,sha256=XdaoaByc7IhtzbPDXBtXKOTjyDzfPSDuZVCoHSIaTl4,5468
19
- kuhl_haus/mdp/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
- kuhl_haus/mdp/models/constants.py,sha256=t55gVHl3IVDSA5Y-mu7zdA8FXAuw4TbOEkI2r2U__1Y,420
21
- kuhl_haus/mdp/models/market_data_analyzer_result.py,sha256=iICb5GVCtuqARNbR1JNCAfbxMijM3uppDNdL8_FB3eI,422
22
- kuhl_haus/mdp/models/market_data_cache_keys.py,sha256=_CSPtwvZo5W6cuj9vb7lRTu6MMuRGASe_VigAaOQXwE,1067
23
- kuhl_haus/mdp/models/market_data_cache_ttl.py,sha256=v7tnc7-qaxSIWvpInlxqDDTByHLY2uilCPhnP7UaNR0,643
24
- kuhl_haus/mdp/models/market_data_pubsub_keys.py,sha256=PEIPXK9jBehJB7G4pqoSuQZcfMZgOQq8Yho1itqv-1A,1306
25
- kuhl_haus/mdp/models/market_data_scanner_names.py,sha256=BYn1C0rYgGF1Sq583BkHADKUu-28ytNZQ-XgptuCH-Y,260
26
- kuhl_haus/mdp/models/massive_data_queue.py,sha256=MfYBcjVc4Fi61DWIvvhhWLUOiLmRpE9egtW-2KH6FTE,188
27
- kuhl_haus/mdp/models/top_stocks_cache_item.py,sha256=Zn9LociBatP2a1OUfjXDFlWM7tCudO-CR4oj6jYfEEM,7916
28
- kuhl_haus_mdp-0.1.10.dist-info/METADATA,sha256=Sku0puFIexyTNpzIO8EoUfV8GXQrfw-T6gAREUrqKYs,8888
29
- kuhl_haus_mdp-0.1.10.dist-info/WHEEL,sha256=tsUv_t7BDeJeRHaSrczbGeuK-TtDpGsWi_JfpzD255I,90
30
- kuhl_haus_mdp-0.1.10.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
31
- kuhl_haus_mdp-0.1.10.dist-info/licenses/LICENSE.txt,sha256=DRkJftAJcMqoTkQ_Y6-HtKj3nm4pZah_p8XBZiYnw-c,1079
32
- kuhl_haus_mdp-0.1.10.dist-info/RECORD,,
File without changes
File without changes
File without changes
File without changes
File without changes