diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/env/lib/python3.7/site-packages/planemo/github_util.py	Sat May 02 07:14:21 2020 -0400
@@ -0,0 +1,176 @@
+"""Utilities for interacting with Github."""
+from __future__ import absolute_import
+
+import os
+
+from galaxy.tool_util.deps.commands import which
+
+from planemo import git
+from planemo.io import (
+    communicate,
+    IS_OS_X,
+    untar_to,
+)
+
+try:
+    import github
+    has_github_lib = True
+except ImportError:
+    github = None
+    has_github_lib = False
+
+HUB_VERSION = "2.2.8"
+
+NO_GITHUB_DEP_ERROR = ("Cannot use github functionality - "
+                       "PyGithub library not available.")
+FAILED_TO_DOWNLOAD_HUB = "No hub executable available and it could not be installed."
+
+
+def get_github_config(ctx, allow_anonymous=False):
+    """Return a :class:`planemo.github_util.GithubConfig` for given configuration."""
+    global_github_config = _get_raw_github_config(ctx)
+    return GithubConfig(global_github_config, allow_anonymous=allow_anonymous)
+
+
+def clone_fork_branch(ctx, target, path, **kwds):
+    """Clone, fork, and branch a repository ahead of building a pull request."""
+    git.checkout(
+        ctx,
+        target,
+        path,
+        branch=kwds.get("branch", None),
+        remote="origin",
+        from_branch="master"
+    )
+    if kwds.get("fork"):
+        try:
+            fork(ctx, path, **kwds)
+        except Exception:
+            pass
+
+
+def fork(ctx, path, **kwds):
+    """Fork the target repository using ``hub``."""
+    hub_path = ensure_hub(ctx, **kwds)
+    hub_env = get_hub_env(ctx, path, **kwds)
+    cmd = [hub_path, "fork"]
+    communicate(cmd, env=hub_env)
+
+
+def pull_request(ctx, path, message=None, **kwds):
+    """Create a pull request against the origin of the path using ``hub``."""
+    hub_path = ensure_hub(ctx, **kwds)
+    hub_env = get_hub_env(ctx, path, **kwds)
+    cmd = [hub_path, "pull-request"]
+    if message is not None:
+        cmd.extend(["-m", message])
+    communicate(cmd, env=hub_env)
+
+
+def get_hub_env(ctx, path, **kwds):
+    """Return a environment dictionary to run hub with given user and repository target."""
+    env = git.git_env_for(path).copy()
+    github_config = _get_raw_github_config(ctx)
+    if github_config is not None:
+        if "username" in github_config:
+            env["GITHUB_USER"] = github_config["username"]
+        if "password" in github_config:
+            env["GITHUB_PASSWORD"] = github_config["password"]
+
+    return env
+
+
+def ensure_hub(ctx, **kwds):
+    """Ensure ``hub`` is on the system ``PATH``.
+
+    This method will ensure ``hub`` is installed if it isn't available.
+
+    For more information on ``hub`` checkout ...
+    """
+    hub_path = which("hub")
+    if not hub_path:
+        planemo_hub_path = os.path.join(ctx.workspace, "hub")
+        if not os.path.exists(planemo_hub_path):
+            _try_download_hub(planemo_hub_path)
+
+        if not os.path.exists(planemo_hub_path):
+            raise Exception(FAILED_TO_DOWNLOAD_HUB)
+
+        hub_path = planemo_hub_path
+    return hub_path
+
+
+def _try_download_hub(planemo_hub_path):
+    link = _hub_link()
+    # Strip URL base and .tgz at the end.
+    basename = link.split("/")[-1].rsplit(".", 1)[0]
+    untar_to(link, tar_args=['-zxvf', '-', "%s/bin/hub" % basename], path=planemo_hub_path)
+    communicate(["chmod", "+x", planemo_hub_path])
+
+
+def _get_raw_github_config(ctx):
+    """Return a :class:`planemo.github_util.GithubConfig` for given configuration."""
+    if "github" not in ctx.global_config:
+        if "GITHUB_USER" in os.environ and "GITHUB_PASSWORD" in os.environ:
+            return {
+                "username": os.environ["GITHUB_USER"],
+                "password": os.environ["GITHUB_PASSWORD"],
+            }
+    if "github" not in ctx.global_config:
+        raise Exception("github account not found in planemo config and GITHUB_USER / GITHUB_PASSWORD environment variables unset")
+    return ctx.global_config["github"]
+
+
+class GithubConfig(object):
+    """Abstraction around a Github account.
+
+    Required to use ``github`` module methods that require authorization.
+    """
+
+    def __init__(self, config, allow_anonymous=False):
+        if not has_github_lib:
+            raise Exception(NO_GITHUB_DEP_ERROR)
+        if "username" not in config or "password" not in config:
+            if not allow_anonymous:
+                raise Exception("github authentication unavailable")
+            github_object = github.Github()
+        else:
+            github_object = github.Github(config["username"], config["password"])
+        self._github = github_object
+
+
+def _hub_link():
+    if IS_OS_X:
+        template_link = "https://github.com/github/hub/releases/download/v%s/hub-darwin-amd64-%s.tgz"
+    else:
+        template_link = "https://github.com/github/hub/releases/download/v%s/hub-linux-amd64-%s.tgz"
+    return template_link % (HUB_VERSION, HUB_VERSION)
+
+
+def publish_as_gist_file(ctx, path, name="index"):
+    """Publish a gist.
+
+    More information on gists at http://gist.github.com/.
+    """
+    github_config = get_github_config(ctx, allow_anonymous=False)
+    user = github_config._github.get_user()
+    with open(path, "r") as fh:
+        content = fh.read()
+    content_file = github.InputFileContent(content)
+    gist = user.create_gist(False, {name: content_file})
+    return gist.files[name].raw_url
+
+
+def get_repository_object(ctx, name):
+    github_object = get_github_config(ctx, allow_anonymous=True)
+    return github_object._github.get_repo(name)
+
+
+__all__ = (
+    "clone_fork_branch",
+    "ensure_hub",
+    "fork",
+    "get_github_config",
+    "get_hub_env",
+    "publish_as_gist_file",
+)