code: def parse_author(author):
          
          if isinstance(author, str):
              # Regex looks for whitespace, (any name), whitespace, <, (email),
              # >, whitespace
              m = re.match(r'\s*(.*?)\s*<(.*?@.*?)>\s*', author)
              if not m or m.start() != 0 or m.end() != len(author):
                  raise ValueError("Invalid author format! {}".format(author))
              return Author(m.groups()[0], m.groups()[1])
          elif isinstance(author, dict):
              return Author.from_dict(author)
          else:
              if len(author) != 2:
                  raise ValueError("Invalid author, should be String or (name, "
                                   "email) tuple: {}".format(author))
              return Author(author[0], author[1])
docs: Parses an Author object from either a String, dict, or tuple
  
          Args:
              author: A String formatted as "NAME <email@domain.com>",
                  (name, email) tuple, or a dict with name and email keys.
  
          Returns:
              An Author object.