From 47bdfdac795ef45a21d34c53f2361c9feca3a4fc Mon Sep 17 00:00:00 2001 From: Felipe Martin Date: Mon, 30 Jan 2017 17:15:02 +0100 Subject: [PATCH 1/5] First work on the cli --- .gitignore | 1 + luxafor/cli.py | 127 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 luxafor/cli.py diff --git a/.gitignore b/.gitignore index 72364f9..e873c49 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ var/ *.egg-info/ .installed.cfg *.egg +.venv # PyInstaller # Usually these files are written by a python script from a template diff --git a/luxafor/cli.py b/luxafor/cli.py new file mode 100644 index 0000000..b97fb74 --- /dev/null +++ b/luxafor/cli.py @@ -0,0 +1,127 @@ +# -*- coding: utf-8 -*- +import sys + +import click + +from luxafor import luxafor + + +def get_luxafor(): + return luxafor.Luxafor() + + +def convert_hex_to_dec_color(hex_color): + (red, green, blue) = hex_color[0:2], hex_color[2:4], hex_color[4:6] + + red = int(red, 16) + green = int(green, 16) + blue = int(blue, 16) + + return (red, green, blue) + + +def convert_dec_to_hex_color(red, green, blue): + colors = (red, green, blue) + return "".join([ + hex(color).split('x')[1].upper() for color in colors]) + + +@click.group() +def cli(): + pass + + +@cli.command() +@click.argument('color') +def hex2dec(color): + hex_color = color.strip('#') + + try: + red, green, blue = convert_hex_to_dec_color(hex_color) + except ValueError: + click.echo('Invalid hexadecimal color: %s' % hex_color, err=True) + + click.echo("%d %d %d" % (red, green, blue)) + + +@cli.command() +@click.argument('red', type=click.IntRange(0, 255)) +@click.argument('green', type=click.IntRange(0, 255)) +@click.argument('blue', type=click.IntRange(0, 255)) +def dec2hex(red, green, blue): + colors = (red, green, blue) + if not all((0 <= x <= 255 for x in colors)): + click.echo("Every color must be between 0 and 255", err=True) + sys.exit(1) + + click.echo(convert_dec_to_hex_color(red, green, blue)) + + return (red, green, blue) + + +@cli.command() +@click.option('--led', default=luxafor.Leds.ALL) +@click.argument('color') +def set(led, color): + """Sets the flag with a fixed color.""" + color = convert_hex_to_dec_color(color) + + flag = get_luxafor() + + flag.set_color(*color, led=led) + + +@cli.command() +@click.option('--led', default=luxafor.Leds.ALL) +@click.option('--speed', default=128, type=click.IntRange(0, 255)) +@click.argument('color') +def fade(led, speed, color): + color = convert_hex_to_dec_color(color) + + flag = get_luxafor() + + flag.fade(*color, led=led, speed=speed) + + +@cli.command() +@click.option('--led', default=luxafor.Leds.ALL) +@click.option('--speed', default=6, type=click.IntRange(0, 255)) +@click.option('--repeat', default=1, type=click.IntRange(1, 255)) +@click.argument('color') +def strobe(led, speed, repeat, color): + color = convert_hex_to_dec_color(color) + + flag = get_luxafor() + + flag.strobe(*color, led=led, speed=speed, repeat=repeat) + + +@cli.command() +@click.option('--wave', default=1, type=click.IntRange(1, 4)) +@click.option('--duration', default=2, type=click.IntRange(1, 255)) +@click.option('--repeat', default=1, type=click.IntRange(1, 255)) +@click.argument('color') +def wave(wave, duration, repeat, color): + color = convert_hex_to_dec_color(color) + + flag = get_luxafor() + + flag.wave(*color, wave=wave, duration=duration, repeat=repeat) + + +@cli.command() +@click.option('--repeat', default=1, type=click.IntRange(1, 255)) +@click.argument('pattern', type=click.IntRange(1, 8)) +def pattern(repeat, pattern): + flag = get_luxafor() + flag.pattern(pattern, repeat) + + +@cli.command() +def off(): + flag = get_luxafor() + flag.turn_off() + + +if __name__ == '__main__': + cli() From 047c303db6013c9f991a3b87e842edfd5d472ddd Mon Sep 17 00:00:00 2001 From: Felipe Martin Date: Sat, 4 Feb 2017 16:25:58 +0100 Subject: [PATCH 2/5] Added the option to retrieve the led user input + User input is matched with the luxafor.Leds attributes + Also added some annotations --- luxafor/cli.py | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/luxafor/cli.py b/luxafor/cli.py index b97fb74..6a22ba5 100644 --- a/luxafor/cli.py +++ b/luxafor/cli.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +import logging import sys import click @@ -6,11 +7,14 @@ import click from luxafor import luxafor +logger = logging.getLogger() + + def get_luxafor(): return luxafor.Luxafor() -def convert_hex_to_dec_color(hex_color): +def convert_hex_to_dec_color(hex_color: str) -> tuple: (red, green, blue) = hex_color[0:2], hex_color[2:4], hex_color[4:6] red = int(red, 16) @@ -20,12 +24,31 @@ def convert_hex_to_dec_color(hex_color): return (red, green, blue) -def convert_dec_to_hex_color(red, green, blue): +def convert_dec_to_hex_color(red: int, green: int, blue: int) -> str: colors = (red, green, blue) return "".join([ hex(color).split('x')[1].upper() for color in colors]) +def get_matching_led(led: str) -> hex: + """ + Returns a mathching Led object from the :class:`luxafor.Leds` based + on the user input in the CLI. + + If no valid input is given defaults to all leds. + """ + led_group = getattr(luxafor.Leds, led.upper(), False) + if led_group: + return led_group + + led_number = getattr(luxafor.Leds, 'LED%s' % led, False) + if led_number: + return led_number + + logger.info('Led(s) %s not found, falling back to all' % led) + return luxafor.Leds.ALL + + @click.group() def cli(): pass @@ -60,7 +83,7 @@ def dec2hex(red, green, blue): @cli.command() -@click.option('--led', default=luxafor.Leds.ALL) +@click.option('--led', default='all') @click.argument('color') def set(led, color): """Sets the flag with a fixed color.""" @@ -68,11 +91,11 @@ def set(led, color): flag = get_luxafor() - flag.set_color(*color, led=led) + flag.set_color(*color, led=get_matching_led(led)) @cli.command() -@click.option('--led', default=luxafor.Leds.ALL) +@click.option('--led', default='all') @click.option('--speed', default=128, type=click.IntRange(0, 255)) @click.argument('color') def fade(led, speed, color): @@ -80,11 +103,11 @@ def fade(led, speed, color): flag = get_luxafor() - flag.fade(*color, led=led, speed=speed) + flag.fade(*color, led=get_matching_led(led), speed=speed) @cli.command() -@click.option('--led', default=luxafor.Leds.ALL) +@click.option('--led', default='all') @click.option('--speed', default=6, type=click.IntRange(0, 255)) @click.option('--repeat', default=1, type=click.IntRange(1, 255)) @click.argument('color') @@ -93,7 +116,8 @@ def strobe(led, speed, repeat, color): flag = get_luxafor() - flag.strobe(*color, led=led, speed=speed, repeat=repeat) + flag.strobe(*color, led=get_matching_led(led), + speed=speed, repeat=repeat) @cli.command() From 5e1705856a5b1cdce5131ba98715861df053e1d8 Mon Sep 17 00:00:00 2001 From: Felipe Martin Date: Mon, 3 Apr 2017 21:06:21 +0200 Subject: [PATCH 3/5] Added requirements file --- requirements.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..3382231 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +click>=6.7.0,<=6.7.99 From 987d11fa943eaa532b0ba824adfc88e8e3bb1c53 Mon Sep 17 00:00:00 2001 From: Felipe Martin Date: Mon, 3 Apr 2017 21:27:19 +0200 Subject: [PATCH 4/5] Using logger string formatting --- luxafor/cli.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/luxafor/cli.py b/luxafor/cli.py index 6a22ba5..201cd60 100644 --- a/luxafor/cli.py +++ b/luxafor/cli.py @@ -45,7 +45,8 @@ def get_matching_led(led: str) -> hex: if led_number: return led_number - logger.info('Led(s) %s not found, falling back to all' % led) + logger.info('Led(s) %(led)s not found, falling back to all', + extra={'led': led}) return luxafor.Leds.ALL From 90a636861abcc85451b2433be08c344bccb36e3e Mon Sep 17 00:00:00 2001 From: Felipe Martin Date: Mon, 3 Apr 2017 21:43:26 +0200 Subject: [PATCH 5/5] Renamed `set` command to avoid overwriting builtins --- luxafor/cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/luxafor/cli.py b/luxafor/cli.py index 201cd60..d3b7826 100644 --- a/luxafor/cli.py +++ b/luxafor/cli.py @@ -83,10 +83,10 @@ def dec2hex(red, green, blue): return (red, green, blue) -@cli.command() +@cli.command('set') @click.option('--led', default='all') @click.argument('color') -def set(led, color): +def luxa_set(led, color): """Sets the flag with a fixed color.""" color = convert_hex_to_dec_color(color)