Skip to content

Installation progressive enhancement#32

Open
anthonypdawson wants to merge 31 commits intomasterfrom
progressive-enhancement
Open

Installation progressive enhancement#32
anthonypdawson wants to merge 31 commits intomasterfrom
progressive-enhancement

Conversation

@anthonypdawson
Copy link
Copy Markdown
Owner

@anthonypdawson anthonypdawson commented Apr 19, 2026

This pull request delivers a major update focused on dramatically improving installation speed and user experience for Vector Inspector. The core app now installs in seconds, with all database providers and advanced features made optional, installable on demand via both the GUI and a new CLI wizard. The project’s dependency management has been refactored to support this modular approach, and the documentation has been updated to guide users through the new installation options.

Key changes include:

Progressive, Modular Installation

  • The default installation now only includes the minimal set of core dependencies, reducing install time from 10 minutes to about 30 seconds. Database providers and advanced features (like embeddings, visualization, and document import) are now optional and can be installed individually or via bundles such as [recommended] or [all] for full functionality. [1] [2] [3]
  • The pyproject.toml has been refactored to define optional dependency groups for each provider and feature, as well as convenience bundles for common use cases. [1] [2]

CLI and UI Enhancements for Provider Management

  • A new --install CLI flag enables users to install providers without launching the GUI, either interactively (wizard mode) or directly by provider ID. The CLI checks installed providers, displays installation commands, and streams output. [1] [2] [3]
  • The app’s UI now guides users to install missing providers or features when needed, with one-click installation dialogs and live feedback.

Documentation and Release Notes

  • The README.md and release notes have been rewritten to explain the new progressive installation workflow, all optional extras, and migration guidance for existing users. [1] [2] [3]
  • Detailed tables and examples clarify the new install options for both pip and PDM users. [1] [2]

Version Bump

  • The project version is updated to 0.8.0 everywhere to reflect this major release. [1] [2] [3]

These changes make Vector Inspector much more accessible, reduce installation friction, and lay the groundwork for further feature enhancements.

anthonypdawson and others added 8 commits April 17, 2026 16:35
…cies into groups, add convenience bundles, and clean up core dependencies for improved clarity and maintainability.
- Updated README.md to include installation options for core, recommended, and all providers, improving user guidance.
- Introduced lazy loading for connection classes in __init__.py to prevent import errors for uninstalled providers.
- Added provider detection and installation helpers in provider_detection.py to streamline provider management.
- Refactored connection handling in provider_factory.py and connection_view.py to utilize lazy imports and improve user experience.
- Updated info_panel.py to use provider_type for connection details, enhancing maintainability and clarity.
- Implemented a new dialog for installing missing database provider packages, allowing users to view installation instructions and install providers directly within the app.
- Enhanced the settings dialog to include tabs for managing optional feature groups and database providers, with background checks for availability and uninstall options.
- Added background threads for uninstalling features and providers, improving user experience during package management.
- Updated connection view to handle provider installation prompts and refresh provider lists after installations.
- Introduced lazy loading for feature dependencies, raising structured errors to guide users in installing required packages.

Co-authored-by: Copilot <copilot@github.com>
…e handling

- Introduced comprehensive tests for the ProviderInstallDialog, covering instantiation, UI state, installation success and failure paths, and feature compatibility.
- Enhanced SettingsDialog tests to include feature tab functionality, ensuring correct button states and tooltips for install/uninstall actions.
- Implemented fixtures to prevent modal dialogs from blocking tests in connection and visualization views.
- Added checks for feature availability and proper handling of missing dependencies in visualization-related tests.

Co-authored-by: Copilot <copilot@github.com>
…on features and CLI install wizard

Co-authored-by: Copilot <copilot@github.com>
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 19, 2026

❌ 54 Tests Failed:

Tests completed Failed Passed Skipped
2373 54 2319 3
View the top 3 failed test(s) by shortest run time
tests/ui/test_settings_dialog.py::test_add_section_creates_tab_if_missing
Stack Traces | 0.016s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_core_tabs_present
Stack Traces | 0.016s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_get_tab_layout_creates_new_tab
Stack Traces | 0.016s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_get_tab_layout_returns_existing
Stack Traces | 0.016s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_status_timeout_spinbox_change_calls_settings
Stack Traces | 0.016s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_status_timeout_spinbox_loads_default
Stack Traces | 0.016s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_status_timeout_spinbox_zero_shows_permanent_text
Stack Traces | 0.016s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_add_section_layout_routed_to_correct_tab
Stack Traces | 0.017s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_on_provider_uninstall_clicked_yes_starts_thread
Stack Traces | 0.017s run time
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f511c271d10>
qtbot = <pytestqt.qtbot.QtBot object at 0x7f511c270a50>

    def test_on_provider_uninstall_clicked_yes_starts_thread(monkeypatch, qtbot):
        """Confirming the uninstall dialog starts a _ProviderUninstallThread."""
        from unittest.mock import patch
    
        dlg = _make_settings_with_providers_patched(monkeypatch, qtbot, chromadb_available=True)
        monkeypatch.setattr(QMessageBox, "question", lambda *a, **k: QMessageBox.StandardButton.Yes)
    
>       with patch("vector_inspector.ui.dialogs.settings_dialog._ProviderUninstallThread.start"):

tests/ui/test_settings_dialog.py:780: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../hostedtoolcache/Python/3.11.15....../x64/lib/python3.11/unittest/mock.py:1430: in __enter__
    self.target = self.getter()
                  ^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

name = 'vector_inspector.ui.dialogs.settings_dialog._ProviderUninstallThread'

    def resolve_name(name):
        """
        Resolve a name to an object.
    
        It is expected that `name` will be a string in one of the following
        formats, where W is shorthand for a valid Python identifier and dot stands
        for a literal period in these pseudo-regexes:
    
        W(.W)*
        W(.W)*:(W(.W)*)?
    
        The first form is intended for backward compatibility only. It assumes that
        some part of the dotted name is a package, and the rest is an object
        somewhere within that package, possibly nested inside other objects.
        Because the place where the package stops and the object hierarchy starts
        can't be inferred by inspection, repeated attempts to import must be done
        with this form.
    
        In the second form, the caller makes the division point clear through the
        provision of a single colon: the dotted name to the left of the colon is a
        package to be imported, and the dotted name to the right is the object
        hierarchy within that package. Only one import is needed in this form. If
        it ends with the colon, then a module object is returned.
    
        The function will return an object (which might be a module), or raise one
        of the following exceptions:
    
        ValueError - if `name` isn't in a recognised format
        ImportError - if an import failed when it shouldn't have
        AttributeError - if a failure occurred when traversing the object hierarchy
                         within the imported package to get to the desired object.
        """
        global _NAME_PATTERN
        if _NAME_PATTERN is None:
            # Lazy import to speedup Python startup time
            import re
            dotted_words = r'(?!\d)(\w+)(\.(?!\d)(\w+))*'
            _NAME_PATTERN = re.compile(f'^(?P<pkg>{dotted_words})'
                                       f'(?P<cln>:(?P<obj>{dotted_words})?)?$',
                                       re.UNICODE)
    
        m = _NAME_PATTERN.match(name)
        if not m:
            raise ValueError(f'invalid format: {name!r}')
        gd = m.groupdict()
        if gd.get('cln'):
            # there is a colon - a one-step import is all that's needed
            mod = importlib.import_module(gd['pkg'])
            parts = gd.get('obj')
            parts = parts.split('.') if parts else []
        else:
            # no colon - have to iterate to find the package boundary
            parts = name.split('.')
            modname = parts.pop(0)
            # first part *must* be a module/package.
            mod = importlib.import_module(modname)
            while parts:
                p = parts[0]
                s = f'{modname}.{p}'
                try:
                    mod = importlib.import_module(s)
                    parts.pop(0)
                    modname = s
                except ImportError:
                    break
        # if we reach this point, mod is the module, already imported, and
        # parts is the list of parts in the object hierarchy to be traversed, or
        # an empty list if just the module is wanted.
        result = mod
        for p in parts:
>           result = getattr(result, p)
                     ^^^^^^^^^^^^^^^^^^
E           AttributeError: module 'vector_inspector.ui.dialogs.settings_dialog' has no attribute '_ProviderUninstallThread'

.../hostedtoolcache/Python/3.11.15....../x64/lib/python3.11/pkgutil.py:715: AttributeError
tests/ui/test_settings_dialog.py::test_dialog_has_tab_widget
Stack Traces | 0.018s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_on_provider_uninstall_clicked_cancelled_does_not_start_thread
Stack Traces | 0.018s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_provider_installed_shows_uninstall_button
Stack Traces | 0.018s run time
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f510f0b9250>
qtbot = <pytestqt.qtbot.QtBot object at 0x7f510f0ba250>

    def test_provider_installed_shows_uninstall_button(monkeypatch, qtbot):
        """An available provider row shows an 'Uninstall' button."""
        dlg = _make_settings_with_providers_patched(monkeypatch, qtbot, chromadb_available=True)
>       assert dlg._provider_rows["chromadb"]["action_btn"].text() == "Uninstall"
E       AssertionError: assert 'Checking…' == 'Uninstall'
E         
E         - Uninstall
E         + Checking…

tests/ui/test_settings_dialog.py:677: AssertionError
tests/ui/test_settings_dialog.py::test_provider_not_installed_shows_cross
Stack Traces | 0.018s run time
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f510fc3f2d0>
qtbot = <pytestqt.qtbot.QtBot object at 0x7f511c3a2d50>

    def test_provider_not_installed_shows_cross(monkeypatch, qtbot):
        """An unavailable provider row shows ✘ in its status label."""
        dlg = _make_settings_with_providers_patched(monkeypatch, qtbot, chromadb_available=False)
>       assert "✘" in dlg._provider_rows["chromadb"]["status_lbl"].text()
E       AssertionError: assert '\u2718' in '\u22ef'
E        +  where '\u22ef' = <built-in method text of PySide6.QtWidgets.QLabel object at 0x7f511c4080c0>()
E        +    where <built-in method text of PySide6.QtWidgets.QLabel object at 0x7f511c4080c0> = <PySide6.QtWidgets.QLabel(0x55dfe4fbcf40) at 0x7f511c4080c0>.text

tests/ui/test_settings_dialog.py:689: AssertionError
tests/ui/test_settings_dialog.py::test_provider_not_installed_shows_install_button
Stack Traces | 0.018s run time
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f511c717fd0>
qtbot = <pytestqt.qtbot.QtBot object at 0x7f511c715890>

    def test_provider_not_installed_shows_install_button(monkeypatch, qtbot):
        """An unavailable provider row shows an 'Install' button."""
        dlg = _make_settings_with_providers_patched(monkeypatch, qtbot, chromadb_available=False)
>       assert dlg._provider_rows["chromadb"]["action_btn"].text() == "Install"
E       AssertionError: assert 'Checking…' == 'Install'
E         
E         - Install
E         + Checking…

tests/ui/test_settings_dialog.py:671: AssertionError
tests/ui/test_settings_dialog.py::test_refresh_provider_statuses_updates_button_when_newly_installed
Stack Traces | 0.018s run time
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f510f243250>
qtbot = <pytestqt.qtbot.QtBot object at 0x7f511c04e350>

    def test_refresh_provider_statuses_updates_button_when_newly_installed(monkeypatch, qtbot):
        """Calling _refresh_provider_statuses picks up a changed availability."""
        import vector_inspector.core.provider_detection as pd
        from vector_inspector.core.provider_detection import ProviderInfo
    
        monkeypatch.setattr(pd, "check_viz_available", lambda: False)
        monkeypatch.setattr(pd, "check_embeddings_available", lambda: False)
        monkeypatch.setattr(pd, "check_clip_available", lambda: False)
        monkeypatch.setattr(pd, "check_documents_available", lambda: False)
    
        # Start with chromadb unavailable
        monkeypatch.setattr(
            pd,
            "get_all_provider_metadata",
            lambda: [
                ProviderInfo(
                    id="chromadb",
                    name="ChromaDB",
                    available=False,
                    install_command="pip install ...",
                    import_name="chromadb",
                    description="Local persistent or HTTP client",
                )
            ],
        )
        monkeypatch.setattr(
            pd,
            "get_provider_availability_checks",
            lambda: {"chromadb": (lambda: False)},
        )
    
        fake_settings = FakeSettings()
        dlg = SettingsDialog(settings_service=fake_settings)
        qtbot.addWidget(dlg)
        qtbot.waitUntil(lambda: dlg._features_checked and dlg._providers_checked, timeout=3000)
    
>       assert dlg._provider_rows["chromadb"]["action_btn"].text() == "Install"
E       AssertionError: assert 'Checking…' == 'Install'
E         
E         - Install
E         + Checking…

tests/ui/test_settings_dialog.py:728: AssertionError
tests/ui/test_settings_dialog.py::test_on_provider_uninstall_done_failure_updates_status_message
Stack Traces | 0.019s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_on_provider_uninstall_done_success_updates_status_message
Stack Traces | 0.019s run time
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f511c468710>
qtbot = <pytestqt.qtbot.QtBot object at 0x7f511c468f10>

    def test_on_provider_uninstall_done_success_updates_status_message(monkeypatch, qtbot):
        """A returncode of 0 sets the provider status message to 'Removed'."""
        dlg = _make_settings_with_providers_patched(monkeypatch, qtbot, chromadb_available=True)
>       dlg._on_provider_uninstall_done("chromadb", 0, "Uninstalled successfully")

tests/ui/test_settings_dialog.py:810: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../ui/dialogs/settings_dialog.py:655: in _on_provider_uninstall_done
    self._apply_row_result(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <vector_inspector.ui.dialogs.settings_dialog.SettingsDialog(0x55dfd406dd90) at 0x7f511c469f80>
widgets = {'action_btn': <PySide6.QtWidgets.QPushButton(0x55dfe44fa450) at 0x7f510fc87700>, 'status_lbl': <PySide6.QtWidgets.QLabel(0x55dfd1324ea0) at 0x7f510fc87340>, 'status_msg': <PySide6.QtWidgets.QLabel(0x55dfe7689030) at 0x7f510fc84f00>}
available = False

    def _apply_row_result(
        self,
        widgets: dict,
        available: bool,
        *,
        on_install,
        on_uninstall,
    ) -> None:
        """Apply an availability check result to a row's widgets.
    
        Does not touch ``status_msg`` \u2014 callers set that independently.
        """
        try:
>           with warnings.catch_warnings():
                 ^^^^^^^^
E           NameError: name 'warnings' is not defined

.../ui/dialogs/settings_dialog.py:455: NameError
tests/ui/test_settings_dialog.py::test_provider_installed_shows_checkmark
Stack Traces | 0.019s run time
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f511c5013d0>
qtbot = <pytestqt.qtbot.QtBot object at 0x7f511e94c590>

    def test_provider_installed_shows_checkmark(monkeypatch, qtbot):
        """An available provider row shows ✔ in its status label."""
        dlg = _make_settings_with_providers_patched(monkeypatch, qtbot, chromadb_available=True)
>       assert "✔" in dlg._provider_rows["chromadb"]["status_lbl"].text()
E       AssertionError: assert '\u2714' in '\u22ef'
E        +  where '\u22ef' = <built-in method text of PySide6.QtWidgets.QLabel object at 0x7f510f1ad480>()
E        +    where <built-in method text of PySide6.QtWidgets.QLabel object at 0x7f510f1ad480> = <PySide6.QtWidgets.QLabel(0x55dfd0fec9a0) at 0x7f510f1ad480>.text

tests/ui/test_settings_dialog.py:683: AssertionError
tests/ui/test_settings_dialog.py::test_provider_rows_created_for_patched_providers
Stack Traces | 0.019s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_uninstall_button_click_emits_with_bool_arg
Stack Traces | 0.019s run time
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f511c05e8d0>
qtbot = <pytestqt.qtbot.QtBot object at 0x7f511c05cd10>

    def test_uninstall_button_click_emits_with_bool_arg(monkeypatch, qtbot):
        """Clicking the Uninstall button must reach _on_provider_uninstall_clicked.
    
        QPushButton.clicked emits (checked: bool). A lambda with a default-value
        parameter (``lambda pid=x:``) would receive the bool as its arg, replacing
        the provider ID. This test simulates the signal emission to catch that.
        """
        from unittest.mock import patch
    
        dlg = _make_settings_with_providers_patched(monkeypatch, qtbot, chromadb_available=True)
        monkeypatch.setattr(QMessageBox, "question", lambda *a, **k: QMessageBox.StandardButton.Yes)
    
>       with patch("vector_inspector.ui.dialogs.settings_dialog._ProviderUninstallThread.start"):

tests/ui/test_settings_dialog.py:800: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../hostedtoolcache/Python/3.11.15....../x64/lib/python3.11/unittest/mock.py:1430: in __enter__
    self.target = self.getter()
                  ^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

name = 'vector_inspector.ui.dialogs.settings_dialog._ProviderUninstallThread'

    def resolve_name(name):
        """
        Resolve a name to an object.
    
        It is expected that `name` will be a string in one of the following
        formats, where W is shorthand for a valid Python identifier and dot stands
        for a literal period in these pseudo-regexes:
    
        W(.W)*
        W(.W)*:(W(.W)*)?
    
        The first form is intended for backward compatibility only. It assumes that
        some part of the dotted name is a package, and the rest is an object
        somewhere within that package, possibly nested inside other objects.
        Because the place where the package stops and the object hierarchy starts
        can't be inferred by inspection, repeated attempts to import must be done
        with this form.
    
        In the second form, the caller makes the division point clear through the
        provision of a single colon: the dotted name to the left of the colon is a
        package to be imported, and the dotted name to the right is the object
        hierarchy within that package. Only one import is needed in this form. If
        it ends with the colon, then a module object is returned.
    
        The function will return an object (which might be a module), or raise one
        of the following exceptions:
    
        ValueError - if `name` isn't in a recognised format
        ImportError - if an import failed when it shouldn't have
        AttributeError - if a failure occurred when traversing the object hierarchy
                         within the imported package to get to the desired object.
        """
        global _NAME_PATTERN
        if _NAME_PATTERN is None:
            # Lazy import to speedup Python startup time
            import re
            dotted_words = r'(?!\d)(\w+)(\.(?!\d)(\w+))*'
            _NAME_PATTERN = re.compile(f'^(?P<pkg>{dotted_words})'
                                       f'(?P<cln>:(?P<obj>{dotted_words})?)?$',
                                       re.UNICODE)
    
        m = _NAME_PATTERN.match(name)
        if not m:
            raise ValueError(f'invalid format: {name!r}')
        gd = m.groupdict()
        if gd.get('cln'):
            # there is a colon - a one-step import is all that's needed
            mod = importlib.import_module(gd['pkg'])
            parts = gd.get('obj')
            parts = parts.split('.') if parts else []
        else:
            # no colon - have to iterate to find the package boundary
            parts = name.split('.')
            modname = parts.pop(0)
            # first part *must* be a module/package.
            mod = importlib.import_module(modname)
            while parts:
                p = parts[0]
                s = f'{modname}.{p}'
                try:
                    mod = importlib.import_module(s)
                    parts.pop(0)
                    modname = s
                except ImportError:
                    break
        # if we reach this point, mod is the module, already imported, and
        # parts is the list of parts in the object hierarchy to be traversed, or
        # an empty list if just the module is wanted.
        result = mod
        for p in parts:
>           result = getattr(result, p)
                     ^^^^^^^^^^^^^^^^^^
E           AttributeError: module 'vector_inspector.ui.dialogs.settings_dialog' has no attribute '_ProviderUninstallThread'

.../hostedtoolcache/Python/3.11.15....../x64/lib/python3.11/pkgutil.py:715: AttributeError
tests/ui/test_settings_dialog.py::test_features_tab_installed_shows_checkmark
Stack Traces | 0.02s run time
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f511bdea190>
qtbot = <pytestqt.qtbot.QtBot object at 0x7f511bfc1f10>

    def test_features_tab_installed_shows_checkmark(monkeypatch, qtbot):
        """Status label shows a checkmark for installed features."""
        dlg = _make_settings_with_features_tab(
            monkeypatch, qtbot, features_available={"viz": True, "embeddings": False, "clip": False, "documents": False}
        )
>       assert "✔" in dlg._feature_rows["viz"]["status_lbl"].text()
E       AssertionError: assert '\u2714' in '\u22ef'
E        +  where '\u22ef' = <built-in method text of PySide6.QtWidgets.QLabel object at 0x7f511c2eaac0>()
E        +    where <built-in method text of PySide6.QtWidgets.QLabel object at 0x7f511c2eaac0> = <PySide6.QtWidgets.QLabel(0x55dfd1b0a2a0) at 0x7f511c2eaac0>.text

tests/ui/test_settings_dialog.py:524: AssertionError
tests/ui/test_settings_dialog.py::test_features_tab_installed_shows_uninstall_button
Stack Traces | 0.02s run time
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f51a06bd6d0>
qtbot = <pytestqt.qtbot.QtBot object at 0x7f511bde6490>

    def test_features_tab_installed_shows_uninstall_button(monkeypatch, qtbot):
        """When a feature is installed its action button reads 'Uninstall'."""
        dlg = _make_settings_with_features_tab(
            monkeypatch, qtbot, features_available={"viz": True, "embeddings": False, "clip": False, "documents": False}
        )
>       assert dlg._feature_rows["viz"]["action_btn"].text() == "Uninstall"
E       AssertionError: assert 'Checking…' == 'Uninstall'
E         
E         - Uninstall
E         + Checking…

tests/ui/test_settings_dialog.py:516: AssertionError
tests/ui/test_settings_dialog.py::test_features_tab_not_installed_shows_cross
Stack Traces | 0.02s run time
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f511c048810>
qtbot = <pytestqt.qtbot.QtBot object at 0x7f511c04a110>

    def test_features_tab_not_installed_shows_cross(monkeypatch, qtbot):
        """Status label shows a cross for missing features."""
        dlg = _make_settings_with_features_tab(
            monkeypatch, qtbot, features_available={"viz": False, "embeddings": False, "clip": False, "documents": False}
        )
>       assert "✘" in dlg._feature_rows["viz"]["status_lbl"].text()
E       AssertionError: assert '\u2718' in '\u22ef'
E        +  where '\u22ef' = <built-in method text of PySide6.QtWidgets.QLabel object at 0x7f511c228400>()
E        +    where <built-in method text of PySide6.QtWidgets.QLabel object at 0x7f511c228400> = <PySide6.QtWidgets.QLabel(0x55dfe4c40150) at 0x7f511c228400>.text

tests/ui/test_settings_dialog.py:532: AssertionError
tests/ui/test_settings_dialog.py::test_features_tab_not_installed_shows_install_button
Stack Traces | 0.02s run time
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f511be64f50>
qtbot = <pytestqt.qtbot.QtBot object at 0x7f51a07f41d0>

    def test_features_tab_not_installed_shows_install_button(monkeypatch, qtbot):
        """When a feature is not installed its action button reads 'Install'."""
        dlg = _make_settings_with_features_tab(
            monkeypatch, qtbot, features_available={"viz": False, "embeddings": False, "clip": False, "documents": False}
        )
>       assert dlg._feature_rows["viz"]["action_btn"].text() == "Install"
E       AssertionError: assert 'Checking…' == 'Install'
E         
E         - Install
E         + Checking…

tests/ui/test_settings_dialog.py:508: AssertionError
tests/ui/test_settings_dialog.py::test_on_provider_install_clicked_opens_install_dialog
Stack Traces | 0.02s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_on_uninstall_done_success_updates_status_message
Stack Traces | 0.02s run time
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f511c1f5ed0>
qtbot = <pytestqt.qtbot.QtBot object at 0x7f511c2e9550>

    def test_on_uninstall_done_success_updates_status_message(monkeypatch, qtbot):
        """A returncode of 0 sets the status message to 'Removed'."""
        dlg = _make_settings_with_features_tab(
            monkeypatch, qtbot, features_available={"viz": True, "embeddings": False, "clip": False, "documents": False}
        )
>       dlg._on_uninstall_done("viz", 0, "Uninstalled successfully")

tests/ui/test_settings_dialog.py:597: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../ui/dialogs/settings_dialog.py:600: in _on_uninstall_done
    self._apply_row_result(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <vector_inspector.ui.dialogs.settings_dialog.SettingsDialog(0x55dfe5815570) at 0x7f511c1a5a80>
widgets = {'action_btn': <PySide6.QtWidgets.QPushButton(0x55dfe3d62500) at 0x7f511c2a99c0>, 'status_lbl': <PySide6.QtWidgets.QLabel(0x55dfe4a10570) at 0x7f511c2ab980>, 'status_msg': <PySide6.QtWidgets.QLabel(0x55dfe5815820) at 0x7f511c2a9580>}
available = False

    def _apply_row_result(
        self,
        widgets: dict,
        available: bool,
        *,
        on_install,
        on_uninstall,
    ) -> None:
        """Apply an availability check result to a row's widgets.
    
        Does not touch ``status_msg`` \u2014 callers set that independently.
        """
        try:
>           with warnings.catch_warnings():
                 ^^^^^^^^
E           NameError: name 'warnings' is not defined

.../ui/dialogs/settings_dialog.py:455: NameError
tests/ui/test_settings_dialog.py::test_refresh_feature_statuses_updates_button_when_newly_installed
Stack Traces | 0.02s run time
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f511bef1e10>
qtbot = <pytestqt.qtbot.QtBot object at 0x7f511c01fad0>

    def test_refresh_feature_statuses_updates_button_when_newly_installed(monkeypatch, qtbot):
        """Calling _refresh_feature_statuses picks up a changed availability."""
        import vector_inspector.core.provider_detection as pd
    
        monkeypatch.setattr(pd, "check_viz_available", lambda: False)
        monkeypatch.setattr(pd, "check_embeddings_available", lambda: False)
        monkeypatch.setattr(pd, "check_clip_available", lambda: False)
        monkeypatch.setattr(pd, "check_documents_available", lambda: False)
    
        fake_settings = FakeSettings()
        dlg = SettingsDialog(settings_service=fake_settings)
        qtbot.addWidget(dlg)
        qtbot.waitUntil(lambda: dlg._features_checked and dlg._providers_checked, timeout=3000)
    
>       assert dlg._feature_rows["viz"]["action_btn"].text() == "Install"
E       AssertionError: assert 'Checking…' == 'Install'
E         
E         - Install
E         + Checking…

tests/ui/test_settings_dialog.py:549: AssertionError
tests/ui/test_settings_dialog.py::test_feature_row_action_btn_tooltip_contains_package_spec
Stack Traces | 0.021s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_on_uninstall_clicked_cancelled_does_not_start_thread
Stack Traces | 0.021s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_provider_row_action_btn_tooltip_contains_package_spec
Stack Traces | 0.021s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_features_tab_has_all_four_feature_rows
Stack Traces | 0.022s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_on_install_clicked_opens_provider_install_dialog
Stack Traces | 0.022s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_on_uninstall_done_failure_updates_status_message
Stack Traces | 0.022s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_providers_tab_is_separate_from_features_tab
Stack Traces | 0.022s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_features_tab_exists
Stack Traces | 0.066s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_reset_defaults_sets_timeout_to_5s
Stack Traces | 0.615s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
View the full list of 18 ❄️ flaky test(s)
tests/ui/test_settings_appearance.py::test_accent_checkbox_toggles_global_stylesheet

Flake rate in main: 5.56% (Passed 17 times, Failed 1 times)

Stack Traces | 0.205s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_appearance.py::test_color_picker_updates_settings

Flake rate in main: 5.56% (Passed 17 times, Failed 1 times)

Stack Traces | 0.013s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_appearance.py::test_loads_saved_color_values_on_init

Flake rate in main: 5.56% (Passed 17 times, Failed 1 times)

Stack Traces | 0.012s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_appearance.py::test_reset_button_restores_defaults_and_saves

Flake rate in main: 5.56% (Passed 17 times, Failed 1 times)

Stack Traces | 0.017s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_add_section_and_cache_info

Flake rate in main: 5.56% (Passed 17 times, Failed 1 times)

Stack Traces | 0.012s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_apply_preset

Flake rate in main: 5.56% (Passed 17 times, Failed 1 times)

Stack Traces | 0.013s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_clear_cache_answer_no

Flake rate in main: 5.56% (Passed 17 times, Failed 1 times)

Stack Traces | 0.012s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_clear_cache_flow

Flake rate in main: 5.56% (Passed 17 times, Failed 1 times)

Stack Traces | 0.013s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_clear_cache_returns_false

Flake rate in main: 5.56% (Passed 17 times, Failed 1 times)

Stack Traces | 0.012s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_load_values_accent_checkbox_checked_when_enabled

Flake rate in main: 5.56% (Passed 17 times, Failed 1 times)

Stack Traces | 0.142s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_load_values_and_apply

Flake rate in main: 5.56% (Passed 17 times, Failed 1 times)

Stack Traces | 0.012s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_ok_button_calls_apply_and_accepts

Flake rate in main: 5.56% (Passed 17 times, Failed 1 times)

Stack Traces | 0.012s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_on_use_accent_changed_disabled

Flake rate in main: 5.56% (Passed 17 times, Failed 1 times)

Stack Traces | 0.658s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_on_use_accent_changed_enabled

Flake rate in main: 5.56% (Passed 17 times, Failed 1 times)

Stack Traces | 0.125s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_reset_highlight_defaults

Flake rate in main: 5.56% (Passed 17 times, Failed 1 times)

Stack Traces | 0.012s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_settings_panel_hook_exception_swallowed

Flake rate in main: 5.56% (Passed 17 times, Failed 1 times)

Stack Traces | 0.013s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_update_cache_info_cache_exists_with_models

Flake rate in main: 5.56% (Passed 17 times, Failed 1 times)

Stack Traces | 0.012s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
tests/ui/test_settings_dialog.py::test_update_cache_info_enabled_no_models_yet

Flake rate in main: 5.56% (Passed 17 times, Failed 1 times)

Stack Traces | 0.012s run time
CALL ERROR: Exceptions caught in Qt event loop:
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 496, in _on_feature_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________
Traceback (most recent call last):
  File ".../ui/dialogs/settings_dialog.py", line 533, in _on_provider_status_result
    self._apply_row_result(
  File ".../ui/dialogs/settings_dialog.py", line 455, in _apply_row_result
    with warnings.catch_warnings():
         ^^^^^^^^
NameError: name 'warnings' is not defined
________________________________________________________________________________

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces a progressive-installation model: the core app installs quickly with minimal dependencies, while database providers and feature packs become optional and installable on demand via UI prompts and a new CLI installer.

Changes:

  • Refactors packaging to optional dependency groups/extras (plus bundles like [recommended] and [all]) and bumps version to 0.8.0.
  • Adds provider/feature detection + in-app install dialog + settings management UI (install/uninstall + background status checks).
  • Adds --install CLI flow (direct install or interactive wizard) and expands tests/docs accordingly.

Reviewed changes

Copilot reviewed 28 out of 30 changed files in this pull request and generated 11 comments.

Show a summary per file
File Description
tests/views/test_visualization_view.py Prevents modal gating in tests; adds coverage for feature-missing handling.
tests/views/test_connection_view.py Adds autouse patches for provider install dialog; updates connection-class patching for lazy provider loading.
tests/utils/test_lazy_imports.py Skips sklearn-dependent tests when absent; adds tests for FeatureDependencyMissingError and missing-dep behavior.
tests/ui/test_settings_dialog.py Adds test coverage for new Features/Providers tabs and install/uninstall flows.
tests/ui/test_provider_install_dialog.py Adds comprehensive tests for the new modal install dialog behavior.
tests/test_cli.py Adds tests for --install direct mode and interactive wizard mode.
tests/services/test_provider_install_service.py Adds unit tests for provider/feature install & uninstall subprocess command construction and behavior.
tests/core/test_provider_detection_features.py Adds tests for feature-group availability checks and metadata lookups.
tests/core/llm_providers/test_ollama.py Updates expectations to match new Ollama logging behavior.
src/vector_inspector/utils/lazy_imports.py Adds FeatureDependencyMissingError and structured missing-dependency signaling for optional features.
src/vector_inspector/ui/views/visualization_view.py Adds viz dependency gating + install dialog flow; adds a feature_missing signal path from the reduction thread.
src/vector_inspector/ui/views/info_panel.py Switches provider type detection away from direct isinstance imports toward a string-based provider id.
src/vector_inspector/ui/views/connection_view.py Replaces hardcoded provider list with availability-aware provider detection + install prompts + refresh button.
src/vector_inspector/ui/dialogs/settings_dialog.py Adds Features/Providers management tabs with background availability checking and uninstall threads.
src/vector_inspector/ui/dialogs/provider_install_dialog.py Adds a reusable modal dialog to install providers/features with live pip output streaming.
src/vector_inspector/ui/components/profile_manager_panel.py Populates providers dynamically with availability display and install prompting.
src/vector_inspector/ui/components/create_collection_dialog.py Adds embeddings feature gating when enabling “Add sample data”.
src/vector_inspector/services/provider_install_service.py Adds install/uninstall helpers for providers and feature groups via sys.executable -m pip.
src/vector_inspector/core/provider_factory.py Switches provider creation to use get_connection_class() lazy imports.
src/vector_inspector/core/provider_detection.py Introduces provider/feature registries and availability checks + static metadata helpers.
src/vector_inspector/core/llm_providers/ollama_provider.py Adjusts logging severity/wording for expected “Ollama not running” conditions.
src/vector_inspector/core/connections/base_connection.py Adds provider_type property used for provider identification without importing provider classes.
src/vector_inspector/core/connections/init.py Adds get_connection_class() for lazy provider class imports.
src/vector_inspector/_cli.py Adds --install early-exit provider installer (direct + wizard).
src/vector_inspector/init.py Bumps __version__ to 0.8.0.
scripts/run.sh Adds a PDM-based run script for local development.
pyproject.toml Refactors dependencies into optional groups/extras; adds bundles; bumps version to 0.8.0.
docs/RELEASE_REASON.md Updates release notes to document progressive installation and on-demand features/providers.
README.md Updates installation docs for minimal/recommended/all installs + provider/feature extras.

Comment thread src/vector_inspector/core/provider_detection.py
Comment thread src/vector_inspector/ui/views/visualization_view.py
Comment thread src/vector_inspector/core/connections/base_connection.py Outdated
Comment thread src/vector_inspector/ui/views/visualization_view.py Outdated
Comment thread src/vector_inspector/ui/views/connection_view.py Outdated
Comment thread src/vector_inspector/ui/views/visualization_view.py Outdated
Comment thread src/vector_inspector/ui/dialogs/provider_install_dialog.py
Comment thread src/vector_inspector/services/provider_install_service.py Outdated
Comment thread src/vector_inspector/core/provider_detection.py Outdated
Comment thread src/vector_inspector/services/provider_install_service.py Outdated
anthonypdawson and others added 3 commits April 21, 2026 12:12
…r handling, and update UI interactions

Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <copilot@github.com>
@coveralls
Copy link
Copy Markdown

coveralls commented Apr 22, 2026

Coverage Status

coverage: 80.553% (+0.07%) from 80.484% — progressive-enhancement into master

anthonypdawson and others added 2 commits April 24, 2026 17:17
- Consolidated installation and uninstallation functions into a single `install` and `uninstall` function in `install_service.py`.
- Updated the `provider_install_dialog.py` and `settings_dialog.py` to use the new consolidated functions.
- Removed the old `provider_install_service.py` and its associated tests.
- Added comprehensive tests for the new installation and uninstallation functions in `test_install_service.py`.
- Adjusted related tests and UI interactions to reflect the changes in service structure.

Co-authored-by: Copilot <copilot@github.com>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 29 out of 31 changed files in this pull request and generated 1 comment.

Comment thread src/vector_inspector/ui/views/connection_view.py Outdated
anthonypdawson and others added 9 commits April 25, 2026 13:24
…p optional dependencies in pyproject.toml

Co-authored-by: Copilot <copilot@github.com>
…d of extras

Co-authored-by: Copilot <copilot@github.com>
…ndencies

Co-authored-by: Copilot <copilot@github.com>
…nection type handling

Co-authored-by: Copilot <copilot@github.com>
…on and visibility handling

- Added mock providers for consistent testing.
- Implemented tests for field visibility based on provider and connection type.
- Verified correct behavior for saving profiles with placeholder providers.
- Ensured proper handling of unavailable providers in the UI.

Co-authored-by: Copilot <copilot@github.com>
…p logic

Co-authored-by: Copilot <copilot@github.com>
anthonypdawson and others added 6 commits April 26, 2026 11:28
…rvice tests

Co-authored-by: Copilot <copilot@github.com>
… configuration and improved handling of unavailable providers

Co-authored-by: Copilot <copilot@github.com>
…dialog opening

Co-authored-by: Copilot <copilot@github.com>
…ions

Co-authored-by: Copilot <copilot@github.com>
@anthonypdawson
Copy link
Copy Markdown
Owner Author

@copilot review this pr

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 30, 2026

@copilot review this pr

Reviewed the PR. All CI checks are passing (tests, CodeQL, codecov). Here's a summary of the current state:

All previously flagged issues have been addressed:

  • check_provider_available() and check_viz_available() now use importlib.util.find_spec — fast, side-effect-free availability checks
  • VisualizationThread.run() logs via log_error(..., exc_info=True) instead of traceback.print_exc()
  • provider_type in base_connection.py uses .removesuffix("Connection") + a single chromadb special-case — LanceDBConnection correctly resolves to "lancedb"
  • ✅ Both _generate_visualization() call sites defer until after dlg.exec() returns, checking availability freshly before proceeding
  • _refresh_providers() uses importlib.invalidate_caches() — no sys.modules mutation
  • _update_help_text() calls get_all_providers() once and derives all counts from the same list
  • ProviderInstallDialog.closeEvent blocks window close while _thread.isRunning()
  • install_service.py narrows exception handling to OSError only, with item IDs validated against a whitelist before any subprocess call (good security posture)
  • blockSignals(True/False) wraps combo repopulation to prevent spurious _on_provider_changed triggers

No new issues found. The code is clean, consistent with project conventions, and the progressive installation model is well-structured. Ready to merge.

anthonypdawson and others added 2 commits April 30, 2026 10:42
…registry helpers for provider management

Co-authored-by: Copilot <copilot@github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants