airbyte-cdk 0.54.0__tar.gz → 0.55.0__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (437) hide show
  1. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/PKG-INFO +1 -1
  2. airbyte-cdk-0.55.0/airbyte_cdk/sources/concurrent_source/concurrent_read_processor.py +190 -0
  3. airbyte-cdk-0.55.0/airbyte_cdk/sources/concurrent_source/concurrent_source.py +161 -0
  4. airbyte-cdk-0.55.0/airbyte_cdk/sources/concurrent_source/concurrent_source_adapter.py +63 -0
  5. airbyte-cdk-0.55.0/airbyte_cdk/sources/concurrent_source/partition_generation_completed_sentinel.py +17 -0
  6. airbyte-cdk-0.55.0/airbyte_cdk/sources/concurrent_source/thread_pool_manager.py +97 -0
  7. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/concurrent/abstract_stream.py +4 -4
  8. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/concurrent/adapters.py +34 -12
  9. airbyte-cdk-0.55.0/airbyte_cdk/sources/streams/concurrent/default_stream.py +79 -0
  10. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/concurrent/partition_enqueuer.py +7 -7
  11. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/concurrent/partitions/partition.py +23 -0
  12. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/concurrent/partitions/record.py +4 -3
  13. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/concurrent/partitions/types.py +2 -3
  14. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/utils/slice_logger.py +5 -0
  15. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk.egg-info/PKG-INFO +1 -1
  16. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk.egg-info/SOURCES.txt +14 -2
  17. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/setup.py +1 -1
  18. airbyte-cdk-0.55.0/unit_tests/sources/concurrent_source/test_concurrent_source_adapter.py +105 -0
  19. airbyte-cdk-0.55.0/unit_tests/sources/streams/concurrent/__init__.py +3 -0
  20. airbyte-cdk-0.55.0/unit_tests/sources/streams/concurrent/scenarios/__init__.py +3 -0
  21. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/concurrent/scenarios/stream_facade_builder.py +14 -7
  22. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/concurrent/scenarios/stream_facade_scenarios.py +2 -3
  23. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_scenarios.py +44 -55
  24. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_source_builder.py +24 -15
  25. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/concurrent/test_adapters.py +52 -32
  26. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/concurrent/test_concurrent_partition_generator.py +6 -5
  27. airbyte-cdk-0.55.0/unit_tests/sources/streams/concurrent/test_concurrent_read_processor.py +604 -0
  28. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/concurrent/test_cursor.py +1 -1
  29. airbyte-cdk-0.54.0/unit_tests/sources/streams/concurrent/test_thread_based_concurrent_stream.py → airbyte-cdk-0.55.0/unit_tests/sources/streams/concurrent/test_default_stream.py +7 -144
  30. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/concurrent/test_partition_reader.py +2 -2
  31. airbyte-cdk-0.55.0/unit_tests/sources/streams/concurrent/test_thread_pool_manager.py +98 -0
  32. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/test_stream_read.py +1 -2
  33. airbyte-cdk-0.55.0/unit_tests/sources/test_concurrent_source.py +105 -0
  34. airbyte-cdk-0.55.0/unit_tests/sources/test_source_read.py +461 -0
  35. airbyte-cdk-0.54.0/airbyte_cdk/sources/streams/concurrent/thread_based_concurrent_stream.py +0 -221
  36. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/LICENSE.txt +0 -0
  37. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/README.md +0 -0
  38. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/__init__.py +0 -0
  39. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/config_observation.py +0 -0
  40. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/connector.py +0 -0
  41. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/connector_builder/__init__.py +0 -0
  42. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/connector_builder/connector_builder_handler.py +0 -0
  43. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/connector_builder/main.py +0 -0
  44. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/connector_builder/message_grouper.py +0 -0
  45. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/connector_builder/models.py +0 -0
  46. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/destinations/__init__.py +0 -0
  47. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/destinations/destination.py +0 -0
  48. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/destinations/vector_db_based/__init__.py +0 -0
  49. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/destinations/vector_db_based/config.py +0 -0
  50. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/destinations/vector_db_based/document_processor.py +0 -0
  51. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/destinations/vector_db_based/embedder.py +0 -0
  52. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/destinations/vector_db_based/indexer.py +0 -0
  53. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/destinations/vector_db_based/test_utils.py +0 -0
  54. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/destinations/vector_db_based/utils.py +0 -0
  55. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/destinations/vector_db_based/writer.py +0 -0
  56. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/entrypoint.py +0 -0
  57. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/exception_handler.py +0 -0
  58. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/logger.py +0 -0
  59. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/models/__init__.py +0 -0
  60. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/models/airbyte_protocol.py +0 -0
  61. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/models/well_known_types.py +0 -0
  62. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/py.typed +0 -0
  63. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/__init__.py +0 -0
  64. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/abstract_source.py +0 -0
  65. {airbyte-cdk-0.54.0/airbyte_cdk/sources/streams/concurrent → airbyte-cdk-0.55.0/airbyte_cdk/sources/concurrent_source}/__init__.py +0 -0
  66. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/config.py +0 -0
  67. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/connector_state_manager.py +0 -0
  68. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/__init__.py +0 -0
  69. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/auth/__init__.py +0 -0
  70. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/auth/declarative_authenticator.py +0 -0
  71. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/auth/oauth.py +0 -0
  72. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/auth/token.py +0 -0
  73. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/auth/token_provider.py +0 -0
  74. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/checks/__init__.py +0 -0
  75. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/checks/check_stream.py +0 -0
  76. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/checks/connection_checker.py +0 -0
  77. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/create_partial.py +0 -0
  78. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/datetime/__init__.py +0 -0
  79. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/datetime/datetime_parser.py +0 -0
  80. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/datetime/min_max_datetime.py +0 -0
  81. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/declarative_component_schema.yaml +0 -0
  82. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/declarative_source.py +0 -0
  83. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/declarative_stream.py +0 -0
  84. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/decoders/__init__.py +0 -0
  85. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/decoders/decoder.py +0 -0
  86. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/decoders/json_decoder.py +0 -0
  87. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/exceptions.py +0 -0
  88. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/extractors/__init__.py +0 -0
  89. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/extractors/dpath_extractor.py +0 -0
  90. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/extractors/http_selector.py +0 -0
  91. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/extractors/record_extractor.py +0 -0
  92. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/extractors/record_filter.py +0 -0
  93. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/extractors/record_selector.py +0 -0
  94. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/incremental/__init__.py +0 -0
  95. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/incremental/cursor.py +0 -0
  96. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +0 -0
  97. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py +0 -0
  98. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/interpolation/__init__.py +0 -0
  99. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/interpolation/filters.py +0 -0
  100. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_boolean.py +0 -0
  101. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_mapping.py +0 -0
  102. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_nested_mapping.py +0 -0
  103. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_string.py +0 -0
  104. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/interpolation/interpolation.py +0 -0
  105. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/interpolation/jinja.py +0 -0
  106. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/interpolation/macros.py +0 -0
  107. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/manifest_declarative_source.py +0 -0
  108. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/models/__init__.py +0 -0
  109. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/models/declarative_component_schema.py +0 -0
  110. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/parsers/__init__.py +0 -0
  111. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/parsers/class_types_registry.py +0 -0
  112. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/parsers/custom_exceptions.py +0 -0
  113. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/parsers/default_implementation_registry.py +0 -0
  114. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py +0 -0
  115. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py +0 -0
  116. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +0 -0
  117. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/partition_routers/__init__.py +0 -0
  118. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py +0 -0
  119. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/partition_routers/single_partition_router.py +0 -0
  120. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +0 -0
  121. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/__init__.py +0 -0
  122. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/__init__.py +0 -0
  123. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +0 -0
  124. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/constant_backoff_strategy.py +0 -0
  125. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/exponential_backoff_strategy.py +0 -0
  126. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/header_helper.py +0 -0
  127. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_time_from_header_backoff_strategy.py +0 -0
  128. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_until_time_from_header_backoff_strategy.py +0 -0
  129. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategy.py +0 -0
  130. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/composite_error_handler.py +0 -0
  131. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_error_handler.py +0 -0
  132. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/error_handler.py +0 -0
  133. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/http_response_filter.py +0 -0
  134. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/response_action.py +0 -0
  135. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/response_status.py +0 -0
  136. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/http_requester.py +0 -0
  137. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/paginators/__init__.py +0 -0
  138. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +0 -0
  139. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/paginators/no_pagination.py +0 -0
  140. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/paginators/paginator.py +0 -0
  141. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/__init__.py +0 -0
  142. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/cursor_pagination_strategy.py +0 -0
  143. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py +0 -0
  144. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/page_increment.py +0 -0
  145. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/pagination_strategy.py +0 -0
  146. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/stop_condition.py +0 -0
  147. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/request_option.py +0 -0
  148. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/request_options/__init__.py +0 -0
  149. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_nested_request_input_provider.py +0 -0
  150. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_input_provider.py +0 -0
  151. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_options_provider.py +0 -0
  152. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/request_options/request_options_provider.py +0 -0
  153. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/request_path.py +0 -0
  154. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/requesters/requester.py +0 -0
  155. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/retrievers/__init__.py +0 -0
  156. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/retrievers/retriever.py +0 -0
  157. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +0 -0
  158. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/schema/__init__.py +0 -0
  159. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/schema/default_schema_loader.py +0 -0
  160. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/schema/inline_schema_loader.py +0 -0
  161. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/schema/json_file_schema_loader.py +0 -0
  162. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/schema/schema_loader.py +0 -0
  163. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/spec/__init__.py +0 -0
  164. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/spec/spec.py +0 -0
  165. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/stream_slicers/__init__.py +0 -0
  166. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/stream_slicers/cartesian_product_stream_slicer.py +0 -0
  167. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/stream_slicers/stream_slicer.py +0 -0
  168. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/transformations/__init__.py +0 -0
  169. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/transformations/add_fields.py +0 -0
  170. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/transformations/remove_fields.py +0 -0
  171. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/transformations/transformation.py +0 -0
  172. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/types.py +0 -0
  173. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/declarative/yaml_declarative_source.py +0 -0
  174. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/deprecated/__init__.py +0 -0
  175. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/deprecated/base_source.py +0 -0
  176. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/deprecated/client.py +0 -0
  177. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/embedded/__init__.py +0 -0
  178. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/embedded/base_integration.py +0 -0
  179. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/embedded/catalog.py +0 -0
  180. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/embedded/runner.py +0 -0
  181. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/embedded/tools.py +0 -0
  182. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/__init__.py +0 -0
  183. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/availability_strategy/__init__.py +0 -0
  184. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/availability_strategy/abstract_file_based_availability_strategy.py +0 -0
  185. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/availability_strategy/default_file_based_availability_strategy.py +0 -0
  186. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/config/__init__.py +0 -0
  187. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py +0 -0
  188. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/config/avro_format.py +0 -0
  189. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/config/csv_format.py +0 -0
  190. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/config/file_based_stream_config.py +0 -0
  191. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/config/jsonl_format.py +0 -0
  192. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/config/parquet_format.py +0 -0
  193. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/config/unstructured_format.py +0 -0
  194. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/discovery_policy/__init__.py +0 -0
  195. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/discovery_policy/abstract_discovery_policy.py +0 -0
  196. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/discovery_policy/default_discovery_policy.py +0 -0
  197. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/exceptions.py +0 -0
  198. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/file_based_source.py +0 -0
  199. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/file_based_stream_reader.py +0 -0
  200. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/file_types/__init__.py +0 -0
  201. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/file_types/avro_parser.py +0 -0
  202. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/file_types/csv_parser.py +0 -0
  203. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/file_types/file_type_parser.py +0 -0
  204. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/file_types/jsonl_parser.py +0 -0
  205. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/file_types/parquet_parser.py +0 -0
  206. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/file_types/unstructured_parser.py +0 -0
  207. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/remote_file.py +0 -0
  208. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/schema_helpers.py +0 -0
  209. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/schema_validation_policies/__init__.py +0 -0
  210. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/schema_validation_policies/abstract_schema_validation_policy.py +0 -0
  211. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/schema_validation_policies/default_schema_validation_policies.py +0 -0
  212. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/stream/__init__.py +0 -0
  213. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/stream/abstract_file_based_stream.py +0 -0
  214. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/stream/cursor/__init__.py +0 -0
  215. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/stream/cursor/abstract_file_based_cursor.py +0 -0
  216. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/stream/cursor/default_file_based_cursor.py +0 -0
  217. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/stream/default_file_based_stream.py +0 -0
  218. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/file_based/types.py +0 -0
  219. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/http_config.py +0 -0
  220. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/http_logger.py +0 -0
  221. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/message/__init__.py +0 -0
  222. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/message/repository.py +0 -0
  223. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/singer/__init__.py +0 -0
  224. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/singer/singer_helpers.py +0 -0
  225. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/singer/source.py +0 -0
  226. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/source.py +0 -0
  227. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/__init__.py +0 -0
  228. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/availability_strategy.py +0 -0
  229. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/call_rate.py +0 -0
  230. {airbyte-cdk-0.54.0/airbyte_cdk/sources/streams/concurrent/partitions → airbyte-cdk-0.55.0/airbyte_cdk/sources/streams/concurrent}/__init__.py +0 -0
  231. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/concurrent/availability_strategy.py +0 -0
  232. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/concurrent/cursor.py +0 -0
  233. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/concurrent/exceptions.py +0 -0
  234. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/concurrent/partition_reader.py +0 -0
  235. {airbyte-cdk-0.54.0/airbyte_cdk/sources/streams/utils → airbyte-cdk-0.55.0/airbyte_cdk/sources/streams/concurrent/partitions}/__init__.py +0 -0
  236. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/concurrent/partitions/partition_generator.py +0 -0
  237. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/concurrent/state_converter.py +0 -0
  238. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/core.py +0 -0
  239. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/http/__init__.py +0 -0
  240. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/http/auth/__init__.py +0 -0
  241. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/http/auth/core.py +0 -0
  242. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/http/auth/oauth.py +0 -0
  243. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/http/auth/token.py +0 -0
  244. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/http/availability_strategy.py +0 -0
  245. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/http/exceptions.py +0 -0
  246. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/http/http.py +0 -0
  247. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/http/rate_limiting.py +0 -0
  248. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/http/requests_native_auth/__init__.py +0 -0
  249. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +0 -0
  250. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_token.py +0 -0
  251. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py +0 -0
  252. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/http/requests_native_auth/token.py +0 -0
  253. {airbyte-cdk-0.54.0/unit_tests/connector_builder → airbyte-cdk-0.55.0/airbyte_cdk/sources/streams/utils}/__init__.py +0 -0
  254. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/streams/utils/stream_helper.py +0 -0
  255. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/utils/__init__.py +0 -0
  256. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/utils/casing.py +0 -0
  257. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/utils/catalog_helpers.py +0 -0
  258. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/utils/record_helper.py +0 -0
  259. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/utils/schema_helpers.py +0 -0
  260. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/utils/schema_models.py +0 -0
  261. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/utils/transform.py +0 -0
  262. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/sources/utils/types.py +0 -0
  263. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/utils/__init__.py +0 -0
  264. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/utils/airbyte_secrets_utils.py +0 -0
  265. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/utils/analytics_message.py +0 -0
  266. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/utils/constants.py +0 -0
  267. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/utils/datetime_format_inferrer.py +0 -0
  268. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/utils/event_timing.py +0 -0
  269. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/utils/is_cloud_environment.py +0 -0
  270. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/utils/mapping_helpers.py +0 -0
  271. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/utils/oneof_option_config.py +0 -0
  272. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/utils/schema_inferrer.py +0 -0
  273. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/utils/spec_schema_transformations.py +0 -0
  274. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/utils/stream_status_utils.py +0 -0
  275. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk/utils/traced_exception.py +0 -0
  276. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk.egg-info/dependency_links.txt +0 -0
  277. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk.egg-info/requires.txt +0 -0
  278. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/airbyte_cdk.egg-info/top_level.txt +0 -0
  279. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/pyproject.toml +0 -0
  280. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/setup.cfg +0 -0
  281. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/source_declarative_manifest/__init__.py +0 -0
  282. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/source_declarative_manifest/main.py +0 -0
  283. {airbyte-cdk-0.54.0/unit_tests/sources/declarative/auth → airbyte-cdk-0.55.0/unit_tests/connector_builder}/__init__.py +0 -0
  284. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/connector_builder/test_connector_builder_handler.py +0 -0
  285. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/connector_builder/test_message_grouper.py +0 -0
  286. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/connector_builder/utils.py +0 -0
  287. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/destinations/__init__.py +0 -0
  288. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/destinations/test_destination.py +0 -0
  289. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/singer/__init__.py +0 -0
  290. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/singer/test_singer_helpers.py +0 -0
  291. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/singer/test_singer_source.py +0 -0
  292. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/__init__.py +0 -0
  293. {airbyte-cdk-0.54.0/unit_tests/sources/declarative/requesters/error_handlers → airbyte-cdk-0.55.0/unit_tests/sources/concurrent_source}/__init__.py +0 -0
  294. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/__init__.py +0 -0
  295. {airbyte-cdk-0.54.0/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies → airbyte-cdk-0.55.0/unit_tests/sources/declarative/auth}/__init__.py +0 -0
  296. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/auth/test_oauth.py +0 -0
  297. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/auth/test_session_token_auth.py +0 -0
  298. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/auth/test_token_auth.py +0 -0
  299. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/auth/test_token_provider.py +0 -0
  300. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/checks/__init__.py +0 -0
  301. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/checks/test_check_stream.py +0 -0
  302. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/decoders/__init__.py +0 -0
  303. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/decoders/test_json_decoder.py +0 -0
  304. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/external_component.py +0 -0
  305. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/extractors/__init__.py +0 -0
  306. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/extractors/test_dpath_extractor.py +0 -0
  307. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/extractors/test_record_filter.py +0 -0
  308. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/extractors/test_record_selector.py +0 -0
  309. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/incremental/__init__.py +0 -0
  310. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/incremental/test_datetime_based_cursor.py +0 -0
  311. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/incremental/test_per_partition_cursor.py +0 -0
  312. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/incremental/test_per_partition_cursor_integration.py +0 -0
  313. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/interpolation/__init__.py +0 -0
  314. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/interpolation/test_filters.py +0 -0
  315. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/interpolation/test_interpolated_boolean.py +0 -0
  316. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/interpolation/test_interpolated_mapping.py +0 -0
  317. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/interpolation/test_interpolated_nested_mapping.py +0 -0
  318. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/interpolation/test_interpolated_string.py +0 -0
  319. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/interpolation/test_jinja.py +0 -0
  320. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/interpolation/test_macros.py +0 -0
  321. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/parsers/__init__.py +0 -0
  322. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/parsers/test_manifest_component_transformer.py +0 -0
  323. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/parsers/test_manifest_reference_resolver.py +0 -0
  324. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/parsers/test_model_to_component_factory.py +0 -0
  325. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/parsers/testing_components.py +0 -0
  326. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/partition_routers/__init__.py +0 -0
  327. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/partition_routers/test_list_partition_router.py +0 -0
  328. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/partition_routers/test_single_partition_router.py +0 -0
  329. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/partition_routers/test_substream_partition_router.py +0 -0
  330. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/__init__.py +0 -0
  331. {airbyte-cdk-0.54.0/unit_tests/sources/declarative/requesters/request_options → airbyte-cdk-0.55.0/unit_tests/sources/declarative/requesters/error_handlers}/__init__.py +0 -0
  332. {airbyte-cdk-0.54.0/unit_tests/sources/declarative/schema/source_test → airbyte-cdk-0.55.0/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies}/__init__.py +0 -0
  333. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_constant_backoff.py +0 -0
  334. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_exponential_backoff.py +0 -0
  335. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_header_helper.py +0 -0
  336. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_wait_time_from_header.py +0 -0
  337. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_wait_until_time_from_header.py +0 -0
  338. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/error_handlers/test_composite_error_handler.py +0 -0
  339. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/error_handlers/test_default_error_handler.py +0 -0
  340. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/error_handlers/test_http_response_filter.py +0 -0
  341. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/error_handlers/test_response_status.py +0 -0
  342. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/paginators/__init__.py +0 -0
  343. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/paginators/test_cursor_pagination_strategy.py +0 -0
  344. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/paginators/test_default_paginator.py +0 -0
  345. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/paginators/test_no_paginator.py +0 -0
  346. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/paginators/test_offset_increment.py +0 -0
  347. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/paginators/test_page_increment.py +0 -0
  348. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/paginators/test_request_option.py +0 -0
  349. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/paginators/test_stop_condition.py +0 -0
  350. {airbyte-cdk-0.54.0/unit_tests/sources/streams/concurrent → airbyte-cdk-0.55.0/unit_tests/sources/declarative/requesters/request_options}/__init__.py +0 -0
  351. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/request_options/test_interpolated_request_options_provider.py +0 -0
  352. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/test_http_requester.py +0 -0
  353. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/requesters/test_interpolated_request_input_provider.py +0 -0
  354. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/retrievers/__init__.py +0 -0
  355. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/retrievers/test_simple_retriever.py +0 -0
  356. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/schema/__init__.py +0 -0
  357. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/schema/source_test/SourceTest.py +0 -0
  358. {airbyte-cdk-0.54.0/unit_tests/sources/streams/concurrent/scenarios → airbyte-cdk-0.55.0/unit_tests/sources/declarative/schema/source_test}/__init__.py +0 -0
  359. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/schema/test_default_schema_loader.py +0 -0
  360. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/schema/test_inline_schema_loader.py +0 -0
  361. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/schema/test_json_file_schema_loader.py +0 -0
  362. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/states/__init__.py +0 -0
  363. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/stream_slicers/__init__.py +0 -0
  364. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/stream_slicers/test_cartesian_product_stream_slicer.py +0 -0
  365. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/test_create_partial.py +0 -0
  366. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/test_declarative_stream.py +0 -0
  367. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/test_manifest_declarative_source.py +0 -0
  368. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/declarative/test_yaml_declarative_source.py +0 -0
  369. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/__init__.py +0 -0
  370. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/availability_strategy/__init__.py +0 -0
  371. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/availability_strategy/test_default_file_based_availability_strategy.py +0 -0
  372. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/config/__init__.py +0 -0
  373. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/config/test_abstract_file_based_spec.py +0 -0
  374. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/config/test_csv_format.py +0 -0
  375. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/config/test_file_based_stream_config.py +0 -0
  376. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/discovery_policy/__init__.py +0 -0
  377. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/discovery_policy/test_default_discovery_policy.py +0 -0
  378. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/file_types/__init__.py +0 -0
  379. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/file_types/test_avro_parser.py +0 -0
  380. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/file_types/test_csv_parser.py +0 -0
  381. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/file_types/test_jsonl_parser.py +0 -0
  382. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/file_types/test_parquet_parser.py +0 -0
  383. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/file_types/test_unstructured_parser.py +0 -0
  384. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/helpers.py +0 -0
  385. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/in_memory_files_source.py +0 -0
  386. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/scenarios/__init__.py +0 -0
  387. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/scenarios/avro_scenarios.py +0 -0
  388. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/scenarios/check_scenarios.py +0 -0
  389. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/scenarios/csv_scenarios.py +0 -0
  390. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/scenarios/file_based_source_builder.py +0 -0
  391. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/scenarios/incremental_scenarios.py +0 -0
  392. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/scenarios/jsonl_scenarios.py +0 -0
  393. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/scenarios/parquet_scenarios.py +0 -0
  394. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/scenarios/scenario_builder.py +0 -0
  395. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/scenarios/unstructured_scenarios.py +0 -0
  396. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/scenarios/user_input_schema_scenarios.py +0 -0
  397. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/scenarios/validation_policy_scenarios.py +0 -0
  398. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/stream/__init__.py +0 -0
  399. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/stream/test_default_file_based_cursor.py +0 -0
  400. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/stream/test_default_file_based_stream.py +0 -0
  401. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/test_file_based_scenarios.py +0 -0
  402. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/test_file_based_stream_reader.py +0 -0
  403. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/test_scenarios.py +0 -0
  404. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/file_based/test_schema_helpers.py +0 -0
  405. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/fixtures/__init__.py +0 -0
  406. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/fixtures/source_test_fixture.py +0 -0
  407. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/message/__init__.py +0 -0
  408. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/message/test_repository.py +0 -0
  409. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/__init__.py +0 -0
  410. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/concurrent/scenarios/incremental_scenarios.py +0 -0
  411. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/concurrent/scenarios/test_concurrent_scenarios.py +0 -0
  412. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/concurrent/scenarios/utils.py +0 -0
  413. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/concurrent/test_state_converter.py +0 -0
  414. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/http/__init__.py +0 -0
  415. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/http/auth/__init__.py +0 -0
  416. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/http/auth/test_auth.py +0 -0
  417. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/http/requests_native_auth/__init__.py +0 -0
  418. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/http/requests_native_auth/test_requests_native_auth.py +0 -0
  419. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/http/test_availability_strategy.py +0 -0
  420. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/http/test_http.py +0 -0
  421. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/test_availability_strategy.py +0 -0
  422. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/test_call_rate.py +0 -0
  423. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/streams/test_streams_core.py +0 -0
  424. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/test_abstract_source.py +0 -0
  425. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/test_config.py +0 -0
  426. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/test_connector_state_manager.py +0 -0
  427. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/test_http_logger.py +0 -0
  428. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/test_integration_source.py +0 -0
  429. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/sources/test_source.py +0 -0
  430. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/utils/__init__.py +0 -0
  431. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/utils/test_datetime_format_inferrer.py +0 -0
  432. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/utils/test_mapping_helpers.py +0 -0
  433. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/utils/test_rate_limiting.py +0 -0
  434. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/utils/test_schema_inferrer.py +0 -0
  435. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/utils/test_secret_utils.py +0 -0
  436. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/utils/test_stream_status_utils.py +0 -0
  437. {airbyte-cdk-0.54.0 → airbyte-cdk-0.55.0}/unit_tests/utils/test_traced_exception.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-cdk
3
- Version: 0.54.0
3
+ Version: 0.55.0
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://github.com/airbytehq/airbyte
6
6
  Author: Airbyte
@@ -0,0 +1,190 @@
1
+ #
2
+ # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
3
+ #
4
+ import logging
5
+ from typing import Dict, Iterable, List, Optional, Set
6
+
7
+ from airbyte_cdk.models import AirbyteMessage, AirbyteStreamStatus
8
+ from airbyte_cdk.models import Type as MessageType
9
+ from airbyte_cdk.sources.concurrent_source.partition_generation_completed_sentinel import PartitionGenerationCompletedSentinel
10
+ from airbyte_cdk.sources.concurrent_source.thread_pool_manager import ThreadPoolManager
11
+ from airbyte_cdk.sources.message import MessageRepository
12
+ from airbyte_cdk.sources.streams.concurrent.abstract_stream import AbstractStream
13
+ from airbyte_cdk.sources.streams.concurrent.partition_enqueuer import PartitionEnqueuer
14
+ from airbyte_cdk.sources.streams.concurrent.partition_reader import PartitionReader
15
+ from airbyte_cdk.sources.streams.concurrent.partitions.partition import Partition
16
+ from airbyte_cdk.sources.streams.concurrent.partitions.record import Record
17
+ from airbyte_cdk.sources.streams.concurrent.partitions.types import PartitionCompleteSentinel
18
+ from airbyte_cdk.sources.utils.record_helper import stream_data_to_airbyte_message
19
+ from airbyte_cdk.sources.utils.slice_logger import SliceLogger
20
+ from airbyte_cdk.utils.stream_status_utils import as_airbyte_message as stream_status_as_airbyte_message
21
+
22
+
23
+ class ConcurrentReadProcessor:
24
+ def __init__(
25
+ self,
26
+ stream_instances_to_read_from: List[AbstractStream],
27
+ partition_enqueuer: PartitionEnqueuer,
28
+ thread_pool_manager: ThreadPoolManager,
29
+ logger: logging.Logger,
30
+ slice_logger: SliceLogger,
31
+ message_repository: MessageRepository,
32
+ partition_reader: PartitionReader,
33
+ ):
34
+ """
35
+ This class is responsible for handling items from a concurrent stream read process.
36
+ :param stream_instances_to_read_from: List of streams to read from
37
+ :param partition_enqueuer: PartitionEnqueuer instance
38
+ :param thread_pool_manager: ThreadPoolManager instance
39
+ :param logger: Logger instance
40
+ :param slice_logger: SliceLogger instance
41
+ :param message_repository: MessageRepository instance
42
+ :param partition_reader: PartitionReader instance
43
+ """
44
+ self._stream_name_to_instance = {s.name: s for s in stream_instances_to_read_from}
45
+ self._record_counter = {}
46
+ self._streams_to_partitions: Dict[str, Set[Partition]] = {}
47
+ for stream in stream_instances_to_read_from:
48
+ self._streams_to_partitions[stream.name] = set()
49
+ self._record_counter[stream.name] = 0
50
+ self._thread_pool_manager = thread_pool_manager
51
+ self._partition_enqueuer = partition_enqueuer
52
+ self._stream_instances_to_start_partition_generation = stream_instances_to_read_from
53
+ self._streams_currently_generating_partitions: List[str] = []
54
+ self._logger = logger
55
+ self._slice_logger = slice_logger
56
+ self._message_repository = message_repository
57
+ self._partition_reader = partition_reader
58
+
59
+ def on_partition_generation_completed(self, sentinel: PartitionGenerationCompletedSentinel) -> Iterable[AirbyteMessage]:
60
+ """
61
+ This method is called when a partition generation is completed.
62
+ 1. Remove the stream from the list of streams currently generating partitions
63
+ 2. If the stream is done, mark it as such and return a stream status message
64
+ 3. If there are more streams to read from, start the next partition generator
65
+ """
66
+ stream_name = sentinel.stream.name
67
+ self._streams_currently_generating_partitions.remove(sentinel.stream.name)
68
+ ret = []
69
+ # It is possible for the stream to already be done if no partitions were generated
70
+ if self._is_stream_done(stream_name):
71
+ ret.append(self._on_stream_is_done(stream_name))
72
+ if self._stream_instances_to_start_partition_generation:
73
+ ret.append(self.start_next_partition_generator())
74
+ return ret
75
+
76
+ def on_partition(self, partition: Partition) -> None:
77
+ """
78
+ This method is called when a partition is generated.
79
+ 1. Add the partition to the set of partitions for the stream
80
+ 2. Log the slice if necessary
81
+ 3. Submit the partition to the thread pool manager
82
+ """
83
+ stream_name = partition.stream_name()
84
+ self._streams_to_partitions[stream_name].add(partition)
85
+ if self._slice_logger.should_log_slice_message(self._logger):
86
+ self._message_repository.emit_message(self._slice_logger.create_slice_log_message(partition.to_slice()))
87
+ self._thread_pool_manager.submit(self._partition_reader.process_partition, partition)
88
+
89
+ def on_partition_complete_sentinel(self, sentinel: PartitionCompleteSentinel) -> Iterable[AirbyteMessage]:
90
+ """
91
+ This method is called when a partition is completed.
92
+ 1. Close the partition
93
+ 2. If the stream is done, mark it as such and return a stream status message
94
+ 3. Emit messages that were added to the message repository
95
+ """
96
+ partition = sentinel.partition
97
+ partition.close()
98
+ if self._is_stream_done(partition.stream_name()):
99
+ yield self._on_stream_is_done(partition.stream_name())
100
+ yield from self._message_repository.consume_queue()
101
+
102
+ def on_record(self, record: Record) -> Iterable[AirbyteMessage]:
103
+ """
104
+ This method is called when a record is read from a partition.
105
+ 1. Convert the record to an AirbyteMessage
106
+ 2. If this is the first record for the stream, mark the stream as RUNNING
107
+ 3. Increment the record counter for the stream
108
+ 4. Emit the message
109
+ 5. Emit messages that were added to the message repository
110
+ """
111
+ # Do not pass a transformer or a schema
112
+ # AbstractStreams are expected to return data as they are expected.
113
+ # Any transformation on the data should be done before reaching this point
114
+ message = stream_data_to_airbyte_message(record.stream_name, record.data)
115
+ stream = self._stream_name_to_instance[record.stream_name]
116
+
117
+ if self._record_counter[stream.name] == 0:
118
+ self._logger.info(f"Marking stream {stream.name} as RUNNING")
119
+ yield stream_status_as_airbyte_message(stream.as_airbyte_stream(), AirbyteStreamStatus.RUNNING)
120
+
121
+ if message.type == MessageType.RECORD:
122
+ self._record_counter[stream.name] += 1
123
+ yield message
124
+ yield from self._message_repository.consume_queue()
125
+
126
+ def on_exception(self, exception: Exception) -> Iterable[AirbyteMessage]:
127
+ """
128
+ This method is called when an exception is raised.
129
+ 1. Stop all running streams
130
+ 2. Raise the exception
131
+ """
132
+ yield from self._stop_streams()
133
+ raise exception
134
+
135
+ def start_next_partition_generator(self) -> Optional[AirbyteMessage]:
136
+ """
137
+ Start the next partition generator.
138
+ 1. Pop the next stream to read from
139
+ 2. Submit the partition generator to the thread pool manager
140
+ 3. Add the stream to the list of streams currently generating partitions
141
+ 4. Return a stream status message
142
+ """
143
+ if self._stream_instances_to_start_partition_generation:
144
+ stream = self._stream_instances_to_start_partition_generation.pop(0)
145
+ self._thread_pool_manager.submit(self._partition_enqueuer.generate_partitions, stream)
146
+ self._streams_currently_generating_partitions.append(stream.name)
147
+ self._logger.info(f"Marking stream {stream.name} as STARTED")
148
+ self._logger.info(f"Syncing stream: {stream.name} ")
149
+ return stream_status_as_airbyte_message(
150
+ stream.as_airbyte_stream(),
151
+ AirbyteStreamStatus.STARTED,
152
+ )
153
+ else:
154
+ return None
155
+
156
+ def is_done(self) -> bool:
157
+ """
158
+ This method is called to check if the sync is done.
159
+ The sync is done when:
160
+ 1. There are no more streams generating partitions
161
+ 2. There are no more streams to read from
162
+ 3. All partitions for all streams are closed
163
+ """
164
+ return (
165
+ not self._streams_currently_generating_partitions
166
+ and not self._stream_instances_to_start_partition_generation
167
+ and all([all(p.is_closed() for p in partitions) for partitions in self._streams_to_partitions.values()])
168
+ )
169
+
170
+ def _is_stream_done(self, stream_name: str) -> bool:
171
+ return (
172
+ all([p.is_closed() for p in self._streams_to_partitions[stream_name]])
173
+ and stream_name not in self._streams_currently_generating_partitions
174
+ )
175
+
176
+ def _on_stream_is_done(self, stream_name: str) -> AirbyteMessage:
177
+ self._logger.info(f"Read {self._record_counter[stream_name]} records from {stream_name} stream")
178
+ self._logger.info(f"Marking stream {stream_name} as STOPPED")
179
+ stream = self._stream_name_to_instance[stream_name]
180
+ self._logger.info(f"Finished syncing {stream.name}")
181
+ return stream_status_as_airbyte_message(stream.as_airbyte_stream(), AirbyteStreamStatus.COMPLETE)
182
+
183
+ def _stop_streams(self) -> Iterable[AirbyteMessage]:
184
+ self._thread_pool_manager.shutdown()
185
+ for stream_name, partitions in self._streams_to_partitions.items():
186
+ stream = self._stream_name_to_instance[stream_name]
187
+ if not all([p.is_closed() for p in partitions]):
188
+ self._logger.info(f"Marking stream {stream.name} as STOPPED")
189
+ self._logger.info(f"Finished syncing {stream.name}")
190
+ yield stream_status_as_airbyte_message(stream.as_airbyte_stream(), AirbyteStreamStatus.INCOMPLETE)
@@ -0,0 +1,161 @@
1
+ #
2
+ # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
3
+ #
4
+ import concurrent
5
+ import logging
6
+ from queue import Queue
7
+ from typing import Iterable, Iterator, List
8
+
9
+ from airbyte_cdk.models import AirbyteMessage
10
+ from airbyte_cdk.sources.concurrent_source.concurrent_read_processor import ConcurrentReadProcessor
11
+ from airbyte_cdk.sources.concurrent_source.partition_generation_completed_sentinel import PartitionGenerationCompletedSentinel
12
+ from airbyte_cdk.sources.concurrent_source.thread_pool_manager import ThreadPoolManager
13
+ from airbyte_cdk.sources.message import InMemoryMessageRepository, MessageRepository
14
+ from airbyte_cdk.sources.streams.concurrent.abstract_stream import AbstractStream
15
+ from airbyte_cdk.sources.streams.concurrent.partition_enqueuer import PartitionEnqueuer
16
+ from airbyte_cdk.sources.streams.concurrent.partition_reader import PartitionReader
17
+ from airbyte_cdk.sources.streams.concurrent.partitions.partition import Partition
18
+ from airbyte_cdk.sources.streams.concurrent.partitions.record import Record
19
+ from airbyte_cdk.sources.streams.concurrent.partitions.types import PartitionCompleteSentinel, QueueItem
20
+ from airbyte_cdk.sources.utils.slice_logger import DebugSliceLogger, SliceLogger
21
+
22
+
23
+ class ConcurrentSource:
24
+ """
25
+ A Source that reads data from multiple AbstractStreams concurrently.
26
+ It does so by submitting partition generation, and partition read tasks to a thread pool.
27
+ The tasks asynchronously add their output to a shared queue.
28
+ The read is done when all partitions for all streams were generated and read.
29
+ """
30
+
31
+ DEFAULT_TIMEOUT_SECONDS = 900
32
+
33
+ @staticmethod
34
+ def create(
35
+ num_workers: int,
36
+ initial_number_of_partitions_to_generate: int,
37
+ logger: logging.Logger,
38
+ slice_logger: SliceLogger,
39
+ message_repository: MessageRepository,
40
+ timeout_seconds: int = DEFAULT_TIMEOUT_SECONDS,
41
+ ) -> "ConcurrentSource":
42
+ threadpool = ThreadPoolManager(
43
+ concurrent.futures.ThreadPoolExecutor(max_workers=num_workers, thread_name_prefix="workerpool"), logger, num_workers
44
+ )
45
+ return ConcurrentSource(
46
+ threadpool, logger, slice_logger, message_repository, initial_number_of_partitions_to_generate, timeout_seconds
47
+ )
48
+
49
+ def __init__(
50
+ self,
51
+ threadpool: ThreadPoolManager,
52
+ logger: logging.Logger,
53
+ slice_logger: SliceLogger = DebugSliceLogger(),
54
+ message_repository: MessageRepository = InMemoryMessageRepository(),
55
+ initial_number_partitions_to_generate: int = 1,
56
+ timeout_seconds: int = DEFAULT_TIMEOUT_SECONDS,
57
+ ) -> None:
58
+ """
59
+ :param threadpool: The threadpool to submit tasks to
60
+ :param logger: The logger to log to
61
+ :param slice_logger: The slice logger used to create messages on new slices
62
+ :param message_repository: The repository to emit messages to
63
+ :param initial_number_partitions_to_generate: The initial number of concurrent partition generation tasks. Limiting this number ensures will limit the latency of the first records emitted. While the latency is not critical, emitting the records early allows the platform and the destination to process them as early as possible.
64
+ :param timeout_seconds: The maximum number of seconds to wait for a record to be read from the queue. If no record is read within this time, the source will stop reading and return.
65
+ """
66
+ self._threadpool = threadpool
67
+ self._logger = logger
68
+ self._slice_logger = slice_logger
69
+ self._message_repository = message_repository
70
+ self._initial_number_partitions_to_generate = initial_number_partitions_to_generate
71
+ self._timeout_seconds = timeout_seconds
72
+
73
+ def read(
74
+ self,
75
+ streams: List[AbstractStream],
76
+ ) -> Iterator[AirbyteMessage]:
77
+ self._logger.info("Starting syncing")
78
+ stream_instances_to_read_from = self._get_streams_to_read_from(streams)
79
+
80
+ # Return early if there are no streams to read from
81
+ if not stream_instances_to_read_from:
82
+ return
83
+
84
+ queue: Queue[QueueItem] = Queue()
85
+ concurrent_stream_processor = ConcurrentReadProcessor(
86
+ stream_instances_to_read_from,
87
+ PartitionEnqueuer(queue),
88
+ self._threadpool,
89
+ self._logger,
90
+ self._slice_logger,
91
+ self._message_repository,
92
+ PartitionReader(queue),
93
+ )
94
+
95
+ # Enqueue initial partition generation tasks
96
+ yield from self._submit_initial_partition_generators(concurrent_stream_processor)
97
+
98
+ # Read from the queue until all partitions were generated and read
99
+ yield from self._consume_from_queue(
100
+ queue,
101
+ concurrent_stream_processor,
102
+ )
103
+ self._threadpool.check_for_errors_and_shutdown()
104
+ self._logger.info("Finished syncing")
105
+
106
+ def _submit_initial_partition_generators(self, concurrent_stream_processor: ConcurrentReadProcessor) -> Iterable[AirbyteMessage]:
107
+ for _ in range(self._initial_number_partitions_to_generate):
108
+ status_message = concurrent_stream_processor.start_next_partition_generator()
109
+ if status_message:
110
+ yield status_message
111
+
112
+ def _consume_from_queue(
113
+ self,
114
+ queue: Queue[QueueItem],
115
+ concurrent_stream_processor: ConcurrentReadProcessor,
116
+ ) -> Iterable[AirbyteMessage]:
117
+ while airbyte_message_or_record_or_exception := queue.get(block=True, timeout=self._timeout_seconds):
118
+ yield from self._handle_item(
119
+ airbyte_message_or_record_or_exception,
120
+ concurrent_stream_processor,
121
+ )
122
+ if concurrent_stream_processor.is_done() and queue.empty():
123
+ # all partitions were generated and processed. we're done here
124
+ break
125
+
126
+ def _handle_item(
127
+ self,
128
+ queue_item: QueueItem,
129
+ concurrent_stream_processor: ConcurrentReadProcessor,
130
+ ) -> Iterable[AirbyteMessage]:
131
+ # handle queue item and call the appropriate handler depending on the type of the queue item
132
+ if isinstance(queue_item, Exception):
133
+ yield from concurrent_stream_processor.on_exception(queue_item)
134
+
135
+ elif isinstance(queue_item, PartitionGenerationCompletedSentinel):
136
+ yield from concurrent_stream_processor.on_partition_generation_completed(queue_item)
137
+
138
+ elif isinstance(queue_item, Partition):
139
+ concurrent_stream_processor.on_partition(queue_item)
140
+ elif isinstance(queue_item, PartitionCompleteSentinel):
141
+ yield from concurrent_stream_processor.on_partition_complete_sentinel(queue_item)
142
+ elif isinstance(queue_item, Record):
143
+ yield from concurrent_stream_processor.on_record(queue_item)
144
+ else:
145
+ raise ValueError(f"Unknown queue item type: {type(queue_item)}")
146
+
147
+ def _get_streams_to_read_from(self, streams: List[AbstractStream]) -> List[AbstractStream]:
148
+ """
149
+ Iterate over the configured streams and return a list of streams to read from.
150
+ If a stream is not configured, it will be skipped.
151
+ If a stream is configured but does not exist in the source and self.raise_exception_on_missing_stream is True, an exception will be raised
152
+ If a stream is not available, it will be skipped
153
+ """
154
+ stream_instances_to_read_from = []
155
+ for stream in streams:
156
+ stream_availability = stream.check_availability()
157
+ if not stream_availability.is_available():
158
+ self._logger.warning(f"Skipped syncing stream '{stream.name}' because it was unavailable. {stream_availability.message()}")
159
+ continue
160
+ stream_instances_to_read_from.append(stream)
161
+ return stream_instances_to_read_from
@@ -0,0 +1,63 @@
1
+ #
2
+ # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
3
+ #
4
+ import logging
5
+ from abc import ABC
6
+ from typing import Any, Iterator, List, Mapping, MutableMapping, Optional, Union
7
+
8
+ from airbyte_cdk.models import AirbyteMessage, AirbyteStateMessage, ConfiguredAirbyteCatalog
9
+ from airbyte_cdk.sources import AbstractSource
10
+ from airbyte_cdk.sources.concurrent_source.concurrent_source import ConcurrentSource
11
+ from airbyte_cdk.sources.streams import Stream
12
+ from airbyte_cdk.sources.streams.concurrent.abstract_stream import AbstractStream
13
+ from airbyte_cdk.sources.streams.concurrent.adapters import StreamFacade
14
+
15
+
16
+ class ConcurrentSourceAdapter(AbstractSource, ABC):
17
+ def __init__(self, concurrent_source: ConcurrentSource, **kwargs: Any) -> None:
18
+ """
19
+ ConcurrentSourceAdapter is a Source that wraps a concurrent source and exposes it as a regular source.
20
+
21
+ The source's streams are still defined through the streams() method.
22
+ Streams wrapped in a StreamFacade will be processed concurrently.
23
+ Other streams will be processed sequentially as a later step.
24
+ """
25
+ self._concurrent_source = concurrent_source
26
+ super().__init__(**kwargs)
27
+
28
+ def read(
29
+ self,
30
+ logger: logging.Logger,
31
+ config: Mapping[str, Any],
32
+ catalog: ConfiguredAirbyteCatalog,
33
+ state: Optional[Union[List[AirbyteStateMessage], MutableMapping[str, Any]]] = None,
34
+ ) -> Iterator[AirbyteMessage]:
35
+ abstract_streams = self._select_abstract_streams(config, catalog)
36
+ concurrent_stream_names = {stream.name for stream in abstract_streams}
37
+ configured_catalog_for_regular_streams = ConfiguredAirbyteCatalog(
38
+ streams=[stream for stream in catalog.streams if stream.stream.name not in concurrent_stream_names]
39
+ )
40
+ if abstract_streams:
41
+ yield from self._concurrent_source.read(abstract_streams)
42
+ if configured_catalog_for_regular_streams.streams:
43
+ yield from super().read(logger, config, configured_catalog_for_regular_streams, state)
44
+
45
+ def _select_abstract_streams(self, config: Mapping[str, Any], configured_catalog: ConfiguredAirbyteCatalog) -> List[AbstractStream]:
46
+ """
47
+ Selects streams that can be processed concurrently and returns their abstract representations.
48
+ """
49
+ all_streams = self.streams(config)
50
+ stream_name_to_instance: Mapping[str, Stream] = {s.name: s for s in all_streams}
51
+ abstract_streams: List[AbstractStream] = []
52
+ for configured_stream in configured_catalog.streams:
53
+ stream_instance = stream_name_to_instance.get(configured_stream.stream.name)
54
+ if not stream_instance:
55
+ if not self.raise_exception_on_missing_stream:
56
+ continue
57
+ raise KeyError(
58
+ f"The stream {configured_stream.stream.name} no longer exists in the configuration. "
59
+ f"Refresh the schema in replication settings and remove this stream from future sync attempts."
60
+ )
61
+ if isinstance(stream_instance, StreamFacade):
62
+ abstract_streams.append(stream_instance._abstract_stream)
63
+ return abstract_streams
@@ -0,0 +1,17 @@
1
+ #
2
+ # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
3
+ #
4
+ from airbyte_cdk.sources.streams.concurrent.abstract_stream import AbstractStream
5
+
6
+
7
+ class PartitionGenerationCompletedSentinel:
8
+ """
9
+ A sentinel object indicating all partitions for a stream were produced.
10
+ Includes a pointer to the stream that was processed.
11
+ """
12
+
13
+ def __init__(self, stream: AbstractStream):
14
+ """
15
+ :param stream: The stream that was processed
16
+ """
17
+ self.stream = stream
@@ -0,0 +1,97 @@
1
+ #
2
+ # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
3
+ #
4
+ import logging
5
+ import time
6
+ from concurrent.futures import Future, ThreadPoolExecutor
7
+ from typing import Any, Callable, List
8
+
9
+
10
+ class ThreadPoolManager:
11
+ """
12
+ Wrapper to abstract away the threadpool and the logic to wait for pending tasks to be completed.
13
+ """
14
+
15
+ DEFAULT_SLEEP_TIME = 0.1
16
+ DEFAULT_MAX_QUEUE_SIZE = 10_000
17
+
18
+ def __init__(
19
+ self,
20
+ threadpool: ThreadPoolExecutor,
21
+ logger: logging.Logger,
22
+ max_concurrent_tasks: int = DEFAULT_MAX_QUEUE_SIZE,
23
+ sleep_time: float = DEFAULT_SLEEP_TIME,
24
+ ):
25
+ """
26
+ :param threadpool: The threadpool to use
27
+ :param logger: The logger to use
28
+ :param max_concurrent_tasks: The maximum number of tasks that can be pending at the same time
29
+ :param sleep_time: How long to sleep if there are too many pending tasks
30
+ """
31
+ self._threadpool = threadpool
32
+ self._logger = logger
33
+ self._max_concurrent_tasks = max_concurrent_tasks
34
+ self._sleep_time = sleep_time
35
+ self._futures: List[Future[Any]] = []
36
+
37
+ def submit(self, function: Callable[..., Any], *args: Any) -> None:
38
+ # Submit a task to the threadpool, waiting if there are too many pending tasks
39
+ self._wait_while_too_many_pending_futures(self._futures)
40
+ self._futures.append(self._threadpool.submit(function, *args))
41
+
42
+ def _wait_while_too_many_pending_futures(self, futures: List[Future[Any]]) -> None:
43
+ # Wait until the number of pending tasks is < self._max_concurrent_tasks
44
+ while True:
45
+ self._prune_futures(futures)
46
+ if len(futures) < self._max_concurrent_tasks:
47
+ break
48
+ self._logger.info("Main thread is sleeping because the task queue is full...")
49
+ time.sleep(self._sleep_time)
50
+
51
+ def _prune_futures(self, futures: List[Future[Any]]) -> None:
52
+ """
53
+ Take a list in input and remove the futures that are completed. If a future has an exception, it'll raise and kill the stream
54
+ operation.
55
+
56
+ Pruning this list safely relies on the assumptions that only the main thread can modify the list of futures.
57
+ """
58
+ if len(futures) < self._max_concurrent_tasks:
59
+ return
60
+
61
+ for index in reversed(range(len(futures))):
62
+ future = futures[index]
63
+ optional_exception = future.exception()
64
+ if optional_exception:
65
+ exception = RuntimeError(f"Failed reading with error: {optional_exception}")
66
+ self._stop_and_raise_exception(exception)
67
+
68
+ if future.done():
69
+ futures.pop(index)
70
+
71
+ def shutdown(self) -> None:
72
+ self._threadpool.shutdown(wait=False, cancel_futures=True)
73
+
74
+ def is_done(self) -> bool:
75
+ return all([f.done() for f in self._futures])
76
+
77
+ def check_for_errors_and_shutdown(self) -> None:
78
+ """
79
+ Check if any of the futures have an exception, and raise it if so. If all futures are done, shutdown the threadpool.
80
+ If the futures are not done, raise an exception.
81
+ :return:
82
+ """
83
+ exceptions_from_futures = [f for f in [future.exception() for future in self._futures] if f is not None]
84
+ if exceptions_from_futures:
85
+ exception = RuntimeError(f"Failed reading with errors: {exceptions_from_futures}")
86
+ self._stop_and_raise_exception(exception)
87
+ else:
88
+ futures_not_done = [f for f in self._futures if not f.done()]
89
+ if futures_not_done:
90
+ exception = RuntimeError(f"Failed reading with futures not done: {futures_not_done}")
91
+ self._stop_and_raise_exception(exception)
92
+ else:
93
+ self.shutdown()
94
+
95
+ def _stop_and_raise_exception(self, exception: BaseException) -> None:
96
+ self.shutdown()
97
+ raise exception
@@ -7,7 +7,7 @@ from typing import Any, Iterable, Mapping, Optional
7
7
 
8
8
  from airbyte_cdk.models import AirbyteStream
9
9
  from airbyte_cdk.sources.streams.concurrent.availability_strategy import StreamAvailability
10
- from airbyte_cdk.sources.streams.concurrent.partitions.record import Record
10
+ from airbyte_cdk.sources.streams.concurrent.partitions.partition import Partition
11
11
  from deprecated.classic import deprecated
12
12
 
13
13
 
@@ -37,10 +37,10 @@ class AbstractStream(ABC):
37
37
  """
38
38
 
39
39
  @abstractmethod
40
- def read(self) -> Iterable[Record]:
40
+ def generate_partitions(self) -> Iterable[Partition]:
41
41
  """
42
- Read a stream in full refresh mode
43
- :return: The stream's records
42
+ Generates the partitions that will be read by this stream.
43
+ :return: An iterable of partitions.
44
44
  """
45
45
 
46
46
  @property