Skip to content

Commit 25a71f2

Browse files
authored
Merge pull request #103 from Summoner-Network/dev
Dev
2 parents c908bd7 + 7c2f986 commit 25a71f2

13 files changed

Lines changed: 1630 additions & 27 deletions

benchmarks/benchmark_use_data_send.py

Lines changed: 563 additions & 0 deletions
Large diffs are not rendered by default.

benchmarks/benchmark_when_data_send.py

Lines changed: 420 additions & 0 deletions
Large diffs are not rendered by default.

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ pytest~=9.0.3
22
asyncio==3.4.3
33
aioconsole==0.8.1
44
maturin==1.8.3
5-
python-dotenv~=1.2.2
5+
python-dotenv~=1.2.1
66
typing_extensions==4.15.0

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
python_requires=">=3.9",
1616
install_requires=[
1717
"aioconsole==0.8.1",
18-
"python-dotenv~=1.2.2",
18+
"python-dotenv~=1.2.1",
1919
"typing_extensions==4.15.0; python_version < '3.13'",
2020
],
2121
extras_require={

summoner/_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "1.2.0"
1+
__version__ = "1.3.0"

summoner/client/client.py

Lines changed: 208 additions & 17 deletions
Large diffs are not rendered by default.

summoner/client/merger.py

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ def _resolve_callable_reference_from_source(
223223
try:
224224
if "__builtins__" not in globals_dict:
225225
globals_dict["__builtins__"] = __builtins__
226-
exec(compile(textwrap.dedent(source), filename="<summoner_run_while>", mode="exec"), globals_dict)
226+
exec(compile(textwrap.dedent(source), filename="<summoner_callable>", mode="exec"), globals_dict)
227227
except Exception:
228228
return None
229229

@@ -233,16 +233,19 @@ def _resolve_callable_reference_from_source(
233233
return None
234234

235235

236-
def _resolve_run_while_spec(
236+
def _resolve_callable_spec(
237237
globals_dict: dict[str, Any],
238238
kind: str,
239239
value: Any,
240240
name: Optional[str],
241241
source: Optional[str] = None,
242+
*,
243+
spec_name: str,
244+
allow_bool: bool = False,
242245
) -> Any:
243246
if kind == "none":
244247
return None
245-
if kind == "bool":
248+
if allow_bool and kind == "bool":
246249
return bool(value)
247250
if kind == "callable":
248251
resolved = _resolve_callable_reference(globals_dict, name)
@@ -251,10 +254,45 @@ def _resolve_run_while_spec(
251254
if callable(resolved):
252255
return resolved
253256
raise ValueError(
254-
"Could not resolve serialized run_while callable "
257+
f"Could not resolve serialized {spec_name} callable "
255258
f"{name!r} from available replay context"
256259
)
257-
raise ValueError(f"Unknown run_while kind {kind!r}")
260+
raise ValueError(f"Unknown {spec_name} kind {kind!r}")
261+
262+
263+
def _resolve_run_while_spec(
264+
globals_dict: dict[str, Any],
265+
kind: str,
266+
value: Any,
267+
name: Optional[str],
268+
source: Optional[str] = None,
269+
) -> Any:
270+
return _resolve_callable_spec(
271+
globals_dict,
272+
kind,
273+
value,
274+
name,
275+
source,
276+
spec_name="run_while",
277+
allow_bool=True,
278+
)
279+
280+
281+
def _resolve_when_data_spec(
282+
globals_dict: dict[str, Any],
283+
kind: str,
284+
value: Any,
285+
name: Optional[str],
286+
source: Optional[str] = None,
287+
) -> Any:
288+
return _resolve_callable_spec(
289+
globals_dict,
290+
kind,
291+
value,
292+
name,
293+
source,
294+
spec_name="when_data",
295+
)
258296

259297

260298
class ClientMerger(SummonerClient):
@@ -930,6 +968,15 @@ def initiate_senders(self):
930968
dna.get("run_while_name", None),
931969
dna.get("run_while_source", None),
932970
)
971+
when_data = dna.get("when_data")
972+
if when_data is None:
973+
when_data = _resolve_when_data_spec(
974+
fn_clone.__globals__,
975+
dna.get("when_data_kind", "none"),
976+
dna.get("when_data_value", None),
977+
dna.get("when_data_name", None),
978+
dna.get("when_data_source", None),
979+
)
933980
self.send(
934981
route,
935982
multi=dna.get("multi", False),
@@ -939,6 +986,7 @@ def initiate_senders(self):
939986
data_mode=dna.get("data_mode", None),
940987
every=dna.get("every", None),
941988
run_while=run_while,
989+
when_data=when_data,
942990
)(fn_clone)
943991
except Exception as e:
944992
self.logger.warning(
@@ -971,6 +1019,13 @@ def initiate_senders(self):
9711019
entry.get("run_while_name", None),
9721020
entry.get("run_while_source", None),
9731021
)
1022+
when_data = _resolve_when_data_spec(
1023+
g,
1024+
entry.get("when_data_kind", "none"),
1025+
entry.get("when_data_value", None),
1026+
entry.get("when_data_name", None),
1027+
entry.get("when_data_source", None),
1028+
)
9741029
dec = self.send(
9751030
route,
9761031
multi=entry.get("multi", False),
@@ -980,6 +1035,7 @@ def initiate_senders(self):
9801035
data_mode=entry.get("data_mode", None),
9811036
every=entry.get("every", None),
9821037
run_while=run_while,
1038+
when_data=when_data,
9831039
)
9841040
self._apply_with_source_patch(dec, fn, entry["source"])
9851041

@@ -1341,6 +1397,13 @@ def initiate_senders(self):
13411397
entry.get("run_while_name", None),
13421398
entry.get("run_while_source", None),
13431399
)
1400+
when_data = _resolve_when_data_spec(
1401+
g,
1402+
entry.get("when_data_kind", "none"),
1403+
entry.get("when_data_value", None),
1404+
entry.get("when_data_name", None),
1405+
entry.get("when_data_source", None),
1406+
)
13441407
dec = self.send(
13451408
route,
13461409
multi=entry.get("multi", False),
@@ -1350,6 +1413,7 @@ def initiate_senders(self):
13501413
data_mode=entry.get("data_mode", None),
13511414
every=entry.get("every", None),
13521415
run_while=run_while,
1416+
when_data=when_data,
13531417
)
13541418
self._apply_with_source_patch(dec, fn, entry["source"])
13551419

summoner/protocol/payload.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,8 @@ def cast_v0_0_1(val: Any, expected: Any) -> Any:
159159
register_envelope_version("1.0.1", parse_v0_0_1, cast_v0_0_1)
160160
register_envelope_version("1.1.0", parse_v0_0_1, cast_v0_0_1)
161161
register_envelope_version("1.1.1", parse_v0_0_1, cast_v0_0_1)
162-
# register_envelope_version("1.2.0", parse_v0_0_1, cast_v0_0_1)
162+
register_envelope_version("1.2.0", parse_v0_0_1, cast_v0_0_1)
163+
# register_envelope_version("1.3.0", parse_v0_0_1, cast_v0_0_1)
163164
register_envelope_version(core_version, parse_v0_0_1, cast_v0_0_1)
164165

165166

summoner/protocol/process.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,7 @@ class Sender:
313313
'triggers',
314314
'use_data',
315315
'data_mode',
316+
'when_data',
316317
'every',
317318
'run_while',
318319
'registration_id',
@@ -323,6 +324,7 @@ class Sender:
323324
triggers: Optional[set[Signal]]
324325
use_data: bool
325326
data_mode: Optional[str]
327+
when_data: Any
326328
every: Optional[float]
327329
run_while: Any
328330
registration_id: Optional[str]
@@ -335,6 +337,7 @@ def __init__(
335337
triggers: Optional[set[Signal]],
336338
use_data: bool = False,
337339
data_mode: Optional[str] = None,
340+
when_data: Any = None,
338341
every: Optional[float] = None,
339342
run_while: Any = None,
340343
registration_id: Optional[str] = None,
@@ -345,6 +348,7 @@ def __init__(
345348
object.__setattr__(self, "triggers", triggers)
346349
object.__setattr__(self, "use_data", use_data)
347350
object.__setattr__(self, "data_mode", data_mode)
351+
object.__setattr__(self, "when_data", when_data)
348352
object.__setattr__(self, "every", every)
349353
object.__setattr__(self, "run_while", run_while)
350354
object.__setattr__(self, "registration_id", registration_id)

summoner/protocol/triggers.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,10 +222,12 @@ def name_of(*args):
222222

223223

224224
class Event:
225-
__slots__ = ("signal", "data")
225+
__slots__ = ("signal", "data", "_snapshot_data", "_has_snapshot_data")
226226
def __init__(self, signal: Signal, data: Any = None) -> None:
227227
self.signal = signal
228228
self.data = data
229+
self._snapshot_data = None
230+
self._has_snapshot_data = False
229231
def __repr__(self) -> str:
230232
if self.data is None:
231233
return f"{type(self).__name__}({self.signal!r})"

0 commit comments

Comments
 (0)