Skip to content

NXENG-627: PySide Migration - #6450

Open
S-Ghosh-Dev2 wants to merge 21 commits into
masterfrom
NXENG-627-pyside-migration
Open

NXENG-627: PySide Migration#6450
S-Ghosh-Dev2 wants to merge 21 commits into
masterfrom
NXENG-627-pyside-migration

Conversation

@S-Ghosh-Dev2

@S-Ghosh-Dev2 S-Ghosh-Dev2 commented Aug 24, 2026

Copy link
Copy Markdown
Collaborator

Summary by Sourcery

Complete the application-wide migration from PyQt6 to PySide6 while consolidating QML window management and updating build, deployment, documentation, and test infrastructure.

New Features:

  • Migrate the application’s Qt runtime and Direct Transfer flow from PyQt6 to PySide6.
  • Add a migration ledger documenting completed work, validation, compatibility decisions, and remaining tasks.

Bug Fixes:

  • Improve startup and frozen-build stability by standardizing QML window ownership, registering native callbacks as Qt slots, and avoiding premature Settings presentation.
  • Prevent unnecessary manager creation when forwarding protocols to an existing instance and improve pending-task error logging.

Enhancements:

  • Unify application windows under a single QML engine across platforms and update Qt signal, model, scheduling, and object-data compatibility for PySide6.
  • Update tests, deployment checks, and dependency management for PySide6 while removing PyQt6 runtime requirements.
  • Remove obsolete bundled icon assets.

Build:

  • Replace PyQt6 packages with PySide6, its components, and Shiboken6 in the pinned dependencies.

CI:

  • Increase macOS release validation timeouts to accommodate the migrated build.

Deployment:

  • Update POSIX and Windows installation validation to require PySide6 and remove the PyQt6-specific Windows deployment workaround.

Documentation:

  • Document the PySide6 migration status, compatibility decisions, validation results, and remaining work.

Tests:

  • Migrate Qt test imports and patch targets to PySide6 or the shared Qt shim and add regression coverage for window creation, signal-slot registration, Settings routing, startup behavior, and PySide6 model and scheduling compatibility.

@S-Ghosh-Dev2
S-Ghosh-Dev2 requested review from gitofanindya and a lite review from Copilot August 24, 2026 11:06
@sourcery-ai

sourcery-ai Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Reviewer's Guide

This PR migrates the application and Direct Transfer flow from PyQt6 to PySide6 via a centralized compatibility shim, updates Qt-specific signal/model and frozen-build lifecycle behavior, introduces a temporary Settings QML adapter POC, and aligns dependencies, deployment scripts, tests, and documentation with the new binding.

Sequence diagram for Settings section routing

sequenceDiagram
    participant User
    participant Tray as Systray
    participant Application
    participant Settings as Main_QML_Settings_window

    User->>Tray: activate
    Tray->>Application: show_settings(section)
    Application->>Application: setSection.emit(section)
    Application->>Application: _center_on_screen(settings_window)
    Application->>Settings: show

    alt unknown section
        Application->>Application: show_settings(unknown_section)
        Application->>Application: setSection.emit(Features)
    end
Loading

Sequence diagram for account error Settings routing

sequenceDiagram
    participant QML as Settings_QML
    participant API as QMLDriveApi
    participant Application
    participant Settings as Main_QML_Settings_window

    QML->>API: bind_server(server_url, local_folder, token, check_fs)
    API->>Application: show_settings(Accounts)
    Application->>Settings: setSection.emit(Accounts)
    Application->>Application: _center_on_screen(settings_window)
    Application->>Settings: show
Loading

Flow diagram for PySide6 model and type compatibility updates

flowchart TD
    QML[Direct Transfer QML]
    Models[DirectTransferModel and ActiveSessionModel]
    Roles[dataChanged role ID list]
    FolderTree[Folder tree loaders]
    PythonData[Direct Python objects]
    Schedule[ScheduleDialog]
    PythonDate["QDateTime.toPython()"]

    QML --> Models
    Models --> Roles
    FolderTree --> PythonData
    Schedule --> PythonDate
Loading

File-Level Changes

Change Details Files
Switch the application’s primary Qt binding from PyQt6 to PySide6 through a centralized compatibility shim.
  • Re-exported QtCore, QtGui, QtNetwork, QtQml, QtQuick, and QtWidgets APIs from PySide6.
  • Preserved pyqtSignal/pyqtSlot/pyqtProperty compatibility names and recreated QT_VERSION_STR.
  • Adjusted module locations and removed QVariant usage.
  • Added a temporary secondary PySide namespace for legacy Settings-related code.
nxdrive/drive/qt/imports.py
nxdrive/drive/qt/constants.py
nxdrive/drive/qt/__init__.py
Migrate application GUI, Direct Transfer, scheduling, models, signals, and lifecycle callbacks to PySide6-compatible behavior.
  • Stored Python objects directly in item models and emitted role ID lists for dataChanged.
  • Replaced QDateTime.toPyDateTime() with toPython().
  • Updated overloaded signal syntax and corrected signal-slot argument and decorator compatibility.
  • Registered native tray, window, manager, and engine callbacks as explicit slots.
  • Changed settings routing to use the existing Settings QML window and suppressed automatic startup presentation for frozen-build stability.
  • Moved metrics dialog and OAuth loopback Qt imports to the central shim.
nxdrive/drive/direct_edit.py
nxdrive/drive/engine/engine.py
nxdrive/drive/gui/api.py
nxdrive/drive/gui/application.py
nxdrive/drive/gui/custom_window.py
nxdrive/drive/gui/folders_dialog.py
nxdrive/drive/gui/folders_loader.py
nxdrive/drive/gui/systray.py
nxdrive/drive/gui/view.py
nxdrive/drive/manager.py
nxdrive/alfresco/auth/oauth2.py
Integrate and document the Settings/Features PySide6 proof of concept while avoiding a second runtime Settings host.
  • Added a PySide6 QML host with adapters for API, manager, OS integration, translation, engine/language models, and feature models.
  • Relayed relevant PyQt6 signals into PySide6 adapter objects and retained adapters for QML lifetime.
  • Documented the mixed-binding POC, current compatibility decisions, validation, known gaps, and follow-up cleanup.
nxdrive/drive/gui/pyside_settings_host.py
docs/pyside6_migration.md
Update dependencies, deployment checks, tests, and fixtures for the new binding.
  • Replaced PyQt6 packages with pinned PySide6, addons, essentials, and shiboken6 dependencies.
  • Changed installation validation and functional test skips/patches to PySide6.
  • Made the shared Qt fixture create QApplication and forced direct signal delivery where tests invoke worker methods synchronously.
  • Replaced unsafe C++ virtual-method patching with Python subclass overrides and added slot/settings/startup regression coverage.
tools/deps/requirements.txt
tools/posix/deploy_ci_agent.sh
tools/windows/deploy_ci_agent.ps1
tests/conftest.py
tests/alfresco/functional/gui/test_application.py
tests/alfresco/unit/test_oauth2.py
tests/common/functional/mocked_classes.py
tests/common/integration/macos/test_keyPressEvent.py
tests/common/integration/macos/test_show_hide_refresh_button.py
tests/common/unit/gui/test_api_extra.py
tests/common/unit/gui/test_application.py
tests/common/unit/gui/test_application_gap_coverage.py
tests/common/unit/gui/test_folders_dialog.py
tests/common/unit/gui/test_folders_dialog_extra.py
tests/common/unit/gui/test_multi_folder_dialog.py
tests/common/unit/test_autolock.py
tests/common/unit/test_commandline.py
tests/common/unit/test_direct_download_extra.py
tests/common/unit/test_direct_edit_extra.py
tests/common/unit/test_local_watcher.py
tests/common/unit/test_tracing.py
tests/nuxeo/functional/gui/test_application.py
tests/nuxeo/unit/gui/test_api.py
Remove obsolete icon assets and update platform-specific Qt deployment behavior.
  • Deleted the legacy SVG icon set and icon README.
  • Updated Qt Quick Controls documentation and removed the Windows PyQt6 Bluetooth binary deletion workaround.
nxdrive/drive/data/icons/README.md
nxdrive/drive/data/icons/active.svg
nxdrive/drive/data/icons/app_icon.svg
nxdrive/drive/data/icons/conflict.svg
nxdrive/drive/data/icons/conflict_light.svg
nxdrive/drive/data/icons/disabled.svg
nxdrive/drive/data/icons/disabled_light.svg
nxdrive/drive/data/icons/emblem.svg
nxdrive/drive/data/icons/error.svg
nxdrive/drive/data/icons/error_light.svg
nxdrive/drive/data/icons/idle.svg
nxdrive/drive/data/icons/paused.svg
nxdrive/drive/data/icons/paused_light.svg
nxdrive/drive/data/icons/disabled.svg
nxdrive/drive/data/icons/paused_light.svg
nxdrive/__main__.py
nxdrive/drive/gui/multi_folder_dialog.py

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hey - I've reviewed your changes and they look great!

Sourcery assessment

Needs a human reviewer. A faulty PySide6 migration or incomplete packaging can prevent the application from starting or leave core UI, QML, signal delivery, or Direct Transfer flows unusable in a released build, causing an outage before the release is rolled back. Reverting restores the prior PyQt6 implementation for future launches, but it cannot undo downtime or failed user operations that occurred while the broken build was deployed.


Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@codecov

codecov Bot commented Aug 24, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 56.97674% with 370 lines in your changes missing coverage. Please review.
✅ Project coverage is 96.85%. Comparing base (520a895) to head (4245fec).

Files with missing lines Patch % Lines
nxdrive/drive/gui/pyside_settings_host.py 0.00% 362 Missing ⚠️
nxdrive/drive/gui/application.py 91.20% 8 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master    #6450      +/-   ##
==========================================
- Coverage   98.93%   96.85%   -2.09%     
==========================================
  Files         135      136       +1     
  Lines       23184    23572     +388     
==========================================
- Hits        22937    22830     -107     
- Misses        247      742     +495     
Flag Coverage Δ
alfresco-functional 24.73% <28.13%> (-0.19%) ⬇️
alfresco-integration 21.93% <50.58%> (-0.17%) ⬇️
alfresco-unit 18.70% <27.55%> (-0.12%) ⬇️
functional 51.93% <55.00%> (-2.47%) ⬇️
integration 24.65% <51.51%> (-0.37%) ⬇️
unit 83.67% <53.60%> (-2.00%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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 completes the runtime migration from PyQt6 to PySide6 by switching the project-wide Qt shim (nxdrive.drive.qt.imports) to PySide6 and updating application code, tests, and deployment checks accordingly, with additional compatibility work for signals/slots, QML, and frozen builds.

Changes:

  • Replace PyQt6 runtime usage with PySide6 (including shim exports, slot registration, and PySide6-specific API adjustments like QDateTime.toPython() and dataChanged role lists).
  • Update unit/functional/integration tests and patch targets to use PySide6 or the shared shim, and improve test isolation around Qt threading/event-loop behavior.
  • Update deploy scripts and pinned requirements to remove PyQt6 and require PySide6 + Shiboken, plus add migration documentation.

Reviewed changes

Copilot reviewed 42 out of 55 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
tools/windows/deploy_ci_agent.ps1 Remove PyQt6 Bluetooth workaround; verify PySide6 import post-install.
tools/posix/deploy_ci_agent.sh Verify PySide6 import post-install instead of PyQt6.
tools/deps/requirements.txt Swap PyQt6 pins/hashes for PySide6 + addons/essentials + shiboken6.
tests/nuxeo/unit/gui/test_api.py Expect Application.show_settings("Accounts") instead of _show_window(settings_window).
tests/nuxeo/functional/gui/test_application.py Move Qt imports to shim; update patch targets from PyQt6 to PySide6.
tests/conftest.py Switch shared test Qt app fixture from QCoreApplication to QApplication.
tests/common/unit/test_tracing.py Clear internal tracing event cache before/after fixture for isolation.
tests/common/unit/test_local_watcher.py Force direct Qt signal delivery in tests via DirectConnection.
tests/common/unit/test_direct_edit_extra.py Force direct Qt signal delivery in tests via DirectConnection.
tests/common/unit/test_direct_download_extra.py Force direct Qt signal delivery in tests via DirectConnection.
tests/common/unit/test_commandline.py Update patch target to PySide6.QtNetwork.QLocalSocket.
tests/common/unit/test_autolock.py Force direct Qt signal delivery in tests via DirectConnection.
tests/common/unit/gui/test_multi_folder_dialog.py Replace patching of C++ virtual methods with Python subclass overrides.
tests/common/unit/gui/test_folders_dialog.py Update comment wording for Qt init check workaround.
tests/common/unit/gui/test_folders_dialog_extra.py Adjust mocked QDateTime conversion to toPython().
tests/common/unit/gui/test_application.py Add method-host indirection to avoid creating extra QApplication instances in tests.
tests/common/unit/gui/test_application_gap_coverage.py Add slot/metaobject regression tests; add method-host approach for Application gap coverage.
tests/common/unit/gui/test_api_extra.py Expect Application.show_settings("Accounts") instead of _show_window(settings_window).
tests/common/integration/macos/test_show_hide_refresh_button.py Replace PyQt6 import with shim import.
tests/common/integration/macos/test_keyPressEvent.py Replace PyQt6 import with shim import.
tests/common/functional/mocked_classes.py Remove PyQt6 imports; use shim Qt types and signal aliases in mocks.
tests/alfresco/unit/test_oauth2.py Remove PyQt6 module injection; patch shim symbols directly; adjust base-class patching.
tests/alfresco/functional/gui/test_application.py Import-skip PySide6 instead of PyQt6.
nxdrive/drive/qt/imports.py Switch shim exports to PySide6; keep pyqt* aliases; add curated PySide namespace; adjust exports.
nxdrive/drive/qt/constants.py Source constants from shim and add compatibility PySide enum namespace.
nxdrive/drive/qt/init.py Update module docs for binding switching and reference shim env var.
nxdrive/drive/manager.py Register additional methods as Qt slots.
nxdrive/drive/gui/view.py Emit list-of-role-ids in dataChanged (PySide6-compatible).
nxdrive/drive/gui/systray.py Register native callback methods as Qt slots with explicit signatures.
nxdrive/drive/gui/multi_folder_dialog.py Update dark-mode comment wording (binding-agnostic).
nxdrive/drive/gui/folders_loader.py Remove QVariant wrapping; store Python objects directly via setData.
nxdrive/drive/gui/folders_dialog.py Switch QDateTime conversion to toPython() and cast for typing.
nxdrive/drive/gui/custom_window.py Register visibility callback as a Qt slot (PySide6 metaobject compatibility).
nxdrive/drive/gui/application.py Add Settings section routing fallback; guard systray window close; avoid auto-show Settings at startup; change update notification frozen guard; improve logging; make metrics dialog icon self-contained.
nxdrive/drive/gui/api.py Use Application.show_settings("Accounts") for error routing.
nxdrive/drive/engine/engine.py Align slot signature usage; add Qt slot decorators for timer/session lifecycle methods.
nxdrive/drive/direct_edit.py Convert overloaded signal declaration to PySide6 tuple overload syntax.
nxdrive/drive/data/icons/README.md Remove icons README (asset cleanup).
nxdrive/drive/data/icons/paused.svg Remove obsolete icon asset.
nxdrive/drive/data/icons/paused_light.svg Remove obsolete icon asset.
nxdrive/drive/data/icons/idle.svg Remove obsolete icon asset.
nxdrive/drive/data/icons/idle_light.svg Remove obsolete icon asset.
nxdrive/drive/data/icons/error.svg Remove obsolete icon asset.
nxdrive/drive/data/icons/error_light.svg Remove obsolete icon asset.
nxdrive/drive/data/icons/emblem.svg Remove obsolete icon asset.
nxdrive/drive/data/icons/conflict.svg Remove obsolete icon asset.
nxdrive/drive/data/icons/conflict_light.svg Remove obsolete icon asset.
nxdrive/drive/data/icons/active.svg Remove obsolete icon asset.
nxdrive/alfresco/auth/oauth2.py Use shim Qt imports for loopback flow QObject/signal types.
nxdrive/main.py Clarify Qt Quick Controls style env var comment for both bindings.
docs/pyside6_migration.md Add migration ledger documenting decisions, validation, and remaining work.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread tests/conftest.py
Comment thread nxdrive/drive/gui/application.py Outdated
Copilot AI review requested due to automatic review settings August 25, 2026 04:55

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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 44 out of 57 changed files in this pull request and generated no new comments.

Suppressed comments (2)

Previously missed (1) — in code that hasn't changed since the last review.

docs/pyside6_migration.md:83

  • This validation bullet is inaccurate: the repo still contains PyQt6 imports (e.g. nxdrive/drive/gui/pyside_settings_host.py currently describes a mixed PyQt6/PySide6 setup and includes PyQt6-era references). Please adjust the statement to reflect what was actually scanned/validated or explicitly exclude that legacy, unused module.
- Source scan: no executable PyQt6 imports remain under `nxdrive`, `tests`, or `tools`.

tests/conftest.py:252

  • The app fixture now creates a QApplication but does not set QT_QPA_PLATFORM=offscreen when running headless on Linux. In CI environments without DISPLAY, this can cause Qt platform plugin initialization failures when the fixture is first used.

Copilot AI review requested due to automatic review settings August 25, 2026 06:54
sourcery-ai[bot]
sourcery-ai Bot previously approved these changes Aug 25, 2026

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Sourcery assessment

Approved.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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 45 out of 58 changed files in this pull request and generated no new comments.

Suppressed comments (4)

Previously missed (4) — in code that hasn't changed since the last review.

nxdrive/drive/gui/api.py:1052

  • The comment says “Arise the settings window…”, but the correct verb here is “Raise”. This reads like a typo and can confuse future readers.
        # Arise the settings window to let the user know the error.

nxdrive/drive/qt/init.py:5

  • This module docstring references an NXDRIVE_QT_BINDING env var, but there are no other references/implementation of that env var anywhere in the repo. This makes the documentation misleading.
    tests/alfresco/unit/test_oauth2.py:772
  • Using type(auth).__mro__[1] assumes AlfrescoOAuthentication will always directly inherit the class you want to patch. That makes the test brittle (any future mixin/reordering breaks it). Import and patch OAuthenticationBase directly instead.
    nxdrive/main.py:30
  • This comment mentions selecting the active binding via NXDRIVE_QT_BINDING, but that env var is not implemented/referenced anywhere else in the repo. The comment should be updated to avoid implying a runtime switch that doesn’t exist.
# The same env var is honored by both PyQt6 and PySide6 Qt Quick engines, so we
# set it regardless of the active binding selected via ``NXDRIVE_QT_BINDING``.

- Show close button in
- Changed some log levels
- Removed diagnostic logs for windows issue
Copilot AI review requested due to automatic review settings August 25, 2026 08:50
@sourcery-ai
sourcery-ai Bot dismissed their stale review August 25, 2026 08:51

Sourcery withdrew this approval because the latest commits introduced blocking findings.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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 46 out of 59 changed files in this pull request and generated 1 comment.

Comment thread nxdrive/drive/gui/folders_loader.py

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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 81 out of 94 changed files in this pull request and generated no new comments.

Copilot AI review requested due to automatic review settings August 28, 2026 06:19

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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 81 out of 94 changed files in this pull request and generated 2 comments.

Comment thread tools/skiplist.py
Comment on lines 175 to +177
Application._workflow_cls # Set at init, used by workflow dispatch
PySideSettingsHost # Retained for the deferred Settings host cleanup
PySideSettingsHost._setmessage_bridge # Keeps the QML relay callback alive

@pyqtSlot(object)
@Slot(object)
def _check_sync_start(self, *, row_id: str = None) -> None:
Copilot AI review requested due to automatic review settings August 28, 2026 06:49

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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 81 out of 94 changed files in this pull request and generated no new comments.

Suppressed comments (2)

Previously missed (1) — in code that hasn't changed since the last review.

tests/common/functional/mocked_classes.py:523

  • Mock_Qt.setMessage is assigned to the SignalInstance type, not an instance/callable. In Application.init_gui() the code connects a real Qt signal to the QML root’s setMessage target; using the class here can lead to confusing runtime behavior (e.g., the signal invoking the SignalInstance constructor) instead of safely absorbing the call in tests.

This issue also appears on line 526 of the same file.

tests/common/functional/mocked_classes.py:527

  • Mock_Qt.updateAvailable / updateProgress are also set to the SignalInstance type. These attributes are used as signal targets during GUI setup, so they should be safe callables (or real mock signal objects) to avoid unexpected type-construction when the updater emits signals in tests.

Copilot AI review requested due to automatic review settings August 28, 2026 07:21

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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 81 out of 94 changed files in this pull request and generated no new comments.

Suppressed comments (1)

Previously missed (1) — in code that hasn't changed since the last review.

tests/common/functional/mocked_classes.py:527

  • Mock_Qt.setMessage, updateAvailable, and updateProgress are assigned to the SignalInstance type rather than a callable/signal-like instance. In the migrated Application.init_gui() these attributes are used as Qt signal targets (e.g. api.setMessage.connect(root.setMessage) and updater.updateAvailable.connect(root.updateAvailable)), so passing a class object here can raise at connect/emit time or silently do the wrong thing (instantiating the type). Provide a small callable stub that has both emit(...) and __call__(...) so it can act like a QML signal/slot during tests.

Copilot AI review requested due to automatic review settings August 28, 2026 08:59

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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 81 out of 94 changed files in this pull request and generated no new comments.

Suppressed comments (1)

nxdrive/alfresco/engine/engine.py:164

  • AlfrescoEngine._check_sync_start declares row_id as a keyword-only parameter (*), but it’s connected in the base Engine.__init__ via self.newQueueItem.connect(self._check_sync_start) / queue_manager.newItem.connect(self._check_sync_start), which will invoke the slot with a positional argument. With the current signature, that call will raise TypeError: got an unexpected positional argument at runtime when the signal emits.
    @Slot(object)
    def _check_sync_start(self, *, row_id: str = None) -> None:
        if not self._sync_started:

Copilot AI review requested due to automatic review settings August 28, 2026 09:24

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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 82 out of 95 changed files in this pull request and generated no new comments.

Suppressed comments (1)

tools/skiplist.py:177

  • tools/skiplist.py references PySideSettingsHost._setmessage_bridge, but _setmessage_bridge is an instance attribute (initialized in PySideSettingsHost.__init__), not a class attribute. As written, importing/executing tools/skiplist.py will raise AttributeError and break whatever tooling consumes this skiplist.

Use a safe getattr(...) (or drop the attribute reference entirely) so the module can be evaluated without errors.

Copilot AI review requested due to automatic review settings August 28, 2026 09:46

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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 82 out of 95 changed files in this pull request and generated no new comments.

Suppressed comments (1)

Previously missed (1) — in code that hasn't changed since the last review.

tests/common/functional/mocked_classes.py:527

  • Mock_Qt assigns setMessage, updateAvailable, and updateProgress to the SignalInstance type instead of a signal-like object. Code under test expects QML/root signal objects with .emit() (and potentially .connect()), so this can raise AttributeError/TypeError when wiring signals (e.g., api.setMessage.connect(root.setMessage) or emitting root.setMessage.emit(...)). Use the existing Mock_Emitter() (or a MagicMock with emit) to model these signals.

Copilot AI review requested due to automatic review settings August 28, 2026 10:19
@S-Ghosh-Dev2
S-Ghosh-Dev2 force-pushed the NXENG-627-pyside-migration branch from 180f167 to 78d0451 Compare August 28, 2026 10:19

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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 81 out of 94 changed files in this pull request and generated no new comments.

Copilot AI review requested due to automatic review settings August 28, 2026 10:24

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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 81 out of 94 changed files in this pull request and generated 1 comment.

Comment on lines +523 to +527
self.setMessage = SignalInstance
self.setSection = Mock_Emitter()
self.setStatus = self
self.updateAvailable: QtCore.PYQT_SLOT = QtCore.pyqtBoundSignal
self.updateProgress: QtCore.PYQT_SLOT = QtCore.pyqtBoundSignal
self.updateAvailable = SignalInstance
self.updateProgress = SignalInstance
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.

3 participants