Skip to content

Commit 5373cea

Browse files
committed
feat: reject reserved "$" event prefix client-side
Mirrors the server-side validation added in Flagsmith/flagsmith-analytics-pipeline@8fb51c0 — Flagsmith.track_event raises ValueError when the event name starts with "$" and isn't a known system event. Avoids a fire-and-forget 400 round-trip; user gets the error at the call site. Only applies to track_event (user-controlled name); track_exposure_event sets the literal internally and is unaffected.
1 parent f58f433 commit 5373cea

2 files changed

Lines changed: 16 additions & 0 deletions

File tree

flagsmith/flagsmith.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from urllib3 import Retry
1010

1111
from flagsmith.analytics import (
12+
FLAG_EXPOSURE_EVENT,
1213
AnalyticsProcessor,
1314
EventProcessor,
1415
EventProcessorConfig,
@@ -380,6 +381,11 @@ def track_event(
380381
) -> None:
381382
if not self._event_processor:
382383
raise ValueError("Events must be enabled to track events.")
384+
if event.startswith("$") and event != FLAG_EXPOSURE_EVENT:
385+
raise ValueError(
386+
f'Event name "{event}" uses the reserved "$" prefix '
387+
"but is not a known system event."
388+
)
383389
self._event_processor.track_event(
384390
event=event,
385391
identifier=identifier,

tests/test_flagsmith.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,16 @@ def test_track_event_raises_without_config(api_key: str) -> None:
957957
flagsmith.track_event("purchase")
958958

959959

960+
def test_track_event_rejects_reserved_prefix(api_key: str) -> None:
961+
flagsmith = Flagsmith(environment_key=api_key, enable_events=True)
962+
try:
963+
with pytest.raises(ValueError, match='reserved "\\$" prefix'):
964+
flagsmith.track_event("$made_up")
965+
finally:
966+
if flagsmith._event_processor:
967+
flagsmith._event_processor.stop()
968+
969+
960970
def test_event_processor_config_without_enable_events_raises(api_key: str) -> None:
961971
config = EventProcessorConfig(events_api_url="http://test/")
962972
with pytest.raises(

0 commit comments

Comments
 (0)