Files
wehub-resource-sync bcbd1bdb22
Integ / changes (push) Has been skipped
Pre-commit / pre-commit (push) Failing after 1s
CLI exit codes / changes (push) Has been skipped
Test (Install) / changes (push) Has been skipped
Test (Python) / changes (push) Has been skipped
Test (TypeScript) / changes (push) Has been skipped
CLI exit codes / cli-gate (push) Has been cancelled
Test (Install) / test-install-gate (push) Has been cancelled
Integ / integ-gate (push) Has been cancelled
Test (Python) / test-python-gate (push) Has been cancelled
Test (TypeScript) / test-typescript-gate (push) Has been cancelled
Test (Install) / python-minimal (3.12) (push) Has been cancelled
Test (Install) / python-minimal (3.11) (push) Has been cancelled
Test (Install) / python-extra (agno, mirage.agents.agno) (push) Has been cancelled
Test (Install) / python-extra (chroma, mirage.resource.chroma) (push) Has been cancelled
Test (Install) / python-extra (pdf, mirage.core.filetype.pdf) (push) Has been cancelled
Integ / integ (push) Has been cancelled
Integ / integ-database (push) Has been cancelled
Integ / integ-database-ts (push) Has been cancelled
Integ / integ-data (push) Has been cancelled
Integ / integ-ssh (push) Has been cancelled
Integ / integ-ssh-ts (push) Has been cancelled
Test (Python) / audit (push) Has been cancelled
Test (TypeScript) / test (push) Has been cancelled
Test (TypeScript) / python-fs-shim (push) Has been cancelled
CLI exit codes / Python CLI (push) Has been cancelled
CLI exit codes / TypeScript CLI (push) Has been cancelled
CLI exit codes / Cross-language snapshot interop (push) Has been cancelled
Test (Python) / test (push) Has been cancelled
Test (Python) / import-isolation (deepagents, openai, mirage.agents.openai_agents) (push) Has been cancelled
Test (Python) / import-isolation (deepagents, pydantic-ai, mirage.agents.pydantic_ai) (push) Has been cancelled
Integ / integ-ts (push) Has been cancelled
Integ / integ-fuse (push) Has been cancelled
Test (Install) / python-extra (databricks, mirage.resource.databricks_volume) (push) Has been cancelled
Test (Install) / python-extra (deepagents, mirage.agents.langchain) (push) Has been cancelled
Test (Install) / python-extra (email, mirage.resource.email) (push) Has been cancelled
Test (Install) / python-extra (fuse, mirage.fuse.mount) (push) Has been cancelled
Test (Install) / python-extra (hdf5, mirage.core.filetype.hdf5) (push) Has been cancelled
Test (Install) / python-extra (hf, mirage.resource.hf_buckets) (push) Has been cancelled
Test (Install) / python-extra (lancedb, mirage.resource.lancedb) (push) Has been cancelled
Test (Install) / python-extra (langfuse, mirage.resource.langfuse) (push) Has been cancelled
Test (Install) / python-extra (mongodb, mirage.resource.mongodb) (push) Has been cancelled
Test (Install) / python-extra (nextcloud, mirage.resource.nextcloud) (push) Has been cancelled
Test (Install) / python-extra (openai, mirage.agents.openai_agents) (push) Has been cancelled
Test (Install) / python-extra (openhands, mirage.agents.openhands, 3.12) (push) Has been cancelled
Test (Install) / python-extra (parquet, mirage.core.filetype.parquet) (push) Has been cancelled
Test (Install) / python-extra (postgres, mirage.resource.postgres) (push) Has been cancelled
Test (Install) / python-extra (pydantic-ai, mirage.agents.pydantic_ai) (push) Has been cancelled
Test (Install) / python-extra (qdrant, mirage.resource.qdrant) (push) Has been cancelled
Test (Install) / python-extra (redis, mirage.resource.redis) (push) Has been cancelled
Test (Install) / python-extra (s3, mirage.resource.s3) (push) Has been cancelled
Test (Install) / python-extra (ssh, mirage.resource.ssh) (push) Has been cancelled
Test (Install) / ts-minimal (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:30:44 +08:00

399 lines
13 KiB
Plaintext

---
title: Google Drive
description: Mount Google Drive folders and files, including Docs, Sheets, and Slides, as a Mirage virtual filesystem.
icon: google
---
The Google Drive resource exposes a Google Drive account as a virtual
filesystem mounted at some prefix such as `/gdrive/`.
For Google OAuth setup, see [Google Workspace Setup](/python/setup/google).
## Config
```python
import os
from mirage import MountMode, Workspace
from mirage.resource.gdrive import GoogleDriveConfig, GoogleDriveResource
config = GoogleDriveConfig(
client_id=os.environ["GOOGLE_CLIENT_ID"],
client_secret=os.environ["GOOGLE_CLIENT_SECRET"],
refresh_token=os.environ["GOOGLE_REFRESH_TOKEN"],
)
resource = GoogleDriveResource(config=config)
ws = Workspace({"/gdrive": resource}, mode=MountMode.READ)
```
## Filesystem Layout
```text
/gdrive/
<folder>/
<file>
<subfolder>/
...
<name>.gdoc.json
<name>.gsheet.json
<name>.gslide.json
<shared-drive>/
<file>
<folder>/
```
Example:
```text
/gdrive/
Projects/
spec.pdf
roadmap.gsheet.json
Budget/
Q1.gsheet.json
Q2.gsheet.json
Notes/
meeting.gdoc.json
Presentations/
quarterly_review.gslide.json
Team Drive/
shared-spec.pdf
data.csv
report.pdf
```
The mount mirrors the actual Google Drive folder hierarchy. The root
contains the Drive API `root` folder plus each Shared Drive visible to
the user. Shared Drives appear as top-level directories. Duplicate names
receive a `[Shared Drive]` suffix and, when needed, a numeric suffix.
Subfolders appear as directories, and regular files keep their original names.
### Synthetic Extensions
Google Workspace files cannot be downloaded as raw bytes, so they
are exposed with synthetic extensions and read via their respective
APIs:
| Extension | Type | Read via |
| -------------- | ------------- | ---------- |
| `.gdoc.json` | Google Docs | Docs API |
| `.gsheet.json` | Google Sheets | Sheets API |
| `.gslide.json` | Google Slides | Slides API |
Regular files (PDFs, images, CSVs, etc.) are downloaded directly
from Drive. Large regular files use streaming.
## Cache
The Google Drive resource uses `IndexCacheStore` (same as Slack,
Gmail, and other resources). Index entries store folder IDs, file
IDs, and file metadata. There is no separate content cache -- file
content caching is handled by the workspace `IOResult` mechanism.
## Example
```python
import asyncio
import os
from dotenv import load_dotenv
from mirage import MountMode, Workspace
from mirage.resource.gdrive import GoogleDriveConfig, GoogleDriveResource
load_dotenv(".env.development")
config = GoogleDriveConfig(
client_id=os.environ["GOOGLE_CLIENT_ID"],
client_secret=os.environ["GOOGLE_CLIENT_SECRET"],
refresh_token=os.environ["GOOGLE_REFRESH_TOKEN"],
)
resource = GoogleDriveResource(config=config)
async def main():
ws = Workspace({"/gdrive": resource}, mode=MountMode.READ)
# List root
r = await ws.execute("ls /gdrive/ | head -n 10")
print(await r.stdout_str())
# Browse a subfolder
r = await ws.execute("ls /gdrive/Projects/")
print(await r.stdout_str())
# Read a regular file
r = await ws.execute("cat /gdrive/Projects/spec.pdf | head -c 200")
print(await r.stdout_str())
# Read a Google Doc title
r = await ws.execute('jq ".title" /gdrive/Notes/meeting.gdoc.json')
print(await r.stdout_str())
# Read a Google Sheet title
r = await ws.execute(
'jq ".properties.title" /gdrive/Projects/roadmap.gsheet.json')
print(await r.stdout_str())
# Read a Google Slides deck length
r = await ws.execute(
'jq ".slides | length"'
" /gdrive/Presentations/quarterly_review.gslide.json")
print(await r.stdout_str())
# Search across all files
r = await ws.execute('rg "quarterly" /gdrive/Projects/')
print(await r.stdout_str())
# Tree view
r = await ws.execute("tree -L 2 /gdrive/")
print(await r.stdout_str())
# Create a new Google Doc
r = await ws.execute(
"gws-docs-documents-create"
' --json \'{"title": "New Doc from MIRAGE"}\'')
print(await r.stdout_str())
if __name__ == "__main__":
asyncio.run(main())
```
See `examples/google/gdrive.py` for the full working example.
## Shell Commands
Standard commands available on the mounted Google Drive tree:
| Command | Notes |
| --------------- | ------------------------------------------ |
| `ls` | List folders and files |
| `cat` | Read file content (regular or Workspace) |
| `head` / `tail` | First/last N lines or bytes |
| `grep` / `rg` | Pattern search (file or directory level) |
| `jq` | Query JSON fields on Workspace files |
| `wc` | Line/word/byte counts |
| `stat` | File metadata (name, size, type) |
| `find` | Recursive search with `-name`, `-maxdepth` |
| `tree` | Directory tree view |
| `basename` | Extract filename from path |
| `dirname` | Extract directory from path |
| `realpath` | Resolve path to absolute form |
| `nl` | Number lines of output |
| `sort` | Sort lines |
| `uniq` | Deduplicate adjacent lines |
| `cut` | Extract fields/columns |
| `awk` | Pattern-directed scanning |
| `sed` | Stream editor |
| `tr` | Translate/delete characters |
| `diff` | Compare two files |
| `rev` | Reverse lines |
| `tac` | Reverse file line order |
| `paste` | Merge lines of files |
| `join` | Join lines on a common field |
| `column` | Columnate output |
| `comm` | Compare sorted files line by line |
| `fold` | Wrap lines to a given width |
| `fmt` | Reformat paragraph text |
| `expand` | Convert tabs to spaces |
| `unexpand` | Convert spaces to tabs |
| `du` | Estimate file space usage |
| `shuf` | Randomly permute lines |
| `look` | Display lines beginning with a prefix |
| `strings` | Extract printable strings from binary |
| `base64` | Base64 encode/decode |
| `md5` | MD5 checksum |
| `sha256sum` | SHA-256 checksum |
| `xxd` | Hex dump |
| `zcat` | Read compressed files |
| `zgrep` | Search compressed files |
| `readlink` | Print resolved symbolic links |
| `cmp` | Compare two files byte by byte |
| `tsort` | Topological sort |
| `file` | Detect file type |
## Data Format Support
Google Drive may contain data files in binary columnar formats.
These are auto-converted to CSV on read. Specialized variants
of common commands handle them natively:
| Format | Extension | Specialized commands |
| ------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| Parquet | `.parquet` | `cat-parquet`, `head-parquet`, `tail-parquet`, `wc-parquet`, `stat-parquet`, `grep-parquet`, `cut-parquet`, `ls-parquet`, `file-parquet` |
| Feather | `.feather` | `cat-feather`, `head-feather`, `tail-feather`, `wc-feather`, `stat-feather`, `grep-feather`, `cut-feather`, `ls-feather`, `file-feather` |
| HDF5 | `.hdf5` | `cat-hdf5`, `head-hdf5`, `tail-hdf5`, `wc-hdf5`, `stat-hdf5`, `grep-hdf5`, `cut-hdf5`, `ls-hdf5`, `file-hdf5` |
| ORC | `.orc` | `cat-orc`, `head-orc`, `tail-orc`, `wc-orc`, `stat-orc`, `grep-orc`, `cut-orc`, `ls-orc`, `file-orc` |
Example:
```bash
cat-parquet /gdrive/data/sales.parquet
head-parquet -n 5 /gdrive/data/sales.parquet
grep-parquet "revenue" /gdrive/data/sales.parquet
wc-parquet /gdrive/data/sales.parquet
```
## Resource-Specific Commands
Google Drive registers Google Workspace write commands so that
Google-native files can be created and updated from the Drive mount.
### `gws-docs-documents-create`
Create a new Google Doc.
```bash
gws-docs-documents-create --json '{"title": "My Doc"}'
```
| Option | Required | Description |
| -------- | -------- | ---------------------------- |
| `--json` | yes | JSON body with `title` field |
Returns the created document JSON.
### `gws-docs-documents-batchUpdate`
Apply batch updates to a Google Doc.
```bash
gws-docs-documents-batchUpdate \
--params '{"documentId": "DOC_ID"}' \
--json '{"requests": [...]}'
```
| Option | Required | Description |
| ---------- | -------- | ------------------------------- |
| `--params` | yes | JSON with `documentId` |
| `--json` | yes | JSON body with `requests` array |
Returns the batch update response JSON.
### `gws-docs-write`
Append text to a Google Doc.
```bash
gws-docs-write --document DOC_ID --text "Hello from MIRAGE"
```
| Option | Required | Description |
| ------------ | -------- | -------------- |
| `--document` | yes | Google Doc ID |
| `--text` | yes | Text to append |
Returns the update response JSON.
### `gws-sheets-read`
Read values from a spreadsheet range.
```bash
gws-sheets-read --spreadsheet SHEET_ID --range "Sheet1!A1:C10"
```
| Option | Required | Description |
| --------------- | -------- | ----------------- |
| `--spreadsheet` | yes | Spreadsheet ID |
| `--range` | yes | A1 notation range |
Returns the range values.
### `gws-sheets-write`
Write values to a spreadsheet range.
```bash
gws-sheets-write \
--params '{"spreadsheetId": "SHEET_ID", "range": "Sheet1!A1:C3", "valueInputOption": "USER_ENTERED"}' \
--json '{"values": [["a", "b", "c"]]}'
```
| Option | Required | Description |
| ---------- | -------- | --------------------------------------------------------------- |
| `--params` | yes | JSON with `spreadsheetId`, `range`, optional `valueInputOption` |
| `--json` | yes | JSON body with `values` array |
Returns the update response JSON.
### `gws-sheets-append`
Append rows to a spreadsheet.
```bash
gws-sheets-append --spreadsheet SHEET_ID --range "Sheet1!A1" --values "a,b,c"
```
| Option | Required | Description |
| --------------- | -------- | ---------------------------------------------- |
| `--spreadsheet` | yes | Spreadsheet ID |
| `--range` | no | A1 notation range (defaults to `A1`) |
| `--values` | no | Comma-separated values for a single row |
| `--json-values` | no | JSON array of rows (alternative to `--values`) |
One of `--values` or `--json-values` is required. Returns the
append response JSON.
### `gws-sheets-spreadsheets-create`
Create a new spreadsheet.
```bash
gws-sheets-spreadsheets-create --json '{"properties": {"title": "My Sheet"}}'
```
| Option | Required | Description |
| -------- | -------- | --------------------------------- |
| `--json` | yes | JSON body with `properties.title` |
Returns the created spreadsheet JSON.
### `gws-sheets-spreadsheets-batchUpdate`
Apply batch updates to a spreadsheet.
```bash
gws-sheets-spreadsheets-batchUpdate \
--params '{"spreadsheetId": "SHEET_ID"}' \
--json '{"requests": [...]}'
```
| Option | Required | Description |
| ---------- | -------- | ------------------------------- |
| `--params` | yes | JSON with `spreadsheetId` |
| `--json` | yes | JSON body with `requests` array |
Returns the batch update response JSON.
### `gws-slides-presentations-create`
Create a new Google Slides presentation.
```bash
gws-slides-presentations-create --json '{"title": "My Deck"}'
```
| Option | Required | Description |
| -------- | -------- | ---------------------------- |
| `--json` | yes | JSON body with `title` field |
Returns the created presentation JSON.
### `gws-slides-presentations-batchUpdate`
Apply batch updates to a presentation.
```bash
gws-slides-presentations-batchUpdate \
--params '{"presentationId": "PRES_ID"}' \
--json '{"requests": [...]}'
```
| Option | Required | Description |
| ---------- | -------- | ------------------------------- |
| `--params` | yes | JSON with `presentationId` |
| `--json` | yes | JSON body with `requests` array |
Returns the batch update response JSON.