airbyte-cdk 6.27.1__tar.gz → 6.28.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 (358) hide show
  1. airbyte_cdk-6.28.0/LICENSE_SHORT +1 -0
  2. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/PKG-INFO +5 -5
  3. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/cli/source_declarative_manifest/_run.py +3 -3
  4. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/connector_builder/connector_builder_handler.py +2 -2
  5. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/auth/oauth.py +22 -13
  6. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/auth/token_provider.py +4 -5
  7. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/state_converters/datetime_stream_state_converter.py +22 -13
  8. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/core.py +6 -6
  9. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +17 -6
  10. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py +24 -12
  11. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/utils/transform.py +23 -2
  12. airbyte_cdk-6.28.0/airbyte_cdk/utils/datetime_helpers.py +517 -0
  13. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/pyproject.toml +5 -5
  14. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/LICENSE.txt +0 -0
  15. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/README.md +0 -0
  16. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/__init__.py +0 -0
  17. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/cli/__init__.py +0 -0
  18. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/cli/source_declarative_manifest/__init__.py +0 -0
  19. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/cli/source_declarative_manifest/spec.json +0 -0
  20. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/config_observation.py +0 -0
  21. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/connector.py +0 -0
  22. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/connector_builder/README.md +0 -0
  23. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/connector_builder/__init__.py +0 -0
  24. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/connector_builder/main.py +0 -0
  25. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/connector_builder/message_grouper.py +0 -0
  26. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/connector_builder/models.py +0 -0
  27. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/__init__.py +0 -0
  28. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/destination.py +0 -0
  29. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/vector_db_based/README.md +0 -0
  30. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/vector_db_based/__init__.py +0 -0
  31. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/vector_db_based/config.py +0 -0
  32. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/vector_db_based/document_processor.py +0 -0
  33. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/vector_db_based/embedder.py +0 -0
  34. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/vector_db_based/indexer.py +0 -0
  35. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/vector_db_based/test_utils.py +0 -0
  36. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/vector_db_based/utils.py +0 -0
  37. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/destinations/vector_db_based/writer.py +0 -0
  38. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/entrypoint.py +0 -0
  39. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/exception_handler.py +0 -0
  40. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/logger.py +0 -0
  41. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/models/__init__.py +0 -0
  42. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/models/airbyte_protocol.py +0 -0
  43. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/models/airbyte_protocol_serializers.py +0 -0
  44. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/models/file_transfer_record_message.py +0 -0
  45. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/models/well_known_types.py +0 -0
  46. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/py.typed +0 -0
  47. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/__init__.py +0 -0
  48. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/abstract_source.py +0 -0
  49. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/concurrent_source/__init__.py +0 -0
  50. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/concurrent_source/concurrent_read_processor.py +0 -0
  51. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/concurrent_source/concurrent_source.py +0 -0
  52. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/concurrent_source/concurrent_source_adapter.py +0 -0
  53. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/concurrent_source/partition_generation_completed_sentinel.py +0 -0
  54. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/concurrent_source/stream_thread_exception.py +0 -0
  55. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/concurrent_source/thread_pool_manager.py +0 -0
  56. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/config.py +0 -0
  57. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/connector_state_manager.py +0 -0
  58. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/__init__.py +0 -0
  59. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/async_job/__init__.py +0 -0
  60. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/async_job/job.py +0 -0
  61. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/async_job/job_orchestrator.py +0 -0
  62. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/async_job/job_tracker.py +0 -0
  63. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/async_job/repository.py +0 -0
  64. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/async_job/status.py +0 -0
  65. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/async_job/timer.py +0 -0
  66. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/auth/__init__.py +0 -0
  67. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/auth/declarative_authenticator.py +0 -0
  68. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/auth/jwt.py +0 -0
  69. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/auth/selective_authenticator.py +0 -0
  70. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/auth/token.py +0 -0
  71. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/checks/__init__.py +0 -0
  72. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/checks/check_dynamic_stream.py +0 -0
  73. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/checks/check_stream.py +0 -0
  74. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/checks/connection_checker.py +0 -0
  75. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/concurrency_level/__init__.py +0 -0
  76. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/concurrency_level/concurrency_level.py +0 -0
  77. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/concurrent_declarative_source.py +0 -0
  78. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/datetime/__init__.py +0 -0
  79. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/datetime/datetime_parser.py +0 -0
  80. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/datetime/min_max_datetime.py +0 -0
  81. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/declarative_component_schema.yaml +0 -0
  82. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/declarative_source.py +0 -0
  83. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/declarative_stream.py +0 -0
  84. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/decoders/__init__.py +0 -0
  85. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/decoders/composite_raw_decoder.py +0 -0
  86. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/decoders/decoder.py +0 -0
  87. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/decoders/json_decoder.py +0 -0
  88. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/decoders/noop_decoder.py +0 -0
  89. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/decoders/pagination_decoder_decorator.py +0 -0
  90. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/decoders/xml_decoder.py +0 -0
  91. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/decoders/zipfile_decoder.py +0 -0
  92. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/exceptions.py +0 -0
  93. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/extractors/__init__.py +0 -0
  94. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/extractors/dpath_extractor.py +0 -0
  95. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/extractors/http_selector.py +0 -0
  96. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/extractors/record_extractor.py +0 -0
  97. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/extractors/record_filter.py +0 -0
  98. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/extractors/record_selector.py +0 -0
  99. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/extractors/response_to_file_extractor.py +0 -0
  100. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/extractors/type_transformer.py +0 -0
  101. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/incremental/__init__.py +0 -0
  102. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/incremental/concurrent_partition_cursor.py +0 -0
  103. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +0 -0
  104. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/incremental/declarative_cursor.py +0 -0
  105. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/incremental/global_substream_cursor.py +0 -0
  106. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py +0 -0
  107. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/incremental/per_partition_with_global.py +0 -0
  108. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/incremental/resumable_full_refresh_cursor.py +0 -0
  109. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/interpolation/__init__.py +0 -0
  110. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/interpolation/filters.py +0 -0
  111. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_boolean.py +0 -0
  112. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_mapping.py +0 -0
  113. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_nested_mapping.py +0 -0
  114. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_string.py +0 -0
  115. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/interpolation/interpolation.py +0 -0
  116. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/interpolation/jinja.py +0 -0
  117. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/interpolation/macros.py +0 -0
  118. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/manifest_declarative_source.py +0 -0
  119. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/migrations/__init__.py +0 -0
  120. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migration.py +0 -0
  121. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/migrations/state_migration.py +0 -0
  122. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/models/__init__.py +0 -0
  123. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/models/declarative_component_schema.py +0 -0
  124. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/parsers/__init__.py +0 -0
  125. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/parsers/custom_code_compiler.py +0 -0
  126. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/parsers/custom_exceptions.py +0 -0
  127. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py +0 -0
  128. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py +0 -0
  129. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +0 -0
  130. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/partition_routers/__init__.py +0 -0
  131. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py +0 -0
  132. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py +0 -0
  133. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py +0 -0
  134. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/partition_routers/partition_router.py +0 -0
  135. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/partition_routers/single_partition_router.py +0 -0
  136. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +0 -0
  137. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/README.md +0 -0
  138. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/__init__.py +0 -0
  139. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/__init__.py +0 -0
  140. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +0 -0
  141. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/constant_backoff_strategy.py +0 -0
  142. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/exponential_backoff_strategy.py +0 -0
  143. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/header_helper.py +0 -0
  144. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_time_from_header_backoff_strategy.py +0 -0
  145. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_until_time_from_header_backoff_strategy.py +0 -0
  146. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategy.py +0 -0
  147. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/composite_error_handler.py +0 -0
  148. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_error_handler.py +0 -0
  149. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_http_response_filter.py +0 -0
  150. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/error_handler.py +0 -0
  151. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/http_response_filter.py +0 -0
  152. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/http_job_repository.py +0 -0
  153. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/http_requester.py +0 -0
  154. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/__init__.py +0 -0
  155. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +0 -0
  156. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/no_pagination.py +0 -0
  157. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/paginator.py +0 -0
  158. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/__init__.py +0 -0
  159. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/cursor_pagination_strategy.py +0 -0
  160. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py +0 -0
  161. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/page_increment.py +0 -0
  162. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/pagination_strategy.py +0 -0
  163. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/stop_condition.py +0 -0
  164. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/request_option.py +0 -0
  165. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/request_options/__init__.py +0 -0
  166. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/request_options/datetime_based_request_options_provider.py +0 -0
  167. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/request_options/default_request_options_provider.py +0 -0
  168. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_nested_request_input_provider.py +0 -0
  169. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_input_provider.py +0 -0
  170. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_options_provider.py +0 -0
  171. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/request_options/request_options_provider.py +0 -0
  172. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/request_path.py +0 -0
  173. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/requesters/requester.py +0 -0
  174. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/resolvers/__init__.py +0 -0
  175. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/resolvers/components_resolver.py +0 -0
  176. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/resolvers/config_components_resolver.py +0 -0
  177. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/resolvers/http_components_resolver.py +0 -0
  178. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/retrievers/__init__.py +0 -0
  179. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/retrievers/async_retriever.py +0 -0
  180. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/retrievers/retriever.py +0 -0
  181. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +0 -0
  182. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/schema/__init__.py +0 -0
  183. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/schema/default_schema_loader.py +0 -0
  184. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/schema/dynamic_schema_loader.py +0 -0
  185. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/schema/inline_schema_loader.py +0 -0
  186. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/schema/json_file_schema_loader.py +0 -0
  187. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/schema/schema_loader.py +0 -0
  188. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/spec/__init__.py +0 -0
  189. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/spec/spec.py +0 -0
  190. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/stream_slicers/__init__.py +0 -0
  191. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/stream_slicers/declarative_partition_generator.py +0 -0
  192. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/stream_slicers/stream_slicer.py +0 -0
  193. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/transformations/__init__.py +0 -0
  194. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/transformations/add_fields.py +0 -0
  195. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/transformations/dpath_flatten_fields.py +0 -0
  196. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/transformations/flatten_fields.py +0 -0
  197. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/transformations/keys_replace_transformation.py +0 -0
  198. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/transformations/keys_to_lower_transformation.py +0 -0
  199. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/transformations/keys_to_snake_transformation.py +0 -0
  200. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/transformations/remove_fields.py +0 -0
  201. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/transformations/transformation.py +0 -0
  202. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/types.py +0 -0
  203. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/declarative/yaml_declarative_source.py +0 -0
  204. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/embedded/__init__.py +0 -0
  205. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/embedded/base_integration.py +0 -0
  206. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/embedded/catalog.py +0 -0
  207. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/embedded/runner.py +0 -0
  208. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/embedded/tools.py +0 -0
  209. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/README.md +0 -0
  210. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/__init__.py +0 -0
  211. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/availability_strategy/__init__.py +0 -0
  212. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/availability_strategy/abstract_file_based_availability_strategy.py +0 -0
  213. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/availability_strategy/default_file_based_availability_strategy.py +0 -0
  214. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/config/__init__.py +0 -0
  215. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py +0 -0
  216. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/config/avro_format.py +0 -0
  217. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/config/csv_format.py +0 -0
  218. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/config/excel_format.py +0 -0
  219. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/config/file_based_stream_config.py +0 -0
  220. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/config/jsonl_format.py +0 -0
  221. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/config/parquet_format.py +0 -0
  222. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/config/unstructured_format.py +0 -0
  223. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/discovery_policy/__init__.py +0 -0
  224. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/discovery_policy/abstract_discovery_policy.py +0 -0
  225. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/discovery_policy/default_discovery_policy.py +0 -0
  226. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/exceptions.py +0 -0
  227. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_based_source.py +0 -0
  228. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_based_stream_reader.py +0 -0
  229. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_types/__init__.py +0 -0
  230. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_types/avro_parser.py +0 -0
  231. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_types/csv_parser.py +0 -0
  232. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_types/excel_parser.py +0 -0
  233. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_types/file_transfer.py +0 -0
  234. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_types/file_type_parser.py +0 -0
  235. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_types/jsonl_parser.py +0 -0
  236. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_types/parquet_parser.py +0 -0
  237. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/file_types/unstructured_parser.py +0 -0
  238. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/remote_file.py +0 -0
  239. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/schema_helpers.py +0 -0
  240. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/schema_validation_policies/__init__.py +0 -0
  241. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/schema_validation_policies/abstract_schema_validation_policy.py +0 -0
  242. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/schema_validation_policies/default_schema_validation_policies.py +0 -0
  243. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/__init__.py +0 -0
  244. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/abstract_file_based_stream.py +0 -0
  245. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/concurrent/__init__.py +0 -0
  246. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/concurrent/adapters.py +0 -0
  247. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/__init__.py +0 -0
  248. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/abstract_concurrent_file_based_cursor.py +0 -0
  249. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_concurrent_cursor.py +0 -0
  250. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_final_state_cursor.py +0 -0
  251. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/cursor/__init__.py +0 -0
  252. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/cursor/abstract_file_based_cursor.py +0 -0
  253. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/cursor/default_file_based_cursor.py +0 -0
  254. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/stream/default_file_based_stream.py +0 -0
  255. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/file_based/types.py +0 -0
  256. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/http_config.py +0 -0
  257. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/http_logger.py +0 -0
  258. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/message/__init__.py +0 -0
  259. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/message/repository.py +0 -0
  260. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/source.py +0 -0
  261. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/__init__.py +0 -0
  262. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/availability_strategy.py +0 -0
  263. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/call_rate.py +0 -0
  264. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/checkpoint/__init__.py +0 -0
  265. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/checkpoint/checkpoint_reader.py +0 -0
  266. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/checkpoint/cursor.py +0 -0
  267. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/checkpoint/per_partition_key_serializer.py +0 -0
  268. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/checkpoint/resumable_full_refresh_cursor.py +0 -0
  269. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/checkpoint/substream_resumable_full_refresh_cursor.py +0 -0
  270. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/README.md +0 -0
  271. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/__init__.py +0 -0
  272. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/abstract_stream.py +0 -0
  273. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/abstract_stream_facade.py +0 -0
  274. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/adapters.py +0 -0
  275. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/availability_strategy.py +0 -0
  276. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/clamping.py +0 -0
  277. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/cursor.py +0 -0
  278. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/cursor_types.py +0 -0
  279. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/default_stream.py +0 -0
  280. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/exceptions.py +0 -0
  281. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/helpers.py +0 -0
  282. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/partition_enqueuer.py +0 -0
  283. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/partition_reader.py +0 -0
  284. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/partitions/__init__.py +0 -0
  285. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/partitions/partition.py +0 -0
  286. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/partitions/partition_generator.py +0 -0
  287. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/partitions/stream_slicer.py +0 -0
  288. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/partitions/types.py +0 -0
  289. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/state_converters/__init__.py +0 -0
  290. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/concurrent/state_converters/abstract_stream_state_converter.py +0 -0
  291. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/__init__.py +0 -0
  292. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/availability_strategy.py +0 -0
  293. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/error_handlers/__init__.py +0 -0
  294. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/error_handlers/backoff_strategy.py +0 -0
  295. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/error_handlers/default_backoff_strategy.py +0 -0
  296. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/error_handlers/default_error_mapping.py +0 -0
  297. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/error_handlers/error_handler.py +0 -0
  298. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/error_handlers/error_message_parser.py +0 -0
  299. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/error_handlers/http_status_error_handler.py +0 -0
  300. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/error_handlers/json_error_message_parser.py +0 -0
  301. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/error_handlers/response_models.py +0 -0
  302. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/exceptions.py +0 -0
  303. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/http.py +0 -0
  304. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/http_client.py +0 -0
  305. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/rate_limiting.py +0 -0
  306. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/requests_native_auth/__init__.py +0 -0
  307. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_token.py +0 -0
  308. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/http/requests_native_auth/token.py +0 -0
  309. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/streams/utils/__init__.py +0 -0
  310. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/types.py +0 -0
  311. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/utils/__init__.py +0 -0
  312. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/utils/casing.py +0 -0
  313. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/utils/record_helper.py +0 -0
  314. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/utils/schema_helpers.py +0 -0
  315. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/utils/slice_logger.py +0 -0
  316. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sources/utils/types.py +0 -0
  317. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/__init__.py +0 -0
  318. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/_util/__init__.py +0 -0
  319. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/_util/hashing.py +0 -0
  320. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/_util/name_normalizers.py +0 -0
  321. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/constants.py +0 -0
  322. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/exceptions.py +0 -0
  323. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/secrets.py +0 -0
  324. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/shared/__init__.py +0 -0
  325. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/shared/catalog_providers.py +0 -0
  326. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/shared/sql_processor.py +0 -0
  327. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/sql/types.py +0 -0
  328. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/__init__.py +0 -0
  329. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/catalog_builder.py +0 -0
  330. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/entrypoint_wrapper.py +0 -0
  331. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/mock_http/__init__.py +0 -0
  332. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/mock_http/matcher.py +0 -0
  333. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/mock_http/mocker.py +0 -0
  334. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/mock_http/request.py +0 -0
  335. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/mock_http/response.py +0 -0
  336. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/mock_http/response_builder.py +0 -0
  337. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/state_builder.py +0 -0
  338. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/utils/__init__.py +0 -0
  339. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/utils/data.py +0 -0
  340. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/utils/http_mocking.py +0 -0
  341. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/utils/manifest_only_fixtures.py +0 -0
  342. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/test/utils/reading.py +0 -0
  343. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/__init__.py +0 -0
  344. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/airbyte_secrets_utils.py +0 -0
  345. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/analytics_message.py +0 -0
  346. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/constants.py +0 -0
  347. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/datetime_format_inferrer.py +0 -0
  348. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/event_timing.py +0 -0
  349. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/is_cloud_environment.py +0 -0
  350. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/mapping_helpers.py +0 -0
  351. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/message_utils.py +0 -0
  352. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/oneof_option_config.py +0 -0
  353. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/print_buffer.py +0 -0
  354. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/schema_inferrer.py +0 -0
  355. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/slice_hasher.py +0 -0
  356. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/spec_schema_transformations.py +0 -0
  357. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/stream_status_utils.py +0 -0
  358. {airbyte_cdk-6.27.1 → airbyte_cdk-6.28.0}/airbyte_cdk/utils/traced_exception.py +0 -0
@@ -0,0 +1 @@
1
+ Copyright (c) 2025 Airbyte, Inc., all rights reserved.
@@ -1,7 +1,8 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.1
2
2
  Name: airbyte-cdk
3
- Version: 6.27.1
3
+ Version: 6.28.0
4
4
  Summary: A framework for writing Airbyte Connectors.
5
+ Home-page: https://airbyte.com
5
6
  License: MIT
6
7
  Keywords: airbyte,connector-development-kit,cdk
7
8
  Author: Airbyte
@@ -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,9 +66,9 @@ 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
- Project-URL: Homepage, https://airbyte.com
72
72
  Project-URL: Repository, https://github.com/airbytehq/airbyte-python-cdk
73
73
  Description-Content-Type: text/markdown
74
74
 
@@ -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
 
@@ -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__(
@@ -223,17 +223,17 @@ class Stream(ABC):
223
223
  record_counter += 1
224
224
 
225
225
  checkpoint_interval = self.state_checkpoint_interval
226
- checkpoint = checkpoint_reader.get_checkpoint()
227
226
  if (
228
227
  should_checkpoint
229
228
  and checkpoint_interval
230
229
  and record_counter % checkpoint_interval == 0
231
- and checkpoint is not None
232
230
  ):
233
- airbyte_state_message = self._checkpoint_state(
234
- checkpoint, state_manager=state_manager
235
- )
236
- yield airbyte_state_message
231
+ checkpoint = checkpoint_reader.get_checkpoint()
232
+ if checkpoint:
233
+ airbyte_state_message = self._checkpoint_state(
234
+ checkpoint, state_manager=state_manager
235
+ )
236
+ yield airbyte_state_message
237
237
 
238
238
  if internal_config.is_limit_reached(record_counter):
239
239
  break
@@ -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()))