Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1import random as random_module 

2import re 

3 

4_re_token = re.compile(r'\{\{(\s?)(\w+)(\s?)\}\}') 

5random = random_module.Random() 

6mod_random = random # compat with name released in 0.8 

7 

8 

9class Generator: 

10 

11 __config = {} 

12 

13 def __init__(self, **config): 

14 self.providers = [] 

15 self.__config = dict( 

16 list(self.__config.items()) + list(config.items())) 

17 self.__random = random 

18 

19 def add_provider(self, provider): 

20 

21 if isinstance(provider, type): 

22 provider = provider(self) 

23 

24 self.providers.insert(0, provider) 

25 

26 for method_name in dir(provider): 

27 # skip 'private' method 

28 if method_name.startswith('_'): 

29 continue 

30 

31 faker_function = getattr(provider, method_name) 

32 

33 if callable(faker_function): 

34 # add all faker method to generator 

35 self.set_formatter(method_name, faker_function) 

36 

37 def provider(self, name): 

38 try: 

39 lst = [p for p in self.get_providers() 

40 if p.__provider__ == name.lower()] 

41 return lst[0] 

42 except IndexError: 

43 return None 

44 

45 def get_providers(self): 

46 """Returns added providers.""" 

47 return self.providers 

48 

49 @property 

50 def random(self): 

51 return self.__random 

52 

53 @random.setter 

54 def random(self, value): 

55 self.__random = value 

56 

57 def seed_instance(self, seed=None): 

58 """Calls random.seed""" 

59 if self.__random == random: 

60 # create per-instance random obj when first time seed_instance() is 

61 # called 

62 self.__random = random_module.Random() 

63 self.__random.seed(seed) 

64 return self 

65 

66 @classmethod 

67 def seed(cls, seed=None): 

68 random.seed(seed) 

69 

70 def format(self, formatter, *args, **kwargs): 

71 """ 

72 This is a secure way to make a fake from another Provider. 

73 """ 

74 # TODO: data export? 

75 return self.get_formatter(formatter)(*args, **kwargs) 

76 

77 def get_formatter(self, formatter): 

78 try: 

79 return getattr(self, formatter) 

80 except AttributeError: 

81 if 'locale' in self.__config: 

82 msg = 'Unknown formatter "{}" with locale "{}"'.format( 

83 formatter, self.__config['locale'], 

84 ) 

85 else: 

86 raise AttributeError('Unknown formatter "{}"'.format( 

87 formatter, 

88 )) 

89 raise AttributeError(msg) 

90 

91 def set_formatter(self, name, method): 

92 """ 

93 This method adds a provider method to generator. 

94 Override this method to add some decoration or logging stuff. 

95 """ 

96 setattr(self, name, method) 

97 

98 def parse(self, text): 

99 """ 

100 Replaces tokens (like '{{ tokenName }}' or '{{tokenName}}') 

101 with the result from the token method call. 

102 """ 

103 return _re_token.sub(self.__format_token, text) 

104 

105 def __format_token(self, matches): 

106 formatter = list(matches.groups()) 

107 formatter[1] = str(self.format(formatter[1])) 

108 return ''.join(formatter)