Skip to content

Support single-file plugins in online and offline catalogs #419

Closed

Description

@PierreRaybaut

Summary

Allow DataLab Desktop's online and offline plugin catalogs to distribute historical single-file datalab_*.py plugins alongside wheel distributions, without requiring authors to turn them into packaging projects.

Documentation first

Clarify three independent concepts before extending the code:

  • Source organization: a single module or a Python package/project.
  • Distribution: directly loaded source, an installed .py module, or a wheel.
  • Functional capabilities: processing, input/output, visualization and applications.

Both source forms use the same plugin API. A wheel can contain a single module; the generated layered project is not an API requirement. Update both English documentation and French translations, including the self-contained offline PDF guide.

Expected behavior

  • Support mixed local folders, explicit catalog.json entries and mirrored online catalogs containing modules and wheels.
  • Preserve existing wheels, their dependency management, source priorities and withdrawal policies.
  • Accept unchanged historical files. Inspect syntax and statically available metadata without importing or executing the script; explicit catalog metadata supplies information that cannot be determined statically.
  • Track unversioned local scripts by SHA-256, without inventing versions. An unchanged artifact is already installed; a different revision requires explicit replacement.
  • Recognize modules previously installed from a file, persist known catalog/version information compatibly, and support install, update, reload and uninstall with consent and collision checks.
  • Modules use only already available libraries: no additional dependency installation or implicit package-index lookup for this format.
  • Extend public catalog validation, GitHub release-asset selection, mirrored downloads and the website. Published module releases have an explicit catalog version and accepted license.

Acceptance criteria

  • Catalog inspection and publication never execute plugin code.
  • Complete local catalogs install with no network access in Python and standalone Desktop editions.
  • Generated, historical, unversioned and dynamically described scripts have predictable behavior.
  • Invalid syntax, unsafe paths, excessive sizes, digest mismatches, collisions and failed writes are surfaced without activating partial replacements.
  • English/French documentation clearly explains both forms and their installation/update workflows.

Delivery

Implement on a dedicated branch based on DataLab develop, independently of experimental data integration. Open a Desktop PR targeting develop and a linked companion PR in DataLab-Platform/plugins targeting main. DataLab-Web, per-plugin environments, releases and publication of new example plugins are out of scope.

Activity

  1. PierreRaybaut commented on Oct 23, 2026

    @PierreRaybaut
    ContributorAuthor

    Implementation is ready for review in #420 (Desktop, targeting develop) and DataLab-Platform/plugins#4 (public catalog, targeting main). Both use dedicated feature/single-file-plugin-catalog branches. Documentation clarification was committed before the implementation, then updated with the final English/French workflows. No automatic merge, release or production plugin publication has been performed.

  2. PierreRaybaut commented on Oct 23, 2026

    @PierreRaybaut
    ContributorAuthor

    Both implementations are ready for review: #420 targets develop, and DataLab-Platform/plugins#4 targets main. Desktop checks passed on Python 3.9 and 3.14 with PyQt5 and PyQt6; the catalog CI is now green after fixing optional-client detection for the older Qt-dependent host. Local validation includes the plugin regression suite, 38 catalog tests, real Python/standalone loading of historical and generated scripts, and English/French documentation sources. PDF regeneration was intentionally not required. Neither PR has been merged.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions