boris-behav-obs 9.6.2__tar.gz → 9.6.3__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 (126) hide show
  1. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/PKG-INFO +11 -8
  2. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/README.md +9 -6
  3. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/analysis_plugins/time_budget.py +0 -4
  4. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/behav_coding_map_creator.py +0 -1
  5. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/coding_pad.py +0 -2
  6. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/core.py +9 -24
  7. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/db_functions.py +4 -4
  8. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/edit_event.py +0 -9
  9. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/export_events.py +63 -71
  10. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/gui_utilities.py +0 -1
  11. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/modifier_coding_map_creator.py +0 -2
  12. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/observation_operations.py +2 -4
  13. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/param_panel.py +0 -4
  14. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/plot_spectrogram_rt.py +2 -1
  15. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/plot_waveform_rt.py +2 -1
  16. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/time_budget_functions.py +0 -9
  17. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/version.py +2 -2
  18. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/video_equalizer.py +0 -2
  19. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/view_df.py +0 -2
  20. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/write_event.py +0 -9
  21. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris_behav_obs.egg-info/PKG-INFO +11 -8
  22. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris_behav_obs.egg-info/requires.txt +1 -1
  23. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/pyproject.toml +2 -2
  24. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/LICENSE.TXT +0 -0
  25. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/MANIFEST.in +0 -0
  26. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/README.TXT +0 -0
  27. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/__init__.py +0 -0
  28. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/__main__.py +0 -0
  29. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/about.py +0 -0
  30. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/add_modifier.py +0 -0
  31. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/add_modifier_ui.py +0 -0
  32. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/advanced_event_filtering.py +0 -0
  33. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/analysis_plugins/__init__.py +0 -0
  34. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/analysis_plugins/_latency.py +0 -0
  35. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/analysis_plugins/irr_cohen_kappa.py +0 -0
  36. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/analysis_plugins/irr_cohen_kappa_with_modifiers.py +0 -0
  37. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/analysis_plugins/irr_weighted_cohen_kappa.py +0 -0
  38. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/analysis_plugins/irr_weighted_cohen_kappa_with_modifiers.py +0 -0
  39. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/analysis_plugins/list_of_dataframe_columns.py +0 -0
  40. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/analysis_plugins/number_of_occurences.py +0 -0
  41. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/analysis_plugins/number_of_occurences_by_independent_variable.py +0 -0
  42. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/behavior_binary_table.py +0 -0
  43. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/behaviors_coding_map.py +0 -0
  44. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/boris_cli.py +0 -0
  45. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/cmd_arguments.py +0 -0
  46. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/config.py +0 -0
  47. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/config_file.py +0 -0
  48. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/connections.py +0 -0
  49. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/converters.py +0 -0
  50. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/converters_ui.py +0 -0
  51. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/cooccurence.py +0 -0
  52. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/core_qrc.py +0 -0
  53. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/core_ui.py +0 -0
  54. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/dev.py +0 -0
  55. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/dialog.py +0 -0
  56. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/duration_widget.py +0 -0
  57. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/edit_event_ui.py +0 -0
  58. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/event_operations.py +0 -0
  59. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/events_cursor.py +0 -0
  60. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/events_snapshots.py +0 -0
  61. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/exclusion_matrix.py +0 -0
  62. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/export_observation.py +0 -0
  63. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/external_processes.py +0 -0
  64. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/geometric_measurement.py +0 -0
  65. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/image_overlay.py +0 -0
  66. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/import_observations.py +0 -0
  67. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/irr.py +0 -0
  68. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/latency.py +0 -0
  69. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/measurement_widget.py +0 -0
  70. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/media_file.py +0 -0
  71. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/menu_options.py +0 -0
  72. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/modifiers_coding_map.py +0 -0
  73. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/mpv-1.0.3.py +0 -0
  74. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/mpv.py +0 -0
  75. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/mpv2.py +0 -0
  76. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/observation.py +0 -0
  77. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/observation_ui.py +0 -0
  78. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/observations_list.py +0 -0
  79. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/otx_parser.py +0 -0
  80. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/param_panel_ui.py +0 -0
  81. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/player_dock_widget.py +0 -0
  82. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/plot_data_module.py +0 -0
  83. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/plot_events.py +0 -0
  84. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/plot_events_rt.py +0 -0
  85. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/plugins.py +0 -0
  86. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/portion/__init__.py +0 -0
  87. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/portion/const.py +0 -0
  88. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/portion/dict.py +0 -0
  89. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/portion/func.py +0 -0
  90. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/portion/interval.py +0 -0
  91. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/portion/io.py +0 -0
  92. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/preferences.py +0 -0
  93. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/preferences_ui.py +0 -0
  94. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/project.py +0 -0
  95. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/project_functions.py +0 -0
  96. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/project_import_export.py +0 -0
  97. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/project_ui.py +0 -0
  98. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/qrc_boris.py +0 -0
  99. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/qrc_boris5.py +0 -0
  100. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/select_modifiers.py +0 -0
  101. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/select_observations.py +0 -0
  102. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/select_subj_behav.py +0 -0
  103. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/state_events.py +0 -0
  104. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/subjects_pad.py +0 -0
  105. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/synthetic_time_budget.py +0 -0
  106. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/time_budget_widget.py +0 -0
  107. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/transitions.py +0 -0
  108. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/utilities.py +0 -0
  109. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/video_equalizer_ui.py +0 -0
  110. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/video_operations.py +0 -0
  111. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris/view_df_ui.py +0 -0
  112. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris_behav_obs.egg-info/SOURCES.txt +0 -0
  113. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris_behav_obs.egg-info/dependency_links.txt +0 -0
  114. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris_behav_obs.egg-info/entry_points.txt +0 -0
  115. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/boris_behav_obs.egg-info/top_level.txt +0 -0
  116. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/setup.cfg +0 -0
  117. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/tests/test_db_functions.py +0 -0
  118. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/tests/test_export_observation.py +0 -0
  119. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/tests/test_irr.py +0 -0
  120. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/tests/test_observation_gui.py +0 -0
  121. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/tests/test_otx_parser.py +0 -0
  122. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/tests/test_preferences_gui.py +0 -0
  123. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/tests/test_project_functions.py +0 -0
  124. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/tests/test_time_budget.py +0 -0
  125. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/tests/test_utilities.py +0 -0
  126. {boris_behav_obs-9.6.2 → boris_behav_obs-9.6.3}/tests/test_utilities2.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boris-behav-obs
3
- Version: 9.6.2
3
+ Version: 9.6.3
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
@@ -19,7 +19,7 @@ Requires-Python: >=3.12
19
19
  Description-Content-Type: text/markdown
20
20
  License-File: LICENSE.TXT
21
21
  Requires-Dist: exifread>=3.0.0
22
- Requires-Dist: numpy>=1.26.4
22
+ Requires-Dist: numpy==2.3.2
23
23
  Requires-Dist: matplotlib>=3.3.3
24
24
  Requires-Dist: pandas>=2.2.2
25
25
  Requires-Dist: tablib[cli,html,ods,pandas,xls,xlsx]>=3
@@ -49,7 +49,7 @@ You can not longer run BORIS natively on MacOS (since v.8). Some alternatives to
49
49
 
50
50
  It provides also some analysis tools like time budget and some plotting functions.
51
51
 
52
- The BORIS paper has more than [![BORIS citations counter](http://penelope.unito.it/friard/boris_scopus_citations.png) citations](https://www.boris.unito.it/citations) in peer-reviewed scientific publications.
52
+ The BORIS paper has more than [![BORIS citations counter](https://penelope.unito.it/friard/boris_scopus_citations.png) citations](https://www.boris.unito.it/citations) in peer-reviewed scientific publications.
53
53
 
54
54
 
55
55
 
@@ -59,13 +59,17 @@ See the official [BORIS web site](https://www.boris.unito.it).
59
59
  [![Python web site](https://img.shields.io/badge/Made%20with-Python-1f425f.svg)](https://www.python.org)
60
60
  ![Python versions](https://img.shields.io/pypi/pyversions/boris-behav-obs)
61
61
  ![BORIS license](https://img.shields.io/pypi/l/boris-behav-obs)
62
+ [![PyPI version](https://img.shields.io/pypi/v/boris-behav-obs.svg)](https://pypi.org/project/boris-behav-obs/)
63
+
62
64
  [![Number of downloads](https://static.pepy.tech/personalized-badge/boris-behav-obs?period=total&units=international_system&left_color=black&right_color=orange&left_text=Downloads)](https://pepy.tech/project/boris-behav-obs)
63
65
  ![commit-activity](https://img.shields.io/github/commit-activity/m/olivierfriard/BORIS)
64
- [![PyPI version](https://img.shields.io/pypi/v/boris-behav-obs.svg)](https://pypi.org/project/boris-behav-obs/)
65
- ![BORIS scopus citations badge](http://penelope.unito.it/friard/boris_scopus_citations.svg)
66
+ ![GitHub last commit](https://img.shields.io/github/last-commit/olivierfriard/BORIS)
66
67
 
68
+ ![BORIS scopus citations badge](https://penelope.unito.it/friard/boris_scopus_citations.svg)
67
69
 
68
70
 
71
+ ![GitHub Repo stars](https://img.shields.io/github/stars/olivierfriard/BORIS?style=flat&label=Stars)
72
+ [![Please Star](https://img.shields.io/badge/⭐-Star%20this%20repo-blue?style=flat-square)](https://github.com/olivierfriard/BORIS/stargazers)
69
73
 
70
74
  # Documentation
71
75
 
@@ -82,8 +86,7 @@ Some [video tutorials](https://www.boris.unito.it/video_tutorials/) are availabl
82
86
  # Bug reports and feature requests
83
87
 
84
88
 
85
- To search for bugs, report them or request a feature, please use the github tracker:
86
- https://github.com/olivierfriard/BORIS/issues
89
+ To search for bugs, report them or request a feature, please use the [GitHub issues tracker](https://github.com/olivierfriard/BORIS/issues)
87
90
 
88
91
 
89
92
 
@@ -129,7 +132,7 @@ GNU General Public License for more details.
129
132
 
130
133
  Distributed with a [GPL v.3 license](LICENSE.TXT).
131
134
 
132
- Copyright (C) 2012-2024 Olivier Friard
135
+ Copyright (C) 2012-2025 Olivier Friard
133
136
 
134
137
 
135
138
 
@@ -11,7 +11,7 @@ You can not longer run BORIS natively on MacOS (since v.8). Some alternatives to
11
11
 
12
12
  It provides also some analysis tools like time budget and some plotting functions.
13
13
 
14
- The BORIS paper has more than [![BORIS citations counter](http://penelope.unito.it/friard/boris_scopus_citations.png) citations](https://www.boris.unito.it/citations) in peer-reviewed scientific publications.
14
+ The BORIS paper has more than [![BORIS citations counter](https://penelope.unito.it/friard/boris_scopus_citations.png) citations](https://www.boris.unito.it/citations) in peer-reviewed scientific publications.
15
15
 
16
16
 
17
17
 
@@ -21,13 +21,17 @@ See the official [BORIS web site](https://www.boris.unito.it).
21
21
  [![Python web site](https://img.shields.io/badge/Made%20with-Python-1f425f.svg)](https://www.python.org)
22
22
  ![Python versions](https://img.shields.io/pypi/pyversions/boris-behav-obs)
23
23
  ![BORIS license](https://img.shields.io/pypi/l/boris-behav-obs)
24
+ [![PyPI version](https://img.shields.io/pypi/v/boris-behav-obs.svg)](https://pypi.org/project/boris-behav-obs/)
25
+
24
26
  [![Number of downloads](https://static.pepy.tech/personalized-badge/boris-behav-obs?period=total&units=international_system&left_color=black&right_color=orange&left_text=Downloads)](https://pepy.tech/project/boris-behav-obs)
25
27
  ![commit-activity](https://img.shields.io/github/commit-activity/m/olivierfriard/BORIS)
26
- [![PyPI version](https://img.shields.io/pypi/v/boris-behav-obs.svg)](https://pypi.org/project/boris-behav-obs/)
27
- ![BORIS scopus citations badge](http://penelope.unito.it/friard/boris_scopus_citations.svg)
28
+ ![GitHub last commit](https://img.shields.io/github/last-commit/olivierfriard/BORIS)
28
29
 
30
+ ![BORIS scopus citations badge](https://penelope.unito.it/friard/boris_scopus_citations.svg)
29
31
 
30
32
 
33
+ ![GitHub Repo stars](https://img.shields.io/github/stars/olivierfriard/BORIS?style=flat&label=Stars)
34
+ [![Please Star](https://img.shields.io/badge/⭐-Star%20this%20repo-blue?style=flat-square)](https://github.com/olivierfriard/BORIS/stargazers)
31
35
 
32
36
  # Documentation
33
37
 
@@ -44,8 +48,7 @@ Some [video tutorials](https://www.boris.unito.it/video_tutorials/) are availabl
44
48
  # Bug reports and feature requests
45
49
 
46
50
 
47
- To search for bugs, report them or request a feature, please use the github tracker:
48
- https://github.com/olivierfriard/BORIS/issues
51
+ To search for bugs, report them or request a feature, please use the [GitHub issues tracker](https://github.com/olivierfriard/BORIS/issues)
49
52
 
50
53
 
51
54
 
@@ -91,7 +94,7 @@ GNU General Public License for more details.
91
94
 
92
95
  Distributed with a [GPL v.3 license](LICENSE.TXT).
93
96
 
94
- Copyright (C) 2012-2024 Olivier Friard
97
+ Copyright (C) 2012-2025 Olivier Friard
95
98
 
96
99
 
97
100
 
@@ -26,10 +26,6 @@ def run(df: pd.DataFrame):
26
26
  - % of total subject observation duration
27
27
  """
28
28
 
29
- print("running time budget plugin")
30
-
31
- print(df)
32
-
33
29
  group_by = ["Subject", "Behavior"]
34
30
 
35
31
  dfs = [
@@ -431,7 +431,6 @@ class BehaviorsMapCreatorWindow(QMainWindow):
431
431
  self.selectedPolygon = None
432
432
  self.selectedPolygonMemBrush = None
433
433
 
434
- print(self.polygonsList2)
435
434
  idx = 0
436
435
  for areaCode, pg in self.polygonsList2:
437
436
  if pg.contains(test):
@@ -261,8 +261,6 @@ def show_coding_pad(self):
261
261
  self.codingpad.setWindowFlags(Qt.WindowStaysOnTopHint)
262
262
  self.codingpad.sendEventSignal.connect(self.signal_from_widget)
263
263
 
264
- print(f"{self.signal_from_widget=}")
265
-
266
264
  self.codingpad.clickSignal.connect(self.click_signal_from_coding_pad)
267
265
  self.codingpad.close_signal.connect(self.close_signal_from_coding_pad)
268
266
  self.codingpad.show()
@@ -205,7 +205,6 @@ class TableModel(QAbstractTableModel):
205
205
  if 0 <= row < self.rowCount():
206
206
  column = index.column()
207
207
 
208
- # print(self._data[:3])
209
208
  if cfg.TW_EVENTS_FIELDS[self.observation_type][column] == "type":
210
209
  return self._data[row][-1]
211
210
  else:
@@ -2137,39 +2136,47 @@ class MainWindow(QMainWindow, Ui_MainWindow):
2137
2136
  set_and_update_pan_and_zoom(new_pan_x, new_pan_y, new_zoom)
2138
2137
 
2139
2138
  if cmd == "MBTN_LEFT_DBL":
2140
- print("left dbl")
2139
+ logging.debug("MBTN_LEFT_DBL")
2141
2140
  # ZOOM IN x2
2142
2141
  do_zoom_in_clicked_coords(zoom_increment=1)
2143
2142
  return
2144
2143
  if cmd == "MBTN_RIGHT_DBL":
2144
+ logging.debug("MBTN_RIGHT_DBL")
2145
2145
  # ZOOM OUT x2
2146
2146
  do_zoom_in_clicked_coords(zoom_increment=-1)
2147
2147
  return
2148
2148
  if cmd == "Ctrl+WHEEL_UP":
2149
+ logging.debug("Ctrl+WHEEL_UP")
2149
2150
  # ZOOM IN (3 wheel steps to zoom X2)
2150
2151
  do_zoom_in_clicked_coords(zoom_increment=1.0 / 3.0)
2151
2152
  return
2152
2153
  if cmd == "Ctrl+WHEEL_DOWN":
2154
+ logging.debug("Ctrl+WHEEL_DOWN")
2153
2155
  # ZOOM OUT (3 wheel steps to zoom X2)
2154
2156
  do_zoom_in_clicked_coords(zoom_increment=-1.0 / 3.0)
2155
2157
  return
2156
2158
  if cmd == "WHEEL_UP":
2159
+ logging.debug("WHEEL_UP")
2157
2160
  # PAN UP (VIDEO MOVES DOWN)
2158
2161
  do_pan_in_clicked_coords(pan_x_increment=0, pan_y_increment=+0.01)
2159
2162
  return
2160
2163
  if cmd == "WHEEL_DOWN":
2164
+ logging.debug("WHEEL_DOWN")
2161
2165
  # PAN DOWN (VIDEO MOVES UP)
2162
2166
  do_pan_in_clicked_coords(pan_x_increment=0, pan_y_increment=-0.01)
2163
2167
  return
2164
2168
  if cmd == "Shift+WHEEL_UP":
2169
+ logging.debug("Shift+WHEEL_UP")
2165
2170
  # PAN LEFT (VIDEO MOVES TO THE RIGHT)
2166
2171
  do_pan_in_clicked_coords(pan_x_increment=+0.01, pan_y_increment=0)
2167
2172
  return
2168
2173
  if cmd == "Shift+WHEEL_DOWN":
2174
+ logging.debug("Shift+WHEEL_DOWN")
2169
2175
  # PAN RIGHT (VIDEO MOVES TO THE LEFT)
2170
2176
  do_pan_in_clicked_coords(pan_x_increment=-0.01, pan_y_increment=0)
2171
2177
  return
2172
2178
  if cmd == "Shift+MBTN_LEFT":
2179
+ logging.debug("Shift+MBTN_LEFT")
2173
2180
  # RESET PAN AND ZOOM TO DEFAULT
2174
2181
  set_and_update_pan_and_zoom(pan_x=0, pan_y=0, zoom=0)
2175
2182
  return
@@ -3745,21 +3752,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
3745
3752
 
3746
3753
  # calculate time for current media file in case of many queued media files
3747
3754
 
3748
- print(mediaFileIdx_s)
3749
- print(type(eventtime_s))
3750
- print(durations)
3751
-
3752
3755
  eventtime_onmedia_s = round(eventtime_s - util.float2decimal(sum(durations[0:mediaFileIdx_s])), 3)
3753
3756
  eventtime_onmedia_e = round(eventtime_e - util.float2decimal(sum(durations[0:mediaFileIdx_e])), 3)
3754
3757
 
3755
- print(row_s, media_path_s, eventtime_s, eventtime_onmedia_s)
3756
- print(self.pj[cfg.OBSERVATIONS][self.observationId][cfg.EVENTS][row_s])
3757
-
3758
- print(row_e, media_path_e, eventtime_e, eventtime_onmedia_e)
3759
- print(self.pj[cfg.OBSERVATIONS][self.observationId][cfg.EVENTS][row_e])
3760
-
3761
3758
  if media_path_s != media_path_e:
3762
- print("events are located on 2 different media files")
3763
3759
  return
3764
3760
 
3765
3761
  media_path = media_path_s
@@ -3770,7 +3766,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
3770
3766
  if "BORISEXTERNAL" in os.environ:
3771
3767
  external_command_template = os.environ["BORISEXTERNAL"]
3772
3768
  else:
3773
- print("BORISEXTERNAL env var not defined")
3774
3769
  return
3775
3770
 
3776
3771
  external_command = external_command_template.format(
@@ -3853,11 +3848,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
3853
3848
 
3854
3849
  time_, cumulative_time = self.get_obs_time()
3855
3850
 
3856
- """
3857
- print(time_)
3858
- print(cumulative_time)
3859
- """
3860
-
3861
3851
  if self.pj[cfg.OBSERVATIONS][self.observationId].get(cfg.MEDIA_CREATION_DATE_AS_OFFSET, False):
3862
3852
  write_event.write_event(self, event, time_)
3863
3853
  else:
@@ -5222,25 +5212,20 @@ class MainWindow(QMainWindow, Ui_MainWindow):
5222
5212
  if (not self.find_dialog.cbFindInSelectedEvents.isChecked()) or (
5223
5213
  self.find_dialog.cbFindInSelectedEvents.isChecked() and event_idx in self.find_dialog.rowsToFind
5224
5214
  ):
5225
- print(f"{event=}")
5226
-
5227
5215
  # search only on filtered events
5228
5216
  if event_idx not in self.tv_idx2events_idx:
5229
5217
  continue
5230
5218
 
5231
5219
  for idx in fields_list:
5232
- print(f"{idx=}")
5233
5220
  if (self.find_dialog.cb_case_sensitive.isChecked() and self.find_dialog.findText.text() in event[idx]) or (
5234
5221
  not self.find_dialog.cb_case_sensitive.isChecked()
5235
5222
  and self.find_dialog.findText.text().upper() in event[idx].upper()
5236
5223
  ):
5237
5224
  self.find_dialog.currentIdx = event_idx
5238
5225
 
5239
- # self.twEvents.scrollToItem(self.twEvents.item(event_idx, 0))
5240
5226
  index = self.tv_events.model().index(event_idx, 0)
5241
5227
  self.tv_events.scrollTo(index, QAbstractItemView.EnsureVisible)
5242
5228
  self.tv_events.selectRow(event_idx)
5243
- # self.twEvents.selectRow(event_idx)
5244
5229
  return
5245
5230
 
5246
5231
  if msg != "FIND_FROM_BEGINING":
@@ -188,7 +188,7 @@ def load_aggregated_events_in_db(
188
188
  selected_behaviors = sorted([pj[cfg.ETHOGRAM][x][cfg.BEHAVIOR_CODE] for x in pj[cfg.ETHOGRAM]])
189
189
 
190
190
  # check if state events are paired
191
- out = ""
191
+ out: str = ""
192
192
  for obs_id in selected_observations:
193
193
  r, msg = project_functions.check_state_events_obs(obs_id, pj[cfg.ETHOGRAM], pj[cfg.OBSERVATIONS][obs_id], cfg.HHMMSS)
194
194
  if not r:
@@ -212,11 +212,11 @@ def load_aggregated_events_in_db(
212
212
 
213
213
  db = sqlite3.connect(":memory:")
214
214
 
215
- """
216
215
  # only for debugging
216
+ """
217
217
  import os
218
- os.system("rm /tmp/ramdisk/aggreg.sqlite")
219
- db = sqlite3.connect("/tmp/ramdisk/aggreg.sqlite", isolation_level=None)
218
+ os.system("rm /tmp/ramdisk/aggregated_events.sqlite")
219
+ db = sqlite3.connect("/tmp/ramdisk/aggregated_events.sqlite", isolation_level=None)
220
220
  """
221
221
 
222
222
  db.row_factory = sqlite3.Row
@@ -128,8 +128,6 @@ class DlgEditEvent(QDialog, Ui_Form):
128
128
  set time to current media time
129
129
  """
130
130
 
131
- print(f"{self.current_time=}")
132
-
133
131
  if self.observation_type in (cfg.LIVE, cfg.MEDIA):
134
132
  self.time_widget.set_time(dec(float(self.current_time)))
135
133
 
@@ -137,13 +135,6 @@ class DlgEditEvent(QDialog, Ui_Form):
137
135
  if self.exif_date_time is not None:
138
136
  self.time_widget.set_time(dec(self.exif_date_time))
139
137
 
140
- # def frame_idx_na(self):
141
- # """
142
- # set/unset frame index NA
143
- # """
144
- # self.lb_frame_idx.setEnabled(not self.cb_set_frame_idx_na.isChecked())
145
- # self.sb_frame_idx.setEnabled(not self.cb_set_frame_idx_na.isChecked())
146
-
147
138
  def time_na(self):
148
139
  """
149
140
  set/unset time to NA
@@ -702,7 +702,7 @@ def export_events_as_textgrid(self) -> None:
702
702
  if not export_dir:
703
703
  return
704
704
 
705
- mem_command = ""
705
+ mem_command: str = ""
706
706
 
707
707
  # see https://www.fon.hum.uva.nl/praat/manual/TextGrid_file_formats.html
708
708
 
@@ -795,6 +795,7 @@ def export_events_as_textgrid(self) -> None:
795
795
  max_time = float(obs_interval[1]) + offset if obs_interval[1] != 0 else float(max_media_duration)
796
796
 
797
797
  # delete events outside time interval
798
+
798
799
  cursor.execute(
799
800
  "DELETE FROM aggregated_events WHERE observation = ? AND (start < ? AND stop < ?) OR (start > ? AND stop > ?)",
800
801
  (
@@ -838,38 +839,30 @@ def export_events_as_textgrid(self) -> None:
838
839
 
839
840
  next_obs: bool = False
840
841
 
841
- """
842
- total_media_duration = round(
843
- observation_operations.observation_total_length(self.pj[cfg.OBSERVATIONS][obs_id]), 3
844
- )
845
- """
846
-
842
+ # number of items for size parameter
847
843
  cursor.execute(
848
844
  (
849
- "SELECT COUNT(DISTINCT subject) FROM aggregated_events "
850
- "WHERE observation = ? AND subject IN ({}) AND type = 'STATE' ".format(
851
- ",".join(["?"] * len(parameters[cfg.SELECTED_SUBJECTS]))
852
- )
845
+ "SELECT COUNT(*) FROM (SELECT * FROM aggregated_events "
846
+ f"WHERE observation = ? AND subject IN ({','.join(['?'] * len(parameters[cfg.SELECTED_SUBJECTS]))}) GROUP BY subject, behavior) "
853
847
  ),
854
848
  [obs_id] + parameters[cfg.SELECTED_SUBJECTS],
855
849
  )
856
850
 
857
- subjectsNum = int(cursor.fetchone()[0])
858
- """subjectsMin = min_time"""
859
- subjectsMax = max_time
851
+ subjects_num = int(cursor.fetchone()[0])
852
+ subjects_max = max_time
860
853
 
861
854
  out = (
862
855
  'File type = "ooTextFile"\n'
863
856
  'Object class = "TextGrid"\n'
864
857
  "\n"
865
858
  f"xmin = 0.0\n"
866
- f"xmax = {subjectsMax}\n"
859
+ f"xmax = {subjects_max}\n"
867
860
  "tiers? <exists>\n"
868
- f"size = {subjectsNum}\n"
861
+ f"size = {subjects_num}\n"
869
862
  "item []:\n"
870
863
  )
871
864
 
872
- subject_index = 0
865
+ subject_index: int = 0
873
866
  for subject in parameters[cfg.SELECTED_SUBJECTS]:
874
867
  if subject not in [
875
868
  x[cfg.EVENT_SUBJECT_FIELD_IDX] if x[cfg.EVENT_SUBJECT_FIELD_IDX] else cfg.NO_FOCAL_SUBJECT
@@ -877,7 +870,8 @@ def export_events_as_textgrid(self) -> None:
877
870
  ]:
878
871
  continue
879
872
 
880
- intervalsMin, intervalsMax = min_time, max_time
873
+ intervalsMin = min_time
874
+ intervalsMax = max_time
881
875
 
882
876
  # STATE events
883
877
  cursor.execute(
@@ -892,68 +886,66 @@ def export_events_as_textgrid(self) -> None:
892
886
  {"start": util.float2decimal(r["start"]), "stop": util.float2decimal(r["stop"]), "code": r["behavior"]}
893
887
  for r in cursor.fetchall()
894
888
  ]
895
- if not rows:
896
- continue
889
+ if rows:
890
+ out += interval_subject_header
897
891
 
898
- out += interval_subject_header
892
+ count = 0
899
893
 
900
- count = 0
901
-
902
- # check if 1st behavior starts at the beginning
903
- if rows[0]["start"] > 0:
904
- count += 1
905
- out += interval_template.format(count=count, name="null", xmin=0.0, xmax=rows[0]["start"])
906
-
907
- for idx, row in enumerate(rows):
908
- # check if events are overlapping
909
- if (idx + 1 < len(rows)) and (row["stop"] > rows[idx + 1]["start"]):
910
- self.results.ptText.appendHtml(
911
- (
912
- f"The events overlap for subject <b>{subject}</b> in the observation <b>{obs_id}</b>. "
913
- "It is not possible to create the Praat TextGrid file."
894
+ # check if 1st behavior starts at the beginning
895
+ if rows[0]["start"] > 0:
896
+ count += 1
897
+ out += interval_template.format(count=count, name="null", xmin=0.0, xmax=rows[0]["start"])
898
+
899
+ for idx, row in enumerate(rows):
900
+ # check if events are overlapping
901
+ if (idx + 1 < len(rows)) and (row["stop"] > rows[idx + 1]["start"]):
902
+ self.results.ptText.appendHtml(
903
+ (
904
+ f"The events overlap for subject <b>{subject}</b> in the observation <b>{obs_id}</b>. "
905
+ "It is not possible to create the Praat TextGrid file."
906
+ )
914
907
  )
915
- )
916
- QApplication.processEvents()
908
+ QApplication.processEvents()
917
909
 
918
- next_obs = True
919
- break
910
+ next_obs = True
911
+ break
920
912
 
921
- count += 1
913
+ count += 1
922
914
 
923
- if (idx + 1 < len(rows)) and (rows[idx + 1]["start"] - dec("0.001") <= row["stop"] < rows[idx + 1]["start"]):
924
- xmax = rows[idx + 1]["start"]
925
- else:
926
- xmax = row["stop"]
915
+ if (idx + 1 < len(rows)) and (rows[idx + 1]["start"] - dec("0.001") <= row["stop"] < rows[idx + 1]["start"]):
916
+ xmax = rows[idx + 1]["start"]
917
+ else:
918
+ xmax = row["stop"]
919
+
920
+ out += interval_template.format(count=count, name=row["code"], xmin=row["start"], xmax=xmax)
921
+
922
+ # check if no behavior
923
+ if (idx + 1 < len(rows)) and (row["stop"] < rows[idx + 1]["start"] - dec("0.001")):
924
+ count += 1
925
+ out += interval_template.format(
926
+ count=count,
927
+ name="null",
928
+ xmin=row["stop"],
929
+ xmax=rows[idx + 1]["start"],
930
+ )
927
931
 
928
- out += interval_template.format(count=count, name=row["code"], xmin=row["start"], xmax=xmax)
932
+ if next_obs:
933
+ break
929
934
 
930
- # check if no behavior
931
- if (idx + 1 < len(rows)) and (row["stop"] < rows[idx + 1]["start"] - dec("0.001")):
935
+ # check if last event ends at the end of media file
936
+ if rows[-1]["stop"] < max_time:
932
937
  count += 1
933
- out += interval_template.format(
934
- count=count,
935
- name="null",
936
- xmin=row["stop"],
937
- xmax=rows[idx + 1]["start"],
938
- )
939
-
940
- if next_obs:
941
- break
942
-
943
- # check if last event ends at the end of media file
944
- if rows[-1]["stop"] < max_time:
945
- count += 1
946
- out += interval_template.format(count=count, name="null", xmin=rows[-1]["stop"], xmax=max_time)
947
-
948
- # add info
949
- subject_index += 1
950
- out = out.format(
951
- subject_index=subject_index,
952
- subject=subject,
953
- intervalsSize=count,
954
- intervalsMin=intervalsMin,
955
- intervalsMax=intervalsMax,
956
- )
938
+ out += interval_template.format(count=count, name="null", xmin=rows[-1]["stop"], xmax=max_time)
939
+
940
+ # add info
941
+ subject_index += 1
942
+ out = out.format(
943
+ subject_index=subject_index,
944
+ subject=subject,
945
+ intervalsSize=count,
946
+ intervalsMin=intervalsMin,
947
+ intervalsMax=intervalsMax,
948
+ )
957
949
 
958
950
  # POINT events
959
951
  cursor.execute(
@@ -66,7 +66,6 @@ def restore_geometry(widget: QWidget, widget_name: str, default_width_height):
66
66
  ini_file_path = pl.Path.home() / pl.Path(".boris")
67
67
  if ini_file_path.is_file():
68
68
  settings = QSettings(str(ini_file_path), QSettings.IniFormat)
69
- print(settings.value(f"{widget_name} geometry"))
70
69
  widget.restoreGeometry(settings.value(f"{widget_name} geometry"))
71
70
  logging.debug(f"geometry restored for {widget_name} {settings.value(f'{widget_name} geometry')}")
72
71
  else:
@@ -907,8 +907,6 @@ class ModifiersMapCreatorWindow(QMainWindow):
907
907
  """
908
908
  self.area_list.clear()
909
909
 
910
- print(f"{self.polygonsList2=}")
911
-
912
910
  for modifier_name in sorted(self.polygonsList2.keys()):
913
911
  self.area_list.addItem(modifier_name)
914
912
 
@@ -1301,10 +1301,8 @@ def init_mpv(self):
1301
1301
 
1302
1302
  logging.debug("function: init_mpv")
1303
1303
 
1304
- """
1305
- print(f"{self.winId()=}")
1306
- print(f"{str(int(self.winId()))=}")
1307
- """
1304
+ # print(f"{self.winId()=}")
1305
+ # print(f"{str(int(self.winId()))=}")
1308
1306
 
1309
1307
  subprocess.Popen(
1310
1308
  [
@@ -96,12 +96,8 @@ class Param_panel(QDialog, Ui_Dialog):
96
96
  # Set start_time and end_time widgets values even if it is not shown with
97
97
  # more than 1 observation as some analyses might use it (eg: advanced event filtering)
98
98
 
99
- print(f"{self.end_interval=}")
100
-
101
99
  end_interval = self.end_interval if self.end_interval != 0 else self.media_duration
102
100
 
103
- print(f"{end_interval=}")
104
-
105
101
  self.start_time.set_time(self.start_interval)
106
102
  self.end_time.set_time(end_interval)
107
103
  self.frm_time_interval.setEnabled(False)
@@ -129,7 +129,8 @@ class Plot_spectrogram_RT(QWidget):
129
129
  try:
130
130
  wav = wave.open(wav_file, "r")
131
131
  frames = wav.readframes(-1)
132
- sound_info = np.fromstring(frames, dtype=np.int16)
132
+ # sound_info = np.fromstring(frames, dtype=np.int16)
133
+ sound_info = np.frombuffer(frames, dtype=np.int16)
133
134
  frame_rate = wav.getframerate()
134
135
  wav.close()
135
136
  return sound_info, frame_rate
@@ -109,7 +109,8 @@ class Plot_waveform_RT(QWidget):
109
109
  try:
110
110
  wav = wave.open(wav_file, "r")
111
111
  frames = wav.readframes(-1)
112
- signal = np.fromstring(frames, dtype=np.int16)
112
+ # signal = np.fromstring(frames, dtype=np.int16)
113
+ signal = np.frombuffer(frames, dtype=np.int16)
113
114
  frame_rate = wav.getframerate()
114
115
  wav.close()
115
116
  return signal, frame_rate
@@ -1021,15 +1021,6 @@ def time_budget_analysis(
1021
1021
  continue
1022
1022
 
1023
1023
  if len(rows) % 2: # unpaired events
1024
- """
1025
- print()
1026
- print(f"{subject=}")
1027
- print(f"{behavior=}")
1028
- print()
1029
- for row in rows:
1030
- print(f"{row['observation']=} {row['occurence']=}")
1031
- print()
1032
- """
1033
1024
  out_cat.append(
1034
1025
  {
1035
1026
  "subject": subject,
@@ -20,5 +20,5 @@ This file is part of BORIS.
20
20
 
21
21
  """
22
22
 
23
- __version__ = "9.6.2"
24
- __version_date__ = "2025-08-05"
23
+ __version__ = "9.6.3"
24
+ __version_date__ = "2025-08-26"
@@ -60,8 +60,6 @@ class Video_equalizer(QDialog, Ui_Equalizer):
60
60
  if n_player not in self.equalizer:
61
61
  return
62
62
 
63
- print(self.equalizer)
64
-
65
63
  self.hs_brightness.setValue(self.equalizer[n_player]["hs_brightness"])
66
64
  self.lb_brightness.setText(str(self.equalizer[n_player]["hs_brightness"]))
67
65
 
@@ -49,8 +49,6 @@ class View_df(QWidget, Ui_Form):
49
49
  self.lb_plugin_info.setText(f"{plugin_name} v. {plugin_version}")
50
50
  self.setWindowTitle(f"{plugin_name} v. {plugin_version}")
51
51
 
52
- # print(f"{self.df=}")
53
-
54
52
  self.pb_close.clicked.connect(self.close)
55
53
  self.pb_save.clicked.connect(self.save)
56
54
 
@@ -68,8 +68,6 @@ def write_event(self, event: dict, mem_time: dec) -> int:
68
68
  )
69
69
  return 1
70
70
 
71
- print(f"{mem_time=}")
72
-
73
71
  if mem_time < self.pj[cfg.OBSERVATIONS][self.observationId].get(cfg.OBSERVATION_TIME_INTERVAL, [0, 0])[0]:
74
72
  _ = dialog.MessageDialog(
75
73
  cfg.programName,
@@ -104,12 +102,6 @@ def write_event(self, event: dict, mem_time: dec) -> int:
104
102
 
105
103
  # add media creation date/time
106
104
 
107
- """
108
- print(f"{media_file_name=}")
109
- print(f"{mem_time=}")
110
- """
111
- print(f"{self.pj[cfg.OBSERVATIONS][self.observationId][cfg.MEDIA_INFO]=}")
112
-
113
105
  mem_time += dec(
114
106
  self.pj[cfg.OBSERVATIONS][self.observationId][cfg.MEDIA_INFO][cfg.MEDIA_CREATION_TIME][media_file_name_posix]
115
107
  )
@@ -413,7 +405,6 @@ def write_event(self, event: dict, mem_time: dec) -> int:
413
405
  r = modifiers_selector.exec_()
414
406
  if r:
415
407
  selected_modifiers = modifiers_selector.get_modifiers()
416
- # print(f"{selected_modifiers=}")
417
408
 
418
409
  behavior_to_stop_modifier_str: str = ""
419
410
  for idx in util.sorted_keys(selected_modifiers):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boris-behav-obs
3
- Version: 9.6.2
3
+ Version: 9.6.3
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
@@ -19,7 +19,7 @@ Requires-Python: >=3.12
19
19
  Description-Content-Type: text/markdown
20
20
  License-File: LICENSE.TXT
21
21
  Requires-Dist: exifread>=3.0.0
22
- Requires-Dist: numpy>=1.26.4
22
+ Requires-Dist: numpy==2.3.2
23
23
  Requires-Dist: matplotlib>=3.3.3
24
24
  Requires-Dist: pandas>=2.2.2
25
25
  Requires-Dist: tablib[cli,html,ods,pandas,xls,xlsx]>=3
@@ -49,7 +49,7 @@ You can not longer run BORIS natively on MacOS (since v.8). Some alternatives to
49
49
 
50
50
  It provides also some analysis tools like time budget and some plotting functions.
51
51
 
52
- The BORIS paper has more than [![BORIS citations counter](http://penelope.unito.it/friard/boris_scopus_citations.png) citations](https://www.boris.unito.it/citations) in peer-reviewed scientific publications.
52
+ The BORIS paper has more than [![BORIS citations counter](https://penelope.unito.it/friard/boris_scopus_citations.png) citations](https://www.boris.unito.it/citations) in peer-reviewed scientific publications.
53
53
 
54
54
 
55
55
 
@@ -59,13 +59,17 @@ See the official [BORIS web site](https://www.boris.unito.it).
59
59
  [![Python web site](https://img.shields.io/badge/Made%20with-Python-1f425f.svg)](https://www.python.org)
60
60
  ![Python versions](https://img.shields.io/pypi/pyversions/boris-behav-obs)
61
61
  ![BORIS license](https://img.shields.io/pypi/l/boris-behav-obs)
62
+ [![PyPI version](https://img.shields.io/pypi/v/boris-behav-obs.svg)](https://pypi.org/project/boris-behav-obs/)
63
+
62
64
  [![Number of downloads](https://static.pepy.tech/personalized-badge/boris-behav-obs?period=total&units=international_system&left_color=black&right_color=orange&left_text=Downloads)](https://pepy.tech/project/boris-behav-obs)
63
65
  ![commit-activity](https://img.shields.io/github/commit-activity/m/olivierfriard/BORIS)
64
- [![PyPI version](https://img.shields.io/pypi/v/boris-behav-obs.svg)](https://pypi.org/project/boris-behav-obs/)
65
- ![BORIS scopus citations badge](http://penelope.unito.it/friard/boris_scopus_citations.svg)
66
+ ![GitHub last commit](https://img.shields.io/github/last-commit/olivierfriard/BORIS)
66
67
 
68
+ ![BORIS scopus citations badge](https://penelope.unito.it/friard/boris_scopus_citations.svg)
67
69
 
68
70
 
71
+ ![GitHub Repo stars](https://img.shields.io/github/stars/olivierfriard/BORIS?style=flat&label=Stars)
72
+ [![Please Star](https://img.shields.io/badge/⭐-Star%20this%20repo-blue?style=flat-square)](https://github.com/olivierfriard/BORIS/stargazers)
69
73
 
70
74
  # Documentation
71
75
 
@@ -82,8 +86,7 @@ Some [video tutorials](https://www.boris.unito.it/video_tutorials/) are availabl
82
86
  # Bug reports and feature requests
83
87
 
84
88
 
85
- To search for bugs, report them or request a feature, please use the github tracker:
86
- https://github.com/olivierfriard/BORIS/issues
89
+ To search for bugs, report them or request a feature, please use the [GitHub issues tracker](https://github.com/olivierfriard/BORIS/issues)
87
90
 
88
91
 
89
92
 
@@ -129,7 +132,7 @@ GNU General Public License for more details.
129
132
 
130
133
  Distributed with a [GPL v.3 license](LICENSE.TXT).
131
134
 
132
- Copyright (C) 2012-2024 Olivier Friard
135
+ Copyright (C) 2012-2025 Olivier Friard
133
136
 
134
137
 
135
138
 
@@ -1,5 +1,5 @@
1
1
  exifread>=3.0.0
2
- numpy>=1.26.4
2
+ numpy==2.3.2
3
3
  matplotlib>=3.3.3
4
4
  pandas>=2.2.2
5
5
  tablib[cli,html,ods,pandas,xls,xlsx]>=3
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "boris-behav-obs"
3
- version = "9.6.2"
3
+ version = "9.6.3"
4
4
  description = "BORIS - Behavioral Observation Research Interactive Software"
5
5
  authors = [{ name="Olivier Friard", email="olivier.friard@unito.it" }]
6
6
  readme = "README.md"
@@ -16,7 +16,7 @@ classifiers=[
16
16
  ]
17
17
  dependencies = [
18
18
  "exifread>=3.0.0",
19
- "numpy>=1.26.4",
19
+ "numpy==2.3.2",
20
20
  "matplotlib>=3.3.3",
21
21
  "pandas>=2.2.2",
22
22
  "tablib[html, ods, xls, xlsx, pandas, cli]>=3",