22from types import TracebackType
33from typing import Optional , Type , TypeVar , AsyncIterator
44
5+ from eventsourcingdb .abstract_base_client import AbstractBaseClient
6+
57from .client_configuration import ClientConfiguration
8+ from .event .event import Event
69from .event .event_candidate import EventCandidate
710from .event .event_context import EventContext
811from .handlers .observe_events .observe_events import observe_events
1417from .handlers .ping import ping
1518from .handlers .read_events import read_events , ReadEventsOptions
1619from .handlers .read_subjects import read_subjects
17- from .handlers .store_item import StoreItem
1820from .handlers .write_events import Precondition , write_events
1921
2022
2123T = TypeVar ('T' )
2224
23- class Client :
25+ class Client ( AbstractBaseClient ) :
2426 def __init__ (
2527 self ,
2628 base_url : str ,
@@ -29,7 +31,7 @@ def __init__(
2931 self .__http_client = HttpClient (base_url = base_url , api_token = api_token )
3032
3133 async def __aenter__ (self ):
32- await self .__http_client .initialize ()
34+ await self .__http_client .__aenter__ ()
3335 return self
3436
3537 async def __aexit__ (
@@ -38,29 +40,28 @@ async def __aexit__(
3840 exc_val : Optional [BaseException ],
3941 exc_tb : Optional [TracebackType ]
4042 ) -> None :
41- await self .__http_client .close ( )
43+ await self .__http_client .__aexit__ ( exc_tb = exc_tb , exc_val = exc_val , exc_type = exc_type )
4244
43- # Keeping these for backward compatibility and explicit resource management
44- """async def initialize(self) -> None:
45+ async def initialize (self ) -> None :
4546 await self .__http_client .initialize ()
4647
4748 async def close (self ) -> None :
48- await self.__http_client.close() # TODO: should we mix object orientation and functional programming?
49- """
50- def http_client (self ) -> # TODO: should we mix object orientation and functional programming?tpClient:
49+ await self .__http_client .close ()
50+
51+ @property
52+ def http_client (self ) -> HttpClient :
5153 return self .__http_client
5254
53- # TODO: should we mix object orientation and functional programming?
5455 async def ping (self ) -> None :
55- return await ping (client = self )
56+ return await ping (self )
5657
5758 async def verify_api_token (self ) -> None :
58- ...
59+ raise NotImplementedError ( "verify_api_token is not implemented yet." )
5960
6061 async def write_events (
6162 self ,
6263 event_candidates : list [EventCandidate ],
63- preconditions : list [Precondition ] = None
64+ preconditions : list [Precondition ] = None # type: ignore
6465 ) -> list [EventContext ]: # TODO: list[Event] of Events (complete)
6566 if preconditions is None :
6667 preconditions = []
@@ -70,30 +71,7 @@ async def read_events(
7071 self ,
7172 subject : str ,
7273 options : ReadEventsOptions
73- ) -> AsyncGenerator [StoreItem , None ]: # no StoreItem ... it is a Event
74- #TODO: This is a code snippet for abort read events.
75- """
76- https://github.com/thenativeweb/eventsourcingdb-client-javascript/blob/main/src/Client.ts#L134-L152
77- for await (const event of client.readEvents('/', { recursive: true })) {
78- console.log(event);
79-
80- if (event.ID === '100') {
81- break;
82- }
83- }
84-
85-
86- function handlePostRequest(abortController) {
87- const signal = abortController.signal;
88-
89- for await (const event of client.readEvents('/', { recursive: true }), signal) {
90- console.log(event);
91- }
92-
93- return http.status(200);
94- }
95- """
96- """Read events with proper cancellation support."""
74+ ) -> AsyncGenerator [Event , None ]:
9775 generator = read_events (self , subject , options )
9876 try :
9977 async for item in generator :
@@ -105,20 +83,13 @@ async def run_eventql_query(self, query: str) -> AsyncGenerator[Event, None]:
10583 """
10684 the issue like read_events. can be abort or canceled.
10785 """
86+ raise NotImplementedError ("run_eventql_query is not implemented yet." )
10887
10988 async def observe_events (
11089 self ,
11190 subject : str ,
11291 options : ObserveEventsOptions
113- ) -> AsyncGenerator [StoreItem , None ]: # no StoreItem ... it is a Event
114- """
115- TODO: the same issue like read_events. contextmanager
116- """
117- async def observe_events (
118- self ,
119- subject : str ,
120- options : ObserveEventsOptions
121- ) -> AsyncGenerator [StoreItem , None ]:
92+ ) -> AsyncGenerator [Event , None ]:
12293 generator = observe_events (self , subject , options )
12394 try :
12495 async for item in generator :
@@ -149,32 +120,4 @@ async def read_event_types(self) -> AsyncGenerator[EventType, None]:
149120 async for item in generator :
150121 yield item
151122 finally :
152- await generator .aclose ()
153-
154-
155-
156- """ TODO:
157-
158- f (response.status !== 200) {
159- throw new Error(
160- `Failed to read event types, got HTTP status code '${response.status}', expected '200'.`,
161- );
162- }
163-
164- """
165-
166- """
167-
168- A: Ausdüngen und Exception
169-
170- B: Contextmanager
171-
172- C: Neue Methoden
173-
174- D: Testcontainer: testcontainers.com Python "virtuelle Container für tests"
175- - EventSourcingDB(DockerContainer):
176- def __init__(self):
177- https://github.com/thenativeweb/eventsourcingdb-client-javascript/blob/main/src/EventSourcingDbContainer.ts
178- """
179-
180- Dokumentationslink für Featurecheck : https :// docs .eventsourcingdb .io / client - sdks / compliance - criteria / #detailed-requirements
123+ await generator .aclose ()
0 commit comments