diff --git a/lib/galaxy/tools/deps/__init__.py b/lib/galaxy/tools/deps/__init__.py index 7d7156449a81..942ea0a387c4 100644 --- a/lib/galaxy/tools/deps/__init__.py +++ b/lib/galaxy/tools/deps/__init__.py @@ -155,17 +155,7 @@ def _requirements_to_dependencies_dict(self, requirements, **kwds): continue if requirement.type in ['package', 'set_environment']: - name = requirement.name - version = requirement.version - specs = requirement.specs - - if hasattr(resolver, "find_specification"): - spec = resolver.find_specification(specs) - if spec is not None: - name = spec.short_name - version = spec.version or version - - dependency = resolver.resolve( name, version, requirement.type, **kwds ) + dependency = resolver.resolve( requirement, **kwds ) if require_exact and not dependency.exact: continue diff --git a/lib/galaxy/tools/deps/requirements.py b/lib/galaxy/tools/deps/requirements.py index c24d65bffdb8..9caef36b5a6a 100644 --- a/lib/galaxy/tools/deps/requirements.py +++ b/lib/galaxy/tools/deps/requirements.py @@ -1,3 +1,5 @@ +import copy + from galaxy.util import asbool, xml_text DEFAULT_REQUIREMENT_TYPE = "package" @@ -20,6 +22,9 @@ def to_dict( self ): specs = [s.to_dict() for s in self.specs] return dict(name=self.name, type=self.type, version=self.version, specs=specs) + def copy( self ): + return copy.deepcopy( self ) + @staticmethod def from_dict( dict ): version = dict.get( "version", None ) diff --git a/lib/galaxy/tools/deps/resolvers/__init__.py b/lib/galaxy/tools/deps/resolvers/__init__.py index f2ca0611c6cd..a200878c1416 100644 --- a/lib/galaxy/tools/deps/resolvers/__init__.py +++ b/lib/galaxy/tools/deps/resolvers/__init__.py @@ -26,7 +26,7 @@ class DependencyResolver(Dictifiable, object): __metaclass__ = ABCMeta @abstractmethod - def resolve( self, name, version, type, **kwds ): + def resolve( self, requirement, **kwds ): """Given inputs describing dependency in the abstract yield a Dependency object. The Dependency object describes various attributes (script, bin, @@ -92,6 +92,22 @@ def find_specification(self, specs): return spec return None + def resolve_specs(self, requirement): + name = requirement.name + version = requirement.version + specs = requirement.specs + + spec = self.find_specification(specs) + if spec is not None: + name = spec.short_name + version = spec.version or version + + requirement = requirement.copy() + requirement.name = name + requirement.version = version + + return requirement + class InstallableDependencyResolver: """ Mix this into a ``DependencyResolver`` and implement to indicate diff --git a/lib/galaxy/tools/deps/resolvers/brewed_tool_shed_packages.py b/lib/galaxy/tools/deps/resolvers/brewed_tool_shed_packages.py index 5585de56c42c..a6b4cde4520e 100644 --- a/lib/galaxy/tools/deps/resolvers/brewed_tool_shed_packages.py +++ b/lib/galaxy/tools/deps/resolvers/brewed_tool_shed_packages.py @@ -29,7 +29,8 @@ def __init__(self, dependency_manager, **kwds): self._init_homebrew(**kwds) self._init_base_path(dependency_manager, **kwds) - def resolve(self, name, version, type, **kwds): + def resolve(self, requirement, **kwds): + name, version, type = requirement.name, requirement.version, requirement.type if type != "package": return NullDependency(version=version, name=name) if version is None: diff --git a/lib/galaxy/tools/deps/resolvers/conda.py b/lib/galaxy/tools/deps/resolvers/conda.py index d2083b09f23d..0495a17b71ea 100644 --- a/lib/galaxy/tools/deps/resolvers/conda.py +++ b/lib/galaxy/tools/deps/resolvers/conda.py @@ -146,6 +146,8 @@ def resolve_all(self, requirements, **kwds): conda_targets = [] for requirement in requirements: + requirement = self.resolve_specs(requirement) + version = requirement.version if self.versionless: version = None @@ -183,7 +185,10 @@ def merged_environment_name(self, conda_targets): assert len(conda_targets) == 1 return conda_targets[0].install_environment - def resolve(self, name, version, type, **kwds): + def resolve(self, requirement, **kwds): + requirement = self.resolve_specs(requirement) + name, version, type = requirement.name, requirement.version, requirement.type + # Check for conda just not being there, this way we can enable # conda by default and just do nothing in not configured. if not os.path.isdir(self.conda_context.conda_prefix): diff --git a/lib/galaxy/tools/deps/resolvers/galaxy_packages.py b/lib/galaxy/tools/deps/resolvers/galaxy_packages.py index 858ff0faf98c..bbfb3e401688 100644 --- a/lib/galaxy/tools/deps/resolvers/galaxy_packages.py +++ b/lib/galaxy/tools/deps/resolvers/galaxy_packages.py @@ -66,11 +66,13 @@ def __init__(self, dependency_manager, **kwds): self.versionless = str(kwds.get('versionless', "false")).lower() == "true" self._init_base_path( dependency_manager, **kwds ) - def resolve( self, name, version, type, **kwds ): + def resolve(self, requirement, **kwds): """ Attempt to find a dependency named `name` at version `version`. If version is None, return the "default" version as determined using a symbolic link (if found). Returns a triple of: env_script, base_path, real_version """ + name, version, type = requirement.name, requirement.version, requirement.type + if version is None or self.versionless: exact = not self.versionless or version is None return self._find_dep_default( name, type=type, exact=exact, **kwds ) diff --git a/lib/galaxy/tools/deps/resolvers/homebrew.py b/lib/galaxy/tools/deps/resolvers/homebrew.py index 395eb1eb5185..2a9781d39046 100644 --- a/lib/galaxy/tools/deps/resolvers/homebrew.py +++ b/lib/galaxy/tools/deps/resolvers/homebrew.py @@ -39,7 +39,9 @@ def __init__(self, dependency_manager, **kwds): self._init_homebrew(**kwds) - def resolve(self, name, version, type, **kwds): + def resolve(self, requirement, **kwds): + name, version, type = requirement.name, requirement.version, requirement.type + if type != "package": return NullDependency(version=version, name=name) diff --git a/lib/galaxy/tools/deps/resolvers/modules.py b/lib/galaxy/tools/deps/resolvers/modules.py index 227abb72a9c9..cb40ed9f4bc0 100644 --- a/lib/galaxy/tools/deps/resolvers/modules.py +++ b/lib/galaxy/tools/deps/resolvers/modules.py @@ -51,7 +51,9 @@ def __default_modulespath(self): module_path = DEFAULT_MODULE_PATH return module_path - def resolve( self, name, version, type, **kwds ): + def resolve(self, requirement, **kwds): + name, version, type = requirement.name, requirement.version, requirement.type + if type != "package": return NullDependency(version=version, name=name) diff --git a/test/unit/tools/test_tool_deps.py b/test/unit/tools/test_tool_deps.py index d8ef0a06daa7..8b35be2d887b 100644 --- a/test/unit/tools/test_tool_deps.py +++ b/test/unit/tools/test_tool_deps.py @@ -14,6 +14,7 @@ from subprocess import PIPE, Popen from galaxy.tools.deps import DependencyManager +from galaxy.tools.deps.requirements import ToolRequirement from galaxy.tools.deps.resolvers import NullDependency from galaxy.tools.deps.resolvers.galaxy_packages import GalaxyPackageDependency from galaxy.tools.deps.resolvers.modules import ModuleDependency, ModuleDependencyResolver @@ -141,15 +142,15 @@ def test_module_dependency_resolver(): advisor/2013/update3 intel/12.0 mkl/10.2.7.041 ''') resolver = ModuleDependencyResolver(None, modulecmd=module_script) - module = resolver.resolve( name="R", version=None, type="package" ) + module = resolver.resolve( ToolRequirement( name="R", version=None, type="package" ) ) assert module.module_name == "R" assert module.module_version is None - module = resolver.resolve( name="R", version="3.0.1", type="package" ) + module = resolver.resolve( ToolRequirement( name="R", version="3.0.1", type="package" ) ) assert module.module_name == "R" assert module.module_version == "3.0.1" - module = resolver.resolve( name="R", version="3.0.4", type="package" ) + module = resolver.resolve( ToolRequirement( name="R", version="3.0.4", type="package" ) ) assert isinstance(module, NullDependency)