comparison venv/lib/python2.7/site-packages/planemo/shed/interface.py @ 0:d67268158946 draft

planemo upload commit a3f181f5f126803c654b3a66dd4e83a48f7e203b
author bcclaywell
date Mon, 12 Oct 2015 17:43:33 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:d67268158946
1 """ Interface over bioblend and direct access to ToolShed
2 API via requests.
3 """
4 import json
5 from planemo.io import untar_to
6 from planemo.bioblend import (
7 toolshed,
8 ensure_module,
9 )
10
11 REPOSITORY_DOWNLOAD_TEMPLATE = (
12 "%srepository/download?repository_id=%s"
13 "&changeset_revision=default&file_type=gz"
14 )
15
16
17 def tool_shed_instance(url, key, email, password):
18 ensure_module(toolshed)
19 tsi = toolshed.ToolShedInstance(
20 url=url,
21 key=key,
22 email=email,
23 password=password
24 )
25 return tsi
26
27
28 def find_repository(tsi, owner, name):
29 """ Find repository information for given owner and repository
30 name.
31 """
32 repos = tsi.repositories.get_repositories()
33
34 def matches(r):
35 return r["owner"] == owner and r["name"] == name
36
37 matching_repos = list(filter(matches, repos))
38 if not matching_repos:
39 return None
40 else:
41 return matching_repos[0]
42
43
44 def latest_installable_revision(tsi, repository_id):
45 info = tsi.repositories.show_repository(repository_id)
46 owner = info["owner"]
47 name = info["name"]
48 revisions = tsi.repositories.get_ordered_installable_revisions(
49 name, owner
50 )
51 if len(revisions) == 0:
52 msg = "Failed to find installable revisions for [{0}, {1}].".format(
53 owner,
54 name,
55 )
56 raise Exception(msg)
57 else:
58 return revisions[-1]
59
60
61 def username(tsi):
62 """ Fetch current username from shed given API key/auth.
63 """
64 user = _user(tsi)
65 return user["username"]
66
67
68 def api_exception_to_message(e):
69 """ Convert API exception to human digestable error message - parsing
70 out the shed generate message if possible.
71 """
72 message = str(e)
73 if hasattr(e, "read"):
74 message = e.read()
75 try:
76 # Galaxy passes nice JSON messages as their errors, which bioblend
77 # blindly returns. Attempt to parse those.
78 upstream_error = json.loads(message)
79 message = upstream_error['err_msg']
80 except Exception:
81 pass
82 return message
83
84
85 def find_category_ids(tsi, categories):
86 """ Translate human readable category names into their associated IDs.
87 """
88 category_list = tsi.repositories.get_categories()
89
90 category_ids = []
91 for cat in categories:
92 matching_cats = [x for x in category_list if x['name'] == cat]
93 if not matching_cats:
94 message = "Failed to find category %s" % cat
95 raise Exception(message)
96 category_ids.append(matching_cats[0]['id'])
97 return category_ids
98
99
100 def download_tar(tsi, repo_id, destination, to_directory):
101 base_url = tsi.base_url
102 if not base_url.endswith("/"):
103 base_url += "/"
104 download_url = REPOSITORY_DOWNLOAD_TEMPLATE % (base_url, repo_id)
105 if to_directory:
106 untar_args = "-xzf - -C %s --strip-components 1" % destination
107 else:
108 untar_args = None
109 untar_to(download_url, destination, untar_args)
110
111
112 def _user(tsi):
113 """ Fetch user information from the ToolShed API for given
114 key.
115 """
116 # TODO: this should be done with an actual bioblend method,
117 # see https://github.com/galaxyproject/bioblend/issues/130.
118 response = tsi.make_get_request(tsi.url + "/users")
119 return response.json()[0]