From 2df922b7fbf530591d0d9c844ec1b46159b4fdc7 Mon Sep 17 00:00:00 2001 From: SAY-5 Date: Mon, 11 May 2026 18:33:31 -0700 Subject: [PATCH] fix(behavior): guard log_activity against unset logger Signed-off-by: SAY-5 --- src/ethopy/core/behavior.py | 8 ++++++++ tests/test_behavior.py | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/src/ethopy/core/behavior.py b/src/ethopy/core/behavior.py index 91e25bc..2047d7c 100755 --- a/src/ethopy/core/behavior.py +++ b/src/ethopy/core/behavior.py @@ -5,6 +5,7 @@ interfaces with hardware components and maintains experiment state. """ +import logging from dataclasses import dataclass, fields from dataclasses import field as datafield from datetime import datetime, timedelta @@ -14,6 +15,8 @@ import datajoint as dj import numpy as np +log = logging.getLogger(__name__) + from ethopy.core.experiment import ExperimentClass from ethopy.core.logger import ( # pylint: disable=W0611, # noqa: F401 behavior, @@ -199,6 +202,11 @@ def log_activity(self, activity_key: dict) -> int: """ activity = BehActivity(**activity_key) + # GPIO callbacks may fire before setup() wires the logger; drop them. + if self.logger is None: + log.warning("log_activity called before logger is set; dropping %s", + activity_key) + return activity.time or 0 # if activity.time is not set, set it to the current time if not activity.time: activity.time = self.logger.logger_timer.elapsed_time() diff --git a/tests/test_behavior.py b/tests/test_behavior.py index a3fb667..d75fd94 100644 --- a/tests/test_behavior.py +++ b/tests/test_behavior.py @@ -56,6 +56,12 @@ def test_log_activity_lick(self, behavior): assert behavior.last_lick.time == 1500 assert behavior.licked_port == 2 + def test_log_activity_before_logger_setup(self, behavior): + """Callbacks firing before setup() must not raise AttributeError.""" + behavior.logger = None + result = behavior.log_activity({"type": "Lick", "port": 1, "time": 500}) + assert result == 500 + def test_is_licking_no_lick(self, behavior): """Test is_licking when no lick has occurred.""" from ethopy.core.behavior import BehActivity