google/generativeai/notebook/sheets_id.py (43 lines of code) (raw):
# -*- coding: utf-8 -*-
# Copyright 2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Module for classes related to identifying a Sheets document."""
from __future__ import annotations
import re
from google.generativeai.notebook import sheets_sanitize_url
def _sanitize_key(key: str) -> str:
if not re.fullmatch("[a-zA-Z0-9_-]+", key):
raise ValueError('"{}" is not a valid Sheets key'.format(key))
return key
class SheetsURL:
"""Class that enforces safety by ensuring that URLs are sanitized."""
def __init__(self, url: str):
self._url: str = sheets_sanitize_url.sanitize_sheets_url(url)
def __str__(self) -> str:
return self._url
class SheetsKey:
"""Class that enforces safety by ensuring that keys are sanitized."""
def __init__(self, key: str):
self._key: str = _sanitize_key(key)
def __str__(self) -> str:
return self._key
class SheetsIdentifier:
"""Encapsulates a means to identify a Sheets document.
The gspread library provides three ways to look up a Sheets document: by name,
by url and by key. An instance of this class represents exactly one of the
methods.
"""
def __init__(
self,
name: str | None = None,
key: SheetsKey | None = None,
url: SheetsURL | None = None,
):
"""Constructor.
Exactly one of the arguments should be provided.
Args:
name: The name of the Sheets document. More-than-one Sheets documents can
have the same name, so this is the least precise method of identifying
the document.
key: The key of the Sheets document
url: The url to the Sheets document
Raises:
ValueError: If the caller does not specify exactly one of name, url or
key.
"""
self._name = name
self._key = key
self._url = url
# There should be exactly one.
num_inputs = int(bool(self._name)) + int(bool(self._key)) + int(bool(self._url))
if num_inputs != 1:
raise ValueError("Must set exactly one of name, key or url")
def name(self) -> str | None:
return self._name
def key(self) -> SheetsKey | None:
return self._key
def url(self) -> SheetsURL | None:
return self._url
def __str__(self):
if self._name:
return "name={}".format(self._name)
elif self._key:
return "key={}".format(self._key)
else:
return "url={}".format(self._url)