import json
import logging
import six
from dateutil import parser
from oscar import flag
[docs]class Datetime(flag.Var):
'''Datetime-valued flag.'''
type_str = 'Datetime'
[docs] def set(self, value):
# pylint: disable=attribute-defined-outside-init
self.value = parser.parse(value)
if self.value.tzinfo is None:
raise ValueError('Datetime string "%s" MUST have time zone info' % value)
[docs]class Date(flag.Var):
'''Date-valued flag.'''
type_str = 'Date'
[docs] def set(self, value):
# pylint: disable=attribute-defined-outside-init
self.value = parser.parse(value).date()
[docs]class Choices(flag.Var):
'''Flag with a set of choices.'''
def __init__(self, inner_type, description, choices, default=None, secure=False):
if default is not flag.REQUIRED and default not in choices:
raise flag.FlagException('default value must be a valid choice or REQUIRED')
super(Choices, self).__init__(description, default, secure)
self.inner_value = inner_type(description, default, secure)
self.type_str = inner_type.type_str
self.choices = choices
self.long_description = '\n'.join(str(x) for x in choices)
[docs] def set(self, value):
# pylint:disable=attribute-defined-outside-init
self.inner_value.set(value)
self.value = self.inner_value.get()
if self.value not in self.choices:
raise ValueError('%s not a valid value' % value)
[docs]class Json(flag.Var):
'''Flag that takes valid JSON string'''
type_str = 'JSON'
[docs] def set(self, value):
self.value = json.loads(value)
[docs]class LogLevel(flag.Var):
'''Flag that lets you specify the logging level for a given logger.
Automatically converts log level names to symbolic values::
from oscar.flag import contrib as flag_contrib
FLAGS.log_level = flag_contrib.LogLevel(
__name__, 'log level for loggers in this module')
FLAGS.sqlalchemy_log_level = flag_contrib.LogLevel(
'sqlalchemy.engine', 'log level for sqlalchemy')
'''
[docs] class Level(flag.Var):
type_str = 'String'
[docs] def coerce(self, value):
level = logging.getLevelName(value.upper())
if not isinstance(level, six.integer_types):
raise ValueError('Unknown log level: %r' % level)
return level
[docs] def get(self):
return self.value if self.is_set() else self.coerce(self.default)
[docs] def set(self, value):
self.value = self.coerce(value)
def __init__(self, name, description, default=None):
super(LogLevel, self).__init__(description, default, False)
inner_type = self.Level
self.logger_name = name
self.inner_value = inner_type(description, default, False)
self.type_str = inner_type.type_str
choices = {logging.CRITICAL, logging.FATAL, logging.ERROR,
logging.WARNING, logging.WARN, logging.INFO, logging.DEBUG}
self.long_description = '\n'.join(
logging.getLevelName(x) for x in choices)
if default is not None:
self.set(default)
[docs] def set(self, value):
self.inner_value.set(value)
self.value = self.inner_value.get()
logging.getLogger(self.logger_name).setLevel(self.value)
def __str__(self):
return logging.getLevelName(self.value)