Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
1915c42
overlay: a Drive file's sheets and the columns derived from them can …
khj809 Oct 26, 2026
02a52fb
sheets: values.update, batchUpdate, clear and batchClear write a spre…
khj809 Oct 26, 2026
a5da764
sheets: values.append writes below the table it finds, inserting rows…
khj809 Oct 26, 2026
69b67e4
sheets: spreadsheets.create makes a workbook at the creator's Drive r…
khj809 Oct 26, 2026
7dd0f34
sheets: a create's default title and its refusals are worded as an En…
khj809 Oct 26, 2026
5d76b0d
Merge remote-tracking branch 'origin/main' into sheets-writes-159
khj809 Oct 26, 2026
cb120c6
sheets: USER_ENTERED grammar, create's number formats, locales and re…
khj809 Oct 26, 2026
8237ee3
google: the Sheets routes and their helpers live in routers/google_sh…
khj809 Oct 26, 2026
7630e22
sheets: the cell model, input reading, number display and workbook ar…
khj809 Oct 26, 2026
3d3840d
docs: writes are described as served for some vendors, and the Sheets…
khj809 Oct 26, 2026
47b47f1
docs: the Sheets write paragraph and the SDK example's write paragrap…
khj809 Oct 26, 2026
bdf5298
sheets: the docstrings the router split and the locale table lengthen…
khj809 Oct 26, 2026
f07abb5
gdocs: a document may state its paragraphs, and documents.get serves …
khj809 Oct 26, 2026
6059f50
fidelity: the google_drive walk reads documents.get, and the baseline…
khj809 Oct 26, 2026
5b1a233
docs: a document record's paragraphs are described in docs/corpus.md …
khj809 Oct 26, 2026
eff87ee
Merge branch 'main' into sheets-writes-159
khj809 Oct 26, 2026
c2171e9
gdocs: an underline a link run states reaches its newline, a link car…
khj809 Oct 26, 2026
7da86c0
tests: the Drive patch test writes past the native-file size floor, s…
khj809 Oct 26, 2026
62abae7
Merge remote-tracking branch 'origin/sheets-writes-159' into docs-str…
khj809 Oct 26, 2026
5cf9cd0
hello: the bundled corpus has documents that state their paragraphs, …
khj809 Oct 26, 2026
5bbe5f1
google: documents.get answers a reader as real does, serves the docum…
khj809 Oct 26, 2026
f58767a
fidelity: the Docs walk reads documents.get as the owner, flat and as…
khj809 Oct 26, 2026
e7b686e
Merge remote-tracking branch 'origin/main' into docs-structure-1042
khj809 Oct 27, 2026
6d2cc0e
Merge remote-tracking branch 'origin/docs-structure-1042' into docs-g…
khj809 Oct 27, 2026
84828d3
google: the fields mask helpers live in routers.google, and Sheets an…
khj809 Oct 27, 2026
92a893d
google: the typed query readers Drive, Sheets and Docs share are name…
khj809 Oct 27, 2026
26386b4
Merge remote-tracking branch 'origin/main' into docs-structure-1042
khj809 Oct 27, 2026
08e4d70
Merge remote-tracking branch 'origin/docs-structure-1042' into docs-g…
khj809 Oct 27, 2026
10376a4
Merge remote-tracking branch 'origin/main' into docs-get-params-1042
khj809 Oct 28, 2026
0d91dbe
A mask naming a child tab's commentAnchors, however deep, is the comm…
khj809 Oct 28, 2026
93ad692
Merge branch 'main' into docs-get-params-1042
khj809 Oct 28, 2026
b07bc68
Merge branch 'main' into docs-get-params-1042
khj809 Oct 28, 2026
9bac51b
The four comment paragraphs that ended a line short fill it to 100 co…
khj809 Oct 28, 2026
0b8421a
Merge branch 'main' into docs-get-params-1042
khj809 Oct 28, 2026
43c0537
Merge branch 'main' into docs-get-params-1042
khj809 Oct 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 59 additions & 48 deletions backlot/fidelity/baseline/google_drive.json
Original file line number Diff line number Diff line change
Expand Up @@ -561,19 +561,6 @@
"kind": "missing_param",
"severity": "gap"
},
"commentsViewMode": {
"kind": "missing_param",
"severity": "gap",
"note": "One family with `GET /v1/presentations/{}?commentsViewMode` and `GET /v4/spreadsheets/{}?commentsViewMode`, all three marked Developer Preview. Google's own description (Docs): \"The comments view mode to apply to the document. This allows viewing the document with comments omitted or included. If one is not specified, COMMENTS_VIEW_MODE_OMITTED is used.\" Backlot declares it on Sheets alone (`routers.google_sheets._sheets_comments_view`). Measured against the three hosts on 2026-09-29 with a user token: Sheets and Slides answer each of the four enum values 200, and `comments_view_mode_omitted` in lower case as well, and refuse `BOGUS` and the empty value with 400 `Invalid value at 'comments_view_mode' (type.googleapis.com/google.apps.sheets.v4.CommentsViewMode), \"BOGUS\"` (`google.apps.slides.v1` on Slides). Docs refuses those two the same way under `google.apps.docs.v1` and answers `COMMENTS_VIEW_MODE_UNSPECIFIED` 200, but refuses the other three with 400 `Comments view mode may only be specified if tabs content is also requested.` unless `includeTabsContent=true` or a `fields` mask naming `tabs` comes with them. With tabs requested, `COMMENTS_VIEW_MODE_INCLUDED` is refused with `Comments may only be explicitly included if inline suggestions are also explicitly requested.` until `suggestionsViewMode=SUGGESTIONS_INLINE` joins it, and `COMMENTS_VIEW_MODE_DEFAULT_FOR_CURRENT_ACCESS` beside `suggestionsViewMode=PREVIEW_WITHOUT_SUGGESTIONS` with `Comments may not be requested when previewing suggestions.` Those two Docs parameters are gaps in this file as well: this server reads neither, so the rules that tie them to this one have nothing to act on."
},
"fields": {
"kind": "missing_param",
"severity": "gap"
},
"includeTabsContent": {
"kind": "missing_param",
"severity": "gap"
},
"key": {
"kind": "missing_param",
"severity": "gap"
Expand All @@ -586,10 +573,6 @@
"kind": "missing_param",
"severity": "gap"
},
"suggestionsViewMode": {
"kind": "missing_param",
"severity": "gap"
},
"uploadType": {
"kind": "missing_param",
"severity": "gap"
Expand Down Expand Up @@ -617,7 +600,7 @@
"commentsViewMode": {
"kind": "missing_param",
"severity": "gap",
"note": "Same family as `GET /v1/documents/{}?commentsViewMode`, whose note carries the measurement on all three hosts."
"note": "One family with `GET /v1/documents/{}?commentsViewMode` and `GET /v4/spreadsheets/{}?commentsViewMode`, all three marked Developer Preview. Google's own description (Docs): \"The comments view mode to apply to the document. This allows viewing the document with comments omitted or included. If one is not specified, COMMENTS_VIEW_MODE_OMITTED is used.\" Backlot reads it on Sheets (`routers.google_sheets._sheets_comments_view`) and Docs (`routers.google_docs.docs_get`). Measured against the three hosts on 2026-09-29 with a user token: Sheets and Slides answer each of the four enum values 200, and `comments_view_mode_omitted` in lower case as well, and refuse `BOGUS` and the empty value with 400 `Invalid value at 'comments_view_mode' (type.googleapis.com/google.apps.slides.v1.CommentsViewMode), \"BOGUS\"`, where Docs refuses all but `COMMENTS_VIEW_MODE_UNSPECIFIED` unless the tabs are requested."
},
"fields": {
"kind": "missing_param",
Expand Down Expand Up @@ -1516,10 +1499,8 @@
"type": "string"
},
"tabs": {
"status": "missing",
"type": "[docs.Tab]",
"kind": "missing_field",
"severity": "gap"
"status": "implemented",
"type": "[docs.Tab]"
},
"title": {
"status": "implemented",
Expand Down Expand Up @@ -1643,63 +1624,85 @@
},
"docs.DocumentTab": {
"type_kind": "object",
"status": "missing",
"status": "implemented",
"fields": {
"body": {
"status": "missing",
"status": "implemented",
"type": "docs.Body"
},
"commentAnchors": {
"status": "missing",
"type": "map<string, docs.CommentAnchor>"
"type": "map<string, docs.CommentAnchor>",
"kind": "missing_field",
"severity": "gap"
},
"documentStyle": {
"status": "missing",
"status": "implemented",
"type": "docs.DocumentStyle"
},
"dropdownDefinitions": {
"status": "missing",
"type": "map<string, docs.DropdownDefinition>"
"type": "map<string, docs.DropdownDefinition>",
"kind": "missing_field",
"severity": "gap"
},
"footers": {
"status": "missing",
"type": "map<string, docs.Footer>"
"type": "map<string, docs.Footer>",
"kind": "missing_field",
"severity": "gap"
},
"footnotes": {
"status": "missing",
"type": "map<string, docs.Footnote>"
"type": "map<string, docs.Footnote>",
"kind": "missing_field",
"severity": "gap"
},
"headers": {
"status": "missing",
"type": "map<string, docs.Header>"
"type": "map<string, docs.Header>",
"kind": "missing_field",
"severity": "gap"
},
"inlineObjects": {
"status": "missing",
"type": "map<string, docs.InlineObject>"
"type": "map<string, docs.InlineObject>",
"kind": "missing_field",
"severity": "gap"
},
"lists": {
"status": "missing",
"type": "map<string, docs.List>"
"type": "map<string, docs.List>",
"kind": "missing_field",
"severity": "gap"
},
"namedRanges": {
"status": "missing",
"type": "map<string, docs.NamedRanges>"
"type": "map<string, docs.NamedRanges>",
"kind": "missing_field",
"severity": "gap"
},
"namedStyles": {
"status": "missing",
"status": "implemented",
"type": "docs.NamedStyles"
},
"positionedObjects": {
"status": "missing",
"type": "map<string, docs.PositionedObject>"
"type": "map<string, docs.PositionedObject>",
"kind": "missing_field",
"severity": "gap"
},
"suggestedDocumentStyleChanges": {
"status": "missing",
"type": "map<string, docs.SuggestedDocumentStyle>"
"type": "map<string, docs.SuggestedDocumentStyle>",
"kind": "missing_field",
"severity": "gap"
},
"suggestedNamedStylesChanges": {
"status": "missing",
"type": "map<string, docs.SuggestedNamedStyles>"
"type": "map<string, docs.SuggestedNamedStyles>",
"kind": "missing_field",
"severity": "gap"
}
}
},
Expand Down Expand Up @@ -2637,48 +2640,56 @@
},
"docs.Tab": {
"type_kind": "object",
"status": "missing",
"status": "implemented",
"fields": {
"childTabs": {
"status": "missing",
"type": "[docs.Tab]"
"type": "[docs.Tab]",
"kind": "missing_field",
"severity": "gap"
},
"documentTab": {
"status": "missing",
"status": "implemented",
"type": "docs.DocumentTab"
},
"tabProperties": {
"status": "missing",
"status": "implemented",
"type": "docs.TabProperties"
}
}
},
"docs.TabProperties": {
"type_kind": "object",
"status": "missing",
"status": "implemented",
"fields": {
"iconEmoji": {
"status": "missing",
"type": "string"
"type": "string",
"kind": "missing_field",
"severity": "gap"
},
"index": {
"status": "missing",
"status": "implemented",
"type": "integer"
},
"nestingLevel": {
"status": "missing",
"type": "integer"
"type": "integer",
"kind": "missing_field",
"severity": "gap"
},
"parentTabId": {
"status": "missing",
"type": "string"
"type": "string",
"kind": "missing_field",
"severity": "gap"
},
"tabId": {
"status": "missing",
"status": "implemented",
"type": "string"
},
"title": {
"status": "missing",
"status": "implemented",
"type": "string"
}
}
Expand Down
2 changes: 1 addition & 1 deletion backlot/fidelity/google_discovery_diff.py
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ def types_measure(spec: TypesTarget, doc: Mapping[str, Any], *, timeout: float)

Every one of them is listed whether or not Backlot serves it, where a GraphQL source lists none
of the vendor's types Backlot does not declare: a `fields` mask is read against the whole of
each (`backlot.routers.google_sheets._gmask_select`), so the baseline has to carry it offline.
each (`backlot.routers.google._gmask_select`), so the baseline has to carry it offline.
A field the vendor does not declare is `extra`, and breaking."""
types = declared_types(doc)
answers = {o.id: o.response for o in from_google_discovery(doc).values() if o.response}
Expand Down
16 changes: 12 additions & 4 deletions backlot/fidelity/google_walks.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
then writes to the grid, copies a sheet and creates a workbook, as its owner.

`docs` reads a document stating a title, a heading and every run mark a corpus states, and a prose
document beside it.
document beside it, flat and as their tabs, as their owner.
"""

from __future__ import annotations
Expand Down Expand Up @@ -89,11 +89,18 @@


def docs(timeout: float) -> list[tuple[str, Any]]:
"""Each document read through `documents.get`, as the service account."""
"""Each document read through `documents.get`, flat and as its tabs, as its owner: a reader is
served no `revisionId`."""
import backlot
from backlot.server import meta_users

with backlot.serve(DOCS_CORPUS, telemetry=False) as server:
headers = {"Authorization": f"Bearer {server.token}"}
owner = next(
u["token"]
for u in meta_users(server.base_url, timeout)["users"]
if u["email"] == DOCS_CORPUS[0]["author_email"]
)
headers = {"Authorization": f"Bearer {owner}"}
with httpx.Client(base_url=server.base_url, headers=headers, timeout=timeout) as client:
files = _ok(
client.get(
Expand All @@ -102,8 +109,9 @@ def docs(timeout: float) -> list[tuple[str, Any]]:
)
)["files"]
return [
("docs.documents.get", _ok(client.get(f"/docs/v1/documents/{f['id']}")))
("docs.documents.get", _ok(client.get(f"/docs/v1/documents/{f['id']}", params=q)))
for f in files
for q in ({}, {"includeTabsContent": "true"})
]


Expand Down
Loading
Loading