mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-10-24 12:13:33 +08:00
Use resolver.find_dep to determine dependency status
This commit is contained in:
@@ -58,7 +58,7 @@ class NullDependencyManager( object ):
|
||||
return []
|
||||
|
||||
def find_dep( self, name, version=None, type='package', **kwds ):
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(name=name, version=version)
|
||||
|
||||
|
||||
class DependencyManager( object ):
|
||||
@@ -115,10 +115,10 @@ class DependencyManager( object ):
|
||||
continue
|
||||
dependency = resolver.resolve( name, version, type, **kwds )
|
||||
if require_exact and not dependency.exact:
|
||||
dependency = INDETERMINATE_DEPENDENCY
|
||||
if dependency != INDETERMINATE_DEPENDENCY:
|
||||
dependency = INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
if not isinstance(dependency, INDETERMINATE_DEPENDENCY):
|
||||
return dependency
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
|
||||
def __build_dependency_resolvers( self, conf_file ):
|
||||
if not conf_file:
|
||||
|
||||
@@ -72,7 +72,7 @@ class InstallableDependencyResolver:
|
||||
|
||||
|
||||
class Dependency(Dictifiable, object):
|
||||
dict_collection_visible_keys = ['dependency_type', 'exact']
|
||||
dict_collection_visible_keys = ['dependency_type', 'exact', 'name', 'version']
|
||||
__metaclass__ = ABCMeta
|
||||
|
||||
@abstractmethod
|
||||
@@ -92,8 +92,12 @@ class NullDependency( Dependency ):
|
||||
dependency_type = None
|
||||
exact = True
|
||||
|
||||
def __init__(self, version, name):
|
||||
self.version = version
|
||||
self.name = name
|
||||
|
||||
def shell_commands( self, requirement ):
|
||||
return None
|
||||
|
||||
|
||||
INDETERMINATE_DEPENDENCY = NullDependency()
|
||||
INDETERMINATE_DEPENDENCY = NullDependency
|
||||
|
||||
@@ -31,10 +31,9 @@ class HomebrewToolShedDependencyResolver(
|
||||
|
||||
def resolve(self, name, version, type, **kwds):
|
||||
if type != "package":
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
if version is None:
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
|
||||
return self._find_tool_dependencies(name, version, type, **kwds)
|
||||
|
||||
@@ -49,7 +48,7 @@ class HomebrewToolShedDependencyResolver(
|
||||
if os.path.exists(tool_depenedencies_path):
|
||||
return self._resolve_from_tool_dependencies_path(name, version, tool_depenedencies_path)
|
||||
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
|
||||
def _resolve_from_installed_tool_dependency(self, name, version, installed_tool_dependency):
|
||||
tool_shed_repository = installed_tool_dependency.tool_shed_repository
|
||||
@@ -66,11 +65,11 @@ class HomebrewToolShedDependencyResolver(
|
||||
raw_dependencies = RawDependencies(tool_dependencies_path)
|
||||
except Exception:
|
||||
log.debug("Failed to parse dependencies in file %s" % tool_dependencies_path)
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
|
||||
raw_dependency = raw_dependencies.find(name, version)
|
||||
if not raw_dependency:
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
|
||||
recipe_name = build_recipe_name(
|
||||
package_name=name,
|
||||
|
||||
@@ -106,15 +106,10 @@ class CondaDependencyResolver(DependencyResolver, ListableDependencyResolver, In
|
||||
# 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):
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
|
||||
if type != "package":
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
|
||||
job_directory = kwds.get("job_directory", None)
|
||||
if job_directory is None:
|
||||
log.warning("Conda dependency resolver not sent job directory.")
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
|
||||
exact = not self.versionless or version is None
|
||||
if self.versionless:
|
||||
@@ -124,11 +119,26 @@ class CondaDependencyResolver(DependencyResolver, ListableDependencyResolver, In
|
||||
is_installed = is_conda_target_installed(
|
||||
conda_target, conda_context=self.conda_context, verbose_install_check=self.verbose_install_check
|
||||
)
|
||||
|
||||
job_directory = kwds.get("job_directory", None)
|
||||
if job_directory is None: # Job directory is None when resolve() called by find_dep()
|
||||
if is_installed:
|
||||
return CondaDependency(
|
||||
False,
|
||||
os.path.join(self.conda_context.envs_path, conda_target.install_environment),
|
||||
exact,
|
||||
name=name,
|
||||
version=version
|
||||
)
|
||||
else:
|
||||
log.warning("Conda dependency resolver not sent job directory.")
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
|
||||
if not is_installed and self.auto_install:
|
||||
is_installed = self.install_dependency(name, version, type)
|
||||
|
||||
if not is_installed:
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
|
||||
# Have installed conda_target and job_directory to send it too.
|
||||
# If dependency is for metadata generation, store environment in conda-metadata-env
|
||||
|
||||
@@ -39,7 +39,7 @@ class BaseGalaxyPackageDependencyResolver(DependencyResolver, UsesToolDependency
|
||||
def _find_dep_versioned( self, name, version, type='package', **kwds ):
|
||||
base_path = self.base_path
|
||||
path = join( base_path, name, version )
|
||||
return self._galaxy_package_dep(path, version, True)
|
||||
return self._galaxy_package_dep(path, version, name, True)
|
||||
|
||||
def _find_dep_default( self, name, type='package', exact=True, **kwds ):
|
||||
base_path = self.base_path
|
||||
@@ -49,15 +49,15 @@ class BaseGalaxyPackageDependencyResolver(DependencyResolver, UsesToolDependency
|
||||
real_version = basename( real_path )
|
||||
return self._galaxy_package_dep(real_path, real_version, exact)
|
||||
else:
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=None, name=name)
|
||||
|
||||
def _galaxy_package_dep( self, path, version, exact ):
|
||||
def _galaxy_package_dep( self, path, version, name, exact ):
|
||||
script = join( path, 'env.sh' )
|
||||
if exists( script ):
|
||||
return GalaxyPackageDependency(script, path, version, exact)
|
||||
elif exists( join( path, 'bin' ) ):
|
||||
return GalaxyPackageDependency(None, path, version, exact)
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
|
||||
|
||||
class GalaxyPackageDependencyResolver(BaseGalaxyPackageDependencyResolver, ListableDependencyResolver):
|
||||
|
||||
@@ -41,7 +41,7 @@ class HomebrewDependencyResolver(DependencyResolver, UsesHomebrewMixin):
|
||||
|
||||
def resolve(self, name, version, type, **kwds):
|
||||
if type != "package":
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
|
||||
if version is None or self.versionless:
|
||||
return self._find_dep_default(name, version)
|
||||
|
||||
@@ -52,14 +52,14 @@ class ModuleDependencyResolver(DependencyResolver):
|
||||
|
||||
def resolve( self, name, version, type, **kwds ):
|
||||
if type != "package":
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
|
||||
if self.__has_module(name, version):
|
||||
return ModuleDependency(self, name, version, exact=True)
|
||||
elif self.versionless and self.__has_module(name, None):
|
||||
return ModuleDependency(self, name, None, exact=False)
|
||||
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
|
||||
def __has_module(self, name, version):
|
||||
return self.module_checker.has_module(name, version)
|
||||
|
||||
@@ -15,7 +15,7 @@ class UsesHomebrewMixin:
|
||||
def _find_dep_versioned(self, name, version):
|
||||
recipe_path = recipe_cellar_path(self.cellar_root, name, version)
|
||||
if not os.path.exists(recipe_path) or not os.path.isdir(recipe_path):
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
|
||||
commands = build_env_statements(self.cellar_root, recipe_path, relaxed=True)
|
||||
return HomebrewDependency(commands)
|
||||
@@ -23,7 +23,7 @@ class UsesHomebrewMixin:
|
||||
def _find_dep_default(self, name, version):
|
||||
installed_versions = self._installed_versions(name)
|
||||
if not installed_versions:
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
|
||||
# Just grab newest installed version - may make sense some day to find
|
||||
# the linked version instead.
|
||||
|
||||
@@ -21,7 +21,7 @@ class ToolShedPackageDependencyResolver(BaseGalaxyPackageDependencyResolver, Use
|
||||
path = self._get_package_installed_dependency_path( installed_tool_dependency, name, version )
|
||||
return self._galaxy_package_dep(path, version, True)
|
||||
else:
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
|
||||
def _find_dep_default( self, name, type='package', **kwds ):
|
||||
if type == 'set_environment' and kwds.get('installed_tool_dependencies', None):
|
||||
@@ -33,7 +33,7 @@ class ToolShedPackageDependencyResolver(BaseGalaxyPackageDependencyResolver, Use
|
||||
if has_script_dep:
|
||||
# Environment settings do not use versions.
|
||||
return GalaxyPackageDependency(dependency.script, dependency.path, None, True)
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=None, name=name)
|
||||
|
||||
def _get_package_installed_dependency_path( self, installed_tool_dependency, name, version ):
|
||||
tool_shed_repository = installed_tool_dependency.tool_shed_repository
|
||||
@@ -59,7 +59,7 @@ class ToolShedPackageDependencyResolver(BaseGalaxyPackageDependencyResolver, Use
|
||||
if exists( path ):
|
||||
script = join( path, 'env.sh' )
|
||||
return GalaxyPackageDependency(script, path, None, True)
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=None, name=name)
|
||||
|
||||
|
||||
__all__ = ['ToolShedPackageDependencyResolver']
|
||||
|
||||
@@ -48,7 +48,7 @@ class UnlinkedToolShedPackageDependencyResolver(BaseGalaxyPackageDependencyResol
|
||||
possibles = self._find_possible_depenencies(name, version, type)
|
||||
if len(possibles) == 0:
|
||||
log.debug("Unable to find dependency,'%s' '%s' '%s'", name, version, type)
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
elif len(possibles) == 1:
|
||||
# Only one candidate found so ignore any preference rules
|
||||
return possibles[0].dependency
|
||||
@@ -57,7 +57,7 @@ class UnlinkedToolShedPackageDependencyResolver(BaseGalaxyPackageDependencyResol
|
||||
return self._select_preferred_dependency(possibles).dependency
|
||||
except:
|
||||
log.exception("Unexpected error hunting for dependency '%s' '%s''%s'", name, version, type)
|
||||
return INDETERMINATE_DEPENDENCY
|
||||
return INDETERMINATE_DEPENDENCY(version=version, name=name)
|
||||
|
||||
# Finds all possible dependency to use
|
||||
# Should be extended as required
|
||||
|
||||
@@ -126,26 +126,4 @@ class DependencyResolversView(object):
|
||||
return [index for index, resolver in enumerate(self._dependency_resolvers) if hasattr(resolver, "install_dependency") and not resolver.disabled ]
|
||||
|
||||
def get_requirements_status(self, requested_requirements):
|
||||
result = []
|
||||
for req in requested_requirements:
|
||||
installed_requirement = self.requirement_installed(req)
|
||||
if not installed_requirement:
|
||||
req['status'] = "not installed"
|
||||
req['exact'] = "NA"
|
||||
req['resolver_type'] = None
|
||||
result.append(req)
|
||||
else:
|
||||
result.append(installed_requirement)
|
||||
return result
|
||||
|
||||
def requirement_installed(self, requirement):
|
||||
installed_requirements = self.manager_requirements()
|
||||
for ireq in installed_requirements:
|
||||
if requirement['name'] == ireq['requirement']['name']:
|
||||
requirement['resolver_type'] = self._dependency_resolvers[ireq['index']].resolver_type
|
||||
versionless = self._dependency_resolvers[ireq['index']].versionless
|
||||
if (requirement['version'] == ireq['requirement']['version'] and requirement['version'] and not versionless) or (versionless and not ireq['requirement']['version']):
|
||||
requirement['status'] = "installed"
|
||||
requirement['exact'] = not versionless
|
||||
return requirement
|
||||
return None
|
||||
return [self.manager_dependency(**req) for req in requested_requirements]
|
||||
|
||||
@@ -95,7 +95,8 @@ class ToolDependenciesAPIController( BaseAPIController ):
|
||||
:returns: a dictified description of the dependency, with attribute
|
||||
``dependency_type: null`` if no match was found.
|
||||
"""
|
||||
return self._view.install_dependency(id, **kwds)
|
||||
self._view.install_dependency(id, **kwds)
|
||||
return self._view.manager_dependency(**kwds)
|
||||
|
||||
@expose_api
|
||||
@require_admin
|
||||
|
||||
@@ -1044,9 +1044,9 @@
|
||||
<tr>
|
||||
<td>${dependency['name'] | h}</td>
|
||||
<td>${dependency['version'] | h}</td>
|
||||
<td>${dependency['resolver_type'] | h}</td>
|
||||
<td>${dependency['dependency_type'] | h}</td>
|
||||
<td>${dependency['exact'] | h}</td>
|
||||
%if dependency['status'] == 'not installed':
|
||||
%if dependency['dependency_type'] == None:
|
||||
<td>
|
||||
<img src="${h.url_for('/static')}/images/icon_error_sml.gif" title='Dependency not resolved'/>
|
||||
</td>
|
||||
|
||||
Reference in New Issue
Block a user