airbyte-cdk 6.27.2__tar.gz → 6.29.0.dev0__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 (358) hide show
  1. airbyte_cdk-6.29.0.dev0/LICENSE_SHORT +1 -0
  2. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/PKG-INFO +5 -4
  3. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/cli/source_declarative_manifest/_run.py +3 -3
  4. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/connector_builder/connector_builder_handler.py +2 -2
  5. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/auth/oauth.py +22 -13
  6. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/auth/token_provider.py +4 -5
  7. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/checks/check_dynamic_stream.py +16 -9
  8. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/declarative_component_schema.yaml +5 -0
  9. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/models/declarative_component_schema.py +5 -0
  10. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +9 -1
  11. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/http_response_filter.py +4 -4
  12. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/schema/dynamic_schema_loader.py +1 -0
  13. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/state_converters/datetime_stream_state_converter.py +22 -13
  14. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +17 -6
  15. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py +24 -12
  16. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/utils/transform.py +23 -2
  17. airbyte_cdk-6.29.0.dev0/airbyte_cdk/utils/datetime_helpers.py +517 -0
  18. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/pyproject.toml +4 -4
  19. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/LICENSE.txt +0 -0
  20. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/README.md +0 -0
  21. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/__init__.py +0 -0
  22. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/cli/__init__.py +0 -0
  23. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/cli/source_declarative_manifest/__init__.py +0 -0
  24. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/cli/source_declarative_manifest/spec.json +0 -0
  25. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/config_observation.py +0 -0
  26. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/connector.py +0 -0
  27. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/connector_builder/README.md +0 -0
  28. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/connector_builder/__init__.py +0 -0
  29. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/connector_builder/main.py +0 -0
  30. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/connector_builder/message_grouper.py +0 -0
  31. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/connector_builder/models.py +0 -0
  32. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/destinations/__init__.py +0 -0
  33. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/destinations/destination.py +0 -0
  34. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/destinations/vector_db_based/README.md +0 -0
  35. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/destinations/vector_db_based/__init__.py +0 -0
  36. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/destinations/vector_db_based/config.py +0 -0
  37. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/destinations/vector_db_based/document_processor.py +0 -0
  38. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/destinations/vector_db_based/embedder.py +0 -0
  39. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/destinations/vector_db_based/indexer.py +0 -0
  40. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/destinations/vector_db_based/test_utils.py +0 -0
  41. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/destinations/vector_db_based/utils.py +0 -0
  42. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/destinations/vector_db_based/writer.py +0 -0
  43. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/entrypoint.py +0 -0
  44. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/exception_handler.py +0 -0
  45. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/logger.py +0 -0
  46. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/models/__init__.py +0 -0
  47. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/models/airbyte_protocol.py +0 -0
  48. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/models/airbyte_protocol_serializers.py +0 -0
  49. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/models/file_transfer_record_message.py +0 -0
  50. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/models/well_known_types.py +0 -0
  51. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/py.typed +0 -0
  52. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/__init__.py +0 -0
  53. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/abstract_source.py +0 -0
  54. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/concurrent_source/__init__.py +0 -0
  55. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/concurrent_source/concurrent_read_processor.py +0 -0
  56. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/concurrent_source/concurrent_source.py +0 -0
  57. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/concurrent_source/concurrent_source_adapter.py +0 -0
  58. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/concurrent_source/partition_generation_completed_sentinel.py +0 -0
  59. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/concurrent_source/stream_thread_exception.py +0 -0
  60. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/concurrent_source/thread_pool_manager.py +0 -0
  61. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/config.py +0 -0
  62. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/connector_state_manager.py +0 -0
  63. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/__init__.py +0 -0
  64. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/async_job/__init__.py +0 -0
  65. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/async_job/job.py +0 -0
  66. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/async_job/job_orchestrator.py +0 -0
  67. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/async_job/job_tracker.py +0 -0
  68. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/async_job/repository.py +0 -0
  69. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/async_job/status.py +0 -0
  70. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/async_job/timer.py +0 -0
  71. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/auth/__init__.py +0 -0
  72. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/auth/declarative_authenticator.py +0 -0
  73. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/auth/jwt.py +0 -0
  74. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/auth/selective_authenticator.py +0 -0
  75. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/auth/token.py +0 -0
  76. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/checks/__init__.py +0 -0
  77. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/checks/check_stream.py +0 -0
  78. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/checks/connection_checker.py +0 -0
  79. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/concurrency_level/__init__.py +0 -0
  80. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/concurrency_level/concurrency_level.py +0 -0
  81. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/concurrent_declarative_source.py +0 -0
  82. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/datetime/__init__.py +0 -0
  83. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/datetime/datetime_parser.py +0 -0
  84. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/datetime/min_max_datetime.py +0 -0
  85. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/declarative_source.py +0 -0
  86. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/declarative_stream.py +0 -0
  87. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/decoders/__init__.py +0 -0
  88. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/decoders/composite_raw_decoder.py +0 -0
  89. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/decoders/decoder.py +0 -0
  90. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/decoders/json_decoder.py +0 -0
  91. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/decoders/noop_decoder.py +0 -0
  92. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/decoders/pagination_decoder_decorator.py +0 -0
  93. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/decoders/xml_decoder.py +0 -0
  94. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/decoders/zipfile_decoder.py +0 -0
  95. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/exceptions.py +0 -0
  96. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/extractors/__init__.py +0 -0
  97. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/extractors/dpath_extractor.py +0 -0
  98. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/extractors/http_selector.py +0 -0
  99. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/extractors/record_extractor.py +0 -0
  100. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/extractors/record_filter.py +0 -0
  101. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/extractors/record_selector.py +0 -0
  102. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/extractors/response_to_file_extractor.py +0 -0
  103. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/extractors/type_transformer.py +0 -0
  104. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/incremental/__init__.py +0 -0
  105. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/incremental/concurrent_partition_cursor.py +0 -0
  106. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +0 -0
  107. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/incremental/declarative_cursor.py +0 -0
  108. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/incremental/global_substream_cursor.py +0 -0
  109. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py +0 -0
  110. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/incremental/per_partition_with_global.py +0 -0
  111. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/incremental/resumable_full_refresh_cursor.py +0 -0
  112. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/interpolation/__init__.py +0 -0
  113. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/interpolation/filters.py +0 -0
  114. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/interpolation/interpolated_boolean.py +0 -0
  115. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/interpolation/interpolated_mapping.py +0 -0
  116. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/interpolation/interpolated_nested_mapping.py +0 -0
  117. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/interpolation/interpolated_string.py +0 -0
  118. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/interpolation/interpolation.py +0 -0
  119. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/interpolation/jinja.py +0 -0
  120. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/interpolation/macros.py +0 -0
  121. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/manifest_declarative_source.py +0 -0
  122. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/migrations/__init__.py +0 -0
  123. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migration.py +0 -0
  124. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/migrations/state_migration.py +0 -0
  125. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/models/__init__.py +0 -0
  126. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/parsers/__init__.py +0 -0
  127. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/parsers/custom_code_compiler.py +0 -0
  128. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/parsers/custom_exceptions.py +0 -0
  129. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py +0 -0
  130. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py +0 -0
  131. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/partition_routers/__init__.py +0 -0
  132. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py +0 -0
  133. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py +0 -0
  134. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py +0 -0
  135. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/partition_routers/partition_router.py +0 -0
  136. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/partition_routers/single_partition_router.py +0 -0
  137. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +0 -0
  138. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/README.md +0 -0
  139. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/__init__.py +0 -0
  140. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/__init__.py +0 -0
  141. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +0 -0
  142. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/constant_backoff_strategy.py +0 -0
  143. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/exponential_backoff_strategy.py +0 -0
  144. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/header_helper.py +0 -0
  145. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_time_from_header_backoff_strategy.py +0 -0
  146. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_until_time_from_header_backoff_strategy.py +0 -0
  147. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategy.py +0 -0
  148. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/composite_error_handler.py +0 -0
  149. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_error_handler.py +0 -0
  150. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_http_response_filter.py +0 -0
  151. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/error_handler.py +0 -0
  152. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/http_job_repository.py +0 -0
  153. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/http_requester.py +0 -0
  154. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/__init__.py +0 -0
  155. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +0 -0
  156. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/no_pagination.py +0 -0
  157. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/paginator.py +0 -0
  158. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/__init__.py +0 -0
  159. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/cursor_pagination_strategy.py +0 -0
  160. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py +0 -0
  161. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/page_increment.py +0 -0
  162. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/pagination_strategy.py +0 -0
  163. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/stop_condition.py +0 -0
  164. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/request_option.py +0 -0
  165. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/request_options/__init__.py +0 -0
  166. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/request_options/datetime_based_request_options_provider.py +0 -0
  167. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/request_options/default_request_options_provider.py +0 -0
  168. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_nested_request_input_provider.py +0 -0
  169. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_input_provider.py +0 -0
  170. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_options_provider.py +0 -0
  171. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/request_options/request_options_provider.py +0 -0
  172. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/request_path.py +0 -0
  173. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/requesters/requester.py +0 -0
  174. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/resolvers/__init__.py +0 -0
  175. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/resolvers/components_resolver.py +0 -0
  176. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/resolvers/config_components_resolver.py +0 -0
  177. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/resolvers/http_components_resolver.py +0 -0
  178. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/retrievers/__init__.py +0 -0
  179. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/retrievers/async_retriever.py +0 -0
  180. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/retrievers/retriever.py +0 -0
  181. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +0 -0
  182. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/schema/__init__.py +0 -0
  183. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/schema/default_schema_loader.py +0 -0
  184. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/schema/inline_schema_loader.py +0 -0
  185. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/schema/json_file_schema_loader.py +0 -0
  186. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/schema/schema_loader.py +0 -0
  187. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/spec/__init__.py +0 -0
  188. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/spec/spec.py +0 -0
  189. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/stream_slicers/__init__.py +0 -0
  190. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/stream_slicers/declarative_partition_generator.py +0 -0
  191. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/stream_slicers/stream_slicer.py +0 -0
  192. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/transformations/__init__.py +0 -0
  193. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/transformations/add_fields.py +0 -0
  194. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/transformations/dpath_flatten_fields.py +0 -0
  195. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/transformations/flatten_fields.py +0 -0
  196. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/transformations/keys_replace_transformation.py +0 -0
  197. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/transformations/keys_to_lower_transformation.py +0 -0
  198. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/transformations/keys_to_snake_transformation.py +0 -0
  199. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/transformations/remove_fields.py +0 -0
  200. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/transformations/transformation.py +0 -0
  201. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/types.py +0 -0
  202. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/declarative/yaml_declarative_source.py +0 -0
  203. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/embedded/__init__.py +0 -0
  204. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/embedded/base_integration.py +0 -0
  205. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/embedded/catalog.py +0 -0
  206. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/embedded/runner.py +0 -0
  207. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/embedded/tools.py +0 -0
  208. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/README.md +0 -0
  209. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/__init__.py +0 -0
  210. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/availability_strategy/__init__.py +0 -0
  211. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/availability_strategy/abstract_file_based_availability_strategy.py +0 -0
  212. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/availability_strategy/default_file_based_availability_strategy.py +0 -0
  213. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/config/__init__.py +0 -0
  214. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py +0 -0
  215. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/config/avro_format.py +0 -0
  216. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/config/csv_format.py +0 -0
  217. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/config/excel_format.py +0 -0
  218. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/config/file_based_stream_config.py +0 -0
  219. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/config/jsonl_format.py +0 -0
  220. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/config/parquet_format.py +0 -0
  221. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/config/unstructured_format.py +0 -0
  222. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/discovery_policy/__init__.py +0 -0
  223. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/discovery_policy/abstract_discovery_policy.py +0 -0
  224. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/discovery_policy/default_discovery_policy.py +0 -0
  225. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/exceptions.py +0 -0
  226. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/file_based_source.py +0 -0
  227. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/file_based_stream_reader.py +0 -0
  228. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/file_types/__init__.py +0 -0
  229. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/file_types/avro_parser.py +0 -0
  230. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/file_types/csv_parser.py +0 -0
  231. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/file_types/excel_parser.py +0 -0
  232. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/file_types/file_transfer.py +0 -0
  233. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/file_types/file_type_parser.py +0 -0
  234. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/file_types/jsonl_parser.py +0 -0
  235. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/file_types/parquet_parser.py +0 -0
  236. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/file_types/unstructured_parser.py +0 -0
  237. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/remote_file.py +0 -0
  238. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/schema_helpers.py +0 -0
  239. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/schema_validation_policies/__init__.py +0 -0
  240. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/schema_validation_policies/abstract_schema_validation_policy.py +0 -0
  241. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/schema_validation_policies/default_schema_validation_policies.py +0 -0
  242. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/stream/__init__.py +0 -0
  243. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/stream/abstract_file_based_stream.py +0 -0
  244. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/stream/concurrent/__init__.py +0 -0
  245. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/stream/concurrent/adapters.py +0 -0
  246. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/__init__.py +0 -0
  247. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/abstract_concurrent_file_based_cursor.py +0 -0
  248. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_concurrent_cursor.py +0 -0
  249. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_final_state_cursor.py +0 -0
  250. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/stream/cursor/__init__.py +0 -0
  251. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/stream/cursor/abstract_file_based_cursor.py +0 -0
  252. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/stream/cursor/default_file_based_cursor.py +0 -0
  253. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/stream/default_file_based_stream.py +0 -0
  254. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/file_based/types.py +0 -0
  255. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/http_config.py +0 -0
  256. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/http_logger.py +0 -0
  257. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/message/__init__.py +0 -0
  258. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/message/repository.py +0 -0
  259. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/source.py +0 -0
  260. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/__init__.py +0 -0
  261. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/availability_strategy.py +0 -0
  262. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/call_rate.py +0 -0
  263. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/checkpoint/__init__.py +0 -0
  264. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/checkpoint/checkpoint_reader.py +0 -0
  265. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/checkpoint/cursor.py +0 -0
  266. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/checkpoint/per_partition_key_serializer.py +0 -0
  267. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/checkpoint/resumable_full_refresh_cursor.py +0 -0
  268. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/checkpoint/substream_resumable_full_refresh_cursor.py +0 -0
  269. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/README.md +0 -0
  270. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/__init__.py +0 -0
  271. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/abstract_stream.py +0 -0
  272. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/abstract_stream_facade.py +0 -0
  273. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/adapters.py +0 -0
  274. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/availability_strategy.py +0 -0
  275. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/clamping.py +0 -0
  276. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/cursor.py +0 -0
  277. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/cursor_types.py +0 -0
  278. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/default_stream.py +0 -0
  279. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/exceptions.py +0 -0
  280. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/helpers.py +0 -0
  281. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/partition_enqueuer.py +0 -0
  282. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/partition_reader.py +0 -0
  283. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/partitions/__init__.py +0 -0
  284. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/partitions/partition.py +0 -0
  285. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/partitions/partition_generator.py +0 -0
  286. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/partitions/stream_slicer.py +0 -0
  287. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/partitions/types.py +0 -0
  288. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/state_converters/__init__.py +0 -0
  289. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/concurrent/state_converters/abstract_stream_state_converter.py +0 -0
  290. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/core.py +0 -0
  291. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/__init__.py +0 -0
  292. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/availability_strategy.py +0 -0
  293. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/error_handlers/__init__.py +0 -0
  294. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/error_handlers/backoff_strategy.py +0 -0
  295. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/error_handlers/default_backoff_strategy.py +0 -0
  296. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/error_handlers/default_error_mapping.py +0 -0
  297. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/error_handlers/error_handler.py +0 -0
  298. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/error_handlers/error_message_parser.py +0 -0
  299. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/error_handlers/http_status_error_handler.py +0 -0
  300. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/error_handlers/json_error_message_parser.py +0 -0
  301. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/error_handlers/response_models.py +0 -0
  302. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/exceptions.py +0 -0
  303. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/http.py +0 -0
  304. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/http_client.py +0 -0
  305. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/rate_limiting.py +0 -0
  306. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/requests_native_auth/__init__.py +0 -0
  307. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_token.py +0 -0
  308. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/http/requests_native_auth/token.py +0 -0
  309. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/streams/utils/__init__.py +0 -0
  310. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/types.py +0 -0
  311. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/utils/__init__.py +0 -0
  312. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/utils/casing.py +0 -0
  313. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/utils/record_helper.py +0 -0
  314. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/utils/schema_helpers.py +0 -0
  315. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/utils/slice_logger.py +0 -0
  316. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sources/utils/types.py +0 -0
  317. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sql/__init__.py +0 -0
  318. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sql/_util/__init__.py +0 -0
  319. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sql/_util/hashing.py +0 -0
  320. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sql/_util/name_normalizers.py +0 -0
  321. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sql/constants.py +0 -0
  322. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sql/exceptions.py +0 -0
  323. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sql/secrets.py +0 -0
  324. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sql/shared/__init__.py +0 -0
  325. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sql/shared/catalog_providers.py +0 -0
  326. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sql/shared/sql_processor.py +0 -0
  327. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/sql/types.py +0 -0
  328. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/test/__init__.py +0 -0
  329. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/test/catalog_builder.py +0 -0
  330. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/test/entrypoint_wrapper.py +0 -0
  331. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/test/mock_http/__init__.py +0 -0
  332. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/test/mock_http/matcher.py +0 -0
  333. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/test/mock_http/mocker.py +0 -0
  334. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/test/mock_http/request.py +0 -0
  335. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/test/mock_http/response.py +0 -0
  336. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/test/mock_http/response_builder.py +0 -0
  337. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/test/state_builder.py +0 -0
  338. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/test/utils/__init__.py +0 -0
  339. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/test/utils/data.py +0 -0
  340. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/test/utils/http_mocking.py +0 -0
  341. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/test/utils/manifest_only_fixtures.py +0 -0
  342. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/test/utils/reading.py +0 -0
  343. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/utils/__init__.py +0 -0
  344. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/utils/airbyte_secrets_utils.py +0 -0
  345. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/utils/analytics_message.py +0 -0
  346. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/utils/constants.py +0 -0
  347. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/utils/datetime_format_inferrer.py +0 -0
  348. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/utils/event_timing.py +0 -0
  349. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/utils/is_cloud_environment.py +0 -0
  350. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/utils/mapping_helpers.py +0 -0
  351. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/utils/message_utils.py +0 -0
  352. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/utils/oneof_option_config.py +0 -0
  353. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/utils/print_buffer.py +0 -0
  354. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/utils/schema_inferrer.py +0 -0
  355. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/utils/slice_hasher.py +0 -0
  356. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/utils/spec_schema_transformations.py +0 -0
  357. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/utils/stream_status_utils.py +0 -0
  358. {airbyte_cdk-6.27.2 → airbyte_cdk-6.29.0.dev0}/airbyte_cdk/utils/traced_exception.py +0 -0
@@ -0,0 +1 @@
1
+ Copyright (c) 2025 Airbyte, Inc., all rights reserved.
@@ -1,19 +1,20 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-cdk
3
- Version: 6.27.2
3
+ Version: 6.29.0.dev0
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://airbyte.com
6
6
  License: MIT
7
7
  Keywords: airbyte,connector-development-kit,cdk
8
8
  Author: Airbyte
9
9
  Author-email: contact@airbyte.io
10
- Requires-Python: >=3.10,<3.12
10
+ Requires-Python: >=3.10,<3.13
11
11
  Classifier: Development Status :: 3 - Alpha
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: License :: OSI Approved :: MIT License
14
14
  Classifier: Programming Language :: Python :: 3
15
15
  Classifier: Programming Language :: Python :: 3.10
16
16
  Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
17
18
  Classifier: Topic :: Scientific/Engineering
18
19
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
19
20
  Provides-Extra: file-based
@@ -45,7 +46,6 @@ Requires-Dist: orjson (>=3.10.7,<4.0.0)
45
46
  Requires-Dist: pandas (==2.2.2)
46
47
  Requires-Dist: pdf2image (==1.16.3) ; extra == "file-based"
47
48
  Requires-Dist: pdfminer.six (==20221105) ; extra == "file-based"
48
- Requires-Dist: pendulum (<3.0.0)
49
49
  Requires-Dist: psutil (==6.1.0)
50
50
  Requires-Dist: pyarrow (>=15.0.0,<15.1.0) ; extra == "file-based"
51
51
  Requires-Dist: pydantic (>=2.7,<3.0)
@@ -53,7 +53,7 @@ Requires-Dist: pyjwt (>=2.8.0,<3.0.0)
53
53
  Requires-Dist: pyrate-limiter (>=3.1.0,<3.2.0)
54
54
  Requires-Dist: pytesseract (==0.3.10) ; extra == "file-based"
55
55
  Requires-Dist: python-calamine (==0.2.3) ; extra == "file-based"
56
- Requires-Dist: python-dateutil
56
+ Requires-Dist: python-dateutil (>=2.9.0,<3.0.0)
57
57
  Requires-Dist: python-snappy (==0.7.3) ; extra == "file-based"
58
58
  Requires-Dist: python-ulid (>=3.0.0,<4.0.0)
59
59
  Requires-Dist: pytz (==2024.2)
@@ -66,6 +66,7 @@ Requires-Dist: tiktoken (==0.8.0) ; extra == "vector-db-based"
66
66
  Requires-Dist: unstructured.pytesseract (>=0.3.12) ; extra == "file-based"
67
67
  Requires-Dist: unstructured[docx,pptx] (==0.10.27) ; extra == "file-based"
68
68
  Requires-Dist: wcmatch (==10.0)
69
+ Requires-Dist: whenever (>=0.6.16,<0.7.0)
69
70
  Requires-Dist: xmltodict (>=0.13,<0.15)
70
71
  Project-URL: Documentation, https://docs.airbyte.io/
71
72
  Project-URL: Repository, https://github.com/airbytehq/airbyte-python-cdk
@@ -21,7 +21,6 @@ import pkgutil
21
21
  import sys
22
22
  import traceback
23
23
  from collections.abc import Mapping
24
- from datetime import datetime
25
24
  from pathlib import Path
26
25
  from typing import Any, cast
27
26
 
@@ -44,6 +43,7 @@ from airbyte_cdk.sources.declarative.concurrent_declarative_source import (
44
43
  )
45
44
  from airbyte_cdk.sources.declarative.yaml_declarative_source import YamlDeclarativeSource
46
45
  from airbyte_cdk.sources.source import TState
46
+ from airbyte_cdk.utils.datetime_helpers import ab_datetime_now
47
47
 
48
48
 
49
49
  class SourceLocalYaml(YamlDeclarativeSource):
@@ -101,7 +101,7 @@ def _get_local_yaml_source(args: list[str]) -> SourceLocalYaml:
101
101
  type=Type.TRACE,
102
102
  trace=AirbyteTraceMessage(
103
103
  type=TraceType.ERROR,
104
- emitted_at=int(datetime.now().timestamp() * 1000),
104
+ emitted_at=ab_datetime_now().to_epoch_millis(),
105
105
  error=AirbyteErrorTraceMessage(
106
106
  message=f"Error starting the sync. This could be due to an invalid configuration or catalog. Please contact Support for assistance. Error: {error}",
107
107
  stack_trace=traceback.format_exc(),
@@ -191,7 +191,7 @@ def create_declarative_source(
191
191
  type=Type.TRACE,
192
192
  trace=AirbyteTraceMessage(
193
193
  type=TraceType.ERROR,
194
- emitted_at=int(datetime.now().timestamp() * 1000),
194
+ emitted_at=ab_datetime_now().to_epoch_millis(),
195
195
  error=AirbyteErrorTraceMessage(
196
196
  message=f"Error starting the sync. This could be due to an invalid configuration or catalog. Please contact Support for assistance. Error: {error}",
197
197
  stack_trace=traceback.format_exc(),
@@ -3,7 +3,6 @@
3
3
  #
4
4
 
5
5
  import dataclasses
6
- from datetime import datetime
7
6
  from typing import Any, List, Mapping
8
7
 
9
8
  from airbyte_cdk.connector_builder.message_grouper import MessageGrouper
@@ -21,6 +20,7 @@ from airbyte_cdk.sources.declarative.parsers.model_to_component_factory import (
21
20
  ModelToComponentFactory,
22
21
  )
23
22
  from airbyte_cdk.utils.airbyte_secrets_utils import filter_secrets
23
+ from airbyte_cdk.utils.datetime_helpers import ab_datetime_now
24
24
  from airbyte_cdk.utils.traced_exception import AirbyteTracedException
25
25
 
26
26
  DEFAULT_MAXIMUM_NUMBER_OF_PAGES_PER_SLICE = 5
@@ -114,4 +114,4 @@ def resolve_manifest(source: ManifestDeclarativeSource) -> AirbyteMessage:
114
114
 
115
115
 
116
116
  def _emitted_at() -> int:
117
- return int(datetime.now().timestamp()) * 1000
117
+ return ab_datetime_now().to_epoch_millis()
@@ -3,10 +3,9 @@
3
3
  #
4
4
 
5
5
  from dataclasses import InitVar, dataclass, field
6
+ from datetime import timedelta
6
7
  from typing import Any, List, Mapping, MutableMapping, Optional, Union
7
8
 
8
- import pendulum
9
-
10
9
  from airbyte_cdk.sources.declarative.auth.declarative_authenticator import DeclarativeAuthenticator
11
10
  from airbyte_cdk.sources.declarative.interpolation.interpolated_boolean import InterpolatedBoolean
12
11
  from airbyte_cdk.sources.declarative.interpolation.interpolated_mapping import InterpolatedMapping
@@ -18,6 +17,7 @@ from airbyte_cdk.sources.streams.http.requests_native_auth.abstract_oauth import
18
17
  from airbyte_cdk.sources.streams.http.requests_native_auth.oauth import (
19
18
  SingleUseRefreshTokenOauth2Authenticator,
20
19
  )
20
+ from airbyte_cdk.utils.datetime_helpers import AirbyteDateTime, ab_datetime_now, ab_datetime_parse
21
21
 
22
22
 
23
23
  @dataclass
@@ -53,7 +53,7 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
53
53
  refresh_token: Optional[Union[InterpolatedString, str]] = None
54
54
  scopes: Optional[List[str]] = None
55
55
  token_expiry_date: Optional[Union[InterpolatedString, str]] = None
56
- _token_expiry_date: Optional[pendulum.DateTime] = field(init=False, repr=False, default=None)
56
+ _token_expiry_date: Optional[AirbyteDateTime] = field(init=False, repr=False, default=None)
57
57
  token_expiry_date_format: Optional[str] = None
58
58
  token_expiry_is_time_of_expiration: bool = False
59
59
  access_token_name: Union[InterpolatedString, str] = "access_token"
@@ -122,15 +122,24 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
122
122
  self._refresh_request_headers = InterpolatedMapping(
123
123
  self.refresh_request_headers or {}, parameters=parameters
124
124
  )
125
- self._token_expiry_date: pendulum.DateTime = (
126
- pendulum.parse(
127
- InterpolatedString.create(self.token_expiry_date, parameters=parameters).eval(
128
- self.config
125
+ try:
126
+ if (
127
+ isinstance(self.token_expiry_date, (int, str))
128
+ and str(self.token_expiry_date).isdigit()
129
+ ):
130
+ self._token_expiry_date = ab_datetime_parse(self.token_expiry_date)
131
+ else:
132
+ self._token_expiry_date = (
133
+ ab_datetime_parse(
134
+ InterpolatedString.create(
135
+ self.token_expiry_date, parameters=parameters
136
+ ).eval(self.config)
137
+ )
138
+ if self.token_expiry_date
139
+ else ab_datetime_now() - timedelta(days=1)
129
140
  )
130
- ) # type: ignore # pendulum.parse returns a datetime in this context
131
- if self.token_expiry_date
132
- else pendulum.now().subtract(days=1) # type: ignore # substract does not have type hints
133
- )
141
+ except ValueError as e:
142
+ raise ValueError(f"Invalid token expiry date format: {e}")
134
143
  self.use_profile_assertion = (
135
144
  InterpolatedBoolean(self.use_profile_assertion, parameters=parameters)
136
145
  if isinstance(self.use_profile_assertion, str)
@@ -222,8 +231,8 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
222
231
  def get_refresh_request_headers(self) -> Mapping[str, Any]:
223
232
  return self._refresh_request_headers.eval(self.config)
224
233
 
225
- def get_token_expiry_date(self) -> pendulum.DateTime:
226
- return self._token_expiry_date # type: ignore # _token_expiry_date is a pendulum.DateTime. It is never None despite what mypy thinks
234
+ def get_token_expiry_date(self) -> AirbyteDateTime:
235
+ return self._token_expiry_date # type: ignore # _token_expiry_date is an AirbyteDateTime. It is never None despite what mypy thinks
227
236
 
228
237
  def set_token_expiry_date(self, value: Union[str, int]) -> None:
229
238
  self._token_expiry_date = self._parse_token_expiration_date(value)
@@ -9,9 +9,7 @@ from dataclasses import InitVar, dataclass, field
9
9
  from typing import Any, List, Mapping, Optional, Union
10
10
 
11
11
  import dpath
12
- import pendulum
13
12
  from isodate import Duration
14
- from pendulum import DateTime
15
13
 
16
14
  from airbyte_cdk.sources.declarative.decoders.decoder import Decoder
17
15
  from airbyte_cdk.sources.declarative.decoders.json_decoder import JsonDecoder
@@ -21,6 +19,7 @@ from airbyte_cdk.sources.declarative.requesters.requester import Requester
21
19
  from airbyte_cdk.sources.http_logger import format_http_message
22
20
  from airbyte_cdk.sources.message import MessageRepository, NoopMessageRepository
23
21
  from airbyte_cdk.sources.types import Config
22
+ from airbyte_cdk.utils.datetime_helpers import AirbyteDateTime, ab_datetime_now
24
23
 
25
24
 
26
25
  class TokenProvider:
@@ -38,7 +37,7 @@ class SessionTokenProvider(TokenProvider):
38
37
  message_repository: MessageRepository = NoopMessageRepository()
39
38
  decoder: Decoder = field(default_factory=lambda: JsonDecoder(parameters={}))
40
39
 
41
- _next_expiration_time: Optional[DateTime] = None
40
+ _next_expiration_time: Optional[AirbyteDateTime] = None
42
41
  _token: Optional[str] = None
43
42
 
44
43
  def get_token(self) -> str:
@@ -48,7 +47,7 @@ class SessionTokenProvider(TokenProvider):
48
47
  return self._token
49
48
 
50
49
  def _refresh_if_necessary(self) -> None:
51
- if self._next_expiration_time is None or self._next_expiration_time < pendulum.now():
50
+ if self._next_expiration_time is None or self._next_expiration_time < ab_datetime_now():
52
51
  self._refresh()
53
52
 
54
53
  def _refresh(self) -> None:
@@ -65,7 +64,7 @@ class SessionTokenProvider(TokenProvider):
65
64
  raise ReadException("Failed to get session token, response got ignored by requester")
66
65
  session_token = dpath.get(next(self.decoder.decode(response)), self.session_token_path)
67
66
  if self.expiration_duration is not None:
68
- self._next_expiration_time = pendulum.now() + self.expiration_duration
67
+ self._next_expiration_time = ab_datetime_now() + self.expiration_duration
69
68
  self._token = session_token # type: ignore # Returned decoded response will be Mapping and therefore session_token will be str or None
70
69
 
71
70
 
@@ -23,6 +23,7 @@ class CheckDynamicStream(ConnectionChecker):
23
23
 
24
24
  stream_count: int
25
25
  parameters: InitVar[Mapping[str, Any]]
26
+ use_check_availability: bool = True
26
27
 
27
28
  def __post_init__(self, parameters: Mapping[str, Any]) -> None:
28
29
  self._parameters = parameters
@@ -31,21 +32,27 @@ class CheckDynamicStream(ConnectionChecker):
31
32
  self, source: AbstractSource, logger: logging.Logger, config: Mapping[str, Any]
32
33
  ) -> Tuple[bool, Any]:
33
34
  streams = source.streams(config=config)
35
+
34
36
  if len(streams) == 0:
35
37
  return False, f"No streams to connect to from source {source}"
38
+ if not self.use_check_availability:
39
+ return True, None
40
+
41
+ availability_strategy = HttpAvailabilityStrategy()
36
42
 
37
- for stream_index in range(min(self.stream_count, len(streams))):
38
- stream = streams[stream_index]
39
- availability_strategy = HttpAvailabilityStrategy()
40
- try:
43
+ try:
44
+ for stream in streams[: min(self.stream_count, len(streams))]:
41
45
  stream_is_available, reason = availability_strategy.check_availability(
42
46
  stream, logger
43
47
  )
44
48
  if not stream_is_available:
49
+ logger.warning(f"Stream {stream.name} is not available: {reason}")
45
50
  return False, reason
46
- except Exception as error:
47
- logger.error(
48
- f"Encountered an error trying to connect to stream {stream.name}. Error: \n {traceback.format_exc()}"
49
- )
50
- return False, f"Unable to connect to stream {stream.name} - {error}"
51
+ except Exception as error:
52
+ error_message = (
53
+ f"Encountered an error trying to connect to stream {stream.name}. Error: {error}"
54
+ )
55
+ logger.error(error_message, exc_info=True)
56
+ return False, error_message
57
+
51
58
  return True, None
@@ -320,6 +320,11 @@ definitions:
320
320
  title: Stream Count
321
321
  description: Numbers of the streams to try reading from when running a check operation.
322
322
  type: integer
323
+ use_check_availability:
324
+ title: Use Check Availability
325
+ description: Enables stream check availability. This field is automatically set by the CDK.
326
+ type: boolean
327
+ default: true
323
328
  CompositeErrorHandler:
324
329
  title: Composite Error Handler
325
330
  description: Error handler that sequentially iterates over a list of error handlers.
@@ -59,6 +59,11 @@ class CheckDynamicStream(BaseModel):
59
59
  description="Numbers of the streams to try reading from when running a check operation.",
60
60
  title="Stream Count",
61
61
  )
62
+ use_check_availability: Optional[bool] = Field(
63
+ True,
64
+ description="Enables stream check availability. This field is automatically set by the CDK.",
65
+ title="Use Check Availability",
66
+ )
62
67
 
63
68
 
64
69
  class ConcurrencyLevel(BaseModel):
@@ -903,7 +903,15 @@ class ModelToComponentFactory:
903
903
  def create_check_dynamic_stream(
904
904
  model: CheckDynamicStreamModel, config: Config, **kwargs: Any
905
905
  ) -> CheckDynamicStream:
906
- return CheckDynamicStream(stream_count=model.stream_count, parameters={})
906
+ assert model.use_check_availability is not None # for mypy
907
+
908
+ use_check_availability = model.use_check_availability
909
+
910
+ return CheckDynamicStream(
911
+ stream_count=model.stream_count,
912
+ use_check_availability=use_check_availability,
913
+ parameters={},
914
+ )
907
915
 
908
916
  def create_composite_error_handler(
909
917
  self, model: CompositeErrorHandlerModel, config: Config, **kwargs: Any
@@ -151,16 +151,16 @@ class HttpResponseFilter:
151
151
  :param response: The HTTP response which can be used during interpolation
152
152
  :return: The evaluated error message string to be emitted
153
153
  """
154
- return self.error_message.eval( # type: ignore [no-any-return, union-attr]
154
+ return self.error_message.eval( # type: ignore[no-any-return, union-attr]
155
155
  self.config, response=self._safe_response_json(response), headers=response.headers
156
156
  )
157
157
 
158
158
  def _response_matches_predicate(self, response: requests.Response) -> bool:
159
159
  return (
160
160
  bool(
161
- self.predicate.condition # type: ignore [union-attr]
162
- and self.predicate.eval( # type: ignore [union-attr]
163
- None, # type: ignore [arg-type]
161
+ self.predicate.condition # type:ignore[union-attr]
162
+ and self.predicate.eval( # type:ignore[union-attr]
163
+ None, # type: ignore[arg-type]
164
164
  response=self._safe_response_json(response),
165
165
  headers=response.headers,
166
166
  )
@@ -225,6 +225,7 @@ class DynamicSchemaLoader(SchemaLoader):
225
225
  return self._get_airbyte_type(complex_type.field_type)
226
226
 
227
227
  field_type = self._get_airbyte_type(complex_type.field_type)
228
+
228
229
  field_type["items"] = (
229
230
  self._get_airbyte_type(complex_type.items)
230
231
  if isinstance(complex_type.items, str)
@@ -6,9 +6,6 @@ from abc import abstractmethod
6
6
  from datetime import datetime, timedelta, timezone
7
7
  from typing import Any, Callable, List, MutableMapping, Optional, Tuple
8
8
 
9
- import pendulum
10
- from pendulum.datetime import DateTime
11
-
12
9
  # FIXME We would eventually like the Concurrent package do be agnostic of the declarative package. However, this is a breaking change and
13
10
  # the goal in the short term is only to fix the issue we are seeing for source-declarative-manifest.
14
11
  from airbyte_cdk.sources.declarative.datetime.datetime_parser import DatetimeParser
@@ -17,6 +14,7 @@ from airbyte_cdk.sources.streams.concurrent.state_converters.abstract_stream_sta
17
14
  AbstractStreamStateConverter,
18
15
  ConcurrencyCompatibleStateType,
19
16
  )
17
+ from airbyte_cdk.utils.datetime_helpers import AirbyteDateTime, ab_datetime_now, ab_datetime_parse
20
18
 
21
19
 
22
20
  class DateTimeStreamStateConverter(AbstractStreamStateConverter):
@@ -36,7 +34,7 @@ class DateTimeStreamStateConverter(AbstractStreamStateConverter):
36
34
 
37
35
  @classmethod
38
36
  def get_end_provider(cls) -> Callable[[], datetime]:
39
- return lambda: datetime.now(timezone.utc)
37
+ return ab_datetime_now
40
38
 
41
39
  @abstractmethod
42
40
  def increment(self, timestamp: datetime) -> datetime: ...
@@ -136,10 +134,10 @@ class EpochValueConcurrentStreamStateConverter(DateTimeStreamStateConverter):
136
134
  return int(timestamp.timestamp())
137
135
 
138
136
  def parse_timestamp(self, timestamp: int) -> datetime:
139
- dt_object = pendulum.from_timestamp(timestamp)
140
- if not isinstance(dt_object, DateTime):
137
+ dt_object = AirbyteDateTime.fromtimestamp(timestamp, timezone.utc)
138
+ if not isinstance(dt_object, AirbyteDateTime):
141
139
  raise ValueError(
142
- f"DateTime object was expected but got {type(dt_object)} from pendulum.parse({timestamp})"
140
+ f"AirbyteDateTime object was expected but got {type(dt_object)} from AirbyteDateTime.fromtimestamp({timestamp})"
143
141
  )
144
142
  return dt_object
145
143
 
@@ -169,14 +167,25 @@ class IsoMillisConcurrentStreamStateConverter(DateTimeStreamStateConverter):
169
167
  def increment(self, timestamp: datetime) -> datetime:
170
168
  return timestamp + self._cursor_granularity
171
169
 
172
- def output_format(self, timestamp: datetime) -> Any:
173
- return timestamp.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z"
170
+ def output_format(self, timestamp: datetime) -> str:
171
+ """Format datetime with milliseconds always included.
172
+
173
+ Args:
174
+ timestamp: The datetime to format.
175
+
176
+ Returns:
177
+ str: ISO8601/RFC3339 formatted string with milliseconds.
178
+ """
179
+ dt = AirbyteDateTime.from_datetime(timestamp)
180
+ # Always include milliseconds, even if zero
181
+ millis = dt.microsecond // 1000 if dt.microsecond else 0
182
+ return f"{dt.year:04d}-{dt.month:02d}-{dt.day:02d}T{dt.hour:02d}:{dt.minute:02d}:{dt.second:02d}.{millis:03d}Z"
174
183
 
175
184
  def parse_timestamp(self, timestamp: str) -> datetime:
176
- dt_object = pendulum.parse(timestamp)
177
- if not isinstance(dt_object, DateTime):
185
+ dt_object = ab_datetime_parse(timestamp)
186
+ if not isinstance(dt_object, AirbyteDateTime):
178
187
  raise ValueError(
179
- f"DateTime object was expected but got {type(dt_object)} from pendulum.parse({timestamp})"
188
+ f"AirbyteDateTime object was expected but got {type(dt_object)} from parse({timestamp})"
180
189
  )
181
190
  return dt_object
182
191
 
@@ -184,7 +193,7 @@ class IsoMillisConcurrentStreamStateConverter(DateTimeStreamStateConverter):
184
193
  class CustomFormatConcurrentStreamStateConverter(IsoMillisConcurrentStreamStateConverter):
185
194
  """
186
195
  Datetime State converter that emits state according to the supplied datetime format. The converter supports reading
187
- incoming state in any valid datetime format via Pendulum.
196
+ incoming state in any valid datetime format using AirbyteDateTime parsing utilities.
188
197
  """
189
198
 
190
199
  def __init__(
@@ -4,11 +4,11 @@
4
4
 
5
5
  import logging
6
6
  from abc import abstractmethod
7
+ from datetime import timedelta
7
8
  from json import JSONDecodeError
8
9
  from typing import Any, List, Mapping, MutableMapping, Optional, Tuple, Union
9
10
 
10
11
  import backoff
11
- import pendulum
12
12
  import requests
13
13
  from requests.auth import AuthBase
14
14
 
@@ -17,6 +17,7 @@ from airbyte_cdk.sources.http_logger import format_http_message
17
17
  from airbyte_cdk.sources.message import MessageRepository, NoopMessageRepository
18
18
  from airbyte_cdk.utils import AirbyteTracedException
19
19
  from airbyte_cdk.utils.airbyte_secrets_utils import add_to_secrets
20
+ from airbyte_cdk.utils.datetime_helpers import AirbyteDateTime, ab_datetime_now, ab_datetime_parse
20
21
 
21
22
  from ..exceptions import DefaultBackoffException
22
23
 
@@ -72,7 +73,7 @@ class AbstractOauth2Authenticator(AuthBase):
72
73
 
73
74
  def token_has_expired(self) -> bool:
74
75
  """Returns True if the token is expired"""
75
- return pendulum.now() > self.get_token_expiry_date() # type: ignore # this is always a bool despite what mypy thinks
76
+ return ab_datetime_now() > self.get_token_expiry_date()
76
77
 
77
78
  def build_refresh_request_body(self) -> Mapping[str, Any]:
78
79
  """
@@ -179,7 +180,7 @@ class AbstractOauth2Authenticator(AuthBase):
179
180
  self.get_expires_in_name()
180
181
  ]
181
182
 
182
- def _parse_token_expiration_date(self, value: Union[str, int]) -> pendulum.DateTime:
183
+ def _parse_token_expiration_date(self, value: Union[str, int]) -> AirbyteDateTime:
183
184
  """
184
185
  Return the expiration datetime of the refresh token
185
186
 
@@ -191,9 +192,19 @@ class AbstractOauth2Authenticator(AuthBase):
191
192
  raise ValueError(
192
193
  f"Invalid token expiry date format {self.token_expiry_date_format}; a string representing the format is required."
193
194
  )
194
- return pendulum.from_format(str(value), self.token_expiry_date_format)
195
+ try:
196
+ return ab_datetime_parse(str(value))
197
+ except ValueError as e:
198
+ raise ValueError(f"Invalid token expiry date format: {e}")
195
199
  else:
196
- return pendulum.now().add(seconds=int(float(value)))
200
+ try:
201
+ # Only accept numeric values (as int/float/string) when no format specified
202
+ seconds = int(float(str(value)))
203
+ return ab_datetime_now() + timedelta(seconds=seconds)
204
+ except (ValueError, TypeError):
205
+ raise ValueError(
206
+ f"Invalid expires_in value: {value}. Expected number of seconds when no format specified."
207
+ )
197
208
 
198
209
  @property
199
210
  def token_expiry_is_time_of_expiration(self) -> bool:
@@ -244,7 +255,7 @@ class AbstractOauth2Authenticator(AuthBase):
244
255
  """List of requested scopes"""
245
256
 
246
257
  @abstractmethod
247
- def get_token_expiry_date(self) -> pendulum.DateTime:
258
+ def get_token_expiry_date(self) -> AirbyteDateTime:
248
259
  """Expiration date of the access token"""
249
260
 
250
261
  @abstractmethod
@@ -2,10 +2,10 @@
2
2
  # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
3
3
  #
4
4
 
5
+ from datetime import timedelta
5
6
  from typing import Any, List, Mapping, Optional, Sequence, Tuple, Union
6
7
 
7
8
  import dpath
8
- import pendulum
9
9
 
10
10
  from airbyte_cdk.config_observation import (
11
11
  create_connector_config_control_message,
@@ -15,6 +15,11 @@ from airbyte_cdk.sources.message import MessageRepository, NoopMessageRepository
15
15
  from airbyte_cdk.sources.streams.http.requests_native_auth.abstract_oauth import (
16
16
  AbstractOauth2Authenticator,
17
17
  )
18
+ from airbyte_cdk.utils.datetime_helpers import (
19
+ AirbyteDateTime,
20
+ ab_datetime_now,
21
+ ab_datetime_parse,
22
+ )
18
23
 
19
24
 
20
25
  class Oauth2Authenticator(AbstractOauth2Authenticator):
@@ -34,7 +39,7 @@ class Oauth2Authenticator(AbstractOauth2Authenticator):
34
39
  client_secret_name: str = "client_secret",
35
40
  refresh_token_name: str = "refresh_token",
36
41
  scopes: List[str] | None = None,
37
- token_expiry_date: pendulum.DateTime | None = None,
42
+ token_expiry_date: AirbyteDateTime | None = None,
38
43
  token_expiry_date_format: str | None = None,
39
44
  access_token_name: str = "access_token",
40
45
  expires_in_name: str = "expires_in",
@@ -62,7 +67,7 @@ class Oauth2Authenticator(AbstractOauth2Authenticator):
62
67
  self._grant_type_name = grant_type_name
63
68
  self._grant_type = grant_type
64
69
 
65
- self._token_expiry_date = token_expiry_date or pendulum.now().subtract(days=1) # type: ignore [no-untyped-call]
70
+ self._token_expiry_date = token_expiry_date or (ab_datetime_now() - timedelta(days=1))
66
71
  self._token_expiry_date_format = token_expiry_date_format
67
72
  self._token_expiry_is_time_of_expiration = token_expiry_is_time_of_expiration
68
73
  self._access_token = None
@@ -112,7 +117,7 @@ class Oauth2Authenticator(AbstractOauth2Authenticator):
112
117
  def get_grant_type(self) -> str:
113
118
  return self._grant_type
114
119
 
115
- def get_token_expiry_date(self) -> pendulum.DateTime:
120
+ def get_token_expiry_date(self) -> AirbyteDateTime:
116
121
  return self._token_expiry_date
117
122
 
118
123
  def set_token_expiry_date(self, value: Union[str, int]) -> None:
@@ -276,17 +281,24 @@ class SingleUseRefreshTokenOauth2Authenticator(Oauth2Authenticator):
276
281
  new_refresh_token,
277
282
  )
278
283
 
279
- def get_token_expiry_date(self) -> pendulum.DateTime:
284
+ def get_token_expiry_date(self) -> AirbyteDateTime:
280
285
  expiry_date = dpath.get(
281
286
  self._connector_config, # type: ignore[arg-type]
282
287
  self._token_expiry_date_config_path,
283
288
  default="",
284
289
  )
285
- return pendulum.now().subtract(days=1) if expiry_date == "" else pendulum.parse(expiry_date) # type: ignore[arg-type, return-value, no-untyped-call]
290
+ result = (
291
+ ab_datetime_now() - timedelta(days=1)
292
+ if expiry_date == ""
293
+ else ab_datetime_parse(str(expiry_date))
294
+ )
295
+ if isinstance(result, AirbyteDateTime):
296
+ return result
297
+ raise TypeError("Invalid datetime conversion")
286
298
 
287
299
  def set_token_expiry_date( # type: ignore[override]
288
300
  self,
289
- new_token_expiry_date: pendulum.DateTime,
301
+ new_token_expiry_date: AirbyteDateTime,
290
302
  ) -> None:
291
303
  dpath.new(
292
304
  self._connector_config, # type: ignore[arg-type]
@@ -296,17 +308,17 @@ class SingleUseRefreshTokenOauth2Authenticator(Oauth2Authenticator):
296
308
 
297
309
  def token_has_expired(self) -> bool:
298
310
  """Returns True if the token is expired"""
299
- return pendulum.now("UTC") > self.get_token_expiry_date()
311
+ return ab_datetime_now() > self.get_token_expiry_date()
300
312
 
301
313
  @staticmethod
302
314
  def get_new_token_expiry_date(
303
315
  access_token_expires_in: str,
304
316
  token_expiry_date_format: str | None = None,
305
- ) -> pendulum.DateTime:
317
+ ) -> AirbyteDateTime:
306
318
  if token_expiry_date_format:
307
- return pendulum.from_format(access_token_expires_in, token_expiry_date_format)
319
+ return ab_datetime_parse(access_token_expires_in)
308
320
  else:
309
- return pendulum.now("UTC").add(seconds=int(access_token_expires_in))
321
+ return ab_datetime_now() + timedelta(seconds=int(access_token_expires_in))
310
322
 
311
323
  def get_access_token(self) -> str:
312
324
  """Retrieve new access and refresh token if the access token has expired.
@@ -318,7 +330,7 @@ class SingleUseRefreshTokenOauth2Authenticator(Oauth2Authenticator):
318
330
  new_access_token, access_token_expires_in, new_refresh_token = (
319
331
  self.refresh_access_token()
320
332
  )
321
- new_token_expiry_date: pendulum.DateTime = self.get_new_token_expiry_date(
333
+ new_token_expiry_date: AirbyteDateTime = self.get_new_token_expiry_date(
322
334
  access_token_expires_in, self._token_expiry_date_format
323
335
  )
324
336
  self.access_token = new_access_token
@@ -3,7 +3,6 @@
3
3
  #
4
4
 
5
5
  import logging
6
- from distutils.util import strtobool
7
6
  from enum import Flag, auto
8
7
  from typing import Any, Callable, Dict, Generator, Mapping, Optional, cast
9
8
 
@@ -22,6 +21,28 @@ python_to_json = {v: k for k, v in json_to_python.items()}
22
21
 
23
22
  logger = logging.getLogger("airbyte")
24
23
 
24
+ _TRUTHY_STRINGS = ("y", "yes", "t", "true", "on", "1")
25
+ _FALSEY_STRINGS = ("n", "no", "f", "false", "off", "0")
26
+
27
+
28
+ def _strtobool(value: str, /) -> int:
29
+ """Mimic the behavior of distutils.util.strtobool.
30
+
31
+ From: https://docs.python.org/2/distutils/apiref.html#distutils.util.strtobool
32
+
33
+ > Convert a string representation of truth to true (1) or false (0).
34
+ > True values are y, yes, t, true, on and 1; false values are n, no, f, false, off and 0. Raises
35
+ > `ValueError` if val is anything else.
36
+ """
37
+ normalized_str = value.lower().strip()
38
+ if normalized_str in _TRUTHY_STRINGS:
39
+ return 1
40
+
41
+ if normalized_str in _FALSEY_STRINGS:
42
+ return 0
43
+
44
+ raise ValueError(f"Invalid boolean value: {normalized_str}")
45
+
25
46
 
26
47
  class TransformConfig(Flag):
27
48
  """
@@ -129,7 +150,7 @@ class TypeTransformer:
129
150
  return int(original_item)
130
151
  elif target_type == "boolean":
131
152
  if isinstance(original_item, str):
132
- return strtobool(original_item) == 1
153
+ return _strtobool(original_item) == 1
133
154
  return bool(original_item)
134
155
  elif target_type == "array":
135
156
  item_types = set(subschema.get("items", {}).get("type", set()))