docs: def is_valid(self, field_name, value) -> (bool, object):
          """
          Return true if the value type matches or can be coerced to the defined type in schema, otherwise false.
          If field not defined, return none
  
          Args:
              field_name: str
              value:
  
          Returns: bool, value, where the value may have been coerced to the required type.
          """
  
          if self.has_field(field_name):
              if self.fields_dict[field_name] == FieldType.KG_ID:
                  return True, value
  
              if self.fields_dict[field_name] == FieldType.NUMBER:
                  if isinstance(value, numbers.Number):
                      return True, value
                  else:
                      converted_number = self.parse_number(value)
                      return (False, value) if not converted_number else (True, value)
              if self.fields_dict[field_name] == FieldType.STRING:
                  if isinstance(value, str):
                      return True, value.strip()
                  else:
                      return True, str(value).strip()
  
              if self.fields_dict[field_name] == FieldType.DATE:
                  valid, d = self.is_date(value)
                  if valid:
                      return True, d.isoformat()
                  else:
                      return False, value
  
              if self.fields_dict[field_name] == FieldType.LOCATION:
                  valid, l = self.is_location(value)
                  if valid:
                      return True, l
                  else:
                      return False, value
          else:
              print('{} not found in KG Schema'.format(field_name))
              return False, value