Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
hub-client / dockerhub / api_docs / management / commands / release_and_upload_docs.py
Size: Mime:
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}
        )