Skip to content

Commit bcbd063

Browse files
authored
v0.9.5
2 parents 796968e + 1e3ddbd commit bcbd063

7 files changed

Lines changed: 30 additions & 21 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## 0.9.5
4+
5+
- Unified export schema/version markers to 0.9.5 across session JSON, bundle manifest, compatibility report, SQL header and CowLog header.
6+
- Preserved backward import compatibility for 0.9.1 schemas while adding acceptance for 0.9.5 schemas.
7+
- Carried forward v0.9.3 review queue filtering/export consistency and batch assignment behavior.
8+
39
## 0.9.4
410

511
- Restored Django runtime target to 6.0.3.

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
# PyBehaviorLog 0.9.4
1+
# PyBehaviorLog 0.9.5
22

33
PyBehaviorLog is an ASGI-first behavioral observation platform built with Django 6.0.3. It is designed for research teams who need video-assisted coding, live observations, structured ethograms, review workflows, and exportable analytics without being locked into a desktop-only workflow.
44

5-
## What is in this 0.9.4 archive
5+
## What is in this 0.9.5 archive
66

77
This version extends the earlier CowLog/BORIS-inspired foundations with:
88

tracker/tests/test_compatibility.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,4 +202,4 @@ def test_export_endpoints_for_compatibility_formats(self):
202202
)
203203
self.assertEqual(response.status_code, 200)
204204
payload = json.loads(response.content.decode('utf-8'))
205-
self.assertEqual(payload['schema'], 'pybehaviorlog-0.9.1-session-compatibility-report')
205+
self.assertEqual(payload['schema'], 'pybehaviorlog-0.9.5-session-compatibility-report')

tracker/tests/test_helpers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def test_build_statistics_subjects_transitions_and_integrity(self):
110110

111111
def test_build_project_statistics_and_payloads(self):
112112
payload = build_ethogram_payload(self.project)
113-
self.assertEqual(payload['schema'], 'pybehaviorlog-0.9.1-ethogram')
113+
self.assertEqual(payload['schema'], 'pybehaviorlog-0.9.5-ethogram')
114114
imported_categories, _, imported_behaviors = import_ethogram_payload(
115115
self.project, payload, replace_existing=False
116116
)
@@ -132,7 +132,7 @@ def test_build_project_statistics_and_payloads(self):
132132

133133
def test_import_session_payload_v83(self):
134134
payload = {
135-
'schema': 'pybehaviorlog-0.9.1-session',
135+
'schema': 'pybehaviorlog-0.9.5-session',
136136
'workflow_status': 'validated',
137137
'review_notes': 'Checked',
138138
'events': [

tracker/tests/test_roundtrip.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ def test_cowlog_fixture_roundtrip_via_pybehaviorlog_json(self):
7676
self.assertEqual(report['detected_format'], 'cowlog-results-v1')
7777
import_session_payload(session, imported_payload, clear_existing=True)
7878
exported_payload = {
79-
'schema': 'pybehaviorlog-0.9.1-session',
79+
'schema': 'pybehaviorlog-0.9.5-session',
8080
'events': [
8181
{
8282
'time': event.timestamp_seconds,

tracker/tests/test_views.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def test_event_api_create_list_and_export_json(self):
9292

9393
export_response = self.client.get(reverse('tracker:session_export_json', args=[session.pk]))
9494
self.assertEqual(export_response.status_code, 200)
95-
self.assertIn('pybehaviorlog-0.9.1-session', export_response.content.decode('utf-8'))
95+
self.assertIn('pybehaviorlog-0.9.5-session', export_response.content.decode('utf-8'))
9696

9797
def test_event_update_and_delete_api(self):
9898
session = self.project.sessions.create(
@@ -242,7 +242,7 @@ def test_session_import_accepts_csv(self):
242242
def test_project_import_boris_json_view(self):
243243
payload = {
244244
'schema': 'boris-project-v3',
245-
'ethogram': {'schema': 'pybehaviorlog-0.9.1-ethogram', 'categories': [], 'modifiers': [], 'subject_groups': [], 'subjects': [], 'variables': [], 'behaviors': [{'name': 'Imported behavior', 'description': '', 'key_binding': 'i', 'color': '#0f766e', 'mode': 'point', 'sort_order': 1, 'category': None}]},
245+
'ethogram': {'schema': 'pybehaviorlog-0.9.5-ethogram', 'categories': [], 'modifiers': [], 'subject_groups': [], 'subjects': [], 'variables': [], 'behaviors': [{'name': 'Imported behavior', 'description': '', 'key_binding': 'i', 'color': '#0f766e', 'mode': 'point', 'sort_order': 1, 'category': None}]},
246246
'subject_groups': [{'name': 'Imported group', 'description': '', 'color': '#123456', 'sort_order': 1}],
247247
'subjects': [{'name': 'Imported subject', 'description': '', 'key_binding': 's', 'color': '#654321', 'sort_order': 1, 'groups': ['Imported group']}],
248248
'variables': [{'label': 'Weight', 'description': '', 'value_type': 'numeric', 'set_values': [], 'default_value': '0', 'sort_order': 1}],
@@ -318,7 +318,7 @@ def test_project_import_boris_json_accepts_mapping_shapes(self):
318318
payload = {
319319
'schema': 'boris-project-v2',
320320
'ethogram': {
321-
'schema': 'pybehaviorlog-0.9.1-ethogram',
321+
'schema': 'pybehaviorlog-0.9.5-ethogram',
322322
'categories': {'General': {'color': '#111111', 'sort_order': 1}},
323323
'modifiers': {'Near': {'description': 'proximity', 'key': 'n', 'sort_order': 1}},
324324
'behaviors': {'Imported code': {'description': '', 'key': 'i', 'color': '#0f766e', 'mode': 'point', 'sort_order': 1, 'category': {'name': 'General'}}},

tracker/views.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ def build_release_metadata() -> dict:
128128
"""Return a small machine-readable release description for health and ops tooling."""
129129
return {
130130
'application': 'PyBehaviorLog',
131-
'version': '0.9.4',
131+
'version': '0.9.5',
132132
'django_target': '6.0.3',
133133
'python_minimum': '3.13',
134134
'asgi': True,
@@ -1790,8 +1790,8 @@ def build_reproducibility_bundle(project: Project) -> dict[str, bytes]:
17901790
)
17911791

17921792
manifest = {
1793-
'schema': 'pybehaviorlog-0.9.1-bundle',
1794-
'version': '0.9.1',
1793+
'schema': 'pybehaviorlog-0.9.5-bundle',
1794+
'version': '0.9.5',
17951795
'project': {
17961796
'name': project.name,
17971797
'description': project.description,
@@ -2366,8 +2366,8 @@ def build_session_compatibility_report(session: ObservationSession) -> dict:
23662366
modifier_event_count = sum(1 for event in ordered_events if event.modifiers.exists())
23672367
multi_subject_event_count = sum(1 for event in ordered_events if event.subjects.count() > 1)
23682368
report = {
2369-
'schema': 'pybehaviorlog-0.9.1-session-compatibility-report',
2370-
'version': '0.9.1',
2369+
'schema': 'pybehaviorlog-0.9.5-session-compatibility-report',
2370+
'version': '0.9.5',
23712371
'session': session.title,
23722372
'boris': {
23732373
'documented_exports': [
@@ -2421,8 +2421,8 @@ def build_session_compatibility_report(session: ObservationSession) -> dict:
24212421
def build_project_compatibility_report(project: Project) -> dict:
24222422
"""Summarize project-level exchange coverage for BORIS and CowLog."""
24232423
return {
2424-
'schema': 'pybehaviorlog-0.9.1-project-compatibility-report',
2425-
'version': '0.9.1',
2424+
'schema': 'pybehaviorlog-0.9.5-project-compatibility-report',
2425+
'version': '0.9.5',
24262426
'project': project.name,
24272427
'counts': {
24282428
'sessions': project.sessions.count(),
@@ -2651,6 +2651,7 @@ def import_project_payload(
26512651
'pybehaviorlog-0.8.3-bundle',
26522652
'pybehaviorlog-0.9-bundle',
26532653
'pybehaviorlog-0.9.1-bundle',
2654+
'pybehaviorlog-0.9.5-bundle',
26542655
}:
26552656
raise ValueError(_('Unsupported project payload format.'))
26562657

@@ -2659,7 +2660,7 @@ def import_project_payload(
26592660
project,
26602661
{
26612662
**ethogram_payload,
2662-
'schema': ethogram_payload.get('schema', 'pybehaviorlog-0.9.1-ethogram'),
2663+
'schema': ethogram_payload.get('schema', 'pybehaviorlog-0.9.5-ethogram'),
26632664
},
26642665
replace_existing=False,
26652666
)
@@ -2870,7 +2871,7 @@ def import_project_payload(
28702871

28712872
def build_ethogram_payload(project: Project) -> dict: # pragma: no cover
28722873
return {
2873-
'schema': 'pybehaviorlog-0.9.1-ethogram',
2874+
'schema': 'pybehaviorlog-0.9.5-ethogram',
28742875
'project': {
28752876
'name': project.name,
28762877
'description': project.description,
@@ -2953,6 +2954,7 @@ def import_ethogram_payload(
29532954
'pybehaviorlog-0.8.3-ethogram',
29542955
'pybehaviorlog-0.9-ethogram',
29552956
'pybehaviorlog-0.9.1-ethogram',
2957+
'pybehaviorlog-0.9.5-ethogram',
29562958
'boris-project-v1',
29572959
'boris-project-v2',
29582960
'boris-project-v3',
@@ -3257,6 +3259,7 @@ def import_session_payload(
32573259
'pybehaviorlog-0.8.3-session',
32583260
'pybehaviorlog-0.9-session',
32593261
'pybehaviorlog-0.9.1-session',
3262+
'pybehaviorlog-0.9.5-session',
32603263
'cowlog-results-v1',
32613264
'boris-tabular-csv-v1',
32623265
'boris-tabular-tsv-v1',
@@ -5488,7 +5491,7 @@ def session_export_sql(request, pk: int): # pragma: no cover
54885491
"""Export session events as SQL INSERT statements for downstream analysis."""
54895492
session = get_accessible_session(request.user, pk)
54905493
lines = [
5491-
'-- PyBehaviorLog 0.9.1 SQL export',
5494+
'-- PyBehaviorLog 0.9.5 SQL export',
54925495
'BEGIN;',
54935496
'CREATE TABLE IF NOT EXISTS pybehaviorlog_event_export (project text, session text, primary_video text, synced_videos text, observer text, category text, behavior text, behavior_mode text, event_kind text, timestamp_seconds numeric(10,3), subjects text, modifiers text, comment text, created_at text);',
54945497
]
@@ -5525,7 +5528,7 @@ def session_export_cowlog_txt(request, pk: int): # pragma: no cover
55255528
response['Content-Disposition'] = (
55265529
f'attachment; filename="session_{session.pk}_cowlog_compatible.txt"'
55275530
)
5528-
response.write('# PyBehaviorLog 0.9.1 CowLog-compatible export\n')
5531+
response.write('# PyBehaviorLog 0.9.5 CowLog-compatible export\n')
55295532
response.write(f'# session\t{session.title}\n')
55305533
response.write(f'# project\t{session.project.name}\n')
55315534
response.write(f'# primary_video\t{session.primary_label}\n')
@@ -5652,7 +5655,7 @@ def session_export_tsv(request, pk: int): # pragma: no cover
56525655
def session_export_json(request, pk: int):
56535656
session = get_accessible_session(request.user, pk)
56545657
payload = {
5655-
'schema': 'pybehaviorlog-0.9.1-session',
5658+
'schema': 'pybehaviorlog-0.9.5-session',
56565659
'project': session.project.name,
56575660
'session': session.title,
56585661
'video': session.primary_label,

0 commit comments

Comments
 (0)