Repository URL to install this package:
|
Version:
0.32.0 ▾
|
import json
import os
import urllib
from subprocess import call
from django.conf import settings
from django.core.management.base import BaseCommand
from dockerhub.api_docs.management.utils import get_github_api_url, create_github_session
GITHUB_AUTH_TOKEN = os.environ.get('GITHUB_AUTH_TOKEN')
class Command(BaseCommand):
help = 'Create release and upload API docs'
releases_base_url = "{}/releases".format(get_github_api_url())
def handle(self, *args, **options):
session = create_github_session()
tagname = "v{}".format(settings.VERSION_NUMBER)
release_url = self.create_release(session, tagname)
self.upload_swagger_docs(session, release_url)
def create_release(self, session, tagname):
"""
With a given tagname create a release.
The git tag with `tagname` should already exist.
"""
data = {
'tag_name': tagname,
'name': tagname
}
response = session.post(self.releases_base_url, data=json.dumps(data))
if response.status_code == 422:
# A release for this tag already exists, lets get the release
url = "{}/tags/{}".format(self.releases_base_url, tagname)
response = session.get(url)
response.raise_for_status()
release = response.json()
url = release['upload_url']
# upload url needs to strip off the optional query params
url = url.replace('{?name,label}', '')
return url
def upload_swagger_docs(self, session, release_url):
"""
Upload the swagger documents (json and html) to the release upload url
"""
PROJECT_ROOT = settings.PROJECT_ROOT
docs_dir = os.path.join(PROJECT_ROOT.parent, 'docs')
cmd = " ".join([
'/usr/bin/curl',
'-H "Authorization: token {token}"',
'-H "Content-Type: {content_type}"',
'--data-binary @{filename}',
'{upload_url}'
])
# first upload the json document
query_params = self._generate_query_params('swagger.json', 'JSON Swagger Document')
call(cmd.format(
token=GITHUB_AUTH_TOKEN,
content_type='application/json',
filename=os.path.join(docs_dir, 'swagger.json'),
upload_url="{}?{}".format(release_url, query_params)
), shell=True)
# Second upload the html document
query_params = self._generate_query_params('index.html', 'API Docs')
call(cmd.format(
token=GITHUB_AUTH_TOKEN,
content_type='text/html',
filename=os.path.join(docs_dir, 'index.html'),
upload_url="{}?{}".format(release_url, query_params)
), shell=True)
def _generate_query_params(self, name, label):
return urllib.urlencode(
{'name': name, 'label': label}
)