airbyte-cdk 0.59.1__tar.gz → 0.60.0__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (463) hide show
  1. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/PKG-INFO +1 -1
  2. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/entrypoint.py +3 -1
  3. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/concurrent_source/concurrent_source_adapter.py +3 -3
  4. airbyte-cdk-0.60.0/airbyte_cdk/sources/file_based/availability_strategy/__init__.py +7 -0
  5. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/availability_strategy/abstract_file_based_availability_strategy.py +20 -0
  6. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_based_source.py +79 -9
  7. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_types/csv_parser.py +5 -2
  8. airbyte-cdk-0.60.0/airbyte_cdk/sources/file_based/stream/concurrent/adapters.py +322 -0
  9. airbyte-cdk-0.60.0/airbyte_cdk/sources/file_based/stream/concurrent/cursor.py +87 -0
  10. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/stream/default_file_based_stream.py +6 -2
  11. airbyte-cdk-0.60.0/airbyte_cdk/sources/streams/concurrent/abstract_stream_facade.py +37 -0
  12. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/adapters.py +10 -52
  13. airbyte-cdk-0.60.0/airbyte_cdk/sources/streams/concurrent/helpers.py +31 -0
  14. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk.egg-info/PKG-INFO +1 -1
  15. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk.egg-info/SOURCES.txt +5 -0
  16. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/setup.py +1 -1
  17. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/file_types/test_csv_parser.py +12 -6
  18. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/in_memory_files_source.py +12 -2
  19. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/csv_scenarios.py +5 -25
  20. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/file_based_source_builder.py +6 -1
  21. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/jsonl_scenarios.py +2 -6
  22. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/parquet_scenarios.py +1 -0
  23. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/scenario_builder.py +8 -5
  24. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/validation_policy_scenarios.py +2 -73
  25. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/test_scenarios.py +20 -4
  26. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/scenarios/stream_facade_builder.py +3 -2
  27. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_source_builder.py +1 -1
  28. airbyte-cdk-0.60.0/unit_tests/utils/__init__.py +0 -0
  29. airbyte-cdk-0.59.1/airbyte_cdk/sources/file_based/availability_strategy/__init__.py +0 -4
  30. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/LICENSE.txt +0 -0
  31. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/README.md +0 -0
  32. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/__init__.py +0 -0
  33. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/config_observation.py +0 -0
  34. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/connector.py +0 -0
  35. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/connector_builder/__init__.py +0 -0
  36. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/connector_builder/connector_builder_handler.py +0 -0
  37. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/connector_builder/main.py +0 -0
  38. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/connector_builder/message_grouper.py +0 -0
  39. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/connector_builder/models.py +0 -0
  40. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/__init__.py +0 -0
  41. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/destination.py +0 -0
  42. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/vector_db_based/__init__.py +0 -0
  43. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/vector_db_based/config.py +0 -0
  44. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/vector_db_based/document_processor.py +0 -0
  45. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/vector_db_based/embedder.py +0 -0
  46. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/vector_db_based/indexer.py +0 -0
  47. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/vector_db_based/test_utils.py +0 -0
  48. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/vector_db_based/utils.py +0 -0
  49. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/destinations/vector_db_based/writer.py +0 -0
  50. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/exception_handler.py +0 -0
  51. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/logger.py +0 -0
  52. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/models/__init__.py +0 -0
  53. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/models/airbyte_protocol.py +0 -0
  54. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/models/well_known_types.py +0 -0
  55. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/py.typed +0 -0
  56. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/__init__.py +0 -0
  57. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/abstract_source.py +0 -0
  58. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/concurrent_source/__init__.py +0 -0
  59. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/concurrent_source/concurrent_read_processor.py +0 -0
  60. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/concurrent_source/concurrent_source.py +0 -0
  61. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/concurrent_source/partition_generation_completed_sentinel.py +0 -0
  62. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/concurrent_source/thread_pool_manager.py +0 -0
  63. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/config.py +0 -0
  64. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/connector_state_manager.py +0 -0
  65. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/__init__.py +0 -0
  66. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/auth/__init__.py +0 -0
  67. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/auth/declarative_authenticator.py +0 -0
  68. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/auth/oauth.py +0 -0
  69. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/auth/selective_authenticator.py +0 -0
  70. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/auth/token.py +0 -0
  71. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/auth/token_provider.py +0 -0
  72. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/checks/__init__.py +0 -0
  73. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/checks/check_stream.py +0 -0
  74. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/checks/connection_checker.py +0 -0
  75. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/create_partial.py +0 -0
  76. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/datetime/__init__.py +0 -0
  77. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/datetime/datetime_parser.py +0 -0
  78. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/datetime/min_max_datetime.py +0 -0
  79. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/declarative_component_schema.yaml +0 -0
  80. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/declarative_source.py +0 -0
  81. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/declarative_stream.py +0 -0
  82. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/decoders/__init__.py +0 -0
  83. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/decoders/decoder.py +0 -0
  84. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/decoders/json_decoder.py +0 -0
  85. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/exceptions.py +0 -0
  86. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/extractors/__init__.py +0 -0
  87. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/extractors/dpath_extractor.py +0 -0
  88. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/extractors/http_selector.py +0 -0
  89. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/extractors/record_extractor.py +0 -0
  90. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/extractors/record_filter.py +0 -0
  91. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/extractors/record_selector.py +0 -0
  92. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/incremental/__init__.py +0 -0
  93. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/incremental/cursor.py +0 -0
  94. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py +0 -0
  95. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py +0 -0
  96. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/interpolation/__init__.py +0 -0
  97. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/interpolation/filters.py +0 -0
  98. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_boolean.py +0 -0
  99. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_mapping.py +0 -0
  100. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_nested_mapping.py +0 -0
  101. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/interpolation/interpolated_string.py +0 -0
  102. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/interpolation/interpolation.py +0 -0
  103. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/interpolation/jinja.py +0 -0
  104. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/interpolation/macros.py +0 -0
  105. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/manifest_declarative_source.py +0 -0
  106. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/models/__init__.py +0 -0
  107. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/models/declarative_component_schema.py +0 -0
  108. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/parsers/__init__.py +0 -0
  109. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/parsers/class_types_registry.py +0 -0
  110. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/parsers/custom_exceptions.py +0 -0
  111. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/parsers/default_implementation_registry.py +0 -0
  112. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py +0 -0
  113. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py +0 -0
  114. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +0 -0
  115. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/partition_routers/__init__.py +0 -0
  116. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py +0 -0
  117. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/partition_routers/single_partition_router.py +0 -0
  118. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/partition_routers/substream_partition_router.py +0 -0
  119. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/__init__.py +0 -0
  120. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/__init__.py +0 -0
  121. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +0 -0
  122. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/constant_backoff_strategy.py +0 -0
  123. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/exponential_backoff_strategy.py +0 -0
  124. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/header_helper.py +0 -0
  125. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_time_from_header_backoff_strategy.py +0 -0
  126. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategies/wait_until_time_from_header_backoff_strategy.py +0 -0
  127. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/backoff_strategy.py +0 -0
  128. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/composite_error_handler.py +0 -0
  129. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/default_error_handler.py +0 -0
  130. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/error_handler.py +0 -0
  131. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/http_response_filter.py +0 -0
  132. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/response_action.py +0 -0
  133. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/error_handlers/response_status.py +0 -0
  134. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/http_requester.py +0 -0
  135. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/__init__.py +0 -0
  136. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +0 -0
  137. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/no_pagination.py +0 -0
  138. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/paginator.py +0 -0
  139. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/__init__.py +0 -0
  140. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/cursor_pagination_strategy.py +0 -0
  141. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py +0 -0
  142. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/page_increment.py +0 -0
  143. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/pagination_strategy.py +0 -0
  144. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/paginators/strategies/stop_condition.py +0 -0
  145. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/request_option.py +0 -0
  146. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/request_options/__init__.py +0 -0
  147. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_nested_request_input_provider.py +0 -0
  148. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_input_provider.py +0 -0
  149. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_options_provider.py +0 -0
  150. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/request_options/request_options_provider.py +0 -0
  151. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/request_path.py +0 -0
  152. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/requesters/requester.py +0 -0
  153. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/retrievers/__init__.py +0 -0
  154. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/retrievers/retriever.py +0 -0
  155. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +0 -0
  156. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/schema/__init__.py +0 -0
  157. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/schema/default_schema_loader.py +0 -0
  158. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/schema/inline_schema_loader.py +0 -0
  159. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/schema/json_file_schema_loader.py +0 -0
  160. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/schema/schema_loader.py +0 -0
  161. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/spec/__init__.py +0 -0
  162. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/spec/spec.py +0 -0
  163. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/stream_slicers/__init__.py +0 -0
  164. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/stream_slicers/cartesian_product_stream_slicer.py +0 -0
  165. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/stream_slicers/stream_slicer.py +0 -0
  166. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/transformations/__init__.py +0 -0
  167. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/transformations/add_fields.py +0 -0
  168. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/transformations/remove_fields.py +0 -0
  169. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/transformations/transformation.py +0 -0
  170. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/types.py +0 -0
  171. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/declarative/yaml_declarative_source.py +0 -0
  172. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/deprecated/__init__.py +0 -0
  173. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/deprecated/base_source.py +0 -0
  174. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/deprecated/client.py +0 -0
  175. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/embedded/__init__.py +0 -0
  176. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/embedded/base_integration.py +0 -0
  177. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/embedded/catalog.py +0 -0
  178. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/embedded/runner.py +0 -0
  179. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/embedded/tools.py +0 -0
  180. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/__init__.py +0 -0
  181. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/availability_strategy/default_file_based_availability_strategy.py +0 -0
  182. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/config/__init__.py +0 -0
  183. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py +0 -0
  184. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/config/avro_format.py +0 -0
  185. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/config/csv_format.py +0 -0
  186. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/config/file_based_stream_config.py +0 -0
  187. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/config/jsonl_format.py +0 -0
  188. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/config/parquet_format.py +0 -0
  189. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/config/unstructured_format.py +0 -0
  190. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/discovery_policy/__init__.py +0 -0
  191. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/discovery_policy/abstract_discovery_policy.py +0 -0
  192. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/discovery_policy/default_discovery_policy.py +0 -0
  193. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/exceptions.py +0 -0
  194. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_based_stream_reader.py +0 -0
  195. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_types/__init__.py +0 -0
  196. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_types/avro_parser.py +0 -0
  197. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_types/file_type_parser.py +0 -0
  198. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_types/jsonl_parser.py +0 -0
  199. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_types/parquet_parser.py +0 -0
  200. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/file_types/unstructured_parser.py +0 -0
  201. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/remote_file.py +0 -0
  202. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/schema_helpers.py +0 -0
  203. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/schema_validation_policies/__init__.py +0 -0
  204. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/schema_validation_policies/abstract_schema_validation_policy.py +0 -0
  205. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/schema_validation_policies/default_schema_validation_policies.py +0 -0
  206. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/stream/__init__.py +0 -0
  207. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/stream/abstract_file_based_stream.py +0 -0
  208. {airbyte-cdk-0.59.1/airbyte_cdk/sources/streams/concurrent/state_converters → airbyte-cdk-0.60.0/airbyte_cdk/sources/file_based/stream/concurrent}/__init__.py +0 -0
  209. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/stream/cursor/__init__.py +0 -0
  210. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/stream/cursor/abstract_file_based_cursor.py +0 -0
  211. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/stream/cursor/default_file_based_cursor.py +0 -0
  212. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/file_based/types.py +0 -0
  213. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/http_config.py +0 -0
  214. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/http_logger.py +0 -0
  215. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/message/__init__.py +0 -0
  216. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/message/repository.py +0 -0
  217. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/singer/__init__.py +0 -0
  218. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/singer/singer_helpers.py +0 -0
  219. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/singer/source.py +0 -0
  220. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/source.py +0 -0
  221. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/__init__.py +0 -0
  222. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/availability_strategy.py +0 -0
  223. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/call_rate.py +0 -0
  224. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/__init__.py +0 -0
  225. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/abstract_stream.py +0 -0
  226. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/availability_strategy.py +0 -0
  227. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/cursor.py +0 -0
  228. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/default_stream.py +0 -0
  229. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/exceptions.py +0 -0
  230. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/partition_enqueuer.py +0 -0
  231. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/partition_reader.py +0 -0
  232. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/partitions/__init__.py +0 -0
  233. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/partitions/partition.py +0 -0
  234. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/partitions/partition_generator.py +0 -0
  235. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/partitions/record.py +0 -0
  236. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/partitions/types.py +0 -0
  237. {airbyte-cdk-0.59.1/source_declarative_manifest → airbyte-cdk-0.60.0/airbyte_cdk/sources/streams/concurrent/state_converters}/__init__.py +0 -0
  238. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/state_converters/abstract_stream_state_converter.py +0 -0
  239. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/concurrent/state_converters/datetime_stream_state_converter.py +0 -0
  240. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/core.py +0 -0
  241. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/__init__.py +0 -0
  242. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/auth/__init__.py +0 -0
  243. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/auth/core.py +0 -0
  244. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/auth/oauth.py +0 -0
  245. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/auth/token.py +0 -0
  246. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/availability_strategy.py +0 -0
  247. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/exceptions.py +0 -0
  248. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/http.py +0 -0
  249. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/rate_limiting.py +0 -0
  250. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/requests_native_auth/__init__.py +0 -0
  251. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +0 -0
  252. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/requests_native_auth/abstract_token.py +0 -0
  253. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py +0 -0
  254. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/http/requests_native_auth/token.py +0 -0
  255. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/utils/__init__.py +0 -0
  256. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/streams/utils/stream_helper.py +0 -0
  257. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/utils/__init__.py +0 -0
  258. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/utils/casing.py +0 -0
  259. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/utils/catalog_helpers.py +0 -0
  260. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/utils/record_helper.py +0 -0
  261. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/utils/schema_helpers.py +0 -0
  262. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/utils/schema_models.py +0 -0
  263. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/utils/slice_logger.py +0 -0
  264. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/utils/transform.py +0 -0
  265. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/sources/utils/types.py +0 -0
  266. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/__init__.py +0 -0
  267. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/catalog_builder.py +0 -0
  268. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/entrypoint_wrapper.py +0 -0
  269. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/mock_http/__init__.py +0 -0
  270. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/mock_http/matcher.py +0 -0
  271. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/mock_http/mocker.py +0 -0
  272. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/mock_http/request.py +0 -0
  273. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/mock_http/response.py +0 -0
  274. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/mock_http/response_builder.py +0 -0
  275. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/test/state_builder.py +0 -0
  276. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/__init__.py +0 -0
  277. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/airbyte_secrets_utils.py +0 -0
  278. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/analytics_message.py +0 -0
  279. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/constants.py +0 -0
  280. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/datetime_format_inferrer.py +0 -0
  281. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/event_timing.py +0 -0
  282. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/is_cloud_environment.py +0 -0
  283. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/mapping_helpers.py +0 -0
  284. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/oneof_option_config.py +0 -0
  285. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/schema_inferrer.py +0 -0
  286. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/spec_schema_transformations.py +0 -0
  287. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/stream_status_utils.py +0 -0
  288. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk/utils/traced_exception.py +0 -0
  289. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk.egg-info/dependency_links.txt +0 -0
  290. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk.egg-info/requires.txt +0 -0
  291. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/airbyte_cdk.egg-info/top_level.txt +0 -0
  292. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/pyproject.toml +0 -0
  293. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/setup.cfg +0 -0
  294. {airbyte-cdk-0.59.1/unit_tests/destinations → airbyte-cdk-0.60.0/source_declarative_manifest}/__init__.py +0 -0
  295. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/source_declarative_manifest/main.py +0 -0
  296. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/connector_builder/__init__.py +0 -0
  297. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/connector_builder/test_connector_builder_handler.py +0 -0
  298. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/connector_builder/test_message_grouper.py +0 -0
  299. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/connector_builder/utils.py +0 -0
  300. {airbyte-cdk-0.59.1/unit_tests/singer → airbyte-cdk-0.60.0/unit_tests/destinations}/__init__.py +0 -0
  301. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/destinations/test_destination.py +0 -0
  302. {airbyte-cdk-0.59.1/unit_tests/sources → airbyte-cdk-0.60.0/unit_tests/singer}/__init__.py +0 -0
  303. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/singer/test_singer_helpers.py +0 -0
  304. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/singer/test_singer_source.py +0 -0
  305. {airbyte-cdk-0.59.1/unit_tests/sources/declarative/decoders → airbyte-cdk-0.60.0/unit_tests/sources}/__init__.py +0 -0
  306. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/concurrent_source/__init__.py +0 -0
  307. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/concurrent_source/test_concurrent_source_adapter.py +0 -0
  308. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/__init__.py +0 -0
  309. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/auth/__init__.py +0 -0
  310. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/auth/test_oauth.py +0 -0
  311. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/auth/test_selective_authenticator.py +0 -0
  312. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/auth/test_session_token_auth.py +0 -0
  313. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/auth/test_token_auth.py +0 -0
  314. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/auth/test_token_provider.py +0 -0
  315. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/checks/__init__.py +0 -0
  316. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/checks/test_check_stream.py +0 -0
  317. {airbyte-cdk-0.59.1/unit_tests/sources/declarative/incremental → airbyte-cdk-0.60.0/unit_tests/sources/declarative/decoders}/__init__.py +0 -0
  318. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/decoders/test_json_decoder.py +0 -0
  319. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/external_component.py +0 -0
  320. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/extractors/__init__.py +0 -0
  321. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/extractors/test_dpath_extractor.py +0 -0
  322. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/extractors/test_record_filter.py +0 -0
  323. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/extractors/test_record_selector.py +0 -0
  324. {airbyte-cdk-0.59.1/unit_tests/sources/file_based → airbyte-cdk-0.60.0/unit_tests/sources/declarative/incremental}/__init__.py +0 -0
  325. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/incremental/test_datetime_based_cursor.py +0 -0
  326. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/incremental/test_per_partition_cursor.py +0 -0
  327. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/incremental/test_per_partition_cursor_integration.py +0 -0
  328. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/interpolation/__init__.py +0 -0
  329. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/interpolation/test_filters.py +0 -0
  330. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/interpolation/test_interpolated_boolean.py +0 -0
  331. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/interpolation/test_interpolated_mapping.py +0 -0
  332. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/interpolation/test_interpolated_nested_mapping.py +0 -0
  333. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/interpolation/test_interpolated_string.py +0 -0
  334. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/interpolation/test_jinja.py +0 -0
  335. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/interpolation/test_macros.py +0 -0
  336. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/parsers/__init__.py +0 -0
  337. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/parsers/test_manifest_component_transformer.py +0 -0
  338. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/parsers/test_manifest_reference_resolver.py +0 -0
  339. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/parsers/test_model_to_component_factory.py +0 -0
  340. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/parsers/testing_components.py +0 -0
  341. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/partition_routers/__init__.py +0 -0
  342. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/partition_routers/test_list_partition_router.py +0 -0
  343. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/partition_routers/test_single_partition_router.py +0 -0
  344. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/partition_routers/test_substream_partition_router.py +0 -0
  345. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/__init__.py +0 -0
  346. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/__init__.py +0 -0
  347. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/__init__.py +0 -0
  348. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_constant_backoff.py +0 -0
  349. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_exponential_backoff.py +0 -0
  350. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_header_helper.py +0 -0
  351. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_wait_time_from_header.py +0 -0
  352. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/backoff_strategies/test_wait_until_time_from_header.py +0 -0
  353. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/test_composite_error_handler.py +0 -0
  354. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/test_default_error_handler.py +0 -0
  355. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/test_http_response_filter.py +0 -0
  356. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/error_handlers/test_response_status.py +0 -0
  357. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/paginators/__init__.py +0 -0
  358. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/paginators/test_cursor_pagination_strategy.py +0 -0
  359. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/paginators/test_default_paginator.py +0 -0
  360. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/paginators/test_no_paginator.py +0 -0
  361. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/paginators/test_offset_increment.py +0 -0
  362. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/paginators/test_page_increment.py +0 -0
  363. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/paginators/test_request_option.py +0 -0
  364. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/paginators/test_stop_condition.py +0 -0
  365. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/request_options/__init__.py +0 -0
  366. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/request_options/test_interpolated_request_options_provider.py +0 -0
  367. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/test_http_requester.py +0 -0
  368. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/requesters/test_interpolated_request_input_provider.py +0 -0
  369. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/retrievers/__init__.py +0 -0
  370. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/retrievers/test_simple_retriever.py +0 -0
  371. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/schema/__init__.py +0 -0
  372. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/schema/source_test/SourceTest.py +0 -0
  373. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/schema/source_test/__init__.py +0 -0
  374. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/schema/test_default_schema_loader.py +0 -0
  375. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/schema/test_inline_schema_loader.py +0 -0
  376. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/schema/test_json_file_schema_loader.py +0 -0
  377. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/states/__init__.py +0 -0
  378. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/stream_slicers/__init__.py +0 -0
  379. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/stream_slicers/test_cartesian_product_stream_slicer.py +0 -0
  380. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/test_create_partial.py +0 -0
  381. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/test_declarative_stream.py +0 -0
  382. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/test_manifest_declarative_source.py +0 -0
  383. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/declarative/test_yaml_declarative_source.py +0 -0
  384. {airbyte-cdk-0.59.1/unit_tests/sources/file_based/availability_strategy → airbyte-cdk-0.60.0/unit_tests/sources/file_based}/__init__.py +0 -0
  385. {airbyte-cdk-0.59.1/unit_tests/sources/file_based/config → airbyte-cdk-0.60.0/unit_tests/sources/file_based/availability_strategy}/__init__.py +0 -0
  386. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/availability_strategy/test_default_file_based_availability_strategy.py +0 -0
  387. {airbyte-cdk-0.59.1/unit_tests/sources/file_based/discovery_policy → airbyte-cdk-0.60.0/unit_tests/sources/file_based/config}/__init__.py +0 -0
  388. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/config/test_abstract_file_based_spec.py +0 -0
  389. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/config/test_csv_format.py +0 -0
  390. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/config/test_file_based_stream_config.py +0 -0
  391. {airbyte-cdk-0.59.1/unit_tests/sources/file_based/file_types → airbyte-cdk-0.60.0/unit_tests/sources/file_based/discovery_policy}/__init__.py +0 -0
  392. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/discovery_policy/test_default_discovery_policy.py +0 -0
  393. {airbyte-cdk-0.59.1/unit_tests/sources/file_based/scenarios → airbyte-cdk-0.60.0/unit_tests/sources/file_based/file_types}/__init__.py +0 -0
  394. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/file_types/test_avro_parser.py +0 -0
  395. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/file_types/test_jsonl_parser.py +0 -0
  396. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/file_types/test_parquet_parser.py +0 -0
  397. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/file_types/test_unstructured_parser.py +0 -0
  398. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/helpers.py +0 -0
  399. {airbyte-cdk-0.59.1/unit_tests/sources/file_based/stream → airbyte-cdk-0.60.0/unit_tests/sources/file_based/scenarios}/__init__.py +0 -0
  400. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/avro_scenarios.py +0 -0
  401. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/check_scenarios.py +0 -0
  402. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/incremental_scenarios.py +0 -0
  403. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/unstructured_scenarios.py +0 -0
  404. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/scenarios/user_input_schema_scenarios.py +0 -0
  405. {airbyte-cdk-0.59.1/unit_tests/sources/message → airbyte-cdk-0.60.0/unit_tests/sources/file_based/stream}/__init__.py +0 -0
  406. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/stream/test_default_file_based_cursor.py +0 -0
  407. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/stream/test_default_file_based_stream.py +0 -0
  408. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/test_file_based_scenarios.py +0 -0
  409. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/test_file_based_stream_reader.py +0 -0
  410. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/file_based/test_schema_helpers.py +0 -0
  411. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/fixtures/__init__.py +0 -0
  412. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/fixtures/source_test_fixture.py +0 -0
  413. {airbyte-cdk-0.59.1/unit_tests/sources/streams → airbyte-cdk-0.60.0/unit_tests/sources/message}/__init__.py +0 -0
  414. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/message/test_repository.py +0 -0
  415. {airbyte-cdk-0.59.1/unit_tests/sources/streams/http → airbyte-cdk-0.60.0/unit_tests/sources/streams}/__init__.py +0 -0
  416. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/__init__.py +0 -0
  417. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/scenarios/__init__.py +0 -0
  418. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/scenarios/incremental_scenarios.py +0 -0
  419. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/scenarios/stream_facade_scenarios.py +0 -0
  420. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/scenarios/test_concurrent_scenarios.py +0 -0
  421. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_scenarios.py +0 -0
  422. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/scenarios/utils.py +0 -0
  423. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/test_adapters.py +0 -0
  424. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/test_concurrent_read_processor.py +0 -0
  425. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/test_cursor.py +0 -0
  426. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/test_datetime_state_converter.py +0 -0
  427. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/test_default_stream.py +0 -0
  428. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/test_partition_enqueuer.py +0 -0
  429. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/test_partition_reader.py +0 -0
  430. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/concurrent/test_thread_pool_manager.py +0 -0
  431. {airbyte-cdk-0.59.1/unit_tests/sources/streams/http/auth → airbyte-cdk-0.60.0/unit_tests/sources/streams/http}/__init__.py +0 -0
  432. {airbyte-cdk-0.59.1/unit_tests/sources/streams/http/requests_native_auth → airbyte-cdk-0.60.0/unit_tests/sources/streams/http/auth}/__init__.py +0 -0
  433. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/http/auth/test_auth.py +0 -0
  434. {airbyte-cdk-0.59.1/unit_tests/test → airbyte-cdk-0.60.0/unit_tests/sources/streams/http/requests_native_auth}/__init__.py +0 -0
  435. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/http/requests_native_auth/test_requests_native_auth.py +0 -0
  436. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/http/test_availability_strategy.py +0 -0
  437. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/http/test_http.py +0 -0
  438. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/test_availability_strategy.py +0 -0
  439. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/test_call_rate.py +0 -0
  440. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/test_stream_read.py +0 -0
  441. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/streams/test_streams_core.py +0 -0
  442. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/test_abstract_source.py +0 -0
  443. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/test_concurrent_source.py +0 -0
  444. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/test_config.py +0 -0
  445. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/test_connector_state_manager.py +0 -0
  446. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/test_http_logger.py +0 -0
  447. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/test_integration_source.py +0 -0
  448. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/test_source.py +0 -0
  449. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/sources/test_source_read.py +0 -0
  450. {airbyte-cdk-0.59.1/unit_tests/test/mock_http → airbyte-cdk-0.60.0/unit_tests/test}/__init__.py +0 -0
  451. {airbyte-cdk-0.59.1/unit_tests/utils → airbyte-cdk-0.60.0/unit_tests/test/mock_http}/__init__.py +0 -0
  452. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/test/mock_http/test_matcher.py +0 -0
  453. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/test/mock_http/test_mocker.py +0 -0
  454. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/test/mock_http/test_request.py +0 -0
  455. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/test/mock_http/test_response_builder.py +0 -0
  456. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/test/test_entrypoint_wrapper.py +0 -0
  457. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/utils/test_datetime_format_inferrer.py +0 -0
  458. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/utils/test_mapping_helpers.py +0 -0
  459. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/utils/test_rate_limiting.py +0 -0
  460. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/utils/test_schema_inferrer.py +0 -0
  461. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/utils/test_secret_utils.py +0 -0
  462. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.0}/unit_tests/utils/test_stream_status_utils.py +0 -0
  463. {airbyte-cdk-0.59.1 → airbyte-cdk-0.60.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.59.1
3
+ Version: 0.60.0
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://github.com/airbytehq/airbyte
6
6
  Author: Airbyte
@@ -212,7 +212,9 @@ def launch(source: Source, args: List[str]) -> None:
212
212
  source_entrypoint = AirbyteEntrypoint(source)
213
213
  parsed_args = source_entrypoint.parse_args(args)
214
214
  for message in source_entrypoint.run(parsed_args):
215
- print(message)
215
+ # simply printing is creating issues for concurrent CDK as Python uses different two instructions to print: one for the message and
216
+ # the other for the break line. Adding `\n` to the message ensure that both are printed at the same time
217
+ print(f"{message}\n", end="")
216
218
 
217
219
 
218
220
  def _init_internal_request_filter() -> None:
@@ -10,7 +10,7 @@ from airbyte_cdk.sources import AbstractSource
10
10
  from airbyte_cdk.sources.concurrent_source.concurrent_source import ConcurrentSource
11
11
  from airbyte_cdk.sources.streams import Stream
12
12
  from airbyte_cdk.sources.streams.concurrent.abstract_stream import AbstractStream
13
- from airbyte_cdk.sources.streams.concurrent.adapters import StreamFacade
13
+ from airbyte_cdk.sources.streams.concurrent.abstract_stream_facade import AbstractStreamFacade
14
14
 
15
15
 
16
16
  class ConcurrentSourceAdapter(AbstractSource, ABC):
@@ -58,6 +58,6 @@ class ConcurrentSourceAdapter(AbstractSource, ABC):
58
58
  f"The stream {configured_stream.stream.name} no longer exists in the configuration. "
59
59
  f"Refresh the schema in replication settings and remove this stream from future sync attempts."
60
60
  )
61
- if isinstance(stream_instance, StreamFacade):
62
- abstract_streams.append(stream_instance._abstract_stream)
61
+ if isinstance(stream_instance, AbstractStreamFacade):
62
+ abstract_streams.append(stream_instance.get_underlying_stream())
63
63
  return abstract_streams
@@ -0,0 +1,7 @@
1
+ from .abstract_file_based_availability_strategy import (
2
+ AbstractFileBasedAvailabilityStrategy,
3
+ AbstractFileBasedAvailabilityStrategyWrapper,
4
+ )
5
+ from .default_file_based_availability_strategy import DefaultFileBasedAvailabilityStrategy
6
+
7
+ __all__ = ["AbstractFileBasedAvailabilityStrategy", "AbstractFileBasedAvailabilityStrategyWrapper", "DefaultFileBasedAvailabilityStrategy"]
@@ -8,6 +8,12 @@ from typing import TYPE_CHECKING, Optional, Tuple
8
8
 
9
9
  from airbyte_cdk.sources import Source
10
10
  from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy
11
+ from airbyte_cdk.sources.streams.concurrent.availability_strategy import (
12
+ AbstractAvailabilityStrategy,
13
+ StreamAvailability,
14
+ StreamAvailable,
15
+ StreamUnavailable,
16
+ )
11
17
  from airbyte_cdk.sources.streams.core import Stream
12
18
 
13
19
  if TYPE_CHECKING:
@@ -35,3 +41,17 @@ class AbstractFileBasedAvailabilityStrategy(AvailabilityStrategy):
35
41
  Returns (True, None) if successful, otherwise (False, <error message>).
36
42
  """
37
43
  ...
44
+
45
+
46
+ class AbstractFileBasedAvailabilityStrategyWrapper(AbstractAvailabilityStrategy):
47
+ def __init__(self, stream: "AbstractFileBasedStream"):
48
+ self.stream = stream
49
+
50
+ def check_availability(self, logger: logging.Logger) -> StreamAvailability:
51
+ is_available, reason = self.stream.availability_strategy.check_availability(self.stream, logger, None)
52
+ if is_available:
53
+ return StreamAvailable()
54
+ return StreamUnavailable(reason or "")
55
+
56
+ def check_availability_and_parsability(self, logger: logging.Logger) -> Tuple[bool, Optional[str]]:
57
+ return self.stream.availability_strategy.check_availability_and_parsability(self.stream, logger, None)
@@ -8,8 +8,18 @@ from abc import ABC
8
8
  from collections import Counter
9
9
  from typing import Any, Iterator, List, Mapping, MutableMapping, Optional, Tuple, Type, Union
10
10
 
11
- from airbyte_cdk.models import AirbyteMessage, AirbyteStateMessage, ConfiguredAirbyteCatalog, ConnectorSpecification
12
- from airbyte_cdk.sources import AbstractSource
11
+ from airbyte_cdk.logger import AirbyteLogFormatter, init_logger
12
+ from airbyte_cdk.models import (
13
+ AirbyteMessage,
14
+ AirbyteStateMessage,
15
+ ConfiguredAirbyteCatalog,
16
+ ConnectorSpecification,
17
+ FailureType,
18
+ Level,
19
+ SyncMode,
20
+ )
21
+ from airbyte_cdk.sources.concurrent_source.concurrent_source import ConcurrentSource
22
+ from airbyte_cdk.sources.concurrent_source.concurrent_source_adapter import ConcurrentSourceAdapter
13
23
  from airbyte_cdk.sources.file_based.availability_strategy import AbstractFileBasedAvailabilityStrategy, DefaultFileBasedAvailabilityStrategy
14
24
  from airbyte_cdk.sources.file_based.config.abstract_file_based_spec import AbstractFileBasedSpec
15
25
  from airbyte_cdk.sources.file_based.config.file_based_stream_config import FileBasedStreamConfig, ValidationPolicy
@@ -20,19 +30,33 @@ from airbyte_cdk.sources.file_based.file_types import default_parsers
20
30
  from airbyte_cdk.sources.file_based.file_types.file_type_parser import FileTypeParser
21
31
  from airbyte_cdk.sources.file_based.schema_validation_policies import DEFAULT_SCHEMA_VALIDATION_POLICIES, AbstractSchemaValidationPolicy
22
32
  from airbyte_cdk.sources.file_based.stream import AbstractFileBasedStream, DefaultFileBasedStream
33
+ from airbyte_cdk.sources.file_based.stream.concurrent.adapters import FileBasedStreamFacade
34
+ from airbyte_cdk.sources.file_based.stream.concurrent.cursor import FileBasedNoopCursor
23
35
  from airbyte_cdk.sources.file_based.stream.cursor import AbstractFileBasedCursor
24
36
  from airbyte_cdk.sources.file_based.stream.cursor.default_file_based_cursor import DefaultFileBasedCursor
37
+ from airbyte_cdk.sources.message.repository import InMemoryMessageRepository, MessageRepository
38
+ from airbyte_cdk.sources.source import TState
25
39
  from airbyte_cdk.sources.streams import Stream
26
40
  from airbyte_cdk.utils.analytics_message import create_analytics_message
41
+ from airbyte_cdk.utils.traced_exception import AirbyteTracedException
27
42
  from pydantic.error_wrappers import ValidationError
28
43
 
44
+ DEFAULT_CONCURRENCY = 100
45
+ MAX_CONCURRENCY = 100
46
+ INITIAL_N_PARTITIONS = MAX_CONCURRENCY // 2
47
+
48
+
49
+ class FileBasedSource(ConcurrentSourceAdapter, ABC):
50
+ # We make each source override the concurrency level to give control over when they are upgraded.
51
+ _concurrency_level = None
29
52
 
30
- class FileBasedSource(AbstractSource, ABC):
31
53
  def __init__(
32
54
  self,
33
55
  stream_reader: AbstractFileBasedStreamReader,
34
56
  spec_class: Type[AbstractFileBasedSpec],
35
- catalog_path: Optional[str] = None,
57
+ catalog: Optional[ConfiguredAirbyteCatalog],
58
+ config: Optional[Mapping[str, Any]],
59
+ state: Optional[TState],
36
60
  availability_strategy: Optional[AbstractFileBasedAvailabilityStrategy] = None,
37
61
  discovery_policy: AbstractDiscoveryPolicy = DefaultDiscoveryPolicy(),
38
62
  parsers: Mapping[Type[Any], FileTypeParser] = default_parsers,
@@ -41,15 +65,29 @@ class FileBasedSource(AbstractSource, ABC):
41
65
  ):
42
66
  self.stream_reader = stream_reader
43
67
  self.spec_class = spec_class
68
+ self.config = config
69
+ self.catalog = catalog
70
+ self.state = state
44
71
  self.availability_strategy = availability_strategy or DefaultFileBasedAvailabilityStrategy(stream_reader)
45
72
  self.discovery_policy = discovery_policy
46
73
  self.parsers = parsers
47
74
  self.validation_policies = validation_policies
48
- catalog = self.read_catalog(catalog_path) if catalog_path else None
49
75
  self.stream_schemas = {s.stream.name: s.stream.json_schema for s in catalog.streams} if catalog else {}
50
76
  self.cursor_cls = cursor_cls
51
- self.logger = logging.getLogger(f"airbyte.{self.name}")
77
+ self.logger = init_logger(f"airbyte.{self.name}")
52
78
  self.errors_collector: FileBasedErrorsCollector = FileBasedErrorsCollector()
79
+ self._message_repository: Optional[MessageRepository] = None
80
+ concurrent_source = ConcurrentSource.create(
81
+ MAX_CONCURRENCY, INITIAL_N_PARTITIONS, self.logger, self._slice_logger, self.message_repository
82
+ )
83
+ self._state = None
84
+ super().__init__(concurrent_source)
85
+
86
+ @property
87
+ def message_repository(self) -> MessageRepository:
88
+ if self._message_repository is None:
89
+ self._message_repository = InMemoryMessageRepository(Level(AirbyteLogFormatter.level_mapping[self.logger.level]))
90
+ return self._message_repository
53
91
 
54
92
  def check_connection(self, logger: logging.Logger, config: Mapping[str, Any]) -> Tuple[bool, Optional[Any]]:
55
93
  """
@@ -61,7 +99,15 @@ class FileBasedSource(AbstractSource, ABC):
61
99
 
62
100
  Otherwise, the "error" object should describe what went wrong.
63
101
  """
64
- streams = self.streams(config)
102
+ try:
103
+ streams = self.streams(config)
104
+ except Exception as config_exception:
105
+ raise AirbyteTracedException(
106
+ internal_message="Please check the logged errors for more information.",
107
+ message=FileBasedSourceError.CONFIG_VALIDATION_ERROR.value,
108
+ exception=AirbyteTracedException(exception=config_exception),
109
+ failure_type=FailureType.config_error,
110
+ )
65
111
  if len(streams) == 0:
66
112
  return (
67
113
  False,
@@ -80,7 +126,7 @@ class FileBasedSource(AbstractSource, ABC):
80
126
  reason,
81
127
  ) = stream.availability_strategy.check_availability_and_parsability(stream, logger, self)
82
128
  except Exception:
83
- errors.append(f"Unable to connect to stream {stream} - {''.join(traceback.format_exc())}")
129
+ errors.append(f"Unable to connect to stream {stream.name} - {''.join(traceback.format_exc())}")
84
130
  else:
85
131
  if not stream_is_available and reason:
86
132
  errors.append(reason)
@@ -91,10 +137,26 @@ class FileBasedSource(AbstractSource, ABC):
91
137
  """
92
138
  Return a list of this source's streams.
93
139
  """
140
+ file_based_streams = self._get_file_based_streams(config)
141
+
142
+ configured_streams: List[Stream] = []
143
+
144
+ for stream in file_based_streams:
145
+ sync_mode = self._get_sync_mode_from_catalog(stream)
146
+ if sync_mode == SyncMode.full_refresh and hasattr(self, "_concurrency_level") and self._concurrency_level is not None:
147
+ configured_streams.append(
148
+ FileBasedStreamFacade.create_from_stream(stream, self, self.logger, None, FileBasedNoopCursor(stream.config))
149
+ )
150
+ else:
151
+ configured_streams.append(stream)
152
+
153
+ return configured_streams
154
+
155
+ def _get_file_based_streams(self, config: Mapping[str, Any]) -> List[AbstractFileBasedStream]:
94
156
  try:
95
157
  parsed_config = self._get_parsed_config(config)
96
158
  self.stream_reader.config = parsed_config
97
- streams: List[Stream] = []
159
+ streams: List[AbstractFileBasedStream] = []
98
160
  for stream_config in parsed_config.streams:
99
161
  self._validate_input_schema(stream_config)
100
162
  streams.append(
@@ -115,6 +177,14 @@ class FileBasedSource(AbstractSource, ABC):
115
177
  except ValidationError as exc:
116
178
  raise ConfigValidationError(FileBasedSourceError.CONFIG_VALIDATION_ERROR) from exc
117
179
 
180
+ def _get_sync_mode_from_catalog(self, stream: Stream) -> Optional[SyncMode]:
181
+ if self.catalog:
182
+ for catalog_stream in self.catalog.streams:
183
+ if stream.name == catalog_stream.stream.name:
184
+ return catalog_stream.sync_mode
185
+ raise RuntimeError(f"No sync mode was found for {stream.name}.")
186
+ return None
187
+
118
188
  def read(
119
189
  self,
120
190
  logger: logging.Logger,
@@ -10,6 +10,7 @@ from collections import defaultdict
10
10
  from functools import partial
11
11
  from io import IOBase
12
12
  from typing import Any, Callable, Dict, Generator, Iterable, List, Mapping, Optional, Set, Tuple
13
+ from uuid import uuid4
13
14
 
14
15
  from airbyte_cdk.models import FailureType
15
16
  from airbyte_cdk.sources.file_based.config.csv_format import CsvFormat, CsvHeaderAutogenerated, CsvHeaderUserProvided, InferenceType
@@ -38,8 +39,10 @@ class _CsvReader:
38
39
 
39
40
  # Formats are configured individually per-stream so a unique dialect should be registered for each stream.
40
41
  # We don't unregister the dialect because we are lazily parsing each csv file to generate records
41
- # This will potentially be a problem if we ever process multiple streams concurrently
42
- dialect_name = config.name + DIALECT_NAME
42
+ # Give each stream's dialect a unique name; otherwise, when we are doing a concurrent sync we can end up
43
+ # with a race condition where a thread attempts to use a dialect before a separate thread has finished
44
+ # registering it.
45
+ dialect_name = f"{config.name}_{str(uuid4())}_{DIALECT_NAME}"
43
46
  csv.register_dialect(
44
47
  dialect_name,
45
48
  delimiter=config_format.delimiter,
@@ -0,0 +1,322 @@
1
+ #
2
+ # Copyright (c) 2024 Airbyte, Inc., all rights reserved.
3
+ #
4
+
5
+ import copy
6
+ import logging
7
+ from functools import lru_cache
8
+ from typing import Any, Iterable, List, Mapping, MutableMapping, Optional, Union
9
+
10
+ from airbyte_cdk.models import AirbyteLogMessage, AirbyteMessage, Level, SyncMode, Type
11
+ from airbyte_cdk.sources import AbstractSource
12
+ from airbyte_cdk.sources.connector_state_manager import ConnectorStateManager
13
+ from airbyte_cdk.sources.file_based.availability_strategy import (
14
+ AbstractFileBasedAvailabilityStrategy,
15
+ AbstractFileBasedAvailabilityStrategyWrapper,
16
+ )
17
+ from airbyte_cdk.sources.file_based.config.file_based_stream_config import PrimaryKeyType
18
+ from airbyte_cdk.sources.file_based.file_types.file_type_parser import FileTypeParser
19
+ from airbyte_cdk.sources.file_based.remote_file import RemoteFile
20
+ from airbyte_cdk.sources.file_based.stream import AbstractFileBasedStream
21
+ from airbyte_cdk.sources.file_based.stream.concurrent.cursor import FileBasedNoopCursor
22
+ from airbyte_cdk.sources.file_based.types import StreamSlice
23
+ from airbyte_cdk.sources.message import MessageRepository
24
+ from airbyte_cdk.sources.streams.concurrent.abstract_stream_facade import AbstractStreamFacade
25
+ from airbyte_cdk.sources.streams.concurrent.default_stream import DefaultStream
26
+ from airbyte_cdk.sources.streams.concurrent.exceptions import ExceptionWithDisplayMessage
27
+ from airbyte_cdk.sources.streams.concurrent.helpers import get_cursor_field_from_stream, get_primary_key_from_stream
28
+ from airbyte_cdk.sources.streams.concurrent.partitions.partition import Partition
29
+ from airbyte_cdk.sources.streams.concurrent.partitions.partition_generator import PartitionGenerator
30
+ from airbyte_cdk.sources.streams.concurrent.partitions.record import Record
31
+ from airbyte_cdk.sources.streams.core import StreamData
32
+ from airbyte_cdk.sources.utils.schema_helpers import InternalConfig
33
+ from airbyte_cdk.sources.utils.slice_logger import SliceLogger
34
+ from deprecated.classic import deprecated
35
+
36
+ """
37
+ This module contains adapters to help enabling concurrency on File-based Stream objects without needing to migrate to AbstractStream
38
+ """
39
+
40
+
41
+ @deprecated("This class is experimental. Use at your own risk.")
42
+ class FileBasedStreamFacade(AbstractStreamFacade[DefaultStream], AbstractFileBasedStream):
43
+ @classmethod
44
+ def create_from_stream(
45
+ cls,
46
+ stream: AbstractFileBasedStream,
47
+ source: AbstractSource,
48
+ logger: logging.Logger,
49
+ state: Optional[MutableMapping[str, Any]],
50
+ cursor: FileBasedNoopCursor,
51
+ ) -> "FileBasedStreamFacade":
52
+ """
53
+ Create a ConcurrentStream from a FileBasedStream object.
54
+ """
55
+ pk = get_primary_key_from_stream(stream.primary_key)
56
+ cursor_field = get_cursor_field_from_stream(stream)
57
+
58
+ if not source.message_repository:
59
+ raise ValueError(
60
+ "A message repository is required to emit non-record messages. Please set the message repository on the source."
61
+ )
62
+
63
+ message_repository = source.message_repository
64
+ return FileBasedStreamFacade(
65
+ DefaultStream( # type: ignore
66
+ partition_generator=FileBasedStreamPartitionGenerator(
67
+ stream,
68
+ message_repository,
69
+ SyncMode.full_refresh if isinstance(cursor, FileBasedNoopCursor) else SyncMode.incremental,
70
+ [cursor_field] if cursor_field is not None else None,
71
+ state,
72
+ cursor,
73
+ ),
74
+ name=stream.name,
75
+ json_schema=stream.get_json_schema(),
76
+ availability_strategy=AbstractFileBasedAvailabilityStrategyWrapper(stream),
77
+ primary_key=pk,
78
+ cursor_field=cursor_field,
79
+ logger=logger,
80
+ namespace=stream.namespace,
81
+ ),
82
+ stream,
83
+ cursor,
84
+ logger=logger,
85
+ slice_logger=source._slice_logger,
86
+ )
87
+
88
+ def __init__(
89
+ self,
90
+ stream: DefaultStream,
91
+ legacy_stream: AbstractFileBasedStream,
92
+ cursor: FileBasedNoopCursor,
93
+ slice_logger: SliceLogger,
94
+ logger: logging.Logger,
95
+ ):
96
+ """
97
+ :param stream: The underlying AbstractStream
98
+ """
99
+ # super().__init__(stream, legacy_stream, cursor, slice_logger, logger)
100
+ self._abstract_stream = stream
101
+ self._legacy_stream = legacy_stream
102
+ self._cursor = cursor
103
+ self._slice_logger = slice_logger
104
+ self._logger = logger
105
+ self.catalog_schema = legacy_stream.catalog_schema
106
+ self.config = legacy_stream.config
107
+ self.validation_policy = legacy_stream.validation_policy
108
+
109
+ @property
110
+ def cursor_field(self) -> Union[str, List[str]]:
111
+ if self._abstract_stream.cursor_field is None:
112
+ return []
113
+ else:
114
+ return self._abstract_stream.cursor_field
115
+
116
+ @property
117
+ def name(self) -> str:
118
+ return self._abstract_stream.name
119
+
120
+ @property
121
+ def supports_incremental(self) -> bool:
122
+ return self._legacy_stream.supports_incremental
123
+
124
+ @property
125
+ def availability_strategy(self) -> AbstractFileBasedAvailabilityStrategy:
126
+ return self._legacy_stream.availability_strategy
127
+
128
+ @lru_cache(maxsize=None)
129
+ def get_json_schema(self) -> Mapping[str, Any]:
130
+ return self._abstract_stream.get_json_schema()
131
+
132
+ @property
133
+ def primary_key(self) -> PrimaryKeyType:
134
+ return self._legacy_stream.config.primary_key or self.get_parser().get_parser_defined_primary_key(self._legacy_stream.config)
135
+
136
+ def get_parser(self) -> FileTypeParser:
137
+ return self._legacy_stream.get_parser()
138
+
139
+ def get_files(self) -> Iterable[RemoteFile]:
140
+ return self._legacy_stream.get_files()
141
+
142
+ def read_records_from_slice(self, stream_slice: StreamSlice) -> Iterable[Mapping[str, Any]]:
143
+ yield from self._legacy_stream.read_records_from_slice(stream_slice)
144
+
145
+ def compute_slices(self) -> Iterable[Optional[StreamSlice]]:
146
+ return self._legacy_stream.compute_slices()
147
+
148
+ def infer_schema(self, files: List[RemoteFile]) -> Mapping[str, Any]:
149
+ return self._legacy_stream.infer_schema(files)
150
+
151
+ def get_underlying_stream(self) -> DefaultStream:
152
+ return self._abstract_stream
153
+
154
+ def read_full_refresh(
155
+ self,
156
+ cursor_field: Optional[List[str]],
157
+ logger: logging.Logger,
158
+ slice_logger: SliceLogger,
159
+ ) -> Iterable[StreamData]:
160
+ """
161
+ Read full refresh. Delegate to the underlying AbstractStream, ignoring all the parameters
162
+ :param cursor_field: (ignored)
163
+ :param logger: (ignored)
164
+ :param slice_logger: (ignored)
165
+ :return: Iterable of StreamData
166
+ """
167
+ yield from self._read_records()
168
+
169
+ def read_incremental(
170
+ self,
171
+ cursor_field: Optional[List[str]],
172
+ logger: logging.Logger,
173
+ slice_logger: SliceLogger,
174
+ stream_state: MutableMapping[str, Any],
175
+ state_manager: ConnectorStateManager,
176
+ per_stream_state_enabled: bool,
177
+ internal_config: InternalConfig,
178
+ ) -> Iterable[StreamData]:
179
+ yield from self._read_records()
180
+
181
+ def read_records(
182
+ self,
183
+ sync_mode: SyncMode,
184
+ cursor_field: Optional[List[str]] = None,
185
+ stream_slice: Optional[Mapping[str, Any]] = None,
186
+ stream_state: Optional[Mapping[str, Any]] = None,
187
+ ) -> Iterable[StreamData]:
188
+ try:
189
+ yield from self._read_records()
190
+ except Exception as exc:
191
+ if hasattr(self._cursor, "state"):
192
+ state = str(self._cursor.state)
193
+ else:
194
+ # This shouldn't happen if the ConcurrentCursor was used
195
+ state = "unknown; no state attribute was available on the cursor"
196
+ yield AirbyteMessage(
197
+ type=Type.LOG, log=AirbyteLogMessage(level=Level.ERROR, message=f"Cursor State at time of exception: {state}")
198
+ )
199
+ raise exc
200
+
201
+ def _read_records(self) -> Iterable[StreamData]:
202
+ for partition in self._abstract_stream.generate_partitions():
203
+ if self._slice_logger.should_log_slice_message(self._logger):
204
+ yield self._slice_logger.create_slice_log_message(partition.to_slice())
205
+ for record in partition.read():
206
+ yield record.data
207
+
208
+
209
+ class FileBasedStreamPartition(Partition):
210
+ def __init__(
211
+ self,
212
+ stream: AbstractFileBasedStream,
213
+ _slice: Optional[Mapping[str, Any]],
214
+ message_repository: MessageRepository,
215
+ sync_mode: SyncMode,
216
+ cursor_field: Optional[List[str]],
217
+ state: Optional[MutableMapping[str, Any]],
218
+ cursor: FileBasedNoopCursor,
219
+ ):
220
+ self._stream = stream
221
+ self._slice = _slice
222
+ self._message_repository = message_repository
223
+ self._sync_mode = sync_mode
224
+ self._cursor_field = cursor_field
225
+ self._state = state
226
+ self._cursor = cursor
227
+ self._is_closed = False
228
+
229
+ def read(self) -> Iterable[Record]:
230
+ try:
231
+ for record_data in self._stream.read_records(
232
+ cursor_field=self._cursor_field,
233
+ sync_mode=SyncMode.full_refresh,
234
+ stream_slice=copy.deepcopy(self._slice),
235
+ stream_state=self._state,
236
+ ):
237
+ if isinstance(record_data, Mapping):
238
+ data_to_return = dict(record_data)
239
+ self._stream.transformer.transform(data_to_return, self._stream.get_json_schema())
240
+ yield Record(data_to_return, self.stream_name())
241
+ else:
242
+ self._message_repository.emit_message(record_data)
243
+ except Exception as e:
244
+ display_message = self._stream.get_error_display_message(e)
245
+ if display_message:
246
+ raise ExceptionWithDisplayMessage(display_message) from e
247
+ else:
248
+ raise e
249
+
250
+ def to_slice(self) -> Optional[Mapping[str, Any]]:
251
+ if self._slice is None:
252
+ return None
253
+ assert (
254
+ len(self._slice["files"]) == 1
255
+ ), f"Expected 1 file per partition but got {len(self._slice['files'])} for stream {self.stream_name()}"
256
+ file = self._slice["files"][0]
257
+ return {"files": [file]}
258
+
259
+ def close(self) -> None:
260
+ self._cursor.close_partition(self)
261
+ self._is_closed = True
262
+
263
+ def is_closed(self) -> bool:
264
+ return self._is_closed
265
+
266
+ def __hash__(self) -> int:
267
+ if self._slice:
268
+ # Convert the slice to a string so that it can be hashed
269
+ if len(self._slice["files"]) != 1:
270
+ raise ValueError(
271
+ f"Slices for file-based streams should be of length 1, but got {len(self._slice['files'])}. This is unexpected. Please contact Support."
272
+ )
273
+ else:
274
+ s = f"{self._slice['files'][0].last_modified.strftime('%Y-%m-%dT%H:%M:%S.%fZ')}_{self._slice['files'][0].uri}"
275
+ return hash((self._stream.name, s))
276
+ else:
277
+ return hash(self._stream.name)
278
+
279
+ def stream_name(self) -> str:
280
+ return self._stream.name
281
+
282
+ def __repr__(self) -> str:
283
+ return f"FileBasedStreamPartition({self._stream.name}, {self._slice})"
284
+
285
+
286
+ class FileBasedStreamPartitionGenerator(PartitionGenerator):
287
+ def __init__(
288
+ self,
289
+ stream: AbstractFileBasedStream,
290
+ message_repository: MessageRepository,
291
+ sync_mode: SyncMode,
292
+ cursor_field: Optional[List[str]],
293
+ state: Optional[MutableMapping[str, Any]],
294
+ cursor: FileBasedNoopCursor,
295
+ ):
296
+ self._stream = stream
297
+ self._message_repository = message_repository
298
+ self._sync_mode = sync_mode
299
+ self._cursor_field = cursor_field
300
+ self._state = state
301
+ self._cursor = cursor
302
+
303
+ def generate(self) -> Iterable[FileBasedStreamPartition]:
304
+ pending_partitions = []
305
+ for _slice in self._stream.stream_slices(sync_mode=self._sync_mode, cursor_field=self._cursor_field, stream_state=self._state):
306
+ if _slice is not None:
307
+ pending_partitions.extend(
308
+ [
309
+ FileBasedStreamPartition(
310
+ self._stream,
311
+ {"files": [copy.deepcopy(f)]},
312
+ self._message_repository,
313
+ self._sync_mode,
314
+ self._cursor_field,
315
+ self._state,
316
+ self._cursor,
317
+ )
318
+ for f in _slice.get("files", [])
319
+ ]
320
+ )
321
+ self._cursor.set_pending_partitions(pending_partitions)
322
+ yield from pending_partitions
@@ -0,0 +1,87 @@
1
+ #
2
+ # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
3
+ #
4
+ import logging
5
+ from abc import abstractmethod
6
+ from datetime import datetime
7
+ from typing import Any, Iterable, MutableMapping
8
+
9
+ from airbyte_cdk.sources.file_based.config.file_based_stream_config import FileBasedStreamConfig
10
+ from airbyte_cdk.sources.file_based.remote_file import RemoteFile
11
+ from airbyte_cdk.sources.file_based.stream.cursor import AbstractFileBasedCursor
12
+ from airbyte_cdk.sources.file_based.types import StreamState
13
+ from airbyte_cdk.sources.streams.concurrent.cursor import Cursor
14
+ from airbyte_cdk.sources.streams.concurrent.partitions.partition import Partition
15
+ from airbyte_cdk.sources.streams.concurrent.partitions.record import Record
16
+
17
+
18
+ class AbstractFileBasedConcurrentCursor(Cursor, AbstractFileBasedCursor):
19
+ @property
20
+ @abstractmethod
21
+ def state(self) -> MutableMapping[str, Any]:
22
+ ...
23
+
24
+ @abstractmethod
25
+ def add_file(self, file: RemoteFile) -> None:
26
+ ...
27
+
28
+ @abstractmethod
29
+ def set_initial_state(self, value: StreamState) -> None:
30
+ ...
31
+
32
+ @abstractmethod
33
+ def get_state(self) -> MutableMapping[str, Any]:
34
+ ...
35
+
36
+ @abstractmethod
37
+ def get_start_time(self) -> datetime:
38
+ ...
39
+
40
+ @abstractmethod
41
+ def get_files_to_sync(self, all_files: Iterable[RemoteFile], logger: logging.Logger) -> Iterable[RemoteFile]:
42
+ ...
43
+
44
+ @abstractmethod
45
+ def observe(self, record: Record) -> None:
46
+ ...
47
+
48
+ @abstractmethod
49
+ def close_partition(self, partition: Partition) -> None:
50
+ ...
51
+
52
+ @abstractmethod
53
+ def set_pending_partitions(self, partitions: Iterable[Partition]) -> None:
54
+ ...
55
+
56
+
57
+ class FileBasedNoopCursor(AbstractFileBasedConcurrentCursor):
58
+ def __init__(self, stream_config: FileBasedStreamConfig, **kwargs: Any):
59
+ pass
60
+
61
+ @property
62
+ def state(self) -> MutableMapping[str, Any]:
63
+ return {}
64
+
65
+ def add_file(self, file: RemoteFile) -> None:
66
+ return None
67
+
68
+ def set_initial_state(self, value: StreamState) -> None:
69
+ return None
70
+
71
+ def get_state(self) -> MutableMapping[str, Any]:
72
+ return {}
73
+
74
+ def get_start_time(self) -> datetime:
75
+ return datetime.min
76
+
77
+ def get_files_to_sync(self, all_files: Iterable[RemoteFile], logger: logging.Logger) -> Iterable[RemoteFile]:
78
+ return []
79
+
80
+ def observe(self, record: Record) -> None:
81
+ return None
82
+
83
+ def close_partition(self, partition: Partition) -> None:
84
+ return None
85
+
86
+ def set_pending_partitions(self, partitions: Iterable[Partition]) -> None:
87
+ return None