haveapi 0.32.1 → 0.32.2

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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -8
  3. data/README.md +3 -422
  4. data/Rakefile +17 -7
  5. data/benchmarks/performance_compare.rb +27 -6
  6. data/doc/cs/client-examples.md +535 -0
  7. data/doc/cs/create-client.md +118 -0
  8. data/doc/cs/json-schema.html +1182 -0
  9. data/doc/cs/protocol.md +595 -0
  10. data/doc/cs/readme.md +432 -0
  11. data/doc/cs/typed-input-validation.md +122 -0
  12. data/doc/{client-examples.md → en/client-examples.md} +20 -10
  13. data/doc/{documentation-ui.md → en/documentation-ui.md} +42 -6
  14. data/doc/{performance.md → en/performance.md} +11 -0
  15. data/doc/{protocol.md → en/protocol.md} +2 -2
  16. data/doc/en/readme.md +423 -0
  17. data/haveapi.gemspec +2 -2
  18. data/lib/haveapi/client_example.rb +18 -5
  19. data/lib/haveapi/client_examples/curl.rb +5 -5
  20. data/lib/haveapi/client_examples/dynamic_helpers.rb +10 -10
  21. data/lib/haveapi/client_examples/go_client.rb +1 -1
  22. data/lib/haveapi/client_examples/http.rb +4 -4
  23. data/lib/haveapi/client_examples/js_client.rb +10 -10
  24. data/lib/haveapi/client_examples/php_client.rb +24 -25
  25. data/lib/haveapi/client_examples/python_client.rb +11 -11
  26. data/lib/haveapi/client_examples/ruby_cli.rb +6 -9
  27. data/lib/haveapi/client_examples/ruby_client.rb +24 -16
  28. data/lib/haveapi/client_examples/rust_client.rb +1 -1
  29. data/lib/haveapi/client_examples/ts_generated_client.rb +1 -1
  30. data/lib/haveapi/documentation_context.rb +14 -2
  31. data/lib/haveapi/documentation_helpers.rb +92 -15
  32. data/lib/haveapi/documentation_locale.rb +65 -0
  33. data/lib/haveapi/documentation_oauth.rb +12 -12
  34. data/lib/haveapi/documentation_search.rb +5 -5
  35. data/lib/haveapi/documentation_validators.rb +43 -33
  36. data/lib/haveapi/locales/cs.yml +468 -0
  37. data/lib/haveapi/locales/en.yml +467 -0
  38. data/lib/haveapi/public/css/documentation.css +8 -4
  39. data/lib/haveapi/public/js/documentation.js +73 -20
  40. data/lib/haveapi/server.rb +32 -47
  41. data/lib/haveapi/shared_documentation_helpers.rb +53 -5
  42. data/lib/haveapi/version.rb +1 -1
  43. data/lib/haveapi/views/doc_layout.erb +3 -2
  44. data/lib/haveapi/views/doc_sidebars/create-client.erb +10 -10
  45. data/lib/haveapi/views/doc_sidebars/json-schema.erb +2 -2
  46. data/lib/haveapi/views/doc_sidebars/protocol.erb +24 -24
  47. data/lib/haveapi/views/documentation/search_form.erb +5 -4
  48. data/lib/haveapi/views/documentation/search_results.erb +6 -6
  49. data/lib/haveapi/views/index.erb +3 -3
  50. data/lib/haveapi/views/main_layout.erb +4 -4
  51. data/lib/haveapi/views/shared_documentation.erb +8 -5
  52. data/lib/haveapi/views/shared_sidebar.erb +11 -11
  53. data/lib/haveapi/views/version_page/auth_body.erb +7 -7
  54. data/lib/haveapi/views/version_page/client_auth.erb +1 -1
  55. data/lib/haveapi/views/version_page/client_example.erb +1 -1
  56. data/lib/haveapi/views/version_page/client_init.erb +1 -1
  57. data/lib/haveapi/views/version_page/client_overview.erb +7 -5
  58. data/lib/haveapi/views/version_page/example_panels.erb +5 -2
  59. data/lib/haveapi/views/version_page/resource_body.erb +24 -24
  60. data/lib/haveapi/views/version_page/resource_directory.erb +2 -2
  61. data/lib/haveapi/views/version_page/usage.erb +5 -5
  62. data/lib/haveapi/views/version_page.erb +11 -11
  63. data/lib/haveapi/views/version_sidebar/auth_nav.erb +2 -2
  64. data/lib/haveapi/views/version_sidebar/authentication_control.erb +8 -8
  65. data/lib/haveapi/views/version_sidebar/authentication_status.erb +1 -1
  66. data/lib/haveapi/views/version_sidebar/brand.erb +16 -5
  67. data/lib/haveapi/views/version_sidebar.erb +33 -18
  68. data/spec/client_examples/assets/documentation_test.cjs +107 -9
  69. data/spec/client_examples/comment_capture.rb +72 -0
  70. data/spec/client_examples/comments_spec.rb +162 -0
  71. data/spec/client_examples/context_spec.rb +18 -2
  72. data/spec/client_examples/detail_spec.rb +68 -0
  73. data/spec/documentation/client_overview_spec.rb +60 -0
  74. data/spec/documentation/example_selection_spec.rb +192 -0
  75. data/spec/documentation/language_settings_spec.rb +132 -0
  76. data/spec/documentation/locale_spec.rb +367 -0
  77. data/spec/documentation/navigation_spec.rb +61 -3
  78. data/spec/documentation/oauth_spec.rb +42 -0
  79. data/spec/documentation/search_index_routes_spec.rb +8 -4
  80. data/spec/documentation/search_spec.rb +1 -1
  81. data/spec/documentation/shared_pages_spec.rb +63 -2
  82. data/spec/documentation/validators_spec.rb +25 -0
  83. data/spec/extensions/exception_mailer_spec.rb +2 -2
  84. data/spec/packaging_spec.rb +68 -9
  85. data/spec/performance/event_baseline_spec.rb +1 -1
  86. data/spec/performance/source_versions_spec.rb +111 -2
  87. metadata +24 -11
  88. /data/doc/{create-client.md → en/create-client.md} +0 -0
  89. /data/doc/{documentation-oauth.md → en/documentation-oauth.md} +0 -0
  90. /data/doc/{json-schema.html → en/json-schema.html} +0 -0
  91. /data/doc/{typed-input-validation.md → en/typed-input-validation.md} +0 -0
@@ -43,6 +43,473 @@ en:
43
43
  token_required: This action requires token authentication
44
44
  authorization:
45
45
  insufficient_permissions: Access denied. Insufficient permissions.
46
+ documentation:
47
+ accessibility:
48
+ authentication_methods: Authentication methods
49
+ breadcrumb: Breadcrumb
50
+ documentation_table: Documentation table
51
+ link_to: Link to %{label}
52
+ navigation: Navigation
53
+ pages: Documentation pages
54
+ resource_actions: Actions on this resource
55
+ shared: Shared documentation
56
+ skip: Skip to content
57
+ article:
58
+ fallback: This article is available in English.
59
+ articles:
60
+ client_examples: Client examples
61
+ create_client: Create a client
62
+ documentation_oauth: Documentation OAuth
63
+ documentation_ui: Browsing API documentation
64
+ json_schema: JSON schema
65
+ performance: Performance
66
+ protocol: Protocol
67
+ readme: HaveAPI internals
68
+ typed_input_validation: Typed input validation
69
+ authentication:
70
+ disabled: Authentication is disabled for this API.
71
+ initialize_after: ", then choose an authentication method."
72
+ initialize_before: Initialize your client using the
73
+ overview_link: overview examples
74
+ browser:
75
+ action: Action
76
+ authentication: 'Authentication: %{provider}'
77
+ copied: Copied
78
+ copy_example: Copy example
79
+ copy_failed: Select the code and copy it.
80
+ example_unavailable: This example is unavailable for the selected client.
81
+ input: Input
82
+ output: Output
83
+ parameter: Parameter
84
+ resource: Resource
85
+ saved_example_unavailable: Your saved example is unavailable. Showing %{client}.
86
+ search_count: "%{count} results."
87
+ search_empty: No matches. Try another resource, action or parameter name.
88
+ search_failed: Search could not be loaded. Submit to open the results page.
89
+ search_loading: Loading search…
90
+ search_more: Showing %{count} results. More matches are available; refine
91
+ your search.
92
+ search_one: "%{count} result."
93
+ simple: Simple
94
+ thorough: With error handling
95
+ client:
96
+ and: " and "
97
+ library: library
98
+ request_examples: request examples are available on resource pages.
99
+ comments:
100
+ acquire_token: Acquire the token
101
+ array_subclass: which is a subclass of Array
102
+ cli_action_required: |-
103
+ Note that the client always has to call some action. APIs should provide
104
+ an action to get information about the current user, so that's what we're
105
+ calling now.
106
+ cli_ask_stdin: If username or password isn't provided, the user is asked on
107
+ stdin
108
+ cli_credentials: Provide credentials on command line
109
+ cli_oauth_unsupported: OAuth2 is not supported by HaveAPI Ruby CLI.
110
+ cli_read_token: |-
111
+ Now the token is read from disk and the user does not have to provide username
112
+ nor password and be authenticated
113
+ cli_save_token: Get token using username and password and save it to disk
114
+ client_instance: Client instance
115
+ curl_password_argument: Password given on the command line
116
+ curl_password_stdin: Password is asked on standard input
117
+ custom_type: "%{variable} is a custom type"
118
+ dependency_failures: Dependency failures still propagate to the application.
119
+ failure_branch: This sample demonstrates the failure branch above.
120
+ go_existing_oauth: Obtain the access token through the OAuth2 provider before
121
+ running this program.
122
+ go_existing_token: Use a token obtained through the advertised authentication
123
+ provider.
124
+ go_metadata: 'To supply advertised global metadata, select only the fields
125
+ you set:'
126
+ go_metadata_type: value has type %{type}
127
+ http_oauth_code: 1) Request authorization code
128
+ http_oauth_login: 2) The user logs in using this API
129
+ http_oauth_redirect: 3) The API then redirects the user back to the client
130
+ application
131
+ http_oauth_token: 4) The client application requests access token
132
+ instance_of: "%{variable} is an instance of %{type}"
133
+ js_existing_oauth: Use an existing access token; this client does not run
134
+ an OAuth authorization flow.
135
+ js_initial_response: This prints the initial response; use its action-state
136
+ metadata to monitor completion.
137
+ js_request_completion: Request success alone does not establish operation
138
+ completion.
139
+ oauth_callback_url: This example code should run on the URL below
140
+ oauth_check_token: Check if we already have an access token
141
+ oauth_client_credentials: Client id and secret are given by the API server
142
+ oauth_code_flow: |-
143
+ Follow the OAuth2 authorization process to get an access token using
144
+ authorization code
145
+ oauth_need_code: We don't have authorization code yet, request one
146
+ oauth_redirect: Redirect the user to the authorization endpoint
147
+ oauth_request_token: Request access token using the token endpoint
148
+ oauth_reuse_token: We're already authenticated, reuse the existing access
149
+ token
150
+ oauth_rfc: See RFC 6749 for authorization process and RFC 6750 for access
151
+ token usage.
152
+ oauth_scopes: Scopes are specific to the API implementation
153
+ oauth_session: OAuth2 requires session
154
+ oauth_store_token: Store the access token in the session
155
+ operation_status_fields: Inspect the operation status using its documented
156
+ output fields.
157
+ python_actions: Call API actions inside this block.
158
+ python_async_context: Run inside an async function after initializing api.
159
+ python_existing_oauth: Use an existing access token; OAuth acquisition and
160
+ refresh are outside this client.
161
+ raises_exception: Raises exception %{exception}
162
+ request_completion: Request success does not establish operation completion.
163
+ response_associative: "%{call} returns an associative array of output parameters:"
164
+ response_associative_arrays: "%{call} returns an array of associative arrays:"
165
+ response_hash: "%{call} returns a hash of output parameters:"
166
+ response_hashes: "%{call} returns an array of hashes:"
167
+ reuse_token: Reuse an existing token
168
+ ruby_oauth_unsupported: OAuth2 is not supported by HaveAPI Ruby client.
169
+ rust_action_state: Use only the separately documented action-state action;
170
+ this API client has no automatic wait helper.
171
+ rust_async_function: Use inside an async function returning %{type}.
172
+ rust_blocking_context: Construct, use and drop this blocking client outside
173
+ async runtime threads.
174
+ rust_completion: Request success or a timeout does not establish completion
175
+ of a server-side operation.
176
+ rust_credentials: Configure existing credentials only; building does not validate
177
+ them with the server.
178
+ rust_diagnostics: Inspect these explicitly; server diagnostics can contain
179
+ sensitive values.
180
+ rust_sync_function: Use inside a synchronous function outside async runtime
181
+ threads returning %{type}.
182
+ throws_exception: Throws exception %{exception}
183
+ timeout_no_cancel: A request timeout does not cancel a server operation.
184
+ token_credentials: Get token using username and password
185
+ token_reuse_next: Next time, the client can authenticate using the token directly
186
+ typescript_async_context: Requires an initialized api and an async context.
187
+ typescript_completion: Request success does not establish completion of a
188
+ server-side operation.
189
+ typescript_package: 'Configured API client: %{package}.'
190
+ use_previous_token: Use a previously acquired token
191
+ errors:
192
+ query: Invalid documentation query
193
+ resource_not_found: Documentation resource not found
194
+ search_query: Invalid documentation search query
195
+ selection: Invalid documentation selection
196
+ example:
197
+ and: and
198
+ authentication: authentication
199
+ initialization: initialization
200
+ initialized: Examples use an initialized API client, authenticated when required.
201
+ see: See
202
+ title: 'Example #%{index}'
203
+ footer:
204
+ generated: Generated by
205
+ generated:
206
+ go:
207
+ action: This action is unavailable in the configured Go API client.
208
+ associated_object: The Go API client requires an object for an associated
209
+ response field.
210
+ associated_response: This associated response is unavailable in the visible
211
+ Go API client documentation.
212
+ authentication: This authentication method is unavailable in the configured
213
+ Go API client.
214
+ authentication_mismatch: This authentication method does not match the configured
215
+ Go API client.
216
+ authentication_unsupported: This authentication method is unsupported by
217
+ the Go generator.
218
+ custom: The Go generator does not support Custom fields in this sample.
219
+ input: This input is unavailable in the configured Go API client.
220
+ input_field: This input field does not match the configured Go API client.
221
+ int64_range: This path value is outside the Go int64 range.
222
+ layout: The configured Go API client does not match this action layout.
223
+ list_input: The Go generator does not support list input in documentation
224
+ examples.
225
+ metadata: This action requires metadata that is absent from the sample.
226
+ mode: This Go API client example mode is unsupported.
227
+ name_collision: The Go generator cannot represent these parameter name collisions.
228
+ null_input: This Go API client input field does not accept null.
229
+ null_output: The Go API client cannot distinguish scalar null output from
230
+ its zero value.
231
+ object_input: The Go generator supports object input only.
232
+ output_layout: The Go generator does not support this output layout.
233
+ path_parameters: This sample does not supply all Go API client path parameters.
234
+ path_type: This Go API client path parameter must be an integer or string.
235
+ response: This response is unavailable in the configured Go API client.
236
+ response_field: This response field does not match the configured Go API
237
+ client.
238
+ route: The configured Go API client does not match this action route.
239
+ sample_output_layout: This sample does not match the Go API client output
240
+ layout.
241
+ structured_sample: This sample does not describe a structured request and
242
+ response.
243
+ unavailable: This Go API client example is unavailable.
244
+ undeclared_field: API example field %{path} is not declared in the Go API
245
+ client schema.
246
+ value: This sample value cannot be represented by the Go API client field
247
+ type.
248
+ labels:
249
+ go: Go API client
250
+ rust_async: Rust API client (async)
251
+ rust_blocking: Rust API client (blocking)
252
+ typescript: TypeScript API client
253
+ rust:
254
+ action: This action is unavailable in the authorized Rust API client profile.
255
+ action_authentication: This action requires authentication unavailable in
256
+ the authorized Rust API client profile.
257
+ action_metadata: This Rust API client action requires metadata that is absent
258
+ from the sample.
259
+ authentication: This authentication provider is unavailable in the authorized
260
+ Rust API client profile.
261
+ authentication_description: The authentication description differs from
262
+ the authorized help.
263
+ authentication_header: The Rust API client authentication header differs
264
+ from this API.
265
+ authentication_unsupported: This authentication provider is unsupported
266
+ by the Rust client.
267
+ get_custom: Rust GET requests do not support nested Custom query values.
268
+ get_list: Rust GET requests do not support list input.
269
+ input: This Rust API client action cannot represent the sample input.
270
+ input_layout: The sample input does not match the Rust API client layout.
271
+ layout: The Rust API client input or output layout differs from this API
272
+ action.
273
+ mode: Unsupported Rust execution mode.
274
+ parameter: A sample parameter is unavailable or has changed in this Rust
275
+ API client.
276
+ path_parameters: The sample path arguments cannot be represented by this
277
+ Rust API client.
278
+ required_input: The sample omits a required Rust API client input.
279
+ response: The sample response does not match this Rust API client.
280
+ response_layout: The sample response does not match this Rust API client
281
+ layout.
282
+ route: The Rust API client route or HTTP method differs from this API action.
283
+ sample_metadata: This action requires metadata that is absent from the sample.
284
+ section: Unsupported Rust documentation section.
285
+ structured_sample: This sample has no structured request or response to
286
+ render.
287
+ value: A sample value cannot be represented by this Rust API client.
288
+ version: The Rust API client targets a different API version.
289
+ typescript:
290
+ unavailable: This sample is unavailable or incompatible with the configured
291
+ TypeScript API client.
292
+ variants:
293
+ api_client: API client
294
+ async: Async
295
+ blocking: Blocking
296
+ labels:
297
+ account: Account
298
+ actions: Actions
299
+ aliases: Aliases
300
+ api_reference: API reference
301
+ api_versions: API versions
302
+ apply_examples: Apply
303
+ apply_language: Apply language
304
+ authentication: Authentication
305
+ authentication_required: Authentication required
306
+ authorize_url: 'Authorize URL:'
307
+ blocking: Blocking
308
+ client: Client
309
+ client_libraries: Client libraries
310
+ contents: Contents
311
+ default: 'Default:'
312
+ description: Description
313
+ details: Details
314
+ examples: Examples
315
+ http_header: 'HTTP header:'
316
+ initialization: Initialization
317
+ input_parameters: Input parameters
318
+ language: Language
319
+ layout: Layout
320
+ namespace: Namespace
321
+ 'no': 'no'
322
+ no_parameters: No parameters.
323
+ output_parameters: Output parameters
324
+ overview: Overview
325
+ parameter: Parameter
326
+ path: Path
327
+ programming_language: Language
328
+ query_parameter: 'Query parameter:'
329
+ required: Required
330
+ resources: Resources
331
+ revoke_url: 'Revoke URL:'
332
+ scope: Scope
333
+ settings: Documentation settings
334
+ sign_in: Sign in
335
+ sign_out: Sign out
336
+ simple: Simple
337
+ subresources: Subresources
338
+ switch_user: Switch user
339
+ theme: Theme
340
+ theme_auto: Automatic theme
341
+ theme_dark: Dark theme
342
+ theme_light: Light theme
343
+ thorough: With error handling
344
+ token_url: 'Token URL:'
345
+ type: Type
346
+ usage: Using this reference
347
+ 'yes': 'yes'
348
+ limitations:
349
+ action_authentication: This action requires an authentication provider unsupported
350
+ by this client.
351
+ authentication_provider: This authentication provider is not advertised or
352
+ supported by this client.
353
+ callback_parameter_name: This callback client cannot safely represent this
354
+ input parameter name.
355
+ duplicate_object_keys: This sample has duplicate serialized object keys.
356
+ go_profile: A Go API client profile is required.
357
+ input_description_missing: The sample supplies input for an action without
358
+ an input description.
359
+ input_hidden: The sample contains input parameters absent from the visible
360
+ description.
361
+ input_metadata: This action requires input metadata that the sample format
362
+ cannot supply.
363
+ javascript_integer: This sample contains an integer outside JavaScript's exact
364
+ integer range.
365
+ javascript_list_input: This JavaScript client accepts object input only; list
366
+ input cannot be represented without dropping values.
367
+ javascript_nested_query: This JavaScript client cannot preserve nested values
368
+ in query input.
369
+ javascript_object_input: This JavaScript client requires object input.
370
+ literal: This sample contains a value without a supported literal representation.
371
+ non_finite_number: This sample has a non-finite number.
372
+ object_key: This sample has a non-string object key.
373
+ path_argument_type: Action path arguments must be strings or integers.
374
+ path_arguments_missing: The sample does not supply every action path argument.
375
+ prose_only: This example contains prose only; no executable request is supplied.
376
+ python_get_input: Python GET examples support flat scalar input with bracket-free
377
+ names; Custom values must be strings or nullable nulls.
378
+ python_input: This Python client requires object or list input.
379
+ python_list_namespace: This Python client requires a namespace for list input.
380
+ python_method: This Python client supports GET, POST, PUT and DELETE actions
381
+ only.
382
+ rust_profile: A Rust API client documentation profile is required.
383
+ token_input_choice: This token example cannot represent its advertised input
384
+ choice.
385
+ token_input_choice_missing: This token example has no advertised input choice.
386
+ token_input_type: This token example has an unsupported input type.
387
+ token_input_value: This token client cannot send the advertised login input
388
+ value.
389
+ token_object_input: This token example requires object input.
390
+ typescript_profile: A TypeScript API client documentation profile is required.
391
+ oauth:
392
+ origin_required: Documentation sign-in requires its configured HTTPS origin
393
+ return: Return to documentation
394
+ session_ended: Your documentation session ended. Sign in again.
395
+ sign_in_failed: Documentation sign-in failed.
396
+ sign_out_incomplete: Local sign-out succeeded, but the server session may
397
+ remain until it expires.
398
+ sign_out_invalid: Invalid documentation sign-out request
399
+ switch_invalid: Invalid documentation switch request
400
+ try_again: Try again
401
+ overview:
402
+ api_address: The API is available at
403
+ authentication_link: authentication instructions
404
+ browse_after: to find their actions, parameters and examples.
405
+ browse_link: Browse all resources
406
+ initialize_after: when credentials are required.
407
+ initialize_before: Initialize your client, then follow the
408
+ versions: Examples target API v%{version}. API clients use their own package
409
+ versions and must match this API.
410
+ schema:
411
+ envelope: Envelope
412
+ search:
413
+ changed: Search has changed. Reload this page or submit to open current results.
414
+ label: Search API v%{version}
415
+ placeholder: Resource...
416
+ results: Search results
417
+ results_for: Search results for %{query}
418
+ submit: Search
419
+ suggestions: Search suggestions
420
+ titles:
421
+ search: 'Search API v%{version}: %{query}'
422
+ toc:
423
+ authorization: Authorization
424
+ client_definition: Client definition
425
+ client_side_validations: Client-side validations
426
+ data_types: Data types
427
+ describe_default_version: Describe default version
428
+ describe_the_whole_api: Describe the whole API
429
+ description_format: Description format
430
+ design_rules: Design rules
431
+ http_basic_authentication: HTTP basic authentication
432
+ input_output_formats: Input/output formats
433
+ input_output_parameters: Input/output parameters
434
+ layouts: Layouts
435
+ list_api_versions: List API versions
436
+ necessary_features_to_implement: Necessary features to implement
437
+ object_like_access: Object-like access
438
+ parameters: Parameters
439
+ protocol_definition: Protocol definition
440
+ request: Request
441
+ resource_associations: Resource associations
442
+ resource_tree: Resource tree
443
+ response: Response
444
+ self_description: Self-description
445
+ supplemental_features: Supplemental features
446
+ token_authentication: Token authentication
447
+ version: Version
448
+ usage:
449
+ below: below and
450
+ browse: to browse the API, then choose a resource to see its actions, parameters
451
+ and examples.
452
+ choose: Choose a Programming language and Client variant for the examples.
453
+ The Examples menu offers the selected client's supported formats. Your choices
454
+ apply to every example and stay selected as you browse.
455
+ credentials: for credentials. Open
456
+ search: Search finds resources, actions and input or output parameters. Follow
457
+ a result to its reference entry.
458
+ sign_in: Sign in to show only those available to your account.
459
+ signed_out: While signed out, the reference shows all declared resources,
460
+ actions and parameters.
461
+ start: Start with
462
+ validators:
463
+ accept: Must equal %{value}.
464
+ additional: Additional details
465
+ allowed: Allowed values
466
+ caption: Validation rules
467
+ characters: " characters"
468
+ confirm_different: Must differ from parameter %{parameter}.
469
+ confirm_equal: Must equal parameter %{parameter}.
470
+ custom: 'Application-specific rule: %{rule}'
471
+ details: Details
472
+ disallowed: Disallowed values
473
+ empty_allowed: Empty values are allowed.
474
+ empty_disallowed: Must not be empty; strings must contain a non-whitespace
475
+ character.
476
+ empty_set: The set is empty.
477
+ even: Must be even.
478
+ even_disabled: 'Even-only restriction: disabled.'
479
+ format_match: 'Must match this regular expression:'
480
+ format_no_match: 'Must not match this regular expression:'
481
+ items: " items"
482
+ length_equal: Length must equal %{value}%{unit}.
483
+ length_maximum: 'Maximum length: %{value}%{unit} (inclusive).'
484
+ length_minimum: 'Minimum length: %{value}%{unit} (inclusive).'
485
+ maximum: 'Maximum: %{value} (inclusive).'
486
+ message: 'Validation error message:'
487
+ metadata: 'Supplied validator metadata:'
488
+ minimum: 'Minimum: %{value} (inclusive).'
489
+ multiple: Must be a multiple of %{value}, measured from zero.
490
+ names:
491
+ accept: Accept
492
+ confirm: Confirm
493
+ custom: Custom
494
+ exclude: Exclude
495
+ format: Format
496
+ include: Include
497
+ length: Length
498
+ number: Number
499
+ present: Present
500
+ number: Must be a number after parameter type conversion.
501
+ odd: Must be odd.
502
+ odd_disabled: 'Odd-only restriction: disabled.'
503
+ present: Must be supplied and cannot be null.
504
+ ruby_value: Ruby value
505
+ rule: Rule
506
+ step: 'Step: %{value}, measured from %{start}.'
507
+ version:
508
+ default: "(default)"
509
+ label: Version %{version}
510
+ visibility:
511
+ account: Showing resources, actions and parameters available to this account.
512
+ all: Showing all resources, actions and parameters.
46
513
  errors:
47
514
  action_not_found: Action not found
48
515
  bad_accept_header: Invalid Accept header
@@ -106,13 +106,16 @@ input::placeholder { color: var(--docs-muted); }
106
106
  [data-documentation-menu-content] form { margin: 0; }
107
107
  [data-documentation-menu-content] form + form { margin-top: .4rem; }
108
108
  .docs-theme-choices { display: flex; gap: .2rem; }
109
+ [data-documentation-language] { padding-bottom: .75rem; margin-bottom: .75rem !important; border-bottom: 1px solid var(--docs-border); }
110
+ [data-documentation-language] label { display: block; margin-bottom: .4rem; color: var(--docs-muted); font-size: .8125rem; font-weight: 600; }
111
+ [data-documentation-language] select { width: 100%; margin-bottom: .4rem; }
112
+ [data-documentation-language] button { width: 100%; }
109
113
  .docs-theme-label { display: block; margin-bottom: .4rem; color: var(--docs-muted); font-size: .8125rem; font-weight: 600; }
110
114
  .docs-theme-choices button { display: grid; place-items: center; width: 2.75rem; min-height: 2.75rem; padding: .4rem; background: transparent; }
111
115
  .docs-theme-choices svg { width: 1rem; height: 1rem; }
112
116
  .docs-theme-choices [aria-pressed="true"] { color: var(--docs-accent); border-color: var(--docs-accent); background: var(--docs-active); }
113
117
  .docs-mobile-toolbar { display: none; }
114
118
  [data-nav-toggle] { display: none; }
115
- [data-docs]:not([data-docs-enhanced]) .docs-preferences,
116
119
  [data-docs]:not([data-docs-enhanced]) .docs-theme-label,
117
120
  [data-docs]:not([data-docs-enhanced]) .docs-theme-choices,
118
121
  [data-docs]:not([data-docs-enhanced]) [data-resource-nav] > label { display: none; }
@@ -194,6 +197,7 @@ input::placeholder { color: var(--docs-muted); }
194
197
  .docs-preferences label:has([data-detail-select]) { grid-column: 1 / -1; }
195
198
  .docs-preferences:has([data-variant-control][hidden]) label:has([data-language-select]) { grid-column: 1 / -1; }
196
199
  .docs-preferences select { width: 100%; margin-top: .3rem; padding-right: .2rem; font-size: .875rem; }
200
+ .docs-preferences [data-apply-examples] { grid-column: 1 / -1; }
197
201
  .docs-preferences [data-preference-status] { grid-column: 1 / -1; margin: 0; font-size: .8rem; }
198
202
  .docs-resource-list { margin: 1.5rem 0; padding: 0; list-style: none; }
199
203
  .docs-resource-list ul { margin: .2rem 0 .6rem; padding-left: 1.5rem; list-style: none; }
@@ -218,9 +222,9 @@ input::placeholder { color: var(--docs-muted); }
218
222
  .docs-main p { max-width: 85ch; margin: .75rem 0; overflow-wrap: anywhere; }
219
223
  .docs-main li { overflow-wrap: anywhere; }
220
224
  .docs-main > nav { color: var(--docs-muted); font-size: .875rem; margin-bottom: 1.5rem; }
221
- .docs-main nav[aria-label="Breadcrumb"] ol { display: flex; flex-wrap: wrap; gap: .35rem .6rem; margin: 0; padding: 0; list-style: none; }
222
- .docs-main nav[aria-label="Breadcrumb"] li + li::before { content: "/"; margin-right: .6rem; color: var(--docs-muted); }
223
- .docs-main nav[aria-label="Breadcrumb"] [aria-current="page"] { color: var(--docs-text); }
225
+ .docs-main .docs-breadcrumb ol { display: flex; flex-wrap: wrap; gap: .35rem .6rem; margin: 0; padding: 0; list-style: none; }
226
+ .docs-main .docs-breadcrumb li + li::before { content: "/"; margin-right: .6rem; color: var(--docs-muted); }
227
+ .docs-main .docs-breadcrumb [aria-current="page"] { color: var(--docs-text); }
224
228
  .docs-main hr { margin: 1.5rem 0; border: 0; border-top: 1px solid var(--docs-border); }
225
229
  .docs-main [data-doc-section] { margin: 2.5rem 0 0; padding-top: 2rem; border-top: 1px solid var(--docs-border); }
226
230
  .docs-main dl { margin: 1rem 0; }