airbyte-cdk 6.52.0.dev1__py3-none-any.whl → 6.53.0.post2.dev15405329474__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.
@@ -3630,6 +3630,9 @@ definitions:
3630
3630
  delimiter:
3631
3631
  type: string
3632
3632
  default: ","
3633
+ set_empty_cell_to_none:
3634
+ type: boolean
3635
+ default: false
3633
3636
  AsyncJobStatusMap:
3634
3637
  description: Matches the api job status to Async Job Status.
3635
3638
  type: object
@@ -4056,6 +4059,8 @@ definitions:
4056
4059
  description: The expected data type of the value. If omitted, the type will be inferred from the value provided.
4057
4060
  "$ref": "#/definitions/ValueType"
4058
4061
  create_or_update:
4062
+ title: Create or Update
4063
+ description: Determines whether to create a new path if it doesn't exist (true) or only update existing paths (false). When set to true, the resolver will create new paths in the stream template if they don't exist. When false (default), it will only update existing paths.
4059
4064
  type: boolean
4060
4065
  default: false
4061
4066
  $parameters:
@@ -103,6 +103,7 @@ class CsvParser(Parser):
103
103
  # TODO: migrate implementation to re-use file-base classes
104
104
  encoding: Optional[str] = "utf-8"
105
105
  delimiter: Optional[str] = ","
106
+ set_empty_cell_to_none: Optional[bool] = False
106
107
 
107
108
  def _get_delimiter(self) -> Optional[str]:
108
109
  """
@@ -121,6 +122,8 @@ class CsvParser(Parser):
121
122
  text_data = TextIOWrapper(data, encoding=self.encoding) # type: ignore
122
123
  reader = csv.DictReader(text_data, delimiter=self._get_delimiter() or ",")
123
124
  for row in reader:
125
+ if self.set_empty_cell_to_none:
126
+ row = {k: (None if v == "" else v) for k, v in row.items()}
124
127
  yield row
125
128
 
126
129
 
@@ -6,6 +6,7 @@ import builtins
6
6
  import datetime
7
7
  import typing
8
8
  from typing import Optional, Union
9
+ from urllib.parse import quote_plus
9
10
 
10
11
  import isodate
11
12
  import pytz
@@ -182,6 +183,17 @@ def format_datetime(
182
183
  return DatetimeParser().format(dt=dt_datetime, format=format)
183
184
 
184
185
 
186
+ def sanitize_url(value: str) -> str:
187
+ """
188
+ Sanitizes a value by via urllib.parse.quote_plus
189
+
190
+ Usage:
191
+ `"{{ sanitize_url('https://example.com/path?query=value') }}"`
192
+ """
193
+ sanitization_strategy = quote_plus
194
+ return sanitization_strategy(value)
195
+
196
+
185
197
  _macros_list = [
186
198
  now_utc,
187
199
  today_utc,
@@ -193,5 +205,6 @@ _macros_list = [
193
205
  format_datetime,
194
206
  today_with_timezone,
195
207
  str_to_datetime,
208
+ sanitize_url,
196
209
  ]
197
210
  macros = {f.__name__: f for f in _macros_list}
@@ -1383,6 +1383,7 @@ class CsvDecoder(BaseModel):
1383
1383
  type: Literal["CsvDecoder"]
1384
1384
  encoding: Optional[str] = "utf-8"
1385
1385
  delimiter: Optional[str] = ","
1386
+ set_empty_cell_to_none: Optional[bool] = False
1386
1387
 
1387
1388
 
1388
1389
  class AsyncJobStatusMap(BaseModel):
@@ -1478,7 +1479,11 @@ class ComponentMappingDefinition(BaseModel):
1478
1479
  description="The expected data type of the value. If omitted, the type will be inferred from the value provided.",
1479
1480
  title="Value Type",
1480
1481
  )
1481
- create_or_update: Optional[bool] = False
1482
+ create_or_update: Optional[bool] = Field(
1483
+ False,
1484
+ description="Determines whether to create a new path if it doesn't exist (true) or only update existing paths (false). When set to true, the resolver will create new paths in the stream template if they don't exist. When false (default), it will only update existing paths.",
1485
+ title="Create or Update",
1486
+ )
1482
1487
  parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
1483
1488
 
1484
1489
 
@@ -2646,7 +2646,11 @@ class ModelToComponentFactory:
2646
2646
  elif isinstance(model, JsonlDecoderModel):
2647
2647
  return JsonLineParser()
2648
2648
  elif isinstance(model, CsvDecoderModel):
2649
- return CsvParser(encoding=model.encoding, delimiter=model.delimiter)
2649
+ return CsvParser(
2650
+ encoding=model.encoding,
2651
+ delimiter=model.delimiter,
2652
+ set_empty_cell_to_none=model.set_empty_cell_to_none,
2653
+ )
2650
2654
  elif isinstance(model, GzipDecoderModel):
2651
2655
  return GzipParser(
2652
2656
  inner_parser=ModelToComponentFactory._get_parser(model.decoder, config)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-cdk
3
- Version: 6.52.0.dev1
3
+ Version: 6.53.0.post2.dev15405329474
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://airbyte.com
6
6
  License: MIT
@@ -89,11 +89,11 @@ airbyte_cdk/sources/declarative/concurrent_declarative_source.py,sha256=OKor1mDD
89
89
  airbyte_cdk/sources/declarative/datetime/__init__.py,sha256=4Hw-PX1-VgESLF16cDdvuYCzGJtHntThLF4qIiULWeo,61
90
90
  airbyte_cdk/sources/declarative/datetime/datetime_parser.py,sha256=_zGNGq31RNy_0QBLt_EcTvgPyhj7urPdx6oA3M5-r3o,3150
91
91
  airbyte_cdk/sources/declarative/datetime/min_max_datetime.py,sha256=0BHBtDNQZfvwM45-tY5pNlTcKAFSGGNxemoi0Jic-0E,5785
92
- airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=LklBDA_hfKidQKWp4y8NCYBx4HkBVFAxhoTexBB2AU4,177075
92
+ airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=sFHlde6dHSjs2q7lRF6Tv2_9tR2bsVzrjxAIQqi0lNg,177464
93
93
  airbyte_cdk/sources/declarative/declarative_source.py,sha256=qmyMnnet92eGc3C22yBtpvD5UZjqdhsAafP_zxI5wp8,1814
94
94
  airbyte_cdk/sources/declarative/declarative_stream.py,sha256=dCRlddBUSaJmBNBz1pSO1r2rTw8AP5d2_vlmIeGs2gg,10767
95
95
  airbyte_cdk/sources/declarative/decoders/__init__.py,sha256=JHb_0d3SE6kNY10mxA5YBEKPeSbsWYjByq1gUQxepoE,953
96
- airbyte_cdk/sources/declarative/decoders/composite_raw_decoder.py,sha256=Jd7URkDQBoHSDQHQuYUqzeex1HYfLRtGcY_-dVW33pA,7884
96
+ airbyte_cdk/sources/declarative/decoders/composite_raw_decoder.py,sha256=71_84brT5nSQs-h2QnFfcz66ecgVnXsvTo1AHI-wEtc,8055
97
97
  airbyte_cdk/sources/declarative/decoders/decoder.py,sha256=1PeKwuMK8x9dsA2zqUjSVinEWVSEgYcUS6npiW3aC2c,855
98
98
  airbyte_cdk/sources/declarative/decoders/decoder_parser.py,sha256=e0be6kfzvbnhmcou-AuloFTSoLxiV9sG9YaglWo5mto,714
99
99
  airbyte_cdk/sources/declarative/decoders/json_decoder.py,sha256=BdWpXXPhEGf_zknggJmhojLosmxuw51RBVTS0jvdCPc,2080
@@ -126,21 +126,21 @@ airbyte_cdk/sources/declarative/interpolation/interpolated_nested_mapping.py,sha
126
126
  airbyte_cdk/sources/declarative/interpolation/interpolated_string.py,sha256=CQkHqGlfa87G6VYMtBAQWin7ECKpfMdrDcg0JO5_rhc,3212
127
127
  airbyte_cdk/sources/declarative/interpolation/interpolation.py,sha256=9IoeuWam3L6GyN10L6U8xNWXmkt9cnahSDNkez1OmFY,982
128
128
  airbyte_cdk/sources/declarative/interpolation/jinja.py,sha256=UQeuS4Vpyp4hlOn-R3tRyeBX0e9IoV6jQ6gH-Jz8lY0,7182
129
- airbyte_cdk/sources/declarative/interpolation/macros.py,sha256=UYSJ5gW7TkHALYnNvUnRP3RlyGwGuRMObF3BHuNzjJM,5320
129
+ airbyte_cdk/sources/declarative/interpolation/macros.py,sha256=xRcmjape4_WGmKMJpmBsKY0k4OHJDM46Hv3V-dlSz3w,5640
130
130
  airbyte_cdk/sources/declarative/manifest_declarative_source.py,sha256=aS_YxqUWgxyfyzwAZpV736RFg-m5a0sn-V7PPMBGVr4,24660
131
131
  airbyte_cdk/sources/declarative/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
132
132
  airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migration.py,sha256=V2lpYE9LJKvz6BUViHk4vaRGndxNABmPbDCtyYdkqaE,4013
133
133
  airbyte_cdk/sources/declarative/migrations/state_migration.py,sha256=KWPjealMLKSMtajXgkdGgKg7EmTLR-CqqD7UIh0-eDU,794
134
134
  airbyte_cdk/sources/declarative/models/__init__.py,sha256=nUFxNCiKeYRVXuZEKA7GD-lTHxsiKcQ8FitZjKhPIvE,100
135
135
  airbyte_cdk/sources/declarative/models/base_model_with_deprecations.py,sha256=Imnj3yef0aqRdLfaUxkIYISUb8YkiPrRH_wBd-x8HjM,5999
136
- airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=ooVQMvPd4Dd-0XHjOXUFHdbSMe4PaP9-UjQ23ulRxz4,125426
136
+ airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=36uZnvm9la9gEr4FqkjxA_l1-3TiApCWLfPApP9vBcw,125817
137
137
  airbyte_cdk/sources/declarative/parsers/__init__.py,sha256=ZnqYNxHsKCgO38IwB34RQyRMXTs4GTvlRi3ImKnIioo,61
138
138
  airbyte_cdk/sources/declarative/parsers/custom_code_compiler.py,sha256=nlVvHC511NUyDEEIRBkoeDTAvLqKNp-hRy8D19z8tdk,5941
139
139
  airbyte_cdk/sources/declarative/parsers/custom_exceptions.py,sha256=wnRUP0Xeru9Rbu5OexXSDN9QWDo8YU4tT9M2LDVOgGA,802
140
140
  airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py,sha256=2UdpCz3yi7ISZTyqkQXSSy3dMxeyOWqV7OlAS5b9GVg,11568
141
141
  airbyte_cdk/sources/declarative/parsers/manifest_normalizer.py,sha256=laBy7ebjA-PiNwc-50U4FHvMqS_mmHvnabxgFs4CjGw,17069
142
142
  airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py,sha256=pJmg78vqE5VfUrF_KJnWjucQ4k9IWFULeAxHCowrHXE,6806
143
- airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=7-q8icBPnEHbPa0vonz5KjsalYrrqJasIcLXK1TITlc,174730
143
+ airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=9BhRsOhCk3FxkqOlNDNhJIDeLKr3BP_nJZAV9sTXekU,174846
144
144
  airbyte_cdk/sources/declarative/partition_routers/__init__.py,sha256=TBC9AkGaUqHm2IKHMPN6punBIcY5tWGULowcLoAVkfw,1109
145
145
  airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py,sha256=VelO7zKqKtzMJ35jyFeg0ypJLQC0plqqIBNXoBW1G2E,3001
146
146
  airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py,sha256=c5cuVFM6NFkuQqG8Z5IwkBuwDrvXZN1CunUOM_L0ezg,6892
@@ -419,9 +419,9 @@ airbyte_cdk/utils/slice_hasher.py,sha256=EDxgROHDbfG-QKQb59m7h_7crN1tRiawdf5uU7G
419
419
  airbyte_cdk/utils/spec_schema_transformations.py,sha256=-5HTuNsnDBAhj-oLeQXwpTGA0HdcjFOf2zTEMUTTg_Y,816
420
420
  airbyte_cdk/utils/stream_status_utils.py,sha256=ZmBoiy5HVbUEHAMrUONxZvxnvfV9CesmQJLDTAIWnWw,1171
421
421
  airbyte_cdk/utils/traced_exception.py,sha256=C8uIBuCL_E4WnBAOPSxBicD06JAldoN9fGsQDp463OY,6292
422
- airbyte_cdk-6.52.0.dev1.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
423
- airbyte_cdk-6.52.0.dev1.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
424
- airbyte_cdk-6.52.0.dev1.dist-info/METADATA,sha256=Atlb-SeF8vrGZIBbNcskhXmEpQBqFgfrFjM41G23cps,6348
425
- airbyte_cdk-6.52.0.dev1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
426
- airbyte_cdk-6.52.0.dev1.dist-info/entry_points.txt,sha256=AKWbEkHfpzzk9nF9tqBUaw1MbvTM4mGtEzmZQm0ZWvM,139
427
- airbyte_cdk-6.52.0.dev1.dist-info/RECORD,,
422
+ airbyte_cdk-6.53.0.post2.dev15405329474.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
423
+ airbyte_cdk-6.53.0.post2.dev15405329474.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
424
+ airbyte_cdk-6.53.0.post2.dev15405329474.dist-info/METADATA,sha256=t1npAyfmm609rLEMi0ic_4o1FXCo5D4Zh4BiiO92qB4,6364
425
+ airbyte_cdk-6.53.0.post2.dev15405329474.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
426
+ airbyte_cdk-6.53.0.post2.dev15405329474.dist-info/entry_points.txt,sha256=AKWbEkHfpzzk9nF9tqBUaw1MbvTM4mGtEzmZQm0ZWvM,139
427
+ airbyte_cdk-6.53.0.post2.dev15405329474.dist-info/RECORD,,