airbyte-cdk 6.12.4__tar.gz → 6.12.4.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 (346) hide show
  1. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/PKG-INFO +2 -2
  2. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/auth/oauth.py +12 -27
  3. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/concurrent_declarative_source.py +57 -0
  4. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/declarative_component_schema.yaml +1 -23
  5. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/extractors/record_filter.py +3 -5
  6. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/incremental/__init__.py +3 -0
  7. airbyte_cdk-6.12.4.dev0/airbyte_cdk/sources/declarative/incremental/concurrent_partition_cursor.py +344 -0
  8. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py +14 -0
  9. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/models/declarative_component_schema.py +2 -25
  10. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +80 -53
  11. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/partition_routers/__init__.py +1 -9
  12. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/resolvers/http_components_resolver.py +14 -20
  13. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/retrievers/async_retriever.py +31 -8
  14. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +1 -1
  15. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/schema/dynamic_schema_loader.py +3 -20
  16. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/cursor.py +1 -0
  17. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +3 -8
  18. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/pyproject.toml +2 -2
  19. airbyte_cdk-6.12.4/airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py +0 -65
  20. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/LICENSE.txt +0 -0
  21. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/README.md +0 -0
  22. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/__init__.py +0 -0
  23. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/cli/__init__.py +0 -0
  24. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/cli/source_declarative_manifest/__init__.py +0 -0
  25. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/cli/source_declarative_manifest/_run.py +0 -0
  26. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/cli/source_declarative_manifest/spec.json +0 -0
  27. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/config_observation.py +0 -0
  28. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/connector.py +0 -0
  29. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/connector_builder/README.md +0 -0
  30. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/connector_builder/__init__.py +0 -0
  31. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/connector_builder/connector_builder_handler.py +0 -0
  32. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/connector_builder/main.py +0 -0
  33. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/connector_builder/message_grouper.py +0 -0
  34. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/connector_builder/models.py +0 -0
  35. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/destinations/__init__.py +0 -0
  36. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/destinations/destination.py +0 -0
  37. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/destinations/vector_db_based/README.md +0 -0
  38. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/destinations/vector_db_based/__init__.py +0 -0
  39. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/destinations/vector_db_based/config.py +0 -0
  40. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/destinations/vector_db_based/document_processor.py +0 -0
  41. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/destinations/vector_db_based/embedder.py +0 -0
  42. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/destinations/vector_db_based/indexer.py +0 -0
  43. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/destinations/vector_db_based/test_utils.py +0 -0
  44. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/destinations/vector_db_based/utils.py +0 -0
  45. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/destinations/vector_db_based/writer.py +0 -0
  46. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/entrypoint.py +0 -0
  47. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/exception_handler.py +0 -0
  48. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/logger.py +0 -0
  49. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/models/__init__.py +0 -0
  50. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/models/airbyte_protocol.py +0 -0
  51. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/models/airbyte_protocol_serializers.py +0 -0
  52. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/models/file_transfer_record_message.py +0 -0
  53. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/models/well_known_types.py +0 -0
  54. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/py.typed +0 -0
  55. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/__init__.py +0 -0
  56. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/abstract_source.py +0 -0
  57. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/concurrent_source/__init__.py +0 -0
  58. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/concurrent_source/concurrent_read_processor.py +0 -0
  59. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/concurrent_source/concurrent_source.py +0 -0
  60. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/concurrent_source/concurrent_source_adapter.py +0 -0
  61. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/concurrent_source/partition_generation_completed_sentinel.py +0 -0
  62. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/concurrent_source/stream_thread_exception.py +0 -0
  63. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/concurrent_source/thread_pool_manager.py +0 -0
  64. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/config.py +0 -0
  65. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/connector_state_manager.py +0 -0
  66. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/__init__.py +0 -0
  67. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/async_job/__init__.py +0 -0
  68. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/async_job/job.py +0 -0
  69. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/async_job/job_orchestrator.py +0 -0
  70. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/async_job/job_tracker.py +0 -0
  71. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/async_job/repository.py +0 -0
  72. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/async_job/status.py +0 -0
  73. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/async_job/timer.py +0 -0
  74. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/auth/__init__.py +0 -0
  75. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/auth/declarative_authenticator.py +0 -0
  76. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/auth/jwt.py +0 -0
  77. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/auth/selective_authenticator.py +0 -0
  78. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/auth/token.py +0 -0
  79. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/auth/token_provider.py +0 -0
  80. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/checks/__init__.py +0 -0
  81. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/checks/check_stream.py +0 -0
  82. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/checks/connection_checker.py +0 -0
  83. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/concurrency_level/__init__.py +0 -0
  84. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/concurrency_level/concurrency_level.py +0 -0
  85. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/datetime/__init__.py +0 -0
  86. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/datetime/datetime_parser.py +0 -0
  87. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/datetime/min_max_datetime.py +0 -0
  88. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/declarative_source.py +0 -0
  89. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/declarative_stream.py +0 -0
  90. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/decoders/__init__.py +0 -0
  91. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/decoders/decoder.py +0 -0
  92. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/decoders/json_decoder.py +0 -0
  93. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/decoders/noop_decoder.py +0 -0
  94. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/decoders/pagination_decoder_decorator.py +0 -0
  95. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/decoders/xml_decoder.py +0 -0
  96. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/exceptions.py +0 -0
  97. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/extractors/__init__.py +0 -0
  98. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/extractors/dpath_extractor.py +0 -0
  99. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/extractors/http_selector.py +0 -0
  100. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/extractors/record_extractor.py +0 -0
  101. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/extractors/record_selector.py +0 -0
  102. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/extractors/response_to_file_extractor.py +0 -0
  103. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +0 -0
  104. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/incremental/declarative_cursor.py +0 -0
  105. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/incremental/global_substream_cursor.py +0 -0
  106. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/incremental/per_partition_with_global.py +0 -0
  107. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/incremental/resumable_full_refresh_cursor.py +0 -0
  108. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/interpolation/__init__.py +0 -0
  109. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/interpolation/filters.py +0 -0
  110. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/interpolation/interpolated_boolean.py +0 -0
  111. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/interpolation/interpolated_mapping.py +0 -0
  112. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/interpolation/interpolated_nested_mapping.py +0 -0
  113. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/interpolation/interpolated_string.py +0 -0
  114. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/interpolation/interpolation.py +0 -0
  115. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/interpolation/jinja.py +0 -0
  116. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/interpolation/macros.py +0 -0
  117. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/manifest_declarative_source.py +0 -0
  118. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/migrations/__init__.py +0 -0
  119. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migration.py +0 -0
  120. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/migrations/state_migration.py +0 -0
  121. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/models/__init__.py +0 -0
  122. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/parsers/__init__.py +0 -0
  123. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/parsers/custom_exceptions.py +0 -0
  124. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py +0 -0
  125. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py +0 -0
  126. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py +0 -0
  127. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py +0 -0
  128. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/partition_routers/partition_router.py +0 -0
  129. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/partition_routers/single_partition_router.py +0 -0
  130. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +0 -0
  131. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/__init__.py +0 -0
  132. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/__init__.py +0 -0
  133. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +0 -0
  134. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/constant_backoff_strategy.py +0 -0
  135. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/exponential_backoff_strategy.py +0 -0
  136. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/header_helper.py +0 -0
  137. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_time_from_header_backoff_strategy.py +0 -0
  138. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_until_time_from_header_backoff_strategy.py +0 -0
  139. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategy.py +0 -0
  140. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/composite_error_handler.py +0 -0
  141. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_error_handler.py +0 -0
  142. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_http_response_filter.py +0 -0
  143. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/error_handler.py +0 -0
  144. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/error_handlers/http_response_filter.py +0 -0
  145. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/http_job_repository.py +0 -0
  146. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/http_requester.py +0 -0
  147. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/__init__.py +0 -0
  148. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +0 -0
  149. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/no_pagination.py +0 -0
  150. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/paginator.py +0 -0
  151. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/__init__.py +0 -0
  152. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/cursor_pagination_strategy.py +0 -0
  153. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py +0 -0
  154. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/page_increment.py +0 -0
  155. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/pagination_strategy.py +0 -0
  156. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/stop_condition.py +0 -0
  157. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/request_option.py +0 -0
  158. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/request_options/__init__.py +0 -0
  159. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/request_options/datetime_based_request_options_provider.py +0 -0
  160. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/request_options/default_request_options_provider.py +0 -0
  161. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_nested_request_input_provider.py +0 -0
  162. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_input_provider.py +0 -0
  163. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_options_provider.py +0 -0
  164. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/request_options/request_options_provider.py +0 -0
  165. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/request_path.py +0 -0
  166. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/requesters/requester.py +0 -0
  167. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/resolvers/__init__.py +0 -0
  168. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/resolvers/components_resolver.py +0 -0
  169. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/resolvers/config_components_resolver.py +0 -0
  170. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/retrievers/__init__.py +0 -0
  171. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/retrievers/retriever.py +0 -0
  172. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/schema/__init__.py +0 -0
  173. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/schema/default_schema_loader.py +0 -0
  174. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/schema/inline_schema_loader.py +0 -0
  175. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/schema/json_file_schema_loader.py +0 -0
  176. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/schema/schema_loader.py +0 -0
  177. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/spec/__init__.py +0 -0
  178. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/spec/spec.py +0 -0
  179. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/stream_slicers/__init__.py +0 -0
  180. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/stream_slicers/declarative_partition_generator.py +0 -0
  181. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/stream_slicers/stream_slicer.py +0 -0
  182. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/transformations/__init__.py +0 -0
  183. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/transformations/add_fields.py +0 -0
  184. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/transformations/flatten_fields.py +0 -0
  185. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/transformations/keys_to_lower_transformation.py +0 -0
  186. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/transformations/keys_to_snake_transformation.py +0 -0
  187. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/transformations/remove_fields.py +0 -0
  188. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/transformations/transformation.py +0 -0
  189. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/types.py +0 -0
  190. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/declarative/yaml_declarative_source.py +0 -0
  191. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/embedded/__init__.py +0 -0
  192. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/embedded/base_integration.py +0 -0
  193. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/embedded/catalog.py +0 -0
  194. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/embedded/runner.py +0 -0
  195. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/embedded/tools.py +0 -0
  196. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/README.md +0 -0
  197. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/__init__.py +0 -0
  198. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/availability_strategy/__init__.py +0 -0
  199. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/availability_strategy/abstract_file_based_availability_strategy.py +0 -0
  200. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/availability_strategy/default_file_based_availability_strategy.py +0 -0
  201. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/config/__init__.py +0 -0
  202. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py +0 -0
  203. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/config/avro_format.py +0 -0
  204. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/config/csv_format.py +0 -0
  205. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/config/excel_format.py +0 -0
  206. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/config/file_based_stream_config.py +0 -0
  207. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/config/jsonl_format.py +0 -0
  208. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/config/parquet_format.py +0 -0
  209. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/config/unstructured_format.py +0 -0
  210. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/discovery_policy/__init__.py +0 -0
  211. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/discovery_policy/abstract_discovery_policy.py +0 -0
  212. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/discovery_policy/default_discovery_policy.py +0 -0
  213. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/exceptions.py +0 -0
  214. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/file_based_source.py +0 -0
  215. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/file_based_stream_reader.py +0 -0
  216. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/file_types/__init__.py +0 -0
  217. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/file_types/avro_parser.py +0 -0
  218. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/file_types/csv_parser.py +0 -0
  219. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/file_types/excel_parser.py +0 -0
  220. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/file_types/file_transfer.py +0 -0
  221. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/file_types/file_type_parser.py +0 -0
  222. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/file_types/jsonl_parser.py +0 -0
  223. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/file_types/parquet_parser.py +0 -0
  224. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/file_types/unstructured_parser.py +0 -0
  225. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/remote_file.py +0 -0
  226. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/schema_helpers.py +0 -0
  227. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/schema_validation_policies/__init__.py +0 -0
  228. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/schema_validation_policies/abstract_schema_validation_policy.py +0 -0
  229. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/schema_validation_policies/default_schema_validation_policies.py +0 -0
  230. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/stream/__init__.py +0 -0
  231. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/stream/abstract_file_based_stream.py +0 -0
  232. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/stream/concurrent/__init__.py +0 -0
  233. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/stream/concurrent/adapters.py +0 -0
  234. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/__init__.py +0 -0
  235. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/abstract_concurrent_file_based_cursor.py +0 -0
  236. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_concurrent_cursor.py +0 -0
  237. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_final_state_cursor.py +0 -0
  238. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/stream/cursor/__init__.py +0 -0
  239. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/stream/cursor/abstract_file_based_cursor.py +0 -0
  240. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/stream/cursor/default_file_based_cursor.py +0 -0
  241. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/stream/default_file_based_stream.py +0 -0
  242. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/file_based/types.py +0 -0
  243. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/http_config.py +0 -0
  244. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/http_logger.py +0 -0
  245. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/message/__init__.py +0 -0
  246. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/message/repository.py +0 -0
  247. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/source.py +0 -0
  248. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/__init__.py +0 -0
  249. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/availability_strategy.py +0 -0
  250. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/call_rate.py +0 -0
  251. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/checkpoint/__init__.py +0 -0
  252. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/checkpoint/checkpoint_reader.py +0 -0
  253. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/checkpoint/cursor.py +0 -0
  254. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/checkpoint/per_partition_key_serializer.py +0 -0
  255. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/checkpoint/resumable_full_refresh_cursor.py +0 -0
  256. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/checkpoint/substream_resumable_full_refresh_cursor.py +0 -0
  257. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/README.md +0 -0
  258. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/__init__.py +0 -0
  259. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/abstract_stream.py +0 -0
  260. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/abstract_stream_facade.py +0 -0
  261. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/adapters.py +0 -0
  262. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/availability_strategy.py +0 -0
  263. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/default_stream.py +0 -0
  264. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/exceptions.py +0 -0
  265. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/helpers.py +0 -0
  266. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/partition_enqueuer.py +0 -0
  267. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/partition_reader.py +0 -0
  268. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/partitions/__init__.py +0 -0
  269. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/partitions/partition.py +0 -0
  270. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/partitions/partition_generator.py +0 -0
  271. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/partitions/stream_slicer.py +0 -0
  272. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/partitions/types.py +0 -0
  273. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/state_converters/__init__.py +0 -0
  274. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/state_converters/abstract_stream_state_converter.py +0 -0
  275. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/concurrent/state_converters/datetime_stream_state_converter.py +0 -0
  276. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/core.py +0 -0
  277. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/__init__.py +0 -0
  278. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/availability_strategy.py +0 -0
  279. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/error_handlers/__init__.py +0 -0
  280. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/error_handlers/backoff_strategy.py +0 -0
  281. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/error_handlers/default_backoff_strategy.py +0 -0
  282. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/error_handlers/default_error_mapping.py +0 -0
  283. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/error_handlers/error_handler.py +0 -0
  284. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/error_handlers/error_message_parser.py +0 -0
  285. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/error_handlers/http_status_error_handler.py +0 -0
  286. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/error_handlers/json_error_message_parser.py +0 -0
  287. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/error_handlers/response_models.py +0 -0
  288. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/exceptions.py +0 -0
  289. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/http.py +0 -0
  290. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/http_client.py +0 -0
  291. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/rate_limiting.py +0 -0
  292. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/requests_native_auth/__init__.py +0 -0
  293. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_token.py +0 -0
  294. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py +0 -0
  295. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/http/requests_native_auth/token.py +0 -0
  296. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/streams/utils/__init__.py +0 -0
  297. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/types.py +0 -0
  298. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/utils/__init__.py +0 -0
  299. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/utils/casing.py +0 -0
  300. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/utils/record_helper.py +0 -0
  301. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/utils/schema_helpers.py +0 -0
  302. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/utils/slice_logger.py +0 -0
  303. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/utils/transform.py +0 -0
  304. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sources/utils/types.py +0 -0
  305. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sql/__init__.py +0 -0
  306. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sql/_util/__init__.py +0 -0
  307. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sql/_util/hashing.py +0 -0
  308. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sql/_util/name_normalizers.py +0 -0
  309. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sql/constants.py +0 -0
  310. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sql/exceptions.py +0 -0
  311. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sql/secrets.py +0 -0
  312. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sql/shared/__init__.py +0 -0
  313. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sql/shared/catalog_providers.py +0 -0
  314. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sql/shared/sql_processor.py +0 -0
  315. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/sql/types.py +0 -0
  316. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/test/__init__.py +0 -0
  317. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/test/catalog_builder.py +0 -0
  318. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/test/entrypoint_wrapper.py +0 -0
  319. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/test/mock_http/__init__.py +0 -0
  320. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/test/mock_http/matcher.py +0 -0
  321. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/test/mock_http/mocker.py +0 -0
  322. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/test/mock_http/request.py +0 -0
  323. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/test/mock_http/response.py +0 -0
  324. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/test/mock_http/response_builder.py +0 -0
  325. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/test/state_builder.py +0 -0
  326. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/test/utils/__init__.py +0 -0
  327. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/test/utils/data.py +0 -0
  328. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/test/utils/http_mocking.py +0 -0
  329. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/test/utils/manifest_only_fixtures.py +0 -0
  330. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/test/utils/reading.py +0 -0
  331. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/utils/__init__.py +0 -0
  332. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/utils/airbyte_secrets_utils.py +0 -0
  333. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/utils/analytics_message.py +0 -0
  334. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/utils/constants.py +0 -0
  335. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/utils/datetime_format_inferrer.py +0 -0
  336. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/utils/event_timing.py +0 -0
  337. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/utils/is_cloud_environment.py +0 -0
  338. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/utils/mapping_helpers.py +0 -0
  339. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/utils/message_utils.py +0 -0
  340. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/utils/oneof_option_config.py +0 -0
  341. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/utils/print_buffer.py +0 -0
  342. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/utils/schema_inferrer.py +0 -0
  343. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/utils/slice_hasher.py +0 -0
  344. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/utils/spec_schema_transformations.py +0 -0
  345. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/utils/stream_status_utils.py +0 -0
  346. {airbyte_cdk-6.12.4 → airbyte_cdk-6.12.4.dev0}/airbyte_cdk/utils/traced_exception.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-cdk
3
- Version: 6.12.4
3
+ Version: 6.12.4.dev0
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://airbyte.com
6
6
  License: MIT
@@ -57,7 +57,7 @@ Requires-Dist: python-calamine (==0.2.3) ; extra == "file-based"
57
57
  Requires-Dist: python-dateutil
58
58
  Requires-Dist: python-snappy (==0.7.3) ; extra == "file-based"
59
59
  Requires-Dist: python-ulid (>=3.0.0,<4.0.0)
60
- Requires-Dist: pytz (==2024.2)
60
+ Requires-Dist: pytz (==2024.1)
61
61
  Requires-Dist: rapidfuzz (>=3.10.1,<4.0.0)
62
62
  Requires-Dist: requests
63
63
  Requires-Dist: requests_cache
@@ -43,11 +43,11 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
43
43
  message_repository (MessageRepository): the message repository used to emit logs on HTTP requests
44
44
  """
45
45
 
46
+ token_refresh_endpoint: Union[InterpolatedString, str]
46
47
  client_id: Union[InterpolatedString, str]
47
48
  client_secret: Union[InterpolatedString, str]
48
49
  config: Mapping[str, Any]
49
50
  parameters: InitVar[Mapping[str, Any]]
50
- token_refresh_endpoint: Optional[Union[InterpolatedString, str]] = None
51
51
  refresh_token: Optional[Union[InterpolatedString, str]] = None
52
52
  scopes: Optional[List[str]] = None
53
53
  token_expiry_date: Optional[Union[InterpolatedString, str]] = None
@@ -55,7 +55,6 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
55
55
  token_expiry_date_format: Optional[str] = None
56
56
  token_expiry_is_time_of_expiration: bool = False
57
57
  access_token_name: Union[InterpolatedString, str] = "access_token"
58
- access_token_value: Optional[Union[InterpolatedString, str]] = None
59
58
  expires_in_name: Union[InterpolatedString, str] = "expires_in"
60
59
  refresh_request_body: Optional[Mapping[str, Any]] = None
61
60
  grant_type: Union[InterpolatedString, str] = "refresh_token"
@@ -63,12 +62,9 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
63
62
 
64
63
  def __post_init__(self, parameters: Mapping[str, Any]) -> None:
65
64
  super().__init__()
66
- if self.token_refresh_endpoint is not None:
67
- self._token_refresh_endpoint: Optional[InterpolatedString] = InterpolatedString.create(
68
- self.token_refresh_endpoint, parameters=parameters
69
- )
70
- else:
71
- self._token_refresh_endpoint = None
65
+ self._token_refresh_endpoint = InterpolatedString.create(
66
+ self.token_refresh_endpoint, parameters=parameters
67
+ )
72
68
  self._client_id = InterpolatedString.create(self.client_id, parameters=parameters)
73
69
  self._client_secret = InterpolatedString.create(self.client_secret, parameters=parameters)
74
70
  if self.refresh_token is not None:
@@ -96,31 +92,20 @@ class DeclarativeOauth2Authenticator(AbstractOauth2Authenticator, DeclarativeAut
96
92
  if self.token_expiry_date
97
93
  else pendulum.now().subtract(days=1) # type: ignore # substract does not have type hints
98
94
  )
99
- if self.access_token_value is not None:
100
- self._access_token_value = InterpolatedString.create(
101
- self.access_token_value, parameters=parameters
102
- ).eval(self.config)
103
- else:
104
- self._access_token_value = None
105
-
106
- self._access_token: Optional[str] = (
107
- self._access_token_value if self.access_token_value else None
108
- )
95
+ self._access_token: Optional[str] = None # access_token is initialized by a setter
109
96
 
110
97
  if self.get_grant_type() == "refresh_token" and self._refresh_token is None:
111
98
  raise ValueError(
112
99
  "OAuthAuthenticator needs a refresh_token parameter if grant_type is set to `refresh_token`"
113
100
  )
114
101
 
115
- def get_token_refresh_endpoint(self) -> Optional[str]:
116
- if self._token_refresh_endpoint is not None:
117
- refresh_token_endpoint: str = self._token_refresh_endpoint.eval(self.config)
118
- if not refresh_token_endpoint:
119
- raise ValueError(
120
- "OAuthAuthenticator was unable to evaluate token_refresh_endpoint parameter"
121
- )
122
- return refresh_token_endpoint
123
- return None
102
+ def get_token_refresh_endpoint(self) -> str:
103
+ refresh_token: str = self._token_refresh_endpoint.eval(self.config)
104
+ if not refresh_token:
105
+ raise ValueError(
106
+ "OAuthAuthenticator was unable to evaluate token_refresh_endpoint parameter"
107
+ )
108
+ return refresh_token
124
109
 
125
110
  def get_client_id(self) -> str:
126
111
  client_id: str = self._client_id.eval(self.config)
@@ -20,6 +20,9 @@ from airbyte_cdk.sources.declarative.extractors.record_filter import (
20
20
  ClientSideIncrementalRecordFilterDecorator,
21
21
  )
22
22
  from airbyte_cdk.sources.declarative.incremental.datetime_based_cursor import DatetimeBasedCursor
23
+ from airbyte_cdk.sources.declarative.incremental.per_partition_with_global import (
24
+ PerPartitionWithGlobalCursor,
25
+ )
23
26
  from airbyte_cdk.sources.declarative.interpolation import InterpolatedString
24
27
  from airbyte_cdk.sources.declarative.manifest_declarative_source import ManifestDeclarativeSource
25
28
  from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
@@ -300,6 +303,60 @@ class ConcurrentDeclarativeSource(ManifestDeclarativeSource, Generic[TState]):
300
303
  cursor=final_state_cursor,
301
304
  )
302
305
  )
306
+ elif (
307
+ incremental_sync_component_definition
308
+ and incremental_sync_component_definition.get("type", "")
309
+ == DatetimeBasedCursorModel.__name__
310
+ and self._stream_supports_concurrent_partition_processing(
311
+ declarative_stream=declarative_stream
312
+ )
313
+ and hasattr(declarative_stream.retriever, "stream_slicer")
314
+ and isinstance(
315
+ declarative_stream.retriever.stream_slicer, PerPartitionWithGlobalCursor
316
+ )
317
+ ):
318
+ stream_state = state_manager.get_stream_state(
319
+ stream_name=declarative_stream.name, namespace=declarative_stream.namespace
320
+ )
321
+ partition_router = declarative_stream.retriever.stream_slicer._partition_router
322
+
323
+ cursor = self._constructor.create_concurrent_cursor_from_perpartition_cursor(
324
+ state_manager=state_manager,
325
+ model_type=DatetimeBasedCursorModel,
326
+ component_definition=incremental_sync_component_definition,
327
+ stream_name=declarative_stream.name,
328
+ stream_namespace=declarative_stream.namespace,
329
+ config=config or {},
330
+ stream_state=stream_state,
331
+ partition_router=partition_router,
332
+ )
333
+
334
+ partition_generator = StreamSlicerPartitionGenerator(
335
+ DeclarativePartitionFactory(
336
+ declarative_stream.name,
337
+ declarative_stream.get_json_schema(),
338
+ self._retriever_factory(
339
+ name_to_stream_mapping[declarative_stream.name],
340
+ config,
341
+ stream_state,
342
+ ),
343
+ self.message_repository,
344
+ ),
345
+ cursor,
346
+ )
347
+
348
+ concurrent_streams.append(
349
+ DefaultStream(
350
+ partition_generator=partition_generator,
351
+ name=declarative_stream.name,
352
+ json_schema=declarative_stream.get_json_schema(),
353
+ availability_strategy=AlwaysAvailableAvailabilityStrategy(),
354
+ primary_key=get_primary_key_from_stream(declarative_stream.primary_key),
355
+ cursor_field=cursor.cursor_field.cursor_field_key,
356
+ logger=self.logger,
357
+ cursor=cursor,
358
+ )
359
+ )
303
360
  else:
304
361
  synchronous_streams.append(declarative_stream)
305
362
  else:
@@ -1021,6 +1021,7 @@ definitions:
1021
1021
  - type
1022
1022
  - client_id
1023
1023
  - client_secret
1024
+ - token_refresh_endpoint
1024
1025
  properties:
1025
1026
  type:
1026
1027
  type: string
@@ -1059,12 +1060,6 @@ definitions:
1059
1060
  default: "access_token"
1060
1061
  examples:
1061
1062
  - access_token
1062
- access_token_value:
1063
- title: Access Token Value
1064
- description: The value of the access_token to bypass the token refreshing using `refresh_token`.
1065
- type: string
1066
- examples:
1067
- - secret_access_token_value
1068
1063
  expires_in_name:
1069
1064
  title: Token Expiry Property Name
1070
1065
  description: The name of the property which contains the expiry date in the response from the token refresh endpoint.
@@ -1240,7 +1235,6 @@ definitions:
1240
1235
  - "$ref": "#/definitions/RemoveFields"
1241
1236
  - "$ref": "#/definitions/KeysToLower"
1242
1237
  - "$ref": "#/definitions/KeysToSnakeCase"
1243
- - "$ref": "#/definitions/FlattenFields"
1244
1238
  state_migrations:
1245
1239
  title: State Migrations
1246
1240
  description: Array of state migrations to be applied on the input state
@@ -1773,18 +1767,6 @@ definitions:
1773
1767
  - "$ref": "#/definitions/AsyncRetriever"
1774
1768
  - "$ref": "#/definitions/CustomRetriever"
1775
1769
  - "$ref": "#/definitions/SimpleRetriever"
1776
- schema_transformations:
1777
- title: Schema Transformations
1778
- description: A list of transformations to be applied to the schema.
1779
- type: array
1780
- items:
1781
- anyOf:
1782
- - "$ref": "#/definitions/AddFields"
1783
- - "$ref": "#/definitions/CustomTransformation"
1784
- - "$ref": "#/definitions/RemoveFields"
1785
- - "$ref": "#/definitions/KeysToLower"
1786
- - "$ref": "#/definitions/KeysToSnakeCase"
1787
- - "$ref": "#/definitions/FlattenFields"
1788
1770
  schema_type_identifier:
1789
1771
  "$ref": "#/definitions/SchemaTypeIdentifier"
1790
1772
  $parameters:
@@ -3054,7 +3036,6 @@ definitions:
3054
3036
  interpolation_context:
3055
3037
  - config
3056
3038
  - components_values
3057
- - stream_slice
3058
3039
  - stream_template_config
3059
3040
  examples:
3060
3041
  - ["data"]
@@ -3071,13 +3052,10 @@ definitions:
3071
3052
  - config
3072
3053
  - stream_template_config
3073
3054
  - components_values
3074
- - stream_slice
3075
3055
  examples:
3076
3056
  - "{{ components_values['updates'] }}"
3077
3057
  - "{{ components_values['MetaData']['LastUpdatedTime'] }}"
3078
3058
  - "{{ config['segment_id'] }}"
3079
- - "{{ stream_slice['parent_id'] }}"
3080
- - "{{ stream_slice['extra_fields']['name'] }}"
3081
3059
  value_type:
3082
3060
  title: Value Type
3083
3061
  description: The expected data type of the value. If omitted, the type will be inferred from the value provided.
@@ -59,13 +59,11 @@ class ClientSideIncrementalRecordFilterDecorator(RecordFilter):
59
59
 
60
60
  def __init__(
61
61
  self,
62
- date_time_based_cursor: DatetimeBasedCursor,
63
- substream_cursor: Optional[Union[PerPartitionWithGlobalCursor, GlobalSubstreamCursor]],
62
+ cursor: Union[DatetimeBasedCursor, PerPartitionWithGlobalCursor, GlobalSubstreamCursor],
64
63
  **kwargs: Any,
65
64
  ):
66
65
  super().__init__(**kwargs)
67
- self._date_time_based_cursor = date_time_based_cursor
68
- self._substream_cursor = substream_cursor
66
+ self._cursor = cursor
69
67
 
70
68
  def filter_records(
71
69
  self,
@@ -77,7 +75,7 @@ class ClientSideIncrementalRecordFilterDecorator(RecordFilter):
77
75
  records = (
78
76
  record
79
77
  for record in records
80
- if (self._substream_cursor or self._date_time_based_cursor).should_be_synced(
78
+ if self._cursor.should_be_synced(
81
79
  # Record is created on the fly to align with cursors interface; stream name is ignored as we don't need it here
82
80
  # Record stream name is empty cause it is not used durig the filtering
83
81
  Record(data=record, associated_slice=stream_slice, stream_name="")
@@ -2,6 +2,7 @@
2
2
  # Copyright (c) 2022 Airbyte, Inc., all rights reserved.
3
3
  #
4
4
 
5
+ from airbyte_cdk.sources.declarative.incremental.concurrent_partition_cursor import ConcurrentCursorFactory, ConcurrentPerPartitionCursor
5
6
  from airbyte_cdk.sources.declarative.incremental.datetime_based_cursor import DatetimeBasedCursor
6
7
  from airbyte_cdk.sources.declarative.incremental.declarative_cursor import DeclarativeCursor
7
8
  from airbyte_cdk.sources.declarative.incremental.global_substream_cursor import GlobalSubstreamCursor
@@ -14,6 +15,8 @@ from airbyte_cdk.sources.declarative.incremental.resumable_full_refresh_cursor i
14
15
 
15
16
  __all__ = [
16
17
  "CursorFactory",
18
+ "ConcurrentCursorFactory"
19
+ "ConcurrentPerPartitionCursor",
17
20
  "DatetimeBasedCursor",
18
21
  "DeclarativeCursor",
19
22
  "GlobalSubstreamCursor",
@@ -0,0 +1,344 @@
1
+ import copy
2
+ import logging
3
+
4
+ #
5
+ # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
6
+ #
7
+ import threading
8
+ from collections import OrderedDict
9
+ from copy import deepcopy
10
+ from typing import Any, Callable, Iterable, Mapping, MutableMapping, Optional
11
+
12
+ from airbyte_cdk.sources.connector_state_manager import ConnectorStateManager
13
+ from airbyte_cdk.sources.declarative.incremental.declarative_cursor import DeclarativeCursor
14
+ from airbyte_cdk.sources.declarative.incremental.global_substream_cursor import (
15
+ Timer,
16
+ iterate_with_last_flag_and_state,
17
+ )
18
+ from airbyte_cdk.sources.declarative.partition_routers.partition_router import PartitionRouter
19
+ from airbyte_cdk.sources.message import MessageRepository
20
+ from airbyte_cdk.sources.streams.checkpoint.per_partition_key_serializer import (
21
+ PerPartitionKeySerializer,
22
+ )
23
+ from airbyte_cdk.sources.streams.concurrent.cursor import Cursor, CursorField
24
+ from airbyte_cdk.sources.streams.concurrent.partitions.partition import Partition
25
+ from airbyte_cdk.sources.types import Record, StreamSlice, StreamState
26
+
27
+ logger = logging.getLogger("airbyte")
28
+
29
+
30
+ class ConcurrentCursorFactory:
31
+ def __init__(self, create_function: Callable[..., Cursor]):
32
+ self._create_function = create_function
33
+
34
+ def create(self, stream_state: Mapping[str, Any]) -> Cursor:
35
+ return self._create_function(stream_state=stream_state)
36
+
37
+
38
+ class ConcurrentPerPartitionCursor(Cursor):
39
+ """
40
+ Manages state per partition when a stream has many partitions, to prevent data loss or duplication.
41
+
42
+ **Partition Limitation and Limit Reached Logic**
43
+
44
+ - **DEFAULT_MAX_PARTITIONS_NUMBER**: The maximum number of partitions to keep in memory (default is 10,000).
45
+ - **_cursor_per_partition**: An ordered dictionary that stores cursors for each partition.
46
+ - **_over_limit**: A counter that increments each time an oldest partition is removed when the limit is exceeded.
47
+
48
+ The class ensures that the number of partitions tracked does not exceed the `DEFAULT_MAX_PARTITIONS_NUMBER` to prevent excessive memory usage.
49
+
50
+ - When the number of partitions exceeds the limit, the oldest partitions are removed from `_cursor_per_partition`, and `_over_limit` is incremented accordingly.
51
+ - The `limit_reached` method returns `True` when `_over_limit` exceeds `DEFAULT_MAX_PARTITIONS_NUMBER`, indicating that the global cursor should be used instead of per-partition cursors.
52
+
53
+ This approach avoids unnecessary switching to a global cursor due to temporary spikes in partition counts, ensuring that switching is only done when a sustained high number of partitions is observed.
54
+ """
55
+
56
+ DEFAULT_MAX_PARTITIONS_NUMBER = 10000
57
+ _NO_STATE: Mapping[str, Any] = {}
58
+ _NO_CURSOR_STATE: Mapping[str, Any] = {}
59
+ _KEY = 0
60
+ _VALUE = 1
61
+
62
+ def __init__(
63
+ self,
64
+ cursor_factory: ConcurrentCursorFactory,
65
+ partition_router: PartitionRouter,
66
+ stream_name: str,
67
+ stream_namespace: Optional[str],
68
+ stream_state: Any,
69
+ message_repository: MessageRepository,
70
+ connector_state_manager: ConnectorStateManager,
71
+ cursor_field: CursorField,
72
+ ) -> None:
73
+ self._global_cursor: Mapping[str, Any] = {}
74
+ self._stream_name = stream_name
75
+ self._stream_namespace = stream_namespace
76
+ self._message_repository = message_repository
77
+ self._connector_state_manager = connector_state_manager
78
+ self._cursor_field = cursor_field
79
+
80
+ self._cursor_factory = cursor_factory
81
+ self._partition_router = partition_router
82
+
83
+ # The dict is ordered to ensure that once the maximum number of partitions is reached,
84
+ # the oldest partitions can be efficiently removed, maintaining the most recent partitions.
85
+ self._cursor_per_partition: OrderedDict[str, Cursor] = OrderedDict()
86
+ self._state = {"states": []}
87
+ self._semaphore_per_partition = OrderedDict()
88
+ self._finished_partitions = set()
89
+ self._lock = threading.Lock()
90
+ self._timer = Timer()
91
+ self._new_global_cursor = None
92
+ self._lookback_window = 0
93
+ self._parent_state = None
94
+ self._over_limit = 0
95
+ self._partition_serializer = PerPartitionKeySerializer()
96
+
97
+ self._set_initial_state(stream_state)
98
+
99
+ @property
100
+ def cursor_field(self) -> CursorField:
101
+ return self._cursor_field
102
+
103
+ @property
104
+ def state(self) -> MutableMapping[str, Any]:
105
+ states = []
106
+ for partition_tuple, cursor in self._cursor_per_partition.items():
107
+ cursor_state = cursor._connector_state_converter.convert_to_state_message(
108
+ self.cursor_field, cursor.state
109
+ )
110
+ if cursor_state:
111
+ states.append(
112
+ {
113
+ "partition": self._to_dict(partition_tuple),
114
+ "cursor": copy.deepcopy(cursor_state),
115
+ }
116
+ )
117
+ state: dict[str, Any] = {"states": states}
118
+
119
+ if self._global_cursor:
120
+ state["state"] = self._global_cursor
121
+ if self._lookback_window is not None:
122
+ state["lookback_window"] = self._lookback_window
123
+ if self._parent_state is not None:
124
+ state["parent_state"] = self._parent_state
125
+ return state
126
+
127
+ def close_partition(self, partition: Partition) -> None:
128
+ print(f"Closing partition {self._to_partition_key(partition._stream_slice.partition)}")
129
+ self._cursor_per_partition[
130
+ self._to_partition_key(partition._stream_slice.partition)
131
+ ].close_partition(partition=partition)
132
+ with self._lock:
133
+ self._semaphore_per_partition[
134
+ self._to_partition_key(partition._stream_slice.partition)
135
+ ].acquire()
136
+ cursor = self._cursor_per_partition[
137
+ self._to_partition_key(partition._stream_slice.partition)
138
+ ]
139
+ cursor_state = cursor._connector_state_converter.convert_to_state_message(
140
+ cursor._cursor_field, cursor.state
141
+ )
142
+ print(f"State {cursor_state} {cursor.state}")
143
+ if (
144
+ self._to_partition_key(partition._stream_slice.partition)
145
+ in self._finished_partitions
146
+ and self._semaphore_per_partition[
147
+ self._to_partition_key(partition._stream_slice.partition)
148
+ ]._value
149
+ == 0
150
+ ):
151
+ if (
152
+ self._new_global_cursor is None
153
+ or self._new_global_cursor[self.cursor_field.cursor_field_key]
154
+ < cursor_state[self.cursor_field.cursor_field_key]
155
+ ):
156
+ self._new_global_cursor = copy.deepcopy(cursor_state)
157
+
158
+ def ensure_at_least_one_state_emitted(self) -> None:
159
+ """
160
+ The platform expect to have at least one state message on successful syncs. Hence, whatever happens, we expect this method to be
161
+ called.
162
+ """
163
+ if not any(
164
+ semaphore_item[1]._value for semaphore_item in self._semaphore_per_partition.items()
165
+ ):
166
+ self._global_cursor = self._new_global_cursor
167
+ self._lookback_window = self._timer.finish()
168
+ self._parent_state = self._partition_router.get_stream_state()
169
+ self._emit_state_message()
170
+
171
+ def _emit_state_message(self) -> None:
172
+ self._connector_state_manager.update_state_for_stream(
173
+ self._stream_name,
174
+ self._stream_namespace,
175
+ self.state,
176
+ )
177
+ state_message = self._connector_state_manager.create_state_message(
178
+ self._stream_name, self._stream_namespace
179
+ )
180
+ self._message_repository.emit_message(state_message)
181
+
182
+ def stream_slices(self) -> Iterable[StreamSlice]:
183
+ slices = self._partition_router.stream_slices()
184
+ self._timer.start()
185
+ for partition in slices:
186
+ yield from self.generate_slices_from_partition(partition)
187
+
188
+ def generate_slices_from_partition(self, partition: StreamSlice) -> Iterable[StreamSlice]:
189
+ # Ensure the maximum number of partitions is not exceeded
190
+ self._ensure_partition_limit()
191
+
192
+ cursor = self._cursor_per_partition.get(self._to_partition_key(partition.partition))
193
+ if not cursor:
194
+ partition_state = (
195
+ self._global_cursor
196
+ if self._global_cursor
197
+ else self._NO_CURSOR_STATE
198
+ )
199
+ cursor = self._create_cursor(partition_state)
200
+ self._cursor_per_partition[self._to_partition_key(partition.partition)] = cursor
201
+ self._semaphore_per_partition[self._to_partition_key(partition.partition)] = (
202
+ threading.Semaphore(0)
203
+ )
204
+
205
+ for cursor_slice, is_last_slice, _ in iterate_with_last_flag_and_state(
206
+ cursor.stream_slices(),
207
+ lambda: None,
208
+ ):
209
+ self._semaphore_per_partition[self._to_partition_key(partition.partition)].release()
210
+ if is_last_slice:
211
+ self._finished_partitions.add(self._to_partition_key(partition.partition))
212
+ yield StreamSlice(
213
+ partition=partition, cursor_slice=cursor_slice, extra_fields=partition.extra_fields
214
+ )
215
+
216
+ def _ensure_partition_limit(self) -> None:
217
+ """
218
+ Ensure the maximum number of partitions is not exceeded. If so, the oldest added partition will be dropped.
219
+ """
220
+ while len(self._cursor_per_partition) > self.DEFAULT_MAX_PARTITIONS_NUMBER - 1:
221
+ self._over_limit += 1
222
+ oldest_partition = self._cursor_per_partition.popitem(last=False)[
223
+ 0
224
+ ] # Remove the oldest partition
225
+ logger.warning(
226
+ f"The maximum number of partitions has been reached. Dropping the oldest partition: {oldest_partition}. Over limit: {self._over_limit}."
227
+ )
228
+
229
+ def limit_reached(self) -> bool:
230
+ return self._over_limit > self.DEFAULT_MAX_PARTITIONS_NUMBER
231
+
232
+ def _set_initial_state(self, stream_state: StreamState) -> None:
233
+ """
234
+ Set the initial state for the cursors.
235
+
236
+ This method initializes the state for each partition cursor using the provided stream state.
237
+ If a partition state is provided in the stream state, it will update the corresponding partition cursor with this state.
238
+
239
+ Additionally, it sets the parent state for partition routers that are based on parent streams. If a partition router
240
+ does not have parent streams, this step will be skipped due to the default PartitionRouter implementation.
241
+
242
+ Args:
243
+ stream_state (StreamState): The state of the streams to be set. The format of the stream state should be:
244
+ {
245
+ "states": [
246
+ {
247
+ "partition": {
248
+ "partition_key": "value"
249
+ },
250
+ "cursor": {
251
+ "last_updated": "2023-05-27T00:00:00Z"
252
+ }
253
+ }
254
+ ],
255
+ "parent_state": {
256
+ "parent_stream_name": {
257
+ "last_updated": "2023-05-27T00:00:00Z"
258
+ }
259
+ }
260
+ }
261
+ """
262
+ if not stream_state:
263
+ return
264
+
265
+ if "states" not in stream_state:
266
+ # We assume that `stream_state` is in a global format that can be applied to all partitions.
267
+ # Example: {"global_state_format_key": "global_state_format_value"}
268
+ self._global_cursor = deepcopy(stream_state)
269
+ self._new_global_cursor = deepcopy(stream_state)
270
+
271
+ else:
272
+ for state in stream_state["states"]:
273
+ self._cursor_per_partition[self._to_partition_key(state["partition"])] = (
274
+ self._create_cursor(state["cursor"])
275
+ )
276
+ self._semaphore_per_partition[self._to_partition_key(state["partition"])] = (
277
+ threading.Semaphore(0)
278
+ )
279
+
280
+ # set default state for missing partitions if it is per partition with fallback to global
281
+ if "state" in stream_state:
282
+ self._global_cursor = deepcopy(stream_state["state"])
283
+ self._new_global_cursor = deepcopy(stream_state["state"])
284
+
285
+ # Set parent state for partition routers based on parent streams
286
+ self._partition_router.set_initial_state(stream_state)
287
+
288
+ def observe(self, record: Record) -> None:
289
+ print("Observing record in concirrent perpartition ", self._to_partition_key(record.associated_slice.partition), record, self._cursor_per_partition[
290
+ self._to_partition_key(record.associated_slice.partition)
291
+ ].state)
292
+ self._cursor_per_partition[
293
+ self._to_partition_key(record.associated_slice.partition)
294
+ ].observe(record)
295
+
296
+ def _to_partition_key(self, partition: Mapping[str, Any]) -> str:
297
+ return self._partition_serializer.to_partition_key(partition)
298
+
299
+ def _to_dict(self, partition_key: str) -> Mapping[str, Any]:
300
+ return self._partition_serializer.to_partition(partition_key)
301
+
302
+ def _create_cursor(self, cursor_state: Any) -> Cursor:
303
+ cursor = self._cursor_factory.create(stream_state=deepcopy(cursor_state))
304
+ return cursor
305
+
306
+ def should_be_synced(self, record: Record) -> bool:
307
+ return self._get_cursor(record).should_be_synced(record)
308
+
309
+ def is_greater_than_or_equal(self, first: Record, second: Record) -> bool:
310
+ if not first.associated_slice or not second.associated_slice:
311
+ raise ValueError(
312
+ f"Both records should have an associated slice but got {first.associated_slice} and {second.associated_slice}"
313
+ )
314
+ if first.associated_slice.partition != second.associated_slice.partition:
315
+ raise ValueError(
316
+ f"To compare records, partition should be the same but got {first.associated_slice.partition} and {second.associated_slice.partition}"
317
+ )
318
+
319
+ return self._get_cursor(first).is_greater_than_or_equal(
320
+ self._convert_record_to_cursor_record(first),
321
+ self._convert_record_to_cursor_record(second),
322
+ )
323
+
324
+ @staticmethod
325
+ def _convert_record_to_cursor_record(record: Record) -> Record:
326
+ return Record(
327
+ record.data,
328
+ StreamSlice(partition={}, cursor_slice=record.associated_slice.cursor_slice)
329
+ if record.associated_slice
330
+ else None,
331
+ )
332
+
333
+ def _get_cursor(self, record: Record) -> Cursor:
334
+ if not record.associated_slice:
335
+ raise ValueError(
336
+ "Invalid state as stream slices that are emitted should refer to an existing cursor"
337
+ )
338
+ partition_key = self._to_partition_key(record.associated_slice.partition)
339
+ if partition_key not in self._cursor_per_partition:
340
+ raise ValueError(
341
+ "Invalid state as stream slices that are emitted should refer to an existing cursor"
342
+ )
343
+ cursor = self._cursor_per_partition[partition_key]
344
+ return cursor
@@ -303,6 +303,20 @@ class PerPartitionCursor(DeclarativeCursor):
303
303
  raise ValueError("A partition needs to be provided in order to get request body json")
304
304
 
305
305
  def should_be_synced(self, record: Record) -> bool:
306
+ if (
307
+ self._to_partition_key(record.associated_slice.partition)
308
+ not in self._cursor_per_partition
309
+ ):
310
+ partition_state = (
311
+ self._state_to_migrate_from
312
+ if self._state_to_migrate_from
313
+ else self._NO_CURSOR_STATE
314
+ )
315
+ cursor = self._create_cursor(partition_state)
316
+
317
+ self._cursor_per_partition[
318
+ self._to_partition_key(record.associated_slice.partition)
319
+ ] = cursor
306
320
  return self._get_cursor(record).should_be_synced(
307
321
  self._convert_record_to_cursor_record(record)
308
322
  )