airbyte-cdk 6.14.0__py3-none-any.whl → 6.15.0__py3-none-any.whl

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.
@@ -1241,6 +1241,7 @@ definitions:
1241
1241
  - "$ref": "#/definitions/KeysToLower"
1242
1242
  - "$ref": "#/definitions/KeysToSnakeCase"
1243
1243
  - "$ref": "#/definitions/FlattenFields"
1244
+ - "$ref": "#/definitions/KeysReplace"
1244
1245
  state_migrations:
1245
1246
  title: State Migrations
1246
1247
  description: Array of state migrations to be applied on the input state
@@ -1785,6 +1786,7 @@ definitions:
1785
1786
  - "$ref": "#/definitions/KeysToLower"
1786
1787
  - "$ref": "#/definitions/KeysToSnakeCase"
1787
1788
  - "$ref": "#/definitions/FlattenFields"
1789
+ - "$ref": "#/definitions/KeysReplace"
1788
1790
  schema_type_identifier:
1789
1791
  "$ref": "#/definitions/SchemaTypeIdentifier"
1790
1792
  $parameters:
@@ -1883,6 +1885,49 @@ definitions:
1883
1885
  $parameters:
1884
1886
  type: object
1885
1887
  additionalProperties: true
1888
+ KeysReplace:
1889
+ title: Keys Replace
1890
+ description: A transformation that replaces symbols in keys.
1891
+ type: object
1892
+ required:
1893
+ - type
1894
+ - old
1895
+ - new
1896
+ properties:
1897
+ type:
1898
+ type: string
1899
+ enum: [KeysReplace]
1900
+ old:
1901
+ type: string
1902
+ title: Old value
1903
+ description: Old value to replace.
1904
+ examples:
1905
+ - " "
1906
+ - "{{ record.id }}"
1907
+ - "{{ config['id'] }}"
1908
+ - "{{ stream_slice['id'] }}"
1909
+ interpolation_context:
1910
+ - config
1911
+ - record
1912
+ - stream_state
1913
+ - stream_slice
1914
+ new:
1915
+ type: string
1916
+ title: New value
1917
+ description: New value to set.
1918
+ examples:
1919
+ - "_"
1920
+ - "{{ record.id }}"
1921
+ - "{{ config['id'] }}"
1922
+ - "{{ stream_slice['id'] }}"
1923
+ interpolation_context:
1924
+ - config
1925
+ - record
1926
+ - stream_state
1927
+ - stream_slice
1928
+ $parameters:
1929
+ type: object
1930
+ additionalProperties: true
1886
1931
  IterableDecoder:
1887
1932
  title: Iterable Decoder
1888
1933
  description: Use this if the response consists of strings separated by new lines (`\n`). The Decoder will wrap each row into a JSON object with the `record` key.
@@ -721,6 +721,23 @@ class KeysToSnakeCase(BaseModel):
721
721
  parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
722
722
 
723
723
 
724
+ class KeysReplace(BaseModel):
725
+ type: Literal["KeysReplace"]
726
+ old: str = Field(
727
+ ...,
728
+ description="Old value to replace.",
729
+ examples=[" ", "{{ record.id }}", "{{ config['id'] }}", "{{ stream_slice['id'] }}"],
730
+ title="Old value",
731
+ )
732
+ new: str = Field(
733
+ ...,
734
+ description="New value to set.",
735
+ examples=["_", "{{ record.id }}", "{{ config['id'] }}", "{{ stream_slice['id'] }}"],
736
+ title="New value",
737
+ )
738
+ parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
739
+
740
+
724
741
  class FlattenFields(BaseModel):
725
742
  type: Literal["FlattenFields"]
726
743
  parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
@@ -1701,6 +1718,7 @@ class DeclarativeStream(BaseModel):
1701
1718
  KeysToLower,
1702
1719
  KeysToSnakeCase,
1703
1720
  FlattenFields,
1721
+ KeysReplace,
1704
1722
  ]
1705
1723
  ]
1706
1724
  ] = Field(
@@ -1875,6 +1893,7 @@ class DynamicSchemaLoader(BaseModel):
1875
1893
  KeysToLower,
1876
1894
  KeysToSnakeCase,
1877
1895
  FlattenFields,
1896
+ KeysReplace,
1878
1897
  ]
1879
1898
  ]
1880
1899
  ] = Field(
@@ -254,6 +254,9 @@ from airbyte_cdk.sources.declarative.models.declarative_component_schema import
254
254
  from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
255
255
  JwtPayload as JwtPayloadModel,
256
256
  )
257
+ from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
258
+ KeysReplace as KeysReplaceModel,
259
+ )
257
260
  from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
258
261
  KeysToLower as KeysToLowerModel,
259
262
  )
@@ -417,6 +420,9 @@ from airbyte_cdk.sources.declarative.transformations.add_fields import AddedFiel
417
420
  from airbyte_cdk.sources.declarative.transformations.flatten_fields import (
418
421
  FlattenFields,
419
422
  )
423
+ from airbyte_cdk.sources.declarative.transformations.keys_replace_transformation import (
424
+ KeysReplaceTransformation,
425
+ )
420
426
  from airbyte_cdk.sources.declarative.transformations.keys_to_lower_transformation import (
421
427
  KeysToLowerTransformation,
422
428
  )
@@ -509,6 +515,7 @@ class ModelToComponentFactory:
509
515
  GzipParserModel: self.create_gzip_parser,
510
516
  KeysToLowerModel: self.create_keys_to_lower_transformation,
511
517
  KeysToSnakeCaseModel: self.create_keys_to_snake_transformation,
518
+ KeysReplaceModel: self.create_keys_replace_transformation,
512
519
  FlattenFieldsModel: self.create_flatten_fields,
513
520
  IterableDecoderModel: self.create_iterable_decoder,
514
521
  XmlDecoderModel: self.create_xml_decoder,
@@ -630,6 +637,13 @@ class ModelToComponentFactory:
630
637
  ) -> KeysToSnakeCaseTransformation:
631
638
  return KeysToSnakeCaseTransformation()
632
639
 
640
+ def create_keys_replace_transformation(
641
+ self, model: KeysReplaceModel, config: Config, **kwargs: Any
642
+ ) -> KeysReplaceTransformation:
643
+ return KeysReplaceTransformation(
644
+ old=model.old, new=model.new, parameters=model.parameters or {}
645
+ )
646
+
633
647
  def create_flatten_fields(
634
648
  self, model: FlattenFieldsModel, config: Config, **kwargs: Any
635
649
  ) -> FlattenFields:
@@ -0,0 +1,61 @@
1
+ #
2
+ # Copyright (c) 2024 Airbyte, Inc., all rights reserved.
3
+ #
4
+
5
+ from dataclasses import InitVar, dataclass
6
+ from typing import Any, Dict, Mapping, Optional
7
+
8
+ from airbyte_cdk import InterpolatedString
9
+ from airbyte_cdk.sources.declarative.transformations import RecordTransformation
10
+ from airbyte_cdk.sources.types import Config, StreamSlice, StreamState
11
+
12
+
13
+ @dataclass
14
+ class KeysReplaceTransformation(RecordTransformation):
15
+ """
16
+ Transformation that applies keys names replacement.
17
+
18
+ Example usage:
19
+ - type: KeysReplace
20
+ old: " "
21
+ new: "_"
22
+ Result:
23
+ from: {"created time": ..., "customer id": ..., "user id": ...}
24
+ to: {"created_time": ..., "customer_id": ..., "user_id": ...}
25
+ """
26
+
27
+ old: str
28
+ new: str
29
+ parameters: InitVar[Mapping[str, Any]]
30
+
31
+ def __post_init__(self, parameters: Mapping[str, Any]) -> None:
32
+ self._old = InterpolatedString.create(self.old, parameters=parameters)
33
+ self._new = InterpolatedString.create(self.new, parameters=parameters)
34
+
35
+ def transform(
36
+ self,
37
+ record: Dict[str, Any],
38
+ config: Optional[Config] = None,
39
+ stream_state: Optional[StreamState] = None,
40
+ stream_slice: Optional[StreamSlice] = None,
41
+ ) -> None:
42
+ if config is None:
43
+ config = {}
44
+
45
+ kwargs = {"record": record, "stream_state": stream_state, "stream_slice": stream_slice}
46
+ old_key = str(self._old.eval(config, **kwargs))
47
+ new_key = str(self._new.eval(config, **kwargs))
48
+
49
+ def _transform(data: Dict[str, Any]) -> Dict[str, Any]:
50
+ result = {}
51
+ for key, value in data.items():
52
+ updated_key = key.replace(old_key, new_key)
53
+ if isinstance(value, dict):
54
+ result[updated_key] = _transform(value)
55
+ else:
56
+ result[updated_key] = value
57
+ return result
58
+
59
+ transformed_record = _transform(record)
60
+ record.clear()
61
+ record.update(transformed_record)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: airbyte-cdk
3
- Version: 6.14.0
3
+ Version: 6.15.0
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://airbyte.com
6
6
  License: MIT
@@ -66,7 +66,7 @@ airbyte_cdk/sources/declarative/concurrent_declarative_source.py,sha256=PxP4p268
66
66
  airbyte_cdk/sources/declarative/datetime/__init__.py,sha256=l9LG7Qm6e5r_qgqfVKnx3mXYtg1I9MmMjomVIPfU4XA,177
67
67
  airbyte_cdk/sources/declarative/datetime/datetime_parser.py,sha256=SX9JjdesN1edN2WVUVMzU_ptqp2QB1OnsnjZ4mwcX7w,2579
68
68
  airbyte_cdk/sources/declarative/datetime/min_max_datetime.py,sha256=0BHBtDNQZfvwM45-tY5pNlTcKAFSGGNxemoi0Jic-0E,5785
69
- airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=w1WkfTgZN8znoC1X2XQCv6RhHdTxAO9O0pmFzQRL52k,130843
69
+ airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=W8H8rYMEJihZBY3VgGUo-lo4OfCze9Rli2NorehDr38,131973
70
70
  airbyte_cdk/sources/declarative/declarative_source.py,sha256=nF7wBqFd3AQmEKAm4CnIo29CJoQL562cJGSCeL8U8bA,1531
71
71
  airbyte_cdk/sources/declarative/declarative_stream.py,sha256=JRyNeOIpsFu4ztVZsN6sncqUEIqIE-bUkD2TPgbMgk0,10375
72
72
  airbyte_cdk/sources/declarative/decoders/__init__.py,sha256=edGj4fGxznBk4xzRQyCA1rGfbpqe7z-RE0K3kQQWbgA,858
@@ -105,12 +105,12 @@ airbyte_cdk/sources/declarative/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW
105
105
  airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migration.py,sha256=iemy3fKLczcU0-Aor7tx5jcT6DRedKMqyK7kCOp01hg,3924
106
106
  airbyte_cdk/sources/declarative/migrations/state_migration.py,sha256=KWPjealMLKSMtajXgkdGgKg7EmTLR-CqqD7UIh0-eDU,794
107
107
  airbyte_cdk/sources/declarative/models/__init__.py,sha256=nUFxNCiKeYRVXuZEKA7GD-lTHxsiKcQ8FitZjKhPIvE,100
108
- airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=1EdKXjEKoXVs7BuF4H9mBMSbVsDIy5uAv1Txboict7Q,91733
108
+ airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=U64qHqBut90L29EuUJ2_4OdY6eCMZIL2MH4DqGYhifQ,92340
109
109
  airbyte_cdk/sources/declarative/parsers/__init__.py,sha256=ZnqYNxHsKCgO38IwB34RQyRMXTs4GTvlRi3ImKnIioo,61
110
110
  airbyte_cdk/sources/declarative/parsers/custom_exceptions.py,sha256=Rir9_z3Kcd5Es0-LChrzk-0qubAsiK_RSEnLmK2OXm8,553
111
111
  airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py,sha256=CXwTfD3wSQq3okcqwigpprbHhSURUokh4GK2OmOyKC8,9132
112
112
  airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py,sha256=IWUOdF03o-aQn0Occo1BJCxU0Pz-QILk5L67nzw2thw,6803
113
- airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=NYTa2KqBHq-JU2oKp0J79WADw8JgR2lgQS_unTB0bl4,107945
113
+ airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=xNrr3RuD2dd-u5Ryfv3Wf1bEYC3uYoSzntgCiAQXy84,108538
114
114
  airbyte_cdk/sources/declarative/partition_routers/__init__.py,sha256=HJ-Syp3p7RpyR_OK0X_a2kSyISfu3W-PKrRI16iY0a8,957
115
115
  airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py,sha256=n82J15S8bjeMZ5uROu--P3hnbQoxkY5v7RPHYx7g7ro,2929
116
116
  airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py,sha256=c5cuVFM6NFkuQqG8Z5IwkBuwDrvXZN1CunUOM_L0ezg,6892
@@ -176,6 +176,7 @@ airbyte_cdk/sources/declarative/stream_slicers/stream_slicer.py,sha256=SOkIPBi2W
176
176
  airbyte_cdk/sources/declarative/transformations/__init__.py,sha256=CPJ8TlMpiUmvG3624VYu_NfTzxwKcfBjM2Q2wJ7fkSA,919
177
177
  airbyte_cdk/sources/declarative/transformations/add_fields.py,sha256=r4YdAuAk2bQtNWJMztIIy2CC-NglD9NeK1s1TeO9wkw,5027
178
178
  airbyte_cdk/sources/declarative/transformations/flatten_fields.py,sha256=ti9fLVk-EpMeDY7ImduvQq1YGounLYmH9dHzp7MIRxk,1703
179
+ airbyte_cdk/sources/declarative/transformations/keys_replace_transformation.py,sha256=vbIn6ump-Ut6g20yMub7PFoPBhOKVtrHSAUdcOUdLfw,1999
179
180
  airbyte_cdk/sources/declarative/transformations/keys_to_lower_transformation.py,sha256=RTs5KX4V3hM7A6QN1WlGF21YccTIyNH6qQI9IMb__hw,670
180
181
  airbyte_cdk/sources/declarative/transformations/keys_to_snake_transformation.py,sha256=43zwe6_F5ba5C4eY0RgXxPz7ndPKZfXGChHepFn-2lk,2263
181
182
  airbyte_cdk/sources/declarative/transformations/remove_fields.py,sha256=EwUP0SZ2p4GRJ6Q8CUzlz9dcUeEidEFDlI2IBye2tlc,2745
@@ -340,8 +341,8 @@ airbyte_cdk/utils/slice_hasher.py,sha256=-pHexlNYoWYPnXNH-M7HEbjmeJe9Zk7SJijdQ7d
340
341
  airbyte_cdk/utils/spec_schema_transformations.py,sha256=-5HTuNsnDBAhj-oLeQXwpTGA0HdcjFOf2zTEMUTTg_Y,816
341
342
  airbyte_cdk/utils/stream_status_utils.py,sha256=ZmBoiy5HVbUEHAMrUONxZvxnvfV9CesmQJLDTAIWnWw,1171
342
343
  airbyte_cdk/utils/traced_exception.py,sha256=C8uIBuCL_E4WnBAOPSxBicD06JAldoN9fGsQDp463OY,6292
343
- airbyte_cdk-6.14.0.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
344
- airbyte_cdk-6.14.0.dist-info/METADATA,sha256=9K6E6L2q8Vn8wNuU-ZHjoxjiEwQX0_Xzb2vwyJzabbY,5988
345
- airbyte_cdk-6.14.0.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
346
- airbyte_cdk-6.14.0.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
347
- airbyte_cdk-6.14.0.dist-info/RECORD,,
344
+ airbyte_cdk-6.15.0.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
345
+ airbyte_cdk-6.15.0.dist-info/METADATA,sha256=aIk10nM3OL1ldN48mbZAdfd8mOWeSyVfeJMwHYMos8s,5988
346
+ airbyte_cdk-6.15.0.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
347
+ airbyte_cdk-6.15.0.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
348
+ airbyte_cdk-6.15.0.dist-info/RECORD,,