__init__.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. # coding=utf-8
  2. from __future__ import unicode_literals
  3. from decimal import Decimal
  4. import sys
  5. from .. import BaseProvider
  6. if sys.version_info[0] == 2:
  7. string_types = (basestring,)
  8. elif sys.version_info[0] == 3:
  9. string_types = (str, bytes)
  10. else:
  11. raise SystemError(
  12. "Unrecognized python version: {}".format(sys.version_info[0]))
  13. class Provider(BaseProvider):
  14. def pybool(self):
  15. return self.random_int(0, 1) == 1
  16. def pystr(self, min_chars=None, max_chars=20):
  17. """
  18. Generates a random string of upper and lowercase letters.
  19. :type min_chars: int
  20. :type max_chars: int
  21. :return: String. Random of random length between min and max characters.
  22. """
  23. if min_chars is None:
  24. return "".join(self.random_letters(length=max_chars))
  25. else:
  26. assert (
  27. max_chars >= min_chars), "Maximum length must be greater than or equal to minium length"
  28. return "".join(
  29. self.random_letters(
  30. length=self.generator.random.randint(min_chars, max_chars),
  31. )
  32. )
  33. def pyfloat(self, left_digits=None, right_digits=None, positive=False):
  34. if left_digits is not None and left_digits < 0:
  35. raise ValueError(
  36. 'A float number cannot have less than 0 digits in its '
  37. 'integer part')
  38. if right_digits is not None and right_digits < 0:
  39. raise ValueError(
  40. 'A float number cannot have less than 0 digits in its '
  41. 'fractional part')
  42. if left_digits == 0 and right_digits == 0:
  43. raise ValueError(
  44. 'A float number cannot have less than 0 digits in total')
  45. left_digits = left_digits if left_digits is not None else (
  46. self.random_int(1, sys.float_info.dig))
  47. right_digits = right_digits if right_digits is not None else (
  48. self.random_int(0, sys.float_info.dig - left_digits))
  49. sign = 1 if positive else self.random_element((-1, 1))
  50. return float("{0}.{1}".format(
  51. sign * self.random_number(left_digits),
  52. self.random_number(right_digits)
  53. ))
  54. def pyint(self):
  55. return self.generator.random_int()
  56. def pydecimal(self, left_digits=None, right_digits=None, positive=False):
  57. return Decimal(str(self.pyfloat(left_digits, right_digits, positive)))
  58. def pytuple(self, nb_elements=10, variable_nb_elements=True, *value_types):
  59. return tuple(
  60. self.pyset(
  61. nb_elements,
  62. variable_nb_elements,
  63. *value_types))
  64. def pyset(self, nb_elements=10, variable_nb_elements=True, *value_types):
  65. return set(
  66. self._pyiterable(
  67. nb_elements,
  68. variable_nb_elements,
  69. *value_types))
  70. def pylist(self, nb_elements=10, variable_nb_elements=True, *value_types):
  71. return list(
  72. self._pyiterable(
  73. nb_elements,
  74. variable_nb_elements,
  75. *value_types))
  76. def pyiterable(
  77. self,
  78. nb_elements=10,
  79. variable_nb_elements=True,
  80. *value_types):
  81. return self.random_element([self.pylist, self.pytuple, self.pyset])(
  82. nb_elements, variable_nb_elements, *value_types)
  83. def _random_type(self, type_list):
  84. value_type = self.random_element(type_list)
  85. method_name = "py{0}".format(value_type)
  86. if hasattr(self, method_name):
  87. value_type = method_name
  88. return self.generator.format(value_type)
  89. def _pyiterable(
  90. self,
  91. nb_elements=10,
  92. variable_nb_elements=True,
  93. *value_types):
  94. value_types = [t if isinstance(t, string_types) else getattr(t, '__name__', type(t).__name__).lower()
  95. for t in value_types
  96. # avoid recursion
  97. if t not in ['iterable', 'list', 'tuple', 'dict', 'set']]
  98. if not value_types:
  99. value_types = ['str', 'str', 'str', 'str', 'float',
  100. 'int', 'int', 'decimal', 'date_time', 'uri', 'email']
  101. if variable_nb_elements:
  102. nb_elements = self.randomize_nb_elements(nb_elements, min=1)
  103. for _ in range(nb_elements):
  104. yield self._random_type(value_types)
  105. def pydict(self, nb_elements=10, variable_nb_elements=True, *value_types):
  106. """
  107. Returns a dictionary.
  108. :nb_elements: number of elements for dictionary
  109. :variable_nb_elements: is use variable number of elements for dictionary
  110. :value_types: type of dictionary values
  111. """
  112. if variable_nb_elements:
  113. nb_elements = self.randomize_nb_elements(nb_elements, min=1)
  114. return dict(zip(
  115. self.generator.words(nb_elements),
  116. self._pyiterable(nb_elements, False, *value_types)
  117. ))
  118. def pystruct(self, count=10, *value_types):
  119. value_types = [t if isinstance(t, string_types) else getattr(t, '__name__', type(t).__name__).lower()
  120. for t in value_types
  121. # avoid recursion
  122. if t != 'struct']
  123. if not value_types:
  124. value_types = ['str', 'str', 'str', 'str', 'float',
  125. 'int', 'int', 'decimal', 'date_time', 'uri', 'email']
  126. l = []
  127. d = {}
  128. nd = {}
  129. for i in range(count):
  130. d[self.generator.word()] = self._random_type(value_types)
  131. l.append(self._random_type(value_types))
  132. nd[self.generator.word()] = {i: self._random_type(value_types),
  133. i + 1: [self._random_type(value_types),
  134. self._random_type(value_types),
  135. self._random_type(value_types)],
  136. i + 2: {i: self._random_type(value_types),
  137. i + 1: self._random_type(value_types),
  138. i + 2: [self._random_type(value_types),
  139. self._random_type(value_types)]}}
  140. return l, d, nd