text: # coding=utf-8
  
  import re
  
  from dict_validator.fields import String
  
  
  class Name(String):
      """
      Human name represented with ASCII characters - e.g. John Smith
  
      :param lowercase_allowed: if True - the name may contain lowercase parts
  
      >>> from dict_validator import validate
  
      >>> class Schema:
      ...     field = Name()
  
      Expects one or more name parts delimited with space
  
      >>> list(validate(Schema, {"field": 'John Smith'}))
      []
  
      Regexp values are allowed as well
  
      >>> list(validate(Schema, {"field": 'John Smith Äjil'}))
      []
  
      >>> list(validate(Schema, {"field": 'John??Smith!!'}))
      [(['field'], 'Did not match Regexp(name)')]
  
      Digits are not allowed
  
      >>> list(validate(Schema, {"field": 'John Smith022'}))
      [(['field'], "Name can't contain digits or underscores")]
  
      Underscores are not allowed either
  
      >>> list(validate(Schema, {"field": 'John_Smith'}))
      [(['field'], "Name can't contain digits or underscores")]
  
      By default each name part must be capitalized
  
      >>> list(validate(Schema, {"field": 'John mcFault'}))
      [(['field'], 'One of the name parts is not capitalized')]
  
      Non capitalized name parts can be enabled though
  
      >>> class Schema:
      ...     field = Name(lowercase_allowed=True)
  
      >>> list(validate(Schema, {"field": 'John mcFault'}))
      []
  
      """
  
      def __init__(self, lowercase_allowed=False, **kwargs):
          super(Name, self).__init__(
              r"^\w+( \w+)*$",
              "name", **kwargs)
          self._lowercase_allowed = lowercase_allowed
  
      def _validate(self, value):
          ret_val = super(Name, self)._validate(value)
          if ret_val:
              return ret_val
          if not self._lowercase_allowed:
              for word in value.split():
                  if str(word[0]).islower():
                      return "One of the name parts is not capitalized"
          if re.search(r"[0-9_]+", value):
              return "Name can't contain digits or underscores"
          return None
  