docs: def process(self, uid, add_footer=False, no_exec=False, disable_cache=False, ignore_cache=False):
          """
          Execute notebook
          :return: self
          """
  
          self.exec_begin = time.perf_counter()
          self.exec_begin_dt = datetime.datetime.now()
  
          ep = CachedExecutePreprocessor(timeout=None, kernel_name='python3')
          ep.disable_cache = disable_cache
          ep.ignore_cache = ignore_cache
          ep.uid = uid
  
          # Execute the notebook
  
          if not no_exec:
              with warnings.catch_warnings():
                  # On MacOS, annoying warning "RuntimeWarning: Failed to set sticky bit on"
                  # Let's suppress it.
                  warnings.simplefilter("ignore")
                  ep.preprocess(self.nb, {'metadata': {'path': '.'}})
  
          self.exec_time = time.perf_counter() - self.exec_begin
  
          if add_footer:
              self.add_cell_footer()
  
          if not no_exec:
              logging.info('Execution time: {0:.2f}s'.format(self.exec_time))
  
          return self