Source code for badgr_lite.cli

# -*- coding: utf-8 -*-
# pylint: disable=E1120, R0913, R0903, C0103
"""Console script for badgr_lite."""


import click

from badgr_lite.models import BadgrLite
from badgr_lite import exceptions


[docs]class Config: """Share configuration accross commands""" def __init__(self): self.token_file = None
pass_config = click.make_pass_decorator(Config, ensure=True)
[docs]def xor(first: bool, second: bool) -> bool: """Return exclusive OR for boolean arguments""" return (first and not second) or (not first and second)
[docs]def ensure_evidence(badge_data: dict) -> dict: """Given badge_data, ensure 'evidence' key exists with list value""" if 'evidence' not in badge_data: badge_data['evidence'] = [{}] return badge_data
@click.group() @click.option('--token-file', type=click.Path(), default='./token.json', help="File holding token credentials") @pass_config def main(config, token_file): """Automate Badgr tasks without the overhead of badgr-server""" config.token_file = token_file @main.command() @pass_config def list_badges(config): """Pull and print a list of badges from server""" badgr = BadgrLite(token_filename=config.token_file) try: for badge in badgr.badges: click.echo(badge) except exceptions.TokenFileNotFoundError as err: for line in err.args: click.echo(line) @main.command() @pass_config @click.option('--badge-id', prompt='Badge ID', help='ID of badge to award') @click.option('--recipient', prompt='Recipient email', help='Email of recipient') @click.option('--notify/--no-notify', default=False, help="Should badgr notify recipient?") @click.option('--evidence-url', help="Optional evidence-url for awarded badge") @click.option('--evidence-narrative', help="Optional evidence-narrative for awarded badge") def award_badge(config, badge_id, recipient, notify, evidence_url, evidence_narrative): """Award badge with BADGE_ID to RECIPIENT. If evidence is provided, both --evidence-url and --evidence-narrative should be used. """ if xor(evidence_url, evidence_narrative): raise click.UsageError( """If one evidence paramater is used, both are needed: --evidence-url and --evidence-narrative""") badge_data = { "recipient": { "identity": recipient, }, "notify": notify, } if evidence_url: badge_data = ensure_evidence(badge_data) badge_data['evidence'][0]['url'] = evidence_url badge_data['evidence'][0]['narrative'] = evidence_narrative try: badgr = BadgrLite(token_filename=config.token_file) result = badgr.award_badge(badge_id, badge_data) click.echo(result) except exceptions.TokenFileNotFoundError as err: for line in err.args: click.echo(line) if __name__ == "__main__": main()