Skip to content

Commit 689bbf2

Browse files
yaworsyssi
authored andcommitted
EnumType type for Click
Code provided by skycaptain in pallets/click#605
1 parent c3b4eb2 commit 689bbf2

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

miio/click_common.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import miio
1313
import logging
1414
import json
15+
import re
1516
from typing import Union
1617
from functools import wraps
1718
from functools import partial
@@ -55,6 +56,43 @@ def __call__(self, *args, **kwargs):
5556
click.echo(click.style("Error: %s" % ex, fg='red', bold=True))
5657

5758

59+
class EnumType(click.Choice):
60+
def __init__(self, enumcls, casesensitive=True):
61+
choices = enumcls.__members__
62+
63+
if not casesensitive:
64+
choices = (_.lower() for _ in choices)
65+
66+
self._enumcls = enumcls
67+
self._casesensitive = casesensitive
68+
69+
super().__init__(list(sorted(set(choices))))
70+
71+
def convert(self, value, param, ctx):
72+
if not self._casesensitive:
73+
value = value.lower()
74+
75+
value = super().convert(value, param, ctx)
76+
77+
if not self._casesensitive:
78+
return next(_ for _ in self._enumcls if _.name.lower() == value.lower())
79+
else:
80+
return next(_ for _ in self._enumcls if _.name == value)
81+
82+
def get_metavar(self, param):
83+
word = self._enumcls.__name__
84+
85+
# Stolen from jpvanhal/inflection
86+
word = re.sub(r"([A-Z]+)([A-Z][a-z])", r'\1_\2', word)
87+
word = re.sub(r"([a-z\d])([A-Z])", r'\1_\2', word)
88+
word = word.replace("-", "_").lower().split("_")
89+
90+
if word[-1] == "enum":
91+
word.pop()
92+
93+
return ("_".join(word)).upper()
94+
95+
5896
class GlobalContextObject:
5997
def __init__(self, debug: int=0, output: callable=None):
6098
self.debug = debug
@@ -221,6 +259,7 @@ def wrap(*args, **kwargs):
221259

222260
def json_output(pretty=False):
223261
indent = 2 if pretty else None
262+
224263
def decorator(func):
225264
@wraps(func)
226265
def wrap(*args, **kwargs):

0 commit comments

Comments
 (0)