--- /dev/null
+import ast
+
+def extract_decorators(fn_ast: ast.FunctionDef, fname = None, only_name=False):
+ decors = fn_ast.decorator_list
+ results = []
+ for decor in decors:
+ _args = []
+ _kwargs = []
+ if isinstance(decor, ast.Name):
+ name = decor.id
+ elif isinstance(decor, ast.Call):
+ if not isinstance(decor.func, ast.Name):
+ continue
+ name = decor.func.id
+ _args = decor.args
+ _kwargs = decor.keywords
+ else:
+ continue
+
+ if fname and name != fname:
+ continue
+
+ if only_name:
+ results.append(name)
+ continue
+
+ unpacked = []
+ kwargs = {}
+ for arg in _args:
+ if isinstance(arg, ast.Constant):
+ unpacked.append(arg.value)
+
+ for kwarg in _kwargs:
+ if isinstance(kwarg.value, ast.Constant):
+ kwargs[kwarg.arg] = kwarg.value.value
+
+ results.append((name, unpacked, kwargs))
+
+ return results
+
+def to_displayable(name):
+ l = name.strip().split('_')
+ for i, s in enumerate(l):
+ l[i] = str.upper(s[0]) + s[1:]
+ return " ".join(l)
+
+def is_primitive(val):
+ return val in [int, str, bool]
+
+def is_basic(val):
+ basic = [int, str, bool]
+ return (
+ val in basic or
+ any([isinstance(val, x) for x in basic])
+ )
\ No newline at end of file