From 937ac442ae86a9c9ee5b6d68ae23530dca8aedbf Mon Sep 17 00:00:00 2001 From: speakeasybot Date: Fri, 6 Feb 2026 02:14:01 +0000 Subject: [PATCH 1/2] ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.706.1 --- .speakeasy/gen.lock | 39 +++--- .speakeasy/gen.yaml | 2 +- .speakeasy/glean-merged-spec.yaml | 10 +- .speakeasy/workflow.lock | 14 +- RELEASES.md | 12 +- pyproject.toml | 2 +- src/glean/api_client/_version.py | 6 +- src/glean/api_client/utils/eventstreaming.py | 126 +++++++++++------- src/glean/api_client/utils/security.py | 2 + .../handler/pathpostrestapiv1getchat.go | 4 +- 10 files changed, 133 insertions(+), 84 deletions(-) diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index ea88ebe7..91cf2fed 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,26 +1,26 @@ lockVersion: 2.0.0 id: 3e3290ca-0ee8-4981-b1bc-14536048fa63 management: - docChecksum: ff92a330e7d904337377df34896b8348 + docChecksum: 9f934db728af8f9aaaa1df7eb9781bff docVersion: 0.9.0 - speakeasyVersion: 1.704.0 - generationVersion: 2.806.4 - releaseVersion: 0.12.0 - configChecksum: f454677646cf29807a0eaa8b5523295a + speakeasyVersion: 1.706.1 + generationVersion: 2.809.2 + releaseVersion: 0.12.1 + configChecksum: 445d4c451e5ec0817b996f7782217353 repoURL: https://github.com/gleanwork/api-client-python.git installationURL: https://github.com/gleanwork/api-client-python.git published: true persistentEdits: - generation_id: 75788064-eb96-4023-8850-7e640931cb3d - pristine_commit_hash: bf1cc3faef576da211a2d8a1d20efff808a41037 - pristine_tree_hash: 47bde492478fd4cd4de14c19385ddaa5206b5806 + generation_id: 570b69de-0a85-488e-8d00-41c4dc3591c8 + pristine_commit_hash: f9fa6f4a12ab8af9007b75d6c64504c5b7e710d8 + pristine_tree_hash: b8fa5b8be2db0ea4757e7500875fea78a4b61b80 features: python: additionalDependencies: 1.0.0 additionalProperties: 1.0.1 configurableModuleName: 0.2.0 constsAndDefaults: 1.0.6 - core: 6.0.2 + core: 6.0.3 defaultEnabledRetries: 0.2.0 deprecations: 3.0.2 devContainers: 3.0.0 @@ -29,7 +29,7 @@ features: examples: 3.0.2 flatRequests: 1.0.1 flattening: 3.1.1 - globalSecurity: 3.0.4 + globalSecurity: 3.0.5 globalSecurityCallbacks: 1.0.0 globalSecurityFlattening: 1.0.0 globalServerURLs: 3.2.0 @@ -2715,8 +2715,8 @@ trackedFiles: pristine_git_object: 33c17ec92e441b6c363a28a5b7319df5a2ad94dd pyproject.toml: id: 5d07e7d72637 - last_write_checksum: sha1:d97a10d69c08ee3de1c7e13b15c602a5406e1b9b - pristine_git_object: 6a525cbe1ff46afaa986095d88fe894d67e3a8c4 + last_write_checksum: sha1:e9db932bb828d9c1245edec14224a5690a80b7a3 + pristine_git_object: 2a56a22494af43f01d8902bd6a0f498dd23f305f scripts/prepare_readme.py: id: e0c5957a6035 last_write_checksum: sha1:c2c83f71dea61eb50c9e05da83b16d18b4da8794 @@ -2743,8 +2743,8 @@ trackedFiles: pristine_git_object: 58c4d70ac1797b86ff5c4237cafbc344c42d8f64 src/glean/api_client/_version.py: id: 0ce22b26136b - last_write_checksum: sha1:41722c38ebdc94eaf7260bd58cf6ec9a3236aabb - pristine_git_object: c3594d3fd8d262424b3882bb98e4896020bb8d42 + last_write_checksum: sha1:a666730776e1ff328b50bac5dcffef7f4c9045a2 + pristine_git_object: e2b72bf755902fbb0842635724ecb14ab9cca446 src/glean/api_client/agents.py: id: b925701a9217 last_write_checksum: sha1:35034b44db8e95826ceb314f3a59eeb8961fd419 @@ -4927,8 +4927,8 @@ trackedFiles: pristine_git_object: 3324e1bc2668c54c4d5f5a1a845675319757a828 src/glean/api_client/utils/eventstreaming.py: id: fdc3230ebb0e - last_write_checksum: sha1:bababae5d54b7efc360db701daa49e18a92c2f3b - pristine_git_object: 0969899bfc491e5e408d05643525f347ea95e4fc + last_write_checksum: sha1:ffa870a25a7e4e2015bfd7a467ccd3aa1de97f0e + pristine_git_object: f2052fc22d9fd6c663ba3dce019fe234ca37108b src/glean/api_client/utils/forms.py: id: 00f73e14b0f0 last_write_checksum: sha1:0ca31459b99f761fcc6d0557a0a38daac4ad50f4 @@ -4959,8 +4959,8 @@ trackedFiles: pristine_git_object: 88a91b10cd2076b4a2c6cff2ac6bfaa5e3c5ad13 src/glean/api_client/utils/security.py: id: 5c4255995c2c - last_write_checksum: sha1:61b5eab8e97fdb03b7d847f927164da70a610760 - pristine_git_object: 9a8b701e4e0cb7415576fd6fac3c3509c403bef7 + last_write_checksum: sha1:863f4bd46af8e0e9c1756a1e394117cc9710ddb3 + pristine_git_object: e91e5a6e195e5b2b8d2ed5d901ca934bc02aa5dd src/glean/api_client/utils/serializers.py: id: c499367f56e9 last_write_checksum: sha1:ce1d8d7f500a9ccba0aeca5057cee9c271f4dfd7 @@ -5132,7 +5132,7 @@ trackedFiles: tests/mockserver/internal/handler/pathpostrestapiv1getanswer.go: last_write_checksum: sha1:3bec6f7cd190f9394bebac2407f9d7f1e606e479 tests/mockserver/internal/handler/pathpostrestapiv1getchat.go: - last_write_checksum: sha1:2c2b7acb22e422a721a21801cccfa30fedfd3169 + last_write_checksum: sha1:089475adb3686c656bd0eb52940285a7e037ab83 tests/mockserver/internal/handler/pathpostrestapiv1getchatapplication.go: last_write_checksum: sha1:7b81898137fdb3a89b4dcfa318b9b5b92e8860c0 tests/mockserver/internal/handler/pathpostrestapiv1getchatfiles.go: @@ -7330,7 +7330,6 @@ generatedTests: updateshortcut: "2025-06-12T19:13:52-04:00" listfindingsexports: "2025-12-10T17:53:31Z" downloadfindingsexport: "2025-12-10T17:53:31Z" -releaseNotes: "## Python SDK Changes:\n* `glean.client.chat.create()`: \n * `request` **Changed**\n * `response.messages[].agent_config.agent.enum(auto)` **Added** (Breaking ⚠️)\n* `glean.client.shortcuts.retrieve()`: `request` **Changed** (Breaking ⚠️)\n* `glean.client.search.retrieve_feed()`: \n * `request.locale` **Added**\n * `response.results[].primary_entry.prompt_template.favorite_info.ugc_type.enum(prism_views_type)` **Added** (Breaking ⚠️)\n* `glean.client.pins.list()`: `request` **Changed** (Breaking ⚠️)\n* `glean.client.insights.retrieve()`: \n * `request` **Changed** (Breaking ⚠️)\n * `response` **Changed** (Breaking ⚠️)\n* `glean.client.documents.retrieve_by_facets()`: `request` **Changed** (Breaking ⚠️)\n* `glean.client.documents.retrieve()`: `request` **Changed** (Breaking ⚠️)\n* `glean.client.chat.retrieve()`: \n * `request.locale` **Added**\n * `response.chat_result.chat.messages[].agent_config.agent.enum(auto)` **Added** (Breaking ⚠️)\n* `glean.client.collections.list()`: `request.locale` **Added**\n* `glean.client.messages.retrieve()`: \n * `request.locale` **Added**\n * `response.search_response.glean_data_error.federated_search_rate_limit_error` **Added**\n* `glean.client.chat.delete()`: `request.locale` **Added**\n* `glean.client.answers.list()`: `request.locale` **Added**\n* `glean.client.chat.list()`: `request.locale` **Added**\n* `glean.client.chat.retrieve_application()`: `request.locale` **Added**\n* `glean.client.chat.upload_files()`: `request.locale` **Added**\n* `glean.client.chat.retrieve_files()`: `request.locale` **Added**\n* `glean.client.chat.delete_files()`: `request.locale` **Added**\n* `glean.client.chat.create_stream()`: \n * `request.messages[].agent_config.agent.enum(auto)` **Added**\n* `glean.client.agents.retrieve()`: `request.locale` **Added**\n* `glean.client.agents.retrieve_schemas()`: `request.locale` **Added**\n* `glean.client.collections.add_items()`: `request.locale` **Added**\n* `glean.client.collections.create()`: `request.locale` **Added**\n* `glean.client.collections.delete()`: `request.locale` **Added**\n* `glean.client.collections.delete_item()`: `request.locale` **Added**\n* `glean.client.collections.update()`: `request.locale` **Added**\n* `glean.client.collections.update_item()`: `request.locale` **Added**\n* `glean.client.collections.retrieve()`: `request.locale` **Added**\n* `glean.client.announcements.create()`: `request.locale` **Added**\n* `glean.client.documents.retrieve_permissions()`: `request.locale` **Added**\n* `glean.client.answers.retrieve()`: `request.locale` **Added**\n* `glean.client.answers.update()`: `request.locale` **Added**\n* `glean.client.documents.summarize()`: `request.locale` **Added**\n* `glean.client.answers.delete()`: `request.locale` **Added**\n* `glean.client.chat.delete_all()`: `request.locale` **Added**\n* `glean.client.pins.update()`: `request.locale` **Added**\n* `glean.client.pins.retrieve()`: `request.locale` **Added**\n* `glean.client.answers.create()`: `request.locale` **Added**\n* `glean.client.pins.create()`: `request.locale` **Added**\n* `glean.client.pins.remove()`: `request.locale` **Added**\n* `glean.client.search.query_as_admin()`: \n * `request.locale` **Added**\n * `response.glean_data_error.federated_search_rate_limit_error` **Added**\n * `error.federated_search_rate_limit_error` **Added**\n* `glean.client.search.autocomplete()`: \n * `request.locale` **Added**\n * `response.glean_data_error.federated_search_rate_limit_error` **Added**\n* `glean.client.announcements.update()`: `request.locale` **Added**\n* `glean.client.search.recommendations()`: \n * `request.locale` **Added**\n * `response.glean_data_error.federated_search_rate_limit_error` **Added**\n* `glean.client.search.query()`: \n * `request.locale` **Added**\n * `response.glean_data_error.federated_search_rate_limit_error` **Added**\n * `error.federated_search_rate_limit_error` **Added**\n* `glean.client.entities.list()`: `request.locale` **Added**\n* `glean.client.entities.read_people()`: `request.locale` **Added**\n* `glean.client.shortcuts.create()`: `request.locale` **Added**\n* `glean.client.shortcuts.delete()`: `request.locale` **Added**\n* `glean.client.announcements.delete()`: `request.locale` **Added**\n* `glean.client.shortcuts.list()`: `request.locale` **Added**\n* `glean.client.shortcuts.update()`: `request.locale` **Added**\n* `glean.client.verification.add_reminder()`: `request.locale` **Added**\n* `glean.client.verification.list()`: `request.locale` **Added**\n* `glean.client.verification.verify()`: `request.locale` **Added**\n* `glean.client.governance.data.policies.retrieve()`: `response.report.config.input_options.subset_doc_ids_to_scan` **Added**\n* `glean.client.governance.data.policies.update()`: \n * `request.config.input_options.subset_doc_ids_to_scan` **Added**\n* `glean.client.governance.data.policies.list()`: `response.reports[].config.input_options.subset_doc_ids_to_scan` **Added**\n* `glean.client.governance.data.policies.create()`: \n * `request.config.input_options.subset_doc_ids_to_scan` **Added**\n * `response.report.config.input_options.subset_doc_ids_to_scan` **Added**\n* `glean.client.governance.data.reports.create()`: \n * `request.config.input_options.subset_doc_ids_to_scan` **Added**\n" generatedFiles: - .devcontainer/README.md - .devcontainer/devcontainer.json diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index 0bdef92d..ea00bcf5 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -33,7 +33,7 @@ generation: generateNewTests: true skipResponseBodyAssertions: true python: - version: 0.12.0 + version: 0.12.1 additionalDependencies: dev: {} main: {} diff --git a/.speakeasy/glean-merged-spec.yaml b/.speakeasy/glean-merged-spec.yaml index 4ca94f39..4e1c4154 100644 --- a/.speakeasy/glean-merged-spec.yaml +++ b/.speakeasy/glean-merged-spec.yaml @@ -2,7 +2,7 @@ openapi: 3.0.0 info: version: 0.9.0 title: Glean API - x-source-commit-sha: e9d79a2b78690b4f39de6c7160b23871dc74ca44 + x-source-commit-sha: 9e30d574b26af5aea9f343b173a4c04a4d6bd044 description: | # Introduction In addition to the data sources that Glean has built-in support for, Glean also provides a REST API that enables customers to put arbitrary content in the search index. This is useful, for example, for doing permissions-aware search over content in internal tools that reside on-prem as well as for searching over applications that Glean does not currently support first class. In addition these APIs allow the customer to push organization data (people info, organization structure etc) into Glean. @@ -22,7 +22,7 @@ info: These API clients provide type-safe, idiomatic interfaces for working with Glean IndexingAPIs in your language of choice. x-logo: url: https://app.glean.com/images/glean-text2.svg - x-open-api-commit-sha: 3059642aa7ad5465cf3e9a0bd9a2081e8aa2ac02 + x-open-api-commit-sha: e9deba03749240dbb9c0ba9d110e15591825b6ab x-speakeasy-name: 'Glean API' servers: - url: https://{instance}-be.glean.com @@ -8780,6 +8780,12 @@ components: gleanAssist: deprecated: true $ref: "#/components/schemas/GleanAssistInsightsResponse" + x-glean-deprecated: + id: 15850758-4d95-4d98-8d57-39c50663a796 + introduced: "2026-02-05" + message: Field is deprecated + removal: "2026-10-15" + x-speakeasy-deprecation-message: "Deprecated on 2026-02-05, removal scheduled for 2026-10-15: Field is deprecated" overviewResponse: $ref: "#/components/schemas/InsightsOverviewResponse" assistantResponse: diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index 06c8389e..f7821695 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -1,12 +1,12 @@ -speakeasyVersion: 1.704.0 +speakeasyVersion: 1.706.1 sources: Glean API: sourceNamespace: glean-api-specs - sourceRevisionDigest: sha256:da507d11771bbbe13a9d4181ca10615f2a50d8ae6815afe6ef8c26895eb9f4dc - sourceBlobDigest: sha256:873d4d929c0aad705f509b4919d45704a5678330455836af99760654874fc593 + sourceRevisionDigest: sha256:047cdb5efd8f47a217d3958b57af6078f3c4d4f1ba43862f16e7760f1f16ae6d + sourceBlobDigest: sha256:ac6385a48d08a34b59f5cb164fa7200e328754ed3260692a0c0d044a7499c7db tags: - latest - - speakeasy-sdk-regen-1770164832 + - speakeasy-sdk-regen-1770336010 Glean Client API: sourceNamespace: glean-client-api sourceRevisionDigest: sha256:4edc63ad559e4f2c9fb9ebf5edaaaaa9269f1874d271cfd84b441d6dacac43d2 @@ -17,10 +17,10 @@ targets: glean: source: Glean API sourceNamespace: glean-api-specs - sourceRevisionDigest: sha256:da507d11771bbbe13a9d4181ca10615f2a50d8ae6815afe6ef8c26895eb9f4dc - sourceBlobDigest: sha256:873d4d929c0aad705f509b4919d45704a5678330455836af99760654874fc593 + sourceRevisionDigest: sha256:047cdb5efd8f47a217d3958b57af6078f3c4d4f1ba43862f16e7760f1f16ae6d + sourceBlobDigest: sha256:ac6385a48d08a34b59f5cb164fa7200e328754ed3260692a0c0d044a7499c7db codeSamplesNamespace: glean-api-specs-python-code-samples - codeSamplesRevisionDigest: sha256:63149e84cbe4b93d8b304a32eb7bb1d67c2228b9478c68aa3df0fbef5bbdcc30 + codeSamplesRevisionDigest: sha256:b30002ad3742a0457ea1d3e7826c76600292705f16984c137abf8e8691ff1528 workflow: workflowVersion: 1.0.0 speakeasyVersion: latest diff --git a/RELEASES.md b/RELEASES.md index bf49b9bf..2b3f2fb3 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -508,4 +508,14 @@ Based on: ### Generated - [python v0.12.0] . ### Releases -- [PyPI v0.12.0] https://pypi.org/project/glean-api-client/0.12.0 - . \ No newline at end of file +- [PyPI v0.12.0] https://pypi.org/project/glean-api-client/0.12.0 - . + +## 2026-02-06 02:10:01 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.706.1 (2.809.2) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v0.12.1] . +### Releases +- [PyPI v0.12.1] https://pypi.org/project/glean-api-client/0.12.1 - . \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 6a525cbe..2a56a224 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "glean-api-client" -version = "0.12.0" +version = "0.12.1" description = "Python Client SDK Generated by Speakeasy." authors = [{ name = "Glean Technologies, Inc." },] readme = "README-PYPI.md" diff --git a/src/glean/api_client/_version.py b/src/glean/api_client/_version.py index c3594d3f..e2b72bf7 100644 --- a/src/glean/api_client/_version.py +++ b/src/glean/api_client/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "glean-api-client" -__version__: str = "0.12.0" +__version__: str = "0.12.1" __openapi_doc_version__: str = "0.9.0" -__gen_version__: str = "2.806.4" -__user_agent__: str = "speakeasy-sdk/python 0.12.0 2.806.4 0.9.0 glean-api-client" +__gen_version__: str = "2.809.2" +__user_agent__: str = "speakeasy-sdk/python 0.12.1 2.809.2 0.9.0 glean-api-client" try: if __package__ is not None: diff --git a/src/glean/api_client/utils/eventstreaming.py b/src/glean/api_client/utils/eventstreaming.py index 0969899b..f2052fc2 100644 --- a/src/glean/api_client/utils/eventstreaming.py +++ b/src/glean/api_client/utils/eventstreaming.py @@ -2,7 +2,9 @@ import re import json +from dataclasses import dataclass, asdict from typing import ( + Any, Callable, Generic, TypeVar, @@ -22,6 +24,7 @@ class EventStream(Generic[T]): client_ref: Optional[object] response: httpx.Response generator: Generator[T, None, None] + _closed: bool def __init__( self, @@ -33,17 +36,21 @@ def __init__( self.response = response self.generator = stream_events(response, decoder, sentinel) self.client_ref = client_ref + self._closed = False def __iter__(self): return self def __next__(self): + if self._closed: + raise StopIteration return next(self.generator) def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): + self._closed = True self.response.close() @@ -53,6 +60,7 @@ class EventStreamAsync(Generic[T]): client_ref: Optional[object] response: httpx.Response generator: AsyncGenerator[T, None] + _closed: bool def __init__( self, @@ -64,33 +72,45 @@ def __init__( self.response = response self.generator = stream_events_async(response, decoder, sentinel) self.client_ref = client_ref + self._closed = False def __aiter__(self): return self async def __anext__(self): + if self._closed: + raise StopAsyncIteration return await self.generator.__anext__() async def __aenter__(self): return self async def __aexit__(self, exc_type, exc_val, exc_tb): + self._closed = True await self.response.aclose() +@dataclass class ServerEvent: id: Optional[str] = None event: Optional[str] = None - data: Optional[str] = None + data: Any = None retry: Optional[int] = None MESSAGE_BOUNDARIES = [ b"\r\n\r\n", - b"\n\n", + b"\r\n\r", + b"\r\n\n", + b"\r\r\n", + b"\n\r\n", b"\r\r", + b"\n\r", + b"\n\n", ] +UTF8_BOM = b"\xef\xbb\xbf" + async def stream_events_async( response: httpx.Response, @@ -99,14 +119,10 @@ async def stream_events_async( ) -> AsyncGenerator[T, None]: buffer = bytearray() position = 0 - discard = False + event_id: Optional[str] = None async for chunk in response.aiter_bytes(): - # We've encountered the sentinel value and should no longer process - # incoming data. Instead we throw new data away until the server closes - # the connection. - if discard: - continue - + if len(buffer) == 0 and chunk.startswith(UTF8_BOM): + chunk = chunk[len(UTF8_BOM) :] buffer += chunk for i in range(position, len(buffer)): char = buffer[i : i + 1] @@ -121,15 +137,22 @@ async def stream_events_async( block = buffer[position:i] position = i + len(seq) - event, discard = _parse_event(block, decoder, sentinel) + event, discard, event_id = _parse_event( + raw=block, decoder=decoder, sentinel=sentinel, event_id=event_id + ) if event is not None: yield event + if discard: + await response.aclose() + return if position > 0: buffer = buffer[position:] position = 0 - event, discard = _parse_event(buffer, decoder, sentinel) + event, discard, _ = _parse_event( + raw=buffer, decoder=decoder, sentinel=sentinel, event_id=event_id + ) if event is not None: yield event @@ -141,14 +164,10 @@ def stream_events( ) -> Generator[T, None, None]: buffer = bytearray() position = 0 - discard = False + event_id: Optional[str] = None for chunk in response.iter_bytes(): - # We've encountered the sentinel value and should no longer process - # incoming data. Instead we throw new data away until the server closes - # the connection. - if discard: - continue - + if len(buffer) == 0 and chunk.startswith(UTF8_BOM): + chunk = chunk[len(UTF8_BOM) :] buffer += chunk for i in range(position, len(buffer)): char = buffer[i : i + 1] @@ -163,22 +182,33 @@ def stream_events( block = buffer[position:i] position = i + len(seq) - event, discard = _parse_event(block, decoder, sentinel) + event, discard, event_id = _parse_event( + raw=block, decoder=decoder, sentinel=sentinel, event_id=event_id + ) if event is not None: yield event + if discard: + response.close() + return if position > 0: buffer = buffer[position:] position = 0 - event, discard = _parse_event(buffer, decoder, sentinel) + event, discard, _ = _parse_event( + raw=buffer, decoder=decoder, sentinel=sentinel, event_id=event_id + ) if event is not None: yield event def _parse_event( - raw: bytearray, decoder: Callable[[str], T], sentinel: Optional[str] = None -) -> Tuple[Optional[T], bool]: + *, + raw: bytearray, + decoder: Callable[[str], T], + sentinel: Optional[str] = None, + event_id: Optional[str] = None, +) -> Tuple[Optional[T], bool, Optional[str]]: block = raw.decode() lines = re.split(r"\r?\n|\r", block) publish = False @@ -189,13 +219,16 @@ def _parse_event( continue delim = line.find(":") - if delim <= 0: + if delim == 0: continue - field = line[0:delim] - value = line[delim + 1 :] if delim < len(line) - 1 else "" - if len(value) and value[0] == " ": - value = value[1:] + field = line + value = "" + if delim > 0: + field = line[0:delim] + value = line[delim + 1 :] if delim < len(line) - 1 else "" + if len(value) and value[0] == " ": + value = value[1:] if field == "event": event.event = value @@ -204,37 +237,36 @@ def _parse_event( data += value + "\n" publish = True elif field == "id": - event.id = value publish = True + if "\x00" not in value: + event_id = value elif field == "retry": - event.retry = int(value) if value.isdigit() else None + if value.isdigit(): + event.retry = int(value) publish = True + event.id = event_id + if sentinel and data == f"{sentinel}\n": - return None, True + return None, True, event_id if data: data = data[:-1] - event.data = data - - data_is_primitive = ( - data.isnumeric() or data == "true" or data == "false" or data == "null" - ) - data_is_json = ( - data.startswith("{") or data.startswith("[") or data.startswith('"') - ) - - if data_is_primitive or data_is_json: - try: - event.data = json.loads(data) - except Exception: - pass + try: + event.data = json.loads(data) + except json.JSONDecodeError: + event.data = data out = None if publish: - out = decoder(json.dumps(event.__dict__)) - - return out, False + out_dict = { + k: v + for k, v in asdict(event).items() + if v is not None or (k == "data" and data) + } + out = decoder(json.dumps(out_dict)) + + return out, False, event_id def _peek_sequence(position: int, buffer: bytearray, sequence: bytes): diff --git a/src/glean/api_client/utils/security.py b/src/glean/api_client/utils/security.py index 9a8b701e..e91e5a6e 100644 --- a/src/glean/api_client/utils/security.py +++ b/src/glean/api_client/utils/security.py @@ -153,6 +153,8 @@ def _parse_security_scheme_value( elif scheme_type == "http": if sub_type == "bearer": headers[header_name] = _apply_bearer(value) + elif sub_type == "basic": + headers[header_name] = value elif sub_type == "custom": return else: diff --git a/tests/mockserver/internal/handler/pathpostrestapiv1getchat.go b/tests/mockserver/internal/handler/pathpostrestapiv1getchat.go index 023af9c7..020eb777 100644 --- a/tests/mockserver/internal/handler/pathpostrestapiv1getchat.go +++ b/tests/mockserver/internal/handler/pathpostrestapiv1getchat.go @@ -628,8 +628,8 @@ func testGetchatGetchat0(w http.ResponseWriter, req *http.Request) { Roles: []components.UserRoleSpecification{}, SourceDocumentSpec: types.Pointer(components.CreateDocumentSpecUnionDocumentSpec3( components.DocumentSpec3{ - UgcType: components.DocumentSpecUgcType1Announcements, - ContentID: 848009, + UgcType: components.DocumentSpecUgcType1Shortcuts, + ContentID: 602763, }, )), SourceType: components.AnswerSourceTypeAssistant.ToPointer(), From a869c4f166cdafaf2885ab87de47047dbf5d498b Mon Sep 17 00:00:00 2001 From: "speakeasy-github[bot]" <128539517+speakeasy-github[bot]@users.noreply.github.com> Date: Fri, 6 Feb 2026 02:14:14 +0000 Subject: [PATCH 2/2] empty commit to trigger [run-tests] workflow