{"library":"snakemake-interface-scheduler-plugins","title":"Snakemake Scheduler Plugin Interface","type":"library","description":"This package provides a stable interface for interactions between Snakemake and its custom scheduler plugins. It offers abstract base classes and settings definitions that plugin developers must implement to create compliant Snakemake schedulers. The library is currently at version 2.0.2 and aims for a stable API to minimize breaking changes for plugin developers, supporting Snakemake workflows (version 8.0+) with Python 3.11 and newer.","language":"python","status":"active","last_verified":"Thu Apr 16","install":{"commands":["pip install snakemake-interface-scheduler-plugins"],"cli":null},"imports":["from snakemake_interface_scheduler_plugins.settings import SchedulerSettingsBase","from snakemake_interface_scheduler_plugins.base import SchedulerBase","from snakemake_interface_scheduler_plugins.interfaces.dag import SchedulerDAGInterface","from snakemake_interface_scheduler_plugins.interfaces.jobs import SchedulerJobInterface"],"auth":{"required":false,"env_vars":[]},"links":{"homepage":null,"github":null,"docs":null,"changelog":null,"pypi":"https://pypi.org/project/snakemake-interface-scheduler-plugins/","npm":null,"openapi_spec":null,"status_page":null,"smithery":null},"quickstart":{"code":"from typing import Dict, Mapping, Optional, Union, Sequence\nfrom dataclasses import dataclass, field\nfrom snakemake_interface_scheduler_plugins.settings import SchedulerSettingsBase\nfrom snakemake_interface_scheduler_plugins.base import SchedulerBase\nfrom snakemake_interface_scheduler_plugins.interfaces.dag import SchedulerDAGInterface\nfrom snakemake_interface_scheduler_plugins.interfaces.jobs import SchedulerJobInterface\n\n# Define settings for your scheduler plugin. These will appear in the Snakemake CLI\n# as --scheduler-<plugin-name>-<param-name>. All fields should be Optional.\n@dataclass\nclass SchedulerSettings(SchedulerSettingsBase):\n    my_custom_param: Optional[int] = field(\n        default=None,\n        metadata={\n            \"help\": \"A custom parameter for my scheduler plugin.\",\n            \"env_var\": False # Use True for sensitive info like passwords\n        }\n    )\n\n# Implement the core scheduler logic\nclass Scheduler(SchedulerBase):\n    def __init__(\n        self, workflow: 'snakemake.workflow.Workflow',\n        dag: SchedulerDAGInterface, \n        dryrun: bool,\n        scheduler_settings: SchedulerSettings\n    ):\n        super().__init__(workflow, dag, dryrun, scheduler_settings)\n        self.scheduler_settings = scheduler_settings\n        print(f\"Initializing MyCustomScheduler with param: {self.scheduler_settings.my_custom_param}\")\n\n    def _choose_single_job(self, jobs: Sequence[SchedulerJobInterface]) -> Optional[SchedulerJobInterface]:\n        # Example: always pick the first job available\n        if jobs:\n            print(f\"MyCustomScheduler choosing job: {jobs[0].jobid}\")\n            return jobs[0]\n        return None\n\n    def _get_selected_jobs(\n        self, jobs: Sequence[SchedulerJobInterface]\n    ) -> Optional[Sequence[SchedulerJobInterface]]:\n        # Example: return all available jobs, or None to fall back to Snakemake's greedy scheduler\n        if self.scheduler_settings.my_custom_param is not None and self.scheduler_settings.my_custom_param < 0:\n            print(\"MyCustomScheduler falling back to greedy scheduler.\")\n            return None # Indicate fallback to Snakemake's internal greedy scheduler\n        \n        chosen_job = self._choose_single_job(jobs)\n        if chosen_job: \n            return [chosen_job]\n        return []\n\n# Note: This is a skeleton for plugin development. To use, a Snakemake plugin package\n# named `snakemake-scheduler-plugin-<name>` must be created and published to PyPI,\n# which then exposes this `Scheduler` class and `SchedulerSettings` via entry points.\n","lang":"python","description":"This quickstart provides the fundamental Python class structure and required imports for developing a Snakemake scheduler plugin. A real plugin would extend `SchedulerBase` and `SchedulerSettingsBase`, implementing methods like `_get_selected_jobs` to define scheduling logic. Plugins must follow a specific naming convention (`snakemake-scheduler-plugin-<name>`) and be published to PyPI for Snakemake to discover them. The `snakedeploy scaffold-snakemake-plugin` command is recommended to set up a new plugin project.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":null}