X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/b795a7752528819af3a5007f8cb99fbc1067dbba..dd9b9d7b670081068082fb441756b6d9a3cc8522:/lib/ht.py diff --git a/lib/ht.py b/lib/ht.py index c97486c..4a511dc 100644 --- a/lib/ht.py +++ b/lib/ht.py @@ -22,6 +22,7 @@ """Module implementing the parameter types code.""" import re +import operator from ganeti import compat from ganeti import utils @@ -45,6 +46,44 @@ def Parens(text): return "(%s)" % text +class _WrapperBase(object): + __slots__ = [ + "_fn", + "_text", + ] + + def __init__(self, text, fn): + """Initializes this class. + + @param text: Description + @param fn: Wrapped function + + """ + assert text.strip() + + self._text = text + self._fn = fn + + def __call__(self, *args): + return self._fn(*args) + + +class _DescWrapper(_WrapperBase): + """Wrapper class for description text. + + """ + def __str__(self): + return self._text + + +class _CommentWrapper(_WrapperBase): + """Wrapper class for comment. + + """ + def __str__(self): + return "%s [%s]" % (self._fn, self._text) + + def WithDesc(text): """Builds wrapper class with description text. @@ -55,21 +94,20 @@ def WithDesc(text): """ assert text[0] == text[0].upper() - class wrapper(object): # pylint: disable-msg=C0103 - __slots__ = ["__call__"] + return compat.partial(_DescWrapper, text) - def __init__(self, fn): - """Initializes this class. - @param fn: Wrapped function +def Comment(text): + """Builds wrapper for adding comment to description text. - """ - self.__call__ = fn + @type text: string + @param text: Comment text + @return: Callable class - def __str__(self): - return text + """ + assert not frozenset(text).intersection("[]") - return wrapper + return compat.partial(_CommentWrapper, text) def CombinationDesc(op, args, fn): @@ -288,17 +326,25 @@ TPositiveInt = \ TStrictPositiveInt = \ TAnd(TInt, WithDesc("GreaterThanZero")(lambda v: v > 0)) +#: a strictly negative integer (0 > value) +TStrictNegativeInt = \ + TAnd(TInt, WithDesc("LessThanZero")(compat.partial(operator.gt, 0))) + #: a positive float TPositiveFloat = \ TAnd(TFloat, WithDesc("EqualGreaterZero")(lambda v: v >= 0.0)) #: Job ID -TJobId = TOr(TPositiveInt, - TRegex(re.compile("^%s$" % constants.JOB_ID_TEMPLATE))) +TJobId = WithDesc("JobId")(TOr(TPositiveInt, + TRegex(re.compile("^%s$" % + constants.JOB_ID_TEMPLATE)))) #: Number TNumber = TOr(TInt, TFloat) +#: Relative job ID +TRelativeJobId = WithDesc("RelativeJobId")(TStrictNegativeInt) + def TListOf(my_type): """Checks if a given value is a list with all elements of the same type.