import click CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) @click.group(context_settings = CONTEXT_SETTINGS) @click.option('--debug', '-d', is_flag=True, default=False) def cli(debug): if debug: import logging logger = logging.getLogger('peewee') logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler()) @cli.group() def db(): """Database Management""" pass @db.command() def init(): """Initialize the database, if not done already.""" from .model import create_tables, db from .prefixes import register_prefixes create_tables() with db.atomic(): register_prefixes() @db.command() @click.confirmation_option(prompt="Are you sure you want to drop the database?") def drop(): """Completely drop all tables.""" from .model import drop_tables drop_tables() @cli.group() def tag(): """Handling of tags""" pass @tag.command('list') def list_tags(): from .model import Tag print("Tags") print("====") print() for t in Tag.select(): print(' *', t) @tag.command('prefixes') def list_prefixes(): from .model import Prefix print("Prefixes") print("========") print() for p in Prefix.select(): print(" * %s (builtin: %s; pseudo: %s)" % (p.name, p.builtin, p.pseudo)) class PrefixTag: def __init__(self, tag, prefix = None): self.tag = tag self.prefix = prefix def __str__(self): if self.prefix: return '%s:%s' % (self.prefix, self.tag) else: return self.tag class PrefixTagType(click.ParamType): name = 'prefixed tag' def convert(self, value, param, ctx): try: prefix, tag = value.split(':') if not tag: return PrefixTag(prefix) return PrefixTag(tag, prefix) except ValueError: self.fail("%s is an invalid tag. Correct form '[prefix:]tag'." % value, param, ctx) TAG = PrefixTagType() @tag.command('add') @click.argument('name', type = TAG) @click.argument('description', required = False) def add_tag(name, description): from .model import Tag, Prefix, db with db.atomic(): if name.prefix: prefix, created = Prefix.get_or_create(name = name.prefix) if not created and prefix.pseudo: raise click.UsageError("Prefix '%s' is not allowed to carry additional tags." % name.prefix) tag, created = Tag.create_or_get(name = name.tag, prefix = name.prefix, description = description) if not created: print("Tag already existed:", tag) @tag.command('edit') @click.option('--description') @click.argument('name', type = TAG) def edit_tag(description, name): from .model import Tag, Prefix, db try: tag = Tag.get(name = name.tag, prefix = name.prefix) except Tag.DoesNotExist: raise click.UsageError("Tag '%s' does not exist." % name) if description: tag.description = description tag.save()