code: def get_properties(
      cls,
  ) -> List[Tuple[str, Optional[str], Optional[str]]]:
      src = inspect.getsource(cls)
      members = dict(inspect.getmembers(cls))
      setters = re.findall(
          r"@[a-zA-Z0-9_]+\.setter\s+def\s+([a-zA-Z0-9_]+)\s*\(self,\s*[a-zA-Z0-9_]+\s*:\s*(.*?)\)",
          src,
          flags=re.DOTALL,
      )
  
      property_docs = []
      for setter, _ in setters:
          if setter not in members:
              warnings.warn(
                  f"{setter} is found as a setter but there is no corresponding getter"
              )
              property_docs.append(None)
          else:
              doc = inspect.getdoc(members[setter])
              description = next(
                  iter(re.findall(":return:(.*)", doc)), None
              )
              if description:
                  description = description.strip()
              property_docs.append(description)
      return sorted(
          list(
              zip(
                  map(itemgetter(0), setters),
                  map(itemgetter(1), setters),
                  property_docs,
              )
          ),
          key=lambda x: x[0],
      )
  
file_path: jina/scripts/inject-document-props-as-overload.py
imports: import inspect
  import re
  import warnings
  from operator import itemgetter
  from typing import Optional, Tuple, List
  from jina import Document
label_desc: Use image node_id 1 for calling a global function with example usage: get_properties(cls) and returns: sorted