Cimpress-MCP/JustReleaseNotes

View on GitHub
JustReleaseNotes/command_line.py

Summary

Maintainability
A
3 hrs
Test Coverage
import json
import os
import os.path
import argparse

import requests
import io

import JustReleaseNotes.artifacters
import JustReleaseNotes.writers
import JustReleaseNotes.issuers
import JustReleaseNotes.sourcers
from JustReleaseNotes.sourcers import factory
from JustReleaseNotes.issuers import factory
from JustReleaseNotes.writers import factory
from JustReleaseNotes.artifacters import factory
from JustReleaseNotes.releaseNotes import *
from JustReleaseNotes.utils import EnvReplacer

def main():
    parser = argparse.ArgumentParser(prog="just_release", description='Instruments release process.')
    parser.add_argument('command', metavar='cmd', action="store", choices=['notes'])
    parser.add_argument('--config', '-c', '--c', metavar='config.json', nargs='?', help='Specifies the configuration to use', default="config.json")
    args = parser.parse_args()

    if args.command == "notes":
        generate_release_notes(args.config)

def generateForOneWriter(generator, ticketProvider, writerType, directory, fileName):
    print("\nGenerating using {0}".format(writerType))

    writer = JustReleaseNotes.writers.factory.create(writerType, ticketProvider)

    if fileName is None:
        fileName = "index{0}".format(writer.getExtension())

    content = u""
    p = os.path.join(directory, fileName)
    if os.path.isfile(p):
        with io.open(p,'r',encoding='utf8') as f:
            content += f.read()

    writer.setInitialContent(content)
    releaseNotes = u""
    releaseNotes += generator.generateReleaseNotesByPromotedVersions(writer)

    print("\nStoring release notes at {0}".format(os.path.join(directory, fileName)))
    fileName = os.path.join(directory, fileName)
    with io.open(fileName,'w',encoding='utf8') as f:
        f.write(releaseNotes)

def generate_release_notes(configFile):
        requests.packages.urllib3.disable_warnings()
        file = open(configFile, 'r')
        fileContents = file.read()
        releaseNotesConfig = EnvReplacer.replace(json.loads(fileContents))
        currentDir = os.getcwd()

        if not os.path.isabs(releaseNotesConfig["pathToSave"]):
            releaseNotesConfig["pathToSave"] = os.path.join(currentDir, releaseNotesConfig["pathToSave"])

        for packageName, conf in releaseNotesConfig["packages"].items():
            if "Releases" in conf:
                releasesConf = conf["Releases"]
                promotedVersionsInfo = JustReleaseNotes.artifacters.factory.create(releasesConf).retrievePromotedVersions()
            else:
                print ("No artifacter configured: every version tag will be considered a valid release")
                promotedVersionsInfo = {}

            issuesConf = conf["Issues"]
            ticketProvider = JustReleaseNotes.issuers.factory.create(issuesConf)

            directory = os.path.join(releaseNotesConfig["pathToSave"],packageName)

            if "Directory" in conf["Source"]:
                if not os.path.isabs(conf["Source"]["Directory"]):
                    conf["Source"]["Directory"] = os.path.join(currentDir, conf["Source"]["Directory"])
            else:
                conf["Source"]["Directory"] = directory

            repo = JustReleaseNotes.sourcers.factory.create(conf["Source"])

            if not os.path.exists(conf["Source"]["Directory"]):
                os.makedirs(conf["Source"]["Directory"])

            generator = ReleaseNotes(conf, ticketProvider, repo, promotedVersionsInfo)
            writerConfigs = conf["ReleaseNotesWriter"]
            if isinstance(writerConfigs, str):
                generateForOneWriter(generator, ticketProvider, writerConfigs, directory, None)
            elif hasattr(writerConfigs, '__iter__'):
                for writerConf in writerConfigs:
                    path = writerConf["PathToSave"]
                    generateForOneWriter(generator, ticketProvider, writerConf["Provider"], os.path.dirname(path), os.path.basename(path))

if __name__ == '__main__':
    main()