Skip to content
This repository is currently being migrated. It's locked while the migration is in progress.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
f0ac1da
fix windows path (#660) (#673)
parthban-db Jul 3, 2024
febf2fd
Check trailing slash in host url (#681)
parthban-db Jul 3, 2024
6fd28ba
Add Windows WorkFlow (#692)
parthban-db Jul 3, 2024
9931e68
Remove duplicate ubuntu tests (#693)
parthban-db Jul 3, 2024
7a49922
Support partners in SDK (#648)
mgyucht Jul 4, 2024
396d4f8
Fix auth tests for windows. (#697)
parthban-db Jul 5, 2024
881670f
Fix test_local_io for windows (#695)
parthban-db Jul 8, 2024
648d602
Fix for cancelled workflow (#701)
parthban-db Jul 8, 2024
18c143f
Fix test_core for windows (#702)
parthban-db Jul 8, 2024
984490d
[Internal] Improve Changelog by grouping changes (#703)
hectorcast-db Jul 9, 2024
ccf38b3
[Internal] Add Release tag and Workflow fix (#704)
hectorcast-db Jul 9, 2024
6462912
[Internal] Move PR message validation to a separate workflow (#707)
hectorcast-db Jul 16, 2024
3009a6b
[Feature] Add DataPlane support (#700)
hectorcast-db Jul 16, 2024
eace94d
[Internal] Trigger the validate workflow in the merge queue (#709)
hectorcast-db Jul 17, 2024
f5c5f48
[Internal] Fix processing of `quoted` titles (#712)
hectorcast-db Jul 18, 2024
b0750eb
[Fix] Infer Azure tenant ID if not set (#638)
mgyucht Jul 18, 2024
6a9c534
[Internal] Update OpenAPI spec (#715)
hectorcast-db Jul 22, 2024
a5d8706
[Internal] Test that Jobs API endpoints are pinned to 2.1 (#714)
vsamoilov Aug 5, 2024
dfa4d60
[Fix] Fix test_get_workspace_client and test_runtime_auth_from_jobs (…
mgyucht Aug 6, 2024
7d22b4d
[Fix] Decrease runtime of recursive workspace listing test (#721)
mgyucht Aug 6, 2024
4105f1f
[Internal] Add apps package in docgen (#722)
mgyucht Aug 8, 2024
c2cc3ea
[Release] Release v0.30.0 (#724)
mgyucht Aug 13, 2024
c3d1db5
[Internal] Escape single quotes in regex matchers (#727)
renaudhartert-db Aug 15, 2024
19fe05c
[Fix] Fixed regression introduced in v0.30.0 causing `ValueError: Inv…
nfx Aug 19, 2024
fb30ed9
[Release] Release v0.31.0 (#733)
renaudhartert-db Aug 21, 2024
5893d4d
[Fix] Fix `DatabricksConfig.copy` when authenticated with OAuth (#723)
parthban-db Aug 27, 2024
dd07079
[Internal] Verify that `WorkspaceClient` created from `AccountClient`…
nfx Aug 27, 2024
4597c36
[Internal] Fix get_workspace_client test to match Go SDK behavior (#738)
mgyucht Aug 28, 2024
b36a7b9
[Release] Release v0.31.1 (#739)
mgyucht Aug 28, 2024
1ccbcd2
[Doc] Add Data Plane access documentation (#732)
hectorcast-db Aug 30, 2024
3dab457
[Fix] Handle non-JSON errors gracefully (#741)
mgyucht Aug 30, 2024
de939a8
[Internal] Fix test_iam::test_scim_error_unmarshall integration test …
mgyucht Sep 2, 2024
c532de6
[Release] Release v0.32.0 (#747)
mgyucht Sep 4, 2024
dcd06c0
[Fix] Properly include message when handing SCIM errors (#753)
mgyucht Sep 10, 2024
b34f502
[Release] Release v0.32.1 (#754)
hectorcast-db Sep 10, 2024
3162545
[Feature] Support Models in `dbutils.fs` operations (#750)
shichengzhou-db Sep 12, 2024
c3aad28
[Fix] Use correct optional typing in `WorkspaceClient` for `mypy` (#760)
nfx Sep 13, 2024
f06bb27
[Fix] Fix deserialization of 401/403 errors (#758)
mgyucht Sep 13, 2024
2438abd
[Fix] Do not specify --tenant flag when fetching managed identity acc…
mgyucht Sep 16, 2024
5e871cb
[Release] Release v0.32.2 (#763)
tanmay-db Sep 17, 2024
d5ec433
[Fix] Add DataPlane docs to the index (#764)
hectorcast-db Sep 17, 2024
9d39254
[Feature] Integrate Databricks SDK with Model Serving Auth Provider (…
aravind-segu Sep 18, 2024
8c865a0
[Fix] `mypy` error: Skipping analyzing "google": module is installed,…
nfx Sep 19, 2024
e23b4ac
[Release] Release v0.32.3 (#770)
renaudhartert-db Sep 19, 2024
61a41fc
[Internal] Add DCO guidelines (#773)
renaudhartert-db Sep 25, 2024
fbed6b9
[Internal] Update SDK to latest OpenAPI spec (#766)
tanmay-db Sep 25, 2024
79b096f
[Release] Release v0.33.0 (#775)
tanmay-db Sep 26, 2024
a1df7a7
[Internal] revert Support Models in `dbutils.fs` operations (#750) (#…
shichengzhou-db Oct 7, 2024
b8c102d
[Fix] Fix Model Serving Test (#781)
parthban-db Oct 7, 2024
0e71082
[Internal] Refactor ApiClient into `_BaseClient` and `ApiClient` (#785)
mgyucht Oct 7, 2024
0b8b9ac
[Fix] Include package name for external types when deserializing resp…
mgyucht Oct 7, 2024
b0e4192
[Internal] Update to latest OpenAPI spec (#787)
parthban-db Oct 7, 2024
a3794b1
[Release] Release v0.34.0 (#788)
parthban-db Oct 7, 2024
1c75815
[Feature] Open AI Client Mixin (#779)
aravind-segu Oct 10, 2024
58d686a
[Fix] Update Serving Endpoint mixing template and docs generation log…
hectorcast-db Oct 17, 2024
15257eb
[Release] Release v0.35.0 (#793)
rauchy Oct 17, 2024
32ba221
[Fix] Decouple OAuth functionality from `Config` (#784)
mgyucht Oct 21, 2024
d3b85cb
[Release] Release v0.36.0 (#798)
rauchy Oct 22, 2024
87072ee
[Release] Release v0.0.36-sync.0
CaymanWilliams Oct 23, 2024
166e30d
[Fix] revert failing workflow
CaymanWilliams Oct 23, 2024
775583e
[Fix] update push config
CaymanWilliams Oct 23, 2024
9ba6b9e
[Fix] some workflow changes
CaymanWilliams Oct 23, 2024
991258d
[Fix] update push config
CaymanWilliams Oct 23, 2024
e6581d0
[VINOO] Revert their push change
vinooganesh Oct 23, 2024
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
1 change: 1 addition & 0 deletions .codegen.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"formatter": "yapf -pri $FILENAMES && autoflake -i $FILENAMES && isort $FILENAMES",
"changelog_config": ".codegen/changelog_config.yml",
"template_libraries": [
".codegen/lib.tmpl"
],
Expand Down
68 changes: 47 additions & 21 deletions .codegen/__init__.py.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,20 @@ from databricks.sdk.credentials_provider import CredentialsStrategy
from databricks.sdk.mixins.files import DbfsExt
from databricks.sdk.mixins.compute import ClustersExt
from databricks.sdk.mixins.workspace import WorkspaceExt
{{- range .Services}} {{if not .IsDataPlane}}
from databricks.sdk.service.{{.Package.Name}} import {{.PascalName}}API{{end}}{{end}}
from databricks.sdk.mixins.open_ai_client import ServingEndpointsExt
{{- range .Services}}
from databricks.sdk.service.{{.Package.Name}} import {{.PascalName}}API{{end}}
from databricks.sdk.service.provisioning import Workspace
from databricks.sdk import azure
from typing import Optional

{{$args := list "host" "account_id" "username" "password" "client_id" "client_secret"
"token" "profile" "config_file" "azure_workspace_resource_id" "azure_client_secret"
"azure_client_id" "azure_tenant_id" "azure_environment" "auth_type" "cluster_id"
"google_credentials" "google_service_account" }}

{{- define "api" -}}
{{- $mixins := dict "ClustersAPI" "ClustersExt" "DbfsAPI" "DbfsExt" "WorkspaceAPI" "WorkspaceExt" -}}
{{- $mixins := dict "ClustersAPI" "ClustersExt" "DbfsAPI" "DbfsExt" "WorkspaceAPI" "WorkspaceExt" "ServingEndpointsAPI" "ServingEndpointsExt" -}}
{{- $genApi := concat .PascalName "API" -}}
{{- getOrDefault $mixins $genApi $genApi -}}
{{- end -}}
Expand All @@ -41,14 +43,14 @@ class WorkspaceClient:
"""
The WorkspaceClient is a client for the workspace-level Databricks REST API.
"""
def __init__(self, *{{range $args}}, {{.}}: str = None{{end}},
debug_truncate_bytes: int = None,
debug_headers: bool = None,
def __init__(self, *{{range $args}}, {{.}}: Optional[str] = None{{end}},
debug_truncate_bytes: Optional[int] = None,
debug_headers: Optional[bool] = None,
product="unknown",
product_version="0.0.0",
credentials_strategy: CredentialsStrategy = None,
credentials_provider: CredentialsStrategy = None,
config: client.Config = None):
credentials_strategy: Optional[CredentialsStrategy] = None,
credentials_provider: Optional[CredentialsStrategy] = None,
config: Optional[client.Config] = None):
if not config:
config = client.Config({{range $args}}{{.}}={{.}}, {{end}}
credentials_strategy=credentials_strategy,
Expand All @@ -61,8 +63,20 @@ class WorkspaceClient:
self._dbutils = _make_dbutils(self._config)
self._api_client = client.ApiClient(self._config)

{{- range .Services}}{{if and (not .IsAccounts) (not .HasParent) (not .IsDataPlane)}}
self._{{.SnakeName}} = {{template "api" .}}(self._api_client){{end -}}{{end}}
{{- range .Services}}{{if and (not .IsAccounts) (not .HasParent) .HasDataPlaneAPI (not .IsDataPlane)}}
{{.SnakeName}} = {{template "api" .}}(self._api_client){{end -}}{{end}}

{{- range .Services}}
{{- if and (not .IsAccounts) (not .HasParent)}}
{{- if .IsDataPlane}}
self._{{.SnakeName}} = {{template "api" .}}(self._api_client, {{.ControlPlaneService.SnakeName}})
{{- else if .HasDataPlaneAPI}}
self._{{.SnakeName}} = {{.SnakeName}}
{{- else}}
self._{{.SnakeName}} = {{template "api" .}}(self._api_client)
{{- end -}}
{{- end -}}
{{end}}

@property
def config(self) -> client.Config:
Expand All @@ -76,7 +90,7 @@ class WorkspaceClient:
def dbutils(self) -> dbutils.RemoteDbUtils:
return self._dbutils

{{- range .Services}}{{if and (not .IsAccounts) (not .HasParent) (not .IsDataPlane)}}
{{- range .Services}}{{if and (not .IsAccounts) (not .HasParent)}}
@property
def {{.SnakeName}}(self) -> {{template "api" .}}:
{{if .Description}}"""{{.Summary}}"""{{end}}
Expand All @@ -98,14 +112,14 @@ class AccountClient:
The AccountClient is a client for the account-level Databricks REST API.
"""

def __init__(self, *{{range $args}}, {{.}}: str = None{{end}},
debug_truncate_bytes: int = None,
debug_headers: bool = None,
def __init__(self, *{{range $args}}, {{.}}: Optional[str] = None{{end}},
debug_truncate_bytes: Optional[int] = None,
debug_headers: Optional[bool] = None,
product="unknown",
product_version="0.0.0",
credentials_strategy: CredentialsStrategy = None,
credentials_provider: CredentialsStrategy = None,
config: client.Config = None):
credentials_strategy: Optional[CredentialsStrategy] = None,
credentials_provider: Optional[CredentialsStrategy] = None,
config: Optional[client.Config] = None):
if not config:
config = client.Config({{range $args}}{{.}}={{.}}, {{end}}
credentials_strategy=credentials_strategy,
Expand All @@ -117,8 +131,20 @@ class AccountClient:
self._config = config.copy()
self._api_client = client.ApiClient(self._config)

{{- range .Services}}{{if and .IsAccounts (not .HasParent) (not .IsDataPlane)}}
self._{{(.TrimPrefix "account").SnakeName}} = {{template "api" .}}(self._api_client){{end -}}{{end}}
{{- range .Services}}{{if and .IsAccounts (not .HasParent) .HasDataPlaneAPI (not .IsDataPlane)}}
{{(.TrimPrefix "account").SnakeName}} = {{template "api" .}}(self._api_client){{end -}}{{end}}

{{- range .Services}}
{{- if and .IsAccounts (not .HasParent)}}
{{- if .IsDataPlane}}
self._{{(.TrimPrefix "account").SnakeName}} = {{template "api" .}}(self._api_client, {{.ControlPlaneService.SnakeName}})
{{- else if .HasDataPlaneAPI}}
self._{{(.TrimPrefix "account").SnakeName}} = {{(.TrimPrefix "account").SnakeName}}
{{- else}}
self._{{(.TrimPrefix "account").SnakeName}} = {{template "api" .}}(self._api_client)
{{- end -}}
{{- end -}}
{{end}}

@property
def config(self) -> client.Config:
Expand All @@ -128,7 +154,7 @@ class AccountClient:
def api_client(self) -> client.ApiClient:
return self._api_client

{{- range .Services}}{{if and .IsAccounts (not .HasParent) (not .IsDataPlane)}}
{{- range .Services}}{{if and .IsAccounts (not .HasParent)}}
@property
def {{(.TrimPrefix "account").SnakeName}}(self) -> {{template "api" .}}:{{if .Description}}
"""{{.Summary}}"""{{end}}
Expand Down
2 changes: 1 addition & 1 deletion .codegen/_openapi_sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
7437dabb9dadee402c1fc060df4c1ce8cc5369f0
cf9c61453990df0f9453670f2fe68e1b128647a2
44 changes: 38 additions & 6 deletions .codegen/changelog.md.tmpl
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
# Version changelog

## {{.Version}}
{{- range .GroupChanges}}

{{range .Changes -}}
### {{.Type.Message}}
{{range .Changes}}
* {{.}}.
{{end}}{{- if .ApiChanges}}
API Changes:
{{range .ApiChanges}}
* {{.Action}} {{template "what" .}}{{if .Extra}} {{.Extra}}{{with .Other}} {{template "what" .}}{{end}}{{end}}.
{{- end}}
{{end}}
{{if .ApiChanges}}
### API Changes:
{{range .ApiChanges.GroupDiff}}
* {{.Action}} {{template "group-what" .}}{{if .Extra}} {{.Extra}}{{with .Other}} {{template "other-what" .}}{{end}}{{end}}.
{{- end}}

OpenAPI SHA: {{.Sha}}, Date: {{.Changed}}
Expand All @@ -20,7 +24,35 @@ Dependency updates:

## {{.PrevVersion}}

{{- define "what" -}}
{{- define "group-what" -}}
{{if gt (len .Changes) 1 -}} {{template "single-what" .Changes.First}}{{end -}}
{{range .Changes.Middle -}}, {{template "single-what" .}}{{end -}}
{{if gt (len .Changes) 1}} and {{end}}{{template "single-what" .Changes.Last}}{{template "suffix-what" .}}
{{- end -}}

{{- define "single-what" -}}
{{if eq .X "package" -}}
`databricks.sdk.service.{{.Package.Name}}`
{{- else if eq .X "service" -}}
{{template "service" .Service}}
{{- else if eq .X "method" -}}
`{{.Method.SnakeName}}()`
{{- else if eq .X "entity" -}}
{{template "entity" .Entity}}
{{- else if eq .X "field" -}}
`{{.Field.SnakeName}}`
{{- end}}
{{- end -}}

{{- define "suffix-what" -}}
{{if eq .Type "package" }} package{{if gt (len .Changes) 1}}s{{end}}
{{- else if eq .Type "method" }} method{{if gt (len .Changes) 1}}s{{end}} for {{template "service" .Parent.Service}}
{{- else if eq .Type "entity" }} dataclass{{if gt (len .Changes) 1}}es{{end}}
{{- else if eq .Type "field" }} field{{if gt (len .Changes) 1}}s{{end}} for {{template "entity" .Parent.Entity}}
{{- end}}
{{- end -}}

{{- define "other-what" -}}
{{if eq .X "package" -}}
`databricks.sdk.service.{{.Package.Name}}` package
{{- else if eq .X "service" -}}
Expand Down
14 changes: 14 additions & 0 deletions .codegen/changelog_config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
change_types:
- message: New Features and Improvements
tag: "[Feature]"
- message: Bug Fixes
tag: "[Fix]"
- message: Documentation
tag: "[Doc]"
- message: Internal Changes
tag: "[Internal]"
# Does not appear in the Changelog. Only for PR validation.
- message: Release
tag: "[Release]"
# Default for messages without a tag
- message: Other Changes
6 changes: 3 additions & 3 deletions .codegen/error_overrides.py.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ _ALL_OVERRIDES = [
debug_name="{{.Name}}",
path_regex=re.compile(r'{{.PathRegex}}'),
verb="{{.Verb}}",
status_code_matcher=re.compile(r'{{.StatusCodeMatcher}}'),
error_code_matcher=re.compile(r'{{.ErrorCodeMatcher}}'),
message_matcher=re.compile(r'{{.MessageMatcher}}'),
status_code_matcher=re.compile(r'{{replaceAll "'" "\\'" .StatusCodeMatcher}}'),
error_code_matcher=re.compile(r'{{replaceAll "'" "\\'" .ErrorCodeMatcher}}'),
message_matcher=re.compile(r'{{replaceAll "'" "\\'" .MessageMatcher}}'),
custom_error={{.OverrideErrorCode.PascalName}},
),
{{- end }}
Expand Down
76 changes: 57 additions & 19 deletions .codegen/service.py.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@ from typing import Dict, List, Any, Iterator, Type, Callable, Optional, BinaryIO
import time
import random
import logging
import requests

from ..data_plane import DataPlaneService
from ..errors import OperationTimeout, OperationFailed
from ._internal import _enum, _from_dict, _repeated_dict, _repeated_enum, Wait, _escape_multi_segment_path_parameter
from ..oauth import Token

_LOG = logging.getLogger('databricks.sdk')

Expand Down Expand Up @@ -100,12 +104,16 @@ class {{.PascalName}}{{if eq "List" .PascalName}}Request{{end}}:{{if .Descriptio
{{- end -}}
{{- end -}}

{{range .Services}} {{if not .IsDataPlane}}
{{range .Services}}
class {{.PascalName}}API:{{if .Description}}
"""{{.Comment " " 110}}"""
{{end}}
def __init__(self, api_client):
def __init__(self, api_client{{if .IsDataPlane}}, control_plane{{end}}):
self._api = api_client
{{if .IsDataPlane -}}
self._control_plane = control_plane
self._data_plane_service = DataPlaneService()
{{end -}}
{{range .Subservices}}
self._{{.SnakeName}} = {{.PascalName}}API(self._api){{end}}

Expand Down Expand Up @@ -183,6 +191,9 @@ class {{.PascalName}}API:{{if .Description}}
{{if .Request -}}
{{template "method-serialize" .}}
{{- end}}
{{- if .Service.IsDataPlane}}
{{template "data-plane" .}}
{{- end}}
{{template "method-headers" . }}
{{if .Response.HasHeaderField -}}
{{template "method-response-headers" . }}
Expand All @@ -195,7 +206,27 @@ class {{.PascalName}}API:{{if .Description}}
return self.{{template "safe-snake-name" .}}({{range $i, $x := .Request.Fields}}{{if $i}}, {{end}}{{template "safe-snake-name" .}}={{template "safe-snake-name" .}}{{end}}).result(timeout=timeout)
{{end}}
{{end -}}
{{end}}
{{- end}}

{{define "data-plane" -}}
def info_getter():
response = self._control_plane.{{.Service.DataPlaneInfoMethod.SnakeName}}(
{{- range .Service.DataPlaneInfoMethod.Request.Fields }}
{{.SnakeName}} = {{.SnakeName}},
{{- end}}
)
if response.{{(index .DataPlaneInfoFields 0).SnakeName}} is None:
raise Exception("Resource does not support direct Data Plane access")
return response{{range .DataPlaneInfoFields}}.{{.SnakeName}}{{end}}

get_params = [{{- range .Service.DataPlaneInfoMethod.Request.Fields }}{{.SnakeName}},{{end}}]
data_plane_details = self._data_plane_service.get_data_plane_details('{{.SnakeName}}', get_params, info_getter, self._api.get_oauth_token)
token = data_plane_details.token

def auth(r: requests.PreparedRequest) -> requests.PreparedRequest:
authorization = f"{token.token_type} {token.access_token}"
r.headers["Authorization"] = authorization
return r
{{- end}}

{{define "method-parameters" -}}
Expand Down Expand Up @@ -264,7 +295,7 @@ class {{.PascalName}}API:{{if .Description}}
{{if .NeedsOffsetDedupe -}}
# deduplicate items that may have been added during iteration
seen = set()
{{- end}}{{if and .Pagination.Offset (not (eq .Path "/api/2.0/clusters/events")) }}
{{- end}}{{if and .Pagination.Offset (not (eq .Path "/api/2.1/clusters/events")) }}
query['{{.Pagination.Offset.Name}}'] =
{{- if eq .Pagination.Increment 1 -}}
1
Expand All @@ -290,7 +321,7 @@ class {{.PascalName}}API:{{if .Description}}
if '{{.Pagination.Token.Bind.Name}}' not in json or not json['{{.Pagination.Token.Bind.Name}}']:
return
{{if or (eq "GET" .Verb) (eq "HEAD" .Verb)}}query{{else}}body{{end}}['{{.Pagination.Token.PollField.Name}}'] = json['{{.Pagination.Token.Bind.Name}}']
{{- else if eq .Path "/api/2.0/clusters/events" -}}
{{- else if eq .Path "/api/2.1/clusters/events" -}}
if 'next_page' not in json or not json['next_page']:
return
body = json['next_page']
Expand Down Expand Up @@ -319,25 +350,32 @@ class {{.PascalName}}API:{{if .Description}}
{{- else if .Response.MapValue -}}
return res
{{- else -}}
return {{.Response.PascalName}}.from_dict(res)
return {{template "type" .Response}}.from_dict(res)
{{- end}}
{{- end}}
{{- end}}

{{define "method-do" -}}
self._api.do('{{.Verb}}',
{{ template "path" . }}
{{if .Request}}
{{- if .Request.HasQueryField}}, query=query{{end}}
{{- if .Request.MapValue}}, body=contents
{{- else if .Request.HasJsonField}}, body=body{{end}}
{{end}}
, headers=headers
{{if .Response.HasHeaderField -}}
, response_headers=response_headers
{{- end}}
{{- if and .IsRequestByteStream .RequestBodyField }}, data={{template "safe-snake-name" .RequestBodyField}}{{ end }}
{{- if .IsResponseByteStream }}, raw=True{{ end }})
self._api.do('{{.Verb}}',
{{- if .Service.IsDataPlane -}}
url=data_plane_details.endpoint_url
{{- else -}}
{{ template "path" . }}
{{- end -}}
{{if .Request}}
{{- if .Request.HasQueryField}}, query=query{{end}}
{{- if .Request.MapValue}}, body=contents
{{- else if .Request.HasJsonField}}, body=body{{end}}
{{end}}
, headers=headers
{{if .Response.HasHeaderField -}}
, response_headers=response_headers
{{- end}}
{{- if and .IsRequestByteStream .RequestBodyField }}, data={{template "safe-snake-name" .RequestBodyField}}{{ end }}
{{- if .Service.IsDataPlane -}}
,auth=auth
{{- end -}}
{{- if .IsResponseByteStream }}, raw=True{{ end }})
{{- end}}

{{- define "path" -}}
Expand Down
Loading