22# Copyright © 2024 Frequenz Energy-as-a-Service GmbH
33
44"""Dispatch API client for Python."""
5+ from __future__ import annotations
6+
57from datetime import datetime , timedelta
68from importlib .resources import files
79from pathlib import Path
3335from frequenz .client .base .channel import ChannelOptions , SslOptions
3436from frequenz .client .base .client import BaseApiClient
3537from frequenz .client .base .conversion import to_timestamp
38+ from frequenz .client .base .exception import ClientNotConnected
3639from frequenz .client .base .retry import LinearBackoff
3740from frequenz .client .base .streaming import GrpcStreamBroadcaster
3841
4952DEFAULT_DISPATCH_PORT = 50051
5053
5154
52- class Client (BaseApiClient [ dispatch_pb2_grpc . MicrogridDispatchServiceStub ] ):
55+ class Client (BaseApiClient ):
5356 """Dispatch API client."""
5457
5558 streams : dict [
@@ -73,7 +76,6 @@ def __init__(
7376 """
7477 super ().__init__ (
7578 server_url ,
76- dispatch_pb2_grpc .MicrogridDispatchServiceStub ,
7779 connect = connect ,
7880 channel_defaults = ChannelOptions (
7981 port = DEFAULT_DISPATCH_PORT ,
@@ -88,6 +90,20 @@ def __init__(
8890 ),
8991 )
9092 self ._metadata = (("key" , key ),)
93+ self ._setup_stub ()
94+
95+ def _setup_stub (self ) -> None :
96+ self ._stub = cast (
97+ dispatch_pb2_grpc .MicrogridDispatchServiceAsyncStub ,
98+ dispatch_pb2_grpc .MicrogridDispatchServiceStub (self .channel ),
99+ )
100+
101+ @property
102+ def stub (self ) -> dispatch_pb2_grpc .MicrogridDispatchServiceAsyncStub :
103+ """The stub for the service."""
104+ if self ._channel is None :
105+ raise ClientNotConnected (server_url = self .server_url , operation = "stub" )
106+ return self ._stub
91107
92108 # pylint: disable=too-many-arguments, too-many-locals
93109 async def list (
0 commit comments