airbyte-cdk 6.18.1__tar.gz → 6.19.0__tar.gz

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.
Files changed (349) hide show
  1. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/PKG-INFO +1 -1
  2. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/declarative_component_schema.yaml +16 -1
  3. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/decoders/composite_raw_decoder.py +43 -0
  4. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/models/declarative_component_schema.py +10 -2
  5. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +57 -25
  6. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py +11 -0
  7. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/exceptions.py +34 -0
  8. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/file_based_source.py +28 -5
  9. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/file_based_stream_reader.py +18 -4
  10. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/file_types/unstructured_parser.py +25 -2
  11. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/stream/default_file_based_stream.py +30 -2
  12. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/pyproject.toml +1 -1
  13. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/LICENSE.txt +0 -0
  14. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/README.md +0 -0
  15. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/__init__.py +0 -0
  16. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/cli/__init__.py +0 -0
  17. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/cli/source_declarative_manifest/__init__.py +0 -0
  18. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/cli/source_declarative_manifest/_run.py +0 -0
  19. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/cli/source_declarative_manifest/spec.json +0 -0
  20. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/config_observation.py +0 -0
  21. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/connector.py +0 -0
  22. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/connector_builder/README.md +0 -0
  23. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/connector_builder/__init__.py +0 -0
  24. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/connector_builder/connector_builder_handler.py +0 -0
  25. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/connector_builder/main.py +0 -0
  26. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/connector_builder/message_grouper.py +0 -0
  27. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/connector_builder/models.py +0 -0
  28. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/destinations/__init__.py +0 -0
  29. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/destinations/destination.py +0 -0
  30. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/destinations/vector_db_based/README.md +0 -0
  31. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/destinations/vector_db_based/__init__.py +0 -0
  32. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/destinations/vector_db_based/config.py +0 -0
  33. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/destinations/vector_db_based/document_processor.py +0 -0
  34. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/destinations/vector_db_based/embedder.py +0 -0
  35. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/destinations/vector_db_based/indexer.py +0 -0
  36. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/destinations/vector_db_based/test_utils.py +0 -0
  37. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/destinations/vector_db_based/utils.py +0 -0
  38. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/destinations/vector_db_based/writer.py +0 -0
  39. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/entrypoint.py +0 -0
  40. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/exception_handler.py +0 -0
  41. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/logger.py +0 -0
  42. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/models/__init__.py +0 -0
  43. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/models/airbyte_protocol.py +0 -0
  44. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/models/airbyte_protocol_serializers.py +0 -0
  45. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/models/file_transfer_record_message.py +0 -0
  46. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/models/well_known_types.py +0 -0
  47. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/py.typed +0 -0
  48. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/__init__.py +0 -0
  49. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/abstract_source.py +0 -0
  50. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/concurrent_source/__init__.py +0 -0
  51. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/concurrent_source/concurrent_read_processor.py +0 -0
  52. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/concurrent_source/concurrent_source.py +0 -0
  53. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/concurrent_source/concurrent_source_adapter.py +0 -0
  54. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/concurrent_source/partition_generation_completed_sentinel.py +0 -0
  55. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/concurrent_source/stream_thread_exception.py +0 -0
  56. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/concurrent_source/thread_pool_manager.py +0 -0
  57. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/config.py +0 -0
  58. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/connector_state_manager.py +0 -0
  59. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/__init__.py +0 -0
  60. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/async_job/__init__.py +0 -0
  61. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/async_job/job.py +0 -0
  62. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/async_job/job_orchestrator.py +0 -0
  63. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/async_job/job_tracker.py +0 -0
  64. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/async_job/repository.py +0 -0
  65. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/async_job/status.py +0 -0
  66. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/async_job/timer.py +0 -0
  67. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/auth/__init__.py +0 -0
  68. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/auth/declarative_authenticator.py +0 -0
  69. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/auth/jwt.py +0 -0
  70. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/auth/oauth.py +0 -0
  71. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/auth/selective_authenticator.py +0 -0
  72. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/auth/token.py +0 -0
  73. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/auth/token_provider.py +0 -0
  74. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/checks/__init__.py +0 -0
  75. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/checks/check_stream.py +0 -0
  76. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/checks/connection_checker.py +0 -0
  77. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/concurrency_level/__init__.py +0 -0
  78. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/concurrency_level/concurrency_level.py +0 -0
  79. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/concurrent_declarative_source.py +0 -0
  80. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/datetime/__init__.py +0 -0
  81. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/datetime/datetime_parser.py +0 -0
  82. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/datetime/min_max_datetime.py +0 -0
  83. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/declarative_source.py +0 -0
  84. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/declarative_stream.py +0 -0
  85. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/decoders/__init__.py +0 -0
  86. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/decoders/decoder.py +0 -0
  87. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/decoders/json_decoder.py +0 -0
  88. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/decoders/noop_decoder.py +0 -0
  89. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/decoders/pagination_decoder_decorator.py +0 -0
  90. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/decoders/xml_decoder.py +0 -0
  91. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/exceptions.py +0 -0
  92. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/extractors/__init__.py +0 -0
  93. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/extractors/dpath_extractor.py +0 -0
  94. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/extractors/http_selector.py +0 -0
  95. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/extractors/record_extractor.py +0 -0
  96. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/extractors/record_filter.py +0 -0
  97. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/extractors/record_selector.py +0 -0
  98. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/extractors/response_to_file_extractor.py +0 -0
  99. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/extractors/type_transformer.py +0 -0
  100. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/incremental/__init__.py +0 -0
  101. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +0 -0
  102. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/incremental/declarative_cursor.py +0 -0
  103. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/incremental/global_substream_cursor.py +0 -0
  104. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py +0 -0
  105. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/incremental/per_partition_with_global.py +0 -0
  106. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/incremental/resumable_full_refresh_cursor.py +0 -0
  107. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/interpolation/__init__.py +0 -0
  108. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/interpolation/filters.py +0 -0
  109. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_boolean.py +0 -0
  110. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_mapping.py +0 -0
  111. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_nested_mapping.py +0 -0
  112. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_string.py +0 -0
  113. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/interpolation/interpolation.py +0 -0
  114. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/interpolation/jinja.py +0 -0
  115. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/interpolation/macros.py +0 -0
  116. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/manifest_declarative_source.py +0 -0
  117. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/migrations/__init__.py +0 -0
  118. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migration.py +0 -0
  119. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/migrations/state_migration.py +0 -0
  120. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/models/__init__.py +0 -0
  121. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/parsers/__init__.py +0 -0
  122. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/parsers/custom_exceptions.py +0 -0
  123. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py +0 -0
  124. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py +0 -0
  125. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/partition_routers/__init__.py +0 -0
  126. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py +0 -0
  127. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py +0 -0
  128. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py +0 -0
  129. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/partition_routers/partition_router.py +0 -0
  130. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/partition_routers/single_partition_router.py +0 -0
  131. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +0 -0
  132. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/README.md +0 -0
  133. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/__init__.py +0 -0
  134. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/__init__.py +0 -0
  135. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +0 -0
  136. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/constant_backoff_strategy.py +0 -0
  137. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/exponential_backoff_strategy.py +0 -0
  138. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/header_helper.py +0 -0
  139. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_time_from_header_backoff_strategy.py +0 -0
  140. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_until_time_from_header_backoff_strategy.py +0 -0
  141. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategy.py +0 -0
  142. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/composite_error_handler.py +0 -0
  143. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_error_handler.py +0 -0
  144. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_http_response_filter.py +0 -0
  145. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/error_handler.py +0 -0
  146. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/http_response_filter.py +0 -0
  147. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/http_job_repository.py +0 -0
  148. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/http_requester.py +0 -0
  149. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/paginators/__init__.py +0 -0
  150. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +0 -0
  151. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/paginators/no_pagination.py +0 -0
  152. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/paginators/paginator.py +0 -0
  153. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/__init__.py +0 -0
  154. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/cursor_pagination_strategy.py +0 -0
  155. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py +0 -0
  156. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/page_increment.py +0 -0
  157. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/pagination_strategy.py +0 -0
  158. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/stop_condition.py +0 -0
  159. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/request_option.py +0 -0
  160. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/request_options/__init__.py +0 -0
  161. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/request_options/datetime_based_request_options_provider.py +0 -0
  162. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/request_options/default_request_options_provider.py +0 -0
  163. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_nested_request_input_provider.py +0 -0
  164. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_input_provider.py +0 -0
  165. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_options_provider.py +0 -0
  166. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/request_options/request_options_provider.py +0 -0
  167. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/request_path.py +0 -0
  168. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/requesters/requester.py +0 -0
  169. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/resolvers/__init__.py +0 -0
  170. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/resolvers/components_resolver.py +0 -0
  171. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/resolvers/config_components_resolver.py +0 -0
  172. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/resolvers/http_components_resolver.py +0 -0
  173. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/retrievers/__init__.py +0 -0
  174. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/retrievers/async_retriever.py +0 -0
  175. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/retrievers/retriever.py +0 -0
  176. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +0 -0
  177. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/schema/__init__.py +0 -0
  178. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/schema/default_schema_loader.py +0 -0
  179. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/schema/dynamic_schema_loader.py +0 -0
  180. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/schema/inline_schema_loader.py +0 -0
  181. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/schema/json_file_schema_loader.py +0 -0
  182. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/schema/schema_loader.py +0 -0
  183. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/spec/__init__.py +0 -0
  184. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/spec/spec.py +0 -0
  185. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/stream_slicers/__init__.py +0 -0
  186. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/stream_slicers/declarative_partition_generator.py +0 -0
  187. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/stream_slicers/stream_slicer.py +0 -0
  188. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/transformations/__init__.py +0 -0
  189. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/transformations/add_fields.py +0 -0
  190. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/transformations/flatten_fields.py +0 -0
  191. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/transformations/keys_replace_transformation.py +0 -0
  192. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/transformations/keys_to_lower_transformation.py +0 -0
  193. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/transformations/keys_to_snake_transformation.py +0 -0
  194. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/transformations/remove_fields.py +0 -0
  195. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/transformations/transformation.py +0 -0
  196. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/types.py +0 -0
  197. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/declarative/yaml_declarative_source.py +0 -0
  198. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/embedded/__init__.py +0 -0
  199. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/embedded/base_integration.py +0 -0
  200. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/embedded/catalog.py +0 -0
  201. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/embedded/runner.py +0 -0
  202. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/embedded/tools.py +0 -0
  203. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/README.md +0 -0
  204. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/__init__.py +0 -0
  205. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/availability_strategy/__init__.py +0 -0
  206. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/availability_strategy/abstract_file_based_availability_strategy.py +0 -0
  207. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/availability_strategy/default_file_based_availability_strategy.py +0 -0
  208. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/config/__init__.py +0 -0
  209. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/config/avro_format.py +0 -0
  210. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/config/csv_format.py +0 -0
  211. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/config/excel_format.py +0 -0
  212. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/config/file_based_stream_config.py +0 -0
  213. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/config/jsonl_format.py +0 -0
  214. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/config/parquet_format.py +0 -0
  215. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/config/unstructured_format.py +0 -0
  216. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/discovery_policy/__init__.py +0 -0
  217. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/discovery_policy/abstract_discovery_policy.py +0 -0
  218. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/discovery_policy/default_discovery_policy.py +0 -0
  219. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/file_types/__init__.py +0 -0
  220. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/file_types/avro_parser.py +0 -0
  221. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/file_types/csv_parser.py +0 -0
  222. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/file_types/excel_parser.py +0 -0
  223. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/file_types/file_transfer.py +0 -0
  224. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/file_types/file_type_parser.py +0 -0
  225. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/file_types/jsonl_parser.py +0 -0
  226. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/file_types/parquet_parser.py +0 -0
  227. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/remote_file.py +0 -0
  228. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/schema_helpers.py +0 -0
  229. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/schema_validation_policies/__init__.py +0 -0
  230. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/schema_validation_policies/abstract_schema_validation_policy.py +0 -0
  231. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/schema_validation_policies/default_schema_validation_policies.py +0 -0
  232. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/stream/__init__.py +0 -0
  233. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/stream/abstract_file_based_stream.py +0 -0
  234. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/stream/concurrent/__init__.py +0 -0
  235. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/stream/concurrent/adapters.py +0 -0
  236. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/__init__.py +0 -0
  237. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/abstract_concurrent_file_based_cursor.py +0 -0
  238. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_concurrent_cursor.py +0 -0
  239. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_final_state_cursor.py +0 -0
  240. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/stream/cursor/__init__.py +0 -0
  241. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/stream/cursor/abstract_file_based_cursor.py +0 -0
  242. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/stream/cursor/default_file_based_cursor.py +0 -0
  243. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/file_based/types.py +0 -0
  244. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/http_config.py +0 -0
  245. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/http_logger.py +0 -0
  246. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/message/__init__.py +0 -0
  247. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/message/repository.py +0 -0
  248. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/source.py +0 -0
  249. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/__init__.py +0 -0
  250. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/availability_strategy.py +0 -0
  251. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/call_rate.py +0 -0
  252. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/checkpoint/__init__.py +0 -0
  253. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/checkpoint/checkpoint_reader.py +0 -0
  254. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/checkpoint/cursor.py +0 -0
  255. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/checkpoint/per_partition_key_serializer.py +0 -0
  256. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/checkpoint/resumable_full_refresh_cursor.py +0 -0
  257. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/checkpoint/substream_resumable_full_refresh_cursor.py +0 -0
  258. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/README.md +0 -0
  259. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/__init__.py +0 -0
  260. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/abstract_stream.py +0 -0
  261. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/abstract_stream_facade.py +0 -0
  262. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/adapters.py +0 -0
  263. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/availability_strategy.py +0 -0
  264. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/cursor.py +0 -0
  265. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/default_stream.py +0 -0
  266. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/exceptions.py +0 -0
  267. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/helpers.py +0 -0
  268. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/partition_enqueuer.py +0 -0
  269. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/partition_reader.py +0 -0
  270. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/partitions/__init__.py +0 -0
  271. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/partitions/partition.py +0 -0
  272. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/partitions/partition_generator.py +0 -0
  273. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/partitions/stream_slicer.py +0 -0
  274. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/partitions/types.py +0 -0
  275. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/state_converters/__init__.py +0 -0
  276. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/state_converters/abstract_stream_state_converter.py +0 -0
  277. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/concurrent/state_converters/datetime_stream_state_converter.py +0 -0
  278. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/core.py +0 -0
  279. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/__init__.py +0 -0
  280. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/availability_strategy.py +0 -0
  281. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/error_handlers/__init__.py +0 -0
  282. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/error_handlers/backoff_strategy.py +0 -0
  283. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/error_handlers/default_backoff_strategy.py +0 -0
  284. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/error_handlers/default_error_mapping.py +0 -0
  285. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/error_handlers/error_handler.py +0 -0
  286. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/error_handlers/error_message_parser.py +0 -0
  287. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/error_handlers/http_status_error_handler.py +0 -0
  288. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/error_handlers/json_error_message_parser.py +0 -0
  289. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/error_handlers/response_models.py +0 -0
  290. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/exceptions.py +0 -0
  291. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/http.py +0 -0
  292. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/http_client.py +0 -0
  293. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/rate_limiting.py +0 -0
  294. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/requests_native_auth/__init__.py +0 -0
  295. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +0 -0
  296. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_token.py +0 -0
  297. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py +0 -0
  298. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/http/requests_native_auth/token.py +0 -0
  299. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/streams/utils/__init__.py +0 -0
  300. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/types.py +0 -0
  301. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/utils/__init__.py +0 -0
  302. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/utils/casing.py +0 -0
  303. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/utils/record_helper.py +0 -0
  304. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/utils/schema_helpers.py +0 -0
  305. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/utils/slice_logger.py +0 -0
  306. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/utils/transform.py +0 -0
  307. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sources/utils/types.py +0 -0
  308. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sql/__init__.py +0 -0
  309. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sql/_util/__init__.py +0 -0
  310. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sql/_util/hashing.py +0 -0
  311. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sql/_util/name_normalizers.py +0 -0
  312. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sql/constants.py +0 -0
  313. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sql/exceptions.py +0 -0
  314. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sql/secrets.py +0 -0
  315. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sql/shared/__init__.py +0 -0
  316. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sql/shared/catalog_providers.py +0 -0
  317. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sql/shared/sql_processor.py +0 -0
  318. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/sql/types.py +0 -0
  319. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/test/__init__.py +0 -0
  320. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/test/catalog_builder.py +0 -0
  321. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/test/entrypoint_wrapper.py +0 -0
  322. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/test/mock_http/__init__.py +0 -0
  323. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/test/mock_http/matcher.py +0 -0
  324. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/test/mock_http/mocker.py +0 -0
  325. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/test/mock_http/request.py +0 -0
  326. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/test/mock_http/response.py +0 -0
  327. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/test/mock_http/response_builder.py +0 -0
  328. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/test/state_builder.py +0 -0
  329. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/test/utils/__init__.py +0 -0
  330. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/test/utils/data.py +0 -0
  331. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/test/utils/http_mocking.py +0 -0
  332. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/test/utils/manifest_only_fixtures.py +0 -0
  333. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/test/utils/reading.py +0 -0
  334. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/utils/__init__.py +0 -0
  335. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/utils/airbyte_secrets_utils.py +0 -0
  336. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/utils/analytics_message.py +0 -0
  337. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/utils/constants.py +0 -0
  338. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/utils/datetime_format_inferrer.py +0 -0
  339. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/utils/event_timing.py +0 -0
  340. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/utils/is_cloud_environment.py +0 -0
  341. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/utils/mapping_helpers.py +0 -0
  342. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/utils/message_utils.py +0 -0
  343. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/utils/oneof_option_config.py +0 -0
  344. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/utils/print_buffer.py +0 -0
  345. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/utils/schema_inferrer.py +0 -0
  346. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/utils/slice_hasher.py +0 -0
  347. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/utils/spec_schema_transformations.py +0 -0
  348. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/utils/stream_status_utils.py +0 -0
  349. {airbyte_cdk-6.18.1 → airbyte_cdk-6.19.0}/airbyte_cdk/utils/traced_exception.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: airbyte-cdk
3
- Version: 6.18.1
3
+ Version: 6.19.0
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  License: MIT
6
6
  Keywords: airbyte,connector-development-kit,cdk
@@ -678,7 +678,7 @@ definitions:
678
678
  properties:
679
679
  type:
680
680
  type: string
681
- enum: [ CustomSchemaNormalization ]
681
+ enum: [CustomSchemaNormalization]
682
682
  class_name:
683
683
  title: Class Name
684
684
  description: Fully-qualified name of the class that will be implementing the custom normalization. The format is `source_<name>.<package>.<class_name>`.
@@ -2886,6 +2886,7 @@ definitions:
2886
2886
  parser:
2887
2887
  anyOf:
2888
2888
  - "$ref": "#/definitions/GzipParser"
2889
+ - "$ref": "#/definitions/JsonParser"
2889
2890
  - "$ref": "#/definitions/JsonLineParser"
2890
2891
  - "$ref": "#/definitions/CsvParser"
2891
2892
  # PARSERS
@@ -2902,6 +2903,20 @@ definitions:
2902
2903
  anyOf:
2903
2904
  - "$ref": "#/definitions/JsonLineParser"
2904
2905
  - "$ref": "#/definitions/CsvParser"
2906
+ - "$ref": "#/definitions/JsonParser"
2907
+ JsonParser:
2908
+ title: JsonParser
2909
+ description: Parser used for parsing str, bytes, or bytearray data and returning data in a dictionary format.
2910
+ type: object
2911
+ required:
2912
+ - type
2913
+ properties:
2914
+ type:
2915
+ type: string
2916
+ enum: [JsonParser]
2917
+ encoding:
2918
+ type: string
2919
+ default: utf-8
2905
2920
  JsonLineParser:
2906
2921
  type: object
2907
2922
  required:
@@ -7,9 +7,12 @@ from dataclasses import dataclass
7
7
  from io import BufferedIOBase, TextIOWrapper
8
8
  from typing import Any, Generator, MutableMapping, Optional
9
9
 
10
+ import orjson
10
11
  import requests
11
12
 
13
+ from airbyte_cdk.models import FailureType
12
14
  from airbyte_cdk.sources.declarative.decoders.decoder import Decoder
15
+ from airbyte_cdk.utils import AirbyteTracedException
13
16
 
14
17
  logger = logging.getLogger("airbyte")
15
18
 
@@ -42,6 +45,46 @@ class GzipParser(Parser):
42
45
  yield from self.inner_parser.parse(gzipobj)
43
46
 
44
47
 
48
+ @dataclass
49
+ class JsonParser(Parser):
50
+ encoding: str = "utf-8"
51
+
52
+ def parse(self, data: BufferedIOBase) -> Generator[MutableMapping[str, Any], None, None]:
53
+ """
54
+ Attempts to deserialize data using orjson library. As an extra layer of safety we fallback on the json library to deserialize the data.
55
+ """
56
+ raw_data = data.read()
57
+ body_json = self._parse_orjson(raw_data) or self._parse_json(raw_data)
58
+
59
+ if body_json is None:
60
+ raise AirbyteTracedException(
61
+ message="Response JSON data failed to be parsed. See logs for more information.",
62
+ internal_message=f"Response JSON data failed to be parsed.",
63
+ failure_type=FailureType.system_error,
64
+ )
65
+
66
+ if isinstance(body_json, list):
67
+ yield from body_json
68
+ else:
69
+ yield from [body_json]
70
+
71
+ def _parse_orjson(self, raw_data: bytes) -> Optional[Any]:
72
+ try:
73
+ return orjson.loads(raw_data.decode(self.encoding))
74
+ except Exception as exc:
75
+ logger.debug(
76
+ f"Failed to parse JSON data using orjson library. Falling back to json library. {exc}"
77
+ )
78
+ return None
79
+
80
+ def _parse_json(self, raw_data: bytes) -> Optional[Any]:
81
+ try:
82
+ return json.loads(raw_data.decode(self.encoding))
83
+ except Exception as exc:
84
+ logger.error(f"Failed to parse JSON data using json library. {exc}")
85
+ return None
86
+
87
+
45
88
  @dataclass
46
89
  class JsonLineParser(Parser):
47
90
  encoding: Optional[str] = "utf-8"
@@ -1201,6 +1201,14 @@ class LegacySessionTokenAuthenticator(BaseModel):
1201
1201
  parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
1202
1202
 
1203
1203
 
1204
+ class JsonParser(BaseModel):
1205
+ class Config:
1206
+ extra = Extra.allow
1207
+
1208
+ type: Literal["JsonParser"]
1209
+ encoding: Optional[str] = "utf-8"
1210
+
1211
+
1204
1212
  class JsonLineParser(BaseModel):
1205
1213
  type: Literal["JsonLineParser"]
1206
1214
  encoding: Optional[str] = "utf-8"
@@ -1599,7 +1607,7 @@ class RecordSelector(BaseModel):
1599
1607
 
1600
1608
  class GzipParser(BaseModel):
1601
1609
  type: Literal["GzipParser"]
1602
- inner_parser: Union[JsonLineParser, CsvParser]
1610
+ inner_parser: Union[JsonLineParser, CsvParser, JsonParser]
1603
1611
 
1604
1612
 
1605
1613
  class Spec(BaseModel):
@@ -1634,7 +1642,7 @@ class CompositeErrorHandler(BaseModel):
1634
1642
 
1635
1643
  class CompositeRawDecoder(BaseModel):
1636
1644
  type: Literal["CompositeRawDecoder"]
1637
- parser: Union[GzipParser, JsonLineParser, CsvParser]
1645
+ parser: Union[GzipParser, JsonParser, JsonLineParser, CsvParser]
1638
1646
 
1639
1647
 
1640
1648
  class DeclarativeSource1(BaseModel):
@@ -72,6 +72,8 @@ from airbyte_cdk.sources.declarative.decoders.composite_raw_decoder import (
72
72
  CsvParser,
73
73
  GzipParser,
74
74
  JsonLineParser,
75
+ JsonParser,
76
+ Parser,
75
77
  )
76
78
  from airbyte_cdk.sources.declarative.extractors import (
77
79
  DpathExtractor,
@@ -247,6 +249,9 @@ from airbyte_cdk.sources.declarative.models.declarative_component_schema import
247
249
  from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
248
250
  JsonLineParser as JsonLineParserModel,
249
251
  )
252
+ from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
253
+ JsonParser as JsonParserModel,
254
+ )
250
255
  from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
251
256
  JwtAuthenticator as JwtAuthenticatorModel,
252
257
  )
@@ -522,6 +527,7 @@ class ModelToComponentFactory:
522
527
  JsonDecoderModel: self.create_json_decoder,
523
528
  JsonlDecoderModel: self.create_jsonl_decoder,
524
529
  JsonLineParserModel: self.create_json_line_parser,
530
+ JsonParserModel: self.create_json_parser,
525
531
  GzipJsonDecoderModel: self.create_gzipjson_decoder,
526
532
  GzipParserModel: self.create_gzip_parser,
527
533
  KeysToLowerModel: self.create_keys_to_lower_transformation,
@@ -1032,17 +1038,17 @@ class ModelToComponentFactory:
1032
1038
  self, model: CursorPaginationModel, config: Config, decoder: Decoder, **kwargs: Any
1033
1039
  ) -> CursorPaginationStrategy:
1034
1040
  if isinstance(decoder, PaginationDecoderDecorator):
1035
- if not isinstance(decoder.decoder, (JsonDecoder, XmlDecoder)):
1036
- raise ValueError(
1037
- f"Provided decoder of {type(decoder.decoder)=} is not supported. Please set JsonDecoder or XmlDecoder instead."
1038
- )
1041
+ inner_decoder = decoder.decoder
1042
+ else:
1043
+ inner_decoder = decoder
1044
+ decoder = PaginationDecoderDecorator(decoder=decoder)
1045
+
1046
+ if self._is_supported_decoder_for_pagination(inner_decoder):
1039
1047
  decoder_to_use = decoder
1040
1048
  else:
1041
- if not isinstance(decoder, (JsonDecoder, XmlDecoder)):
1042
- raise ValueError(
1043
- f"Provided decoder of {type(decoder)=} is not supported. Please set JsonDecoder or XmlDecoder instead."
1044
- )
1045
- decoder_to_use = PaginationDecoderDecorator(decoder=decoder)
1049
+ raise ValueError(
1050
+ self._UNSUPPORTED_DECODER_ERROR.format(decoder_type=type(inner_decoder))
1051
+ )
1046
1052
 
1047
1053
  return CursorPaginationStrategy(
1048
1054
  cursor_value=model.cursor_value,
@@ -1515,11 +1521,10 @@ class ModelToComponentFactory:
1515
1521
  cursor_used_for_stop_condition: Optional[DeclarativeCursor] = None,
1516
1522
  ) -> Union[DefaultPaginator, PaginatorTestReadDecorator]:
1517
1523
  if decoder:
1518
- if not isinstance(decoder, (JsonDecoder, XmlDecoder)):
1519
- raise ValueError(
1520
- f"Provided decoder of {type(decoder)=} is not supported. Please set JsonDecoder or XmlDecoder instead."
1521
- )
1522
- decoder_to_use = PaginationDecoderDecorator(decoder=decoder)
1524
+ if self._is_supported_decoder_for_pagination(decoder):
1525
+ decoder_to_use = PaginationDecoderDecorator(decoder=decoder)
1526
+ else:
1527
+ raise ValueError(self._UNSUPPORTED_DECODER_ERROR.format(decoder_type=type(decoder)))
1523
1528
  else:
1524
1529
  decoder_to_use = PaginationDecoderDecorator(decoder=JsonDecoder(parameters={}))
1525
1530
  page_size_option = (
@@ -1748,6 +1753,11 @@ class ModelToComponentFactory:
1748
1753
  def create_json_decoder(model: JsonDecoderModel, config: Config, **kwargs: Any) -> JsonDecoder:
1749
1754
  return JsonDecoder(parameters={})
1750
1755
 
1756
+ @staticmethod
1757
+ def create_json_parser(model: JsonParserModel, config: Config, **kwargs: Any) -> JsonParser:
1758
+ encoding = model.encoding if model.encoding else "utf-8"
1759
+ return JsonParser(encoding=encoding)
1760
+
1751
1761
  @staticmethod
1752
1762
  def create_jsonl_decoder(
1753
1763
  model: JsonlDecoderModel, config: Config, **kwargs: Any
@@ -1940,22 +1950,22 @@ class ModelToComponentFactory:
1940
1950
  message_repository=self._message_repository,
1941
1951
  )
1942
1952
 
1943
- @staticmethod
1944
1953
  def create_offset_increment(
1945
- model: OffsetIncrementModel, config: Config, decoder: Decoder, **kwargs: Any
1954
+ self, model: OffsetIncrementModel, config: Config, decoder: Decoder, **kwargs: Any
1946
1955
  ) -> OffsetIncrement:
1947
1956
  if isinstance(decoder, PaginationDecoderDecorator):
1948
- if not isinstance(decoder.decoder, (JsonDecoder, XmlDecoder)):
1949
- raise ValueError(
1950
- f"Provided decoder of {type(decoder.decoder)=} is not supported. Please set JsonDecoder or XmlDecoder instead."
1951
- )
1957
+ inner_decoder = decoder.decoder
1958
+ else:
1959
+ inner_decoder = decoder
1960
+ decoder = PaginationDecoderDecorator(decoder=decoder)
1961
+
1962
+ if self._is_supported_decoder_for_pagination(inner_decoder):
1952
1963
  decoder_to_use = decoder
1953
1964
  else:
1954
- if not isinstance(decoder, (JsonDecoder, XmlDecoder)):
1955
- raise ValueError(
1956
- f"Provided decoder of {type(decoder)=} is not supported. Please set JsonDecoder or XmlDecoder instead."
1957
- )
1958
- decoder_to_use = PaginationDecoderDecorator(decoder=decoder)
1965
+ raise ValueError(
1966
+ self._UNSUPPORTED_DECODER_ERROR.format(decoder_type=type(inner_decoder))
1967
+ )
1968
+
1959
1969
  return OffsetIncrement(
1960
1970
  page_size=model.page_size,
1961
1971
  config=config,
@@ -2555,3 +2565,25 @@ class ModelToComponentFactory:
2555
2565
  components_mapping=components_mapping,
2556
2566
  parameters=model.parameters or {},
2557
2567
  )
2568
+
2569
+ _UNSUPPORTED_DECODER_ERROR = (
2570
+ "Specified decoder of {decoder_type} is not supported for pagination."
2571
+ "Please set as `JsonDecoder`, `XmlDecoder`, or a `CompositeRawDecoder` with an inner_parser of `JsonParser` or `GzipParser` instead."
2572
+ "If using `GzipParser`, please ensure that the lowest level inner_parser is a `JsonParser`."
2573
+ )
2574
+
2575
+ def _is_supported_decoder_for_pagination(self, decoder: Decoder) -> bool:
2576
+ if isinstance(decoder, (JsonDecoder, XmlDecoder)):
2577
+ return True
2578
+ elif isinstance(decoder, CompositeRawDecoder):
2579
+ return self._is_supported_parser_for_pagination(decoder.parser)
2580
+ else:
2581
+ return False
2582
+
2583
+ def _is_supported_parser_for_pagination(self, parser: Parser) -> bool:
2584
+ if isinstance(parser, JsonParser):
2585
+ return True
2586
+ elif isinstance(parser, GzipParser):
2587
+ return isinstance(parser.inner_parser, JsonParser)
2588
+ else:
2589
+ return False
@@ -31,6 +31,17 @@ class DeliverRawFiles(BaseModel):
31
31
 
32
32
  delivery_type: Literal["use_file_transfer"] = Field("use_file_transfer", const=True)
33
33
 
34
+ preserve_directory_structure: bool = Field(
35
+ title="Preserve Sub-Directories in File Paths",
36
+ description=(
37
+ "If enabled, sends subdirectory folder structure "
38
+ "along with source file names to the destination. "
39
+ "Otherwise, files will be synced by their names only. "
40
+ "This option is ignored when file-based replication is not enabled."
41
+ ),
42
+ default=True,
43
+ )
44
+
34
45
 
35
46
  class AbstractFileBasedSpec(BaseModel):
36
47
  """
@@ -111,6 +111,40 @@ class ErrorListingFiles(BaseFileBasedSourceError):
111
111
  pass
112
112
 
113
113
 
114
+ class DuplicatedFilesError(BaseFileBasedSourceError):
115
+ def __init__(self, duplicated_files_names: List[dict[str, List[str]]], **kwargs: Any):
116
+ self._duplicated_files_names = duplicated_files_names
117
+ self._stream_name: str = kwargs["stream"]
118
+ super().__init__(self._format_duplicate_files_error_message(), **kwargs)
119
+
120
+ def _format_duplicate_files_error_message(self) -> str:
121
+ duplicated_files_messages = []
122
+ for duplicated_file in self._duplicated_files_names:
123
+ for duplicated_file_name, file_paths in duplicated_file.items():
124
+ file_duplicated_message = (
125
+ f"{len(file_paths)} duplicates found for file name {duplicated_file_name}:\n\n"
126
+ + "".join(f"\n - {file_paths}")
127
+ )
128
+ duplicated_files_messages.append(file_duplicated_message)
129
+
130
+ error_message = (
131
+ f"ERROR: Duplicate filenames found for stream {self._stream_name}. "
132
+ "Duplicate file names are not allowed if the Preserve Sub-Directories in File Paths option is disabled. "
133
+ "Please remove or rename the duplicate files before attempting to re-run the sync.\n\n"
134
+ + "\n".join(duplicated_files_messages)
135
+ )
136
+
137
+ return error_message
138
+
139
+ def __repr__(self) -> str:
140
+ """Return a string representation of the exception."""
141
+ class_name = self.__class__.__name__
142
+ properties_str = ", ".join(
143
+ f"{k}={v!r}" for k, v in self.__dict__.items() if not k.startswith("_")
144
+ )
145
+ return f"{class_name}({properties_str})"
146
+
147
+
114
148
  class CustomFileBasedException(AirbyteTracedException):
115
149
  """
116
150
  A specialized exception for file-based connectors.
@@ -242,7 +242,7 @@ class FileBasedSource(ConcurrentSourceAdapter, ABC):
242
242
  stream=self._make_default_stream(
243
243
  stream_config=stream_config,
244
244
  cursor=cursor,
245
- use_file_transfer=self._use_file_transfer(parsed_config),
245
+ parsed_config=parsed_config,
246
246
  ),
247
247
  source=self,
248
248
  logger=self.logger,
@@ -273,7 +273,7 @@ class FileBasedSource(ConcurrentSourceAdapter, ABC):
273
273
  stream=self._make_default_stream(
274
274
  stream_config=stream_config,
275
275
  cursor=cursor,
276
- use_file_transfer=self._use_file_transfer(parsed_config),
276
+ parsed_config=parsed_config,
277
277
  ),
278
278
  source=self,
279
279
  logger=self.logger,
@@ -285,7 +285,7 @@ class FileBasedSource(ConcurrentSourceAdapter, ABC):
285
285
  stream = self._make_default_stream(
286
286
  stream_config=stream_config,
287
287
  cursor=cursor,
288
- use_file_transfer=self._use_file_transfer(parsed_config),
288
+ parsed_config=parsed_config,
289
289
  )
290
290
 
291
291
  streams.append(stream)
@@ -298,7 +298,7 @@ class FileBasedSource(ConcurrentSourceAdapter, ABC):
298
298
  self,
299
299
  stream_config: FileBasedStreamConfig,
300
300
  cursor: Optional[AbstractFileBasedCursor],
301
- use_file_transfer: bool = False,
301
+ parsed_config: AbstractFileBasedSpec,
302
302
  ) -> AbstractFileBasedStream:
303
303
  return DefaultFileBasedStream(
304
304
  config=stream_config,
@@ -310,7 +310,8 @@ class FileBasedSource(ConcurrentSourceAdapter, ABC):
310
310
  validation_policy=self._validate_and_get_validation_policy(stream_config),
311
311
  errors_collector=self.errors_collector,
312
312
  cursor=cursor,
313
- use_file_transfer=use_file_transfer,
313
+ use_file_transfer=self._use_file_transfer(parsed_config),
314
+ preserve_directory_structure=self._preserve_directory_structure(parsed_config),
314
315
  )
315
316
 
316
317
  def _get_stream_from_catalog(
@@ -385,3 +386,25 @@ class FileBasedSource(ConcurrentSourceAdapter, ABC):
385
386
  and parsed_config.delivery_method.delivery_type == "use_file_transfer"
386
387
  )
387
388
  return use_file_transfer
389
+
390
+ @staticmethod
391
+ def _preserve_directory_structure(parsed_config: AbstractFileBasedSpec) -> bool:
392
+ """
393
+ Determines whether to preserve directory structure during file transfer.
394
+
395
+ When enabled, files maintain their subdirectory paths in the destination.
396
+ When disabled, files are flattened to the root of the destination.
397
+
398
+ Args:
399
+ parsed_config: The parsed configuration containing delivery method settings
400
+
401
+ Returns:
402
+ True if directory structure should be preserved (default), False otherwise
403
+ """
404
+ if (
405
+ FileBasedSource._use_file_transfer(parsed_config)
406
+ and hasattr(parsed_config.delivery_method, "preserve_directory_structure")
407
+ and parsed_config.delivery_method.preserve_directory_structure is not None
408
+ ):
409
+ return parsed_config.delivery_method.preserve_directory_structure
410
+ return True
@@ -135,6 +135,17 @@ class AbstractFileBasedStreamReader(ABC):
135
135
  return use_file_transfer
136
136
  return False
137
137
 
138
+ def preserve_directory_structure(self) -> bool:
139
+ # fall back to preserve subdirectories if config is not present or incomplete
140
+ if (
141
+ self.use_file_transfer()
142
+ and self.config
143
+ and hasattr(self.config.delivery_method, "preserve_directory_structure")
144
+ and self.config.delivery_method.preserve_directory_structure is not None
145
+ ):
146
+ return self.config.delivery_method.preserve_directory_structure
147
+ return True
148
+
138
149
  @abstractmethod
139
150
  def get_file(
140
151
  self, file: RemoteFile, local_directory: str, logger: logging.Logger
@@ -159,10 +170,13 @@ class AbstractFileBasedStreamReader(ABC):
159
170
  """
160
171
  ...
161
172
 
162
- @staticmethod
163
- def _get_file_transfer_paths(file: RemoteFile, local_directory: str) -> List[str]:
164
- # Remove left slashes from source path format to make relative path for writing locally
165
- file_relative_path = file.uri.lstrip("/")
173
+ def _get_file_transfer_paths(self, file: RemoteFile, local_directory: str) -> List[str]:
174
+ preserve_directory_structure = self.preserve_directory_structure()
175
+ if preserve_directory_structure:
176
+ # Remove left slashes from source path format to make relative path for writing locally
177
+ file_relative_path = file.uri.lstrip("/")
178
+ else:
179
+ file_relative_path = path.basename(file.uri)
166
180
  local_file_path = path.join(local_directory, file_relative_path)
167
181
 
168
182
  # Ensure the local directory exists
@@ -2,6 +2,7 @@
2
2
  # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
3
3
  #
4
4
  import logging
5
+ import os
5
6
  import traceback
6
7
  from datetime import datetime
7
8
  from io import BytesIO, IOBase
@@ -42,12 +43,34 @@ unstructured_partition_pdf = None
42
43
  unstructured_partition_docx = None
43
44
  unstructured_partition_pptx = None
44
45
 
46
+ AIRBYTE_NLTK_DATA_DIR = "/airbyte/nltk_data"
47
+ TMP_NLTK_DATA_DIR = "/tmp/nltk_data"
48
+
49
+
50
+ def get_nltk_temp_folder() -> str:
51
+ """
52
+ For non-root connectors /tmp is not currently writable, but we should allow it in the future.
53
+ It's safe to use /airbyte for now. Fallback to /tmp for local development.
54
+ """
55
+ try:
56
+ nltk_data_dir = AIRBYTE_NLTK_DATA_DIR
57
+ os.makedirs(nltk_data_dir, exist_ok=True)
58
+ except OSError:
59
+ nltk_data_dir = TMP_NLTK_DATA_DIR
60
+ os.makedirs(nltk_data_dir, exist_ok=True)
61
+ return nltk_data_dir
62
+
63
+
45
64
  try:
65
+ nltk_data_dir = get_nltk_temp_folder()
66
+ nltk.data.path.append(nltk_data_dir)
46
67
  nltk.data.find("tokenizers/punkt.zip")
47
68
  nltk.data.find("tokenizers/punkt_tab.zip")
69
+ nltk.data.find("tokenizers/averaged_perceptron_tagger_eng.zip")
48
70
  except LookupError:
49
- nltk.download("punkt")
50
- nltk.download("punkt_tab")
71
+ nltk.download("punkt", download_dir=nltk_data_dir, quiet=True)
72
+ nltk.download("punkt_tab", download_dir=nltk_data_dir, quiet=True)
73
+ nltk.download("averaged_perceptron_tagger_eng", download_dir=nltk_data_dir, quiet=True)
51
74
 
52
75
 
53
76
  def optional_decode(contents: Union[str, bytes]) -> str:
@@ -5,14 +5,17 @@
5
5
  import asyncio
6
6
  import itertools
7
7
  import traceback
8
+ from collections import defaultdict
8
9
  from copy import deepcopy
9
10
  from functools import cache
10
- from typing import Any, Dict, Iterable, List, Mapping, MutableMapping, Optional, Set, Union
11
+ from os import path
12
+ from typing import Any, Dict, Iterable, List, Mapping, MutableMapping, Optional, Set, Tuple, Union
11
13
 
12
14
  from airbyte_cdk.models import AirbyteLogMessage, AirbyteMessage, FailureType, Level
13
15
  from airbyte_cdk.models import Type as MessageType
14
16
  from airbyte_cdk.sources.file_based.config.file_based_stream_config import PrimaryKeyType
15
17
  from airbyte_cdk.sources.file_based.exceptions import (
18
+ DuplicatedFilesError,
16
19
  FileBasedSourceError,
17
20
  InvalidSchemaError,
18
21
  MissingSchemaError,
@@ -43,6 +46,8 @@ class DefaultFileBasedStream(AbstractFileBasedStream, IncrementalMixin):
43
46
  """
44
47
 
45
48
  FILE_TRANSFER_KW = "use_file_transfer"
49
+ PRESERVE_DIRECTORY_STRUCTURE_KW = "preserve_directory_structure"
50
+ FILES_KEY = "files"
46
51
  DATE_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ"
47
52
  ab_last_mod_col = "_ab_source_file_last_modified"
48
53
  ab_file_name_col = "_ab_source_file_url"
@@ -50,10 +55,15 @@ class DefaultFileBasedStream(AbstractFileBasedStream, IncrementalMixin):
50
55
  source_file_url = "source_file_url"
51
56
  airbyte_columns = [ab_last_mod_col, ab_file_name_col]
52
57
  use_file_transfer = False
58
+ preserve_directory_structure = True
53
59
 
54
60
  def __init__(self, **kwargs: Any):
55
61
  if self.FILE_TRANSFER_KW in kwargs:
56
62
  self.use_file_transfer = kwargs.pop(self.FILE_TRANSFER_KW, False)
63
+ if self.PRESERVE_DIRECTORY_STRUCTURE_KW in kwargs:
64
+ self.preserve_directory_structure = kwargs.pop(
65
+ self.PRESERVE_DIRECTORY_STRUCTURE_KW, True
66
+ )
57
67
  super().__init__(**kwargs)
58
68
 
59
69
  @property
@@ -98,15 +108,33 @@ class DefaultFileBasedStream(AbstractFileBasedStream, IncrementalMixin):
98
108
  else:
99
109
  return super()._filter_schema_invalid_properties(configured_catalog_json_schema)
100
110
 
111
+ def _duplicated_files_names(
112
+ self, slices: List[dict[str, List[RemoteFile]]]
113
+ ) -> List[dict[str, List[str]]]:
114
+ seen_file_names: Dict[str, List[str]] = defaultdict(list)
115
+ for file_slice in slices:
116
+ for file_found in file_slice[self.FILES_KEY]:
117
+ file_name = path.basename(file_found.uri)
118
+ seen_file_names[file_name].append(file_found.uri)
119
+ return [
120
+ {file_name: paths} for file_name, paths in seen_file_names.items() if len(paths) > 1
121
+ ]
122
+
101
123
  def compute_slices(self) -> Iterable[Optional[Mapping[str, Any]]]:
102
124
  # Sort files by last_modified, uri and return them grouped by last_modified
103
125
  all_files = self.list_files()
104
126
  files_to_read = self._cursor.get_files_to_sync(all_files, self.logger)
105
127
  sorted_files_to_read = sorted(files_to_read, key=lambda f: (f.last_modified, f.uri))
106
128
  slices = [
107
- {"files": list(group[1])}
129
+ {self.FILES_KEY: list(group[1])}
108
130
  for group in itertools.groupby(sorted_files_to_read, lambda f: f.last_modified)
109
131
  ]
132
+ if slices and not self.preserve_directory_structure:
133
+ duplicated_files_names = self._duplicated_files_names(slices)
134
+ if duplicated_files_names:
135
+ raise DuplicatedFilesError(
136
+ stream=self.name, duplicated_files_names=duplicated_files_names
137
+ )
110
138
  return slices
111
139
 
112
140
  def transform_record(
@@ -23,7 +23,7 @@ classifiers = [
23
23
  keywords = ["airbyte", "connector-development-kit", "cdk"]
24
24
 
25
25
  # Python CDK uses dynamic versioning: https://github.com/mtkennerly/poetry-dynamic-versioning
26
- version = "6.18.1" # Version will be calculated dynamically.
26
+ version = "6.19.0" # Version will be calculated dynamically.
27
27
 
28
28
  [tool.poetry-dynamic-versioning]
29
29
  enable = false
File without changes
File without changes