Skip to content
Snippets Groups Projects
cli.py 2.08 KiB
Newer Older
  • Learn to ignore specific revisions
  • Konstantin Baierer's avatar
    wip
    Konstantin Baierer committed
    import click
    from ocrd.decorators import ocrd_loglevel
    from ocrd_utils import getLogger
    from yaml import safe_load
    
    Konstantin Baierer's avatar
    Konstantin Baierer committed
    import json
    
    Konstantin Baierer's avatar
    wip
    Konstantin Baierer committed
    from pkg_resources import resource_filename
    
    from .repo import Repo
    
    LOG = getLogger('kwalitee.cli')
    
    
    def _check_cloned(ctx):
        uncloned = []
        for repo in ctx.repos:
            if not repo.is_cloned():
                uncloned.append(repo)
        if uncloned:
            raise Exception("Some repos not yet cloned: %s" % [str(r) for r in uncloned])
    
    
    Konstantin Baierer's avatar
    wip
    Konstantin Baierer committed
    class CliCtx():
        def __init__(self, config_file):
            with open(config_file, 'r') as f_config_file:
                self.config = safe_load(f_config_file.read())
    
                self.repos = []
                for repo_desc in self.config['repolist']:
                    url = repo_desc['url']
                    official = repo_desc.get('official', False)
    
                    compliant_cli = repo_desc.get('compliant_cli', False)
                    self.repos.append(Repo(self.config, url, official, compliant_cli))
    
    Konstantin Baierer's avatar
    wip
    Konstantin Baierer committed
    pass_ctx = click.make_pass_decorator(CliCtx)
    
    @click.group()
    @click.option('-c', '--config-file', help="", default=resource_filename(__name__, 'config.yml'))
    @ocrd_loglevel
    @click.pass_context
    def cli(ctx, config_file, **kwargs): # pylint: disable=unused-argument
        ctx.obj = CliCtx(config_file)
    
    
    @cli.command('clone', help='''
    
            Clone all repos
    ''')
    @pass_ctx
    def clone_all(ctx):
        for repo in ctx.repos:
            if repo.is_cloned():
                LOG.info("Already cloned %s" % repo)
            else:
                LOG.info("Cloning %s" % repo)
                repo.clone()
    
    @cli.command('pull', help='''
    
            Pull all repos
    ''')
    @pass_ctx
    def pull_all(ctx):
        _check_cloned(ctx)
        for repo in ctx.repos:
            LOG.info("Pulling %s" % repo)
            repo.pull()
    
    
    
    Konstantin Baierer's avatar
    Konstantin Baierer committed
    @cli.command('json', help='''
    
    Konstantin Baierer's avatar
    wip
    Konstantin Baierer committed
    
        Generate JSON
    
    ''')
    @pass_ctx
    
    def generate_json(ctx):
    
    Konstantin Baierer's avatar
    Konstantin Baierer committed
        ret = []
    
        _check_cloned(ctx)
    
    Konstantin Baierer's avatar
    wip
    Konstantin Baierer committed
        for repo in ctx.repos:
    
    Konstantin Baierer's avatar
    Konstantin Baierer committed
            LOG.info("# Assessing %s" % repo.name)
    
    Konstantin Baierer's avatar
    wip
    Konstantin Baierer committed
            repo.clone()
    
            ret.append(repo.to_json())
    
    Konstantin Baierer's avatar
    Konstantin Baierer committed
            #  print('%s %s -> %s' % (repo.path.is_dir(), repo.url, repo.path))
    
    Konstantin Baierer's avatar
    Konstantin Baierer committed
        print(json.dumps(ret, indent=4, sort_keys=True))