docs: def _update_ancestors(self, config_data, property_name, ancestors=None):
          """ Update ancestors for a specific property.
  
          :param ancestors: A :OrderedDict:, representing the ancestors of a property.
          :param config_data: The data that needs to be validated agents the scheme.
          :param property_name: A :string: of the properties name.
          :rtype: A :OrderDict: that has been updated with new parents.
          """
          if not isinstance(property_name, six.string_types):
              raise TypeError("property_key must be a string. type: {0} was passed.".format(type(property_name)))
  
          if ancestors is None:
              ancestors = OrderedDict([('root', config_data)])
  
          elif not isinstance(ancestors, OrderedDict):
              raise TypeError("ancestors must be an OrderedDict. type: {0} was passed.".format(type(ancestors)))
  
          elif 'root' not in ancestors:
              raise LookupError(
                  'root must be in ancestors. currently in the ancestors chain {0}'.format(', '.join(ancestors.keys()))
              )
  
          ancestors = ancestors.copy()
  
          for previous_key in list(ancestors)[::-1]:
              previous_item = ancestors[previous_key]
  
              if isinstance(config_data, dict):
                  if property_name in previous_item:
                      ancestors[property_name] = config_data
                      break
  
          return ancestors