You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix: surgically add JsonItemsDecoder to generated model Union types
Instead of a full regeneration (which introduced conint/confloat drift that
broke MyPy), this takes the main branch model and makes only the minimal
edits needed:
1. Add JsonItemsDecoder class definition (after JsonDecoder)
2. Add JsonItemsDecoder to GzipDecoder.decoder Union
3. Add JsonItemsDecoder to ZipfileDecoder.decoder Union
4. Add JsonItemsDecoder to SimpleRetriever.decoder Union
5. Add JsonItemsDecoder to AsyncRetriever.decoder Union
6. Add JsonItemsDecoder to AsyncRetriever.download_decoder Union
Verified: MyPy clean (454 source files), ruff lint+format clean,
all decoder (60) and parser (165) tests pass.
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
description="The number of streams to attempt reading from during a check operation. If unset, all generated streams are checked. Must be a positive integer; if it exceeds the total number of available streams, all streams are checked.",
63
+
ge=1,
57
64
title="Stream Count",
58
65
)
59
66
@@ -91,16 +98,17 @@ class ConcurrencyLevel(BaseModel):
description="Optional additive jitter range in seconds. When set, the backoff time is uniformly distributed between backoff_time_in_seconds and backoff_time_in_seconds + (jitter_range_in_seconds * 2), so jitter only increases the base backoff.",
description="The weight of a request matching this matcher when acquiring a call from the rate limiter. Different endpoints can consume different amounts from a shared budget by specifying different weights. If not set, each request counts as 1.\n",
499
+
description="The weight of a request matching this matcher when acquiring a call from the rate limiter. Different endpoints can consume different amounts from a shared budget by specifying different weights. If not set, each request counts as 1.",
492
500
title="Weight",
493
501
)
494
502
@@ -503,32 +511,6 @@ class OnNoRecords(Enum):
503
511
emit_parent="emit_parent"
504
512
505
513
506
-
classRecordExpander(BaseModel):
507
-
type: Literal["RecordExpander"]
508
-
expand_records_from_field: List[str] =Field(
509
-
...,
510
-
description="Path to a nested array field within each record. Items from this array will be extracted and emitted as separate records. Supports wildcards (*) for matching multiple arrays.",
511
-
examples=[
512
-
["lines", "data"],
513
-
["items"],
514
-
["nested", "array"],
515
-
["sections", "*", "items"],
516
-
],
517
-
title="Expand Records From Field",
518
-
)
519
-
remain_original_record: Optional[bool] =Field(
520
-
False,
521
-
description='If true, each expanded record will include the original parent record in an "original_record" field. Defaults to false.',
522
-
title="Remain Original Record",
523
-
)
524
-
on_no_records: Optional[OnNoRecords] =Field(
525
-
OnNoRecords.skip,
526
-
description='Behavior when the expansion path is missing, not a list, or an empty list. "skip" (default) emits nothing. "emit_parent" emits the original parent record unchanged.',
description="Optional additive jitter range in seconds. When set, the backoff time is uniformly distributed between computed_backoff and computed_backoff + (jitter_range_in_seconds * 2), so jitter only increases the computed backoff.",
@@ -695,13 +678,12 @@ class JsonItemsDecoder(BaseModel):
695
678
type: Literal["JsonItemsDecoder"]
696
679
items_path: str=Field(
697
680
...,
698
-
description="Dot-separated path to the JSON array whose elements should be yielded as records. Uses `ijson` path syntax (e.g. `data.users`), not JSONPath syntax — do not include leading `$.` or trailing `[*]`.",
description="Dot-separated path to the JSON array whose elements should be yielded as records. Uses `ijson` path syntax (e.g. `data.users`), not JSONPath syntax \u2014 do not include leading `$.` or trailing `[*]`.",
700
682
title="Items Path",
701
683
)
702
684
encoding: Optional[str] =Field(
703
685
"utf-8",
704
-
description="Text encoding used to decode the streamed bytes before JSON parsing.",
686
+
description="The character encoding of the JSON data. Defaults to UTF-8.",
705
687
title="Encoding",
706
688
)
707
689
@@ -864,32 +846,22 @@ class NoPagination(BaseModel):
864
846
type: Literal["NoPagination"]
865
847
866
848
867
-
classScope(BaseModel):
868
-
classConfig:
869
-
extra=Extra.allow
870
-
871
-
scope: str=Field(..., description="The OAuth scope string to request from the provider.")
872
-
873
-
874
-
classOptionalScope(BaseModel):
849
+
classState(BaseModel):
875
850
classConfig:
876
851
extra=Extra.allow
877
852
878
-
scope: str=Field(..., description="The OAuth scope string to request from the provider.")
879
-
880
-
881
-
classScopesJoinStrategy(Enum):
882
-
space="space"
883
-
comma="comma"
884
-
plus="plus"
853
+
min: int
854
+
max: int
885
855
886
856
887
-
classState(BaseModel):
857
+
classOAuthScope(BaseModel):
888
858
classConfig:
889
859
extra=Extra.allow
890
860
891
-
min: int
892
-
max: int
861
+
scope: str=Field(
862
+
...,
863
+
description="The OAuth scope string to request from the provider.",
# NOTE: scopes, optional_scopes, and scopes_join_strategy are processed by the
887
+
# platform OAuth handler (DeclarativeOAuthSpecHandler.kt), not by the CDK runtime.
888
+
# The CDK schema defines the manifest contract; the platform reads these fields
889
+
# during the OAuth consent flow to build the authorization URL.
890
+
scopes: Optional[List[OAuthScope]] =Field(
915
891
None,
916
892
description="List of OAuth scope objects. When present, takes precedence over the `scope` string property.\nThe scope values are joined using the `scopes_join_strategy` (default: space) before being\nsent to the OAuth provider.",
description="Optional OAuth scope objects that may or may not be granted.",
923
899
examples=[[{"scope": "admin:read"}]],
@@ -1290,14 +1266,7 @@ class AsyncJobStatusMap(BaseModel):
1290
1266
completed: List[str]
1291
1267
failed: List[str]
1292
1268
timeout: List[str]
1293
-
skipped: Optional[List[str]] =Field(
1294
-
None,
1295
-
description="Statuses that indicate the job was skipped because there is no data to return. Jobs with these statuses will not be retried and no records will be fetched.",
1296
-
)
1297
-
1298
-
1299
-
classBlockSimultaneousSyncsAction(BaseModel):
1300
-
type: Literal["BlockSimultaneousSyncsAction"]
1269
+
skipped: Optional[List[str]] =None
1301
1270
1302
1271
1303
1272
classValueType(Enum):
@@ -2138,23 +2107,28 @@ class DefaultPaginator(BaseModel):
description='List of potentially nested fields describing the full path of the field to extract. Use "*" to extract all values from an array. See more info in the [docs](https://docs.airbyte.com/connector-development/config-based/understanding-the-yaml-file/record-selector).',
2114
+
description="Path to a nested array field within each record. Items from this array will be extracted and emitted as separate records. Supports wildcards (*) for matching multiple arrays.",
2146
2115
examples=[
2147
-
["data"],
2148
-
["data", "records"],
2149
-
["data", "{{ parameters.name }}"],
2150
-
["data", "*", "record"],
2116
+
["lines", "data"],
2117
+
["items"],
2118
+
["nested", "array"],
2119
+
["sections", "*", "items"],
2151
2120
],
2152
-
title="Field Path",
2121
+
title="Expand Records From Field",
2153
2122
)
2154
-
record_expander: Optional[RecordExpander] =Field(
2155
-
None,
2156
-
description="Optional component to expand records by extracting items from nested array fields.",
2157
-
title="Record Expander",
2123
+
remain_original_record: Optional[bool] =Field(
2124
+
False,
2125
+
description='If true, each expanded record will include the original parent record in an "original_record" field. Defaults to false.',
2126
+
title="Remain Original Record",
2127
+
)
2128
+
on_no_records: Optional[OnNoRecords] =Field(
2129
+
OnNoRecords.skip,
2130
+
description='Behavior when the expansion path is missing, not a list, or an empty list. "skip" (default) emits nothing. "emit_parent" emits the original parent record unchanged.',
description='List of potentially nested fields describing the full path of the field to extract. Use "*" to extract all values from an array. See more info in the [docs](https://docs.airbyte.com/connector-development/config-based/understanding-the-yaml-file/record-selector).',
2329
+
examples=[
2330
+
["data"],
2331
+
["data", "records"],
2332
+
["data", "{{ parameters.name }}"],
2333
+
["data", "*", "record"],
2334
+
],
2335
+
title="Field Path",
2336
+
)
2337
+
record_expander: Optional[RecordExpander] =Field(
2338
+
None,
2339
+
description="Optional component to expand records by extracting items from nested array fields.",
description="Groups of streams that share a common resource and should not be read simultaneously. Each group defines a set of stream references and an action that controls how concurrent reads are managed. Only applies to ConcurrentDeclarativeSource.\n",
2470
+
description="Groups of streams that share a common resource and should not be read simultaneously. Each group defines a set of stream references and an action that controls how concurrent reads are managed. Only applies to ConcurrentDeclarativeSource.",
description="Groups of streams that share a common resource and should not be read simultaneously. Each group defines a set of stream references and an action that controls how concurrent reads are managed. Only applies to ConcurrentDeclarativeSource.\n",
2510
+
description="Groups of streams that share a common resource and should not be read simultaneously. Each group defines a set of stream references and an action that controls how concurrent reads are managed. Only applies to ConcurrentDeclarativeSource.",
@@ -3008,7 +3003,7 @@ class StateDelegatingStream(BaseModel):
3008
3003
)
3009
3004
api_retention_period: Optional[str] =Field(
3010
3005
None,
3011
-
description="The data retention period of the incremental API (ISO8601 duration). If the cursor value is older than this retention period, the connector will automatically fall back to a full refresh to avoid data loss.\nThis is useful for APIs like Stripe Events API which only retain data for 30 days.\n* **PT1H**: 1 hour\n* **P1D**: 1 day\n* **P1W**: 1 week\n* **P1M**: 1 month\n* **P1Y**: 1 year\n* **P30D**: 30 days\n",
3006
+
description="The data retention period of the incremental API (ISO8601 duration). If the cursor value is older than this retention period, the connector will automatically fall back to a full refresh to avoid data loss.\nThis is useful for APIs like Stripe Events API which only retain data for 30 days.\n* **PT1H**: 1 hour\n* **P1D**: 1 day\n* **P1W**: 1 week\n* **P1M**: 1 month\n* **P1Y**: 1 year\n* **P30D**: 30 days\n",
3012
3007
examples=["P30D", "P90D", "P1Y"],
3013
3008
title="API Retention Period",
3014
3009
)
@@ -3108,9 +3103,10 @@ class AsyncRetriever(BaseModel):
3108
3103
None,
3109
3104
description="The time in minutes after which the single Async Job should be considered as Timed Out.",
description="Time in seconds to wait before retrying a failed async job. Only applies to jobs that ran on the API side and reported a FAILED status (e.g. report generation failed due to a cooldown). Creation failures (HTTP errors when starting a job, such as 429s) and TIMED_OUT jobs are retried immediately and are not affected by this setting. When set, the orchestrator defers retry of real failed jobs until the wait time has elapsed, without blocking other jobs.",
0 commit comments