zenx 0.9.2__tar.gz → 0.9.4__tar.gz

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 (32) hide show
  1. {zenx-0.9.2 → zenx-0.9.4}/PKG-INFO +6 -3
  2. {zenx-0.9.2 → zenx-0.9.4}/pyproject.toml +15 -6
  3. zenx-0.9.4/zenx/pipelines/discord.py +65 -0
  4. {zenx-0.9.2 → zenx-0.9.4}/zenx/settings.py +2 -0
  5. {zenx-0.9.2 → zenx-0.9.4}/zenx/spiders/base.py +1 -1
  6. {zenx-0.9.2 → zenx-0.9.4}/zenx.egg-info/PKG-INFO +6 -3
  7. {zenx-0.9.2 → zenx-0.9.4}/zenx.egg-info/SOURCES.txt +1 -0
  8. {zenx-0.9.2 → zenx-0.9.4}/zenx.egg-info/requires.txt +4 -0
  9. {zenx-0.9.2 → zenx-0.9.4}/setup.cfg +0 -0
  10. {zenx-0.9.2 → zenx-0.9.4}/zenx/cli.py +0 -0
  11. {zenx-0.9.2 → zenx-0.9.4}/zenx/clients/__init__.py +0 -0
  12. {zenx-0.9.2 → zenx-0.9.4}/zenx/clients/database.py +0 -0
  13. {zenx-0.9.2 → zenx-0.9.4}/zenx/clients/http.py +0 -0
  14. {zenx-0.9.2 → zenx-0.9.4}/zenx/debug_runner.py +0 -0
  15. {zenx-0.9.2 → zenx-0.9.4}/zenx/discovery.py +0 -0
  16. {zenx-0.9.2 → zenx-0.9.4}/zenx/engine.py +0 -0
  17. {zenx-0.9.2 → zenx-0.9.4}/zenx/exceptions.py +0 -0
  18. {zenx-0.9.2 → zenx-0.9.4}/zenx/logger.py +0 -0
  19. {zenx-0.9.2 → zenx-0.9.4}/zenx/pipelines/__init__.py +0 -0
  20. {zenx-0.9.2 → zenx-0.9.4}/zenx/pipelines/base.py +0 -0
  21. {zenx-0.9.2 → zenx-0.9.4}/zenx/pipelines/google_rpc.py +0 -0
  22. {zenx-0.9.2 → zenx-0.9.4}/zenx/pipelines/manager.py +0 -0
  23. {zenx-0.9.2 → zenx-0.9.4}/zenx/pipelines/preprocess.py +0 -0
  24. {zenx-0.9.2 → zenx-0.9.4}/zenx/pipelines/websocket.py +0 -0
  25. {zenx-0.9.2 → zenx-0.9.4}/zenx/resources/proto/__init__.py +0 -0
  26. {zenx-0.9.2 → zenx-0.9.4}/zenx/resources/proto/feed_pb2.py +0 -0
  27. {zenx-0.9.2 → zenx-0.9.4}/zenx/resources/proto/feed_pb2_grpc.py +0 -0
  28. {zenx-0.9.2 → zenx-0.9.4}/zenx/spiders/__init__.py +0 -0
  29. {zenx-0.9.2 → zenx-0.9.4}/zenx/utils.py +0 -0
  30. {zenx-0.9.2 → zenx-0.9.4}/zenx.egg-info/dependency_links.txt +0 -0
  31. {zenx-0.9.2 → zenx-0.9.4}/zenx.egg-info/entry_points.txt +0 -0
  32. {zenx-0.9.2 → zenx-0.9.4}/zenx.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: zenx
3
- Version: 0.9.2
3
+ Version: 0.9.4
4
4
  Summary: mini-framework
5
5
  Requires-Python: >=3.12
6
6
  Requires-Dist: curl-cffi>=0.12.0
@@ -17,6 +17,10 @@ Requires-Dist: redis[hiredis]>=6.2.0; extra == "redis"
17
17
  Provides-Extra: grpc
18
18
  Requires-Dist: grpcio>=1.73.1; extra == "grpc"
19
19
  Requires-Dist: protobuf>=6.31.1; extra == "grpc"
20
+ Provides-Extra: websocket
21
+ Requires-Dist: websockets>=15.0.1; extra == "websocket"
22
+ Provides-Extra: discord
23
+ Requires-Dist: httpx>=0.28.1; extra == "discord"
20
24
  Provides-Extra: all
21
25
  Requires-Dist: curl-cffi>=0.12.0; extra == "all"
22
26
  Requires-Dist: grpcio>=1.73.1; extra == "all"
@@ -30,5 +34,4 @@ Requires-Dist: typer>=0.16.0; extra == "all"
30
34
  Requires-Dist: uvloop>=0.21.0; extra == "all"
31
35
  Requires-Dist: redis[hiredis]>=6.2.0; extra == "all"
32
36
  Requires-Dist: websockets>=15.0.1; extra == "all"
33
- Provides-Extra: websocket
34
- Requires-Dist: websockets>=15.0.1; extra == "websocket"
37
+ Requires-Dist: httpx>=0.28.1; extra == "all"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "zenx"
3
- version = "0.9.2"
3
+ version = "0.9.4"
4
4
  description = "mini-framework"
5
5
  requires-python = ">=3.12"
6
6
  dependencies = [
@@ -19,8 +19,19 @@ dependencies = [
19
19
  zenx = "zenx.cli:app"
20
20
 
21
21
  [project.optional-dependencies]
22
- redis = ["redis[hiredis]>=6.2.0"]
23
- grpc = ["grpcio>=1.73.1","protobuf>=6.31.1"]
22
+ redis = [
23
+ "redis[hiredis]>=6.2.0"
24
+ ]
25
+ grpc = [
26
+ "grpcio>=1.73.1",
27
+ "protobuf>=6.31.1"
28
+ ]
29
+ websocket = [
30
+ "websockets>=15.0.1",
31
+ ]
32
+ discord = [
33
+ "httpx>=0.28.1",
34
+ ]
24
35
  all = [
25
36
  "curl-cffi>=0.12.0",
26
37
  "grpcio>=1.73.1",
@@ -34,7 +45,5 @@ all = [
34
45
  "uvloop>=0.21.0",
35
46
  "redis[hiredis]>=6.2.0",
36
47
  "websockets>=15.0.1",
37
- ]
38
- websocket = [
39
- "websockets>=15.0.1",
48
+ "httpx>=0.28.1",
40
49
  ]
@@ -0,0 +1,65 @@
1
+ from typing import Dict
2
+ from structlog import BoundLogger
3
+
4
+ from zenx.pipelines.base import Pipeline
5
+ from zenx.clients.database import DBClient
6
+ from zenx.settings import Settings
7
+ from zenx.utils import log_processing_time
8
+
9
+
10
+ try:
11
+ from httpx import AsyncClient
12
+
13
+ class SynopticDiscordPipeline(Pipeline): # type: ignore[reportRedeclaration]
14
+ name = "syncoptic_discord"
15
+ required_settings = ["SYNOPTIC_DISCORD_WEBHOOK"]
16
+
17
+
18
+ def __init__(self, logger: BoundLogger, db: DBClient, settings: Settings) -> None:
19
+ super().__init__(logger, db, settings)
20
+ self._uri = settings.SYNOPTIC_DISCORD_WEBHOOK
21
+ self._client = AsyncClient(headers={"Content-Type": "application/json"})
22
+
23
+
24
+ async def start(self) -> None:
25
+ for setting in self.required_settings:
26
+ if not getattr(self.settings, setting):
27
+ raise ValueError(f"Missing required setting: {setting}")
28
+
29
+
30
+ @log_processing_time
31
+ async def process_item(self, item: Dict, spider: str) -> Dict:
32
+ await self._process(item)
33
+ return item
34
+
35
+
36
+ async def _process(self, item: Dict) -> None:
37
+ try:
38
+ _item = {k: v for k, v in item.items() if not k.startswith("_")}
39
+ await self._client.post(self._uri, json=_item)
40
+ except Exception as e:
41
+ self.logger.error("processing", exception=str(e), id=item.get("_id"), pipeline=self.name)
42
+
43
+
44
+ async def close(self) -> None:
45
+ if hasattr(self, "_client") and self._client:
46
+ await self._client.aclose()
47
+ except ModuleNotFoundError:
48
+ # proxy pattern
49
+ class SynopticDiscordPipeline(Pipeline):
50
+ name = "synoptic_discord"
51
+ required_settings = []
52
+
53
+ _ERROR_MESSAGE = (
54
+ f"The '{name}' pipeline is disabled because the required dependencies are not installed. "
55
+ "Please install it to enable this feature:\n\n"
56
+ " pip install 'zenx[discord]'"
57
+ )
58
+
59
+ def __init__(self, *args, **kwargs):
60
+ super().__init__(*args, **kwargs)
61
+ raise ImportError(self._ERROR_MESSAGE)
62
+
63
+ async def start(self) -> None: pass
64
+ async def process_item(self, item: Dict, spider: str) -> Dict: return {}
65
+ async def close(self) -> None: pass
@@ -26,6 +26,8 @@ class Settings(BaseSettings):
26
26
  GRPC_ID: str | None = None
27
27
  GRPC_ID_HEADLINE: str | None = None
28
28
 
29
+ SYNOPTIC_DISCORD_WEBHOOK: str | None = None
30
+
29
31
  SYNOPTIC_API_KEY: str | None = None
30
32
  SYNOPTIC_STREAM_ID: str | None = None
31
33
 
@@ -14,7 +14,7 @@ class Spider(ABC):
14
14
  # central registry
15
15
  name: ClassVar[str]
16
16
  _registry: ClassVar[Dict[str, Type[Spider]]] = {}
17
- pipelines: ClassVar[List[Literal["preprocess","synoptic_websocket","synoptic_grpc"]]]
17
+ pipelines: ClassVar[List[Literal["preprocess","synoptic_websocket","synoptic_grpc","synoptic_discord"]]]
18
18
  client_name: ClassVar[Literal["curl_cffi"]] = "curl_cffi"
19
19
 
20
20
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: zenx
3
- Version: 0.9.2
3
+ Version: 0.9.4
4
4
  Summary: mini-framework
5
5
  Requires-Python: >=3.12
6
6
  Requires-Dist: curl-cffi>=0.12.0
@@ -17,6 +17,10 @@ Requires-Dist: redis[hiredis]>=6.2.0; extra == "redis"
17
17
  Provides-Extra: grpc
18
18
  Requires-Dist: grpcio>=1.73.1; extra == "grpc"
19
19
  Requires-Dist: protobuf>=6.31.1; extra == "grpc"
20
+ Provides-Extra: websocket
21
+ Requires-Dist: websockets>=15.0.1; extra == "websocket"
22
+ Provides-Extra: discord
23
+ Requires-Dist: httpx>=0.28.1; extra == "discord"
20
24
  Provides-Extra: all
21
25
  Requires-Dist: curl-cffi>=0.12.0; extra == "all"
22
26
  Requires-Dist: grpcio>=1.73.1; extra == "all"
@@ -30,5 +34,4 @@ Requires-Dist: typer>=0.16.0; extra == "all"
30
34
  Requires-Dist: uvloop>=0.21.0; extra == "all"
31
35
  Requires-Dist: redis[hiredis]>=6.2.0; extra == "all"
32
36
  Requires-Dist: websockets>=15.0.1; extra == "all"
33
- Provides-Extra: websocket
34
- Requires-Dist: websockets>=15.0.1; extra == "websocket"
37
+ Requires-Dist: httpx>=0.28.1; extra == "all"
@@ -18,6 +18,7 @@ zenx/clients/database.py
18
18
  zenx/clients/http.py
19
19
  zenx/pipelines/__init__.py
20
20
  zenx/pipelines/base.py
21
+ zenx/pipelines/discord.py
21
22
  zenx/pipelines/google_rpc.py
22
23
  zenx/pipelines/manager.py
23
24
  zenx/pipelines/preprocess.py
@@ -21,6 +21,10 @@ typer>=0.16.0
21
21
  uvloop>=0.21.0
22
22
  redis[hiredis]>=6.2.0
23
23
  websockets>=15.0.1
24
+ httpx>=0.28.1
25
+
26
+ [discord]
27
+ httpx>=0.28.1
24
28
 
25
29
  [grpc]
26
30
  grpcio>=1.73.1
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes