documentor.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. # coding=utf-8
  2. from __future__ import unicode_literals
  3. import inspect
  4. from .compat import getargspec
  5. from faker import utils
  6. class Documentor(object):
  7. def __init__(self, generator):
  8. """
  9. :param generator: a localized Generator with providers filled,
  10. for which to write the documentation
  11. :type generator: faker.Generator()
  12. """
  13. self.generator = generator
  14. self.max_name_len = 0
  15. self.already_generated = []
  16. def get_formatters(self, locale=None, excludes=None, **kwargs):
  17. self.max_name_len = 0
  18. self.already_generated = [] if excludes is None else excludes[:]
  19. formatters = []
  20. providers = self.generator.get_providers()
  21. for provider in providers[::-1]: # reverse
  22. if locale and provider.__lang__ != locale:
  23. continue
  24. formatters.append(
  25. (provider, self.get_provider_formatters(provider, **kwargs))
  26. )
  27. return formatters
  28. def get_provider_formatters(self, provider, prefix='fake.',
  29. with_args=True, with_defaults=True):
  30. formatters = {}
  31. for name, method in inspect.getmembers(provider, inspect.ismethod):
  32. # skip 'private' method and inherited methods
  33. if name.startswith('_') or name in self.already_generated:
  34. continue
  35. arguments = []
  36. faker_args = []
  37. faker_kwargs = {}
  38. if name == 'binary':
  39. faker_kwargs['length'] = 1024
  40. if with_args:
  41. # retrieve all parameter
  42. argspec = getargspec(method)
  43. lst = [x for x in argspec.args if x not in ['self', 'cls']]
  44. for i, arg in enumerate(lst):
  45. if argspec.defaults and with_defaults:
  46. try:
  47. default = argspec.defaults[i]
  48. if utils.is_string(default):
  49. default = utils.quote(default)
  50. else:
  51. # TODO check default type
  52. default = "{0}".format(default)
  53. arg = "{0}={1}".format(arg, default)
  54. except IndexError:
  55. pass
  56. arguments.append(arg)
  57. if with_args == 'first':
  58. break
  59. if with_args != 'first':
  60. if argspec.varargs:
  61. arguments.append('*' + argspec.varargs)
  62. if argspec.varkw:
  63. arguments.append('**' + argspec.varkw)
  64. # build fake method signature
  65. signature = "{0}{1}({2})".format(prefix,
  66. name,
  67. ", ".join(arguments))
  68. # make a fake example
  69. example = self.generator.format(name, *faker_args, **faker_kwargs)
  70. formatters[signature] = example
  71. self.max_name_len = max(self.max_name_len, len(signature))
  72. self.already_generated.append(name)
  73. return formatters
  74. @staticmethod
  75. def get_provider_name(provider_class):
  76. return provider_class.__provider__