Use resolver.find_dep to determine dependency status

This commit is contained in:
Marius van den Beek
2016-07-23 18:13:41 +02:00
parent 201863200e
commit 0b24283395
13 changed files with 52 additions and 60 deletions
+4 -4
View File
@@ -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:
+6 -2
View 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,
+18 -8
View File
@@ -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):
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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
+1 -23
View File
@@ -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>