docs: def doc_watch():
      """Watch for changes in the docs and rebuild HTML docs when changed."""
      try:
          from watchdog.events import FileSystemEventHandler
          from watchdog.observers import Observer
      except ImportError:
          print_failure_message('Install the watchdog package to use this task, '
                                "i.e., `pip install watchdog'.")
          raise SystemExit(1)
  
      class RebuildDocsEventHandler(FileSystemEventHandler):
          def __init__(self, base_paths):
              self.base_paths = base_paths
  
          def dispatch(self, event):
              """Dispatches events to the appropriate methods.
              :param event: The event object representing the file system event.
              :type event: :class:`watchdog.events.FileSystemEvent`
              """
              for base_path in self.base_paths:
                  if event.src_path.endswith(base_path):
                      super(RebuildDocsEventHandler, self).dispatch(event)
                      # We found one that matches. We're done.
                      return
  
          def on_modified(self, event):
              print_failure_message('Modification detected. Rebuilding docs.')
              # # Strip off the path prefix.
              # import os
              # if event.src_path[len(os.getcwd()) + 1:].startswith(
              #         CODE_DIRECTORY):
              #     # sphinx-build doesn't always pick up changes on code files,
              #     # even though they are used to generate the documentation. As
              #     # a workaround, just clean before building.
              doc_html()
              print_success_message('Docs have been rebuilt.')
  
      print_success_message(
          'Watching for changes in project files, press Ctrl-C to cancel...')
      handler = RebuildDocsEventHandler(get_project_files())
      observer = Observer()
      observer.schedule(handler, path='.', recursive=True)
      observer.start()
      try:
          while True:
              time.sleep(1)
      except KeyboardInterrupt:
          observer.stop()
          observer.join()