Skip to content

Commit 5eb49d6

Browse files
authored
Merge pull request #231 from AllenNeuralDynamics/refactor-against-aind-behavior-services-breaking
Refactor against version 0.13 of aind-behavior-services
2 parents bbb3dba + b55fbbe commit 5eb49d6

File tree

18 files changed

+333
-347
lines changed

18 files changed

+333
-347
lines changed

examples/_mocks.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
import git
77
from aind_behavior_curriculum import Stage, TrainerState
8-
from aind_behavior_services.rig import AindBehaviorRigModel
9-
from aind_behavior_services.session import AindBehaviorSessionModel
10-
from aind_behavior_services.task_logic import AindBehaviorTaskLogicModel
8+
from aind_behavior_services.rig import Rig
9+
from aind_behavior_services.session import Session
10+
from aind_behavior_services.task import Task
1111
from pydantic import Field
1212

1313
from clabe.data_mapper import DataMapper
@@ -19,20 +19,20 @@
1919

2020

2121
### Task-specific definitions
22-
class RigModel(AindBehaviorRigModel):
22+
class RigModel(Rig):
2323
rig_name: str = Field(default="TestRig", description="Rig name")
2424
version: Literal["0.0.0"] = "0.0.0"
2525

2626

27-
class TaskLogicModel(AindBehaviorTaskLogicModel):
27+
class MockTask(Task):
2828
version: Literal["0.0.0"] = "0.0.0"
2929
name: Literal[TASK_NAME] = TASK_NAME
3030

3131

3232
mock_trainer_state = TrainerState[Any](
3333
curriculum=None,
3434
is_on_curriculum=False,
35-
stage=Stage(name="TestStage", task=TaskLogicModel(name=TASK_NAME, task_parameters={"foo": "bar"})),
35+
stage=Stage(name="TestStage", task=MockTask(name=TASK_NAME, task_parameters={"foo": "bar"})),
3636
)
3737

3838

@@ -55,8 +55,8 @@ class DemoAindDataSchemaSessionDataMapper(DataMapper[MockAindDataSchemaSession])
5555
def __init__(
5656
self,
5757
rig_model: RigModel,
58-
session_model: AindBehaviorSessionModel,
59-
task_logic_model: TaskLogicModel,
58+
session_model: Session,
59+
task_model: MockTask,
6060
repository: Union[os.PathLike, git.Repo],
6161
script_path: os.PathLike,
6262
session_end_time: Optional[datetime.datetime] = None,
@@ -65,7 +65,7 @@ def __init__(
6565
super().__init__()
6666
self.session_model = session_model
6767
self.rig_model = rig_model
68-
self.task_logic_model = task_logic_model
68+
self.task_model = task_model
6969
self.repository = repository
7070
self.script_path = script_path
7171
self.session_end_time = session_end_time
@@ -74,7 +74,7 @@ def __init__(
7474

7575
def map(self) -> MockAindDataSchemaSession:
7676
self._mapped = MockAindDataSchemaSession(
77-
computer_name=self.rig_model.computer_name, repository=self.repository, task_name=self.task_logic_model.name
77+
computer_name=self.rig_model.computer_name, repository=self.repository, task_name=self.task_model.name
7878
)
7979
print("#" * 50)
8080
print("THIS IS MAPPED DATA!")
@@ -87,8 +87,8 @@ def create_fake_subjects():
8787
subjects = ["00000", "123456"]
8888
for subject in subjects:
8989
os.makedirs(f"{LIB_CONFIG}/Subjects/{subject}", exist_ok=True)
90-
with open(f"{LIB_CONFIG}/Subjects/{subject}/task_logic.json", "w", encoding="utf-8") as f:
91-
f.write(TaskLogicModel(task_parameters={"subject": subject}).model_dump_json(indent=2))
90+
with open(f"{LIB_CONFIG}/Subjects/{subject}/task.json", "w", encoding="utf-8") as f:
91+
f.write(MockTask(task_parameters={"subject": subject}).model_dump_json(indent=2))
9292
with open(f"{LIB_CONFIG}/Subjects/{subject}/trainer_state.json", "w", encoding="utf-8") as f:
9393
f.write(mock_trainer_state.model_dump_json(indent=2))
9494

@@ -97,4 +97,4 @@ def create_fake_rig():
9797
computer_name = os.getenv("COMPUTERNAME")
9898
os.makedirs(_dir := f"{LIB_CONFIG}/Rig/{computer_name}", exist_ok=True)
9999
with open(f"{_dir}/rig1.json", "w", encoding="utf-8") as f:
100-
f.write(RigModel(data_directory=r"./local/data").model_dump_json(indent=2))
100+
f.write(RigModel(data_directory=r"./local/data", computer_name="mock_pc").model_dump_json(indent=2))

examples/behavior_launcher.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44

55
from _mocks import (
66
LIB_CONFIG,
7-
AindBehaviorSessionModel,
87
DemoAindDataSchemaSessionDataMapper,
8+
MockTask,
99
RigModel,
10-
TaskLogicModel,
10+
Session,
1111
create_fake_rig,
1212
create_fake_subjects,
1313
)
@@ -30,10 +30,10 @@ async def demo_experiment(launcher: Launcher) -> None:
3030
experimenter_validator=lambda _: True,
3131
)
3232

33-
session = picker.pick_session(AindBehaviorSessionModel)
33+
session = picker.pick_session(Session)
3434
rig = picker.pick_rig(RigModel)
3535
launcher.register_session(session, rig.data_directory)
36-
trainer_state, task_logic = picker.pick_trainer_state(TaskLogicModel)
36+
trainer_state, task = picker.pick_trainer_state(MockTask)
3737
_temp_trainer_state_path = launcher.save_temp_model(trainer_state)
3838

3939
resource_monitor.ResourceMonitor(
@@ -62,7 +62,7 @@ def fmt(value: str) -> str:
6262
DemoAindDataSchemaSessionDataMapper(
6363
rig,
6464
session,
65-
task_logic,
65+
task,
6666
repository=launcher.repository,
6767
script_path=Path("./mock/script.py"),
6868
output_parameters={"suggestion": suggestion.model_dump()},

examples/client_behavior_launcher.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33

44
from _mocks import (
55
LIB_CONFIG,
6-
AindBehaviorSessionModel,
6+
MockTask,
77
RigModel,
8-
TaskLogicModel,
8+
Session,
99
create_fake_rig,
1010
create_fake_subjects,
1111
)
@@ -29,10 +29,10 @@ async def client_experiment(launcher: Launcher) -> None:
2929
experimenter_validator=lambda _: True,
3030
)
3131

32-
session = picker.pick_session(AindBehaviorSessionModel)
32+
session = picker.pick_session(Session)
3333
rig = picker.pick_rig(RigModel)
3434
launcher.register_session(session, rig.data_directory)
35-
trainer_state, task_logic = picker.pick_trainer_state(TaskLogicModel)
35+
trainer_state, task = picker.pick_trainer_state(MockTask)
3636

3737
resource_monitor.ResourceMonitor(
3838
constrains=[
@@ -45,10 +45,10 @@ async def client_experiment(launcher: Launcher) -> None:
4545
bonsai_root = Path(r"C:\git\AllenNeuralDynamics\Aind.Behavior.VrForaging")
4646
session_response = xml_rpc_client.upload_model(session, "session.json")
4747
rig_response = xml_rpc_client.upload_model(rig, "rig.json")
48-
task_logic_response = xml_rpc_client.upload_model(task_logic, "task_logic.json")
48+
task_response = xml_rpc_client.upload_model(task, "task.json")
4949
assert rig_response.path is not None
5050
assert session_response.path is not None
51-
assert task_logic_response.path is not None
51+
assert task_response.path is not None
5252

5353
bonsai_app_result = await xml_rpc_client.run_async(
5454
BonsaiApp(
@@ -57,7 +57,7 @@ async def client_experiment(launcher: Launcher) -> None:
5757
additional_externalized_properties={
5858
"RigPath": rig_response.path,
5959
"SessionPath": session_response.path,
60-
"TaskLogicPath": task_logic_response.path,
60+
"TaskPath": task_response.path,
6161
},
6262
).command
6363
)

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ dependencies = [
2626
"requests",
2727
"semver",
2828
"rich",
29-
"aind_behavior_services >= 0.13rc0",
3029
"questionary",
30+
"aind_behavior_services>=0.13.0",
3131
]
3232

3333
[project.urls]

src/clabe/_typing.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import TypeVar
22

3-
from aind_behavior_services import AindBehaviorRigModel, AindBehaviorSessionModel, AindBehaviorTaskLogicModel
3+
from aind_behavior_services import Rig, Session, Task
44

5-
TSession = TypeVar("TSession", bound=AindBehaviorSessionModel)
6-
TRig = TypeVar("TRig", bound=AindBehaviorRigModel)
7-
TTaskLogic = TypeVar("TTaskLogic", bound=AindBehaviorTaskLogicModel)
5+
TSession = TypeVar("TSession", bound=Session)
6+
TRig = TypeVar("TRig", bound=Rig)
7+
TTask = TypeVar("TTask", bound=Task)

src/clabe/apps/_bonsai.py

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from typing import Dict, List, Optional
88

99
import pydantic
10-
from aind_behavior_services import AindBehaviorRigModel, AindBehaviorSessionModel, AindBehaviorTaskLogicModel
10+
from aind_behavior_services import Rig, Session, Task
1111

1212
from ..constants import TMP_DIR
1313
from ._base import Command, CommandResult, ExecutableApp, identity_parser
@@ -170,7 +170,7 @@ class AindBehaviorServicesBonsaiApp(BonsaiApp):
170170
Specialized Bonsai application for AIND behavior services integration.
171171
172172
This class extends the base BonsaiApp to provide specific functionality for
173-
AIND behavior experiments, including automatic configuration of task logic,
173+
AIND behavior experiments, including automatic configuration of task,
174174
session, and rig paths for the Bonsai workflow.
175175
176176
Example:
@@ -186,15 +186,15 @@ def __init__(
186186
workflow: os.PathLike,
187187
*,
188188
temp_directory: Optional[os.PathLike] = None,
189-
rig: Optional[AindBehaviorRigModel] = None,
190-
session: Optional[AindBehaviorSessionModel] = None,
191-
task_logic: Optional[AindBehaviorTaskLogicModel] = None,
189+
rig: Optional[Rig] = None,
190+
session: Optional[Session] = None,
191+
task: Optional[Task] = None,
192192
**kwargs,
193193
) -> None:
194194
"""
195195
Initializes the AIND behavior services Bonsai app with automatic model configuration.
196196
197-
Automatically configures RigPath, SessionPath, and TaskLogicPath properties
197+
Automatically configures RigPath, SessionPath, and TaskPath properties
198198
for the Bonsai workflow by saving provided models to temporary files and
199199
passing their paths as externalized properties.
200200
@@ -204,38 +204,38 @@ def __init__(
204204
launcher: The launcher instance for saving temporary models
205205
rig: Optional rig model to configure. Defaults to None
206206
session: Optional session model to configure. Defaults to None
207-
task_logic: Optional task logic model to configure. Defaults to None
207+
task: Optional task model to configure. Defaults to None
208208
**kwargs: Additional keyword arguments passed to BonsaiApp (executable,
209209
is_editor_mode, is_start_flag, additional_properties, cwd, timeout,
210210
additional_externalized_properties)
211211
212212
Example:
213213
```python
214214
from aind_behavior_services import (
215-
AindBehaviorRigModel,
216-
AindBehaviorSessionModel,
217-
AindBehaviorTaskLogicModel
215+
Rig,
216+
Session,
217+
Task
218218
)
219219
220220
# Create models
221-
rig = AindBehaviorRigModel(...)
222-
session = AindBehaviorSessionModel(...)
223-
task_logic = AindBehaviorTaskLogicModel(...)
221+
rig = Rig(...)
222+
session = Session(...)
223+
task = Task(...)
224224
225225
# Create app with automatic configuration
226226
app = AindBehaviorServicesBonsaiApp(
227227
workflow="behavior_workflow.bonsai",
228228
launcher=my_launcher,
229229
rig=rig,
230230
session=session,
231-
task_logic=task_logic
231+
task=task
232232
)
233233
app.run()
234234
235235
# The workflow will receive:
236236
# -p:"RigPath"="/tmp/rig_temp.json"
237237
# -p:"SessionPath"="/tmp/session_temp.json"
238-
# -p:"TaskLogicPath"="/tmp/task_logic_temp.json"
238+
# -p:"TaskPath"="/tmp/task_temp.json"
239239
```
240240
"""
241241
self._temp_directory = Path(temp_directory or TMP_DIR)
@@ -245,10 +245,8 @@ def __init__(
245245
additional_externalized_properties["RigPath"] = os.path.abspath(self._save_temp_model(model=rig))
246246
if session:
247247
additional_externalized_properties["SessionPath"] = os.path.abspath(self._save_temp_model(model=session))
248-
if task_logic:
249-
additional_externalized_properties["TaskLogicPath"] = os.path.abspath(
250-
self._save_temp_model(model=task_logic)
251-
)
248+
if task:
249+
additional_externalized_properties["TaskPath"] = os.path.abspath(self._save_temp_model(model=task))
252250
super().__init__(
253251
workflow=workflow, additional_externalized_properties=additional_externalized_properties, **kwargs
254252
)

src/clabe/constants.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ class ByAnimalFiles(enum.StrEnum):
3434
3535
Example:
3636
```python
37-
# Use the task logic file type
38-
filename = f"{ByAnimalFiles.TASK_LOGIC}.json"
37+
# Use the task file type
38+
filename = f"{ByAnimalFiles.task}.json"
3939
```
4040
"""
4141

42-
TASK_LOGIC = "task_logic"
42+
TASK = "task"
4343
TRAINER_STATE = "trainer_state"

src/clabe/data_mapper/helpers.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,14 @@
66
from typing import Dict, List, Union
77

88
import pydantic
9-
from aind_behavior_services import AindBehaviorRigModel
9+
from aind_behavior_services import Rig
1010
from aind_behavior_services.rig.cameras import CameraController, CameraTypes
1111
from aind_behavior_services.utils import get_fields_of_type
1212

1313
logger = logging.getLogger(__name__)
1414

1515

16-
def get_cameras(
17-
rig_instance: AindBehaviorRigModel, exclude_without_video_writer: bool = True
18-
) -> Dict[str, CameraTypes]:
16+
def get_cameras(rig_instance: Rig, exclude_without_video_writer: bool = True) -> Dict[str, CameraTypes]:
1917
"""
2018
Retrieves cameras from a rig instance.
2119

src/clabe/data_transfer/aind_watchdog.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import pydantic
1212
import requests
1313
import yaml
14-
from aind_behavior_services import AindBehaviorSessionModel
14+
from aind_behavior_services import Session
1515
from aind_watchdog_service.models import (
1616
ManifestConfig,
1717
)
@@ -76,7 +76,7 @@ def __init__(
7676
self,
7777
source: PathLike | list[PathLike],
7878
settings: WatchdogSettings,
79-
session: AindBehaviorSessionModel,
79+
session: Session,
8080
*,
8181
validate: bool = True,
8282
email_from_experimenter_builder: Optional[
@@ -210,7 +210,7 @@ def is_valid_project_name(self) -> bool:
210210
project_names = self._get_project_names()
211211
return self._settings.project_name in project_names
212212

213-
def _create_manifest_from_session(self, session: AindBehaviorSessionModel) -> ManifestConfig:
213+
def _create_manifest_from_session(self, session: Session) -> ManifestConfig:
214214
"""
215215
Creates a ManifestConfig from an aind-behavior-services session.
216216

src/clabe/launcher/_base.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@
1010

1111
import git.exc
1212
import pydantic
13-
from aind_behavior_services import (
14-
AindBehaviorSessionModel,
15-
)
13+
from aind_behavior_services import Session
1614

1715
from .. import __version__, logging_helper
1816
from ..constants import TMP_DIR
@@ -90,7 +88,7 @@ def __init__(
9088

9189
self._logger = _logger
9290

93-
self._session: Optional[AindBehaviorSessionModel] = None
91+
self._session: Optional[Session] = None
9492
self._has_copied_logs = False
9593

9694
@property
@@ -119,7 +117,7 @@ def session_directory(self) -> Path:
119117
else:
120118
return Path(self.data_directory) / (session.session_name if session.session_name is not None else "")
121119

122-
def register_session(self, session: AindBehaviorSessionModel, data_directory: os.PathLike) -> Self:
120+
def register_session(self, session: Session, data_directory: os.PathLike) -> Self:
123121
"""
124122
Registers the session model with the launcher and creates the session
125123
data directory structure.
@@ -144,12 +142,12 @@ def register_session(self, session: AindBehaviorSessionModel, data_directory: os
144142
return self
145143

146144
@property
147-
def session(self) -> AindBehaviorSessionModel:
145+
def session(self) -> Session:
148146
"""
149147
Returns the registered session model.
150148
151149
Returns:
152-
AindBehaviorSessionModel: The session model
150+
Session: The session model
153151
154152
Raises:
155153
ValueError: If session is not set

0 commit comments

Comments
 (0)