SYMBOL INDEX (991 symbols across 74 files) FILE: auth/auth_info_middleware.py class AuthInfoMiddleware (line 20) | class AuthInfoMiddleware(Middleware): method __init__ (line 26) | def __init__(self): method _process_request_for_auth (line 30) | async def _process_request_for_auth(self, context: MiddlewareContext): method on_call_tool (line 336) | async def on_call_tool(self, context: MiddlewareContext, call_next): method on_get_prompt (line 358) | async def on_get_prompt(self, context: MiddlewareContext, call_next): FILE: auth/credential_store.py class CredentialStore (line 19) | class CredentialStore(ABC): method get_credential (line 23) | def get_credential(self, user_email: str) -> Optional[Credentials]: method store_credential (line 36) | def store_credential(self, user_email: str, credentials: Credentials) ... method delete_credential (line 50) | def delete_credential(self, user_email: str) -> bool: method list_users (line 63) | def list_users(self) -> List[str]: class LocalDirectoryCredentialStore (line 73) | class LocalDirectoryCredentialStore(CredentialStore): method __init__ (line 76) | def __init__(self, base_dir: Optional[str] = None): method _get_credential_path (line 118) | def _get_credential_path(self, user_email: str) -> str: method get_credential (line 125) | def get_credential(self, user_email: str) -> Optional[Credentials]: method store_credential (line 167) | def store_credential(self, user_email: str, credentials: Credentials) ... method delete_credential (line 192) | def delete_credential(self, user_email: str) -> bool: method list_users (line 212) | def list_users(self) -> List[str]: function get_credential_store (line 239) | def get_credential_store() -> CredentialStore: function set_credential_store (line 257) | def set_credential_store(store: CredentialStore): FILE: auth/external_oauth_provider.py function get_session_time (line 35) | def get_session_time() -> int: class ExternalOAuthProvider (line 61) | class ExternalOAuthProvider(GoogleProvider): method __init__ (line 74) | def __init__( method verify_token (line 90) | async def verify_token(self, token: str) -> Optional[AccessToken]: method get_routes (line 153) | def get_routes(self, **kwargs) -> list[Route]: FILE: auth/google_auth.py function get_default_credentials_dir (line 40) | def get_default_credentials_dir(): function _find_any_credentials (line 94) | def _find_any_credentials( function save_credentials_to_session (line 136) | def save_credentials_to_session(session_id: str, credentials: Credentials): function load_credentials_from_session (line 171) | def load_credentials_from_session(session_id: str) -> Optional[Credentia... function load_client_secrets_from_env (line 186) | def load_client_secrets_from_env() -> Optional[Dict[str, Any]]: function load_client_secrets (line 227) | def load_client_secrets(client_secrets_path: str) -> Dict[str, Any]: function check_client_secrets (line 276) | def check_client_secrets() -> Optional[str]: function create_oauth_flow (line 293) | def create_oauth_flow( function _determine_oauth_prompt (line 341) | def _determine_oauth_prompt( function start_auth_flow (line 423) | async def start_auth_flow( function handle_auth_callback (line 545) | def handle_auth_callback( function get_credentials (line 735) | def get_credentials( function get_user_info (line 981) | def get_user_info( class GoogleAuthenticationError (line 1014) | class GoogleAuthenticationError(Exception): method __init__ (line 1017) | def __init__(self, message: str, auth_url: Optional[str] = None): function get_authenticated_google_service (line 1022) | async def get_authenticated_google_service( FILE: auth/mcp_session_middleware.py class MCPSessionMiddleware (line 24) | class MCPSessionMiddleware(BaseHTTPMiddleware): method dispatch (line 30) | async def dispatch(self, request: Request, call_next: Callable) -> Any: FILE: auth/oauth21_session_store.py function _normalize_expiry_to_naive_utc (line 23) | def _normalize_expiry_to_naive_utc(expiry: Optional[Any]) -> Optional[da... class SessionContext (line 63) | class SessionContext: method __post_init__ (line 73) | def __post_init__(self): function set_session_context (line 78) | def set_session_context(context: Optional[SessionContext]): function get_session_context (line 94) | def get_session_context() -> Optional[SessionContext]: function clear_session_context (line 104) | def clear_session_context(): class SessionContextManager (line 109) | class SessionContextManager: method __init__ (line 119) | def __init__(self, context: Optional[SessionContext]): method __enter__ (line 123) | def __enter__(self): method __exit__ (line 128) | def __exit__(self, exc_type, exc_val, exc_tb): function extract_session_from_headers (line 134) | def extract_session_from_headers(headers: Dict[str, str]) -> Optional[str]: class OAuth21SessionStore (line 181) | class OAuth21SessionStore: method __init__ (line 193) | def __init__(self): method _cleanup_expired_oauth_states_locked (line 204) | def _cleanup_expired_oauth_states_locked(self): method store_oauth_state (line 219) | def store_oauth_state( method validate_and_consume_oauth_state (line 248) | def validate_and_consume_oauth_state( method store_session (line 298) | def store_session( method get_credentials (line 401) | def get_credentials(self, user_email: str) -> Optional[Credentials]: method get_credentials_by_mcp_session (line 436) | def get_credentials_by_mcp_session( method get_credentials_with_validation (line 458) | def get_credentials_with_validation( method get_user_by_mcp_session (line 546) | def get_user_by_mcp_session(self, mcp_session_id: str) -> Optional[str]: method get_session_info (line 559) | def get_session_info(self, user_email: str) -> Optional[Dict[str, Any]]: method remove_session (line 572) | def remove_session(self, user_email: str): method has_session (line 604) | def has_session(self, user_email: str) -> bool: method has_mcp_session (line 609) | def has_mcp_session(self, mcp_session_id: str) -> bool: method get_single_user_email (line 614) | def get_single_user_email(self) -> Optional[str]: method get_stats (line 621) | def get_stats(self) -> Dict[str, Any]: method find_session_id_for_access_token (line 631) | def find_session_id_for_access_token(self, token: str) -> Optional[str]: method _cleanup_orphaned_mappings_locked (line 647) | def _cleanup_orphaned_mappings_locked(self) -> int: method cleanup_orphaned_mappings (line 684) | def cleanup_orphaned_mappings(self) -> int: function get_oauth21_session_store (line 699) | def get_oauth21_session_store() -> OAuth21SessionStore: function set_auth_provider (line 712) | def set_auth_provider(provider): function get_auth_provider (line 719) | def get_auth_provider(): function _resolve_client_credentials (line 724) | def _resolve_client_credentials() -> Tuple[Optional[str], Optional[str]]: function _build_credentials_from_provider (line 756) | def _build_credentials_from_provider( function ensure_session_from_access_token (line 800) | def ensure_session_from_access_token( function get_credentials_from_token (line 864) | def get_credentials_from_token( function store_token_session (line 921) | def store_token_session( FILE: auth/oauth_callback_server.py class MinimalOAuthServer (line 33) | class MinimalOAuthServer: method __init__ (line 39) | def __init__(self, port: int = 8000, base_uri: str = "http://localhost"): method _setup_callback_route (line 52) | def _setup_callback_route(self): method _setup_attachment_route (line 108) | def _setup_attachment_route(self): method is_actually_running (line 135) | def is_actually_running(self) -> bool: method matches_endpoint (line 172) | def matches_endpoint(self, port: int, base_uri: str) -> bool: method start (line 193) | def start(self) -> tuple[bool, str]: method stop (line 270) | def stop(self): function ensure_oauth_callback_available (line 295) | def ensure_oauth_callback_available( function cleanup_oauth_callback_server (line 366) | def cleanup_oauth_callback_server(): FILE: auth/oauth_config.py class OAuthConfig (line 17) | class OAuthConfig: method __init__ (line 26) | def __init__(self): method _get_redirect_uri (line 76) | def _get_redirect_uri(self) -> str: method _get_redirect_path (line 89) | def _get_redirect_path(uri: str) -> str: method _apply_fastmcp_google_env (line 99) | def _apply_fastmcp_google_env(self) -> None: method get_redirect_uris (line 123) | def get_redirect_uris(self) -> List[str]: method get_allowed_origins (line 143) | def get_allowed_origins(self) -> List[str]: method is_configured (line 171) | def is_configured(self) -> bool: method get_oauth_base_url (line 180) | def get_oauth_base_url(self) -> str: method validate_redirect_uri (line 194) | def validate_redirect_uri(self, uri: str) -> bool: method get_environment_summary (line 207) | def get_environment_summary(self) -> dict: method set_transport_mode (line 229) | def set_transport_mode(self, mode: str) -> None: method get_transport_mode (line 238) | def get_transport_mode(self) -> str: method is_oauth21_enabled (line 247) | def is_oauth21_enabled(self) -> bool: method is_external_oauth21_provider (line 256) | def is_external_oauth21_provider(self) -> bool: method detect_oauth_version (line 268) | def detect_oauth_version(self, request_params: Dict[str, Any]) -> str: method get_authorization_server_metadata (line 316) | def get_authorization_server_metadata( function get_oauth_config (line 365) | def get_oauth_config() -> OAuthConfig: function reload_oauth_config (line 381) | def reload_oauth_config() -> OAuthConfig: function get_oauth_base_url (line 397) | def get_oauth_base_url() -> str: function get_redirect_uris (line 402) | def get_redirect_uris() -> List[str]: function get_allowed_origins (line 407) | def get_allowed_origins() -> List[str]: function is_oauth_configured (line 412) | def is_oauth_configured() -> bool: function set_transport_mode (line 417) | def set_transport_mode(mode: str) -> None: function get_transport_mode (line 422) | def get_transport_mode() -> str: function is_oauth21_enabled (line 427) | def is_oauth21_enabled() -> bool: function get_oauth_redirect_uri (line 432) | def get_oauth_redirect_uri() -> str: function is_stateless_mode (line 437) | def is_stateless_mode() -> bool: function is_external_oauth21_provider (line 442) | def is_external_oauth21_provider() -> bool: FILE: auth/oauth_responses.py function create_error_response (line 12) | def create_error_response(error_message: str, status_code: int = 400) ->... function create_success_response (line 36) | def create_success_response(verified_user_id: Optional[str] = None) -> H... function create_server_error_response (line 209) | def create_server_error_response(error_detail: str) -> HTMLResponse: FILE: auth/oauth_types.py class WorkspaceAccessToken (line 14) | class WorkspaceAccessToken(AccessToken): class OAuth21ServiceRequest (line 23) | class OAuth21ServiceRequest: method to_legacy_params (line 41) | def to_legacy_params(self) -> dict: class OAuthVersionDetectionParams (line 53) | class OAuthVersionDetectionParams: method from_request (line 70) | def from_request( method has_pkce (line 85) | def has_pkce(self) -> bool: method is_public_client (line 90) | def is_public_client(self) -> bool: FILE: auth/permissions.py function is_action_denied (line 146) | def is_action_denied(service: str, action: str) -> bool: function set_permissions (line 167) | def set_permissions(permissions: Optional[Dict[str, str]]) -> None: function get_permissions (line 175) | def get_permissions() -> Optional[Dict[str, str]]: function is_permissions_mode (line 180) | def is_permissions_mode() -> bool: function get_scopes_for_permission (line 185) | def get_scopes_for_permission(service: str, level: str) -> List[str]: function get_all_permission_scopes (line 214) | def get_all_permission_scopes() -> List[str]: function get_allowed_scopes_set (line 229) | def get_allowed_scopes_set() -> Optional[set]: function get_valid_levels (line 240) | def get_valid_levels(service: str) -> List[str]: function parse_permissions_arg (line 248) | def parse_permissions_arg(permissions_list: List[str]) -> Dict[str, str]: FILE: auth/scopes.py function has_required_scopes (line 109) | def has_required_scopes(available_scopes, required_scopes): function set_enabled_tools (line 227) | def set_enabled_tools(enabled_tools): function set_read_only (line 243) | def set_read_only(enabled: bool): function is_read_only_mode (line 255) | def is_read_only_mode() -> bool: function get_all_read_only_scopes (line 260) | def get_all_read_only_scopes() -> list[str]: function get_current_scopes (line 268) | def get_current_scopes(): function get_scopes_for_tools (line 284) | def get_scopes_for_tools(enabled_tools=None): FILE: auth/service_decorator.py function _get_auth_context (line 65) | async def _get_auth_context( function _detect_oauth_version (line 96) | def _detect_oauth_version( function _update_email_in_args (line 142) | def _update_email_in_args(args: tuple, index: int, new_email: str) -> tu... function _override_oauth21_user_email (line 151) | def _override_oauth21_user_email( function _authenticate_service (line 191) | async def _authenticate_service( function get_authenticated_google_service_oauth21 (line 231) | async def get_authenticated_google_service_oauth21( function _extract_oauth21_user_email (line 321) | def _extract_oauth21_user_email( function _extract_oauth20_user_email (line 344) | def _extract_oauth20_user_email( function _remove_user_email_arg_from_docstring (line 370) | def _remove_user_email_arg_from_docstring(docstring: str) -> str: function _resolve_scopes (line 470) | def _resolve_scopes(scopes: Union[str, List[str]]) -> List[str]: function _handle_token_refresh_error (line 487) | def _handle_token_refresh_error( function require_google_service (line 565) | def require_google_service( function require_multiple_services (line 719) | def require_multiple_services(service_configs: List[Dict[str, Any]]): FILE: core/api_enablement.py function extract_api_info_from_error (line 48) | def extract_api_info_from_error( function get_api_enablement_message (line 69) | def get_api_enablement_message( FILE: core/attachment_storage.py function _ensure_storage_dir (line 29) | def _ensure_storage_dir() -> None: class SavedAttachment (line 34) | class SavedAttachment(NamedTuple): class AttachmentStorage (line 41) | class AttachmentStorage: method __init__ (line 44) | def __init__(self, expiration_seconds: int = DEFAULT_EXPIRATION_SECONDS): method save_attachment (line 48) | def save_attachment( method get_attachment_path (line 146) | def get_attachment_path(self, file_id: str) -> Optional[Path]: method get_attachment_metadata (line 177) | def get_attachment_metadata(self, file_id: str) -> Optional[Dict]: method _cleanup_file (line 199) | def _cleanup_file(self, file_id: str) -> None: method cleanup_expired (line 211) | def cleanup_expired(self) -> int: function get_attachment_storage (line 235) | def get_attachment_storage() -> AttachmentStorage: function get_attachment_url (line 243) | def get_attachment_url(file_id: str) -> str: FILE: core/cli_handler.py function get_registered_tools (line 28) | def get_registered_tools(server) -> Dict[str, Any]: function _extract_docstring (line 52) | def _extract_docstring(tool) -> Optional[str]: function _extract_parameters (line 67) | def _extract_parameters(tool) -> Dict[str, Any]: function list_tools (line 88) | def list_tools(server, output_format: str = "text") -> str: function show_tool_help (line 147) | def show_tool_help(server, tool_name: str) -> str: function run_tool (line 210) | async def run_tool(server, tool_name: str, args: Dict[str, Any]) -> str: function parse_cli_args (line 270) | def parse_cli_args(args: List[str]) -> Dict[str, Any]: function read_stdin_args (line 342) | def read_stdin_args() -> Dict[str, Any]: function handle_cli_mode (line 363) | async def handle_cli_mode(server, cli_args: List[str]) -> int: FILE: core/comments.py function _manage_comment_dispatch (line 19) | async def _manage_comment_dispatch( function create_comment_tools (line 51) | def create_comment_tools(app_name: str, file_id_param: str): function _read_comments_impl (line 180) | async def _read_comments_impl(service, app_name: str, file_id: str) -> str: function _create_comment_impl (line 236) | async def _create_comment_impl( function _reply_to_comment_impl (line 266) | async def _reply_to_comment_impl( function _resolve_comment_impl (line 294) | async def _resolve_comment_impl( FILE: core/context.py function get_injected_oauth_credentials (line 14) | def get_injected_oauth_credentials(): function set_injected_oauth_credentials (line 22) | def set_injected_oauth_credentials(credentials: Optional[dict]): function get_fastmcp_session_id (line 30) | def get_fastmcp_session_id() -> Optional[str]: function set_fastmcp_session_id (line 38) | def set_fastmcp_session_id(session_id: Optional[str]): FILE: core/log_formatter.py class EnhancedLogFormatter (line 14) | class EnhancedLogFormatter(logging.Formatter): method __init__ (line 27) | def __init__(self, use_colors: bool = True, *args, **kwargs): method format (line 37) | def format(self, record: logging.LogRecord) -> str: method _get_ascii_prefix (line 53) | def _get_ascii_prefix(self, logger_name: str, level_name: str) -> str: method _enhance_message (line 77) | def _enhance_message(self, message: str) -> str: function setup_enhanced_logging (line 119) | def setup_enhanced_logging( function configure_file_logging (line 158) | def configure_file_logging(logger_name: str = None) -> bool: FILE: core/server.py class WellKnownCacheControlMiddleware (line 45) | class WellKnownCacheControlMiddleware: method __init__ (line 48) | def __init__(self, app): method __call__ (line 51) | async def __call__(self, scope: Scope, receive: Receive, send: Send) -... function _compute_scope_fingerprint (line 80) | def _compute_scope_fingerprint() -> str: class SecureFastMCP (line 87) | class SecureFastMCP(FastMCP): method http_app (line 88) | def http_app(self, **kwargs) -> "Starlette": function _parse_bool_env (line 123) | def _parse_bool_env(value: str) -> bool: function set_transport_mode (line 128) | def set_transport_mode(mode: str): function _ensure_legacy_callback_route (line 134) | def _ensure_legacy_callback_route() -> None: function configure_server_for_http (line 142) | def configure_server_for_http(): function get_auth_provider (line 462) | def get_auth_provider() -> Optional[GoogleProvider]: function health_check (line 469) | async def health_check(request: Request): function serve_attachment (line 485) | async def serve_attachment(request: Request): function legacy_oauth2_callback (line 509) | async def legacy_oauth2_callback(request: Request) -> HTMLResponse: function start_google_auth (line 576) | async def start_google_auth( FILE: core/tool_registry.py function set_enabled_tools (line 21) | def set_enabled_tools(tool_names: Optional[Set[str]]): function get_enabled_tools (line 27) | def get_enabled_tools() -> Optional[Set[str]]: function is_tool_enabled (line 32) | def is_tool_enabled(tool_name: str) -> bool: function conditional_tool (line 39) | def conditional_tool(server, tool_name: str): function wrap_server_tool_method (line 62) | def wrap_server_tool_method(server): function get_tool_components (line 83) | def get_tool_components(server) -> dict: function filter_server_tools (line 104) | def filter_server_tools(server): FILE: core/tool_tier_loader.py class ToolTierLoader (line 19) | class ToolTierLoader: method __init__ (line 22) | def __init__(self, config_path: Optional[str] = None): method _load_config (line 36) | def _load_config(self) -> Dict: method get_available_services (line 56) | def get_available_services(self) -> List[str]: method get_tools_for_tier (line 61) | def get_tools_for_tier( method get_tools_up_to_tier (line 99) | def get_tools_up_to_tier( method get_services_for_tools (line 130) | def get_services_for_tools(self, tool_names: List[str]) -> Set[str]: function get_tools_for_tier (line 152) | def get_tools_for_tier( function resolve_tools_from_tier (line 169) | def resolve_tools_from_tier( FILE: core/utils.py class TransientNetworkError (line 24) | class TransientNetworkError(Exception): class UserInputError (line 30) | class UserInputError(Exception): function _coerce_json_str_to_list (line 36) | def _coerce_json_str_to_list(v: Any) -> Any: function _get_allowed_file_dirs (line 67) | def _get_allowed_file_dirs() -> list[Path]: function validate_file_path (line 80) | def validate_file_path(file_path: str) -> Path: function check_credentials_directory_permissions (line 190) | def check_credentials_directory_permissions(credentials_dir: str = None)... function extract_office_xml_text (line 253) | def extract_office_xml_text(file_bytes: bytes, mime_type: str) -> Option... function handle_http_errors (line 403) | def handle_http_errors( FILE: fastmcp_server.py function enforce_fastmcp_cloud_defaults (line 28) | def enforce_fastmcp_cloud_defaults(): function configure_safe_logging (line 90) | def configure_safe_logging(): FILE: gappsscript/apps_script_tools.py function _list_script_projects_impl (line 19) | async def _list_script_projects_impl( function list_script_projects (line 75) | async def list_script_projects( function _get_script_project_impl (line 100) | async def _get_script_project_impl( function get_script_project (line 147) | async def get_script_project( function _get_script_content_impl (line 166) | async def _get_script_content_impl( function get_script_content (line 205) | async def get_script_content( function _create_script_project_impl (line 228) | async def _create_script_project_impl( function create_script_project (line 262) | async def create_script_project( function _update_script_content_impl (line 285) | async def _update_script_content_impl( function update_script_content (line 316) | async def update_script_content( function _run_script_function_impl (line 339) | async def _run_script_function_impl( function run_script_function (line 387) | async def run_script_function( function _create_deployment_impl (line 414) | async def _create_deployment_impl( function manage_deployment (line 469) | async def manage_deployment( function _list_deployments_impl (line 520) | async def _list_deployments_impl( function list_deployments (line 555) | async def list_deployments( function _update_deployment_impl (line 574) | async def _update_deployment_impl( function _delete_deployment_impl (line 607) | async def _delete_deployment_impl( function _list_script_processes_impl (line 631) | async def _list_script_processes_impl( function list_script_processes (line 676) | async def list_script_processes( function _delete_script_project_impl (line 704) | async def _delete_script_project_impl( function delete_script_project (line 724) | async def delete_script_project( function _list_versions_impl (line 750) | async def _list_versions_impl( function list_versions (line 785) | async def list_versions( function _create_version_impl (line 807) | async def _create_version_impl( function create_version (line 843) | async def create_version( function _get_version_impl (line 869) | async def _get_version_impl( function get_version (line 904) | async def get_version( function _get_script_metrics_impl (line 932) | async def _get_script_metrics_impl( function get_script_metrics (line 1001) | async def get_script_metrics( function _generate_trigger_code_impl (line 1032) | def _generate_trigger_code_impl( function generate_trigger_code (line 1250) | async def generate_trigger_code( FILE: gcalendar/calendar_tools.py function _parse_reminders_json (line 28) | def _parse_reminders_json( function _apply_transparency_if_valid (line 102) | def _apply_transparency_if_valid( function _apply_visibility_if_valid (line 128) | def _apply_visibility_if_valid( function _preserve_existing_fields (line 154) | def _preserve_existing_fields( function _get_meeting_link (line 175) | def _get_meeting_link(item: Dict[str, Any]) -> str: function _format_attendee_details (line 190) | def _format_attendee_details( function _format_attachment_details (line 229) | def _format_attachment_details( function _correct_time_format_for_api (line 265) | def _correct_time_format_for_api( function list_calendars (line 322) | async def list_calendars(service, user_google_email: str) -> str: function get_events (line 356) | async def get_events( function _create_event_impl (line 574) | async def _create_event_impl( function _normalize_attendees (line 792) | def _normalize_attendees( function _modify_event_impl (line 821) | async def _modify_event_impl( function _delete_event_impl (line 1058) | async def _delete_event_impl( function manage_event (line 1114) | async def manage_event( function query_freebusy (line 1244) | async def query_freebusy( FILE: gchat/chat_tools.py function _cache_sender (line 27) | def _cache_sender(user_id: str, name: str) -> None: function _resolve_sender (line 36) | async def _resolve_sender(people_service, sender_obj: dict) -> str: function _extract_rich_links (line 86) | def _extract_rich_links(msg: dict) -> List[str]: function list_spaces (line 106) | async def list_spaces( function get_messages (line 159) | async def get_messages( function send_message (line 266) | async def send_message( function search_messages (line 324) | async def search_messages( function create_reaction (line 458) | async def create_reaction( function download_chat_attachment (line 494) | async def download_chat_attachment( FILE: gcontacts/contacts_tools.py function _format_contact (line 36) | def _format_contact(person: Dict[str, Any], detailed: bool = False) -> str: function _build_person_body (line 134) | def _build_person_body( function _warmup_search_cache (line 193) | async def _warmup_search_cache(service: Resource, user_google_email: str... function list_contacts (line 231) | async def list_contacts( function get_contact (line 295) | async def get_contact( function search_contacts (line 336) | async def search_contacts( function manage_contact (line 394) | async def manage_contact( function list_contact_groups (line 553) | async def list_contact_groups( function get_contact_group (line 616) | async def get_contact_group( function manage_contacts_batch (line 686) | async def manage_contacts_batch( function manage_contact_group (line 892) | async def manage_contact_group( FILE: gdocs/docs_helpers.py function validate_suggestions_view_mode (line 33) | def validate_suggestions_view_mode(suggestions_view_mode: str) -> Option... function _normalize_color (line 44) | def _normalize_color( function build_text_style (line 71) | def build_text_style( function build_paragraph_style (line 143) | def build_paragraph_style( function create_insert_text_request (line 234) | def create_insert_text_request( function create_insert_text_segment_request (line 254) | def create_insert_text_segment_request( function create_delete_range_request (line 280) | def create_delete_range_request( function create_format_text_request (line 300) | def create_format_text_request( function create_update_paragraph_style_request (line 362) | def create_update_paragraph_style_request( function create_find_replace_request (line 424) | def create_find_replace_request( function create_insert_table_request (line 453) | def create_insert_table_request( function create_insert_page_break_request (line 474) | def create_insert_page_break_request( function create_insert_doc_tab_request (line 493) | def create_insert_doc_tab_request( function create_delete_doc_tab_request (line 520) | def create_delete_doc_tab_request(tab_id: str) -> Dict[str, Any]: function create_update_doc_tab_request (line 533) | def create_update_doc_tab_request(tab_id: str, title: str) -> Dict[str, ... function create_insert_image_request (line 555) | def create_insert_image_request( function create_bullet_list_request (line 594) | def create_bullet_list_request( function create_delete_bullet_list_request (line 684) | def create_delete_bullet_list_request( function validate_operation (line 711) | def validate_operation(operation: Dict[str, Any]) -> tuple[bool, str]: FILE: gdocs/docs_markdown.py function convert_doc_to_markdown (line 33) | def convert_doc_to_markdown(doc: dict[str, Any]) -> str: function _convert_paragraph_text (line 117) | def _convert_paragraph_text( function _convert_text_run (line 128) | def _convert_text_run( function _apply_text_style (line 142) | def _apply_text_style( function _is_ordered_list (line 173) | def _is_ordered_list(lists_meta: dict[str, Any], list_id: str, nesting: ... function _is_checklist (line 184) | def _is_checklist(lists_meta: dict[str, Any], list_id: str, nesting: int... function _is_checked (line 201) | def _is_checked(para: dict[str, Any]) -> bool: function _convert_table (line 215) | def _convert_table(table: dict[str, Any]) -> str: function _extract_cell_text (line 236) | def _extract_cell_text(cell: dict[str, Any]) -> str: function format_comments_inline (line 248) | def format_comments_inline(markdown: str, comments: list[dict[str, Any]]... function _format_footnote (line 281) | def _format_footnote(num: int, comment: dict[str, Any]) -> str: function format_comments_appendix (line 289) | def format_comments_appendix(comments: list[dict[str, Any]]) -> str: function parse_drive_comments (line 309) | def parse_drive_comments( FILE: gdocs/docs_structure.py function parse_document_structure (line 14) | def parse_document_structure(doc_data: dict[str, Any]) -> dict[str, Any]: function _parse_element (line 58) | def _parse_element(element: dict[str, Any]) -> Optional[dict[str, Any]]: function _parse_table_cells (line 102) | def _parse_table_cells(table: dict[str, Any]) -> list[list[dict[str, Any... function _extract_paragraph_text (line 146) | def _extract_paragraph_text(paragraph: dict[str, Any]) -> str: function _extract_cell_text (line 155) | def _extract_cell_text(cell: dict[str, Any]) -> str: function _parse_segment (line 164) | def _parse_segment(segment_data: dict[str, Any]) -> dict[str, Any]: function find_tables (line 177) | def find_tables(doc_data: dict[str, Any]) -> list[dict[str, Any]]: function get_table_cell_indices (line 205) | def get_table_cell_indices( function find_element_at_index (line 263) | def find_element_at_index( function get_next_paragraph_index (line 300) | def get_next_paragraph_index(doc_data: dict[str, Any], after_index: int ... function analyze_document_complexity (line 323) | def analyze_document_complexity(doc_data: dict[str, Any]) -> dict[str, A... FILE: gdocs/docs_tables.py function build_table_population_requests (line 14) | def build_table_population_requests( function calculate_cell_positions (line 118) | def calculate_cell_positions( function format_table_data (line 168) | def format_table_data( function create_table_with_data (line 210) | def create_table_with_data( function build_table_style_requests (line 262) | def build_table_style_requests( function extract_table_as_data (line 348) | def extract_table_as_data(table_info: Dict[str, Any]) -> List[List[str]]: function find_table_by_content (line 370) | def find_table_by_content( function validate_table_data (line 399) | def validate_table_data(data: List[List[str]]) -> Tuple[bool, str]: FILE: gdocs/docs_tools.py function search_docs (line 66) | async def search_docs( function get_doc_content (line 117) | async def get_doc_content( function list_docs_in_folder (line 304) | async def list_docs_in_folder( function create_doc (line 342) | async def create_doc( function modify_doc_text (line 378) | async def modify_doc_text( function find_and_replace_doc (line 576) | async def find_and_replace_doc( function insert_doc_elements (line 627) | async def insert_doc_elements( function insert_doc_image (line 718) | async def insert_doc_image( function update_doc_headers_footers (line 801) | async def update_doc_headers_footers( function batch_update_doc (line 858) | async def batch_update_doc( function inspect_doc_structure (line 946) | async def inspect_doc_structure( function create_table_with_data (line 1127) | async def create_table_with_data( function debug_table_structure (line 1227) | async def debug_table_structure( function export_doc_to_pdf (line 1314) | async def export_doc_to_pdf( function _get_paragraph_start_indices_in_range (line 1437) | async def _get_paragraph_start_indices_in_range( function update_paragraph_style (line 1469) | async def update_paragraph_style( function get_doc_as_markdown (line 1723) | async def get_doc_as_markdown( function insert_doc_tab (line 1833) | async def insert_doc_tab( function delete_doc_tab (line 1882) | async def delete_doc_tab( function update_doc_tab (line 1915) | async def update_doc_tab( FILE: gdocs/managers/batch_operation_manager.py class BatchOperationManager (line 31) | class BatchOperationManager: method __init__ (line 41) | def __init__(self, service): method execute_batch_operations (line 50) | async def execute_batch_operations( method _validate_and_build_requests (line 114) | async def _validate_and_build_requests( method _build_operation_request (line 163) | def _build_operation_request( method _execute_batch_requests (line 374) | async def _execute_batch_requests( method _extract_created_tabs (line 393) | def _extract_created_tabs(self, result: dict[str, Any]) -> list[dict[s... method _build_operation_summary (line 413) | def _build_operation_summary(self, operation_descriptions: list[str]) ... method get_supported_operations (line 435) | def get_supported_operations(self) -> dict[str, Any]: FILE: gdocs/managers/header_footer_manager.py class HeaderFooterManager (line 15) | class HeaderFooterManager: method __init__ (line 25) | def __init__(self, service): method update_header_footer_content (line 34) | async def update_header_footer_content( method _get_document (line 100) | async def _get_document(self, document_id: str) -> dict[str, Any]: method _find_target_section (line 106) | async def _find_target_section( method _replace_section_content (line 156) | async def _replace_section_content( method _find_first_paragraph (line 216) | def _find_first_paragraph( method get_header_footer_info (line 225) | async def get_header_footer_info(self, document_id: str) -> dict[str, ... method _extract_section_info (line 257) | def _extract_section_info(self, section_data: dict[str, Any]) -> dict[... method create_header_footer (line 281) | async def create_header_footer( FILE: gdocs/managers/table_operation_manager.py class TableOperationManager (line 19) | class TableOperationManager: method __init__ (line 29) | def __init__(self, service): method create_and_populate_table (line 38) | async def create_and_populate_table( method _create_empty_table (line 104) | async def _create_empty_table( method _get_document_tables (line 121) | async def _get_document_tables( method _find_tab (line 140) | def _find_tab(tabs: list, target_id: str): method _populate_table_cells (line 151) | async def _populate_table_cells( method _populate_single_cell (line 197) | async def _populate_single_cell( method _apply_bold_formatting (line 263) | async def _apply_bold_formatting( method populate_existing_table (line 289) | async def populate_existing_table( method _populate_existing_table_cells (line 353) | async def _populate_existing_table_cells( FILE: gdocs/managers/validation_manager.py class ValidationManager (line 17) | class ValidationManager: method __init__ (line 26) | def __init__(self): method _setup_validation_rules (line 30) | def _setup_validation_rules(self) -> Dict[str, Any]: method validate_document_id (line 46) | def validate_document_id(self, document_id: str) -> Tuple[bool, str]: method validate_table_data (line 71) | def validate_table_data(self, table_data: List[List[str]]) -> Tuple[bo... method validate_text_formatting_params (line 154) | def validate_text_formatting_params( method validate_link_url (line 257) | def validate_link_url(self, link_url: Optional[str]) -> Tuple[bool, str]: method validate_paragraph_style_params (line 277) | def validate_paragraph_style_params( method validate_color_param (line 390) | def validate_color_param( method validate_index (line 409) | def validate_index(self, index: int, context: str = "Index") -> Tuple[... method validate_index_range (line 431) | def validate_index_range( method validate_element_insertion_params (line 488) | def validate_element_insertion_params( method validate_header_footer_params (line 555) | def validate_header_footer_params( method validate_batch_operations (line 584) | def validate_batch_operations( method validate_text_content (line 670) | def validate_text_content( method get_validation_summary (line 692) | def get_validation_summary(self) -> Dict[str, Any]: FILE: gdrive/drive_helpers.py function check_public_link_permission (line 15) | def check_public_link_permission(permissions: List[Dict[str, Any]]) -> b... function format_public_sharing_error (line 31) | def format_public_sharing_error(file_name: str, file_id: str) -> str: function get_drive_image_url (line 49) | def get_drive_image_url(file_id: str) -> str: function validate_share_role (line 62) | def validate_share_role(role: str) -> None: function validate_share_type (line 78) | def validate_share_type(share_type: str) -> None: function validate_expiration_time (line 99) | def validate_expiration_time(expiration_time: str) -> None: function format_permission_info (line 116) | def format_permission_info(permission: Dict[str, Any]) -> str: function build_drive_list_params (line 178) | def build_drive_list_params( function resolve_file_type_mime (line 271) | def resolve_file_type_mime(file_type: str) -> str: function resolve_drive_item (line 314) | async def resolve_drive_item( function resolve_folder_id (line 356) | async def resolve_folder_id( FILE: gdrive/drive_tools.py function search_drive_files (line 56) | async def search_drive_files( function get_drive_file_content (line 155) | async def get_drive_file_content( function get_drive_file_download_url (line 248) | async def get_drive_file_download_url( function list_drive_items (line 435) | async def list_drive_items( function _create_drive_folder_impl (line 519) | async def _create_drive_folder_impl( function create_drive_folder (line 551) | async def create_drive_folder( function create_drive_file (line 580) | async def create_drive_file( function _resolve_and_validate_host (line 836) | def _resolve_and_validate_host(hostname: str) -> list[str]: function _validate_url_not_internal (line 884) | def _validate_url_not_internal(url: str) -> list[str]: function _format_host_header (line 898) | def _format_host_header(hostname: str, scheme: str, port: Optional[int])... function _build_pinned_url (line 912) | def _build_pinned_url(parsed_url, ip_address_str: str) -> str: function _fetch_url_with_pinned_ip (line 941) | async def _fetch_url_with_pinned_ip(url: str) -> httpx.Response: function _ssrf_safe_fetch (line 984) | async def _ssrf_safe_fetch(url: str, *, stream: bool = False) -> httpx.R... function _ssrf_safe_stream (line 1034) | async def _ssrf_safe_stream(url: str) -> AsyncIterator[httpx.Response]: function _detect_source_format (line 1117) | def _detect_source_format(file_name: str, content: Optional[str] = None)... function import_to_google_doc (line 1136) | async def import_to_google_doc( function get_drive_file_permissions (line 1338) | async def get_drive_file_permissions( function check_drive_file_public_access (line 1447) | async def check_drive_file_public_access( function update_drive_file (line 1542) | async def update_drive_file( function get_drive_shareable_link (line 1719) | async def get_drive_shareable_link( function manage_drive_access (line 1779) | async def manage_drive_access( function copy_drive_file (line 2146) | async def copy_drive_file( function set_drive_file_permissions (line 2220) | async def set_drive_file_permissions( FILE: gforms/forms_tools.py function _extract_option_values (line 20) | def _extract_option_values(options: List[Dict[str, Any]]) -> List[Dict[s... function _get_question_type (line 30) | def _get_question_type(question: Dict[str, Any]) -> str: function _serialize_form_item (line 56) | def _serialize_form_item(item: Dict[str, Any], index: int) -> Dict[str, ... function create_form (line 122) | async def create_form( function get_form (line 169) | async def get_form(service, user_google_email: str, form_id: str) -> str: function set_publish_settings (line 233) | async def set_publish_settings( function get_form_response (line 275) | async def get_form_response( function list_form_responses (line 330) | async def list_form_responses( function _batch_update_form_impl (line 397) | async def _batch_update_form_impl( function batch_update_form (line 451) | async def batch_update_form( FILE: gmail/gmail_tools.py class _HTMLTextExtractor (line 71) | class _HTMLTextExtractor(HTMLParser): method __init__ (line 74) | def __init__(self): method handle_starttag (line 79) | def handle_starttag(self, tag, attrs): method handle_endtag (line 82) | def handle_endtag(self, tag): method handle_data (line 86) | def handle_data(self, data): method get_text (line 90) | def get_text(self) -> str: function _html_to_text (line 94) | def _html_to_text(html: str) -> str: function _extract_message_body (line 104) | def _extract_message_body(payload): function _extract_message_bodies (line 119) | def _extract_message_bodies(payload): function _format_body_content (line 172) | def _format_body_content(text_body: str, html_body: str) -> str: function _append_signature_to_body (line 218) | def _append_signature_to_body( function _fetch_original_for_quote (line 236) | async def _fetch_original_for_quote( function _build_quoted_reply_body (line 287) | def _build_quoted_reply_body( function _get_send_as_signature_html (line 344) | async def _get_send_as_signature_html(service, from_email: Optional[str]... function _format_attachment_result (line 385) | def _format_attachment_result(attached_count: int, requested_count: int)... function _extract_attachments (line 394) | def _extract_attachments(payload: dict) -> List[Dict[str, Any]]: function _extract_headers (line 429) | def _extract_headers(payload: dict, header_names: List[str]) -> Dict[str... function _parse_message_id_chain (line 450) | def _parse_message_id_chain(header_value: Optional[str]) -> List[str]: function _derive_reply_headers (line 462) | def _derive_reply_headers( function _fetch_thread_message_ids (line 492) | async def _fetch_thread_message_ids(service, thread_id: str) -> List[str]: function _prepare_gmail_message (line 535) | def _prepare_gmail_message( function _generate_gmail_web_url (line 694) | def _generate_gmail_web_url(item_id: str, account_index: int = 0) -> str: function _format_gmail_results_plain (line 709) | def _format_gmail_results_plain( function search_gmail_messages (line 786) | async def search_gmail_messages( function get_gmail_message_content (line 852) | async def get_gmail_message_content( function get_gmail_messages_content_batch (line 959) | async def get_gmail_messages_content_batch( function get_gmail_attachment_content (line 1172) | async def get_gmail_attachment_content( function send_gmail_message (line 1349) | async def send_gmail_message( function draft_gmail_message (line 1551) | async def draft_gmail_message( function _format_thread_content (line 1786) | def _format_thread_content(thread_data: dict, thread_id: str) -> str: function get_gmail_thread_content (line 1874) | async def get_gmail_thread_content( function get_gmail_threads_content_batch (line 1904) | async def get_gmail_threads_content_batch( function list_gmail_labels (line 2011) | async def list_gmail_labels(service, user_google_email: str) -> str: function manage_gmail_label (line 2059) | async def manage_gmail_label( function list_gmail_filters (line 2138) | async def list_gmail_filters(service, user_google_email: str) -> str: function manage_gmail_filter (line 2216) | async def manage_gmail_filter( function modify_gmail_message_labels (line 2285) | async def modify_gmail_message_labels( function batch_modify_gmail_message_labels (line 2337) | async def batch_modify_gmail_message_labels( FILE: gsearch/search_tools.py function search_custom (line 22) | async def search_custom( function get_search_engine_info (line 171) | async def get_search_engine_info(service, user_google_email: str) -> str: FILE: gsheets/sheets_helpers.py function _column_to_index (line 24) | def _column_to_index(column: str) -> Optional[int]: function _parse_a1_part (line 34) | def _parse_a1_part( function _split_sheet_and_range (line 51) | def _split_sheet_and_range(range_name: str) -> tuple[Optional[str], str]: function _parse_a1_range (line 74) | def _parse_a1_range(range_name: str, sheets: List[dict]) -> dict: function _parse_hex_color (line 129) | def _parse_hex_color(color: Optional[str]) -> Optional[dict]: function _index_to_column (line 153) | def _index_to_column(index: int) -> str: function _quote_sheet_title_for_a1 (line 168) | def _quote_sheet_title_for_a1(sheet_title: str) -> str: function _format_a1_cell (line 181) | def _format_a1_cell(sheet_title: str, row_index: int, col_index: int) ->... function _coerce_int (line 196) | def _coerce_int(value: object, default: int = 0) -> int: function _is_sheets_error_token (line 213) | def _is_sheets_error_token(value: object) -> bool: function _values_contain_sheets_errors (line 230) | def _values_contain_sheets_errors(values: List[List[object]]) -> bool: function _a1_range_for_values (line 247) | def _a1_range_for_values(a1_range: str, values: List[List[object]]) -> O... function _a1_range_cell_count (line 282) | def _a1_range_cell_count(a1_range: str) -> Optional[int]: function _extract_cell_errors_from_grid (line 312) | def _extract_cell_errors_from_grid(spreadsheet: dict) -> list[dict[str, ... function _extract_cell_hyperlinks_from_grid (line 361) | def _extract_cell_hyperlinks_from_grid(spreadsheet: dict) -> list[dict[s... function _fetch_detailed_sheet_errors (line 421) | async def _fetch_detailed_sheet_errors( function _fetch_sheet_hyperlinks (line 437) | async def _fetch_sheet_hyperlinks( function _format_sheet_error_section (line 453) | def _format_sheet_error_section( function _format_sheet_hyperlink_section (line 501) | def _format_sheet_hyperlink_section( function _color_to_hex (line 524) | def _color_to_hex(color: Optional[dict]) -> Optional[str]: function _grid_range_to_a1 (line 544) | def _grid_range_to_a1(grid_range: dict, sheet_titles: dict[int, str]) ->... function _summarize_conditional_rule (line 585) | def _summarize_conditional_rule( function _format_conditional_rules_section (line 641) | def _format_conditional_rules_section( function _fetch_sheets_with_rules (line 690) | async def _fetch_sheets_with_rules( function _select_sheet (line 714) | def _select_sheet(sheets: List[dict], sheet_name: Optional[str]) -> dict: function _parse_condition_values (line 736) | def _parse_condition_values( function _parse_gradient_points (line 764) | def _parse_gradient_points( function _build_boolean_rule (line 819) | def _build_boolean_rule( function _build_gradient_rule (line 868) | def _build_gradient_rule( function _extract_cell_notes_from_grid (line 886) | def _extract_cell_notes_from_grid(spreadsheet: dict) -> list[dict[str, s... function _fetch_sheet_notes (line 924) | async def _fetch_sheet_notes( function _format_sheet_notes_section (line 941) | def _format_sheet_notes_section( function _fetch_grid_metadata (line 964) | async def _fetch_grid_metadata( FILE: gsheets/sheets_tools.py function list_spreadsheets (line 42) | async def list_spreadsheets( function get_spreadsheet_info (line 95) | async def get_spreadsheet_info( function read_sheet_values (line 173) | async def read_sheet_values( function modify_sheet_values (line 259) | async def modify_sheet_values( function _format_sheet_range_impl (line 386) | async def _format_sheet_range_impl( function format_sheet_range (line 628) | async def format_sheet_range( function manage_conditional_formatting (line 707) | async def manage_conditional_formatting( function create_spreadsheet (line 1105) | async def create_spreadsheet( function create_sheet (line 1161) | async def create_sheet( FILE: gslides/slides_tools.py function create_presentation (line 23) | async def create_presentation( function get_presentation (line 60) | async def get_presentation( function batch_update_presentation (line 153) | async def batch_update_presentation( function get_page (line 213) | async def get_page( function get_page_thumbnail (line 274) | async def get_page_thumbnail( FILE: gtasks/tasks_tools.py function _format_reauth_message (line 28) | def _format_reauth_message(error: Exception, user_google_email: str) -> ... class StructuredTask (line 55) | class StructuredTask: method __init__ (line 56) | def __init__(self, task: Dict[str, str], is_placeholder_parent: bool) ... method add_subtask (line 67) | def add_subtask(self, subtask: "StructuredTask") -> None: method __repr__ (line 70) | def __repr__(self) -> str: function _adjust_due_max_for_tasks_api (line 74) | def _adjust_due_max_for_tasks_api(due_max: str) -> str: function list_task_lists (line 102) | async def list_task_lists( function get_task_list (line 160) | async def get_task_list( function _create_task_list_impl (line 206) | async def _create_task_list_impl( function _update_task_list_impl (line 230) | async def _update_task_list_impl( function _delete_task_list_impl (line 255) | async def _delete_task_list_impl( function _clear_completed_tasks_impl (line 271) | async def _clear_completed_tasks_impl( function manage_task_list (line 295) | async def manage_task_list( function list_tasks (line 362) | async def list_tasks( function get_structured_tasks (line 488) | def get_structured_tasks(tasks: List[Dict[str, str]]) -> List[Structured... function sort_structured_tasks (line 535) | def sort_structured_tasks( function serialize_tasks (line 556) | def serialize_tasks(structured_tasks: List[StructuredTask], subtask_leve... function get_task (line 606) | async def get_task( function _create_task_impl (line 668) | async def _create_task_impl( function _update_task_impl (line 716) | async def _update_task_impl( function _delete_task_impl (line 775) | async def _delete_task_impl( function _move_task_impl (line 793) | async def _move_task_impl( function manage_task (line 849) | async def manage_task( FILE: main.py function safe_print (line 57) | def safe_print(text): function configure_safe_logging (line 75) | def configure_safe_logging(): function resolve_permissions_mode_selection (line 103) | def resolve_permissions_mode_selection( function narrow_permissions_to_services (line 120) | def narrow_permissions_to_services( function _restore_stdout (line 129) | def _restore_stdout() -> None: function main (line 152) | def main(): FILE: tests/auth/test_google_auth_callback_refresh_token.py class _DummyFlow (line 6) | class _DummyFlow: method __init__ (line 7) | def __init__(self, credentials): method fetch_token (line 10) | def fetch_token(self, authorization_response): # noqa: ARG002 class _DummyOAuthStore (line 14) | class _DummyOAuthStore: method __init__ (line 15) | def __init__(self, session_credentials=None): method validate_and_consume_oauth_state (line 19) | def validate_and_consume_oauth_state(self, state, session_id=None): #... method get_credentials_by_mcp_session (line 22) | def get_credentials_by_mcp_session(self, mcp_session_id): # noqa: ARG002 method store_session (line 25) | def store_session(self, **kwargs): class _DummyCredentialStore (line 29) | class _DummyCredentialStore: method __init__ (line 30) | def __init__(self, existing_credentials=None): method get_credential (line 34) | def get_credential(self, user_email): # noqa: ARG002 method store_credential (line 37) | def store_credential(self, user_email, credentials): # noqa: ARG002 function _make_credentials (line 42) | def _make_credentials(refresh_token): function test_callback_preserves_refresh_token_from_credential_store (line 53) | def test_callback_preserves_refresh_token_from_credential_store(monkeypa... function test_callback_prefers_session_refresh_token_over_credential_store (line 91) | def test_callback_prefers_session_refresh_token_over_credential_store(mo... FILE: tests/auth/test_google_auth_pkce.py function test_create_oauth_flow_autogenerates_verifier_when_missing (line 23) | def test_create_oauth_flow_autogenerates_verifier_when_missing(): function test_create_oauth_flow_preserves_callback_verifier (line 48) | def test_create_oauth_flow_preserves_callback_verifier(): function test_create_oauth_flow_file_config_still_enables_pkce (line 74) | def test_create_oauth_flow_file_config_still_enables_pkce(): function test_create_oauth_flow_allows_disabling_autogenerate_without_verifier (line 96) | def test_create_oauth_flow_allows_disabling_autogenerate_without_verifie... FILE: tests/auth/test_google_auth_prompt_selection.py class _DummyCredentialStore (line 6) | class _DummyCredentialStore: method __init__ (line 7) | def __init__(self, credentials_by_email=None): method get_credential (line 10) | def get_credential(self, user_email): class _DummySessionStore (line 14) | class _DummySessionStore: method __init__ (line 15) | def __init__(self, user_by_session=None, credentials_by_session=None): method get_user_by_mcp_session (line 19) | def get_user_by_mcp_session(self, mcp_session_id): method get_credentials_by_mcp_session (line 22) | def get_credentials_by_mcp_session(self, mcp_session_id): function _credentials_with_scopes (line 26) | def _credentials_with_scopes(scopes): function test_prompt_select_account_when_existing_credentials_cover_scopes (line 30) | def test_prompt_select_account_when_existing_credentials_cover_scopes(mo... function test_prompt_consent_when_existing_credentials_missing_scopes (line 53) | def test_prompt_consent_when_existing_credentials_missing_scopes(monkeyp... function test_prompt_consent_when_no_existing_credentials (line 75) | def test_prompt_consent_when_no_existing_credentials(monkeypatch): function test_prompt_uses_session_mapping_when_email_not_provided (line 95) | def test_prompt_uses_session_mapping_when_email_not_provided(monkeypatch): FILE: tests/auth/test_google_auth_stdio_preflight.py function test_get_authenticated_google_service_skips_preflight_outside_stdio (line 9) | async def test_get_authenticated_google_service_skips_preflight_outside_... FILE: tests/auth/test_oauth_callback_server.py class _DummyMinimalOAuthServer (line 6) | class _DummyMinimalOAuthServer: method __init__ (line 9) | def __init__(self, port, base_uri): method matches_endpoint (line 17) | def matches_endpoint(self, port, base_uri): method is_actually_running (line 20) | def is_actually_running(self): method start (line 23) | def start(self): method stop (line 28) | def stop(self): class _DeadThread (line 33) | class _DeadThread: method is_alive (line 34) | def is_alive(self): function test_ensure_oauth_callback_recreates_server_when_endpoint_changes (line 38) | def test_ensure_oauth_callback_recreates_server_when_endpoint_changes(mo... function test_is_actually_running_returns_false_when_server_thread_is_dead (line 72) | def test_is_actually_running_returns_false_when_server_thread_is_dead(mo... function test_is_actually_running_treats_eaddrinuse_as_callback_port_in_use (line 85) | def test_is_actually_running_treats_eaddrinuse_as_callback_port_in_use(m... function test_ensure_oauth_callback_skips_start_when_other_instance_owns_port (line 112) | def test_ensure_oauth_callback_skips_start_when_other_instance_owns_port... FILE: tests/core/test_attachment_route.py function _build_request (line 8) | def _build_request(file_id: str) -> Request: function test_serve_attachment_uses_path_param_file_id (line 31) | async def test_serve_attachment_uses_path_param_file_id(monkeypatch, tmp... function test_serve_attachment_404_when_metadata_missing (line 56) | async def test_serve_attachment_404_when_metadata_missing(monkeypatch): FILE: tests/core/test_comments.py function test_read_comments_includes_quoted_text (line 14) | async def test_read_comments_includes_quoted_text(): function test_read_comments_empty (line 65) | async def test_read_comments_empty(): function test_read_comments_with_replies (line 77) | async def test_read_comments_with_replies(): function test_create_comment (line 113) | async def test_create_comment(): FILE: tests/core/test_start_google_auth.py function test_start_google_auth_skips_preflight_outside_stdio (line 9) | async def test_start_google_auth_skips_preflight_outside_stdio(monkeypat... function test_start_google_auth_preflights_in_stdio (line 35) | async def test_start_google_auth_preflights_in_stdio(monkeypatch): FILE: tests/core/test_well_known_cache_control_middleware.py function test_well_known_cache_control_middleware_rewrites_headers (line 10) | def test_well_known_cache_control_middleware_rewrites_headers(): function test_configured_server_applies_no_cache_to_served_oauth_discovery_routes (line 54) | def test_configured_server_applies_no_cache_to_served_oauth_discovery_ro... FILE: tests/gappsscript/manual_test.py function get_credentials (line 48) | def get_credentials(): function test_list_projects (line 108) | async def test_list_projects(drive_service): function test_create_project (line 125) | async def test_create_project(service): function test_get_project (line 148) | async def test_get_project(service, script_id): function test_update_content (line 165) | async def test_update_content(service, script_id): function test_run_function (line 206) | async def test_run_function(service, script_id): function test_create_deployment (line 227) | async def test_create_deployment(service, script_id): function test_list_deployments (line 251) | async def test_list_deployments(service, script_id): function test_list_processes (line 268) | async def test_list_processes(service): function cleanup_test_project (line 285) | async def cleanup_test_project(service, script_id): function run_all_tests (line 296) | async def run_all_tests(): function main (line 347) | def main(): FILE: tests/gappsscript/test_apps_script_tools.py function test_list_script_projects (line 36) | async def test_list_script_projects(): function test_get_script_project (line 62) | async def test_get_script_project(): function test_create_script_project (line 100) | async def test_create_script_project(): function test_update_script_content (line 116) | async def test_update_script_content(): function test_run_script_function (line 138) | async def test_run_script_function(): function test_create_deployment (line 158) | async def test_create_deployment(): function test_list_deployments (line 190) | async def test_list_deployments(): function test_update_deployment (line 214) | async def test_update_deployment(): function test_delete_deployment (line 236) | async def test_delete_deployment(): function test_list_script_processes (line 252) | async def test_list_script_processes(): function test_delete_script_project (line 277) | async def test_delete_script_project(): function test_list_versions (line 290) | async def test_list_versions(): function test_create_version (line 321) | async def test_create_version(): function test_get_version (line 343) | async def test_get_version(): function test_get_script_metrics (line 366) | async def test_get_script_metrics(): function test_generate_trigger_code_daily (line 398) | def test_generate_trigger_code_daily(): function test_generate_trigger_code_on_edit (line 412) | def test_generate_trigger_code_on_edit(): function test_generate_trigger_code_invalid (line 424) | def test_generate_trigger_code_invalid(): FILE: tests/gchat/test_chat_tools.py function _make_message (line 17) | def _make_message(text="Hello", attachments=None, msg_name="spaces/S/mes... function _make_attachment (line 30) | def _make_attachment( function _unwrap (line 47) | def _unwrap(tool): function test_get_messages_shows_attachment_metadata (line 62) | async def test_get_messages_shows_attachment_metadata(mock_resolve): function test_get_messages_no_attachments_unchanged (line 90) | async def test_get_messages_no_attachments_unchanged(mock_resolve): function test_get_messages_multiple_attachments (line 117) | async def test_get_messages_multiple_attachments(mock_resolve): function test_get_messages_exposes_message_filter_and_forwards_it (line 152) | async def test_get_messages_exposes_message_filter_and_forwards_it(mock_... function test_search_messages_shows_attachment_indicator (line 190) | async def test_search_messages_shows_attachment_indicator(mock_resolve): function test_search_messages_combines_filters_and_uses_page_size (line 220) | async def test_search_messages_combines_filters_and_uses_page_size(mock_... function test_download_no_attachments (line 260) | async def test_download_no_attachments(): function test_download_invalid_index (line 277) | async def test_download_invalid_index(): function test_download_uses_api_media_endpoint (line 297) | async def test_download_uses_api_media_endpoint(): function test_download_falls_back_to_att_name (line 365) | async def test_download_falls_back_to_att_name(): function test_download_http_mode_returns_url (line 414) | async def test_download_http_mode_returns_url(): function test_download_returns_error_on_failure (line 463) | async def test_download_returns_error_on_failure(): FILE: tests/gcontacts/test_contacts_tools.py class TestFormatContact (line 18) | class TestFormatContact: method test_format_basic_contact (line 21) | def test_format_basic_contact(self): method test_format_contact_with_organization (line 37) | def test_format_contact_with_organization(self): method test_format_contact_organization_name_only (line 50) | def test_format_contact_organization_name_only(self): method test_format_contact_job_title_only (line 61) | def test_format_contact_job_title_only(self): method test_format_contact_detailed (line 72) | def test_format_contact_detailed(self): method test_format_contact_detailed_birthday_without_year (line 92) | def test_format_contact_detailed_birthday_without_year(self): method test_format_contact_detailed_long_biography (line 103) | def test_format_contact_detailed_long_biography(self): method test_format_contact_empty (line 117) | def test_format_contact_empty(self): method test_format_contact_unknown_resource (line 125) | def test_format_contact_unknown_resource(self): method test_format_contact_multiple_emails (line 133) | def test_format_contact_multiple_emails(self): method test_format_contact_multiple_phones (line 148) | def test_format_contact_multiple_phones(self): method test_format_contact_multiple_urls (line 163) | def test_format_contact_multiple_urls(self): class TestBuildPersonBody (line 179) | class TestBuildPersonBody: method test_build_basic_body (line 182) | def test_build_basic_body(self): method test_build_body_with_phone (line 194) | def test_build_body_with_phone(self): method test_build_body_with_organization (line 200) | def test_build_body_with_organization(self): method test_build_body_organization_only (line 212) | def test_build_body_organization_only(self): method test_build_body_job_title_only (line 219) | def test_build_body_job_title_only(self): method test_build_body_with_notes (line 226) | def test_build_body_with_notes(self): method test_build_body_with_address (line 233) | def test_build_body_with_address(self): method test_build_empty_body (line 241) | def test_build_empty_body(self): method test_build_body_given_name_only (line 247) | def test_build_body_given_name_only(self): method test_build_body_family_name_only (line 254) | def test_build_body_family_name_only(self): method test_build_full_body (line 261) | def test_build_full_body(self): class TestImports (line 284) | class TestImports: method test_import_contacts_tools (line 287) | def test_import_contacts_tools(self): method test_import_group_tools (line 296) | def test_import_group_tools(self): method test_import_batch_tools (line 304) | def test_import_batch_tools(self): class TestConstants (line 311) | class TestConstants: method test_default_person_fields (line 314) | def test_default_person_fields(self): method test_detailed_person_fields (line 323) | def test_detailed_person_fields(self): method test_contact_group_fields (line 333) | def test_contact_group_fields(self): FILE: tests/gdocs/test_docs_markdown.py class TestTextFormatting (line 224) | class TestTextFormatting: method test_plain_text (line 225) | def test_plain_text(self): method test_bold (line 229) | def test_bold(self): method test_italic (line 233) | def test_italic(self): class TestHeadings (line 238) | class TestHeadings: method test_title (line 239) | def test_title(self): method test_h1 (line 243) | def test_h1(self): method test_h2 (line 247) | def test_h2(self): class TestTables (line 252) | class TestTables: method test_table_header (line 253) | def test_table_header(self): method test_table_separator (line 257) | def test_table_separator(self): method test_table_row (line 261) | def test_table_row(self): class TestLists (line 266) | class TestLists: method test_unordered (line 267) | def test_unordered(self): class TestChecklists (line 315) | class TestChecklists: method test_unchecked (line 316) | def test_unchecked(self): method test_checked (line 320) | def test_checked(self): method test_checked_no_strikethrough (line 324) | def test_checked_no_strikethrough(self): method test_regular_bullet_not_checklist (line 329) | def test_regular_bullet_not_checklist(self): class TestEmptyDoc (line 336) | class TestEmptyDoc: method test_empty (line 337) | def test_empty(self): class TestParseComments (line 345) | class TestParseComments: method test_filters_resolved (line 346) | def test_filters_resolved(self): method test_includes_resolved (line 367) | def test_includes_resolved(self): method test_anchor_text (line 387) | def test_anchor_text(self): class TestInlineComments (line 406) | class TestInlineComments: method test_inserts_footnote (line 407) | def test_inserts_footnote(self): method test_unmatched_goes_to_appendix (line 422) | def test_unmatched_goes_to_appendix(self): class TestAppendixComments (line 438) | class TestAppendixComments: method test_structure (line 439) | def test_structure(self): method test_empty (line 454) | def test_empty(self): FILE: tests/gdocs/test_paragraph_style.py class TestBuildParagraphStyle (line 17) | class TestBuildParagraphStyle: method test_no_params_returns_empty (line 18) | def test_no_params_returns_empty(self): method test_heading_zero_maps_to_normal_text (line 23) | def test_heading_zero_maps_to_normal_text(self): method test_heading_maps_to_named_style (line 27) | def test_heading_maps_to_named_style(self): method test_named_style_type_accepts_title (line 31) | def test_named_style_type_accepts_title(self): method test_heading_out_of_range_raises (line 36) | def test_heading_out_of_range_raises(self): method test_line_spacing_scaled_to_percentage (line 40) | def test_line_spacing_scaled_to_percentage(self): method test_dimension_field_uses_pt_unit (line 44) | def test_dimension_field_uses_pt_unit(self): method test_multiple_params_combined (line 48) | def test_multiple_params_combined(self): class TestCreateUpdateParagraphStyleRequest (line 56) | class TestCreateUpdateParagraphStyleRequest: method test_returns_none_when_no_styles (line 57) | def test_returns_none_when_no_styles(self): method test_produces_correct_api_structure (line 60) | def test_produces_correct_api_structure(self): method test_supports_subtitle_named_style (line 67) | def test_supports_subtitle_named_style(self): class TestValidateParagraphStyleParams (line 76) | class TestValidateParagraphStyleParams: method vm (line 78) | def vm(self): method test_all_none_rejected (line 81) | def test_all_none_rejected(self, vm): method test_wrong_types_rejected (line 85) | def test_wrong_types_rejected(self, vm): method test_negative_indent_start_rejected (line 90) | def test_negative_indent_start_rejected(self, vm): method test_negative_indent_first_line_allowed (line 95) | def test_negative_indent_first_line_allowed(self, vm): method test_named_style_type_accepts_title_and_subtitle (line 99) | def test_named_style_type_accepts_title_and_subtitle(self, vm): method test_heading_level_and_named_style_type_are_mutually_exclusive (line 103) | def test_heading_level_and_named_style_type_are_mutually_exclusive(sel... method test_batch_validation_wired_up (line 110) | def test_batch_validation_wired_up(self, vm): class TestBatchManagerIntegration (line 127) | class TestBatchManagerIntegration: method manager (line 129) | def manager(self): method test_build_request_and_description (line 134) | def test_build_request_and_description(self, manager): method test_build_request_and_description_for_named_style_type (line 148) | def test_build_request_and_description_for_named_style_type(self, mana... method test_end_to_end_execute (line 163) | async def test_end_to_end_execute(self, manager): method test_end_to_end_execute_with_named_style_type (line 180) | async def test_end_to_end_execute_with_named_style_type(self, manager): FILE: tests/gdocs/test_strikethrough.py function _unwrap (line 24) | def _unwrap(tool): function _schema_subset (line 32) | def _schema_subset(): class TestBuildTextStyleStrikethrough (line 40) | class TestBuildTextStyleStrikethrough: method test_strikethrough_true (line 41) | def test_strikethrough_true(self): method test_strikethrough_false (line 46) | def test_strikethrough_false(self): method test_strikethrough_none_excluded (line 51) | def test_strikethrough_none_excluded(self): method test_strikethrough_combined_with_bold (line 56) | def test_strikethrough_combined_with_bold(self): class TestCreateFormatTextRequestStrikethrough (line 64) | class TestCreateFormatTextRequestStrikethrough: method test_strikethrough_produces_correct_api_structure (line 65) | def test_strikethrough_produces_correct_api_structure(self): method test_strikethrough_with_tab_id (line 72) | def test_strikethrough_with_tab_id(self): class TestValidateTextFormattingStrikethrough (line 78) | class TestValidateTextFormattingStrikethrough: method vm (line 80) | def vm(self): method test_strikethrough_only_is_valid (line 83) | def test_strikethrough_only_is_valid(self, vm): method test_strikethrough_wrong_type_rejected (line 87) | def test_strikethrough_wrong_type_rejected(self, vm): method test_strikethrough_in_all_none_check (line 92) | def test_strikethrough_in_all_none_check(self, vm): class TestBatchManagerIntegration (line 98) | class TestBatchManagerIntegration: method manager (line 100) | def manager(self): method test_build_request_with_strikethrough (line 105) | def test_build_request_with_strikethrough(self, manager): method test_batch_validation_with_strikethrough (line 118) | def test_batch_validation_with_strikethrough(self): method test_end_to_end_execute_strikethrough (line 131) | async def test_end_to_end_execute_strikethrough(self, manager): class TestPublicToolWiring (line 148) | class TestPublicToolWiring: method service (line 150) | def service(self): method test_modify_doc_text_public_tool_includes_strikethrough_in_request (line 156) | async def test_modify_doc_text_public_tool_includes_strikethrough_in_r... method test_batch_update_doc_public_tool_includes_strikethrough_in_request (line 176) | async def test_batch_update_doc_public_tool_includes_strikethrough_in_... class TestDocsToolSchemaGolden (line 201) | class TestDocsToolSchemaGolden: method test_docs_tool_schema_matches_golden (line 202) | def test_docs_tool_schema_matches_golden(self): FILE: tests/gdocs/test_suggestions_view_mode.py function _unwrap (line 14) | def _unwrap(tool): function test_get_doc_content_passes_suggestions_view_mode_to_docs_api (line 23) | async def test_get_doc_content_passes_suggestions_view_mode_to_docs_api(): function test_get_doc_content_rejects_invalid_suggestions_view_mode (line 66) | async def test_get_doc_content_rejects_invalid_suggestions_view_mode(): function test_get_doc_as_markdown_passes_suggestions_view_mode_to_docs_api (line 79) | async def test_get_doc_as_markdown_passes_suggestions_view_mode_to_docs_... function test_get_doc_as_markdown_rejects_invalid_suggestions_view_mode (line 105) | async def test_get_doc_as_markdown_rejects_invalid_suggestions_view_mode(): FILE: tests/gdrive/test_create_drive_folder.py function _make_service (line 16) | def _make_service(created_response): function test_create_folder_root_skips_resolve (line 29) | async def test_create_folder_root_skips_resolve(): function test_create_folder_custom_parent_resolves (line 56) | async def test_create_folder_custom_parent_resolves(): function test_create_folder_passes_correct_metadata (line 93) | async def test_create_folder_passes_correct_metadata(): function test_create_folder_missing_webviewlink (line 126) | async def test_create_folder_missing_webviewlink(): FILE: tests/gdrive/test_drive_tools.py function _unwrap (line 20) | def _unwrap(tool): function test_search_drive_files_page_token_passed_to_api (line 38) | async def test_search_drive_files_page_token_passed_to_api(): function test_search_drive_files_next_page_token_in_output (line 65) | async def test_search_drive_files_next_page_token_in_output(): function test_search_drive_files_no_next_page_token_when_absent (line 91) | async def test_search_drive_files_no_next_page_token_when_absent(): function test_list_drive_items_page_token_passed_to_api (line 123) | async def test_list_drive_items_page_token_passed_to_api(mock_resolve_fo... function test_list_drive_items_next_page_token_in_output (line 151) | async def test_list_drive_items_next_page_token_in_output(mock_resolve_f... function test_list_drive_items_no_next_page_token_when_absent (line 178) | async def test_list_drive_items_no_next_page_token_when_absent(mock_reso... function _make_file (line 207) | def _make_file( function test_create_drive_folder (line 233) | async def test_create_drive_folder(): function test_build_params_detailed_true_includes_extra_fields (line 271) | def test_build_params_detailed_true_includes_extra_fields(): function test_build_params_detailed_false_omits_extra_fields (line 279) | def test_build_params_detailed_false_omits_extra_fields(): function test_build_params_detailed_false_keeps_core_fields (line 287) | def test_build_params_detailed_false_keeps_core_fields(): function test_build_params_default_is_detailed (line 295) | def test_build_params_default_is_detailed(): function test_search_detailed_true_output_includes_metadata (line 308) | async def test_search_detailed_true_output_includes_metadata(): function test_search_detailed_false_output_excludes_metadata (line 336) | async def test_search_detailed_false_output_excludes_metadata(): function test_search_detailed_true_with_size (line 365) | async def test_search_detailed_true_with_size(): function test_search_detailed_true_requests_extra_api_fields (line 385) | async def test_search_detailed_true_requests_extra_api_fields(): function test_search_detailed_false_requests_compact_api_fields (line 404) | async def test_search_detailed_false_requests_compact_api_fields(): function test_search_default_detailed_matches_detailed_true (line 423) | async def test_search_default_detailed_matches_detailed_true(): function test_list_detailed_true_output_includes_metadata (line 459) | async def test_list_detailed_true_output_includes_metadata(mock_resolve_... function test_list_detailed_false_output_excludes_metadata (line 489) | async def test_list_detailed_false_output_excludes_metadata(mock_resolve... function test_list_detailed_true_with_size (line 520) | async def test_list_detailed_true_with_size(mock_resolve_folder): function test_list_detailed_true_requests_extra_api_fields (line 542) | async def test_list_detailed_true_requests_extra_api_fields(mock_resolve... function test_list_detailed_false_requests_compact_api_fields (line 563) | async def test_list_detailed_false_requests_compact_api_fields(mock_reso... function test_search_free_text_returns_results (line 588) | async def test_search_free_text_returns_results(): function test_search_no_results (line 609) | async def test_search_no_results(): function test_list_items_basic (line 625) | async def test_list_items_basic(mock_resolve_folder): function test_list_items_no_results (line 649) | async def test_list_items_no_results(mock_resolve_folder): function test_search_file_type_folder_adds_mime_filter (line 670) | async def test_search_file_type_folder_adds_mime_filter(): function test_search_file_type_document_alias (line 694) | async def test_search_file_type_document_alias(): function test_search_file_type_plural_alias (line 711) | async def test_search_file_type_plural_alias(): function test_search_file_type_sheet_alias (line 728) | async def test_search_file_type_sheet_alias(): function test_search_file_type_raw_mime (line 745) | async def test_search_file_type_raw_mime(): function test_search_file_type_none_no_mime_filter (line 765) | async def test_search_file_type_none_no_mime_filter(): function test_search_file_type_structured_query_combined (line 782) | async def test_search_file_type_structured_query_combined(): function test_search_file_type_unknown_raises_value_error (line 801) | async def test_search_file_type_unknown_raises_value_error(): function test_list_items_file_type_folder_adds_mime_filter (line 816) | async def test_list_items_file_type_folder_adds_mime_filter(mock_resolve... function test_list_items_file_type_spreadsheet (line 843) | async def test_list_items_file_type_spreadsheet(mock_resolve_folder): function test_list_items_file_type_raw_mime (line 862) | async def test_list_items_file_type_raw_mime(mock_resolve_folder): function test_list_items_file_type_none_no_mime_filter (line 881) | async def test_list_items_file_type_none_no_mime_filter(mock_resolve_fol... function test_list_items_file_type_unknown_raises (line 900) | async def test_list_items_file_type_unknown_raises(mock_resolve_folder): function test_search_or_query_is_grouped_before_mime_filter (line 920) | async def test_search_or_query_is_grouped_before_mime_filter(): function test_resolve_file_type_mime_invalid_mime_raises (line 943) | def test_resolve_file_type_mime_invalid_mime_raises(): function test_resolve_file_type_mime_strips_whitespace (line 951) | def test_resolve_file_type_mime_strips_whitespace(): function test_resolve_file_type_mime_normalizes_case (line 958) | def test_resolve_file_type_mime_normalizes_case(): function test_resolve_file_type_mime_empty_raises (line 965) | def test_resolve_file_type_mime_empty_raises(): FILE: tests/gdrive/test_ssrf_protections.py function test_resolve_and_validate_host_fails_closed_on_dns_error (line 17) | def test_resolve_and_validate_host_fails_closed_on_dns_error(monkeypatch): function test_resolve_and_validate_host_rejects_ipv6_private (line 29) | def test_resolve_and_validate_host_rejects_ipv6_private(monkeypatch): function test_resolve_and_validate_host_deduplicates_addresses (line 49) | def test_resolve_and_validate_host_deduplicates_addresses(monkeypatch): function test_fetch_url_with_pinned_ip_uses_pinned_target_and_host_header (line 86) | async def test_fetch_url_with_pinned_ip_uses_pinned_target_and_host_head... function test_ssrf_safe_fetch_follows_relative_redirects (line 129) | async def test_ssrf_safe_fetch_follows_relative_redirects(monkeypatch): function test_ssrf_safe_fetch_rejects_disallowed_redirect_scheme (line 152) | async def test_ssrf_safe_fetch_rejects_disallowed_redirect_scheme(monkey... FILE: tests/gforms/test_forms_tools.py function test_batch_update_form_multiple_requests (line 19) | async def test_batch_update_form_multiple_requests(): function test_batch_update_form_single_request (line 72) | async def test_batch_update_form_single_request(): function test_batch_update_form_empty_replies (line 117) | async def test_batch_update_form_empty_replies(): function test_batch_update_form_no_replies_key (line 147) | async def test_batch_update_form_no_replies_key(): function test_batch_update_form_url_in_response (line 175) | async def test_batch_update_form_url_in_response(): function test_batch_update_form_mixed_reply_types (line 198) | async def test_batch_update_form_mixed_reply_types(): function test_serialize_form_item_choice_question_includes_ids_and_options (line 234) | def test_serialize_form_item_choice_question_includes_ids_and_options(): function test_serialize_form_item_grid_includes_row_and_column_structure (line 261) | def test_serialize_form_item_grid_includes_row_and_column_structure(): function test_get_form_returns_structured_item_metadata (line 295) | async def test_get_form_returns_structured_item_metadata(): FILE: tests/gmail/test_attachment_fix.py function test_urlsafe_b64decode_already_handles_crlf (line 8) | def test_urlsafe_b64decode_already_handles_crlf(): function test_os_open_without_o_binary_corrupts_on_windows (line 18) | def test_os_open_without_o_binary_corrupts_on_windows(tmp_path): function test_os_open_with_o_binary_preserves_bytes (line 39) | def test_os_open_with_o_binary_preserves_bytes(tmp_path): function isolated_storage (line 59) | def isolated_storage(tmp_path, monkeypatch): function test_save_attachment_uses_binary_mode (line 67) | def test_save_attachment_uses_binary_mode(isolated_storage): function test_save_attachment_preserves_various_binary_formats (line 93) | def test_save_attachment_preserves_various_binary_formats(isolated_stora... FILE: tests/gmail/test_draft_gmail_message.py function _unwrap (line 14) | def _unwrap(tool): function _thread_response (line 22) | def _thread_response(*message_ids): function test_draft_gmail_message_reports_actual_attachment_count (line 36) | async def test_draft_gmail_message_reports_actual_attachment_count( function test_draft_gmail_message_raises_when_no_attachments_are_added (line 69) | async def test_draft_gmail_message_raises_when_no_attachments_are_added( function test_draft_gmail_message_appends_gmail_signature_html (line 91) | async def test_draft_gmail_message_appends_gmail_signature_html(): function test_draft_gmail_message_autofills_reply_headers_from_thread (line 127) | async def test_draft_gmail_message_autofills_reply_headers_from_thread(): function test_draft_gmail_message_uses_explicit_in_reply_to_when_filling_references (line 172) | async def test_draft_gmail_message_uses_explicit_in_reply_to_when_fillin... function test_draft_gmail_message_uses_explicit_references_when_filling_in_reply_to (line 204) | async def test_draft_gmail_message_uses_explicit_references_when_filling... function test_draft_gmail_message_gracefully_degrades_when_thread_fetch_fails (line 236) | async def test_draft_gmail_message_gracefully_degrades_when_thread_fetch... function test_draft_gmail_message_gracefully_degrades_when_thread_has_no_messages (line 264) | async def test_draft_gmail_message_gracefully_degrades_when_thread_has_n... FILE: tests/gsheets/test_format_sheet_range.py function create_mock_service (line 18) | def create_mock_service(): function test_format_wrap_strategy_wrap (line 30) | async def test_format_wrap_strategy_wrap(): function test_format_wrap_strategy_clip (line 51) | async def test_format_wrap_strategy_clip(): function test_format_wrap_strategy_overflow (line 70) | async def test_format_wrap_strategy_overflow(): function test_format_horizontal_alignment_center (line 88) | async def test_format_horizontal_alignment_center(): function test_format_horizontal_alignment_left (line 107) | async def test_format_horizontal_alignment_left(): function test_format_horizontal_alignment_right (line 125) | async def test_format_horizontal_alignment_right(): function test_format_vertical_alignment_top (line 143) | async def test_format_vertical_alignment_top(): function test_format_vertical_alignment_middle (line 161) | async def test_format_vertical_alignment_middle(): function test_format_vertical_alignment_bottom (line 179) | async def test_format_vertical_alignment_bottom(): function test_format_bold_true (line 197) | async def test_format_bold_true(): function test_format_italic_true (line 215) | async def test_format_italic_true(): function test_format_font_size (line 233) | async def test_format_font_size(): function test_format_combined_text_formatting (line 251) | async def test_format_combined_text_formatting(): function test_format_combined_alignment_and_wrap (line 274) | async def test_format_combined_alignment_and_wrap(): function test_format_all_new_params_with_existing (line 296) | async def test_format_all_new_params_with_existing(): function test_format_invalid_wrap_strategy (line 327) | async def test_format_invalid_wrap_strategy(): function test_format_invalid_horizontal_alignment (line 346) | async def test_format_invalid_horizontal_alignment(): function test_format_invalid_vertical_alignment (line 365) | async def test_format_invalid_vertical_alignment(): function test_format_case_insensitive_wrap_strategy (line 384) | async def test_format_case_insensitive_wrap_strategy(): function test_format_case_insensitive_alignment (line 402) | async def test_format_case_insensitive_alignment(): function test_format_confirmation_message_includes_new_params (line 422) | async def test_format_confirmation_message_includes_new_params(): FILE: tests/test_main_permissions_tier.py function test_resolve_permissions_mode_selection_without_tier (line 11) | def test_resolve_permissions_mode_selection_without_tier(): function test_resolve_permissions_mode_selection_with_tier_filters_services (line 20) | def test_resolve_permissions_mode_selection_with_tier_filters_services(m... function test_narrow_permissions_to_services_keeps_selected_order (line 35) | def test_narrow_permissions_to_services_keeps_selected_order(): function test_narrow_permissions_to_services_drops_non_selected_services (line 41) | def test_narrow_permissions_to_services_drops_non_selected_services(): function test_permissions_and_tools_flags_are_rejected (line 47) | def test_permissions_and_tools_flags_are_rejected(monkeypatch, capsys): FILE: tests/test_permissions.py class TestParsePermissionsArg (line 35) | class TestParsePermissionsArg: method test_single_valid_entry (line 38) | def test_single_valid_entry(self): method test_multiple_valid_entries (line 42) | def test_multiple_valid_entries(self): method test_all_services_at_readonly (line 46) | def test_all_services_at_readonly(self): method test_missing_colon_raises (line 51) | def test_missing_colon_raises(self): method test_duplicate_service_raises (line 55) | def test_duplicate_service_raises(self): method test_unknown_service_raises (line 59) | def test_unknown_service_raises(self): method test_unknown_level_raises (line 63) | def test_unknown_level_raises(self): method test_empty_list_returns_empty (line 67) | def test_empty_list_returns_empty(self): method test_extra_colon_in_value (line 70) | def test_extra_colon_in_value(self): method test_tasks_manage_is_valid_level (line 75) | def test_tasks_manage_is_valid_level(self): class TestGetScopesForPermission (line 81) | class TestGetScopesForPermission: method test_gmail_readonly_returns_readonly_scope (line 84) | def test_gmail_readonly_returns_readonly_scope(self): method test_gmail_organize_includes_readonly (line 88) | def test_gmail_organize_includes_readonly(self): method test_gmail_drafts_includes_organize_and_readonly (line 95) | def test_gmail_drafts_includes_organize_and_readonly(self): method test_drive_readonly_excludes_full (line 101) | def test_drive_readonly_excludes_full(self): method test_drive_full_includes_readonly (line 107) | def test_drive_full_includes_readonly(self): method test_unknown_service_raises (line 112) | def test_unknown_service_raises(self): method test_unknown_level_raises (line 116) | def test_unknown_level_raises(self): method test_no_duplicate_scopes (line 120) | def test_no_duplicate_scopes(self): method test_tasks_manage_includes_write_scope (line 129) | def test_tasks_manage_includes_write_scope(self): method test_tasks_full_includes_write_scope (line 135) | def test_tasks_full_includes_write_scope(self): function _reset_permissions_state (line 143) | def _reset_permissions_state(): class TestIsActionDenied (line 150) | class TestIsActionDenied: method test_no_permissions_mode_allows_all (line 153) | def test_no_permissions_mode_allows_all(self): method test_tasks_full_allows_delete (line 158) | def test_tasks_full_allows_delete(self): method test_tasks_manage_denies_delete (line 163) | def test_tasks_manage_denies_delete(self): method test_tasks_manage_allows_create (line 168) | def test_tasks_manage_allows_create(self): method test_tasks_manage_allows_update (line 173) | def test_tasks_manage_allows_update(self): method test_tasks_manage_allows_move (line 178) | def test_tasks_manage_allows_move(self): method test_tasks_manage_denies_clear_completed (line 183) | def test_tasks_manage_denies_clear_completed(self): method test_tasks_full_allows_clear_completed (line 188) | def test_tasks_full_allows_clear_completed(self): method test_service_not_in_permissions_allows_all (line 193) | def test_service_not_in_permissions_allows_all(self): method test_service_without_denied_actions_allows_all (line 198) | def test_service_without_denied_actions_allows_all(self): FILE: tests/test_scopes.py class TestDocsScopes (line 39) | class TestDocsScopes: method test_docs_includes_drive_readonly (line 42) | def test_docs_includes_drive_readonly(self): method test_docs_includes_drive_file (line 47) | def test_docs_includes_drive_file(self): method test_docs_does_not_include_full_drive (line 52) | def test_docs_does_not_include_full_drive(self): class TestSheetsScopes (line 58) | class TestSheetsScopes: method test_sheets_includes_drive_readonly (line 61) | def test_sheets_includes_drive_readonly(self): method test_sheets_does_not_include_full_drive (line 66) | def test_sheets_does_not_include_full_drive(self): class TestCombinedScopes (line 72) | class TestCombinedScopes: method test_docs_sheets_no_duplicate_drive_readonly (line 75) | def test_docs_sheets_no_duplicate_drive_readonly(self): method test_docs_sheets_returns_unique_scopes (line 80) | def test_docs_sheets_returns_unique_scopes(self): class TestReadOnlyScopes (line 86) | class TestReadOnlyScopes: method setup_method (line 89) | def setup_method(self): method teardown_method (line 92) | def teardown_method(self): method test_docs_readonly_includes_drive_readonly (line 95) | def test_docs_readonly_includes_drive_readonly(self): method test_docs_readonly_excludes_drive_file (line 101) | def test_docs_readonly_excludes_drive_file(self): method test_sheets_readonly_includes_drive_readonly (line 107) | def test_sheets_readonly_includes_drive_readonly(self): class TestHasRequiredScopes (line 114) | class TestHasRequiredScopes: method test_exact_match (line 117) | def test_exact_match(self): method test_missing_scope_fails (line 121) | def test_missing_scope_fails(self): method test_empty_available_fails (line 125) | def test_empty_available_fails(self): method test_empty_required_passes (line 129) | def test_empty_required_passes(self): method test_none_available_fails (line 134) | def test_none_available_fails(self): method test_none_available_empty_required_passes (line 138) | def test_none_available_empty_required_passes(self): method test_gmail_modify_covers_readonly (line 143) | def test_gmail_modify_covers_readonly(self): method test_gmail_modify_covers_send (line 146) | def test_gmail_modify_covers_send(self): method test_gmail_modify_covers_compose (line 149) | def test_gmail_modify_covers_compose(self): method test_gmail_modify_covers_labels (line 152) | def test_gmail_modify_covers_labels(self): method test_gmail_modify_does_not_cover_settings (line 155) | def test_gmail_modify_does_not_cover_settings(self): method test_gmail_modify_covers_multiple_children (line 161) | def test_gmail_modify_covers_multiple_children(self): method test_drive_covers_readonly (line 169) | def test_drive_covers_readonly(self): method test_drive_covers_file (line 172) | def test_drive_covers_file(self): method test_drive_readonly_does_not_cover_full (line 175) | def test_drive_readonly_does_not_cover_full(self): method test_calendar_covers_readonly (line 180) | def test_calendar_covers_readonly(self): method test_sheets_write_covers_readonly (line 183) | def test_sheets_write_covers_readonly(self): method test_contacts_covers_readonly (line 186) | def test_contacts_covers_readonly(self): method test_mixed_exact_and_hierarchy (line 190) | def test_mixed_exact_and_hierarchy(self): method test_mixed_partial_failure (line 196) | def test_mixed_partial_failure(self): class TestGranularPermissionsScopes (line 203) | class TestGranularPermissionsScopes: method setup_method (line 206) | def setup_method(self): method teardown_method (line 210) | def teardown_method(self): method test_permissions_mode_returns_base_plus_permission_scopes (line 214) | def test_permissions_mode_returns_base_plus_permission_scopes(self): method test_permissions_mode_overrides_read_only_and_full_maps (line 223) | def test_permissions_mode_overrides_read_only_and_full_maps(self):