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.
- {twopy-0.3.4 → twopy-0.3.6}/PKG-INFO +1 -1
- {twopy-0.3.4 → twopy-0.3.6}/pyproject.toml +1 -1
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/converted.py +1 -1
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/empty_state.py +4 -4
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/protocols.py +18 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/version_check.py +14 -1
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/viewer.py +10 -1
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy.egg-info/PKG-INFO +1 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_api.py +0 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_database.py +0 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_load_workflow.py +9 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari.py +13 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_group_matching_responses.py +0 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_pixel_calibration.py +0 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_session.py +0 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_version_check.py +18 -0
- {twopy-0.3.4 → twopy-0.3.6}/README.md +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/setup.cfg +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/__init__.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/__init__.pyi +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/_segments.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/_version.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/__init__.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/background_subtraction.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/dff.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/dff_options.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/epoch_mapping.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/group_matching.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/kernels/__init__.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/kernels/_fitting.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/kernels/_stimulus.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/motion.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/persistence.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_context.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_maps.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_plotting.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_processing/__init__.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_processing/apply.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_processing/options.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_processing/persistence.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_processing/qc.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_processing/signals.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/response_window_options.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/responses.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/timing.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/trials.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis/workflow.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/analysis_cache.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/api.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/cache_inventory.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/calibrations/pixel_calibration_profiles.csv +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/calibrations/pixel_size.csv +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/config.example.yml +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/config.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/conversion/__init__.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/conversion/alignment_crop.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/conversion/api.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/conversion/hdf5_writing.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/conversion/matlab_values.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/conversion/orientation.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/conversion/source_loading.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/conversion/stimulus_code.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/conversion/types.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/__init__.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/context.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/discovery.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/metadata.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/native.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/native_workflows/__init__.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/native_workflows/direction_selectivity.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/native_workflows/response_kernels.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/parameters.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/provenance.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/registry.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/results.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/runner.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/custom/workflows.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/database/__init__.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/database/cache.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/database/catalog.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/database/connection.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/database/generic.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/database/modeled.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/database/search.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/database/sql.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/database/types.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/filenames.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/frame_ranges.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/hdf5_utils.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/inspection.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/matlab.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/__init__.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/__main__.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/assets/twopy-app-icon-128.png +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/assets/twopy-app-icon-16.png +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/assets/twopy-app-icon-256.png +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/assets/twopy-app-icon-32.png +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/assets/twopy-app-icon-512.png +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/assets/twopy-app-icon-64.png +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/assets/twopy-app-icon.icns +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/assets/twopy-app-icon.png +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/controls.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/custom_tab.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/database_favorite_editor.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/database_favorites.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/database_search.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/dims.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/display.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/display_paths.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/errors.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/__init__.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/cards.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/fov_assignment.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/fov_cards.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/images.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/protocols.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/response_preview.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/responses.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/roi_assignment.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/roi_cards.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/style.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/tables.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/group_matching/window.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/interactive.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/latest_worker.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/launcher.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/live_analysis.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/load_controller.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/load_progress.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/load_workflow.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/loaded_recordings_csv.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/loading.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/movie.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/output_routing.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/paths.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/__init__.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/data.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/dff_options.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/__init__.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/api.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/dynamic_options.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/options_panel.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/paths.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/plot_area.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/response_map_area.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/response_plot_widget.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/save_actions.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/docks/visibility_state.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/export.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/export_controls.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/form_controls.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/label_visibility.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/normalization_options.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/options.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/panels.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/preview_strip.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/processing_options.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/response_map_colors.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/response_map_display.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/response_map_options.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/response_window_options.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/roi_generation/__init__.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/roi_generation/actions.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/roi_generation/controls.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/roi_generation/options.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/plotting/widgets.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/responses.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/roi.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/roi_signatures.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/session.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/sidebar.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/state.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/text.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/trial_timeline.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/napari/types.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/parity/__init__.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/parity/dff.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/parity/psycho5.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/parity/roi.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/parity/roi_extraction.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/parity/saved_analysis.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/photodiode.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/photodiode_classification.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/pixel_calibration.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/pixel_calibration_profiles.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/response_roi_extraction.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/roi.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/roi_extraction.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/roi_mask_cleanup.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/session.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/spatial.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/spatial_orientation.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/stimulus.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/synchronization.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy/typing_guards.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy.egg-info/SOURCES.txt +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy.egg-info/dependency_links.txt +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy.egg-info/entry_points.txt +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy.egg-info/requires.txt +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/src/twopy.egg-info/top_level.txt +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_background_subtraction.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_cache_inventory.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_config.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_conversion.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_converted.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_custom_workflows.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_dff.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_epoch_mapping.py +1 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_filenames.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_frame_ranges.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_function_inventory.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_group_matching.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_hdf5_utils.py +1 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_import.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_inspection.py +1 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_kernels.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_matlab.py +1 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_motion.py +1 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_database_search.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_display.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_export.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_group_matching_roi_cards.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_live_controller.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_load_controller.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_load_progress.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_load_tab.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_loaded_recordings.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_path_resolution.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_plot_controls.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_plot_data.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_plot_widgets.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_processing_controls.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_response_map_display.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_response_workflow.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_roi_generation.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_roi_visibility.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_text.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_napari_timeline.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_packaging.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_parity.py +1 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_parity_psycho5.py +1 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_parity_roi_extraction.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_persistence.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_photodiode_classification.py +1 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_pixel_calibration_profiles.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_real_fixture.py +1 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_recording_timing.py +1 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_response_map_area.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_response_maps.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_response_processing.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_response_roi_extraction.py +2 -2
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_response_window_options.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_responses.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_roi.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_roi_extraction.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_roi_mask_cleanup.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_saved_analysis.py +1 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_stimulus.py +1 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_synchronization.py +1 -1
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_trials.py +0 -0
- {twopy-0.3.4 → twopy-0.3.6}/tests/test_workflow.py +1 -1
|
@@ -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 =
|
|
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 =
|
|
89
|
-
overlay.color = "
|
|
90
|
-
overlay.box =
|
|
91
|
-
overlay.box_color = (0.0, 0.0, 0.0, 0.
|
|
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(
|
|
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(
|
|
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
|
|
@@ -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(
|
|
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]),
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|