kuhl-haus-mdp 0.1.1__py3-none-any.whl → 0.1.2__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.
@@ -5,6 +5,7 @@ from massive.websocket.models import EventType
5
5
 
6
6
  from kuhl_haus.mdp.models.market_data_analyzer_result import MarketDataAnalyzerResult
7
7
  from kuhl_haus.mdp.models.market_data_cache_keys import MarketDataCacheKeys
8
+ from kuhl_haus.mdp.models.market_data_cache_ttl import MarketDataCacheTTL
8
9
 
9
10
 
10
11
  class MassiveDataAnalyzer:
@@ -18,7 +19,7 @@ class MassiveDataAnalyzer:
18
19
  EventType.EquityQuote.value: self.handle_equity_quote_event,
19
20
  }
20
21
 
21
- async def analyze_data(self, data: dict) -> Optional[List[MarketDataAnalyzerResult]]:
22
+ def analyze_data(self, data: dict) -> Optional[List[MarketDataAnalyzerResult]]:
22
23
  """
23
24
  Process raw market data message
24
25
 
@@ -30,73 +31,63 @@ class MassiveDataAnalyzer:
30
31
  """
31
32
  if "event_type" not in data:
32
33
  self.logger.info("Message missing 'event_type'")
33
- return await self.handle_unknown_event(data)
34
+ return self.handle_unknown_event(data)
34
35
  event_type = data.get("event_type")
35
36
 
36
37
  if "symbol" not in data:
37
38
  self.logger.info("Message missing 'symbol'")
38
- return await self.handle_unknown_event(data)
39
+ return self.handle_unknown_event(data)
39
40
  symbol = data.get("symbol")
40
41
 
41
42
  if event_type in self.event_handlers:
42
- return await self.event_handlers[event_type](**{"data": data, "symbol": symbol})
43
+ return self.event_handlers[event_type](**{"data": data, "symbol": symbol})
43
44
  else:
44
45
  self.logger.warning(f"Unsupported message type: {event_type}")
45
- return await self.handle_unknown_event(data)
46
+ return self.handle_unknown_event(data)
46
47
 
47
- async def handle_luld_event(self, data: dict, symbol: str) -> Optional[List[MarketDataAnalyzerResult]]:
48
- try:
49
- return [MarketDataAnalyzerResult(
50
- data=data,
51
- cache_key=f"{MarketDataCacheKeys.HALTS.value}:{symbol}",
52
- cache_ttl=28500, # 7 hours, 55 minutes
53
- publish_key=f"{MarketDataCacheKeys.HALTS.value}:{symbol}",
54
- )]
55
- except Exception as e:
56
- self.logger.error(f"Error processing LULD message for {symbol}: {data}", e)
48
+ @staticmethod
49
+ def handle_luld_event(data: dict, symbol: str) -> Optional[List[MarketDataAnalyzerResult]]:
50
+ return [MarketDataAnalyzerResult(
51
+ data=data,
52
+ cache_key=f"{MarketDataCacheKeys.HALTS.value}:{symbol}",
53
+ cache_ttl=MarketDataCacheTTL.THREE_DAYS.value,
54
+ publish_key=f"{MarketDataCacheKeys.HALTS.value}:{symbol}",
55
+ )]
57
56
 
58
- async def handle_equity_agg_event(self, data: dict, symbol: str) -> Optional[List[MarketDataAnalyzerResult]]:
59
- try:
60
- return [MarketDataAnalyzerResult(
61
- data=data,
62
- # cache_key=f"{MarketDataCacheKeys.AGGREGATE.value}:{symbol}",
63
- # cache_ttl=259200, # 3 days
64
- publish_key=f"{MarketDataCacheKeys.AGGREGATE.value}:{symbol}",
65
- )]
66
- except Exception as e:
67
- self.logger.error(f"Error processing EquityAgg message for {symbol}: {data}", e)
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.THREE_DAYS.value,
63
+ publish_key=f"{MarketDataCacheKeys.AGGREGATE.value}:{symbol}",
64
+ )]
68
65
 
69
- async def handle_equity_trade_event(self, data: dict, symbol: str) -> Optional[List[MarketDataAnalyzerResult]]:
70
- try:
71
- return [MarketDataAnalyzerResult(
72
- data=data,
73
- # cache_key=f"{MarketDataCacheKeys.TRADES.value}:{symbol}",
74
- # cache_ttl=28500, # 7 hours, 55 minutes
75
- publish_key=f"{MarketDataCacheKeys.TRADES.value}:{symbol}",
76
- )]
77
- except Exception as e:
78
- self.logger.error(f"Error processing EquityTrade message for {symbol}: {data}", e)
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.EIGHT_HOURS.value,
72
+ publish_key=f"{MarketDataCacheKeys.TRADES.value}:{symbol}",
73
+ )]
79
74
 
80
- async def handle_equity_quote_event(self, data: dict, symbol: str) -> Optional[List[MarketDataAnalyzerResult]]:
81
- try:
82
- return [MarketDataAnalyzerResult(
83
- data=data,
84
- # cache_key=f"{MarketDataCacheKeys.QUOTES.value}:{symbol}",
85
- # cache_ttl=259200, # 3 days
86
- publish_key=f"{MarketDataCacheKeys.QUOTES.value}:{symbol}",
87
- )]
88
- except Exception as e:
89
- self.logger.error(f"Error processing EquityQuote message for {symbol}: {data}", e)
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.THREE_DAYS.value,
81
+ publish_key=f"{MarketDataCacheKeys.QUOTES.value}:{symbol}",
82
+ )]
90
83
 
91
- async def handle_unknown_event(self, data: dict) -> Optional[List[MarketDataAnalyzerResult]]:
92
- try:
93
- timestamp = f"{time()}".replace('.','')
94
- cache_key = f"{MarketDataCacheKeys.UNKNOWN.value}:{timestamp}"
95
- return [MarketDataAnalyzerResult(
96
- data=data,
97
- cache_key=cache_key,
98
- cache_ttl=86400, # 1 days
99
- publish_key=f"{MarketDataCacheKeys.UNKNOWN.value}",
100
- )]
101
- except Exception as e:
102
- self.logger.error(f"Error processing unknown message type: {data}", e)
84
+ @staticmethod
85
+ def handle_unknown_event(data: dict) -> Optional[List[MarketDataAnalyzerResult]]:
86
+ timestamp = f"{time()}".replace('.','')
87
+ cache_key = f"{MarketDataCacheKeys.UNKNOWN.value}:{timestamp}"
88
+ return [MarketDataAnalyzerResult(
89
+ data=data,
90
+ cache_key=cache_key,
91
+ cache_ttl=MarketDataCacheTTL.ONE_DAY.value,
92
+ publish_key=f"{MarketDataCacheKeys.UNKNOWN.value}",
93
+ )]
@@ -114,8 +114,8 @@ class MassiveDataProcessor:
114
114
  web_socket_message = json.loads(message.body.decode())
115
115
  data = WebSocketMessageSerde.to_dict(web_socket_message)
116
116
 
117
- # Delegate to analyzer (async)
118
- analyzer_results = await self.analyzer.analyze_data(data)
117
+ # Delegate to analyzer
118
+ analyzer_results = self.analyzer.analyze_data(data)
119
119
  if analyzer_results:
120
120
  self.processed += 1
121
121
  for analyzer_result in analyzer_results:
@@ -0,0 +1,19 @@
1
+ from enum import Enum
2
+
3
+
4
+ class MarketDataCacheTTL(Enum):
5
+ # Hours
6
+ ONE_HOUR = 3600
7
+ TWO_HOURS = 7200
8
+ FOUR_HOURS = 14400
9
+ SIX_HOURS = 21600
10
+ EIGHT_HOURS = 28800
11
+
12
+ # Days
13
+ ONE_DAY = 86400
14
+ TWO_DAYS = 172800
15
+ THREE_DAYS = 259200
16
+ FOUR_DAYS = 345600
17
+ FIVE_DAYS = 432000
18
+ SIX_DAYS = 518400
19
+ SEVEN_DAYS = 604800
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kuhl-haus-mdp
3
- Version: 0.1.1
3
+ Version: 0.1.2
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)
@@ -1,7 +1,7 @@
1
1
  kuhl_haus/mdp/__init__.py,sha256=5dEpAdB3kypH8tCRECoXwbly1WV9kFU5kh8ldGSa0VI,349
2
2
  kuhl_haus/mdp/analyzers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  kuhl_haus/mdp/analyzers/analyzer.py,sha256=eluYM2Iib5kgbpNZUSk2qEUL-j83ZTb3zmEmRazrmiM,404
4
- kuhl_haus/mdp/analyzers/massive_data_analyzer.py,sha256=4EEKDJjJmxCdL5nFa87AogabBHgGVld02UuWTgqfFjI,4536
4
+ kuhl_haus/mdp/analyzers/massive_data_analyzer.py,sha256=WSb7T8X4u2ue7Du7sf_fqxjgjEbR6ThllSNT1CncIM0,3866
5
5
  kuhl_haus/mdp/analyzers/top_stocks.py,sha256=AbRnPHSVrJgUq3CDV8SaNstldqoimlI23gpG69lzYBM,18759
6
6
  kuhl_haus/mdp/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  kuhl_haus/mdp/components/market_data_cache.py,sha256=r5sJHuSuLiw9BVckW--aWZHHIMqOTCf-pFURA7kef3Q,1070
@@ -12,18 +12,19 @@ kuhl_haus/mdp/helpers/process_manager.py,sha256=Is3Jx8nlBWvywQ1acdsdaSJTAG0olKsk
12
12
  kuhl_haus/mdp/helpers/queue_name_resolver.py,sha256=l_zfRLxrjR9uwRCV2VDO4vPWLK_lj5KVG2p4Lh8xWiw,770
13
13
  kuhl_haus/mdp/integ/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  kuhl_haus/mdp/integ/massive_data_listener.py,sha256=fPEYc6zZzHzFFjbP3zFInajKtEGInj8UQKKo3nKQEwQ,5098
15
- kuhl_haus/mdp/integ/massive_data_processor.py,sha256=9I0tH9sZNs9Y0TyKIBKix_qlEksEZt5NRfP-Zf3FovE,8708
15
+ kuhl_haus/mdp/integ/massive_data_processor.py,sha256=qktzLfuqrOgE4C9iZs4mXFvHt2BckgevRP8pEakzggA,8694
16
16
  kuhl_haus/mdp/integ/massive_data_queues.py,sha256=zC_uV2vwZCMyVerDQ18RAQwIMMF75iK4qUSqwuWqgwc,5050
17
17
  kuhl_haus/mdp/integ/utils.py,sha256=9JEpl2yr2LghOLrJUDxi-4dtDK3DZ1wBTZ1uxBJsFbQ,1309
18
18
  kuhl_haus/mdp/integ/web_socket_message_serde.py,sha256=XdaoaByc7IhtzbPDXBtXKOTjyDzfPSDuZVCoHSIaTl4,5468
19
19
  kuhl_haus/mdp/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
20
  kuhl_haus/mdp/models/market_data_analyzer_result.py,sha256=iICb5GVCtuqARNbR1JNCAfbxMijM3uppDNdL8_FB3eI,422
21
21
  kuhl_haus/mdp/models/market_data_cache_keys.py,sha256=5iScBMhVQaG3p9P45veE-uRT7c6JY7k6j4DcvSEXENA,942
22
+ kuhl_haus/mdp/models/market_data_cache_ttl.py,sha256=4KvsPeg84-sp4viUX6reN8CZYiM2aF9FgfXQmPbj3hw,348
22
23
  kuhl_haus/mdp/models/market_data_pubsub_keys.py,sha256=PEIPXK9jBehJB7G4pqoSuQZcfMZgOQq8Yho1itqv-1A,1306
23
24
  kuhl_haus/mdp/models/market_data_scanner_names.py,sha256=BYn1C0rYgGF1Sq583BkHADKUu-28ytNZQ-XgptuCH-Y,260
24
25
  kuhl_haus/mdp/models/massive_data_queue.py,sha256=MfYBcjVc4Fi61DWIvvhhWLUOiLmRpE9egtW-2KH6FTE,188
25
- kuhl_haus_mdp-0.1.1.dist-info/METADATA,sha256=Pwfg52rEA4A6MQdJtiUdF4BgL-U2NjSFPDCAYJYdaYE,8688
26
- kuhl_haus_mdp-0.1.1.dist-info/WHEEL,sha256=tsUv_t7BDeJeRHaSrczbGeuK-TtDpGsWi_JfpzD255I,90
27
- kuhl_haus_mdp-0.1.1.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
28
- kuhl_haus_mdp-0.1.1.dist-info/licenses/LICENSE.txt,sha256=DRkJftAJcMqoTkQ_Y6-HtKj3nm4pZah_p8XBZiYnw-c,1079
29
- kuhl_haus_mdp-0.1.1.dist-info/RECORD,,
26
+ kuhl_haus_mdp-0.1.2.dist-info/METADATA,sha256=iOqk7u1RoyY-mBiIDGVI06TSDGulUuHo0GF9G6JYcdQ,8688
27
+ kuhl_haus_mdp-0.1.2.dist-info/WHEEL,sha256=tsUv_t7BDeJeRHaSrczbGeuK-TtDpGsWi_JfpzD255I,90
28
+ kuhl_haus_mdp-0.1.2.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
29
+ kuhl_haus_mdp-0.1.2.dist-info/licenses/LICENSE.txt,sha256=DRkJftAJcMqoTkQ_Y6-HtKj3nm4pZah_p8XBZiYnw-c,1079
30
+ kuhl_haus_mdp-0.1.2.dist-info/RECORD,,