diff --git a/pyproject.toml b/pyproject.toml index 8fd41a22c..9abb9006d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,6 +30,7 @@ classifiers = [ "Programming Language :: Python :: 3.12", ] dependencies = [ + "backports.entry_points_selectable", "defusedxml", # For safely parsing XML files "pydantic<2", # Locked to <2 by zocalo "requests", @@ -55,7 +56,6 @@ developer = [ server = [ # "matplotlib", # For visual statistical analysis of images "aiohttp", - "backports.entry_points_selectable", "cryptography", "fastapi[standard]", "ispyb", # Responsible for setting requirements for SQLAlchemy and mysql-connector-python; v10.0.0: sqlalchemy <2, mysql-connector-python >=8.0.32 diff --git a/src/murfey/client/context.py b/src/murfey/client/context.py index 675f07679..5230a89bb 100644 --- a/src/murfey/client/context.py +++ b/src/murfey/client/context.py @@ -4,7 +4,7 @@ from pathlib import Path from typing import Any, Dict, List, NamedTuple -import importlib_metadata +from backports.entry_points_selectable import entry_points from murfey.client.instance_environment import MurfeyInstanceEnvironment @@ -41,7 +41,8 @@ def __init__(self, name: str, acquisition_software: str): self.name = name def post_transfer(self, transferred_file: Path, role: str = "", **kwargs): - for h in importlib_metadata.entry_points(group="murfey.post_transfer_hooks"): + # Search external packages for additional hooks to include in Murfey + for h in entry_points(group="murfey.post_transfer_hooks"): if h.name == self.name: h.load()(transferred_file, role=role, **kwargs) diff --git a/src/murfey/server/__init__.py b/src/murfey/server/__init__.py index ae7abcf81..0165bf992 100644 --- a/src/murfey/server/__init__.py +++ b/src/murfey/server/__init__.py @@ -8,6 +8,7 @@ import time from datetime import datetime from functools import partial, singledispatch +from importlib.resources import files from pathlib import Path from threading import Thread from typing import Any, Dict, List, NamedTuple, Tuple @@ -17,8 +18,10 @@ import uvicorn import workflows import zocalo.configuration +from backports.entry_points_selectable import entry_points from fastapi import Request from fastapi.templating import Jinja2Templates +from importlib_metadata import EntryPoint # For type hinting only from ispyb.sqlalchemy._auto_db_schema import ( AutoProcProgram, Base, @@ -42,8 +45,10 @@ import murfey import murfey.server.prometheus as prom import murfey.server.websocket +import murfey.util.db as db from murfey.client.contexts.tomo import _midpoint from murfey.server.murfey_db import url # murfey_db +from murfey.util import LogFilter from murfey.util.config import ( MachineConfig, get_hostname, @@ -51,24 +56,14 @@ get_microscope, get_security_config, ) +from murfey.util.spa_params import default_spa_parameters +from murfey.util.state import global_state try: from murfey.server.ispyb import TransportManager # Session except AttributeError: pass -from backports.entry_points_selectable import entry_points -from importlib_metadata import EntryPoint # For type hinting only -import murfey.util.db as db -from murfey.util import LogFilter -from murfey.util.spa_params import default_spa_parameters -from murfey.util.state import global_state - -try: - from importlib.resources import files # type: ignore -except ImportError: - # Fallback for Python 3.8 - from importlib_resources import files # type: ignore logger = logging.getLogger("murfey.server") diff --git a/src/murfey/server/main.py b/src/murfey/server/main.py index 040bd313d..61ab08201 100644 --- a/src/murfey/server/main.py +++ b/src/murfey/server/main.py @@ -2,8 +2,8 @@ import logging import os -import sys +from backports.entry_points_selectable import entry_points from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles @@ -23,12 +23,6 @@ from murfey.server import template_files from murfey.util.config import get_security_config -# Use importlib_metadata based on Python version -if sys.version_info < (3, 10): - from importlib_metadata import entry_points -else: - from importlib.metadata import entry_points - # Import Murfey server or demo server based on settings if os.getenv("MURFEY_DEMO"): from murfey.server.demo_api import router @@ -82,5 +76,6 @@ class Settings(BaseSettings): app.include_router(murfey.server.api.hub.router) app.include_router(murfey.server.websocket.ws) +# Search external packages for additional routers to include in Murfey for r in entry_points(group="murfey.routers"): app.include_router(r.load())