boris-behav-obs 8.27.6__tar.gz → 8.27.8__tar.gz

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.
Files changed (130) hide show
  1. {boris_behav_obs-8.27.6/boris_behav_obs.egg-info → boris_behav_obs-8.27.8}/PKG-INFO +3 -3
  2. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/README.rst +2 -2
  3. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/core.py +1 -1
  4. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/mpv2.py +2 -0
  5. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/player_dock_widget.py +1 -1
  6. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/preferences.py +2 -2
  7. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/project.py +23 -5
  8. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/project_functions.py +19 -10
  9. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/utilities.py +13 -0
  10. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/version.py +2 -2
  11. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8/boris_behav_obs.egg-info}/PKG-INFO +3 -3
  12. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/pyproject.toml +2 -2
  13. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/LICENSE.TXT +0 -0
  14. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/MANIFEST.in +0 -0
  15. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/README.TXT +0 -0
  16. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/__init__.py +0 -0
  17. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/__main__.py +0 -0
  18. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/about.py +0 -0
  19. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/add_modifier.py +0 -0
  20. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/add_modifier_ui.py +0 -0
  21. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/advanced_event_filtering.py +0 -0
  22. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/behav_coding_map_creator.py +0 -0
  23. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/behavior_binary_table.py +0 -0
  24. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/behaviors_coding_map.py +0 -0
  25. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/boris_cli.py +0 -0
  26. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/cmd_arguments.py +0 -0
  27. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/coding_pad.py +0 -0
  28. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/config.py +0 -0
  29. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/config_file.py +0 -0
  30. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/connections.py +0 -0
  31. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/converters.py +0 -0
  32. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/converters_ui.py +0 -0
  33. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/cooccurence.py +0 -0
  34. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/core_qrc.py +0 -0
  35. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/core_ui.py +0 -0
  36. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/db_functions.py +0 -0
  37. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/dev.py +0 -0
  38. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/dialog.py +0 -0
  39. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/duration_widget.py +0 -0
  40. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/edit_event.py +0 -0
  41. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/edit_event_ui.py +0 -0
  42. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/event_operations.py +0 -0
  43. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/events_cursor.py +0 -0
  44. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/events_snapshots.py +0 -0
  45. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/exclusion_matrix.py +0 -0
  46. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/export_events.py +0 -0
  47. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/export_observation.py +0 -0
  48. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/external_processes.py +0 -0
  49. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/geometric_measurement.py +0 -0
  50. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/gui_utilities.py +0 -0
  51. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/image_overlay.py +0 -0
  52. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/import_observations.py +0 -0
  53. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/irr.py +0 -0
  54. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/latency.py +0 -0
  55. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/map_creator.py +0 -0
  56. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/measurement_widget.py +0 -0
  57. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/media_file.py +0 -0
  58. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/menu_options.py +0 -0
  59. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/modifiers_coding_map.py +0 -0
  60. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/mpv-1.0.3.py +0 -0
  61. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/mpv.py +0 -0
  62. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/observation.py +0 -0
  63. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/observation_operations.py +0 -0
  64. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/observation_ui.py +0 -0
  65. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/observations_list.py +0 -0
  66. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/otx_parser.py +0 -0
  67. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/param_panel.py +0 -0
  68. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/param_panel_ui.py +0 -0
  69. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/plot_data_module.py +0 -0
  70. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/plot_events.py +0 -0
  71. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/plot_events_rt.py +0 -0
  72. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/plot_spectrogram_rt.py +0 -0
  73. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/plot_waveform_rt.py +0 -0
  74. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/portion/__init__.py +0 -0
  75. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/portion/const.py +0 -0
  76. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/portion/dict.py +0 -0
  77. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/portion/func.py +0 -0
  78. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/portion/interval.py +0 -0
  79. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/portion/io.py +0 -0
  80. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/preferences_ui.py +0 -0
  81. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/project_import_export.py +0 -0
  82. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/project_ui.py +0 -0
  83. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qdarkstyle/__init__.py +0 -0
  84. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qdarkstyle/__main__.py +0 -0
  85. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qdarkstyle/colorsystem.py +0 -0
  86. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qdarkstyle/dark/__init__.py +0 -0
  87. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qdarkstyle/dark/darkstyle_rc.py +0 -0
  88. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qdarkstyle/dark/palette.py +0 -0
  89. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qdarkstyle/example/__init__.py +0 -0
  90. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qdarkstyle/example/__main__.py +0 -0
  91. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qdarkstyle/example/ui/__init__.py +0 -0
  92. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qdarkstyle/light/__init__.py +0 -0
  93. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qdarkstyle/light/lightstyle_rc.py +0 -0
  94. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qdarkstyle/light/palette.py +0 -0
  95. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qdarkstyle/palette.py +0 -0
  96. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qdarkstyle/utils/__init__.py +0 -0
  97. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qdarkstyle/utils/__main__.py +0 -0
  98. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qdarkstyle/utils/images.py +0 -0
  99. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qdarkstyle/utils/scss.py +0 -0
  100. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qrc_boris.py +0 -0
  101. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/qrc_boris5.py +0 -0
  102. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/select_modifiers.py +0 -0
  103. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/select_observations.py +0 -0
  104. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/select_subj_behav.py +0 -0
  105. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/state_events.py +0 -0
  106. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/subjects_pad.py +0 -0
  107. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/synthetic_time_budget.py +0 -0
  108. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/time_budget_functions.py +0 -0
  109. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/time_budget_widget.py +0 -0
  110. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/transitions.py +0 -0
  111. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/video_equalizer.py +0 -0
  112. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/video_equalizer_ui.py +0 -0
  113. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/video_operations.py +0 -0
  114. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/vlc_local.py +0 -0
  115. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris/write_event.py +0 -0
  116. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris_behav_obs.egg-info/SOURCES.txt +0 -0
  117. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris_behav_obs.egg-info/dependency_links.txt +0 -0
  118. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris_behav_obs.egg-info/entry_points.txt +0 -0
  119. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris_behav_obs.egg-info/requires.txt +0 -0
  120. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/boris_behav_obs.egg-info/top_level.txt +0 -0
  121. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/setup.cfg +0 -0
  122. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/tests/test_db_functions.py +0 -0
  123. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/tests/test_export_observation.py +0 -0
  124. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/tests/test_irr.py +0 -0
  125. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/tests/test_observation_gui.py +0 -0
  126. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/tests/test_otx_parser.py +0 -0
  127. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/tests/test_preferences_gui.py +0 -0
  128. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/tests/test_project_functions.py +0 -0
  129. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/tests/test_time_budget.py +0 -0
  130. {boris_behav_obs-8.27.6 → boris_behav_obs-8.27.8}/tests/test_utilities.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: boris-behav-obs
3
- Version: 8.27.6
3
+ Version: 8.27.8
4
4
  Summary: BORIS - Behavioral Observation Research Interactive Software
5
5
  Author-email: Olivier Friard <olivier.friard@unito.it>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -720,11 +720,11 @@ BORIS (Behavioral Observation Research Interactive Software)
720
720
  BORIS is an easy-to-use event logging software for video/audio coding or live observations.
721
721
 
722
722
  BORIS is a free and open-source software available for GNU/Linux and Windows.
723
- You can not longer run BORIS natively on MacOS (since v.8). Some alternatives to run the last version of BORIS are available, see `BORIS on MacOS <http://www.boris.unito.it/pages/download_mac>`_.
723
+ You can not longer run BORIS natively on MacOS (since v.8). Some alternatives to run the last version of BORIS are available, see `BORIS on MacOS <https://www.boris.unito.it/download_mac/>`_.
724
724
 
725
725
  It provides also some analysis tools like time budget and some plotting functions.
726
726
 
727
- The BORIS paper has more than `1700 citations in peer-reviewed scientific publications <http://www.boris.unito.it/pages/citations.html>`_.
727
+ The BORIS paper has more than `1700 citations in peer-reviewed scientific publications <https://www.boris.unito.it/citations/>`_.
728
728
 
729
729
  See http://www.boris.unito.it
730
730
 
@@ -9,11 +9,11 @@ BORIS (Behavioral Observation Research Interactive Software)
9
9
  BORIS is an easy-to-use event logging software for video/audio coding or live observations.
10
10
 
11
11
  BORIS is a free and open-source software available for GNU/Linux and Windows.
12
- You can not longer run BORIS natively on MacOS (since v.8). Some alternatives to run the last version of BORIS are available, see `BORIS on MacOS <http://www.boris.unito.it/pages/download_mac>`_.
12
+ You can not longer run BORIS natively on MacOS (since v.8). Some alternatives to run the last version of BORIS are available, see `BORIS on MacOS <https://www.boris.unito.it/download_mac/>`_.
13
13
 
14
14
  It provides also some analysis tools like time budget and some plotting functions.
15
15
 
16
- The BORIS paper has more than `1700 citations in peer-reviewed scientific publications <http://www.boris.unito.it/pages/citations.html>`_.
16
+ The BORIS paper has more than `1700 citations in peer-reviewed scientific publications <https://www.boris.unito.it/citations/>`_.
17
17
 
18
18
  See http://www.boris.unito.it
19
19
 
@@ -472,7 +472,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
472
472
  """
473
473
  allow to block Qdockwidgets on main window because they can have a strange behavior specially on Mac
474
474
  """
475
- for w in [self.dwEvents, self.dwEthogram, self.dwSubjects]:
475
+ for w in (self.dwEvents, self.dwEthogram, self.dwSubjects):
476
476
  if self.action_block_dockwidgets.isChecked():
477
477
  w.setFloating(False)
478
478
  w.setFeatures(QDockWidget.NoDockWidgetFeatures)
@@ -868,6 +868,8 @@ class MPV(object):
868
868
  Extra arguments and extra keyword arguments will be passed to mpv as options.
869
869
  """
870
870
 
871
+ print(f"{extra_mpv_flags=}")
872
+
871
873
  self.handle = _mpv_create()
872
874
  self._event_thread = None
873
875
  self._core_shutdown = False
@@ -117,7 +117,7 @@ class DW_player(QDockWidget):
117
117
 
118
118
  self.player = mpv.MPV(
119
119
  wid=str(int(self.videoframe.winId())),
120
- # vo='x11', # You may not need this
120
+ vo="x11" if sys.platform.startswith("linux") else "",
121
121
  log_handler=functools.partial(mpv_logger, self.id_),
122
122
  loglevel="debug",
123
123
  )
@@ -146,7 +146,7 @@ def preferences(self):
146
146
  cfg.MPV_HWDEC_OPTIONS.index(self.config_param.get(cfg.MPV_HWDEC, cfg.MPV_HWDEC_DEFAULT_VALUE))
147
147
  )
148
148
  except Exception:
149
- preferencesWindow.cb_hwdec.setCurrentIndex(cfg.MPV_HWDEC_DEFAULT_VALUE)
149
+ preferencesWindow.cb_hwdec.setCurrentIndex(cfg.MPV_HWDEC_OPTIONS.index(cfg.MPV_HWDEC_DEFAULT_VALUE))
150
150
 
151
151
  # PROJET FILE INDENTATION
152
152
  preferencesWindow.combo_project_file_indentation.clear()
@@ -286,7 +286,7 @@ def preferences(self):
286
286
  # interface
287
287
  self.config_param[cfg.TOOLBAR_ICON_SIZE] = preferencesWindow.sb_toolbar_icon_size.value()
288
288
  self.config_param[cfg.DARK_MODE] = preferencesWindow.cb_darkmode.isChecked()
289
- if self.config_param[cfg.DARK_MODE]:
289
+ if self.config_param.get(cfg.DARK_MODE, cfg.DEFAULT_FRAME_MODE):
290
290
  self.setStyleSheet(qdarkstyle.load_stylesheet(qt_api="pyqt5"))
291
291
  else:
292
292
  self.setStyleSheet("")
@@ -430,7 +430,7 @@ class projectDialog(QDialog, Ui_dlgProject):
430
430
  """
431
431
  return a color for the not editable column
432
432
  """
433
- if self.config_param[cfg.DARK_MODE]:
433
+ if self.config_param.get(cfg.DARK_MODE, cfg.DEFAULT_FRAME_MODE):
434
434
  return QColor(55, 65, 79)
435
435
  else:
436
436
  return QColor(230, 230, 230)
@@ -730,7 +730,7 @@ class projectDialog(QDialog, Ui_dlgProject):
730
730
  behavioral categories manager
731
731
  """
732
732
 
733
- bc = BehavioralCategories(self.pj, self.config_param[cfg.DARK_MODE])
733
+ bc = BehavioralCategories(self.pj, self.config_param.get(cfg.DARK_MODE, cfg.DEFAULT_FRAME_MODE))
734
734
 
735
735
  if bc.exec_():
736
736
  self.pj[cfg.BEHAVIORAL_CATEGORIES] = []
@@ -1836,10 +1836,9 @@ class projectDialog(QDialog, Ui_dlgProject):
1836
1836
  # check subjects
1837
1837
  for row in range(self.twSubjects.rowCount()):
1838
1838
  # check key
1839
+ key: str = ""
1839
1840
  if self.twSubjects.item(row, 0):
1840
1841
  key = self.twSubjects.item(row, 0).text()
1841
- else:
1842
- key = ""
1843
1842
 
1844
1843
  # check subject name
1845
1844
  if self.twSubjects.item(row, 1):
@@ -1865,7 +1864,7 @@ class projectDialog(QDialog, Ui_dlgProject):
1865
1864
  return
1866
1865
 
1867
1866
  # description
1868
- subjectDescription = ""
1867
+ subjectDescription: str = ""
1869
1868
  if self.twSubjects.item(row, 2):
1870
1869
  subjectDescription = self.twSubjects.item(row, 2).text().strip()
1871
1870
 
@@ -1875,6 +1874,25 @@ class projectDialog(QDialog, Ui_dlgProject):
1875
1874
  "description": subjectDescription,
1876
1875
  }
1877
1876
 
1877
+ # check if coded subjects are defined in the subjects list
1878
+ subjects_list: list = [self.subjects_conf[x]["name"] for x in self.subjects_conf]
1879
+ coded_subjects = set(
1880
+ util.flatten_list([[y[1] for y in self.pj[cfg.OBSERVATIONS][x].get(cfg.EVENTS, [])] for x in self.pj[cfg.OBSERVATIONS]])
1881
+ )
1882
+
1883
+ not_defined_subjects: list = []
1884
+ for subject in coded_subjects:
1885
+ if subject and subject not in subjects_list:
1886
+ not_defined_subjects.append(subject)
1887
+
1888
+ if not_defined_subjects:
1889
+ QMessageBox.warning(
1890
+ self,
1891
+ cfg.programName,
1892
+ f"The coded subject(s) <b>{', '.join(not_defined_subjects)}</b> is/are not defined in the subjects list.<br>You can use the <b>Explore project</b> to fix it.",
1893
+ )
1894
+ return
1895
+
1878
1896
  self.pj[cfg.SUBJECTS] = dict(self.subjects_conf)
1879
1897
 
1880
1898
  # check ethogram
@@ -379,15 +379,16 @@ def check_project_integrity(
379
379
  media_file_available: bool = True,
380
380
  ) -> str:
381
381
  """
382
- check project integrity
383
- check if behaviors in observations are in ethogram
384
- check unpaired state events
385
- check if timestamp between -2147483647 and 2147483647 (2**31 - 1)
386
- check if behavior belong to behavioral category that do not more exist
387
- check for leading and trailing spaces and special chars in modifiers
388
- check if media file are available
389
- check if media length available
390
- check independent variables
382
+ check project integrity:
383
+ * check if coded behaviors are defined in ethogram
384
+ * check unpaired state events
385
+ * check if timestamp between -2147483647 and 2147483647 (2**31 - 1)
386
+ * check if behavior belong to behavioral category that do not more exist
387
+ * check for leading and trailing spaces and special chars in modifiers
388
+ * check if media file are available (optional)
389
+ * check if media length available
390
+ * check independent variables
391
+ * check if coded subjects are defines
391
392
 
392
393
  Args:
393
394
  pj (dict): BORIS project
@@ -398,7 +399,7 @@ def check_project_integrity(
398
399
  Returns:
399
400
  str: message
400
401
  """
401
- out = ""
402
+ out: str = ""
402
403
 
403
404
  # check if coded behaviors are defined in ethogram
404
405
  r = check_coded_behaviors(pj)
@@ -521,6 +522,14 @@ def check_project_integrity(
521
522
  f" is not allowed for {var_label} (choose between {defined_set_var_label[var_label]})<br>"
522
523
  )
523
524
 
525
+ # check if coded subjects are defined in the subjects list
526
+ subjects_list: list = [pj[cfg.SUBJECTS][x]["name"] for x in pj[cfg.SUBJECTS]]
527
+ coded_subjects = set(util.flatten_list([[y[1] for y in pj[cfg.OBSERVATIONS][x].get(cfg.EVENTS, [])] for x in pj[cfg.OBSERVATIONS]]))
528
+
529
+ for subject in coded_subjects:
530
+ if subject and subject not in subjects_list:
531
+ out += f"The coded subject <b>{subject}</b> is not defined in the subjects list.<br>You can use the <b>Explore project</b> to fix it.<br><br>"
532
+
524
533
  return out
525
534
 
526
535
 
@@ -505,6 +505,19 @@ def group_events(pj: dict, obs_id: str, include_modifiers: bool = False) -> dict
505
505
  return {"error": ""}
506
506
 
507
507
 
508
+ def flatten_list(nested_list) -> list:
509
+ """
510
+ Flatten a list of lists.
511
+ """
512
+ flattened: list = []
513
+ for item in nested_list:
514
+ if isinstance(item, list):
515
+ flattened.extend(flatten_list(item))
516
+ else:
517
+ flattened.append(item)
518
+ return flattened
519
+
520
+
508
521
  def get_current_states_modifiers_by_subject(
509
522
  state_behaviors_codes: list, events: list, subjects: dict, time_: dec, include_modifiers: bool = False
510
523
  ) -> dict:
@@ -20,5 +20,5 @@ This file is part of BORIS.
20
20
 
21
21
  """
22
22
 
23
- __version__ = "8.27.6"
24
- __version_date__ = "2024-08-21"
23
+ __version__ = "8.27.8"
24
+ __version_date__ = "2024-08-26"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: boris-behav-obs
3
- Version: 8.27.6
3
+ Version: 8.27.8
4
4
  Summary: BORIS - Behavioral Observation Research Interactive Software
5
5
  Author-email: Olivier Friard <olivier.friard@unito.it>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -720,11 +720,11 @@ BORIS (Behavioral Observation Research Interactive Software)
720
720
  BORIS is an easy-to-use event logging software for video/audio coding or live observations.
721
721
 
722
722
  BORIS is a free and open-source software available for GNU/Linux and Windows.
723
- You can not longer run BORIS natively on MacOS (since v.8). Some alternatives to run the last version of BORIS are available, see `BORIS on MacOS <http://www.boris.unito.it/pages/download_mac>`_.
723
+ You can not longer run BORIS natively on MacOS (since v.8). Some alternatives to run the last version of BORIS are available, see `BORIS on MacOS <https://www.boris.unito.it/download_mac/>`_.
724
724
 
725
725
  It provides also some analysis tools like time budget and some plotting functions.
726
726
 
727
- The BORIS paper has more than `1700 citations in peer-reviewed scientific publications <http://www.boris.unito.it/pages/citations.html>`_.
727
+ The BORIS paper has more than `1700 citations in peer-reviewed scientific publications <https://www.boris.unito.it/citations/>`_.
728
728
 
729
729
  See http://www.boris.unito.it
730
730
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "boris-behav-obs"
3
- version = "8.27.6"
3
+ version = "8.27.8"
4
4
  description = "BORIS - Behavioral Observation Research Interactive Software"
5
5
  authors = [{ name="Olivier Friard", email="olivier.friard@unito.it" }]
6
6
  readme = "README.rst"
@@ -58,7 +58,7 @@ line-length = 140
58
58
  exclude = ["*_ui.py", "mpv*"]
59
59
 
60
60
  [tool.bumpver]
61
- current_version = "8.27.6"
61
+ current_version = "8.27.8"
62
62
  version_pattern = "MAJOR.MINOR.PATCH"
63
63
 
64
64