airbyte-cdk 0.58.8__tar.gz → 0.59.0__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (462) hide show
  1. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/PKG-INFO +1 -1
  2. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/concurrent_source/concurrent_read_processor.py +20 -21
  3. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/concurrent_source/concurrent_source.py +4 -3
  4. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/concurrent_source/thread_pool_manager.py +15 -18
  5. airbyte-cdk-0.59.0/airbyte_cdk/sources/concurrent_source/throttler.py +25 -0
  6. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/concurrent/cursor.py +29 -8
  7. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/concurrent/partition_enqueuer.py +3 -5
  8. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/concurrent/partition_reader.py +3 -4
  9. airbyte-cdk-0.59.0/airbyte_cdk/sources/streams/concurrent/partitions/throttled_queue.py +41 -0
  10. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/concurrent/state_converters/abstract_stream_state_converter.py +6 -12
  11. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/concurrent/state_converters/datetime_stream_state_converter.py +36 -30
  12. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk.egg-info/PKG-INFO +1 -1
  13. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk.egg-info/SOURCES.txt +4 -0
  14. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/setup.py +1 -1
  15. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/concurrent/scenarios/stream_facade_builder.py +2 -2
  16. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/concurrent/test_concurrent_partition_generator.py +4 -10
  17. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/concurrent/test_concurrent_read_processor.py +82 -12
  18. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/concurrent/test_cursor.py +20 -3
  19. airbyte-cdk-0.59.0/unit_tests/sources/streams/concurrent/test_datetime_state_converter.py +325 -0
  20. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/concurrent/test_thread_pool_manager.py +2 -15
  21. airbyte-cdk-0.59.0/unit_tests/sources/streams/concurrent/test_throttled_queue.py +65 -0
  22. airbyte-cdk-0.59.0/unit_tests/sources/streams/concurrent/test_throttler.py +13 -0
  23. airbyte-cdk-0.58.8/unit_tests/sources/streams/concurrent/test_datetime_state_converter.py +0 -427
  24. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/LICENSE.txt +0 -0
  25. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/README.md +0 -0
  26. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/__init__.py +0 -0
  27. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/config_observation.py +0 -0
  28. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/connector.py +0 -0
  29. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/connector_builder/__init__.py +0 -0
  30. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/connector_builder/connector_builder_handler.py +0 -0
  31. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/connector_builder/main.py +0 -0
  32. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/connector_builder/message_grouper.py +0 -0
  33. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/connector_builder/models.py +0 -0
  34. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/destinations/__init__.py +0 -0
  35. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/destinations/destination.py +0 -0
  36. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/destinations/vector_db_based/__init__.py +0 -0
  37. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/destinations/vector_db_based/config.py +0 -0
  38. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/destinations/vector_db_based/document_processor.py +0 -0
  39. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/destinations/vector_db_based/embedder.py +0 -0
  40. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/destinations/vector_db_based/indexer.py +0 -0
  41. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/destinations/vector_db_based/test_utils.py +0 -0
  42. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/destinations/vector_db_based/utils.py +0 -0
  43. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/destinations/vector_db_based/writer.py +0 -0
  44. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/entrypoint.py +0 -0
  45. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/exception_handler.py +0 -0
  46. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/logger.py +0 -0
  47. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/models/__init__.py +0 -0
  48. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/models/airbyte_protocol.py +0 -0
  49. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/models/well_known_types.py +0 -0
  50. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/py.typed +0 -0
  51. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/__init__.py +0 -0
  52. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/abstract_source.py +0 -0
  53. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/concurrent_source/__init__.py +0 -0
  54. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/concurrent_source/concurrent_source_adapter.py +0 -0
  55. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/concurrent_source/partition_generation_completed_sentinel.py +0 -0
  56. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/config.py +0 -0
  57. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/connector_state_manager.py +0 -0
  58. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/__init__.py +0 -0
  59. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/auth/__init__.py +0 -0
  60. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/auth/declarative_authenticator.py +0 -0
  61. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/auth/oauth.py +0 -0
  62. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/auth/selective_authenticator.py +0 -0
  63. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/auth/token.py +0 -0
  64. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/auth/token_provider.py +0 -0
  65. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/checks/__init__.py +0 -0
  66. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/checks/check_stream.py +0 -0
  67. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/checks/connection_checker.py +0 -0
  68. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/create_partial.py +0 -0
  69. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/datetime/__init__.py +0 -0
  70. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/datetime/datetime_parser.py +0 -0
  71. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/datetime/min_max_datetime.py +0 -0
  72. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/declarative_component_schema.yaml +0 -0
  73. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/declarative_source.py +0 -0
  74. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/declarative_stream.py +0 -0
  75. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/decoders/__init__.py +0 -0
  76. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/decoders/decoder.py +0 -0
  77. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/decoders/json_decoder.py +0 -0
  78. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/exceptions.py +0 -0
  79. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/extractors/__init__.py +0 -0
  80. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/extractors/dpath_extractor.py +0 -0
  81. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/extractors/http_selector.py +0 -0
  82. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/extractors/record_extractor.py +0 -0
  83. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/extractors/record_filter.py +0 -0
  84. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/extractors/record_selector.py +0 -0
  85. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/incremental/__init__.py +0 -0
  86. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/incremental/cursor.py +0 -0
  87. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +0 -0
  88. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py +0 -0
  89. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/interpolation/__init__.py +0 -0
  90. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/interpolation/filters.py +0 -0
  91. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_boolean.py +0 -0
  92. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_mapping.py +0 -0
  93. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_nested_mapping.py +0 -0
  94. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_string.py +0 -0
  95. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/interpolation/interpolation.py +0 -0
  96. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/interpolation/jinja.py +0 -0
  97. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/interpolation/macros.py +0 -0
  98. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/manifest_declarative_source.py +0 -0
  99. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/models/__init__.py +0 -0
  100. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/models/declarative_component_schema.py +0 -0
  101. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/parsers/__init__.py +0 -0
  102. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/parsers/class_types_registry.py +0 -0
  103. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/parsers/custom_exceptions.py +0 -0
  104. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/parsers/default_implementation_registry.py +0 -0
  105. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py +0 -0
  106. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py +0 -0
  107. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +0 -0
  108. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/partition_routers/__init__.py +0 -0
  109. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py +0 -0
  110. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/partition_routers/single_partition_router.py +0 -0
  111. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +0 -0
  112. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/__init__.py +0 -0
  113. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/__init__.py +0 -0
  114. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +0 -0
  115. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/constant_backoff_strategy.py +0 -0
  116. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/exponential_backoff_strategy.py +0 -0
  117. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/header_helper.py +0 -0
  118. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_time_from_header_backoff_strategy.py +0 -0
  119. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_until_time_from_header_backoff_strategy.py +0 -0
  120. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategy.py +0 -0
  121. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/composite_error_handler.py +0 -0
  122. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_error_handler.py +0 -0
  123. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/error_handler.py +0 -0
  124. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/http_response_filter.py +0 -0
  125. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/response_action.py +0 -0
  126. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/response_status.py +0 -0
  127. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/http_requester.py +0 -0
  128. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/paginators/__init__.py +0 -0
  129. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +0 -0
  130. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/paginators/no_pagination.py +0 -0
  131. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/paginators/paginator.py +0 -0
  132. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/__init__.py +0 -0
  133. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/cursor_pagination_strategy.py +0 -0
  134. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py +0 -0
  135. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/page_increment.py +0 -0
  136. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/pagination_strategy.py +0 -0
  137. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/stop_condition.py +0 -0
  138. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/request_option.py +0 -0
  139. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/request_options/__init__.py +0 -0
  140. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_nested_request_input_provider.py +0 -0
  141. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_input_provider.py +0 -0
  142. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_options_provider.py +0 -0
  143. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/request_options/request_options_provider.py +0 -0
  144. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/request_path.py +0 -0
  145. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/requesters/requester.py +0 -0
  146. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/retrievers/__init__.py +0 -0
  147. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/retrievers/retriever.py +0 -0
  148. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +0 -0
  149. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/schema/__init__.py +0 -0
  150. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/schema/default_schema_loader.py +0 -0
  151. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/schema/inline_schema_loader.py +0 -0
  152. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/schema/json_file_schema_loader.py +0 -0
  153. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/schema/schema_loader.py +0 -0
  154. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/spec/__init__.py +0 -0
  155. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/spec/spec.py +0 -0
  156. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/stream_slicers/__init__.py +0 -0
  157. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/stream_slicers/cartesian_product_stream_slicer.py +0 -0
  158. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/stream_slicers/stream_slicer.py +0 -0
  159. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/transformations/__init__.py +0 -0
  160. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/transformations/add_fields.py +0 -0
  161. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/transformations/remove_fields.py +0 -0
  162. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/transformations/transformation.py +0 -0
  163. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/types.py +0 -0
  164. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/declarative/yaml_declarative_source.py +0 -0
  165. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/deprecated/__init__.py +0 -0
  166. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/deprecated/base_source.py +0 -0
  167. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/deprecated/client.py +0 -0
  168. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/embedded/__init__.py +0 -0
  169. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/embedded/base_integration.py +0 -0
  170. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/embedded/catalog.py +0 -0
  171. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/embedded/runner.py +0 -0
  172. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/embedded/tools.py +0 -0
  173. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/__init__.py +0 -0
  174. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/availability_strategy/__init__.py +0 -0
  175. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/availability_strategy/abstract_file_based_availability_strategy.py +0 -0
  176. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/availability_strategy/default_file_based_availability_strategy.py +0 -0
  177. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/config/__init__.py +0 -0
  178. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py +0 -0
  179. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/config/avro_format.py +0 -0
  180. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/config/csv_format.py +0 -0
  181. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/config/file_based_stream_config.py +0 -0
  182. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/config/jsonl_format.py +0 -0
  183. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/config/parquet_format.py +0 -0
  184. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/config/unstructured_format.py +0 -0
  185. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/discovery_policy/__init__.py +0 -0
  186. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/discovery_policy/abstract_discovery_policy.py +0 -0
  187. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/discovery_policy/default_discovery_policy.py +0 -0
  188. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/exceptions.py +0 -0
  189. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/file_based_source.py +0 -0
  190. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/file_based_stream_reader.py +0 -0
  191. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/file_types/__init__.py +0 -0
  192. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/file_types/avro_parser.py +0 -0
  193. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/file_types/csv_parser.py +0 -0
  194. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/file_types/file_type_parser.py +0 -0
  195. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/file_types/jsonl_parser.py +0 -0
  196. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/file_types/parquet_parser.py +0 -0
  197. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/file_types/unstructured_parser.py +0 -0
  198. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/remote_file.py +0 -0
  199. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/schema_helpers.py +0 -0
  200. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/schema_validation_policies/__init__.py +0 -0
  201. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/schema_validation_policies/abstract_schema_validation_policy.py +0 -0
  202. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/schema_validation_policies/default_schema_validation_policies.py +0 -0
  203. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/stream/__init__.py +0 -0
  204. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/stream/abstract_file_based_stream.py +0 -0
  205. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/stream/cursor/__init__.py +0 -0
  206. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/stream/cursor/abstract_file_based_cursor.py +0 -0
  207. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/stream/cursor/default_file_based_cursor.py +0 -0
  208. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/stream/default_file_based_stream.py +0 -0
  209. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/file_based/types.py +0 -0
  210. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/http_config.py +0 -0
  211. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/http_logger.py +0 -0
  212. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/message/__init__.py +0 -0
  213. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/message/repository.py +0 -0
  214. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/singer/__init__.py +0 -0
  215. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/singer/singer_helpers.py +0 -0
  216. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/singer/source.py +0 -0
  217. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/source.py +0 -0
  218. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/__init__.py +0 -0
  219. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/availability_strategy.py +0 -0
  220. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/call_rate.py +0 -0
  221. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/concurrent/__init__.py +0 -0
  222. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/concurrent/abstract_stream.py +0 -0
  223. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/concurrent/adapters.py +0 -0
  224. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/concurrent/availability_strategy.py +0 -0
  225. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/concurrent/default_stream.py +0 -0
  226. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/concurrent/exceptions.py +0 -0
  227. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/concurrent/partitions/__init__.py +0 -0
  228. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/concurrent/partitions/partition.py +0 -0
  229. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/concurrent/partitions/partition_generator.py +0 -0
  230. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/concurrent/partitions/record.py +0 -0
  231. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/concurrent/partitions/types.py +0 -0
  232. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/concurrent/state_converters/__init__.py +0 -0
  233. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/core.py +0 -0
  234. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/http/__init__.py +0 -0
  235. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/http/auth/__init__.py +0 -0
  236. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/http/auth/core.py +0 -0
  237. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/http/auth/oauth.py +0 -0
  238. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/http/auth/token.py +0 -0
  239. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/http/availability_strategy.py +0 -0
  240. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/http/exceptions.py +0 -0
  241. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/http/http.py +0 -0
  242. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/http/rate_limiting.py +0 -0
  243. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/http/requests_native_auth/__init__.py +0 -0
  244. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +0 -0
  245. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_token.py +0 -0
  246. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py +0 -0
  247. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/http/requests_native_auth/token.py +0 -0
  248. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/utils/__init__.py +0 -0
  249. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/streams/utils/stream_helper.py +0 -0
  250. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/utils/__init__.py +0 -0
  251. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/utils/casing.py +0 -0
  252. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/utils/catalog_helpers.py +0 -0
  253. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/utils/record_helper.py +0 -0
  254. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/utils/schema_helpers.py +0 -0
  255. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/utils/schema_models.py +0 -0
  256. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/utils/slice_logger.py +0 -0
  257. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/utils/transform.py +0 -0
  258. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/sources/utils/types.py +0 -0
  259. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/test/__init__.py +0 -0
  260. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/test/catalog_builder.py +0 -0
  261. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/test/entrypoint_wrapper.py +0 -0
  262. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/test/mock_http/__init__.py +0 -0
  263. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/test/mock_http/matcher.py +0 -0
  264. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/test/mock_http/mocker.py +0 -0
  265. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/test/mock_http/request.py +0 -0
  266. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/test/mock_http/response.py +0 -0
  267. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/test/mock_http/response_builder.py +0 -0
  268. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/test/state_builder.py +0 -0
  269. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/utils/__init__.py +0 -0
  270. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/utils/airbyte_secrets_utils.py +0 -0
  271. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/utils/analytics_message.py +0 -0
  272. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/utils/constants.py +0 -0
  273. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/utils/datetime_format_inferrer.py +0 -0
  274. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/utils/event_timing.py +0 -0
  275. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/utils/is_cloud_environment.py +0 -0
  276. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/utils/mapping_helpers.py +0 -0
  277. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/utils/oneof_option_config.py +0 -0
  278. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/utils/schema_inferrer.py +0 -0
  279. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/utils/spec_schema_transformations.py +0 -0
  280. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/utils/stream_status_utils.py +0 -0
  281. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk/utils/traced_exception.py +0 -0
  282. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk.egg-info/dependency_links.txt +0 -0
  283. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk.egg-info/requires.txt +0 -0
  284. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/airbyte_cdk.egg-info/top_level.txt +0 -0
  285. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/pyproject.toml +0 -0
  286. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/setup.cfg +0 -0
  287. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/source_declarative_manifest/__init__.py +0 -0
  288. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/source_declarative_manifest/main.py +0 -0
  289. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/connector_builder/__init__.py +0 -0
  290. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/connector_builder/test_connector_builder_handler.py +0 -0
  291. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/connector_builder/test_message_grouper.py +0 -0
  292. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/connector_builder/utils.py +0 -0
  293. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/destinations/__init__.py +0 -0
  294. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/destinations/test_destination.py +0 -0
  295. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/singer/__init__.py +0 -0
  296. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/singer/test_singer_helpers.py +0 -0
  297. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/singer/test_singer_source.py +0 -0
  298. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/__init__.py +0 -0
  299. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/concurrent_source/__init__.py +0 -0
  300. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/concurrent_source/test_concurrent_source_adapter.py +0 -0
  301. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/__init__.py +0 -0
  302. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/auth/__init__.py +0 -0
  303. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/auth/test_oauth.py +0 -0
  304. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/auth/test_selective_authenticator.py +0 -0
  305. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/auth/test_session_token_auth.py +0 -0
  306. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/auth/test_token_auth.py +0 -0
  307. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/auth/test_token_provider.py +0 -0
  308. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/checks/__init__.py +0 -0
  309. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/checks/test_check_stream.py +0 -0
  310. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/decoders/__init__.py +0 -0
  311. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/decoders/test_json_decoder.py +0 -0
  312. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/external_component.py +0 -0
  313. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/extractors/__init__.py +0 -0
  314. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/extractors/test_dpath_extractor.py +0 -0
  315. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/extractors/test_record_filter.py +0 -0
  316. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/extractors/test_record_selector.py +0 -0
  317. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/incremental/__init__.py +0 -0
  318. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/incremental/test_datetime_based_cursor.py +0 -0
  319. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/incremental/test_per_partition_cursor.py +0 -0
  320. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/incremental/test_per_partition_cursor_integration.py +0 -0
  321. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/interpolation/__init__.py +0 -0
  322. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/interpolation/test_filters.py +0 -0
  323. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/interpolation/test_interpolated_boolean.py +0 -0
  324. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/interpolation/test_interpolated_mapping.py +0 -0
  325. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/interpolation/test_interpolated_nested_mapping.py +0 -0
  326. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/interpolation/test_interpolated_string.py +0 -0
  327. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/interpolation/test_jinja.py +0 -0
  328. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/interpolation/test_macros.py +0 -0
  329. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/parsers/__init__.py +0 -0
  330. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/parsers/test_manifest_component_transformer.py +0 -0
  331. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/parsers/test_manifest_reference_resolver.py +0 -0
  332. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/parsers/test_model_to_component_factory.py +0 -0
  333. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/parsers/testing_components.py +0 -0
  334. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/partition_routers/__init__.py +0 -0
  335. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/partition_routers/test_list_partition_router.py +0 -0
  336. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/partition_routers/test_single_partition_router.py +0 -0
  337. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/partition_routers/test_substream_partition_router.py +0 -0
  338. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/__init__.py +0 -0
  339. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/error_handlers/__init__.py +0 -0
  340. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +0 -0
  341. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_constant_backoff.py +0 -0
  342. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_exponential_backoff.py +0 -0
  343. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_header_helper.py +0 -0
  344. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_wait_time_from_header.py +0 -0
  345. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_wait_until_time_from_header.py +0 -0
  346. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/error_handlers/test_composite_error_handler.py +0 -0
  347. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/error_handlers/test_default_error_handler.py +0 -0
  348. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/error_handlers/test_http_response_filter.py +0 -0
  349. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/error_handlers/test_response_status.py +0 -0
  350. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/paginators/__init__.py +0 -0
  351. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/paginators/test_cursor_pagination_strategy.py +0 -0
  352. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/paginators/test_default_paginator.py +0 -0
  353. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/paginators/test_no_paginator.py +0 -0
  354. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/paginators/test_offset_increment.py +0 -0
  355. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/paginators/test_page_increment.py +0 -0
  356. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/paginators/test_request_option.py +0 -0
  357. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/paginators/test_stop_condition.py +0 -0
  358. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/request_options/__init__.py +0 -0
  359. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/request_options/test_interpolated_request_options_provider.py +0 -0
  360. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/test_http_requester.py +0 -0
  361. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/requesters/test_interpolated_request_input_provider.py +0 -0
  362. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/retrievers/__init__.py +0 -0
  363. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/retrievers/test_simple_retriever.py +0 -0
  364. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/schema/__init__.py +0 -0
  365. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/schema/source_test/SourceTest.py +0 -0
  366. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/schema/source_test/__init__.py +0 -0
  367. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/schema/test_default_schema_loader.py +0 -0
  368. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/schema/test_inline_schema_loader.py +0 -0
  369. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/schema/test_json_file_schema_loader.py +0 -0
  370. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/states/__init__.py +0 -0
  371. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/stream_slicers/__init__.py +0 -0
  372. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/stream_slicers/test_cartesian_product_stream_slicer.py +0 -0
  373. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/test_create_partial.py +0 -0
  374. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/test_declarative_stream.py +0 -0
  375. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/test_manifest_declarative_source.py +0 -0
  376. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/declarative/test_yaml_declarative_source.py +0 -0
  377. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/__init__.py +0 -0
  378. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/availability_strategy/__init__.py +0 -0
  379. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/availability_strategy/test_default_file_based_availability_strategy.py +0 -0
  380. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/config/__init__.py +0 -0
  381. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/config/test_abstract_file_based_spec.py +0 -0
  382. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/config/test_csv_format.py +0 -0
  383. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/config/test_file_based_stream_config.py +0 -0
  384. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/discovery_policy/__init__.py +0 -0
  385. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/discovery_policy/test_default_discovery_policy.py +0 -0
  386. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/file_types/__init__.py +0 -0
  387. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/file_types/test_avro_parser.py +0 -0
  388. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/file_types/test_csv_parser.py +0 -0
  389. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/file_types/test_jsonl_parser.py +0 -0
  390. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/file_types/test_parquet_parser.py +0 -0
  391. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/file_types/test_unstructured_parser.py +0 -0
  392. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/helpers.py +0 -0
  393. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/in_memory_files_source.py +0 -0
  394. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/scenarios/__init__.py +0 -0
  395. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/scenarios/avro_scenarios.py +0 -0
  396. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/scenarios/check_scenarios.py +0 -0
  397. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/scenarios/csv_scenarios.py +0 -0
  398. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/scenarios/file_based_source_builder.py +0 -0
  399. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/scenarios/incremental_scenarios.py +0 -0
  400. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/scenarios/jsonl_scenarios.py +0 -0
  401. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/scenarios/parquet_scenarios.py +0 -0
  402. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/scenarios/scenario_builder.py +0 -0
  403. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/scenarios/unstructured_scenarios.py +0 -0
  404. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/scenarios/user_input_schema_scenarios.py +0 -0
  405. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/scenarios/validation_policy_scenarios.py +0 -0
  406. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/stream/__init__.py +0 -0
  407. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/stream/test_default_file_based_cursor.py +0 -0
  408. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/stream/test_default_file_based_stream.py +0 -0
  409. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/test_file_based_scenarios.py +0 -0
  410. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/test_file_based_stream_reader.py +0 -0
  411. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/test_scenarios.py +0 -0
  412. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/file_based/test_schema_helpers.py +0 -0
  413. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/fixtures/__init__.py +0 -0
  414. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/fixtures/source_test_fixture.py +0 -0
  415. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/message/__init__.py +0 -0
  416. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/message/test_repository.py +0 -0
  417. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/__init__.py +0 -0
  418. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/concurrent/__init__.py +0 -0
  419. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/concurrent/scenarios/__init__.py +0 -0
  420. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/concurrent/scenarios/incremental_scenarios.py +0 -0
  421. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/concurrent/scenarios/stream_facade_scenarios.py +0 -0
  422. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/concurrent/scenarios/test_concurrent_scenarios.py +0 -0
  423. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_scenarios.py +0 -0
  424. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_source_builder.py +0 -0
  425. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/concurrent/scenarios/utils.py +0 -0
  426. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/concurrent/test_adapters.py +0 -0
  427. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/concurrent/test_default_stream.py +0 -0
  428. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/concurrent/test_partition_reader.py +0 -0
  429. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/http/__init__.py +0 -0
  430. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/http/auth/__init__.py +0 -0
  431. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/http/auth/test_auth.py +0 -0
  432. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/http/requests_native_auth/__init__.py +0 -0
  433. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/http/requests_native_auth/test_requests_native_auth.py +0 -0
  434. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/http/test_availability_strategy.py +0 -0
  435. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/http/test_http.py +0 -0
  436. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/test_availability_strategy.py +0 -0
  437. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/test_call_rate.py +0 -0
  438. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/test_stream_read.py +0 -0
  439. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/streams/test_streams_core.py +0 -0
  440. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/test_abstract_source.py +0 -0
  441. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/test_concurrent_source.py +0 -0
  442. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/test_config.py +0 -0
  443. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/test_connector_state_manager.py +0 -0
  444. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/test_http_logger.py +0 -0
  445. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/test_integration_source.py +0 -0
  446. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/test_source.py +0 -0
  447. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/sources/test_source_read.py +0 -0
  448. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/test/__init__.py +0 -0
  449. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/test/mock_http/__init__.py +0 -0
  450. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/test/mock_http/test_matcher.py +0 -0
  451. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/test/mock_http/test_mocker.py +0 -0
  452. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/test/mock_http/test_request.py +0 -0
  453. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/test/mock_http/test_response_builder.py +0 -0
  454. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/test/test_entrypoint_wrapper.py +0 -0
  455. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/utils/__init__.py +0 -0
  456. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/utils/test_datetime_format_inferrer.py +0 -0
  457. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/utils/test_mapping_helpers.py +0 -0
  458. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/utils/test_rate_limiting.py +0 -0
  459. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/utils/test_schema_inferrer.py +0 -0
  460. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/utils/test_secret_utils.py +0 -0
  461. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.0}/unit_tests/utils/test_stream_status_utils.py +0 -0
  462. {airbyte-cdk-0.58.8 → airbyte-cdk-0.59.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.58.8
3
+ Version: 0.59.0
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://github.com/airbytehq/airbyte
6
6
  Author: Airbyte
@@ -43,9 +43,9 @@ class ConcurrentReadProcessor:
43
43
  """
44
44
  self._stream_name_to_instance = {s.name: s for s in stream_instances_to_read_from}
45
45
  self._record_counter = {}
46
- self._streams_to_partitions: Dict[str, Set[Partition]] = {}
46
+ self._streams_to_running_partitions: Dict[str, Set[Partition]] = {}
47
47
  for stream in stream_instances_to_read_from:
48
- self._streams_to_partitions[stream.name] = set()
48
+ self._streams_to_running_partitions[stream.name] = set()
49
49
  self._record_counter[stream.name] = 0
50
50
  self._thread_pool_manager = thread_pool_manager
51
51
  self._partition_enqueuer = partition_enqueuer
@@ -55,6 +55,7 @@ class ConcurrentReadProcessor:
55
55
  self._slice_logger = slice_logger
56
56
  self._message_repository = message_repository
57
57
  self._partition_reader = partition_reader
58
+ self._streams_done: Set[str] = set()
58
59
 
59
60
  def on_partition_generation_completed(self, sentinel: PartitionGenerationCompletedSentinel) -> Iterable[AirbyteMessage]:
60
61
  """
@@ -67,7 +68,8 @@ class ConcurrentReadProcessor:
67
68
  self._streams_currently_generating_partitions.remove(sentinel.stream.name)
68
69
  ret = []
69
70
  # It is possible for the stream to already be done if no partitions were generated
70
- if self._is_stream_done(stream_name):
71
+ # If the partition generation process was completed and there are no partitions left to process, the stream is done
72
+ if self._is_stream_done(stream_name) or len(self._streams_to_running_partitions[stream_name]) == 0:
71
73
  ret.append(self._on_stream_is_done(stream_name))
72
74
  if self._stream_instances_to_start_partition_generation:
73
75
  ret.append(self.start_next_partition_generator())
@@ -81,7 +83,7 @@ class ConcurrentReadProcessor:
81
83
  3. Submit the partition to the thread pool manager
82
84
  """
83
85
  stream_name = partition.stream_name()
84
- self._streams_to_partitions[stream_name].add(partition)
86
+ self._streams_to_running_partitions[stream_name].add(partition)
85
87
  if self._slice_logger.should_log_slice_message(self._logger):
86
88
  self._message_repository.emit_message(self._slice_logger.create_slice_log_message(partition.to_slice()))
87
89
  self._thread_pool_manager.submit(self._partition_reader.process_partition, partition)
@@ -95,8 +97,12 @@ class ConcurrentReadProcessor:
95
97
  """
96
98
  partition = sentinel.partition
97
99
  partition.close()
98
- if self._is_stream_done(partition.stream_name()):
99
- yield self._on_stream_is_done(partition.stream_name())
100
+ partitions_running = self._streams_to_running_partitions[partition.stream_name()]
101
+ if partition in partitions_running:
102
+ partitions_running.remove(partition)
103
+ # If all partitions were generated and this was the last one, the stream is done
104
+ if partition.stream_name() not in self._streams_currently_generating_partitions and len(partitions_running) == 0:
105
+ yield self._on_stream_is_done(partition.stream_name())
100
106
  yield from self._message_repository.consume_queue()
101
107
 
102
108
  def on_record(self, record: Record) -> Iterable[AirbyteMessage]:
@@ -114,11 +120,10 @@ class ConcurrentReadProcessor:
114
120
  message = stream_data_to_airbyte_message(record.stream_name, record.data)
115
121
  stream = self._stream_name_to_instance[record.stream_name]
116
122
 
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
123
  if message.type == MessageType.RECORD:
124
+ if self._record_counter[stream.name] == 0:
125
+ self._logger.info(f"Marking stream {stream.name} as RUNNING")
126
+ yield stream_status_as_airbyte_message(stream.as_airbyte_stream(), AirbyteStreamStatus.RUNNING)
122
127
  self._record_counter[stream.name] += 1
123
128
  yield message
124
129
  yield from self._message_repository.consume_queue()
@@ -161,30 +166,24 @@ class ConcurrentReadProcessor:
161
166
  2. There are no more streams to read from
162
167
  3. All partitions for all streams are closed
163
168
  """
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
+ return all([self._is_stream_done(stream_name) for stream_name in self._stream_name_to_instance.keys()])
169
170
 
170
171
  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
- )
172
+ return stream_name in self._streams_done
175
173
 
176
174
  def _on_stream_is_done(self, stream_name: str) -> AirbyteMessage:
177
175
  self._logger.info(f"Read {self._record_counter[stream_name]} records from {stream_name} stream")
178
176
  self._logger.info(f"Marking stream {stream_name} as STOPPED")
179
177
  stream = self._stream_name_to_instance[stream_name]
180
178
  self._logger.info(f"Finished syncing {stream.name}")
179
+ self._streams_done.add(stream_name)
181
180
  return stream_status_as_airbyte_message(stream.as_airbyte_stream(), AirbyteStreamStatus.COMPLETE)
182
181
 
183
182
  def _stop_streams(self) -> Iterable[AirbyteMessage]:
184
183
  self._thread_pool_manager.shutdown()
185
- for stream_name, partitions in self._streams_to_partitions.items():
184
+ for stream_name in self._streams_to_running_partitions.keys():
186
185
  stream = self._stream_name_to_instance[stream_name]
187
- if not all([p.is_closed() for p in partitions]):
186
+ if not self._is_stream_done(stream_name):
188
187
  self._logger.info(f"Marking stream {stream.name} as STOPPED")
189
188
  self._logger.info(f"Finished syncing {stream.name}")
190
189
  yield stream_status_as_airbyte_message(stream.as_airbyte_stream(), AirbyteStreamStatus.INCOMPLETE)
@@ -16,6 +16,7 @@ from airbyte_cdk.sources.streams.concurrent.partition_enqueuer import PartitionE
16
16
  from airbyte_cdk.sources.streams.concurrent.partition_reader import PartitionReader
17
17
  from airbyte_cdk.sources.streams.concurrent.partitions.partition import Partition
18
18
  from airbyte_cdk.sources.streams.concurrent.partitions.record import Record
19
+ from airbyte_cdk.sources.streams.concurrent.partitions.throttled_queue import ThrottledQueue
19
20
  from airbyte_cdk.sources.streams.concurrent.partitions.types import PartitionCompleteSentinel, QueueItem
20
21
  from airbyte_cdk.sources.utils.slice_logger import DebugSliceLogger, SliceLogger
21
22
 
@@ -82,7 +83,7 @@ class ConcurrentSource:
82
83
  if not stream_instances_to_read_from:
83
84
  return
84
85
 
85
- queue: Queue[QueueItem] = Queue()
86
+ queue: ThrottledQueue = ThrottledQueue(Queue(), self._threadpool.get_throttler(), self._timeout_seconds)
86
87
  concurrent_stream_processor = ConcurrentReadProcessor(
87
88
  stream_instances_to_read_from,
88
89
  PartitionEnqueuer(queue),
@@ -112,10 +113,10 @@ class ConcurrentSource:
112
113
 
113
114
  def _consume_from_queue(
114
115
  self,
115
- queue: Queue[QueueItem],
116
+ queue: ThrottledQueue,
116
117
  concurrent_stream_processor: ConcurrentReadProcessor,
117
118
  ) -> Iterable[AirbyteMessage]:
118
- while airbyte_message_or_record_or_exception := queue.get(block=True, timeout=self._timeout_seconds):
119
+ while airbyte_message_or_record_or_exception := queue.get():
119
120
  yield from self._handle_item(
120
121
  airbyte_message_or_record_or_exception,
121
122
  concurrent_stream_processor,
@@ -2,10 +2,11 @@
2
2
  # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
3
3
  #
4
4
  import logging
5
- import time
6
5
  from concurrent.futures import Future, ThreadPoolExecutor
7
6
  from typing import Any, Callable, List
8
7
 
8
+ from airbyte_cdk.sources.concurrent_source.throttler import Throttler
9
+
9
10
 
10
11
  class ThreadPoolManager:
11
12
  """
@@ -19,8 +20,8 @@ class ThreadPoolManager:
19
20
  self,
20
21
  threadpool: ThreadPoolExecutor,
21
22
  logger: logging.Logger,
22
- max_concurrent_tasks: int = DEFAULT_MAX_QUEUE_SIZE,
23
23
  sleep_time: float = DEFAULT_SLEEP_TIME,
24
+ max_concurrent_tasks: int = DEFAULT_MAX_QUEUE_SIZE,
24
25
  ):
25
26
  """
26
27
  :param threadpool: The threadpool to use
@@ -31,23 +32,17 @@ class ThreadPoolManager:
31
32
  self._threadpool = threadpool
32
33
  self._logger = logger
33
34
  self._max_concurrent_tasks = max_concurrent_tasks
34
- self._sleep_time = sleep_time
35
35
  self._futures: List[Future[Any]] = []
36
+ self._throttler = Throttler(self._futures, sleep_time, max_concurrent_tasks)
37
+
38
+ def get_throttler(self) -> Throttler:
39
+ return self._throttler
36
40
 
37
41
  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)
42
+ # Submit a task to the threadpool, removing completed tasks if there are too many tasks in self._futures.
43
+ self._prune_futures(self._futures)
40
44
  self._futures.append(self._threadpool.submit(function, *args))
41
45
 
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
46
  def _prune_futures(self, futures: List[Future[Any]]) -> None:
52
47
  """
53
48
  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
@@ -60,12 +55,14 @@ class ThreadPoolManager:
60
55
 
61
56
  for index in reversed(range(len(futures))):
62
57
  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
58
 
68
59
  if future.done():
60
+ # Only call future.exception() if the future is known to be done because it will block until the future is done.
61
+ # See https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Future.exception
62
+ optional_exception = future.exception()
63
+ if optional_exception:
64
+ exception = RuntimeError(f"Failed reading with error: {optional_exception}")
65
+ self._stop_and_raise_exception(exception)
69
66
  futures.pop(index)
70
67
 
71
68
  def shutdown(self) -> None:
@@ -0,0 +1,25 @@
1
+ # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
2
+
3
+ import time
4
+ from concurrent.futures import Future
5
+ from typing import Any, List
6
+
7
+
8
+ class Throttler:
9
+ """
10
+ A throttler that waits until the number of concurrent tasks is below a certain threshold.
11
+ """
12
+
13
+ def __init__(self, futures_list: List[Future[Any]], sleep_time: float, max_concurrent_tasks: int):
14
+ """
15
+ :param futures_list: The list of futures to monitor
16
+ :param sleep_time: How long to sleep if there are too many pending tasks
17
+ :param max_concurrent_tasks: The maximum number of tasks that can be pending at the same time
18
+ """
19
+ self._futures_list = futures_list
20
+ self._sleep_time = sleep_time
21
+ self._max_concurrent_tasks = max_concurrent_tasks
22
+
23
+ def wait_and_acquire(self) -> None:
24
+ while len(self._futures_list) >= self._max_concurrent_tasks:
25
+ time.sleep(self._sleep_time)
@@ -3,7 +3,8 @@
3
3
  #
4
4
  import functools
5
5
  from abc import ABC, abstractmethod
6
- from typing import Any, List, Mapping, Optional, Protocol, Tuple
6
+ from datetime import datetime
7
+ from typing import Any, List, Mapping, MutableMapping, Optional, Protocol, Tuple
7
8
 
8
9
  from airbyte_cdk.sources.connector_state_manager import ConnectorStateManager
9
10
  from airbyte_cdk.sources.message import MessageRepository
@@ -36,6 +37,11 @@ class CursorField:
36
37
 
37
38
 
38
39
  class Cursor(ABC):
40
+ @property
41
+ @abstractmethod
42
+ def state(self) -> MutableMapping[str, Any]:
43
+ ...
44
+
39
45
  @abstractmethod
40
46
  def observe(self, record: Record) -> None:
41
47
  """
@@ -52,6 +58,10 @@ class Cursor(ABC):
52
58
 
53
59
 
54
60
  class NoopCursor(Cursor):
61
+ @property
62
+ def state(self) -> MutableMapping[str, Any]:
63
+ return {}
64
+
55
65
  def observe(self, record: Record) -> None:
56
66
  pass
57
67
 
@@ -73,6 +83,7 @@ class ConcurrentCursor(Cursor):
73
83
  connector_state_converter: AbstractStreamStateConverter,
74
84
  cursor_field: CursorField,
75
85
  slice_boundary_fields: Optional[Tuple[str, str]],
86
+ start: Optional[Any],
76
87
  ) -> None:
77
88
  self._stream_name = stream_name
78
89
  self._stream_namespace = stream_namespace
@@ -82,9 +93,19 @@ class ConcurrentCursor(Cursor):
82
93
  self._cursor_field = cursor_field
83
94
  # To see some example where the slice boundaries might not be defined, check https://github.com/airbytehq/airbyte/blob/1ce84d6396e446e1ac2377362446e3fb94509461/airbyte-integrations/connectors/source-stripe/source_stripe/streams.py#L363-L379
84
95
  self._slice_boundary_fields = slice_boundary_fields if slice_boundary_fields else tuple()
96
+ self._start = start
85
97
  self._most_recent_record: Optional[Record] = None
86
98
  self._has_closed_at_least_one_slice = False
87
- self.state = stream_state
99
+ self.start, self._concurrent_state = self._get_concurrent_state(stream_state)
100
+
101
+ @property
102
+ def state(self) -> MutableMapping[str, Any]:
103
+ return self._concurrent_state
104
+
105
+ def _get_concurrent_state(self, state: MutableMapping[str, Any]) -> Tuple[datetime, MutableMapping[str, Any]]:
106
+ if self._connector_state_converter.is_state_message_compatible(state):
107
+ return self._start or self._connector_state_converter.zero_value, self._connector_state_converter.deserialize(state)
108
+ return self._connector_state_converter.convert_from_sequential_state(self._cursor_field, state, self._start)
88
109
 
89
110
  def observe(self, record: Record) -> None:
90
111
  if self._slice_boundary_fields:
@@ -102,7 +123,7 @@ class ConcurrentCursor(Cursor):
102
123
  def close_partition(self, partition: Partition) -> None:
103
124
  slice_count_before = len(self.state.get("slices", []))
104
125
  self._add_slice_to_state(partition)
105
- if slice_count_before < len(self.state["slices"]):
126
+ if slice_count_before < len(self.state["slices"]): # only emit if at least one slice has been processed
106
127
  self._merge_partitions()
107
128
  self._emit_state_message()
108
129
  self._has_closed_at_least_one_slice = True
@@ -110,7 +131,9 @@ class ConcurrentCursor(Cursor):
110
131
  def _add_slice_to_state(self, partition: Partition) -> None:
111
132
  if self._slice_boundary_fields:
112
133
  if "slices" not in self.state:
113
- self.state["slices"] = []
134
+ raise RuntimeError(
135
+ f"The state for stream {self._stream_name} should have at least one slice to delineate the sync start time, but no slices are present. This is unexpected. Please contact Support."
136
+ )
114
137
  self.state["slices"].append(
115
138
  {
116
139
  "start": self._extract_from_slice(partition, self._slice_boundary_fields[self._START_BOUNDARY]),
@@ -126,10 +149,8 @@ class ConcurrentCursor(Cursor):
126
149
 
127
150
  self.state["slices"].append(
128
151
  {
129
- # TODO: if we migrate stored state to the concurrent state format, we may want this to be the config start date
130
- # instead of zero_value.
131
- "start": self._connector_state_converter.zero_value,
132
- "end": self._extract_cursor_value(self._most_recent_record),
152
+ self._connector_state_converter.START_KEY: self.start,
153
+ self._connector_state_converter.END_KEY: self._extract_cursor_value(self._most_recent_record),
133
154
  }
134
155
  )
135
156
 
@@ -2,11 +2,9 @@
2
2
  # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
3
3
  #
4
4
 
5
- from queue import Queue
6
-
7
5
  from airbyte_cdk.sources.concurrent_source.partition_generation_completed_sentinel import PartitionGenerationCompletedSentinel
8
6
  from airbyte_cdk.sources.streams.concurrent.abstract_stream import AbstractStream
9
- from airbyte_cdk.sources.streams.concurrent.partitions.types import QueueItem
7
+ from airbyte_cdk.sources.streams.concurrent.partitions.throttled_queue import ThrottledQueue
10
8
 
11
9
 
12
10
  class PartitionEnqueuer:
@@ -14,10 +12,10 @@ class PartitionEnqueuer:
14
12
  Generates partitions from a partition generator and puts them in a queue.
15
13
  """
16
14
 
17
- def __init__(self, queue: Queue[QueueItem]) -> None:
15
+ def __init__(self, queue: ThrottledQueue) -> None:
18
16
  """
19
17
  :param queue: The queue to put the partitions in.
20
- :param sentinel: The sentinel to put in the queue when all the partitions have been generated.
18
+ :param throttler: The throttler to use to throttle the partition generation.
21
19
  """
22
20
  self._queue = queue
23
21
 
@@ -2,10 +2,9 @@
2
2
  # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
3
3
  #
4
4
 
5
- from queue import Queue
6
-
7
5
  from airbyte_cdk.sources.streams.concurrent.partitions.partition import Partition
8
- from airbyte_cdk.sources.streams.concurrent.partitions.types import PartitionCompleteSentinel, QueueItem
6
+ from airbyte_cdk.sources.streams.concurrent.partitions.throttled_queue import ThrottledQueue
7
+ from airbyte_cdk.sources.streams.concurrent.partitions.types import PartitionCompleteSentinel
9
8
 
10
9
 
11
10
  class PartitionReader:
@@ -13,7 +12,7 @@ class PartitionReader:
13
12
  Generates records from a partition and puts them in a queue.
14
13
  """
15
14
 
16
- def __init__(self, queue: Queue[QueueItem]) -> None:
15
+ def __init__(self, queue: ThrottledQueue) -> None:
17
16
  """
18
17
  :param queue: The queue to put the records in.
19
18
  """
@@ -0,0 +1,41 @@
1
+ # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
2
+
3
+ from queue import Queue
4
+
5
+ from airbyte_cdk.sources.concurrent_source.throttler import Throttler
6
+ from airbyte_cdk.sources.streams.concurrent.partitions.types import QueueItem
7
+
8
+
9
+ class ThrottledQueue:
10
+ """
11
+ A queue that throttles the number of items that can be added to it.
12
+
13
+ We throttle the queue using custom logic instead of relying on the queue's max size
14
+ because the main thread can continuously dequeue before submitting a future.
15
+
16
+ Since the main thread doesn't wait, it'll be able to remove items from the queue even if the tasks should be throttled,
17
+ so the tasks won't wait.
18
+
19
+ This class solves this issue by checking if we should throttle the queue before adding an item to it.
20
+ An example implementation of a throttler would check if the number of pending futures is greater than a certain threshold.
21
+ """
22
+
23
+ def __init__(self, queue: Queue[QueueItem], throttler: Throttler, timeout: float) -> None:
24
+ """
25
+ :param queue: The queue to throttle
26
+ :param throttler: The throttler to use to throttle the queue
27
+ :param timeout: The timeout to use when getting items from the queue
28
+ """
29
+ self._queue = queue
30
+ self._throttler = throttler
31
+ self._timeout = timeout
32
+
33
+ def put(self, item: QueueItem) -> None:
34
+ self._throttler.wait_and_acquire()
35
+ self._queue.put(item)
36
+
37
+ def get(self) -> QueueItem:
38
+ return self._queue.get(block=True, timeout=self._timeout)
39
+
40
+ def empty(self) -> bool:
41
+ return self._queue.empty()
@@ -4,7 +4,7 @@
4
4
 
5
5
  from abc import ABC, abstractmethod
6
6
  from enum import Enum
7
- from typing import TYPE_CHECKING, Any, List, MutableMapping, Optional
7
+ from typing import TYPE_CHECKING, Any, List, MutableMapping, Tuple
8
8
 
9
9
  if TYPE_CHECKING:
10
10
  from airbyte_cdk.sources.streams.concurrent.cursor import CursorField
@@ -18,15 +18,6 @@ class AbstractStreamStateConverter(ABC):
18
18
  START_KEY = "start"
19
19
  END_KEY = "end"
20
20
 
21
- def get_concurrent_stream_state(
22
- self, cursor_field: Optional["CursorField"], state: MutableMapping[str, Any]
23
- ) -> Optional[MutableMapping[str, Any]]:
24
- if not cursor_field:
25
- return None
26
- if self.is_state_message_compatible(state):
27
- return self.deserialize(state)
28
- return self.convert_from_sequential_state(cursor_field, state)
29
-
30
21
  @abstractmethod
31
22
  def deserialize(self, state: MutableMapping[str, Any]) -> MutableMapping[str, Any]:
32
23
  """
@@ -40,8 +31,11 @@ class AbstractStreamStateConverter(ABC):
40
31
 
41
32
  @abstractmethod
42
33
  def convert_from_sequential_state(
43
- self, cursor_field: "CursorField", stream_state: MutableMapping[str, Any]
44
- ) -> MutableMapping[str, Any]:
34
+ self,
35
+ cursor_field: "CursorField",
36
+ stream_state: MutableMapping[str, Any],
37
+ start: Any,
38
+ ) -> Tuple[Any, MutableMapping[str, Any]]:
45
39
  """
46
40
  Convert the state message to the format required by the ConcurrentCursor.
47
41
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  from abc import abstractmethod
6
6
  from datetime import datetime, timedelta
7
- from typing import Any, List, MutableMapping, Optional
7
+ from typing import Any, List, MutableMapping, Optional, Tuple
8
8
 
9
9
  import pendulum
10
10
  from airbyte_cdk.sources.streams.concurrent.cursor import CursorField
@@ -16,9 +16,6 @@ from pendulum.datetime import DateTime
16
16
 
17
17
 
18
18
  class DateTimeStreamStateConverter(AbstractStreamStateConverter):
19
- START_KEY = "start"
20
- END_KEY = "end"
21
-
22
19
  @property
23
20
  @abstractmethod
24
21
  def _zero_value(self) -> Any:
@@ -62,7 +59,7 @@ class DateTimeStreamStateConverter(AbstractStreamStateConverter):
62
59
  for interval in sorted_intervals[1:]:
63
60
  last_end_time = merged_intervals[-1][self.END_KEY]
64
61
  current_start_time = interval[self.START_KEY]
65
- if self.compare_intervals(last_end_time, current_start_time):
62
+ if self._compare_intervals(last_end_time, current_start_time):
66
63
  merged_end_time = max(last_end_time, interval[self.END_KEY])
67
64
  merged_intervals[-1][self.END_KEY] = merged_end_time
68
65
  else:
@@ -70,10 +67,12 @@ class DateTimeStreamStateConverter(AbstractStreamStateConverter):
70
67
 
71
68
  return merged_intervals
72
69
 
73
- def compare_intervals(self, end_time: Any, start_time: Any) -> bool:
70
+ def _compare_intervals(self, end_time: Any, start_time: Any) -> bool:
74
71
  return bool(self.increment(end_time) >= start_time)
75
72
 
76
- def convert_from_sequential_state(self, cursor_field: CursorField, stream_state: MutableMapping[str, Any]) -> MutableMapping[str, Any]:
73
+ def convert_from_sequential_state(
74
+ self, cursor_field: CursorField, stream_state: MutableMapping[str, Any], start: datetime
75
+ ) -> Tuple[datetime, MutableMapping[str, Any]]:
77
76
  """
78
77
  Convert the state message to the format required by the ConcurrentCursor.
79
78
 
@@ -82,28 +81,35 @@ class DateTimeStreamStateConverter(AbstractStreamStateConverter):
82
81
  "state_type": ConcurrencyCompatibleStateType.date_range.value,
83
82
  "metadata": { … },
84
83
  "slices": [
85
- {starts: 0, end: "2021-01-18T21:18:20.000+00:00", finished_processing: true}]
84
+ {"start": "2021-01-18T21:18:20.000+00:00", "end": "2021-01-18T21:18:20.000+00:00"},
85
+ ]
86
86
  }
87
87
  """
88
+ sync_start = self._get_sync_start(cursor_field, stream_state, start)
88
89
  if self.is_state_message_compatible(stream_state):
89
- return stream_state
90
- if cursor_field.cursor_field_key in stream_state:
91
- slices = [
92
- {
93
- # TODO: if we migrate stored state to the concurrent state format, we may want this to be the config start date
94
- # instead of `zero_value`
95
- self.START_KEY: self.zero_value,
96
- self.END_KEY: self.parse_timestamp(stream_state[cursor_field.cursor_field_key]),
97
- },
98
- ]
99
- else:
100
- slices = []
101
- return {
90
+ return sync_start, stream_state
91
+
92
+ # Create a slice to represent the records synced during prior syncs.
93
+ # The start and end are the same to avoid confusion as to whether the records for this slice
94
+ # were actually synced
95
+ slices = [{self.START_KEY: sync_start, self.END_KEY: sync_start}]
96
+
97
+ return sync_start, {
102
98
  "state_type": ConcurrencyCompatibleStateType.date_range.value,
103
99
  "slices": slices,
104
100
  "legacy": stream_state,
105
101
  }
106
102
 
103
+ def _get_sync_start(self, cursor_field: CursorField, stream_state: MutableMapping[str, Any], start: Optional[Any]) -> datetime:
104
+ sync_start = self.parse_timestamp(start) if start is not None else self.zero_value
105
+ prev_sync_low_water_mark = (
106
+ self.parse_timestamp(stream_state[cursor_field.cursor_field_key]) if cursor_field.cursor_field_key in stream_state else None
107
+ )
108
+ if prev_sync_low_water_mark and prev_sync_low_water_mark >= sync_start:
109
+ return prev_sync_low_water_mark
110
+ else:
111
+ return sync_start
112
+
107
113
  def convert_to_sequential_state(self, cursor_field: CursorField, stream_state: MutableMapping[str, Any]) -> MutableMapping[str, Any]:
108
114
  """
109
115
  Convert the state message from the concurrency-compatible format to the stream's original format.
@@ -113,10 +119,9 @@ class DateTimeStreamStateConverter(AbstractStreamStateConverter):
113
119
  """
114
120
  if self.is_state_message_compatible(stream_state):
115
121
  legacy_state = stream_state.get("legacy", {})
116
- if slices := stream_state.pop("slices", None):
117
- latest_complete_time = self._get_latest_complete_time(slices)
118
- if latest_complete_time:
119
- legacy_state.update({cursor_field.cursor_field_key: self.output_format(latest_complete_time)})
122
+ latest_complete_time = self._get_latest_complete_time(stream_state.get("slices", []))
123
+ if latest_complete_time is not None:
124
+ legacy_state.update({cursor_field.cursor_field_key: self.output_format(latest_complete_time)})
120
125
  return legacy_state or {}
121
126
  else:
122
127
  return stream_state
@@ -125,11 +130,12 @@ class DateTimeStreamStateConverter(AbstractStreamStateConverter):
125
130
  """
126
131
  Get the latest time before which all records have been processed.
127
132
  """
128
- if slices:
129
- first_interval = self.merge_intervals(slices)[0][self.END_KEY]
130
- return first_interval
131
- else:
132
- return None
133
+ if not slices:
134
+ raise RuntimeError("Expected at least one slice but there were none. This is unexpected; please contact Support.")
135
+
136
+ merged_intervals = self.merge_intervals(slices)
137
+ first_interval = merged_intervals[0]
138
+ return first_interval[self.END_KEY]
133
139
 
134
140
 
135
141
  class EpochValueConcurrentStreamStateConverter(DateTimeStreamStateConverter):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-cdk
3
- Version: 0.58.8
3
+ Version: 0.59.0
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://github.com/airbytehq/airbyte
6
6
  Author: Airbyte
@@ -45,6 +45,7 @@ airbyte_cdk/sources/concurrent_source/concurrent_source.py
45
45
  airbyte_cdk/sources/concurrent_source/concurrent_source_adapter.py
46
46
  airbyte_cdk/sources/concurrent_source/partition_generation_completed_sentinel.py
47
47
  airbyte_cdk/sources/concurrent_source/thread_pool_manager.py
48
+ airbyte_cdk/sources/concurrent_source/throttler.py
48
49
  airbyte_cdk/sources/declarative/__init__.py
49
50
  airbyte_cdk/sources/declarative/create_partial.py
50
51
  airbyte_cdk/sources/declarative/declarative_component_schema.yaml
@@ -219,6 +220,7 @@ airbyte_cdk/sources/streams/concurrent/partitions/__init__.py
219
220
  airbyte_cdk/sources/streams/concurrent/partitions/partition.py
220
221
  airbyte_cdk/sources/streams/concurrent/partitions/partition_generator.py
221
222
  airbyte_cdk/sources/streams/concurrent/partitions/record.py
223
+ airbyte_cdk/sources/streams/concurrent/partitions/throttled_queue.py
222
224
  airbyte_cdk/sources/streams/concurrent/partitions/types.py
223
225
  airbyte_cdk/sources/streams/concurrent/state_converters/__init__.py
224
226
  airbyte_cdk/sources/streams/concurrent/state_converters/abstract_stream_state_converter.py
@@ -423,6 +425,8 @@ unit_tests/sources/streams/concurrent/test_datetime_state_converter.py
423
425
  unit_tests/sources/streams/concurrent/test_default_stream.py
424
426
  unit_tests/sources/streams/concurrent/test_partition_reader.py
425
427
  unit_tests/sources/streams/concurrent/test_thread_pool_manager.py
428
+ unit_tests/sources/streams/concurrent/test_throttled_queue.py
429
+ unit_tests/sources/streams/concurrent/test_throttler.py
426
430
  unit_tests/sources/streams/concurrent/scenarios/__init__.py
427
431
  unit_tests/sources/streams/concurrent/scenarios/incremental_scenarios.py
428
432
  unit_tests/sources/streams/concurrent/scenarios/stream_facade_builder.py
@@ -36,7 +36,7 @@ setup(
36
36
  name="airbyte-cdk",
37
37
  # The version of the airbyte-cdk package is used at runtime to validate manifests. That validation must be
38
38
  # updated if our semver format changes such as using release candidate versions.
39
- version="0.58.8",
39
+ version="0.59.0",
40
40
  description="A framework for writing Airbyte Connectors.",
41
41
  long_description=README,
42
42
  long_description_content_type="text/markdown",
@@ -52,8 +52,7 @@ class StreamFacadeSource(ConcurrentSourceAdapter):
52
52
  def streams(self, config: Mapping[str, Any]) -> List[Stream]:
53
53
  state_manager = ConnectorStateManager(stream_instance_map={s.name: s for s in self._streams}, state=self._state)
54
54
  state_converter = StreamFacadeConcurrentConnectorStateConverter()
55
- stream_states = [state_converter.get_concurrent_stream_state(self._cursor_field, state_manager.get_stream_state(stream.name, stream.namespace))
56
- for stream in self._streams]
55
+ stream_states = [state_manager.get_stream_state(stream.name, stream.namespace) for stream in self._streams]
57
56
  return [
58
57
  StreamFacade.create_from_stream(
59
58
  stream,
@@ -69,6 +68,7 @@ class StreamFacadeSource(ConcurrentSourceAdapter):
69
68
  state_converter,
70
69
  self._cursor_field,
71
70
  self._cursor_boundaries,
71
+ None,
72
72
  )
73
73
  if self._cursor_field
74
74
  else NoopCursor(),