comparison env/lib/python3.9/site-packages/galaxy/tool_util/deps/resolvers/brewed_tool_shed_packages.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4f3585e2f14b
1 """
2 This dependency resolver resolves tool shed dependencies (those defined
3 tool_dependencies.xml) installed using Platform Homebrew and converted
4 via shed2tap (e.g. https://github.com/jmchilton/homebrew-toolshed).
5 """
6 import logging
7 import os
8
9 from galaxy.util import parse_xml
10 from . import (
11 DependencyResolver,
12 NullDependency
13 )
14 from .resolver_mixins import (
15 UsesHomebrewMixin,
16 UsesInstalledRepositoriesMixin,
17 UsesToolDependencyDirMixin,
18 )
19
20 log = logging.getLogger(__name__)
21
22
23 class HomebrewToolShedDependencyResolver(
24 DependencyResolver,
25 UsesHomebrewMixin,
26 UsesToolDependencyDirMixin,
27 UsesInstalledRepositoriesMixin,
28 ):
29 resolver_type = "tool_shed_tap"
30
31 def __init__(self, dependency_manager, **kwds):
32 self._init_homebrew(**kwds)
33 self._init_base_path(dependency_manager, **kwds)
34
35 def resolve(self, requirement, **kwds):
36 name, version, type = requirement.name, requirement.version, requirement.type
37 if type != "package":
38 return NullDependency(version=version, name=name)
39 if version is None:
40 return NullDependency(version=version, name=name)
41
42 return self._find_tool_dependencies(name, version, type, **kwds)
43
44 def _find_tool_dependencies(self, name, version, type, **kwds):
45 installed_tool_dependency = self._get_installed_dependency(name, type, version=version, **kwds)
46 if installed_tool_dependency:
47 return self._resolve_from_installed_tool_dependency(name, version, installed_tool_dependency)
48
49 if "tool_dir" in kwds:
50 tool_directory = os.path.abspath(kwds["tool_dir"])
51 tool_depenedencies_path = os.path.join(tool_directory, "tool_dependencies.xml")
52 if os.path.exists(tool_depenedencies_path):
53 return self._resolve_from_tool_dependencies_path(name, version, tool_depenedencies_path)
54
55 return NullDependency(version=version, name=name)
56
57 def _resolve_from_installed_tool_dependency(self, name, version, installed_tool_dependency):
58 tool_shed_repository = installed_tool_dependency.tool_shed_repository
59 recipe_name = build_recipe_name(
60 package_name=name,
61 package_version=version,
62 repository_owner=tool_shed_repository.owner,
63 repository_name=tool_shed_repository.name,
64 )
65 return self._find_dep_default(recipe_name, None)
66
67 def _resolve_from_tool_dependencies_path(self, name, version, tool_dependencies_path):
68 try:
69 raw_dependencies = RawDependencies(tool_dependencies_path)
70 except Exception:
71 log.debug("Failed to parse dependencies in file %s" % tool_dependencies_path)
72 return NullDependency(version=version, name=name)
73
74 raw_dependency = raw_dependencies.find(name, version)
75 if not raw_dependency:
76 return NullDependency(version=version, name=name)
77
78 recipe_name = build_recipe_name(
79 package_name=name,
80 package_version=version,
81 repository_owner=raw_dependency.repository_owner,
82 repository_name=raw_dependency.repository_name
83 )
84 dep = self._find_dep_default(recipe_name, None)
85 return dep
86
87
88 class RawDependencies:
89
90 def __init__(self, dependencies_file):
91 self.root = parse_xml(dependencies_file).getroot()
92 dependencies = []
93 package_els = self.root.findall("package") or []
94 for package_el in package_els:
95 repository_el = package_el.find("repository")
96 if repository_el is None:
97 continue
98 dependency = RawDependency(self, package_el, repository_el)
99 dependencies.append(dependency)
100 self.dependencies = dependencies
101
102 def find(self, package_name, package_version):
103 target_dependency = None
104
105 for dependency in self.dependencies:
106 if dependency.package_name == package_name and dependency.package_version == package_version:
107 target_dependency = dependency
108 break
109 return target_dependency
110
111
112 class RawDependency:
113
114 def __init__(self, dependencies, package_el, repository_el):
115 self.dependencies = dependencies
116 self.package_el = package_el
117 self.repository_el = repository_el
118
119 def __repr__(self):
120 temp = "Dependency[package_name=%s,version=%s,dependent_package=%s]"
121 return temp % (
122 self.package_el.attrib["name"],
123 self.package_el.attrib["version"],
124 self.repository_el.attrib["name"]
125 )
126
127 @property
128 def repository_owner(self):
129 return self.repository_el.attrib["owner"]
130
131 @property
132 def repository_name(self):
133 return self.repository_el.attrib["name"]
134
135 @property
136 def package_name(self):
137 return self.package_el.attrib["name"]
138
139 @property
140 def package_version(self):
141 return self.package_el.attrib["version"]
142
143
144 def build_recipe_name(package_name, package_version, repository_owner, repository_name):
145 # TODO: Consider baking package_name and package_version into name? (would be more "correct")
146 owner = repository_owner.replace("-", "")
147 name = repository_name
148 name = name.replace("_", "").replace("-", "")
149 base = f"{owner}_{name}"
150 return base
151
152
153 __all__ = ('HomebrewToolShedDependencyResolver', )