Plugins for spindles¶
Note
Plugins only work when using python 3. Python 2’s importlib does not contain the necessary functionality.
As of version 3.4, git-spindle has a plugin system with which you can add subcommands that are not suitable for sending upstream. For example, I use it for enumerating the status of my work PR’s that assumes access to work internal systems.
Plugins live in ~/.local/lib/git-spindle/$spindle/$plugin.py. They are structured like the actual spindles themselves, except that your methods must be fully self-contained as they will be transplanted into the main spindle classes. Methods must comply with the following:
They must be decorated with @command, else they will be ignored They must
have documentation as a 2-line strinf. The first line must be a docpt-format
list of accepted options. The second line contains a short usage string. If the method takes no options, the docstring must start with a newline.
Since the method is transplanted into the actual spindle, the method must be completely self-contained. The ‘self’ argument will also be an instance of the spindle, not the plugin
The self argument may rely on certain GitSpindle internals, for which you’re going to have to read the code:
self.api will refer to the api module
self.spindle is the name of the spindle
self.gh/self.bb/self.gl refer to the authenticated api instance
self.shell is a whelk.Shell instance with utf-8 encoding
the self.git function to execute git commands
the self.gitm function that does the same, but exits if the command fails
the self.config function to read/write git-spindle configuration
the self.repository function, that finds the correct repository on GitHub/GitLab/Bitbucket
Use of other internals is discouraged. If there is another internal function you would like to use (or add), please file a pull request.
Here is a minimal example that prints a summary of all pull requests you’ve filed in an organization’s repositories:
from gitspindle import GitSpindlePlugin, command
class GitHub(GitSpindlePlugin):
@command
def my_org_prs(self, opts):
"""<org>
List the PR's you filed in an organization's repos"""
for issue in self.gh.iter_org_issues(opts['<org>'], filter='created'):
if issue.pull_request:
rl = '[%s/%s]' % issue.repository
print('%-25s %s %s' % (rl, issue.title, issue.html_url))
Placing this in ~/.local/lib/git-spindle/github/org-prs.py will cause git hub my-org-prs someorgname to work, including adding the usage string to the main program’s help functions.