boris-behav-obs 9.3.4__py2.py3-none-any.whl → 9.4__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
boris/utilities.py CHANGED
@@ -19,54 +19,101 @@ Copyright 2012-2025 Olivier Friard
19
19
  MA 02110-1301, USA.
20
20
  """
21
21
 
22
+ from decimal import Decimal as dec
23
+ from decimal import getcontext, ROUND_DOWN
24
+ from hachoir.metadata import extractMetadata
25
+ from hachoir.parser import createParser
26
+ from shutil import copyfile
27
+ from typing import Union, Tuple
22
28
  import csv
29
+ import datetime
23
30
  import datetime as dt
31
+ import exifread
24
32
  import json
25
33
  import logging
26
34
  import math
35
+ import numpy as np
27
36
  import os
28
37
  import pathlib as pl
38
+ from PIL.ImageQt import Image
39
+ import platform
29
40
  import re
41
+ import shutil
30
42
  import subprocess
31
43
  import sys
32
44
  import urllib.parse
45
+ import urllib.request
33
46
  import wave
34
- import exifread
35
- import datetime
36
- from decimal import Decimal as dec
37
- from decimal import getcontext, ROUND_DOWN
38
- from shutil import copyfile
39
- from typing import Union, Tuple
40
47
 
41
- from hachoir.parser import createParser
42
- from hachoir.metadata import extractMetadata
43
-
44
-
45
- import numpy as np
48
+ from PySide6 import __version__ as pyside6_version
46
49
  from PySide6.QtGui import QPixmap, QImage
47
-
48
- from PIL.ImageQt import Image
50
+ from PySide6.QtCore import qVersion
49
51
 
50
52
  from . import config as cfg
53
+ from . import version
51
54
 
52
- from . import mpv2 as mpv
55
+ logger = logging.getLogger(__name__)
53
56
 
54
- """
55
57
  try:
56
58
  from . import mpv2 as mpv
59
+ except Exception:
60
+ logger.warning("MPV library not found")
57
61
 
58
- # check if MPV API v. 1
59
- # is v. 1 use the old version of mpv.py
60
- try:
61
- if "libmpv.so.1" in mpv.sofile:
62
- from . import mpv as mpv
63
- except AttributeError:
64
- if "mpv-1.dll" in mpv.dll:
65
- from . import mpv as mpv
66
-
67
- except RuntimeError: # libmpv found but version too old
68
- from . import mpv as mpv
69
- """
62
+ if sys.platform.startswith("win"):
63
+ import ctypes
64
+
65
+ ctypes.windll.user32.MessageBoxW(0, "The MPV library was not found!\nIt will be downloaded.", "BORIS", 0)
66
+
67
+ # download libmpv2.dll and ffprobe from https://github.com/boris-behav-obs/boris-behav-obs.github.io/releases/download/files/
68
+
69
+ url = "https://github.com/boris-behav-obs/boris-behav-obs.github.io/releases/download/files/"
70
+
71
+ external_files_dir = ""
72
+ # search where to download libmpv-2.dll
73
+
74
+ external_files_dir = pl.Path(__file__).parent / "misc"
75
+ if not external_files_dir.is_dir():
76
+ logger.info(f"Creating {external_files_dir} directory")
77
+ external_files_dir.mkdir(parents=True, exist_ok=True)
78
+
79
+ logger.info(f"MPV library directory: {external_files_dir}")
80
+
81
+ local_filename = external_files_dir / "libmpv-2.dll"
82
+ logger.info("Downloading libmpv-2.dll...")
83
+ try:
84
+ urllib.request.urlretrieve(url + "libmpv-2.dll", local_filename)
85
+ logger.info(f"File downloaded as {local_filename}")
86
+ except Exception:
87
+ logger.critical("The MPV library can not be downloaded! Check your connection.")
88
+ ctypes.windll.user32.MessageBoxW(0, "The MPV library can not be downloaded!\nCheck your connection.", "BORIS", 0)
89
+ sys.exit(5)
90
+ # reload package
91
+ try:
92
+ from . import mpv2 as mpv
93
+ except Exception:
94
+ logger.warning("MPV library not found after dowloading")
95
+ sys.exit(5)
96
+
97
+ elif sys.platform.startswith("linux"):
98
+ text = (
99
+ "The MPV library was not found!\nInstall it\n\n"
100
+ "With Debian/Ubuntu/Mint:\nsudo apt install libmpv2\n\n"
101
+ "With Fedora:\nsudo dnf install mpv-libs\n\n"
102
+ "With OpenSUSE:\nsudo zypper install mpv\n\n"
103
+ "Arch Linux / Manjaro:\nsudo pacman -S mpv\n\n"
104
+ )
105
+ if shutil.which("zenity") is not None:
106
+ subprocess.run(["zenity", "--error", f"--text={text}"])
107
+ elif shutil.which("kdialog"):
108
+ subprocess.run(["kdialog", "--msgbox", text])
109
+ elif shutil.which("gxmessage"):
110
+ subprocess.run(["gxmessage", text])
111
+ elif shutil.which("xmessage"):
112
+ subprocess.run(["xmessage", text])
113
+
114
+ sys.exit(5)
115
+ else:
116
+ sys.exit(5)
70
117
 
71
118
 
72
119
  def extract_exif_DateTimeOriginal(file_path: str) -> int:
@@ -110,10 +157,10 @@ def extract_video_creation_date(file_path: str) -> int | None:
110
157
  returns the timestamp of the media creation date time with Hachoir
111
158
  """
112
159
 
113
- logging.debug(f"extract_video_creation_date for {file_path}")
160
+ logger.debug(f"extract_video_creation_date for {file_path}")
114
161
 
115
162
  if not pl.Path(file_path).is_file():
116
- logging.debug(f"{file_path} not found")
163
+ logger.debug(f"{file_path} not found")
117
164
  return None
118
165
  try:
119
166
  parser = createParser(file_path)
@@ -140,14 +187,14 @@ def extract_date_time_from_file_name(file_path: str) -> int | None:
140
187
 
141
188
  if matches:
142
189
  if pattern == r"\d{4}-\d{2}-\d{2}_\d{6}":
143
- logging.debug(
190
+ logger.debug(
144
191
  f"extract_date_time_from_file_name timestamp from {file_path}: {int(datetime.datetime.strptime(matches[0], '%Y-%m-%d_%H%M%S').timestamp())}"
145
192
  )
146
193
 
147
194
  return int(datetime.datetime.strptime(matches[0], "%Y-%m-%d_%H%M%S").timestamp())
148
195
 
149
196
  if pattern == r"\d{4}-\d{2}-\d{2}_\d{2}:\d{2}:\d{2}":
150
- logging.debug(
197
+ logger.debug(
151
198
  f"extract_date_time_from_file_name timestamp from {file_path}: {int(datetime.datetime.strptime(matches[0], '%Y-%m-%d_%H:%M:%S').timestamp())}"
152
199
  )
153
200
 
@@ -798,9 +845,9 @@ def extract_wav(ffmpeg_bin: str, media_file_path: str, tmp_dir: str) -> str:
798
845
  try:
799
846
  wav = wave.open(media_file_path, "r")
800
847
  wav.close()
801
- logging.debug(f"{media_file_path} is a WAV file. Copying in the temp directory...")
848
+ logger.debug(f"{media_file_path} is a WAV file. Copying in the temp directory...")
802
849
  copyfile(media_file_path, wav_file_path)
803
- logging.debug(f"{media_file_path} copied in {wav_file_path}")
850
+ logger.debug(f"{media_file_path} copied in {wav_file_path}")
804
851
  return str(wav_file_path)
805
852
  except Exception:
806
853
  if wav_file_path.is_file():
@@ -815,7 +862,7 @@ def extract_wav(ffmpeg_bin: str, media_file_path: str, tmp_dir: str) -> str:
815
862
  )
816
863
  out, error = p.communicate()
817
864
  out, error = out.decode("utf-8"), error.decode("utf-8")
818
- logging.debug(f"{out}, {error}")
865
+ logger.debug(f"{out}, {error}")
819
866
 
820
867
  if "does not contain any stream" not in error:
821
868
  if wav_file_path.is_file():
@@ -866,8 +913,8 @@ def seconds_of_day(timestamp: dt.datetime) -> dec:
866
913
  dev: number of seconds since the start of the day
867
914
  """
868
915
 
869
- # logging.debug("function: seconds_of_day")
870
- # logging.debug(f"{timestamp = }")
916
+ # logger.debug("function: seconds_of_day")
917
+ # logger.debug(f"{timestamp = }")
871
918
 
872
919
  t = timestamp.time()
873
920
  return dec(t.hour * 3600 + t.minute * 60 + t.second + t.microsecond / 1000000).quantize(dec("0.001"))
@@ -1200,8 +1247,8 @@ def test_ffmpeg_path(FFmpegPath: str) -> Tuple[bool, str]:
1200
1247
  """
1201
1248
 
1202
1249
  out, error = subprocess.Popen(f'"{FFmpegPath}" -version', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True).communicate()
1203
- logging.debug(f"test ffmpeg path output: {out}")
1204
- logging.debug(f"test ffmpeg path error: {error}")
1250
+ logger.debug(f"test ffmpeg path output: {out}")
1251
+ logger.debug(f"test ffmpeg path error: {error}")
1205
1252
 
1206
1253
  if (b"avconv" in out) or (b"the Libav developers" in error):
1207
1254
  return False, "Please use FFmpeg from https://www.ffmpeg.org in place of FFmpeg from Libav project."
@@ -1223,43 +1270,24 @@ def check_ffmpeg_path() -> Tuple[bool, str]:
1223
1270
  str: if bool True returns ffmpegpath else returns error message
1224
1271
  """
1225
1272
 
1273
+ # search embedded ffmpeg
1226
1274
  if sys.platform.startswith("linux") or sys.platform.startswith("darwin"):
1227
- ffmpeg_path = pl.Path("")
1228
- # search embedded ffmpeg
1229
- if sys.argv[0].endswith("start_boris.py"):
1230
- ffmpeg_path = pl.Path(sys.argv[0]).resolve().parent / "boris" / "misc" / "ffmpeg"
1231
- if sys.argv[0].endswith("__main__.py"):
1232
- ffmpeg_path = pl.Path(sys.argv[0]).resolve().parent / "misc" / "ffmpeg"
1233
-
1234
- if not ffmpeg_path.is_file():
1235
- # search global ffmpeg
1236
- ffmpeg_path = "ffmpeg"
1237
-
1238
- # test ffmpeg
1239
- r, msg = test_ffmpeg_path(str(ffmpeg_path))
1240
- if r:
1241
- return True, str(ffmpeg_path)
1242
- else:
1243
- return False, "FFmpeg is not available"
1275
+ ffmpeg_executable = pl.Path("ffmpeg")
1276
+ elif sys.platform.startswith("win"):
1277
+ ffmpeg_executable = pl.Path("ffmpeg.exe")
1244
1278
 
1245
- if sys.platform.startswith("win"):
1246
- ffmpeg_path = pl.Path("")
1247
- # search embedded ffmpeg
1248
- if sys.argv[0].endswith("start_boris.py"):
1249
- ffmpeg_path = pl.Path(sys.argv[0]).resolve().parent / "boris" / "misc" / "ffmpeg.exe"
1250
- if sys.argv[0].endswith("__main__.py"):
1251
- ffmpeg_path = pl.Path(sys.argv[0]).resolve().parent / "misc" / "ffmpeg.exe"
1252
-
1253
- if not ffmpeg_path.is_file():
1254
- # search global ffmpeg
1255
- ffmpeg_path = "ffmpeg"
1256
-
1257
- # test ffmpeg
1258
- r, msg = test_ffmpeg_path(str(ffmpeg_path))
1259
- if r:
1260
- return True, str(ffmpeg_path)
1261
- else:
1262
- return False, "FFmpeg is not available"
1279
+ ffmpeg_path = pl.Path(__file__).parent / "misc" / ffmpeg_executable
1280
+
1281
+ if not ffmpeg_path.is_file():
1282
+ # search global ffmpeg
1283
+ ffmpeg_path = ffmpeg_executable
1284
+
1285
+ # test ffmpeg
1286
+ r, msg = test_ffmpeg_path(str(ffmpeg_path))
1287
+ if r:
1288
+ return True, str(ffmpeg_path)
1289
+ else:
1290
+ return False, "FFmpeg is not available"
1263
1291
 
1264
1292
 
1265
1293
  def smart_size_format(n: Union[float, int, str, None]) -> str:
@@ -1281,6 +1309,73 @@ def smart_size_format(n: Union[float, int, str, None]) -> str:
1281
1309
  return f"{n / 1_000_000_000:,.1f} Gb"
1282
1310
 
1283
1311
 
1312
+ def get_systeminfo() -> str:
1313
+ """
1314
+ returns info about the system
1315
+ """
1316
+
1317
+ mpv_lib_version_, mpv_lib_file_path, mpv_api_version = mpv_lib_version()
1318
+
1319
+ system_info = (
1320
+ f"BORIS version: {version.__version__}\n"
1321
+ f"OS: {platform.uname().system} {platform.uname().release} {platform.uname().version}\n"
1322
+ f"CPU: {platform.uname().machine} {platform.uname().processor}\n"
1323
+ f"Python {platform.python_version()} ({'64-bit' if sys.maxsize > 2**32 else '32-bit'})\n"
1324
+ f"Qt {qVersion()} - PySide {pyside6_version}\n"
1325
+ f"MPV library version: {mpv_lib_version_}\n"
1326
+ f"MPV API version: {mpv_api_version}\n"
1327
+ f"MPV library file path: {mpv_lib_file_path}\n\n"
1328
+ )
1329
+
1330
+ r, memory = mem_info()
1331
+ if not r:
1332
+ system_info += (
1333
+ f"Memory (RAM) Total: {memory.get('total_memory', 'Not available'):.2f} Mb "
1334
+ f"Free: {memory.get('free_memory', 'Not available'):.2f} Mb\n\n"
1335
+ )
1336
+
1337
+ return system_info
1338
+
1339
+ """
1340
+ # system info
1341
+ systeminfo = ""
1342
+ if sys.platform.startswith("win"):
1343
+ # systeminfo = subprocess.getoutput("systeminfo")
1344
+ systeminfo = subprocess.run("systeminfo /FO csv /NH", capture_output=True, text=True, encoding="mbcs", shell=True).stdout
1345
+
1346
+ import csv
1347
+ from io import StringIO
1348
+
1349
+ # Parse it as CSV
1350
+ f = StringIO(systeminfo)
1351
+ reader = csv.reader(f)
1352
+ parsed_data = list(reader)[0]
1353
+ # Print specific fields by index
1354
+ info_to_show = ""
1355
+ info_to_show += f"Computer Name: {parsed_data[0]}\n"
1356
+ info_to_show += f"OS Name: {parsed_data[1]}\n"
1357
+ info_to_show += f"OS Version: {parsed_data[2]}\n"
1358
+ info_to_show += f"System Manufacturer: {parsed_data[11]}\n"
1359
+ info_to_show += f"System Model: {parsed_data[12]}\n"
1360
+ info_to_show += f"Processor: {parsed_data[14]}\n"
1361
+ info_to_show += f"Locale: {parsed_data[19]}\n"
1362
+ info_to_show += f"Installed Memory: {parsed_data[22]}\n"
1363
+
1364
+ # info about graphic card
1365
+ graphic_info = subprocess.run(
1366
+ "wmic path win32_videocontroller get name", capture_output=True, text=True, encoding="mbcs", shell=True
1367
+ ).stdout
1368
+ info_to_show += graphic_info.replace("\n", "").replace("Name", "Graphic card model")
1369
+
1370
+ systeminfo = info_to_show
1371
+
1372
+ if sys.platform.startswith("linux"):
1373
+ systeminfo = subprocess.getoutput("cat /etc/*rel*; uname -a")
1374
+
1375
+ return systeminfo
1376
+ """
1377
+
1378
+
1284
1379
  def ffprobe_media_analysis(ffmpeg_bin: str, file_name: str) -> dict:
1285
1380
  """
1286
1381
  analyse video parameters with ffprobe (if available)
@@ -1436,8 +1531,8 @@ def accurate_media_analysis(ffmpeg_bin: str, file_name: str) -> dict:
1436
1531
 
1437
1532
  ffprobe_results = ffprobe_media_analysis(ffmpeg_bin, file_name)
1438
1533
 
1439
- logging.debug(f"file_name: {file_name}")
1440
- logging.debug(f"ffprobe_results: {ffprobe_results}")
1534
+ logger.debug(f"file_name: {file_name}")
1535
+ logger.debug(f"ffprobe_results: {ffprobe_results}")
1441
1536
 
1442
1537
  if ("error" not in ffprobe_results) and (ffprobe_results["bitrate"] is not None):
1443
1538
  return ffprobe_results
boris/version.py CHANGED
@@ -20,5 +20,5 @@ This file is part of BORIS.
20
20
 
21
21
  """
22
22
 
23
- __version__ = "9.3.4"
24
- __version_date__ = "2025-05-08"
23
+ __version__ = "9.4"
24
+ __version_date__ = "2025-05-15"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boris-behav-obs
3
- Version: 9.3.4
3
+ Version: 9.4
4
4
  Summary: BORIS - Behavioral Observation Research Interactive Software
5
5
  Author-email: Olivier Friard <olivier.friard@unito.it>
6
6
  License-Expression: GPL-3.0-only
@@ -1,6 +1,7 @@
1
+ boris/1.py,sha256=rb6Nstw1vIHlBwMnzExVOlgU2F75Tuf1VYRXBTrZUFg,1082
1
2
  boris/__init__.py,sha256=iAtmVMy22TJpMmxVTMSK_6-wXnCbx1ogvWgfYEcbHzU,773
2
3
  boris/__main__.py,sha256=ANjTbXgXDoz2nB1tCtOIllfIVotCa602iebACX7rXaE,764
3
- boris/about.py,sha256=KEUz6nryrg8FceVyFsf8sMz-xWd2cGwIUfuVydHxqC4,5366
4
+ boris/about.py,sha256=VPa8zeu0bMb1LRXDq8uUSG_7mSbkb2HTk1AtWbzWQwE,5366
4
5
  boris/add_modifier.py,sha256=DWqxkKDBm21QH_kPvhpnltwLtFvPxne0VmZ1SY26hj8,26340
5
6
  boris/add_modifier_ui.py,sha256=Y7TLO5uS6zW7zpjXmjA4V_VIp_bFDNtjOTbJ9Q6m-mQ,11601
6
7
  boris/advanced_event_filtering.py,sha256=VlvU12mL6xYacZOvJAi5uLpHMcmAw5Pvuvmka-PN29c,15469
@@ -10,22 +11,22 @@ boris/behaviors_coding_map.py,sha256=xIGJxp2eghrpiGDmYH73eJPERuyc4A_54uT-Got3zTs
10
11
  boris/boris_cli.py,sha256=n0OiVvZM1gM6E7yKaff9wlgmpAGK4TK052VRi8AabJo,13196
11
12
  boris/cmd_arguments.py,sha256=oWb-FvhKLbKJhATlTHy9muWu8XnnUfOZ-3Fmz2M8Yzc,1848
12
13
  boris/coding_pad.py,sha256=fBKdp7DDyupySJosIYtqNd8s2E-GruzCgVhDFsoVWKE,10986
13
- boris/config.py,sha256=rPfhmdE5XilliNjioC1KuDL_LNze4MZBDy_p0zK4tt8,17349
14
- boris/config_file.py,sha256=1-2ZmTvKET57rwrLR1dXblt0AxMpGB1LAiHxu-Sy8es,13543
14
+ boris/config.py,sha256=PQXm3gJgdCtPOFKLH65sDGw8sk_cdMP53p6eMrlRJl0,17457
15
+ boris/config_file.py,sha256=bPDDRjtylVJ2ll-FNRjME5iIsIagonZNFns-k9kGW2Q,13545
15
16
  boris/connections.py,sha256=rVI18AuXh8cEnnoCKJk0RMWAaiNOpiaS554Okgk3SBY,19383
16
- boris/converters.py,sha256=c1Jps-URoglY5ILQHz-pCCf6-4DFUHZLtqr_ofsrFg0,11722
17
+ boris/converters.py,sha256=n6gDM9x2hS-ZOoHLruiifuXxnC7ERsUukiFokhHZPoQ,11678
17
18
  boris/converters_ui.py,sha256=uu7LOBV_fKv2DBdOqsqPwjGsjgONr5ODBoscAA-EP48,9900
18
19
  boris/cooccurence.py,sha256=tVERC-V8MWjWHlGEfDuu08iS94qjt4do-38jwI62QaY,10367
19
- boris/core.py,sha256=EK19Xn0Z_sxu9TaqeRimMzzpn9ThZdTqUtlJJXz6pVY,233512
20
+ boris/core.py,sha256=jMZkM_VsFD-Yk6Q-8wApWZfo-JKvmvpQo5lY1H_k7Bc,231590
20
21
  boris/core_qrc.py,sha256=J0kom27nrmi4-TCDLJZCZbtUAitiXQ4WEDfErawuxt8,639879
21
22
  boris/core_ui.py,sha256=SeC26uveDCjrCBLsRPuQ6FaapKfON_HIRcQStEDLhl4,76384
22
23
  boris/db_functions.py,sha256=Uw9wWH_Pe-qNzpV1k21YG_jKsoOmfY_iiK_7ARZHGDc,13352
23
24
  boris/dev.py,sha256=9pUElbjl9g17rFUJXX5aVSu55_iIKIuDxNdrB0DI_d0,3671
24
- boris/dialog.py,sha256=AxqXiTNiNOM5Ec9hGQ54aSeG-0jN_rycQdxJvhM7XWg,34956
25
+ boris/dialog.py,sha256=LqZ73R9cwiL4qzKyMxeS2G8PKnbVZ0xFvZHw-oSek0M,34039
25
26
  boris/duration_widget.py,sha256=GjZgCAMGOcsNjoPiRImEVe6yMkH2vuNoh44ulpd5nlg,6924
26
- boris/edit_event.py,sha256=2hpxn9DYuJW1CK02hF4iU0--J_0C_KTiN9gGZ1frJBc,7678
27
- boris/edit_event_ui.py,sha256=vhglQrhkF9tt0HVlkXnkG7symW0eOFA7nhbk6l_qn3k,7772
28
- boris/event_operations.py,sha256=JNSK9zTbVaPSP2H4hGUtbygyBlFX4hmJXjOqKYRxKoc,38670
27
+ boris/edit_event.py,sha256=IMZnopPALNJHgGenl_kMZjqO_Q9GKtyEcyVq5w5VGyU,8001
28
+ boris/edit_event_ui.py,sha256=qFgt00cejGB6UGC1mFkyZcsIAdvMeYMK0WYjZtJl1T0,9207
29
+ boris/event_operations.py,sha256=bqUZjgJaJ1Z8oTiidG9wfCp2LLUH1Zf4kBDeg_yjC-o,38514
29
30
  boris/events_cursor.py,sha256=VPY_ygD0fxE5lp25mcd2l00XQXurCR6hprffF4tKRbU,2078
30
31
  boris/events_snapshots.py,sha256=PjWzQvUGQtIcEc_7FDsRphf7fAhhTccQgYc2eQSA65g,27621
31
32
  boris/exclusion_matrix.py,sha256=ff88xD6aqc8bpIuj9ZCz9ju_HeqqgibQwoaJrIOJ6RI,5272
@@ -46,8 +47,8 @@ boris/modifiers_coding_map.py,sha256=oT56ZY_PXhEJsMoblEsyNMAPbDpv7ZMOCnvmt7Ibx_Y
46
47
  boris/mpv-1.0.3.py,sha256=EXRtzQqFjOn4wMC6482Ilq3fNQ9N1GRP1VxwLzdeaBY,88077
47
48
  boris/mpv.py,sha256=EfzIHjPbgewG4w3smEtqEUPZoVwYmMQkL4Q8ZyW-a58,76410
48
49
  boris/mpv2.py,sha256=IUI4t4r9GYX7G5OXTjd3RhMMOkDdfal_15buBgksLsk,92152
49
- boris/observation.py,sha256=d-7q-RkMHuLDV87nF4yahvDFPYhlXp6GmE80vckn5zU,57073
50
- boris/observation_operations.py,sha256=5OLdnnzdlazhevJzalDMtXSxo9dRZOLN_5jVE54ZnKE,106039
50
+ boris/observation.py,sha256=PcyRjeWnDDniug-cJTr9tqfL0lfMQ02hMk4xY7ZxIvk,57029
51
+ boris/observation_operations.py,sha256=6krVy8PrxZ_EUHzUN9FA6Qy17v8QhayVt0uMOMlSDac,106603
51
52
  boris/observation_ui.py,sha256=DAnU94QBNvkLuHT6AxTwqSk_D_n6VUhSl8PexZv_dUk,33309
52
53
  boris/observations_list.py,sha256=NqwECGHtHYmKhSe-qCfqPmJ24SSfzlXvIXS2i3op_zE,10591
53
54
  boris/otx_parser.py,sha256=70QvilzFHXbjAHR88YH0aEXJ3xxheLS5fZGgHFHGpNE,16367
@@ -63,22 +64,22 @@ boris/plugins.py,sha256=CCS1I44OMkGZqcfLGKNPGfEQXPgngocy5YhWveXQPKM,10029
63
64
  boris/preferences.py,sha256=qPfd9Tyg7u30kXwVqMOgkdy2RXri9bItRa5U2-ZVQmg,16847
64
65
  boris/preferences_ui.py,sha256=D2bFLb3E0m6IwSeqKoItRDiqvPmJGoeXLHF2K02n1Zo,26293
65
66
  boris/project.py,sha256=nyXfCDY_rLP3jC1QGv-280jUKgbABqESjOm7I19rJ1U,86432
66
- boris/project_functions.py,sha256=eP-YEjoFvZXEPuzNPBeXsRDYurt0wHP6B09a8k8SlDc,80792
67
+ boris/project_functions.py,sha256=7Pf-u7rPKQGWxO2AwLuR4WljxOpuoH6bxsAEkttPCzw,80794
67
68
  boris/project_import_export.py,sha256=oBG1CSXfKISsb3TLNT-8BH8kZPAzxIYSNemlLVH1Lh8,38560
68
69
  boris/project_ui.py,sha256=yB-ewhHt8S8DTTRIk-dNK2tPMNU24lNji9fDW_Xazu8,38805
69
70
  boris/qrc_boris.py,sha256=aH-qUirYY1CGxmTK1SFCPvuZfazIHX4DdUKF1gxZeYM,675008
70
71
  boris/qrc_boris5.py,sha256=prnOw7VGXWXRuVCYp_yIrmWhrlG1F9rx-3BQvkPenjY,161608
71
72
  boris/select_modifiers.py,sha256=42uG9F75pfPoPJ-blp-vFgmpBpVJtL42FlIxpNpq9z4,13319
72
- boris/select_observations.py,sha256=HM0suMes1YxVwQ-Xakw7ROaxbN0EyeSiZFZNrTQIHAA,7886
73
+ boris/select_observations.py,sha256=k7c3FNVQW74YGH9oFmtHXRVCRnpKGhjCVk3cQtyLML8,8027
73
74
  boris/select_subj_behav.py,sha256=ulXbsRY-AIyQRSwXhVlvkNRS_eqWaCvkDKTTyOLqvoE,11742
74
- boris/state_events.py,sha256=R5CcT_cldnxqhQkvX_V1AMNxH0Nc6jLzMZYiWkeJwAE,7770
75
+ boris/state_events.py,sha256=Vrxn3CxC3yf8aeFE76l24n03qgaQ1QXpMtprYT0pq64,7771
75
76
  boris/subjects_pad.py,sha256=lSRRGfLfD10_YpGua8RGVdKhoXlsXawGhNibPkRhuzM,3541
76
77
  boris/synthetic_time_budget.py,sha256=3Eb9onMLmgqCLd50CuxV9L8RV2ESzfaMWvPK_bXUMMk,10489
77
78
  boris/time_budget_functions.py,sha256=y5He8crz0xsTxVfz0jATwFFQVnPAIrNHja_0sF6NtRE,52551
78
79
  boris/time_budget_widget.py,sha256=z-tyITBtIz-KH1H2OdMB5a8x9QQLK7Wu96-zkC6NVDA,43213
79
80
  boris/transitions.py,sha256=_aZJfJWv3EBrtmQ7qsdTCayQo6uWU7BXqtQQgflEhr4,12250
80
- boris/utilities.py,sha256=4b3BjO96eR54sPXIYkHwxkUnROGgY5f5vhWKIy8THUo,52646
81
- boris/version.py,sha256=st-9YZePMhFx60fiF0uKR_IhGjVv4ik2D_Td5O2XQr0,787
81
+ boris/utilities.py,sha256=suquxdukTUscCy2M3fbR2-OcFtf_vrx4HcQD3i18XYo,56502
82
+ boris/version.py,sha256=elwA5lNbiLkILJCCD7leDvgwYJgZb2gk3T__Uou8fSE,785
82
83
  boris/video_equalizer.py,sha256=FartoGghFK-T53zklP70rPKYqTuzL8qdvfGlsOF2wwc,5854
83
84
  boris/video_equalizer_ui.py,sha256=1CG3s79eM4JAbaCx3i1ILZXLceb41_gGXlOLNfpBgnw,10142
84
85
  boris/video_operations.py,sha256=mh3iR__Sm2KnV44L_sW2pOo3AgLwlM7wiTnnqQiAVs4,9381
@@ -96,9 +97,9 @@ boris/portion/dict.py,sha256=SyHxc7PfDw2ufNLFQycwJtzmRfL48rDp4UrM2KN7IWc,11282
96
97
  boris/portion/func.py,sha256=3TkQtFKLfsqntwd27HSGHceFhnXHmT-EbNMqktElC5Q,2174
97
98
  boris/portion/interval.py,sha256=bAdUiJjGeUAPgsBAImwNeviiwfQq5odfhFZccAWzOTA,20299
98
99
  boris/portion/io.py,sha256=ppNeRpiLNrocF1yzGeuEUIhYMf2LfsR-cji3d0nmvUs,6371
99
- boris_behav_obs-9.3.4.dist-info/licenses/LICENSE.TXT,sha256=WJ7YI-moTFb-uVrFjnzzhGJrnL9P2iqQe8NuED3hutI,35141
100
- boris_behav_obs-9.3.4.dist-info/METADATA,sha256=G03KB1bA9U-pdA0egf0dsvhkvRG2O3jQZudOyEdjfyA,4514
101
- boris_behav_obs-9.3.4.dist-info/WHEEL,sha256=oSJJyWjO7Z2XSScFQUpXG1HL-N0sFMqqeKVVbZTPkWc,109
102
- boris_behav_obs-9.3.4.dist-info/entry_points.txt,sha256=k__8XvFi4vaA4QFvQehCZjYkKmZH34HSAJI2iYCWrMs,52
103
- boris_behav_obs-9.3.4.dist-info/top_level.txt,sha256=fJSgm62S7WesiwTorGbOO4nNN0yzgZ3klgfGi3Px4qI,6
104
- boris_behav_obs-9.3.4.dist-info/RECORD,,
100
+ boris_behav_obs-9.4.dist-info/licenses/LICENSE.TXT,sha256=WJ7YI-moTFb-uVrFjnzzhGJrnL9P2iqQe8NuED3hutI,35141
101
+ boris_behav_obs-9.4.dist-info/METADATA,sha256=R-ofdWjXC79DgAjKwE-GeB8n_rJBD9uUSnvdo3_3SmI,4512
102
+ boris_behav_obs-9.4.dist-info/WHEEL,sha256=_z0Kb-VmhLeNt2nZ-PsoQBjD25rP0tBwgAyRYD7oTKI,109
103
+ boris_behav_obs-9.4.dist-info/entry_points.txt,sha256=k__8XvFi4vaA4QFvQehCZjYkKmZH34HSAJI2iYCWrMs,52
104
+ boris_behav_obs-9.4.dist-info/top_level.txt,sha256=fJSgm62S7WesiwTorGbOO4nNN0yzgZ3klgfGi3Px4qI,6
105
+ boris_behav_obs-9.4.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.3.1)
2
+ Generator: setuptools (80.7.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any