docs: def load_project(self, path):
          """
          Load a Tarbell project
          """
          base = self._get_base(path)
  
          filename, pathname, description = imp.find_module('tarbell_config', [path])
          project = imp.load_module('project', filename, pathname, description)
  
          try:
              self.key = project.SPREADSHEET_KEY
              self.client = get_drive_api()
          except AttributeError:
              self.key = None
              self.client = None
  
          try:
              project.CREATE_JSON
          except AttributeError:
              project.CREATE_JSON = False
  
          try:
              project.S3_BUCKETS
          except AttributeError:
              project.S3_BUCKETS = {}
  
          project.EXCLUDES = list(set(EXCLUDES + getattr(project, 'EXCLUDES', []) + getattr(base, 'EXCLUDES', [])))
  
          # merge project template types with defaults
          project.TEMPLATE_TYPES = set(getattr(project, 'TEMPLATE_TYPES', [])) | set(TEMPLATE_TYPES)
  
          try:
              project.DEFAULT_CONTEXT
          except AttributeError:
              project.DEFAULT_CONTEXT = {}
  
          project.DEFAULT_CONTEXT.update({
              "PROJECT_PATH": self.path,
              "ROOT_URL": "127.0.0.1:5000",
              "SPREADSHEET_KEY": self.key,
              "BUCKETS": project.S3_BUCKETS,
              "SITE": self,
          })
  
          # Set up template loaders
          template_dirs = [path]
          if base:
              template_dirs.append(base.base_dir)
          error_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'error_templates')
          template_dirs.append(error_path)
  
          self.app.jinja_loader = TarbellFileSystemLoader(template_dirs)
  
          # load the project blueprint, if it exists
          if hasattr(project, 'blueprint') and isinstance(project.blueprint, Blueprint):
              self.app.register_blueprint(project.blueprint, site=self)
  
          return project, base