You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
2.9 KiB

4 years ago
  1. import sys
  2. from voluptuous.error import LiteralInvalid, TypeInvalid, Invalid
  3. from voluptuous.schema_builder import Schema, default_factory, raises
  4. from voluptuous import validators
  5. __author__ = 'tusharmakkar08'
  6. def Lower(v):
  7. """Transform a string to lower case.
  8. >>> s = Schema(Lower)
  9. >>> s('HI')
  10. 'hi'
  11. """
  12. return str(v).lower()
  13. def Upper(v):
  14. """Transform a string to upper case.
  15. >>> s = Schema(Upper)
  16. >>> s('hi')
  17. 'HI'
  18. """
  19. return str(v).upper()
  20. def Capitalize(v):
  21. """Capitalise a string.
  22. >>> s = Schema(Capitalize)
  23. >>> s('hello world')
  24. 'Hello world'
  25. """
  26. return str(v).capitalize()
  27. def Title(v):
  28. """Title case a string.
  29. >>> s = Schema(Title)
  30. >>> s('hello world')
  31. 'Hello World'
  32. """
  33. return str(v).title()
  34. def Strip(v):
  35. """Strip whitespace from a string.
  36. >>> s = Schema(Strip)
  37. >>> s(' hello world ')
  38. 'hello world'
  39. """
  40. return str(v).strip()
  41. class DefaultTo(object):
  42. """Sets a value to default_value if none provided.
  43. >>> s = Schema(DefaultTo(42))
  44. >>> s(None)
  45. 42
  46. >>> s = Schema(DefaultTo(list))
  47. >>> s(None)
  48. []
  49. """
  50. def __init__(self, default_value, msg=None):
  51. self.default_value = default_factory(default_value)
  52. self.msg = msg
  53. def __call__(self, v):
  54. if v is None:
  55. v = self.default_value()
  56. return v
  57. def __repr__(self):
  58. return 'DefaultTo(%s)' % (self.default_value(),)
  59. class SetTo(object):
  60. """Set a value, ignoring any previous value.
  61. >>> s = Schema(validators.Any(int, SetTo(42)))
  62. >>> s(2)
  63. 2
  64. >>> s("foo")
  65. 42
  66. """
  67. def __init__(self, value):
  68. self.value = default_factory(value)
  69. def __call__(self, v):
  70. return self.value()
  71. def __repr__(self):
  72. return 'SetTo(%s)' % (self.value(),)
  73. class Set(object):
  74. """Convert a list into a set.
  75. >>> s = Schema(Set())
  76. >>> s([]) == set([])
  77. True
  78. >>> s([1, 2]) == set([1, 2])
  79. True
  80. >>> with raises(Invalid, regex="^cannot be presented as set: "):
  81. ... s([set([1, 2]), set([3, 4])])
  82. """
  83. def __init__(self, msg=None):
  84. self.msg = msg
  85. def __call__(self, v):
  86. try:
  87. set_v = set(v)
  88. except Exception as e:
  89. raise TypeInvalid(
  90. self.msg or 'cannot be presented as set: {0}'.format(e))
  91. return set_v
  92. def __repr__(self):
  93. return 'Set()'
  94. class Literal(object):
  95. def __init__(self, lit):
  96. self.lit = lit
  97. def __call__(self, value, msg=None):
  98. if self.lit != value:
  99. raise LiteralInvalid(
  100. msg or '%s not match for %s' % (value, self.lit)
  101. )
  102. else:
  103. return self.lit
  104. def __str__(self):
  105. return str(self.lit)
  106. def __repr__(self):
  107. return repr(self.lit)
  108. def u(x):
  109. if sys.version_info < (3,):
  110. return unicode(x)
  111. else:
  112. return x