@shoalrun/cli 0.1.0-beta.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/CODE-REFERENCES.md +137 -0
  3. package/README.md +8 -5
  4. package/adapters/python/requirements.txt +1 -0
  5. package/adapters/python/shoalrun_reference.py +234 -0
  6. package/agent-docs/.well-known/shoalrun/navigation/project-updates-50f26fe22670.txt +4 -2
  7. package/agent-docs/SNAPSHOT.json +5 -5
  8. package/agent-docs/about.md +3 -3
  9. package/agent-docs/api-docs/code-reference-settings.md +160 -0
  10. package/agent-docs/api-docs/code-reference-settings.sections/catalog-settings.md +50 -0
  11. package/agent-docs/api-docs/code-reference-settings.sections/complete-reference-page.md +46 -0
  12. package/agent-docs/api-docs/code-reference-settings.sections/converter-snapshot.md +58 -0
  13. package/agent-docs/api-docs/code-reference-settings.sections/descriptions-type-links-and-source-links.md +40 -0
  14. package/agent-docs/api-docs/code-reference-settings.sections/html-markdown-and-agents.md +38 -0
  15. package/agent-docs/api-docs/code-reference-settings.sections/metadata-and-selection.md +38 -0
  16. package/agent-docs/api-docs/code-reference-settings.sections/publication-sources.md +54 -0
  17. package/agent-docs/api-docs/code-reference-settings.sections/python-adapter-limits.md +38 -0
  18. package/agent-docs/api-docs/code-reference-settings.sections/related-reading.md +32 -0
  19. package/agent-docs/api-docs/code-reference-settings.sections/symbol-fields.md +56 -0
  20. package/agent-docs/api-docs/code-references.md +143 -0
  21. package/agent-docs/author/agent-overview.md +2 -2
  22. package/agent-docs/changelog/code-api-references.md +44 -0
  23. package/agent-docs/changelog.md +9 -1
  24. package/agent-docs/cli.md +11 -1
  25. package/agent-docs/cli.sections/audit-a-project-and-api-sources.md +1 -1
  26. package/agent-docs/cli.sections/author-pages.md +1 -1
  27. package/agent-docs/cli.sections/build-and-serve.md +1 -1
  28. package/agent-docs/cli.sections/inspect-config-and-operations.md +1 -1
  29. package/agent-docs/cli.sections/npm-scripts-in-this-repository.md +1 -1
  30. package/agent-docs/cli.sections/related-reading.md +1 -1
  31. package/agent-docs/cli.sections/search-and-chat.md +1 -1
  32. package/agent-docs/cli.sections/start-a-project.md +1 -1
  33. package/agent-docs/cli.sections/validate-code-reference-snapshots.md +41 -0
  34. package/agent-docs/cli.sections/working-tree-authoring-tools.md +1 -1
  35. package/agent-docs/config/apis.md +5 -1
  36. package/agent-docs/config/examples.md +3 -3
  37. package/agent-docs/config/examples.sections/feature-showcase.md +3 -3
  38. package/agent-docs/config/examples.sections/minimal-site.md +2 -2
  39. package/agent-docs/config/examples.sections/multilingual-help-center.md +2 -2
  40. package/agent-docs/config/examples.sections/parcel-api-documentation.md +2 -2
  41. package/agent-docs/config/examples.sections/related-reading.md +2 -2
  42. package/agent-docs/config/examples.sections/shared-company-preset.md +2 -2
  43. package/agent-docs/config.md +2 -2
  44. package/agent-docs/configuration.md +2 -2
  45. package/agent-docs/configuration.sections/build-several-sites-from-shared-content.md +1 -1
  46. package/agent-docs/configuration.sections/change-inherited-lists-deliberately.md +1 -1
  47. package/agent-docs/configuration.sections/extract-a-section-with-include.md +1 -1
  48. package/agent-docs/configuration.sections/inspect-and-validate-changes.md +1 -1
  49. package/agent-docs/configuration.sections/related-reading.md +1 -1
  50. package/agent-docs/configuration.sections/separate-config-inheritance-from-page-metadata.md +1 -1
  51. package/agent-docs/configuration.sections/share-defaults-through-extends.md +1 -1
  52. package/agent-docs/configuration.sections/start-with-one-working-file.md +2 -2
  53. package/agent-docs/configuration.sections/understand-the-three-stages.md +1 -1
  54. package/agent-docs/configuration.sections/understand-where-paths-point.md +1 -1
  55. package/agent-docs/documents.json +609 -215
  56. package/agent-docs/features.md +3 -2
  57. package/agent-docs/provenance.json +6 -6
  58. package/agent-docs/publish/api-references.md +3 -1
  59. package/agent-docs/publish/api-references.sections/author-the-reference-page.md +3 -1
  60. package/agent-docs/publish/api-references.sections/build-and-verify-the-output.md +3 -1
  61. package/agent-docs/publish/api-references.sections/inspect-the-machine-readable-contract.md +3 -1
  62. package/agent-docs/publish/api-references.sections/next-steps.md +3 -1
  63. package/agent-docs/publish/api-references.sections/preview-a-small-api-reference.md +3 -1
  64. package/agent-docs/publish/api-references.sections/put-the-spec-in-your-project.md +3 -1
  65. package/agent-docs/publish/api-references.sections/register-the-operation.md +3 -1
  66. package/agent-docs/publish/api-references.sections/related-reading.md +3 -1
  67. package/agent-docs/publish/api-references.sections/review-imported-content-before-publishing.md +3 -1
  68. package/agent-docs/publish/api-references.sections/what-readers-get.md +3 -1
  69. package/agent-docs/search-index.json +1 -1
  70. package/agent-docs/start.md +3 -3
  71. package/agent-docs/start.sections/add-the-page-to-navigation.md +2 -2
  72. package/agent-docs/start.sections/build-and-check-both-outputs.md +2 -2
  73. package/agent-docs/start.sections/build-this-site.md +2 -2
  74. package/agent-docs/start.sections/check-writing-style.md +2 -2
  75. package/agent-docs/start.sections/create-a-page.md +2 -2
  76. package/agent-docs/start.sections/make-it-yours.md +2 -2
  77. package/agent-docs/start.sections/migrating-from-github-packages.md +2 -2
  78. package/agent-docs/start.sections/prerequisites.md +2 -2
  79. package/agent-docs/start.sections/related-reading.md +2 -2
  80. package/agent-docs/start.sections/start-your-own-project.md +3 -3
  81. package/agent-docs/status.md +6 -4
  82. package/agent-docs/styling/themes.md +7 -3
  83. package/agent-docs/what-is-shoalrun.md +2 -2
  84. package/dist/artifact-bundle.d.ts +1 -0
  85. package/dist/artifact-bundle.js +11 -3
  86. package/dist/cli-discovery.d.ts +1 -1
  87. package/dist/cli-discovery.js +1 -0
  88. package/dist/cli.js +7 -0
  89. package/dist/code-reference-model.d.ts +85 -0
  90. package/dist/code-reference-model.js +73 -0
  91. package/dist/code-references.d.ts +23 -0
  92. package/dist/code-references.js +371 -0
  93. package/dist/compiler-config.d.ts +1 -0
  94. package/dist/compiler.js +4 -3
  95. package/dist/config.js +1 -1
  96. package/dist/content-source.d.ts +1 -0
  97. package/dist/content-workspace.d.ts +1 -0
  98. package/dist/content-workspace.js +2 -0
  99. package/dist/fonts.d.ts +9 -0
  100. package/dist/fonts.js +58 -3
  101. package/dist/page-materialization.js +3 -2
  102. package/dist/page-renderer.d.ts +1 -0
  103. package/dist/page-renderer.js +3 -1
  104. package/dist/publication-render.d.ts +2 -1
  105. package/dist/publication-render.js +2 -2
  106. package/dist/representation-tree.js +4 -0
  107. package/examples/code-references/content/start.md +53 -0
  108. package/examples/code-references/docs.config.yaml +262 -0
  109. package/examples/code-references/python/orchard/__init__.py +11 -0
  110. package/examples/code-references/python/orchard/client.py +212 -0
  111. package/examples/code-references/python/orchard/errors.py +31 -0
  112. package/examples/code-references/python/orchard/models.py +69 -0
  113. package/examples/code-references/python/orchard/pagination.py +39 -0
  114. package/examples/code-references/reference.json +1244 -0
  115. package/package.json +8 -1
  116. package/schemas/code-reference.schema.json +306 -0
  117. package/skills/shoalrun-author/SKILL.md +4 -0
  118. package/skills/shoalrun-author/references/code-api-references.md +15 -0
  119. package/styles/site.css +61 -2
@@ -0,0 +1,1244 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "shoalrun-code-reference",
4
+ "programmingLanguage": "python",
5
+ "producer": {
6
+ "name": "shoalrun-python",
7
+ "version": "1.0.0",
8
+ "extractorVersion": "2.4.1"
9
+ },
10
+ "sourceDigest": "753e7dedf38cfd83caeff31498e46b699b63cfe83f8177a0b970074a87b061f4",
11
+ "symbols": [
12
+ {
13
+ "id": "orchard",
14
+ "name": "orchard",
15
+ "kind": "module",
16
+ "visibility": "public",
17
+ "source": {
18
+ "path": "orchard/__init__.py"
19
+ },
20
+ "description": "A sample SDK for working with records, collections, and paginated results.\n\nUse [Client](symbol:orchard.client.Client) in synchronous applications, or\n[AsyncClient](symbol:orchard.client.AsyncClient) in an async service. Models,\npagination helpers, and typed exceptions have their own reference pages.\n\nThis package is documentation example code. It doesn't contact a live service.",
21
+ "summary": "A sample SDK for working with records, collections, and paginated results."
22
+ },
23
+ {
24
+ "id": "orchard.client",
25
+ "name": "client",
26
+ "kind": "module",
27
+ "visibility": "public",
28
+ "parent": "orchard",
29
+ "source": {
30
+ "path": "orchard/client.py"
31
+ },
32
+ "description": "Synchronous and asynchronous clients for the sample records SDK.",
33
+ "summary": "Synchronous and asynchronous clients for the sample records SDK."
34
+ },
35
+ {
36
+ "id": "orchard.client.AsyncClient",
37
+ "name": "AsyncClient",
38
+ "kind": "class",
39
+ "visibility": "public",
40
+ "parent": "orchard.client",
41
+ "source": {
42
+ "path": "orchard/client.py",
43
+ "line": 165
44
+ },
45
+ "description": "Use the records SDK from an async Python application.\n\nAwait individual operations, or use `async for` to consume a record iterator.\nThis example delegates to an in-memory client; no network calls are made.",
46
+ "summary": "Use the records SDK from an async Python application.",
47
+ "constructorSignature": "AsyncClient(api_key: str, *, timeout: float = 10.0)",
48
+ "signatures": [
49
+ "class AsyncClient"
50
+ ]
51
+ },
52
+ {
53
+ "id": "orchard.client.AsyncClient.__init__",
54
+ "name": "__init__",
55
+ "kind": "constructor",
56
+ "visibility": "public",
57
+ "parent": "orchard.client.AsyncClient",
58
+ "source": {
59
+ "path": "orchard/client.py",
60
+ "line": 171
61
+ },
62
+ "description": "Configure an async client.",
63
+ "summary": "Configure an async client.",
64
+ "signatures": [
65
+ "def __init__(api_key: str, *, timeout: float = 10.0)"
66
+ ],
67
+ "parameters": [
68
+ {
69
+ "name": "api_key",
70
+ "type": "str",
71
+ "description": "Application credential."
72
+ },
73
+ {
74
+ "name": "timeout",
75
+ "type": "float",
76
+ "default": "10.0",
77
+ "description": "Default request timeout, in seconds."
78
+ }
79
+ ]
80
+ },
81
+ {
82
+ "id": "orchard.client.AsyncClient.fetch",
83
+ "name": "fetch",
84
+ "kind": "method",
85
+ "visibility": "public",
86
+ "parent": "orchard.client.AsyncClient",
87
+ "source": {
88
+ "path": "orchard/client.py",
89
+ "line": 180
90
+ },
91
+ "returns": {
92
+ "description": "The matching record model.",
93
+ "type": "Record"
94
+ },
95
+ "raises": [
96
+ {
97
+ "name": "NotFoundError",
98
+ "description": "If the record doesn't exist."
99
+ }
100
+ ],
101
+ "examples": [
102
+ {
103
+ "code": ">>> record = await client.fetch(\"rec_42\")"
104
+ }
105
+ ],
106
+ "description": "Await a typed record response.",
107
+ "summary": "Await a typed record response.",
108
+ "signatures": [
109
+ "async def fetch(record_id: str, *, timeout: float | None = None) -> Record"
110
+ ],
111
+ "parameters": [
112
+ {
113
+ "name": "record_id",
114
+ "type": "str",
115
+ "description": "Stable record identifier."
116
+ },
117
+ {
118
+ "name": "timeout",
119
+ "type": "float | None",
120
+ "default": "None",
121
+ "description": "Optional request timeout override, in seconds."
122
+ }
123
+ ],
124
+ "typeReferences": {
125
+ "Record": "orchard.models.Record",
126
+ "NotFoundError": "orchard.errors.NotFoundError"
127
+ }
128
+ },
129
+ {
130
+ "id": "orchard.client.AsyncClient.iter_records",
131
+ "name": "iter_records",
132
+ "kind": "method",
133
+ "visibility": "public",
134
+ "parent": "orchard.client.AsyncClient",
135
+ "source": {
136
+ "path": "orchard/client.py",
137
+ "line": 198
138
+ },
139
+ "yields": {
140
+ "description": "Typed records from successive pages.",
141
+ "type": "AsyncIterator[Record]"
142
+ },
143
+ "examples": [
144
+ {
145
+ "code": ">>> async for record in client.iter_records(page_size=50):\n... print(record.title)"
146
+ }
147
+ ],
148
+ "description": "Consume paginated records using asynchronous iteration.",
149
+ "summary": "Consume paginated records using asynchronous iteration.",
150
+ "signatures": [
151
+ "async def iter_records(*, page_size: int = 20) -> AsyncIterator[Record]"
152
+ ],
153
+ "parameters": [
154
+ {
155
+ "name": "page_size",
156
+ "type": "int",
157
+ "default": "20",
158
+ "description": "Maximum number of records read in one page."
159
+ }
160
+ ],
161
+ "returns": {
162
+ "type": "AsyncIterator[Record]"
163
+ },
164
+ "typeReferences": {
165
+ "Record": "orchard.models.Record"
166
+ }
167
+ },
168
+ {
169
+ "id": "orchard.client.Client",
170
+ "name": "Client",
171
+ "kind": "class",
172
+ "visibility": "public",
173
+ "parent": "orchard.client",
174
+ "source": {
175
+ "path": "orchard/client.py",
176
+ "line": 8
177
+ },
178
+ "description": "Manage records from a synchronous Python application.\n\nCreate one client per API credential and reuse it across requests. Use\n[AsyncClient](symbol:orchard.client.AsyncClient) in an async application.\n\nThe sample client keeps records in memory; it doesn't make network calls.",
179
+ "summary": "Manage records from a synchronous Python application.",
180
+ "constructorSignature": "Client(api_key: str, *, base_url: str = 'https://api.example.com/v1', timeout: float = 10.0, max_retries: int = 2)",
181
+ "signatures": [
182
+ "class Client"
183
+ ]
184
+ },
185
+ {
186
+ "id": "orchard.client.Client.__init__",
187
+ "name": "__init__",
188
+ "kind": "constructor",
189
+ "visibility": "public",
190
+ "parent": "orchard.client.Client",
191
+ "source": {
192
+ "path": "orchard/client.py",
193
+ "line": 16
194
+ },
195
+ "raises": [
196
+ {
197
+ "name": "AuthenticationError",
198
+ "description": "If the API key is empty."
199
+ }
200
+ ],
201
+ "description": "Configure a reusable client.",
202
+ "summary": "Configure a reusable client.",
203
+ "signatures": [
204
+ "def __init__(api_key: str, *, base_url: str = 'https://api.example.com/v1', timeout: float = 10.0, max_retries: int = 2)"
205
+ ],
206
+ "parameters": [
207
+ {
208
+ "name": "api_key",
209
+ "type": "str",
210
+ "description": "Credential used to identify the application."
211
+ },
212
+ {
213
+ "name": "base_url",
214
+ "type": "str",
215
+ "default": "'https://api.example.com/v1'",
216
+ "description": "Root URL of the API deployment."
217
+ },
218
+ {
219
+ "name": "timeout",
220
+ "type": "float",
221
+ "default": "10.0",
222
+ "description": "Default request timeout, in seconds."
223
+ },
224
+ {
225
+ "name": "max_retries",
226
+ "type": "int",
227
+ "default": "2",
228
+ "description": "Number of retries for transient failures."
229
+ }
230
+ ],
231
+ "typeReferences": {
232
+ "AuthenticationError": "orchard.errors.AuthenticationError"
233
+ }
234
+ },
235
+ {
236
+ "id": "orchard.client.Client.base_url",
237
+ "name": "base_url",
238
+ "kind": "attribute",
239
+ "visibility": "public",
240
+ "parent": "orchard.client.Client",
241
+ "source": {
242
+ "path": "orchard/client.py",
243
+ "line": 30
244
+ },
245
+ "default": "base_url",
246
+ "signatures": [
247
+ "base_url"
248
+ ]
249
+ },
250
+ {
251
+ "id": "orchard.client.Client.bulk_create",
252
+ "name": "bulk_create",
253
+ "kind": "method",
254
+ "visibility": "public",
255
+ "parent": "orchard.client.Client",
256
+ "source": {
257
+ "path": "orchard/client.py",
258
+ "line": 148
259
+ },
260
+ "returns": {
261
+ "description": "Created records in the same order as the submitted inputs.",
262
+ "type": "list[Record]"
263
+ },
264
+ "raises": [
265
+ {
266
+ "name": "ValueError",
267
+ "description": "If the batch size is outside the supported range."
268
+ }
269
+ ],
270
+ "description": "Create multiple records in bounded batches.",
271
+ "summary": "Create multiple records in bounded batches.",
272
+ "signatures": [
273
+ "def bulk_create(records: Sequence[RecordInput], *, batch_size: int = 25) -> list[Record]"
274
+ ],
275
+ "parameters": [
276
+ {
277
+ "name": "records",
278
+ "type": "Sequence[RecordInput]",
279
+ "description": "Input models to create, in submission order."
280
+ },
281
+ {
282
+ "name": "batch_size",
283
+ "type": "int",
284
+ "default": "25",
285
+ "description": "Maximum number of records per batch, from 1 to 100."
286
+ }
287
+ ],
288
+ "typeReferences": {
289
+ "Record": "orchard.models.Record",
290
+ "RecordInput": "orchard.models.RecordInput"
291
+ }
292
+ },
293
+ {
294
+ "id": "orchard.client.Client.create_record",
295
+ "name": "create_record",
296
+ "kind": "method",
297
+ "visibility": "public",
298
+ "parent": "orchard.client.Client",
299
+ "source": {
300
+ "path": "orchard/client.py",
301
+ "line": 127
302
+ },
303
+ "returns": {
304
+ "description": "An immutable snapshot of the created record.",
305
+ "type": "Record"
306
+ },
307
+ "examples": [
308
+ {
309
+ "code": ">>> data = RecordInput(title=\"Deployment notes\", labels={\"team\": \"platform\"})\n>>> record = client.create_record(data, idempotency_key=\"deploy-42\")"
310
+ }
311
+ ],
312
+ "description": "Create a record from a typed input model.\n\nUse an idempotency key when retrying a request after a timeout. Reuse the\nsame key only for retries of the same logical operation.",
313
+ "summary": "Create a record from a typed input model.",
314
+ "signatures": [
315
+ "def create_record(data: RecordInput, *, idempotency_key: str | None = None) -> Record"
316
+ ],
317
+ "parameters": [
318
+ {
319
+ "name": "data",
320
+ "type": "RecordInput",
321
+ "description": "Title and labels for the new record."
322
+ },
323
+ {
324
+ "name": "idempotency_key",
325
+ "type": "str | None",
326
+ "default": "None",
327
+ "description": "Application-generated retry token."
328
+ }
329
+ ],
330
+ "typeReferences": {
331
+ "Record": "orchard.models.Record",
332
+ "RecordInput": "orchard.models.RecordInput"
333
+ }
334
+ },
335
+ {
336
+ "id": "orchard.client.Client.fetch",
337
+ "name": "fetch",
338
+ "kind": "method",
339
+ "visibility": "public",
340
+ "parent": "orchard.client.Client",
341
+ "source": {
342
+ "path": "orchard/client.py",
343
+ "line": 39
344
+ },
345
+ "returns": {
346
+ "description": "The record model, or a dictionary when `raw=True`.",
347
+ "type": "Record | RecordDict"
348
+ },
349
+ "raises": [
350
+ {
351
+ "name": "ValueError",
352
+ "description": "If the record identifier is empty."
353
+ },
354
+ {
355
+ "name": "NotFoundError",
356
+ "description": "If no record matches the identifier."
357
+ }
358
+ ],
359
+ "examples": [
360
+ {
361
+ "code": ">>> client = Client(\"demo-key\")\n>>> record = client.fetch(\"rec_42\")\n>>> record.title\n'Getting started'\n>>> payload = client.fetch(\"rec_42\", raw=True)\n>>> payload[\"status\"]\n'ready'"
362
+ }
363
+ ],
364
+ "description": "Retrieve a record by its stable identifier.\n\nThe default response is a typed [Record](symbol:orchard.models.Record).\nSet `raw=True` to receive a dictionary for serialization or a legacy\nintegration. An explicit timeout overrides the client's default.",
365
+ "summary": "Retrieve a record by its stable identifier.",
366
+ "signatures": [
367
+ "def fetch(record_id: str, *, raw: Literal[False] = False, timeout: float | None = None) -> Record",
368
+ "def fetch(record_id: str, *, raw: Literal[True], timeout: float | None = None) -> RecordDict"
369
+ ],
370
+ "parameters": [
371
+ {
372
+ "name": "record_id",
373
+ "type": "str",
374
+ "description": "Stable identifier of the record to retrieve."
375
+ },
376
+ {
377
+ "name": "raw",
378
+ "type": "bool",
379
+ "default": "False",
380
+ "description": "Return a wire-format dictionary instead of a model."
381
+ },
382
+ {
383
+ "name": "timeout",
384
+ "type": "float | None",
385
+ "default": "None",
386
+ "description": "Request timeout override, in seconds."
387
+ }
388
+ ],
389
+ "typeReferences": {
390
+ "Record": "orchard.models.Record",
391
+ "RecordDict": "orchard.models.RecordDict",
392
+ "NotFoundError": "orchard.errors.NotFoundError"
393
+ }
394
+ },
395
+ {
396
+ "id": "orchard.client.Client.iter_records",
397
+ "name": "iter_records",
398
+ "kind": "method",
399
+ "visibility": "public",
400
+ "parent": "orchard.client.Client",
401
+ "source": {
402
+ "path": "orchard/client.py",
403
+ "line": 102
404
+ },
405
+ "yields": {
406
+ "description": "Records in the service's response order.",
407
+ "type": "Record"
408
+ },
409
+ "examples": [
410
+ {
411
+ "code": ">>> for record in client.iter_records(page_size=50):\n... print(record.id, record.title)"
412
+ }
413
+ ],
414
+ "description": "Iterate through records across every page.\n\nPagination is lazy: another page is read only when the iterator needs it.\nStop iteration early to avoid fetching pages your application won't use.",
415
+ "summary": "Iterate through records across every page.",
416
+ "signatures": [
417
+ "def iter_records(*, page_size: int = 20, status: RecordStatus | None = None) -> Iterator[Record]"
418
+ ],
419
+ "parameters": [
420
+ {
421
+ "name": "page_size",
422
+ "type": "int",
423
+ "default": "20",
424
+ "description": "Number of records requested per page, from 1 to 100."
425
+ },
426
+ {
427
+ "name": "status",
428
+ "type": "RecordStatus | None",
429
+ "default": "None",
430
+ "description": "Optional processing status filter."
431
+ }
432
+ ],
433
+ "returns": {
434
+ "type": "Iterator[Record]"
435
+ },
436
+ "typeReferences": {
437
+ "Record": "orchard.models.Record",
438
+ "RecordStatus": "orchard.models.RecordStatus"
439
+ }
440
+ },
441
+ {
442
+ "id": "orchard.client.Client.list_records",
443
+ "name": "list_records",
444
+ "kind": "method",
445
+ "visibility": "public",
446
+ "parent": "orchard.client.Client",
447
+ "source": {
448
+ "path": "orchard/client.py",
449
+ "line": 74
450
+ },
451
+ "returns": {
452
+ "description": "A page of matching records with an optional continuation cursor.",
453
+ "type": "Page[Record]"
454
+ },
455
+ "raises": [
456
+ {
457
+ "name": "ValueError",
458
+ "description": "If the page size is outside the supported range."
459
+ }
460
+ ],
461
+ "examples": [
462
+ {
463
+ "code": ">>> page = client.list_records(limit=10, status=RecordStatus.READY)\n>>> titles = page.map(lambda record: record.title)"
464
+ }
465
+ ],
466
+ "description": "List a single page of records with optional status filtering.\n\nUse [iter_records](symbol:orchard.client.Client.iter_records) when you\nwant to read every page without managing continuation cursors.",
467
+ "summary": "List a single page of records with optional status filtering.",
468
+ "signatures": [
469
+ "def list_records(*, limit: int = 20, cursor: str | None = None, status: RecordStatus | None = None) -> Page[Record]"
470
+ ],
471
+ "parameters": [
472
+ {
473
+ "name": "limit",
474
+ "type": "int",
475
+ "default": "20",
476
+ "description": "Maximum number of records in a page, from 1 to 100."
477
+ },
478
+ {
479
+ "name": "cursor",
480
+ "type": "str | None",
481
+ "default": "None",
482
+ "description": "Opaque continuation token from an earlier response."
483
+ },
484
+ {
485
+ "name": "status",
486
+ "type": "RecordStatus | None",
487
+ "default": "None",
488
+ "description": "Include only records with this processing status."
489
+ }
490
+ ],
491
+ "typeReferences": {
492
+ "Page[Record]": "orchard.pagination.Page",
493
+ "Page": "orchard.pagination.Page",
494
+ "Record": "orchard.models.Record",
495
+ "RecordStatus": "orchard.models.RecordStatus"
496
+ }
497
+ },
498
+ {
499
+ "id": "orchard.client.Client.max_retries",
500
+ "name": "max_retries",
501
+ "kind": "attribute",
502
+ "visibility": "public",
503
+ "parent": "orchard.client.Client",
504
+ "source": {
505
+ "path": "orchard/client.py",
506
+ "line": 32
507
+ },
508
+ "default": "max_retries",
509
+ "signatures": [
510
+ "max_retries"
511
+ ]
512
+ },
513
+ {
514
+ "id": "orchard.client.Client.timeout",
515
+ "name": "timeout",
516
+ "kind": "attribute",
517
+ "visibility": "public",
518
+ "parent": "orchard.client.Client",
519
+ "source": {
520
+ "path": "orchard/client.py",
521
+ "line": 31
522
+ },
523
+ "default": "timeout",
524
+ "signatures": [
525
+ "timeout"
526
+ ]
527
+ },
528
+ {
529
+ "id": "orchard.errors",
530
+ "name": "errors",
531
+ "kind": "module",
532
+ "visibility": "public",
533
+ "parent": "orchard",
534
+ "source": {
535
+ "path": "orchard/errors.py"
536
+ },
537
+ "description": "Typed errors an application can handle without inspecting error messages.",
538
+ "summary": "Typed errors an application can handle without inspecting error messages."
539
+ },
540
+ {
541
+ "id": "orchard.errors.APIError",
542
+ "name": "APIError",
543
+ "kind": "class",
544
+ "visibility": "public",
545
+ "parent": "orchard.errors",
546
+ "source": {
547
+ "path": "orchard/errors.py",
548
+ "line": 3
549
+ },
550
+ "description": "Base error for unsuccessful API operations.\n\nHandle a more specific exception when your application can recover from it.\nUse `request_id` when reporting a failed request to an operator.",
551
+ "summary": "Base error for unsuccessful API operations.",
552
+ "bases": [
553
+ "Exception"
554
+ ],
555
+ "constructorSignature": "APIError(message: str, *, request_id: str | None = None)",
556
+ "signatures": [
557
+ "class APIError(Exception)"
558
+ ]
559
+ },
560
+ {
561
+ "id": "orchard.errors.APIError.__init__",
562
+ "name": "__init__",
563
+ "kind": "constructor",
564
+ "visibility": "public",
565
+ "parent": "orchard.errors.APIError",
566
+ "source": {
567
+ "path": "orchard/errors.py",
568
+ "line": 9
569
+ },
570
+ "signatures": [
571
+ "def __init__(message: str, *, request_id: str | None = None)"
572
+ ],
573
+ "parameters": [
574
+ {
575
+ "name": "message",
576
+ "type": "str"
577
+ },
578
+ {
579
+ "name": "request_id",
580
+ "type": "str | None",
581
+ "default": "None"
582
+ }
583
+ ]
584
+ },
585
+ {
586
+ "id": "orchard.errors.APIError.request_id",
587
+ "name": "request_id",
588
+ "kind": "attribute",
589
+ "visibility": "public",
590
+ "parent": "orchard.errors.APIError",
591
+ "source": {
592
+ "path": "orchard/errors.py",
593
+ "line": 11
594
+ },
595
+ "default": "request_id",
596
+ "signatures": [
597
+ "request_id"
598
+ ]
599
+ },
600
+ {
601
+ "id": "orchard.errors.AuthenticationError",
602
+ "name": "AuthenticationError",
603
+ "kind": "class",
604
+ "visibility": "public",
605
+ "parent": "orchard.errors",
606
+ "source": {
607
+ "path": "orchard/errors.py",
608
+ "line": 13
609
+ },
610
+ "description": "The API key is missing, expired, or invalid.\n\nRefresh the credential before retrying the request. Repeating the same\nrequest with the same invalid credential won't resolve this error.",
611
+ "summary": "The API key is missing, expired, or invalid.",
612
+ "bases": [
613
+ "APIError"
614
+ ],
615
+ "signatures": [
616
+ "class AuthenticationError(APIError)"
617
+ ],
618
+ "typeReferences": {
619
+ "APIError": "orchard.errors.APIError"
620
+ }
621
+ },
622
+ {
623
+ "id": "orchard.errors.NotFoundError",
624
+ "name": "NotFoundError",
625
+ "kind": "class",
626
+ "visibility": "public",
627
+ "parent": "orchard.errors",
628
+ "source": {
629
+ "path": "orchard/errors.py",
630
+ "line": 20
631
+ },
632
+ "description": "The requested record doesn't exist or isn't visible to the API key.",
633
+ "summary": "The requested record doesn't exist or isn't visible to the API key.",
634
+ "bases": [
635
+ "APIError"
636
+ ],
637
+ "signatures": [
638
+ "class NotFoundError(APIError)"
639
+ ],
640
+ "typeReferences": {
641
+ "APIError": "orchard.errors.APIError"
642
+ }
643
+ },
644
+ {
645
+ "id": "orchard.errors.RateLimitError",
646
+ "name": "RateLimitError",
647
+ "kind": "class",
648
+ "visibility": "public",
649
+ "parent": "orchard.errors",
650
+ "source": {
651
+ "path": "orchard/errors.py",
652
+ "line": 23
653
+ },
654
+ "description": "The service rejected a request because its rate limit was reached.\n\nWait for `retry_after` seconds before retrying. Add jitter when multiple\nworkers share the same credentials.",
655
+ "summary": "The service rejected a request because its rate limit was reached.",
656
+ "bases": [
657
+ "APIError"
658
+ ],
659
+ "constructorSignature": "RateLimitError(message: str, *, retry_after: float, request_id: str | None = None)",
660
+ "signatures": [
661
+ "class RateLimitError(APIError)"
662
+ ],
663
+ "typeReferences": {
664
+ "APIError": "orchard.errors.APIError"
665
+ }
666
+ },
667
+ {
668
+ "id": "orchard.errors.RateLimitError.__init__",
669
+ "name": "__init__",
670
+ "kind": "constructor",
671
+ "visibility": "public",
672
+ "parent": "orchard.errors.RateLimitError",
673
+ "source": {
674
+ "path": "orchard/errors.py",
675
+ "line": 29
676
+ },
677
+ "signatures": [
678
+ "def __init__(message: str, *, retry_after: float, request_id: str | None = None)"
679
+ ],
680
+ "parameters": [
681
+ {
682
+ "name": "message",
683
+ "type": "str"
684
+ },
685
+ {
686
+ "name": "retry_after",
687
+ "type": "float"
688
+ },
689
+ {
690
+ "name": "request_id",
691
+ "type": "str | None",
692
+ "default": "None"
693
+ }
694
+ ]
695
+ },
696
+ {
697
+ "id": "orchard.errors.RateLimitError.retry_after",
698
+ "name": "retry_after",
699
+ "kind": "attribute",
700
+ "visibility": "public",
701
+ "parent": "orchard.errors.RateLimitError",
702
+ "source": {
703
+ "path": "orchard/errors.py",
704
+ "line": 31
705
+ },
706
+ "default": "retry_after",
707
+ "signatures": [
708
+ "retry_after"
709
+ ]
710
+ },
711
+ {
712
+ "id": "orchard.models",
713
+ "name": "models",
714
+ "kind": "module",
715
+ "visibility": "public",
716
+ "parent": "orchard",
717
+ "source": {
718
+ "path": "orchard/models.py"
719
+ },
720
+ "description": "Typed request and response models for the records API.",
721
+ "summary": "Typed request and response models for the records API."
722
+ },
723
+ {
724
+ "id": "orchard.models.Record",
725
+ "name": "Record",
726
+ "kind": "class",
727
+ "visibility": "public",
728
+ "parent": "orchard.models",
729
+ "source": {
730
+ "path": "orchard/models.py",
731
+ "line": 41
732
+ },
733
+ "description": "A record returned by the service.\n\nRecords are immutable snapshots. Fetch the record again to observe a new\nprocessing status rather than changing its fields locally.",
734
+ "summary": "A record returned by the service.",
735
+ "constructorSignature": "Record(id: str, title: str, status: RecordStatus = RecordStatus.READY, labels: dict[str, str] = <factory>, created_at: datetime | None = None)",
736
+ "signatures": [
737
+ "class Record"
738
+ ],
739
+ "typeReferences": {
740
+ "RecordStatus": "orchard.models.RecordStatus"
741
+ }
742
+ },
743
+ {
744
+ "id": "orchard.models.Record.created_at",
745
+ "name": "created_at",
746
+ "kind": "attribute",
747
+ "visibility": "public",
748
+ "parent": "orchard.models.Record",
749
+ "source": {
750
+ "path": "orchard/models.py",
751
+ "line": 56
752
+ },
753
+ "description": "Creation time in UTC, if reported by the service.",
754
+ "summary": "Creation time in UTC, if reported by the service.",
755
+ "annotation": "datetime | None",
756
+ "default": "None",
757
+ "required": false,
758
+ "signatures": [
759
+ "created_at: datetime | None"
760
+ ]
761
+ },
762
+ {
763
+ "id": "orchard.models.Record.id",
764
+ "name": "id",
765
+ "kind": "attribute",
766
+ "visibility": "public",
767
+ "parent": "orchard.models.Record",
768
+ "source": {
769
+ "path": "orchard/models.py",
770
+ "line": 48
771
+ },
772
+ "description": "Stable identifier used in fetch and update operations.",
773
+ "summary": "Stable identifier used in fetch and update operations.",
774
+ "annotation": "str",
775
+ "required": true,
776
+ "signatures": [
777
+ "id: str"
778
+ ]
779
+ },
780
+ {
781
+ "id": "orchard.models.Record.labels",
782
+ "name": "labels",
783
+ "kind": "attribute",
784
+ "visibility": "public",
785
+ "parent": "orchard.models.Record",
786
+ "source": {
787
+ "path": "orchard/models.py",
788
+ "line": 54
789
+ },
790
+ "description": "Application-defined key/value labels.",
791
+ "summary": "Application-defined key/value labels.",
792
+ "annotation": "dict[str, str]",
793
+ "default": "field(default_factory=dict)",
794
+ "required": false,
795
+ "signatures": [
796
+ "labels: dict[str, str]"
797
+ ]
798
+ },
799
+ {
800
+ "id": "orchard.models.Record.status",
801
+ "name": "status",
802
+ "kind": "attribute",
803
+ "visibility": "public",
804
+ "parent": "orchard.models.Record",
805
+ "source": {
806
+ "path": "orchard/models.py",
807
+ "line": 52
808
+ },
809
+ "description": "Current processing state.",
810
+ "summary": "Current processing state.",
811
+ "annotation": "RecordStatus",
812
+ "default": "RecordStatus.READY",
813
+ "required": false,
814
+ "signatures": [
815
+ "status: RecordStatus"
816
+ ],
817
+ "typeReferences": {
818
+ "RecordStatus": "orchard.models.RecordStatus"
819
+ }
820
+ },
821
+ {
822
+ "id": "orchard.models.Record.title",
823
+ "name": "title",
824
+ "kind": "attribute",
825
+ "visibility": "public",
826
+ "parent": "orchard.models.Record",
827
+ "source": {
828
+ "path": "orchard/models.py",
829
+ "line": 50
830
+ },
831
+ "description": "Human-readable title.",
832
+ "summary": "Human-readable title.",
833
+ "annotation": "str",
834
+ "required": true,
835
+ "signatures": [
836
+ "title: str"
837
+ ]
838
+ },
839
+ {
840
+ "id": "orchard.models.Record.to_dict",
841
+ "name": "to_dict",
842
+ "kind": "method",
843
+ "visibility": "public",
844
+ "parent": "orchard.models.Record",
845
+ "source": {
846
+ "path": "orchard/models.py",
847
+ "line": 59
848
+ },
849
+ "returns": {
850
+ "description": "A mapping with the identifier, title, and string status.",
851
+ "type": "RecordDict"
852
+ },
853
+ "examples": [
854
+ {
855
+ "code": ">>> Record(\"rec_42\", \"Example\").to_dict()\n{'id': 'rec_42', 'title': 'Example', 'status': 'ready'}"
856
+ }
857
+ ],
858
+ "description": "Convert a record to its compact wire representation.",
859
+ "summary": "Convert a record to its compact wire representation.",
860
+ "signatures": [
861
+ "def to_dict() -> RecordDict"
862
+ ],
863
+ "typeReferences": {
864
+ "RecordDict": "orchard.models.RecordDict"
865
+ }
866
+ },
867
+ {
868
+ "id": "orchard.models.RecordDict",
869
+ "name": "RecordDict",
870
+ "kind": "class",
871
+ "visibility": "public",
872
+ "parent": "orchard.models",
873
+ "source": {
874
+ "path": "orchard/models.py",
875
+ "line": 20
876
+ },
877
+ "description": "Wire representation returned when `Client.fetch(raw=True)` is used.",
878
+ "summary": "Wire representation returned when `Client.fetch(raw=True)` is used.",
879
+ "bases": [
880
+ "TypedDict"
881
+ ],
882
+ "signatures": [
883
+ "class RecordDict(TypedDict)"
884
+ ]
885
+ },
886
+ {
887
+ "id": "orchard.models.RecordDict.id",
888
+ "name": "id",
889
+ "kind": "attribute",
890
+ "visibility": "public",
891
+ "parent": "orchard.models.RecordDict",
892
+ "source": {
893
+ "path": "orchard/models.py",
894
+ "line": 22
895
+ },
896
+ "description": "Stable record identifier.",
897
+ "summary": "Stable record identifier.",
898
+ "annotation": "str",
899
+ "required": true,
900
+ "signatures": [
901
+ "id: str"
902
+ ]
903
+ },
904
+ {
905
+ "id": "orchard.models.RecordDict.status",
906
+ "name": "status",
907
+ "kind": "attribute",
908
+ "visibility": "public",
909
+ "parent": "orchard.models.RecordDict",
910
+ "source": {
911
+ "path": "orchard/models.py",
912
+ "line": 26
913
+ },
914
+ "description": "Processing state encoded as a string.",
915
+ "summary": "Processing state encoded as a string.",
916
+ "annotation": "str",
917
+ "required": true,
918
+ "signatures": [
919
+ "status: str"
920
+ ]
921
+ },
922
+ {
923
+ "id": "orchard.models.RecordDict.title",
924
+ "name": "title",
925
+ "kind": "attribute",
926
+ "visibility": "public",
927
+ "parent": "orchard.models.RecordDict",
928
+ "source": {
929
+ "path": "orchard/models.py",
930
+ "line": 24
931
+ },
932
+ "description": "Human-readable record title.",
933
+ "summary": "Human-readable record title.",
934
+ "annotation": "str",
935
+ "required": true,
936
+ "signatures": [
937
+ "title: str"
938
+ ]
939
+ },
940
+ {
941
+ "id": "orchard.models.RecordInput",
942
+ "name": "RecordInput",
943
+ "kind": "class",
944
+ "visibility": "public",
945
+ "parent": "orchard.models",
946
+ "source": {
947
+ "path": "orchard/models.py",
948
+ "line": 29
949
+ },
950
+ "description": "Input used to create a record.\n\nProvide a title and optional labels. Labels let applications group records\nwithout encoding business rules into the record identifier.",
951
+ "summary": "Input used to create a record.",
952
+ "constructorSignature": "RecordInput(title: str, labels: dict[str, str] = <factory>)",
953
+ "signatures": [
954
+ "class RecordInput"
955
+ ]
956
+ },
957
+ {
958
+ "id": "orchard.models.RecordInput.labels",
959
+ "name": "labels",
960
+ "kind": "attribute",
961
+ "visibility": "public",
962
+ "parent": "orchard.models.RecordInput",
963
+ "source": {
964
+ "path": "orchard/models.py",
965
+ "line": 38
966
+ },
967
+ "description": "Application-defined labels, such as `team` or `environment`.",
968
+ "summary": "Application-defined labels, such as `team` or `environment`.",
969
+ "annotation": "dict[str, str]",
970
+ "default": "field(default_factory=dict)",
971
+ "required": false,
972
+ "signatures": [
973
+ "labels: dict[str, str]"
974
+ ]
975
+ },
976
+ {
977
+ "id": "orchard.models.RecordInput.title",
978
+ "name": "title",
979
+ "kind": "attribute",
980
+ "visibility": "public",
981
+ "parent": "orchard.models.RecordInput",
982
+ "source": {
983
+ "path": "orchard/models.py",
984
+ "line": 36
985
+ },
986
+ "description": "Title to display to readers.",
987
+ "summary": "Title to display to readers.",
988
+ "annotation": "str",
989
+ "required": true,
990
+ "signatures": [
991
+ "title: str"
992
+ ]
993
+ },
994
+ {
995
+ "id": "orchard.models.RecordStatus",
996
+ "name": "RecordStatus",
997
+ "kind": "enum",
998
+ "visibility": "public",
999
+ "parent": "orchard.models",
1000
+ "source": {
1001
+ "path": "orchard/models.py",
1002
+ "line": 7
1003
+ },
1004
+ "description": "Processing status reported by a record.\n\nA record moves from `pending` to `ready` after processing completes.\nFailed records retain their identifier so an application can retry them.",
1005
+ "summary": "Processing status reported by a record.",
1006
+ "bases": [
1007
+ "str",
1008
+ "Enum"
1009
+ ],
1010
+ "signatures": [
1011
+ "class RecordStatus(str, Enum)"
1012
+ ]
1013
+ },
1014
+ {
1015
+ "id": "orchard.models.RecordStatus.FAILED",
1016
+ "name": "FAILED",
1017
+ "kind": "attribute",
1018
+ "visibility": "public",
1019
+ "parent": "orchard.models.RecordStatus",
1020
+ "source": {
1021
+ "path": "orchard/models.py",
1022
+ "line": 17
1023
+ },
1024
+ "description": "Processing failed and needs a retry.",
1025
+ "summary": "Processing failed and needs a retry.",
1026
+ "default": "'failed'",
1027
+ "signatures": [
1028
+ "FAILED"
1029
+ ]
1030
+ },
1031
+ {
1032
+ "id": "orchard.models.RecordStatus.PENDING",
1033
+ "name": "PENDING",
1034
+ "kind": "attribute",
1035
+ "visibility": "public",
1036
+ "parent": "orchard.models.RecordStatus",
1037
+ "source": {
1038
+ "path": "orchard/models.py",
1039
+ "line": 13
1040
+ },
1041
+ "description": "The record is waiting for processing.",
1042
+ "summary": "The record is waiting for processing.",
1043
+ "default": "'pending'",
1044
+ "signatures": [
1045
+ "PENDING"
1046
+ ]
1047
+ },
1048
+ {
1049
+ "id": "orchard.models.RecordStatus.READY",
1050
+ "name": "READY",
1051
+ "kind": "attribute",
1052
+ "visibility": "public",
1053
+ "parent": "orchard.models.RecordStatus",
1054
+ "source": {
1055
+ "path": "orchard/models.py",
1056
+ "line": 15
1057
+ },
1058
+ "description": "The record can be read by applications.",
1059
+ "summary": "The record can be read by applications.",
1060
+ "default": "'ready'",
1061
+ "signatures": [
1062
+ "READY"
1063
+ ]
1064
+ },
1065
+ {
1066
+ "id": "orchard.pagination",
1067
+ "name": "pagination",
1068
+ "kind": "module",
1069
+ "visibility": "public",
1070
+ "parent": "orchard",
1071
+ "source": {
1072
+ "path": "orchard/pagination.py"
1073
+ },
1074
+ "description": "Generic containers and cursor helpers for paginated responses.",
1075
+ "summary": "Generic containers and cursor helpers for paginated responses."
1076
+ },
1077
+ {
1078
+ "id": "orchard.pagination.Page",
1079
+ "name": "Page",
1080
+ "kind": "class",
1081
+ "visibility": "public",
1082
+ "parent": "orchard.pagination",
1083
+ "source": {
1084
+ "path": "orchard/pagination.py",
1085
+ "line": 8
1086
+ },
1087
+ "description": "One page of results and the cursor needed to continue reading.\n\nKeep the cursor opaque. Pass it back to `Client.list_records` instead of\ndecoding it or building a cursor from a record identifier.",
1088
+ "summary": "One page of results and the cursor needed to continue reading.",
1089
+ "bases": [
1090
+ "Generic[T]"
1091
+ ],
1092
+ "signatures": [
1093
+ "class Page(Generic[T])"
1094
+ ],
1095
+ "typeReferences": {
1096
+ "T": "orchard.pagination.T"
1097
+ }
1098
+ },
1099
+ {
1100
+ "id": "orchard.pagination.Page.has_more",
1101
+ "name": "has_more",
1102
+ "kind": "attribute",
1103
+ "visibility": "public",
1104
+ "parent": "orchard.pagination.Page",
1105
+ "source": {
1106
+ "path": "orchard/pagination.py",
1107
+ "line": 23
1108
+ },
1109
+ "description": "Whether another page is available.",
1110
+ "summary": "Whether another page is available.",
1111
+ "annotation": "bool",
1112
+ "signatures": [
1113
+ "has_more: bool"
1114
+ ]
1115
+ },
1116
+ {
1117
+ "id": "orchard.pagination.Page.items",
1118
+ "name": "items",
1119
+ "kind": "attribute",
1120
+ "visibility": "public",
1121
+ "parent": "orchard.pagination.Page",
1122
+ "source": {
1123
+ "path": "orchard/pagination.py",
1124
+ "line": 15
1125
+ },
1126
+ "description": "Results included in this response.",
1127
+ "summary": "Results included in this response.",
1128
+ "annotation": "list[T]",
1129
+ "required": true,
1130
+ "signatures": [
1131
+ "items: list[T]"
1132
+ ],
1133
+ "typeReferences": {
1134
+ "T": "orchard.pagination.T"
1135
+ }
1136
+ },
1137
+ {
1138
+ "id": "orchard.pagination.Page.map",
1139
+ "name": "map",
1140
+ "kind": "method",
1141
+ "visibility": "public",
1142
+ "parent": "orchard.pagination.Page",
1143
+ "source": {
1144
+ "path": "orchard/pagination.py",
1145
+ "line": 27
1146
+ },
1147
+ "returns": {
1148
+ "description": "A new page containing transformed items and the same cursor.",
1149
+ "type": "Page[U]"
1150
+ },
1151
+ "examples": [
1152
+ {
1153
+ "code": ">>> page.map(lambda record: record.title)"
1154
+ }
1155
+ ],
1156
+ "description": "Transform every item while preserving pagination metadata.",
1157
+ "summary": "Transform every item while preserving pagination metadata.",
1158
+ "signatures": [
1159
+ "def map(transform: Callable[[T], U]) -> Page[U]"
1160
+ ],
1161
+ "parameters": [
1162
+ {
1163
+ "name": "transform",
1164
+ "type": "Callable[[T], U]",
1165
+ "description": "Function applied once to each item in this page."
1166
+ }
1167
+ ],
1168
+ "typeReferences": {
1169
+ "Page[U]": "orchard.pagination.Page",
1170
+ "Page": "orchard.pagination.Page",
1171
+ "U": "orchard.pagination.U",
1172
+ "T": "orchard.pagination.T"
1173
+ }
1174
+ },
1175
+ {
1176
+ "id": "orchard.pagination.Page.next_cursor",
1177
+ "name": "next_cursor",
1178
+ "kind": "attribute",
1179
+ "visibility": "public",
1180
+ "parent": "orchard.pagination.Page",
1181
+ "source": {
1182
+ "path": "orchard/pagination.py",
1183
+ "line": 17
1184
+ },
1185
+ "description": "Continuation cursor, or `None` when this is the final page.",
1186
+ "summary": "Continuation cursor, or `None` when this is the final page.",
1187
+ "annotation": "str | None",
1188
+ "default": "None",
1189
+ "required": false,
1190
+ "signatures": [
1191
+ "next_cursor: str | None"
1192
+ ]
1193
+ },
1194
+ {
1195
+ "id": "orchard.pagination.Page.total",
1196
+ "name": "total",
1197
+ "kind": "attribute",
1198
+ "visibility": "public",
1199
+ "parent": "orchard.pagination.Page",
1200
+ "source": {
1201
+ "path": "orchard/pagination.py",
1202
+ "line": 19
1203
+ },
1204
+ "description": "Total result count when the service can provide one.",
1205
+ "summary": "Total result count when the service can provide one.",
1206
+ "annotation": "int | None",
1207
+ "default": "None",
1208
+ "required": false,
1209
+ "signatures": [
1210
+ "total: int | None"
1211
+ ]
1212
+ },
1213
+ {
1214
+ "id": "orchard.pagination.T",
1215
+ "name": "T",
1216
+ "kind": "attribute",
1217
+ "visibility": "public",
1218
+ "parent": "orchard.pagination",
1219
+ "source": {
1220
+ "path": "orchard/pagination.py",
1221
+ "line": 5
1222
+ },
1223
+ "default": "TypeVar('T')",
1224
+ "signatures": [
1225
+ "T"
1226
+ ]
1227
+ },
1228
+ {
1229
+ "id": "orchard.pagination.U",
1230
+ "name": "U",
1231
+ "kind": "attribute",
1232
+ "visibility": "public",
1233
+ "parent": "orchard.pagination",
1234
+ "source": {
1235
+ "path": "orchard/pagination.py",
1236
+ "line": 6
1237
+ },
1238
+ "default": "TypeVar('U')",
1239
+ "signatures": [
1240
+ "U"
1241
+ ]
1242
+ }
1243
+ ]
1244
+ }