TwoPy 0.3.4__tar.gz → 0.3.6__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 (261) hide show
  1. {twopy-0.3.4 → twopy-0.3.6}/PKG-INFO +1 -1
  2. {twopy-0.3.4 → twopy-0.3.6}/pyproject.toml +1 -1
  3. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/converted.py +1 -1
  4. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/empty_state.py +4 -4
  5. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/protocols.py +18 -0
  6. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/version_check.py +14 -1
  7. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/viewer.py +10 -1
  8. {twopy-0.3.4 → twopy-0.3.6}/src/twopy.egg-info/PKG-INFO +1 -1
  9. {twopy-0.3.4 → twopy-0.3.6}/tests/test_api.py +0 -1
  10. {twopy-0.3.4 → twopy-0.3.6}/tests/test_database.py +0 -1
  11. {twopy-0.3.4 → twopy-0.3.6}/tests/test_load_workflow.py +9 -0
  12. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari.py +13 -1
  13. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_group_matching_responses.py +0 -1
  14. {twopy-0.3.4 → twopy-0.3.6}/tests/test_pixel_calibration.py +0 -1
  15. {twopy-0.3.4 → twopy-0.3.6}/tests/test_session.py +0 -1
  16. {twopy-0.3.4 → twopy-0.3.6}/tests/test_version_check.py +18 -0
  17. {twopy-0.3.4 → twopy-0.3.6}/README.md +0 -0
  18. {twopy-0.3.4 → twopy-0.3.6}/setup.cfg +0 -0
  19. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/__init__.py +0 -0
  20. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/__init__.pyi +0 -0
  21. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/_segments.py +0 -0
  22. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/_version.py +0 -0
  23. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/__init__.py +0 -0
  24. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/background_subtraction.py +0 -0
  25. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/dff.py +0 -0
  26. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/dff_options.py +0 -0
  27. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/epoch_mapping.py +0 -0
  28. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/group_matching.py +0 -0
  29. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/kernels/__init__.py +0 -0
  30. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/kernels/_fitting.py +0 -0
  31. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/kernels/_stimulus.py +0 -0
  32. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/motion.py +0 -0
  33. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/persistence.py +0 -0
  34. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_context.py +0 -0
  35. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_maps.py +0 -0
  36. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_plotting.py +0 -0
  37. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_processing/__init__.py +0 -0
  38. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_processing/apply.py +0 -0
  39. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_processing/options.py +0 -0
  40. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_processing/persistence.py +0 -0
  41. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_processing/qc.py +0 -0
  42. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_processing/signals.py +0 -0
  43. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_window_options.py +0 -0
  44. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/responses.py +0 -0
  45. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/timing.py +0 -0
  46. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/trials.py +0 -0
  47. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/workflow.py +0 -0
  48. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis_cache.py +0 -0
  49. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/api.py +0 -0
  50. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/cache_inventory.py +0 -0
  51. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/calibrations/pixel_calibration_profiles.csv +0 -0
  52. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/calibrations/pixel_size.csv +0 -0
  53. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/config.example.yml +0 -0
  54. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/config.py +0 -0
  55. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/conversion/__init__.py +0 -0
  56. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/conversion/alignment_crop.py +0 -0
  57. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/conversion/api.py +0 -0
  58. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/conversion/hdf5_writing.py +0 -0
  59. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/conversion/matlab_values.py +0 -0
  60. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/conversion/orientation.py +0 -0
  61. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/conversion/source_loading.py +0 -0
  62. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/conversion/stimulus_code.py +0 -0
  63. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/conversion/types.py +0 -0
  64. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/__init__.py +0 -0
  65. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/context.py +0 -0
  66. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/discovery.py +0 -0
  67. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/metadata.py +0 -0
  68. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/native.py +0 -0
  69. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/native_workflows/__init__.py +0 -0
  70. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/native_workflows/direction_selectivity.py +0 -0
  71. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/native_workflows/response_kernels.py +0 -0
  72. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/parameters.py +0 -0
  73. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/provenance.py +0 -0
  74. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/registry.py +0 -0
  75. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/results.py +0 -0
  76. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/runner.py +0 -0
  77. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/workflows.py +0 -0
  78. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/database/__init__.py +0 -0
  79. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/database/cache.py +0 -0
  80. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/database/catalog.py +0 -0
  81. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/database/connection.py +0 -0
  82. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/database/generic.py +0 -0
  83. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/database/modeled.py +0 -0
  84. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/database/search.py +0 -0
  85. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/database/sql.py +0 -0
  86. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/database/types.py +0 -0
  87. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/filenames.py +0 -0
  88. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/frame_ranges.py +0 -0
  89. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/hdf5_utils.py +0 -0
  90. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/inspection.py +0 -0
  91. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/matlab.py +0 -0
  92. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/__init__.py +0 -0
  93. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/__main__.py +0 -0
  94. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/assets/twopy-app-icon-128.png +0 -0
  95. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/assets/twopy-app-icon-16.png +0 -0
  96. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/assets/twopy-app-icon-256.png +0 -0
  97. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/assets/twopy-app-icon-32.png +0 -0
  98. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/assets/twopy-app-icon-512.png +0 -0
  99. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/assets/twopy-app-icon-64.png +0 -0
  100. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/assets/twopy-app-icon.icns +0 -0
  101. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/assets/twopy-app-icon.png +0 -0
  102. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/controls.py +0 -0
  103. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/custom_tab.py +0 -0
  104. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/database_favorite_editor.py +0 -0
  105. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/database_favorites.py +0 -0
  106. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/database_search.py +0 -0
  107. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/dims.py +0 -0
  108. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/display.py +0 -0
  109. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/display_paths.py +0 -0
  110. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/errors.py +0 -0
  111. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/__init__.py +0 -0
  112. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/cards.py +0 -0
  113. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/fov_assignment.py +0 -0
  114. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/fov_cards.py +0 -0
  115. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/images.py +0 -0
  116. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/protocols.py +0 -0
  117. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/response_preview.py +0 -0
  118. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/responses.py +0 -0
  119. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/roi_assignment.py +0 -0
  120. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/roi_cards.py +0 -0
  121. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/style.py +0 -0
  122. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/tables.py +0 -0
  123. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/window.py +0 -0
  124. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/interactive.py +0 -0
  125. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/latest_worker.py +0 -0
  126. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/launcher.py +0 -0
  127. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/live_analysis.py +0 -0
  128. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/load_controller.py +0 -0
  129. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/load_progress.py +0 -0
  130. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/load_workflow.py +0 -0
  131. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/loaded_recordings_csv.py +0 -0
  132. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/loading.py +0 -0
  133. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/movie.py +0 -0
  134. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/output_routing.py +0 -0
  135. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/paths.py +0 -0
  136. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/__init__.py +0 -0
  137. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/data.py +0 -0
  138. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/dff_options.py +0 -0
  139. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/__init__.py +0 -0
  140. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/api.py +0 -0
  141. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/dynamic_options.py +0 -0
  142. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/options_panel.py +0 -0
  143. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/paths.py +0 -0
  144. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/plot_area.py +0 -0
  145. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/response_map_area.py +0 -0
  146. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/response_plot_widget.py +0 -0
  147. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/save_actions.py +0 -0
  148. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/visibility_state.py +0 -0
  149. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/export.py +0 -0
  150. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/export_controls.py +0 -0
  151. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/form_controls.py +0 -0
  152. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/label_visibility.py +0 -0
  153. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/normalization_options.py +0 -0
  154. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/options.py +0 -0
  155. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/panels.py +0 -0
  156. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/preview_strip.py +0 -0
  157. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/processing_options.py +0 -0
  158. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/response_map_colors.py +0 -0
  159. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/response_map_display.py +0 -0
  160. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/response_map_options.py +0 -0
  161. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/response_window_options.py +0 -0
  162. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/roi_generation/__init__.py +0 -0
  163. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/roi_generation/actions.py +0 -0
  164. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/roi_generation/controls.py +0 -0
  165. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/roi_generation/options.py +0 -0
  166. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/widgets.py +0 -0
  167. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/responses.py +0 -0
  168. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/roi.py +0 -0
  169. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/roi_signatures.py +0 -0
  170. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/session.py +0 -0
  171. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/sidebar.py +0 -0
  172. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/state.py +0 -0
  173. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/text.py +0 -0
  174. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/trial_timeline.py +0 -0
  175. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/types.py +0 -0
  176. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/parity/__init__.py +0 -0
  177. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/parity/dff.py +0 -0
  178. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/parity/psycho5.py +0 -0
  179. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/parity/roi.py +0 -0
  180. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/parity/roi_extraction.py +0 -0
  181. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/parity/saved_analysis.py +0 -0
  182. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/photodiode.py +0 -0
  183. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/photodiode_classification.py +0 -0
  184. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/pixel_calibration.py +0 -0
  185. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/pixel_calibration_profiles.py +0 -0
  186. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/response_roi_extraction.py +0 -0
  187. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/roi.py +0 -0
  188. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/roi_extraction.py +0 -0
  189. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/roi_mask_cleanup.py +0 -0
  190. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/session.py +0 -0
  191. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/spatial.py +0 -0
  192. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/spatial_orientation.py +0 -0
  193. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/stimulus.py +0 -0
  194. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/synchronization.py +0 -0
  195. {twopy-0.3.4 → twopy-0.3.6}/src/twopy/typing_guards.py +0 -0
  196. {twopy-0.3.4 → twopy-0.3.6}/src/twopy.egg-info/SOURCES.txt +0 -0
  197. {twopy-0.3.4 → twopy-0.3.6}/src/twopy.egg-info/dependency_links.txt +0 -0
  198. {twopy-0.3.4 → twopy-0.3.6}/src/twopy.egg-info/entry_points.txt +0 -0
  199. {twopy-0.3.4 → twopy-0.3.6}/src/twopy.egg-info/requires.txt +0 -0
  200. {twopy-0.3.4 → twopy-0.3.6}/src/twopy.egg-info/top_level.txt +0 -0
  201. {twopy-0.3.4 → twopy-0.3.6}/tests/test_background_subtraction.py +0 -0
  202. {twopy-0.3.4 → twopy-0.3.6}/tests/test_cache_inventory.py +0 -0
  203. {twopy-0.3.4 → twopy-0.3.6}/tests/test_config.py +0 -0
  204. {twopy-0.3.4 → twopy-0.3.6}/tests/test_conversion.py +0 -0
  205. {twopy-0.3.4 → twopy-0.3.6}/tests/test_converted.py +0 -0
  206. {twopy-0.3.4 → twopy-0.3.6}/tests/test_custom_workflows.py +0 -0
  207. {twopy-0.3.4 → twopy-0.3.6}/tests/test_dff.py +0 -0
  208. {twopy-0.3.4 → twopy-0.3.6}/tests/test_epoch_mapping.py +1 -1
  209. {twopy-0.3.4 → twopy-0.3.6}/tests/test_filenames.py +0 -0
  210. {twopy-0.3.4 → twopy-0.3.6}/tests/test_frame_ranges.py +0 -0
  211. {twopy-0.3.4 → twopy-0.3.6}/tests/test_function_inventory.py +0 -0
  212. {twopy-0.3.4 → twopy-0.3.6}/tests/test_group_matching.py +0 -0
  213. {twopy-0.3.4 → twopy-0.3.6}/tests/test_hdf5_utils.py +1 -1
  214. {twopy-0.3.4 → twopy-0.3.6}/tests/test_import.py +0 -0
  215. {twopy-0.3.4 → twopy-0.3.6}/tests/test_inspection.py +1 -1
  216. {twopy-0.3.4 → twopy-0.3.6}/tests/test_kernels.py +0 -0
  217. {twopy-0.3.4 → twopy-0.3.6}/tests/test_matlab.py +1 -1
  218. {twopy-0.3.4 → twopy-0.3.6}/tests/test_motion.py +1 -1
  219. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_database_search.py +0 -0
  220. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_display.py +0 -0
  221. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_export.py +0 -0
  222. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_group_matching_roi_cards.py +0 -0
  223. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_live_controller.py +0 -0
  224. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_load_controller.py +0 -0
  225. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_load_progress.py +0 -0
  226. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_load_tab.py +0 -0
  227. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_loaded_recordings.py +0 -0
  228. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_path_resolution.py +0 -0
  229. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_plot_controls.py +0 -0
  230. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_plot_data.py +0 -0
  231. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_plot_widgets.py +0 -0
  232. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_processing_controls.py +0 -0
  233. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_response_map_display.py +0 -0
  234. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_response_workflow.py +0 -0
  235. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_roi_generation.py +0 -0
  236. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_roi_visibility.py +0 -0
  237. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_text.py +0 -0
  238. {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_timeline.py +0 -0
  239. {twopy-0.3.4 → twopy-0.3.6}/tests/test_packaging.py +0 -0
  240. {twopy-0.3.4 → twopy-0.3.6}/tests/test_parity.py +1 -1
  241. {twopy-0.3.4 → twopy-0.3.6}/tests/test_parity_psycho5.py +1 -1
  242. {twopy-0.3.4 → twopy-0.3.6}/tests/test_parity_roi_extraction.py +0 -0
  243. {twopy-0.3.4 → twopy-0.3.6}/tests/test_persistence.py +0 -0
  244. {twopy-0.3.4 → twopy-0.3.6}/tests/test_photodiode_classification.py +1 -1
  245. {twopy-0.3.4 → twopy-0.3.6}/tests/test_pixel_calibration_profiles.py +0 -0
  246. {twopy-0.3.4 → twopy-0.3.6}/tests/test_real_fixture.py +1 -1
  247. {twopy-0.3.4 → twopy-0.3.6}/tests/test_recording_timing.py +1 -1
  248. {twopy-0.3.4 → twopy-0.3.6}/tests/test_response_map_area.py +0 -0
  249. {twopy-0.3.4 → twopy-0.3.6}/tests/test_response_maps.py +0 -0
  250. {twopy-0.3.4 → twopy-0.3.6}/tests/test_response_processing.py +0 -0
  251. {twopy-0.3.4 → twopy-0.3.6}/tests/test_response_roi_extraction.py +2 -2
  252. {twopy-0.3.4 → twopy-0.3.6}/tests/test_response_window_options.py +0 -0
  253. {twopy-0.3.4 → twopy-0.3.6}/tests/test_responses.py +0 -0
  254. {twopy-0.3.4 → twopy-0.3.6}/tests/test_roi.py +0 -0
  255. {twopy-0.3.4 → twopy-0.3.6}/tests/test_roi_extraction.py +0 -0
  256. {twopy-0.3.4 → twopy-0.3.6}/tests/test_roi_mask_cleanup.py +0 -0
  257. {twopy-0.3.4 → twopy-0.3.6}/tests/test_saved_analysis.py +1 -1
  258. {twopy-0.3.4 → twopy-0.3.6}/tests/test_stimulus.py +1 -1
  259. {twopy-0.3.4 → twopy-0.3.6}/tests/test_synchronization.py +1 -1
  260. {twopy-0.3.4 → twopy-0.3.6}/tests/test_trials.py +0 -0
  261. {twopy-0.3.4 → twopy-0.3.6}/tests/test_workflow.py +1 -1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: twopy
3
- Version: 0.3.4
3
+ Version: 0.3.6
4
4
  Summary: Two-photon imaging analysis tool with a napari interface.
5
5
  Author-email: Gustavo Madeira Santana <fromweb1@gumadeiras.com>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "twopy"
7
- version = "0.3.4"
7
+ version = "0.3.6"
8
8
  description = "Two-photon imaging analysis tool with a napari interface."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13,<3.14"
@@ -234,7 +234,7 @@ def load_converted_recording(
234
234
  if len(movie_shape) != 3:
235
235
  msg = f"aligned movie shape must have 3 dimensions: {movie_shape}"
236
236
  raise ValueError(msg)
237
- movie_shape_3d = cast(tuple[int, int, int], movie_shape)
237
+ movie_shape_3d = movie_shape
238
238
 
239
239
  recording = RecordingData(
240
240
  path=data_path,
@@ -85,10 +85,10 @@ def show_empty_viewer_message(
85
85
  overlay.text = empty_viewer_message(update_command=update_command)
86
86
  overlay.visible = True
87
87
  overlay.position = "top_center"
88
- overlay.font_size = 13
89
- overlay.color = "white"
90
- overlay.box = True
91
- overlay.box_color = (0.0, 0.0, 0.0, 0.65)
88
+ overlay.font_size = 18
89
+ overlay.color = "#c8cdd3"
90
+ overlay.box = False
91
+ overlay.box_color = (0.0, 0.0, 0.0, 0.0)
92
92
 
93
93
 
94
94
  def hide_empty_viewer_message(viewer: object) -> None:
@@ -80,6 +80,24 @@ class NapariViewer(Protocol):
80
80
  """
81
81
  ...
82
82
 
83
+ def reset_view(
84
+ self,
85
+ *,
86
+ margin: float = 0.05,
87
+ reset_camera_angle: bool = True,
88
+ ) -> None:
89
+ """Fit visible layers into the current viewer canvas.
90
+
91
+ Args:
92
+ margin: Fractional padding around visible layer extents.
93
+ reset_camera_angle: Whether to reset camera orientation as well as
94
+ zoom and pan.
95
+
96
+ Returns:
97
+ None.
98
+ """
99
+ ...
100
+
83
101
 
84
102
  class NapariLayerWithData(Protocol):
85
103
  """Small protocol for napari layers that expose array-like data.
@@ -137,7 +137,12 @@ def check_for_update(
137
137
  """
138
138
  checked_now = _utc(now)
139
139
  cache = read_version_check_cache(state_file=state_file)
140
- if _cache_is_fresh(cache, now=checked_now, max_age=max_age):
140
+ if _cache_is_fresh(
141
+ cache,
142
+ now=checked_now,
143
+ max_age=max_age,
144
+ current_version=current_version,
145
+ ):
141
146
  return _notice_from_cache(current_version, cache)
142
147
 
143
148
  try:
@@ -243,6 +248,7 @@ def _cache_is_fresh(
243
248
  *,
244
249
  now: datetime,
245
250
  max_age: timedelta,
251
+ current_version: str,
246
252
  ) -> bool:
247
253
  """Return whether the cache is young enough to skip a network check."""
248
254
  if cache is None:
@@ -250,6 +256,13 @@ def _cache_is_fresh(
250
256
  checked_at = _parse_cached_datetime(cache.checked_at)
251
257
  if checked_at is None:
252
258
  return False
259
+ try:
260
+ current = Version(current_version)
261
+ latest = Version(cache.latest_version)
262
+ except InvalidVersion:
263
+ return False
264
+ if latest < current:
265
+ return False
253
266
  return now - checked_at <= max_age
254
267
 
255
268
 
@@ -17,6 +17,7 @@ from typing import TYPE_CHECKING, Protocol, cast
17
17
 
18
18
  import numpy as np
19
19
  import numpy.typing as npt
20
+ from qtpy.QtCore import QTimer
20
21
 
21
22
  from twopy._version import __version__
22
23
  from twopy.napari.empty_state import (
@@ -368,6 +369,11 @@ def add_prepared_recording_to_viewer(
368
369
  )
369
370
  set_labels_brush_size(roi_layer, brush_size=6)
370
371
 
372
+ QTimer.singleShot(
373
+ 0,
374
+ lambda: viewer.reset_view(margin=0.05, reset_camera_angle=False),
375
+ )
376
+
371
377
  from twopy.napari.types import NapariRecordingView
372
378
 
373
379
  return NapariRecordingView(
@@ -398,7 +404,10 @@ def create_viewer() -> NapariViewer:
398
404
  """
399
405
  import napari
400
406
 
401
- viewer = cast(NapariViewer, napari.Viewer(title=APPLICATION_TITLE))
407
+ viewer = cast(
408
+ NapariViewer,
409
+ napari.Viewer(title=APPLICATION_TITLE, show_welcome_screen=False),
410
+ )
402
411
  _set_application_icon(viewer)
403
412
  show_empty_viewer_message(viewer)
404
413
  return viewer
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: twopy
3
- Version: 0.3.4
3
+ Version: 0.3.6
4
4
  Summary: Two-photon imaging analysis tool with a napari interface.
5
5
  Author-email: Gustavo Madeira Santana <fromweb1@gumadeiras.com>
6
6
  License-Expression: MIT
@@ -9,7 +9,6 @@ import unittest
9
9
  from pathlib import Path
10
10
 
11
11
  from tests.tempdir import temporary_directory
12
-
13
12
  from twopy import find_recordings, finite_mean_and_sem
14
13
  from twopy.api import finite_mean_and_sem as api_finite_mean_and_sem
15
14
 
@@ -9,7 +9,6 @@ import unittest
9
9
  from pathlib import Path
10
10
 
11
11
  from tests.tempdir import temporary_directory
12
-
13
12
  from twopy.config import TwopyConfig
14
13
  from twopy.database import (
15
14
  ExperimentSearchFilters,
@@ -115,6 +115,15 @@ class _Viewer:
115
115
  self.labels.append(layer)
116
116
  return layer
117
117
 
118
+ def reset_view(
119
+ self,
120
+ *,
121
+ margin: float = 0.05,
122
+ reset_camera_angle: bool = True,
123
+ ) -> None:
124
+ """Accept the recording-view camera fit request."""
125
+ del margin, reset_camera_angle
126
+
118
127
 
119
128
  @dataclass
120
129
  class _State:
@@ -31,6 +31,7 @@ from tests.napari_support import (
31
31
  np,
32
32
  open_recording_in_napari,
33
33
  patch,
34
+ process_qt_events_until,
34
35
  roi_label_image_from_layer,
35
36
  save_napari_label_rois,
36
37
  save_roi_set,
@@ -433,12 +434,18 @@ class CoreNapariAdapterTest(NapariAdapterTestCase):
433
434
 
434
435
  self.assertIs(created, viewer)
435
436
  self.assertEqual(APPLICATION_TITLE, f"twopy {__version__}")
436
- viewer_constructor.assert_called_once_with(title=APPLICATION_TITLE)
437
+ viewer_constructor.assert_called_once_with(
438
+ title=APPLICATION_TITLE,
439
+ show_welcome_screen=False,
440
+ )
437
441
  self.assertFalse(viewer.welcome_screen.visible)
438
442
  self.assertEqual(viewer.text_overlay.text, EMPTY_VIEWER_MESSAGE)
439
443
  self.assertTrue(viewer.text_overlay.text.startswith(f"{APPLICATION_TITLE}\n"))
440
444
  self.assertTrue(viewer.text_overlay.visible)
441
445
  self.assertEqual(viewer.text_overlay.position, "top_center")
446
+ self.assertEqual(viewer.text_overlay.font_size, 18)
447
+ self.assertEqual(viewer.text_overlay.color, "#c8cdd3")
448
+ self.assertFalse(viewer.text_overlay.box)
442
449
  icon = viewer.window._qt_window.window_icon
443
450
  self.assertIsNotNone(icon)
444
451
  assert icon is not None
@@ -727,6 +734,7 @@ class CoreNapariAdapterTest(NapariAdapterTestCase):
727
734
  viewer=viewer,
728
735
  movie_frame_range=(0, 1),
729
736
  )
737
+ process_qt_events_until(lambda: len(viewer.reset_view_calls) == 1)
730
738
 
731
739
  self.assertIs(opened.viewer, viewer)
732
740
  self.assertEqual(opened.recording.movie.shape, (3, 2, 2))
@@ -744,6 +752,10 @@ class CoreNapariAdapterTest(NapariAdapterTestCase):
744
752
  self.assertEqual(viewer.images[1].contrast_limits_range, (0.0, 7.0))
745
753
  self.assertEqual(np.asarray(viewer.images[1].data).shape, (2, 2, 2))
746
754
  self.assertEqual(len(viewer.labels), 1)
755
+ self.assertEqual(
756
+ viewer.reset_view_calls,
757
+ [{"margin": 0.05, "reset_camera_angle": False}],
758
+ )
747
759
  np.testing.assert_array_equal(
748
760
  np.unique(np.asarray(viewer.labels[0].data)),
749
761
  np.array([0, 3, 4]),
@@ -20,7 +20,6 @@ from tests.napari_support import (
20
20
  temporary_directory,
21
21
  unittest,
22
22
  )
23
-
24
23
  from twopy.napari.group_matching.responses import SelectedRoiResponseCache
25
24
 
26
25
 
@@ -9,7 +9,6 @@ from datetime import date
9
9
  from pathlib import Path
10
10
 
11
11
  from tests.tempdir import temporary_directory
12
-
13
12
  from twopy import (
14
13
  DEFAULT_PIXEL_CALIBRATION_PATH,
15
14
  PixelCalibrationRow,
@@ -8,7 +8,6 @@ import unittest
8
8
  from pathlib import Path
9
9
 
10
10
  from tests.tempdir import temporary_directory
11
-
12
11
  from twopy.session import discover_session_files
13
12
 
14
13
 
@@ -122,6 +122,24 @@ class VersionCheckTest(unittest.TestCase):
122
122
 
123
123
  self.assertIsNone(notice)
124
124
 
125
+ def test_fresh_cache_older_than_install_checks_network(self) -> None:
126
+ """Confirm downgraded installs do not trust an older fresh cache."""
127
+ with temporary_directory() as temp_dir:
128
+ state_file = Path(temp_dir) / "state.json"
129
+ now = datetime(2026, 6, 18, 12, tzinfo=UTC)
130
+ _write_cache(state_file, checked_at=now, latest_version="0.3.2")
131
+
132
+ notice = check_for_update(
133
+ current_version="0.3.3",
134
+ now=now + timedelta(hours=1),
135
+ state_file=state_file,
136
+ fetch_latest=lambda: PublishedVersion(version="0.3.4"),
137
+ )
138
+
139
+ self.assertIsNotNone(notice)
140
+ assert notice is not None
141
+ self.assertEqual(notice.latest_version, "0.3.4")
142
+
125
143
  def test_fetch_pypi_published_version_validates_response_shape(self) -> None:
126
144
  """Confirm PyPI JSON parsing accepts only expected string fields."""
127
145
  response = _FakeResponse(
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes