Skip to content

Commit e2636d7

Browse files
authored
Merge pull request #19442 from nsoranzo/type_annot
Type annotations improvements
2 parents 42f190e + a79f518 commit e2636d7

File tree

23 files changed

+83
-68
lines changed

23 files changed

+83
-68
lines changed

lib/galaxy/app.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ def _configure_toolbox(self):
349349
self.citations_manager = CitationsManager(self)
350350
self.biotools_metadata_source = get_galaxy_biotools_metadata_source(self.config)
351351

352-
self.dynamic_tools_manager = DynamicToolManager(self)
352+
self.dynamic_tool_manager = DynamicToolManager(self)
353353
self._toolbox_lock = threading.RLock()
354354
self._toolbox = tools.ToolBox(self.config.tool_configs, self.config.tool_path, self)
355355
galaxy_root_dir = os.path.abspath(self.config.root)
@@ -565,7 +565,7 @@ def _shutdown_model(self):
565565
self.model.engine.dispose()
566566

567567

568-
class GalaxyManagerApplication(MinimalManagerApp, MinimalGalaxyApplication, InstallationTarget[tools.ToolBox]):
568+
class GalaxyManagerApplication(MinimalManagerApp, MinimalGalaxyApplication):
569569
"""Extends the MinimalGalaxyApplication with most managers that are not tied to a web or job handling context."""
570570

571571
model: GalaxyModelMapping
@@ -662,9 +662,6 @@ def __init__(self, configure_logging=True, use_converters=True, use_display_appl
662662
# We need the datatype registry for running certain tasks that modify HDAs, and to build the registry we need
663663
# to setup the installed repositories ... this is not ideal
664664
self._configure_tool_config_files()
665-
self.installed_repository_manager = self._register_singleton(
666-
InstalledRepositoryManager, InstalledRepositoryManager(self)
667-
)
668665
self.dynamic_tool_manager = self._register_singleton(DynamicToolManager)
669666
self.trs_proxy = self._register_singleton(TrsProxy, TrsProxy(self.config))
670667
self._configure_datatypes_registry(
@@ -713,7 +710,7 @@ def is_job_handler(self) -> bool:
713710
) or not self.config.track_jobs_in_database
714711

715712

716-
class UniverseApplication(StructuredApp, GalaxyManagerApplication):
713+
class UniverseApplication(StructuredApp, GalaxyManagerApplication, InstallationTarget[tools.ToolBox]):
717714
"""Encapsulates the state of a Universe application"""
718715

719716
model: GalaxyModelMapping
@@ -775,6 +772,9 @@ def __init__(self, **kwargs) -> None:
775772
self._configure_toolbox()
776773
# Load Data Manager
777774
self.data_managers = self._register_singleton(DataManagers)
775+
self.installed_repository_manager = self._register_singleton(
776+
InstalledRepositoryManager, InstalledRepositoryManager(self)
777+
)
778778
# Load the update repository manager.
779779
self.update_repository_manager = self._register_singleton(
780780
UpdateRepositoryManager, UpdateRepositoryManager(self)

lib/galaxy/app_unittest_utils/galaxy_mock.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ def toolbox(self, toolbox: ToolBox):
175175
def wait_for_toolbox_reload(self, toolbox):
176176
# TODO: If the tpm test case passes, does the operation really
177177
# need to wait.
178-
return True
178+
return
179179

180180
def reindex_tool_search(self) -> None:
181181
raise NotImplementedError

lib/galaxy/managers/hdcas.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def set_collection_attributes(dataset_element, *payload):
5959

6060
# TODO: to DatasetCollectionInstanceManager
6161
class HDCAManager(
62-
base.ModelManager,
62+
base.ModelManager[model.HistoryDatasetCollectionAssociation],
6363
secured.AccessibleManagerMixin,
6464
secured.OwnableManagerMixin,
6565
deletable.PurgableManagerMixin,

lib/galaxy/managers/tools.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
from galaxy.managers.base import OrmFilterParsersType
3131

3232

33-
class DynamicToolManager(ModelManager):
33+
class DynamicToolManager(ModelManager[model.DynamicTool]):
3434
"""Manages dynamic tools stored in Galaxy's database."""
3535

3636
model_class = model.DynamicTool

lib/galaxy/managers/workflows.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@
4646
joinedload,
4747
subqueryload,
4848
)
49-
from typing_extensions import Annotated
49+
from typing_extensions import (
50+
Annotated,
51+
TypeAlias,
52+
)
5053

5154
from galaxy import (
5255
exceptions,
@@ -1827,7 +1830,7 @@ def __module_from_dict(
18271830
self.add_item_annotation(sa_session, trans.get_user(), step, annotation)
18281831

18291832
# Stick this in the step temporarily
1830-
DictConnection = Dict[str, Union[int, str]]
1833+
DictConnection: TypeAlias = Dict[str, Union[int, str]]
18311834
temp_input_connections: Dict[str, Union[List[DictConnection], DictConnection]] = step_dict.get(
18321835
"input_connections", {}
18331836
)

lib/galaxy/queue_worker.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import threading
1212
import time
1313
from inspect import ismodule
14+
from typing import TYPE_CHECKING
1415

1516
from kombu import (
1617
Consumer,
@@ -31,6 +32,9 @@
3132
logging.getLogger("kombu").setLevel(logging.WARNING)
3233
log = logging.getLogger(__name__)
3334

35+
if TYPE_CHECKING:
36+
from galaxy.structured_app import MinimalManagerApp
37+
3438

3539
def send_local_control_task(app, task, get_response=False, kwargs=None):
3640
"""
@@ -244,7 +248,7 @@ def rebuild_toolbox_search_index(app, **kwargs):
244248
log.debug("App is not a webapp, not building a search index")
245249

246250

247-
def reload_job_rules(app, **kwargs):
251+
def reload_job_rules(app: "MinimalManagerApp", **kwargs):
248252
reload_timer = util.ExecutionTimer()
249253
for module in job_rule_modules(app):
250254
rules_module_name = module.__name__
@@ -265,7 +269,7 @@ def reload_tour(app, **kwargs):
265269
log.debug("Tour reloaded")
266270

267271

268-
def __job_rule_module_names(app):
272+
def __job_rule_module_names(app: "MinimalManagerApp"):
269273
rules_module_names = {"galaxy.jobs.rules"}
270274
if app.job_config.dynamic_params is not None:
271275
module_name = app.job_config.dynamic_params.get("rules_module")
@@ -279,7 +283,7 @@ def __job_rule_module_names(app):
279283
return rules_module_names
280284

281285

282-
def job_rule_modules(app):
286+
def job_rule_modules(app: "MinimalManagerApp"):
283287
rules_module_list = []
284288
for rules_module_name in __job_rule_module_names(app):
285289
rules_module = sys.modules.get(rules_module_name, None)

lib/galaxy/structured_app.py

+8-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Typed description of Galaxy's app object."""
22

33
import abc
4+
import threading
45
from typing import (
56
Any,
67
Optional,
@@ -31,7 +32,6 @@
3132
from galaxy.security.idencoding import IdEncodingHelper
3233
from galaxy.security.vault import Vault
3334
from galaxy.tool_shed.cache import ToolShedRepositoryCache
34-
from galaxy.tool_util.data import ToolDataTableManager
3535
from galaxy.tool_util.deps.containers import ContainerFinder
3636
from galaxy.tool_util.deps.views import DependencyResolversView
3737
from galaxy.tool_util.verify import test_data
@@ -46,11 +46,14 @@
4646
from galaxy.managers.collections import DatasetCollectionManager
4747
from galaxy.managers.hdas import HDAManager
4848
from galaxy.managers.histories import HistoryManager
49+
from galaxy.managers.tools import DynamicToolManager
4950
from galaxy.managers.workflows import (
5051
WorkflowContentsManager,
5152
WorkflowsManager,
5253
)
54+
from galaxy.tool_shed.galaxy_install.client import DataManagersInterface
5355
from galaxy.tool_shed.galaxy_install.installed_repository_manager import InstalledRepositoryManager
56+
from galaxy.tool_util.data import ToolDataTableManager
5457
from galaxy.tools import ToolBox
5558
from galaxy.tools.cache import ToolCache
5659
from galaxy.tools.error_reports import ErrorReports
@@ -117,12 +120,11 @@ class MinimalManagerApp(MinimalApp):
117120
library_folder_manager: Any # 'galaxy.managers.folders.FolderManager'
118121
library_manager: Any # 'galaxy.managers.libraries.LibraryManager'
119122
role_manager: Any # 'galaxy.managers.roles.RoleManager'
120-
installed_repository_manager: "InstalledRepositoryManager"
121123
user_manager: Any
122124
job_config: "JobConfiguration"
123125
job_manager: Any # galaxy.jobs.manager.JobManager
124126
job_metrics: JobMetrics
125-
dynamic_tool_manager: Any # 'galaxy.managers.tools.DynamicToolManager'
127+
dynamic_tool_manager: "DynamicToolManager"
126128
genomes: "Genomes"
127129
error_reports: "ErrorReports"
128130
notification_manager: Any # 'galaxy.managers.notification.NotificationManager'
@@ -149,7 +151,9 @@ class StructuredApp(MinimalManagerApp):
149151
"""
150152

151153
amqp_internal_connection_obj: Optional[Connection]
154+
data_managers: "DataManagersInterface"
152155
dependency_resolvers_view: DependencyResolversView
156+
installed_repository_manager: "InstalledRepositoryManager"
153157
container_finder: ContainerFinder
154158
tool_dependency_dir: Optional[str]
155159
test_data_resolver: test_data.TestDataResolver
@@ -158,11 +162,11 @@ class StructuredApp(MinimalManagerApp):
158162
webhooks_registry: WebhooksRegistry
159163
queue_worker: Any # 'galaxy.queue_worker.GalaxyQueueWorker'
160164
data_provider_registry: Any # 'galaxy.visualization.data_providers.registry.DataProviderRegistry'
161-
tool_data_tables: ToolDataTableManager
162165
tool_cache: "ToolCache"
163166
tool_shed_repository_cache: Optional[ToolShedRepositoryCache]
164167
watchers: "ConfigWatchers"
165168
workflow_scheduling_manager: Any # 'galaxy.workflow.scheduling_manager.WorkflowSchedulingManager'
166169
interactivetool_manager: Any
167170
api_keys_manager: Any # 'galaxy.managers.api_keys.ApiKeyManager'
168171
visualizations_registry: Any # 'galaxy.visualization.plugins.registry.VisualizationsRegistry'
172+
_toolbox_lock: threading.RLock

lib/galaxy/tool_shed/galaxy_install/client.py

+6-9
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
from typing import (
33
Any,
44
Dict,
5-
Generic,
65
List,
76
Optional,
7+
runtime_checkable,
88
TYPE_CHECKING,
99
TypeVar,
1010
Union,
@@ -15,15 +15,14 @@
1515
from galaxy.model.base import ModelMapping
1616
from galaxy.model.tool_shed_install import HasToolBox
1717
from galaxy.security.idencoding import IdEncodingHelper
18-
from galaxy.tool_shed.cache import ToolShedRepositoryCache
1918
from galaxy.tool_util.data import (
2019
OutputDataset,
2120
ToolDataTableManager,
2221
)
2322
from galaxy.tool_util.toolbox.base import AbstractToolBox
2423

2524
if TYPE_CHECKING:
26-
import galaxy.tool_shed.metadata.installed_repository_manger
25+
from galaxy.tool_shed.galaxy_install.installed_repository_manager import InstalledRepositoryManager
2726

2827

2928
class DataManagerInterface(Protocol):
@@ -48,19 +47,17 @@ def get_manager(self, data_manager_id: str) -> Optional[DataManagerInterface]: .
4847
def remove_manager(self, manager_ids: Union[str, List[str]]) -> None: ...
4948

5049

51-
ToolBoxType = TypeVar("ToolBoxType", bound="AbstractToolBox")
50+
ToolBoxType = TypeVar("ToolBoxType", bound="AbstractToolBox", contravariant=True)
5251

5352

54-
class InstallationTarget(HasToolBox, Generic[ToolBoxType]):
53+
@runtime_checkable
54+
class InstallationTarget(HasToolBox, Protocol[ToolBoxType]):
5555
data_managers: DataManagersInterface
5656
install_model: ModelMapping
57-
model: ModelMapping
5857
security: IdEncodingHelper
5958
config: Any
60-
installed_repository_manager: "galaxy.tool_shed.metadata.installed_repository_manger.InstalledRepositoryManager"
61-
watchers: Any # TODO: interface...
59+
installed_repository_manager: "InstalledRepositoryManager"
6260
_toolbox_lock: threading.RLock
63-
tool_shed_repository_cache: Optional[ToolShedRepositoryCache]
6461
tool_data_tables: ToolDataTableManager
6562

6663
def wait_for_toolbox_reload(self, old_toolbox: ToolBoxType) -> None: ...

lib/galaxy/tool_shed/galaxy_install/metadata/installed_repository_metadata_manager.py

-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030

3131

3232
class InstalledRepositoryMetadataManager(GalaxyMetadataGenerator):
33-
app: InstallationTarget
3433

3534
def __init__(
3635
self,

lib/galaxy/tool_shed/galaxy_install/repository_dependencies/repository_dependency_manager.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import json
77
import logging
88
import os
9+
from typing import TYPE_CHECKING
910
from urllib.error import HTTPError
1011
from urllib.parse import (
1112
urlencode,
@@ -17,7 +18,6 @@
1718
)
1819

1920
from galaxy.model.base import transaction
20-
from galaxy.tool_shed.galaxy_install import installed_repository_manager
2121
from galaxy.tool_shed.galaxy_install.tools import tool_panel_manager
2222
from galaxy.tool_shed.util import repository_util
2323
from galaxy.tool_shed.util.container_util import get_components_from_key
@@ -35,11 +35,14 @@
3535
encoding_util,
3636
)
3737

38+
if TYPE_CHECKING:
39+
from galaxy.tool_shed.galaxy_install.client import InstallationTarget
40+
3841
log = logging.getLogger(__name__)
3942

4043

4144
class RepositoryDependencyInstallManager:
42-
def __init__(self, app):
45+
def __init__(self, app: "InstallationTarget"):
4346
self.app = app
4447

4548
def build_repository_dependency_relationships(self, repo_info_dicts, tool_shed_repositories):
@@ -270,7 +273,7 @@ def create_repository_dependency_objects(
270273
log.info(
271274
f"Reactivating deactivated tool_shed_repository '{str(repository_db_record.name)}'."
272275
)
273-
irm = installed_repository_manager.InstalledRepositoryManager(self.app)
276+
irm = self.app.installed_repository_manager
274277
irm.activate_repository(repository_db_record)
275278
# No additional updates to the database record are necessary.
276279
can_update_db_record = False

lib/galaxy/tool_shed/metadata/metadata_generator.py

+6-7
Original file line numberDiff line numberDiff line change
@@ -722,13 +722,12 @@ def _check_elem_for_dep(elems):
722722
if original_valid_tool_dependencies_dict:
723723
# We're generating metadata on an update pulled to a tool shed repository installed
724724
# into a Galaxy instance, so handle changes to tool dependencies appropriately.
725-
installation_target = cast(InstallationTarget, self.app)
726-
irm = installation_target.installed_repository_manager
727-
(
728-
updated_tool_dependency_names,
729-
deleted_tool_dependency_names,
730-
) = irm.handle_existing_tool_dependencies_that_changed_in_update(
731-
self.repository, original_valid_tool_dependencies_dict, rvs.valid_tool_dependencies_dict
725+
assert isinstance(self.app, InstallationTarget)
726+
irm = self.app.installed_repository_manager
727+
assert self.repository
728+
gx_repository = cast(ToolShedRepository, self.repository)
729+
irm.handle_existing_tool_dependencies_that_changed_in_update(
730+
gx_repository, original_valid_tool_dependencies_dict, rvs.valid_tool_dependencies_dict
732731
)
733732
metadata_dict["tool_dependencies"] = rvs.valid_tool_dependencies_dict
734733
if rvs.invalid_tool_dependencies_dict:

lib/galaxy/tool_shed/unittest_utils/__init__.py

+5
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
DataManagersInterface,
2323
InstallationTarget,
2424
)
25+
from galaxy.tool_shed.galaxy_install.installed_repository_manager import InstalledRepositoryManager
2526
from galaxy.tool_shed.util.repository_util import get_installed_repository
2627
from galaxy.tool_util.data import (
2728
OutputDataset,
@@ -221,6 +222,7 @@ def __init__(
221222
)
222223
dependency_dir = target_directory / "_dependencies"
223224
dependency_dir.mkdir()
225+
self.installed_repository_manager = InstalledRepositoryManager(self)
224226

225227
@property
226228
def tool_dependency_dir(self) -> Optional[str]:
@@ -236,3 +238,6 @@ def reload_toolbox(self):
236238
@property
237239
def toolbox(self) -> TestToolBox:
238240
return self._toolbox
241+
242+
def wait_for_toolbox_reload(self, toolbox):
243+
return

lib/galaxy/tool_shed/util/dependency_display.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import os
33

44
from galaxy import util
5-
from galaxy.tool_shed.galaxy_install.installed_repository_manager import InstalledRepositoryManager
65
from galaxy.tool_shed.util import utility_container_manager
76
from galaxy.util import UNKNOWN
87
from galaxy.util.tool_shed.common_util import parse_repository_dependency_tuple
@@ -198,7 +197,7 @@ def populate_containers_dict_from_repository_metadata(self, repository):
198197
them for uninstalled repositories that are being reinstalled.
199198
"""
200199
if metadata := repository.metadata_:
201-
irm = InstalledRepositoryManager(self.app)
200+
irm = self.app.installed_repository_manager
202201
# Handle repository dependencies.
203202
(
204203
installed_repository_dependencies,

lib/galaxy/tool_util/cwl/parser.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from typing import (
1616
Dict,
1717
List,
18+
Optional,
1819
overload,
1920
Union,
2021
)
@@ -531,7 +532,7 @@ class WorkflowProxy:
531532
def __init__(self, workflow, workflow_path=None):
532533
self._workflow = workflow
533534
self._workflow_path = workflow_path
534-
self._step_proxies = None
535+
self._step_proxies: Optional[List[Union[SubworkflowStepProxy, ToolStepProxy]]] = None
535536

536537
@property
537538
def cwl_id(self):
@@ -562,7 +563,7 @@ def get_outputs_for_label(self, label):
562563

563564
def tool_reference_proxies(self):
564565
"""Fetch tool source definitions for all referenced tools."""
565-
references = []
566+
references: List[ToolProxy] = []
566567
for step in self.step_proxies():
567568
references.extend(step.tool_reference_proxies())
568569
return references

0 commit comments

Comments
 (0)