import json
import click
[docs]class JsonOrNoneParamType(click.ParamType):
""" A Click parameter class that loads JSON """
name = 'JSON'
[docs] def convert(self, value, param, ctx):
# No try-except in case `value is None`, as it is a valid value.
# Still we want `json.loads` to visibly fail.
if value is None:
return value
return json.loads(value)
[docs]def json_argument(*args, **kwargs):
""" Decorator for a JSON command line argument """
kwargs['type'] = JsonOrNoneParamType()
return click.argument(*args, **kwargs)
[docs]def json_option(*args, **kwargs):
""" Decorator for a JSON command line option """
kwargs['type'] = JsonOrNoneParamType()
return click.option(*args, **kwargs)
[docs]def listify(obj):
""" Wrap something in a list, if it's not already a list """
return obj if isinstance(obj, list) else [obj]