Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/planemo/github_util.py @ 0:26e78fe6e8c4 draft
"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author | shellac |
---|---|
date | Sat, 02 May 2020 07:14:21 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:26e78fe6e8c4 |
---|---|
1 """Utilities for interacting with Github.""" | |
2 from __future__ import absolute_import | |
3 | |
4 import os | |
5 | |
6 from galaxy.tool_util.deps.commands import which | |
7 | |
8 from planemo import git | |
9 from planemo.io import ( | |
10 communicate, | |
11 IS_OS_X, | |
12 untar_to, | |
13 ) | |
14 | |
15 try: | |
16 import github | |
17 has_github_lib = True | |
18 except ImportError: | |
19 github = None | |
20 has_github_lib = False | |
21 | |
22 HUB_VERSION = "2.2.8" | |
23 | |
24 NO_GITHUB_DEP_ERROR = ("Cannot use github functionality - " | |
25 "PyGithub library not available.") | |
26 FAILED_TO_DOWNLOAD_HUB = "No hub executable available and it could not be installed." | |
27 | |
28 | |
29 def get_github_config(ctx, allow_anonymous=False): | |
30 """Return a :class:`planemo.github_util.GithubConfig` for given configuration.""" | |
31 global_github_config = _get_raw_github_config(ctx) | |
32 return GithubConfig(global_github_config, allow_anonymous=allow_anonymous) | |
33 | |
34 | |
35 def clone_fork_branch(ctx, target, path, **kwds): | |
36 """Clone, fork, and branch a repository ahead of building a pull request.""" | |
37 git.checkout( | |
38 ctx, | |
39 target, | |
40 path, | |
41 branch=kwds.get("branch", None), | |
42 remote="origin", | |
43 from_branch="master" | |
44 ) | |
45 if kwds.get("fork"): | |
46 try: | |
47 fork(ctx, path, **kwds) | |
48 except Exception: | |
49 pass | |
50 | |
51 | |
52 def fork(ctx, path, **kwds): | |
53 """Fork the target repository using ``hub``.""" | |
54 hub_path = ensure_hub(ctx, **kwds) | |
55 hub_env = get_hub_env(ctx, path, **kwds) | |
56 cmd = [hub_path, "fork"] | |
57 communicate(cmd, env=hub_env) | |
58 | |
59 | |
60 def pull_request(ctx, path, message=None, **kwds): | |
61 """Create a pull request against the origin of the path using ``hub``.""" | |
62 hub_path = ensure_hub(ctx, **kwds) | |
63 hub_env = get_hub_env(ctx, path, **kwds) | |
64 cmd = [hub_path, "pull-request"] | |
65 if message is not None: | |
66 cmd.extend(["-m", message]) | |
67 communicate(cmd, env=hub_env) | |
68 | |
69 | |
70 def get_hub_env(ctx, path, **kwds): | |
71 """Return a environment dictionary to run hub with given user and repository target.""" | |
72 env = git.git_env_for(path).copy() | |
73 github_config = _get_raw_github_config(ctx) | |
74 if github_config is not None: | |
75 if "username" in github_config: | |
76 env["GITHUB_USER"] = github_config["username"] | |
77 if "password" in github_config: | |
78 env["GITHUB_PASSWORD"] = github_config["password"] | |
79 | |
80 return env | |
81 | |
82 | |
83 def ensure_hub(ctx, **kwds): | |
84 """Ensure ``hub`` is on the system ``PATH``. | |
85 | |
86 This method will ensure ``hub`` is installed if it isn't available. | |
87 | |
88 For more information on ``hub`` checkout ... | |
89 """ | |
90 hub_path = which("hub") | |
91 if not hub_path: | |
92 planemo_hub_path = os.path.join(ctx.workspace, "hub") | |
93 if not os.path.exists(planemo_hub_path): | |
94 _try_download_hub(planemo_hub_path) | |
95 | |
96 if not os.path.exists(planemo_hub_path): | |
97 raise Exception(FAILED_TO_DOWNLOAD_HUB) | |
98 | |
99 hub_path = planemo_hub_path | |
100 return hub_path | |
101 | |
102 | |
103 def _try_download_hub(planemo_hub_path): | |
104 link = _hub_link() | |
105 # Strip URL base and .tgz at the end. | |
106 basename = link.split("/")[-1].rsplit(".", 1)[0] | |
107 untar_to(link, tar_args=['-zxvf', '-', "%s/bin/hub" % basename], path=planemo_hub_path) | |
108 communicate(["chmod", "+x", planemo_hub_path]) | |
109 | |
110 | |
111 def _get_raw_github_config(ctx): | |
112 """Return a :class:`planemo.github_util.GithubConfig` for given configuration.""" | |
113 if "github" not in ctx.global_config: | |
114 if "GITHUB_USER" in os.environ and "GITHUB_PASSWORD" in os.environ: | |
115 return { | |
116 "username": os.environ["GITHUB_USER"], | |
117 "password": os.environ["GITHUB_PASSWORD"], | |
118 } | |
119 if "github" not in ctx.global_config: | |
120 raise Exception("github account not found in planemo config and GITHUB_USER / GITHUB_PASSWORD environment variables unset") | |
121 return ctx.global_config["github"] | |
122 | |
123 | |
124 class GithubConfig(object): | |
125 """Abstraction around a Github account. | |
126 | |
127 Required to use ``github`` module methods that require authorization. | |
128 """ | |
129 | |
130 def __init__(self, config, allow_anonymous=False): | |
131 if not has_github_lib: | |
132 raise Exception(NO_GITHUB_DEP_ERROR) | |
133 if "username" not in config or "password" not in config: | |
134 if not allow_anonymous: | |
135 raise Exception("github authentication unavailable") | |
136 github_object = github.Github() | |
137 else: | |
138 github_object = github.Github(config["username"], config["password"]) | |
139 self._github = github_object | |
140 | |
141 | |
142 def _hub_link(): | |
143 if IS_OS_X: | |
144 template_link = "https://github.com/github/hub/releases/download/v%s/hub-darwin-amd64-%s.tgz" | |
145 else: | |
146 template_link = "https://github.com/github/hub/releases/download/v%s/hub-linux-amd64-%s.tgz" | |
147 return template_link % (HUB_VERSION, HUB_VERSION) | |
148 | |
149 | |
150 def publish_as_gist_file(ctx, path, name="index"): | |
151 """Publish a gist. | |
152 | |
153 More information on gists at http://gist.github.com/. | |
154 """ | |
155 github_config = get_github_config(ctx, allow_anonymous=False) | |
156 user = github_config._github.get_user() | |
157 with open(path, "r") as fh: | |
158 content = fh.read() | |
159 content_file = github.InputFileContent(content) | |
160 gist = user.create_gist(False, {name: content_file}) | |
161 return gist.files[name].raw_url | |
162 | |
163 | |
164 def get_repository_object(ctx, name): | |
165 github_object = get_github_config(ctx, allow_anonymous=True) | |
166 return github_object._github.get_repo(name) | |
167 | |
168 | |
169 __all__ = ( | |
170 "clone_fork_branch", | |
171 "ensure_hub", | |
172 "fork", | |
173 "get_github_config", | |
174 "get_hub_env", | |
175 "publish_as_gist_file", | |
176 ) |