Skip to content

Commit 3be78d4

Browse files
authored
Merge pull request #159 from kashif/fix-concat
[textarena] flush on newline boundry
2 parents e6a07b1 + f92ffff commit 3be78d4

File tree

2 files changed

+71
-14
lines changed

2 files changed

+71
-14
lines changed

src/envs/textarena_env/server/environment.py

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -187,24 +187,24 @@ def _legal_players(self) -> List[int]:
187187

188188
def _convert_messages(self, messages: Iterable[Any]) -> List[TextArenaMessage]:
189189
converted: List[TextArenaMessage] = []
190+
buffered_content: List[str] = []
190191
buffered_sender: int | None = None
191192
buffered_category: str | None = None
192-
buffered_content: List[str] = []
193+
last_char_was_newline = False
193194

194195
def flush_buffer() -> None:
195196
nonlocal buffered_content, buffered_sender, buffered_category
196-
if not buffered_content:
197-
return
198-
converted.append(
199-
TextArenaMessage(
200-
sender_id=buffered_sender if buffered_sender is not None else -1,
201-
content="".join(buffered_content),
202-
category=buffered_category or "MESSAGE",
197+
if buffered_content:
198+
converted.append(
199+
TextArenaMessage(
200+
sender_id=buffered_sender if buffered_sender is not None else -1,
201+
content="".join(buffered_content),
202+
category=buffered_category or "MESSAGE",
203+
)
203204
)
204-
)
205205
buffered_content = []
206-
buffered_category = None
207206
buffered_sender = None
207+
buffered_category = None
208208

209209
for entry in messages:
210210
if isinstance(entry, tuple) and len(entry) == 3:
@@ -219,13 +219,29 @@ def flush_buffer() -> None:
219219
sender_id = int(sender) if isinstance(sender, (int, float)) else -1
220220
text = str(content)
221221

222-
if buffered_content and buffered_category == category_name and buffered_sender == sender_id:
223-
buffered_content.append(text)
224-
else:
222+
if text == "\n":
225223
flush_buffer()
224+
if last_char_was_newline:
225+
converted.append(
226+
TextArenaMessage(
227+
sender_id=sender_id,
228+
content="",
229+
category=category_name,
230+
)
231+
)
232+
last_char_was_newline = True
233+
continue
234+
235+
if buffered_sender is None or buffered_category is None:
226236
buffered_sender = sender_id
227237
buffered_category = category_name
228-
buffered_content = [text]
238+
elif buffered_sender != sender_id or buffered_category != category_name:
239+
flush_buffer()
240+
buffered_sender = sender_id
241+
buffered_category = category_name
242+
243+
buffered_content.append(text)
244+
last_char_was_newline = False
229245

230246
flush_buffer()
231247

tests/envs/test_textarena_environment.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,44 @@ def test_convert_messages_coalesces_consecutive_characters():
2121
TextArenaMessage(sender_id=1, content="AB", category="MESSAGE"),
2222
TextArenaMessage(sender_id=2, content="!", category="MESSAGE"),
2323
]
24+
25+
26+
def test_convert_messages_splits_on_newlines():
27+
env = object.__new__(TextArenaEnvironment)
28+
29+
raw_messages = [
30+
"[",
31+
"G",
32+
"A",
33+
"M",
34+
"E",
35+
"]",
36+
"\n",
37+
"[",
38+
"N",
39+
"E",
40+
"X",
41+
"T",
42+
"]",
43+
]
44+
45+
converted = env._convert_messages(raw_messages)
46+
47+
assert converted == [
48+
TextArenaMessage(sender_id=-1, content="[GAME]", category="MESSAGE"),
49+
TextArenaMessage(sender_id=-1, content="[NEXT]", category="MESSAGE"),
50+
]
51+
52+
53+
def test_convert_messages_preserves_blank_lines():
54+
env = object.__new__(TextArenaEnvironment)
55+
56+
raw_messages = ["A", "\n", "\n", "B"]
57+
58+
converted = env._convert_messages(raw_messages)
59+
60+
assert converted == [
61+
TextArenaMessage(sender_id=-1, content="A", category="MESSAGE"),
62+
TextArenaMessage(sender_id=-1, content="", category="MESSAGE"),
63+
TextArenaMessage(sender_id=-1, content="B", category="MESSAGE"),
64+
]

0 commit comments

Comments
 (0)