Skip to content

Commit ee3a0bd

Browse files
committed
feat: modify the schema by using item. Remove the function is_item. Not needed anymore. Payload has changed.
1 parent 0db8e77 commit ee3a0bd

File tree

8 files changed

+45
-64
lines changed

8 files changed

+45
-64
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from typing import Any
2+
3+
EVENT_TYPE = 'event'
4+
5+
6+
def is_event(message: Any) -> bool:
7+
# Check if this is the new format message
8+
if isinstance(message, dict) and message.get('type') == EVENT_TYPE:
9+
payload = message.get('payload')
10+
return isinstance(payload, dict) and isinstance(payload.get('hash'), str)
11+
12+
# Otherwise check for old format (just for backward compatibility)
13+
if not isinstance(message, dict):
14+
return False
15+
16+
payload = message.get('payload')
17+
return (
18+
isinstance(payload, dict)
19+
and isinstance(payload.get('event'), dict)
20+
and isinstance(payload.get('hash'), str)
21+
)

eventsourcingdb_client_python/handlers/is_item.py

Lines changed: 0 additions & 16 deletions
This file was deleted.

eventsourcingdb_client_python/handlers/observe_events/observe_events.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from http import HTTPStatus
44

55
from ..is_heartbeat import is_heartbeat
6-
from ..is_item import is_item
6+
from ..is_event import is_event
77
from ..is_stream_error import is_stream_error
88
from ..parse_raw_message import parse_raw_message
99
from ...abstract_base_client import AbstractBaseClient
@@ -73,8 +73,8 @@ async def observe_events(
7373
if is_stream_error(message):
7474
raise ServerError(f'{message["payload"]["error"]}.')
7575

76-
if is_item(message):
77-
event = Event.parse(message['payload']['event'])
76+
if is_event(message):
77+
event = Event.parse(message['payload'])
7878

7979
yield StoreItem(event, message['payload']['hash'])
8080
continue

eventsourcingdb_client_python/handlers/read_events/read_events.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from ...event.event import Event
1212
from ...event.validate_subject import validate_subject
1313
from ...http_client.response import Response
14-
from ..is_item import is_item
14+
from ..is_event import is_event
1515
from ..is_stream_error import is_stream_error
1616
from ..parse_raw_message import parse_raw_message
1717
from ..store_item import StoreItem
@@ -69,10 +69,10 @@ async def read_events(
6969
if is_stream_error(message):
7070
raise ServerError(f'{message["payload"]["error"]}.')
7171

72-
if is_item(message):
72+
if is_event(message):
7373
event = Event.parse(message['payload']['event'])
7474

75-
yield StoreItem(event, message['payload']['hash'])
75+
yield StoreItem(event, message['payload']['hash']) # type: ignore
7676
continue
7777

7878
raise ServerError(

tests/shared/docker/container.py

Lines changed: 15 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
from dataclasses import dataclass
22
import subprocess
3-
import json
4-
import time
53

64
from .docker_command_failed_error import DockerCommandFailedError
5+
from ..util.remove_whitespace import remove_whitespace
76

87

98
@dataclass
@@ -21,11 +20,14 @@ def kill(self) -> None:
2120
raise DockerCommandFailedError(
2221
f'Kill failed with output: {stderr}')
2322

24-
def get_exposed_port(self, internal_port: int = 3_000) -> int:
23+
def get_exposed_port(self, internal_port: int) -> int:
2524
docker_command = [
2625
'docker',
2726
'inspect',
28-
'--format={{json .NetworkSettings.Ports}}',
27+
# this is a string that cannot be break apart in a useful way
28+
# pylint: disable=line-too-long
29+
f'--format=\'{{{{(index (index .NetworkSettings.Ports "{internal_port}/tcp") 0).HostPort}}}}\'',
30+
# pylint: enable=line-too-long
2931
self.id
3032
]
3133

@@ -39,38 +41,14 @@ def get_exposed_port(self, internal_port: int = 3_000) -> int:
3941
if process.returncode != 0:
4042
raise DockerCommandFailedError(
4143
f'Inspect failed with output: {stderr.decode("utf-8")}')
42-
# Parse the JSON output to get the port mapping
43-
try:
44-
port_mappings = json.loads(stdout.decode('utf-8').strip())
45-
except json.JSONDecodeError as e:
46-
raise DockerCommandFailedError(
47-
f'Failed to decode JSON: {stdout.decode("utf-8")}. Error: {str(e)}') from e
48-
49-
port_key = f"{internal_port}/tcp"
50-
if port_key not in port_mappings or not port_mappings[port_key]:
51-
# Wait briefly and try to restart/refresh the container
52-
time.sleep(1)
53-
self.restart()
54-
time.sleep(2) # Wait for container to be ready
55-
# Try one more time after restart
56-
return self.get_exposed_port(internal_port)
5744

58-
try:
59-
return int(port_mappings[port_key][0]['HostPort'])
60-
except (KeyError, IndexError, TypeError) as e:
61-
raise DockerCommandFailedError(
62-
f'Failed to parse port mapping: {stdout.decode("utf-8")}. '
63-
f'Error: {str(e)}'
64-
) from e
45+
exposed_port_as_string = remove_whitespace(
46+
stdout.decode('utf-8')
47+
).replace('\'', '').replace('|', '')
6548

66-
def restart(self):
67-
"""Restart the container"""
68-
docker_command = ['docker', 'restart', self.id]
69-
with subprocess.Popen(
70-
docker_command,
71-
stdout=subprocess.PIPE,
72-
stderr=subprocess.PIPE
73-
) as process:
74-
process.communicate()
75-
if process.returncode != 0:
76-
raise DockerCommandFailedError('Failed to restart container')
49+
try:
50+
return int(exposed_port_as_string)
51+
except ValueError as value_error:
52+
raise ValueError(
53+
f'Could not parse port from: {exposed_port_as_string}'
54+
) from value_error
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
FROM ghcr.io/thenativeweb/eventsourcingdb:0.81.2
1+
FROM thenativeweb/eventsourcingdb:0.103.1

tests/shared/docker/image.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ def run(self, command: list[str], is_detached: bool, do_expose_ports: bool) -> C
1717
docker_command.append('-d')
1818

1919
if do_expose_ports:
20-
# Expose the default HTTP port (3000)
21-
docker_command.extend(['-p', '3000'])
2220
docker_command.append('-P')
2321

2422
docker_command.append(self.__get_full_name())
@@ -51,4 +49,4 @@ def build(self, directory: str) -> None:
5149
f'Build failed with output: {stderr.decode("utf-8")}')
5250

5351
def __get_full_name(self) -> str:
54-
return f'{self.name}:{self.tag}'
52+
return f'{self.name}:{self.tag}'

tests/test_observe_events.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ async def test_supports_authorization(
5858

5959
total_store_items_count = 4
6060
if observed_items_count == total_store_items_count:
61-
break
61+
break
6262

6363
@staticmethod
6464
@pytest.mark.asyncio

0 commit comments

Comments
 (0)