Skip to content
Merged

Dev #103

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
563 changes: 563 additions & 0 deletions benchmarks/benchmark_use_data_send.py

Large diffs are not rendered by default.

420 changes: 420 additions & 0 deletions benchmarks/benchmark_when_data_send.py

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ pytest~=9.0.3
asyncio==3.4.3
aioconsole==0.8.1
maturin==1.8.3
python-dotenv~=1.2.2
python-dotenv~=1.2.1
typing_extensions==4.15.0
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
python_requires=">=3.9",
install_requires=[
"aioconsole==0.8.1",
"python-dotenv~=1.2.2",
"python-dotenv~=1.2.1",
"typing_extensions==4.15.0; python_version < '3.13'",
],
extras_require={
Expand Down
2 changes: 1 addition & 1 deletion summoner/_version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "1.2.0"
__version__ = "1.3.0"
225 changes: 208 additions & 17 deletions summoner/client/client.py

Large diffs are not rendered by default.

74 changes: 69 additions & 5 deletions summoner/client/merger.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ def _resolve_callable_reference_from_source(
try:
if "__builtins__" not in globals_dict:
globals_dict["__builtins__"] = __builtins__
exec(compile(textwrap.dedent(source), filename="<summoner_run_while>", mode="exec"), globals_dict)
exec(compile(textwrap.dedent(source), filename="<summoner_callable>", mode="exec"), globals_dict)
except Exception:
return None

Expand All @@ -233,16 +233,19 @@ def _resolve_callable_reference_from_source(
return None


def _resolve_run_while_spec(
def _resolve_callable_spec(
globals_dict: dict[str, Any],
kind: str,
value: Any,
name: Optional[str],
source: Optional[str] = None,
*,
spec_name: str,
allow_bool: bool = False,
) -> Any:
if kind == "none":
return None
if kind == "bool":
if allow_bool and kind == "bool":
return bool(value)
if kind == "callable":
resolved = _resolve_callable_reference(globals_dict, name)
Expand All @@ -251,10 +254,45 @@ def _resolve_run_while_spec(
if callable(resolved):
return resolved
raise ValueError(
"Could not resolve serialized run_while callable "
f"Could not resolve serialized {spec_name} callable "
f"{name!r} from available replay context"
)
raise ValueError(f"Unknown run_while kind {kind!r}")
raise ValueError(f"Unknown {spec_name} kind {kind!r}")


def _resolve_run_while_spec(
globals_dict: dict[str, Any],
kind: str,
value: Any,
name: Optional[str],
source: Optional[str] = None,
) -> Any:
return _resolve_callable_spec(
globals_dict,
kind,
value,
name,
source,
spec_name="run_while",
allow_bool=True,
)


def _resolve_when_data_spec(
globals_dict: dict[str, Any],
kind: str,
value: Any,
name: Optional[str],
source: Optional[str] = None,
) -> Any:
return _resolve_callable_spec(
globals_dict,
kind,
value,
name,
source,
spec_name="when_data",
)


class ClientMerger(SummonerClient):
Expand Down Expand Up @@ -930,6 +968,15 @@ def initiate_senders(self):
dna.get("run_while_name", None),
dna.get("run_while_source", None),
)
when_data = dna.get("when_data")
if when_data is None:
when_data = _resolve_when_data_spec(
fn_clone.__globals__,
dna.get("when_data_kind", "none"),
dna.get("when_data_value", None),
dna.get("when_data_name", None),
dna.get("when_data_source", None),
)
self.send(
route,
multi=dna.get("multi", False),
Expand All @@ -939,6 +986,7 @@ def initiate_senders(self):
data_mode=dna.get("data_mode", None),
every=dna.get("every", None),
run_while=run_while,
when_data=when_data,
)(fn_clone)
except Exception as e:
self.logger.warning(
Expand Down Expand Up @@ -971,6 +1019,13 @@ def initiate_senders(self):
entry.get("run_while_name", None),
entry.get("run_while_source", None),
)
when_data = _resolve_when_data_spec(
g,
entry.get("when_data_kind", "none"),
entry.get("when_data_value", None),
entry.get("when_data_name", None),
entry.get("when_data_source", None),
)
dec = self.send(
route,
multi=entry.get("multi", False),
Expand All @@ -980,6 +1035,7 @@ def initiate_senders(self):
data_mode=entry.get("data_mode", None),
every=entry.get("every", None),
run_while=run_while,
when_data=when_data,
)
self._apply_with_source_patch(dec, fn, entry["source"])

Expand Down Expand Up @@ -1341,6 +1397,13 @@ def initiate_senders(self):
entry.get("run_while_name", None),
entry.get("run_while_source", None),
)
when_data = _resolve_when_data_spec(
g,
entry.get("when_data_kind", "none"),
entry.get("when_data_value", None),
entry.get("when_data_name", None),
entry.get("when_data_source", None),
)
dec = self.send(
route,
multi=entry.get("multi", False),
Expand All @@ -1350,6 +1413,7 @@ def initiate_senders(self):
data_mode=entry.get("data_mode", None),
every=entry.get("every", None),
run_while=run_while,
when_data=when_data,
)
self._apply_with_source_patch(dec, fn, entry["source"])

Expand Down
3 changes: 2 additions & 1 deletion summoner/protocol/payload.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,8 @@ def cast_v0_0_1(val: Any, expected: Any) -> Any:
register_envelope_version("1.0.1", parse_v0_0_1, cast_v0_0_1)
register_envelope_version("1.1.0", parse_v0_0_1, cast_v0_0_1)
register_envelope_version("1.1.1", parse_v0_0_1, cast_v0_0_1)
# register_envelope_version("1.2.0", parse_v0_0_1, cast_v0_0_1)
register_envelope_version("1.2.0", parse_v0_0_1, cast_v0_0_1)
# register_envelope_version("1.3.0", parse_v0_0_1, cast_v0_0_1)
register_envelope_version(core_version, parse_v0_0_1, cast_v0_0_1)


Expand Down
4 changes: 4 additions & 0 deletions summoner/protocol/process.py
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,7 @@ class Sender:
'triggers',
'use_data',
'data_mode',
'when_data',
'every',
'run_while',
'registration_id',
Expand All @@ -323,6 +324,7 @@ class Sender:
triggers: Optional[set[Signal]]
use_data: bool
data_mode: Optional[str]
when_data: Any
every: Optional[float]
run_while: Any
registration_id: Optional[str]
Expand All @@ -335,6 +337,7 @@ def __init__(
triggers: Optional[set[Signal]],
use_data: bool = False,
data_mode: Optional[str] = None,
when_data: Any = None,
every: Optional[float] = None,
run_while: Any = None,
registration_id: Optional[str] = None,
Expand All @@ -345,6 +348,7 @@ def __init__(
object.__setattr__(self, "triggers", triggers)
object.__setattr__(self, "use_data", use_data)
object.__setattr__(self, "data_mode", data_mode)
object.__setattr__(self, "when_data", when_data)
object.__setattr__(self, "every", every)
object.__setattr__(self, "run_while", run_while)
object.__setattr__(self, "registration_id", registration_id)
Expand Down
4 changes: 3 additions & 1 deletion summoner/protocol/triggers.py
Original file line number Diff line number Diff line change
Expand Up @@ -222,10 +222,12 @@ def name_of(*args):


class Event:
__slots__ = ("signal", "data")
__slots__ = ("signal", "data", "_snapshot_data", "_has_snapshot_data")
def __init__(self, signal: Signal, data: Any = None) -> None:
self.signal = signal
self.data = data
self._snapshot_data = None
self._has_snapshot_data = False
def __repr__(self) -> str:
if self.data is None:
return f"{type(self).__name__}({self.signal!r})"
Expand Down
Loading
Loading