airbyte-cdk 6.61.4__py3-none-any.whl → 6.61.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- airbyte_cdk/connector_builder/connector_builder_handler.py +7 -7
- airbyte_cdk/connector_builder/main.py +2 -2
- airbyte_cdk/connector_builder/test_reader/reader.py +2 -2
- airbyte_cdk/manifest_server/Dockerfile +2 -2
- airbyte_cdk/manifest_server/README.md +39 -3
- airbyte_cdk/manifest_server/app.py +6 -0
- airbyte_cdk/manifest_server/cli/_common.py +1 -0
- airbyte_cdk/manifest_server/command_processor/processor.py +2 -5
- airbyte_cdk/manifest_server/command_processor/utils.py +1 -1
- airbyte_cdk/manifest_server/routers/manifest.py +1 -1
- airbyte_cdk/sources/declarative/concurrent_declarative_source.py +5 -4
- airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py +4 -1
- airbyte_cdk/sources/declarative/stream_slicers/declarative_partition_generator.py +21 -7
- airbyte_cdk/sources/declarative/yaml_declarative_source.py +1 -1
- airbyte_cdk/sources/utils/schema_helpers.py +29 -9
- airbyte_cdk/sources/utils/transform.py +25 -13
- airbyte_cdk/utils/spec_schema_transformations.py +7 -5
- {airbyte_cdk-6.61.4.dist-info → airbyte_cdk-6.61.6.dist-info}/METADATA +9 -6
- {airbyte_cdk-6.61.4.dist-info → airbyte_cdk-6.61.6.dist-info}/RECORD +23 -23
- {airbyte_cdk-6.61.4.dist-info → airbyte_cdk-6.61.6.dist-info}/LICENSE.txt +0 -0
- {airbyte_cdk-6.61.4.dist-info → airbyte_cdk-6.61.6.dist-info}/LICENSE_SHORT +0 -0
- {airbyte_cdk-6.61.4.dist-info → airbyte_cdk-6.61.6.dist-info}/WHEEL +0 -0
- {airbyte_cdk-6.61.4.dist-info → airbyte_cdk-6.61.6.dist-info}/entry_points.txt +0 -0
@@ -62,10 +62,10 @@ def should_normalize_manifest(config: Mapping[str, Any]) -> bool:
|
|
62
62
|
|
63
63
|
def create_source(
|
64
64
|
config: Mapping[str, Any],
|
65
|
-
limits: TestLimits,
|
66
|
-
catalog:
|
67
|
-
state:
|
68
|
-
) -> ConcurrentDeclarativeSource
|
65
|
+
limits: TestLimits | None = None,
|
66
|
+
catalog: ConfiguredAirbyteCatalog | None = None,
|
67
|
+
state: List[AirbyteStateMessage] | None = None,
|
68
|
+
) -> ConcurrentDeclarativeSource:
|
69
69
|
manifest = config["__injected_declarative_manifest"]
|
70
70
|
|
71
71
|
# We enforce a concurrency level of 1 so that the stream is processed on a single thread
|
@@ -88,7 +88,7 @@ def create_source(
|
|
88
88
|
|
89
89
|
|
90
90
|
def read_stream(
|
91
|
-
source: ConcurrentDeclarativeSource
|
91
|
+
source: ConcurrentDeclarativeSource,
|
92
92
|
config: Mapping[str, Any],
|
93
93
|
configured_catalog: ConfiguredAirbyteCatalog,
|
94
94
|
state: List[AirbyteStateMessage],
|
@@ -127,7 +127,7 @@ def read_stream(
|
|
127
127
|
|
128
128
|
|
129
129
|
def resolve_manifest(
|
130
|
-
source: ConcurrentDeclarativeSource
|
130
|
+
source: ConcurrentDeclarativeSource,
|
131
131
|
) -> AirbyteMessage:
|
132
132
|
try:
|
133
133
|
return AirbyteMessage(
|
@@ -146,7 +146,7 @@ def resolve_manifest(
|
|
146
146
|
|
147
147
|
|
148
148
|
def full_resolve_manifest(
|
149
|
-
source: ConcurrentDeclarativeSource
|
149
|
+
source: ConcurrentDeclarativeSource, limits: TestLimits
|
150
150
|
) -> AirbyteMessage:
|
151
151
|
try:
|
152
152
|
manifest = {**source.resolved_manifest}
|
@@ -34,7 +34,7 @@ from airbyte_cdk.utils.traced_exception import AirbyteTracedException
|
|
34
34
|
|
35
35
|
def get_config_and_catalog_from_args(
|
36
36
|
args: List[str],
|
37
|
-
) -> Tuple[str, Mapping[str, Any], Optional[ConfiguredAirbyteCatalog],
|
37
|
+
) -> Tuple[str, Mapping[str, Any], Optional[ConfiguredAirbyteCatalog], List[AirbyteStateMessage]]:
|
38
38
|
# TODO: Add functionality for the `debug` logger.
|
39
39
|
# Currently, no one `debug` level log will be displayed during `read` a stream for a connector created through `connector-builder`.
|
40
40
|
parsed_args = AirbyteEntrypoint.parse_args(args)
|
@@ -70,7 +70,7 @@ def get_config_and_catalog_from_args(
|
|
70
70
|
|
71
71
|
|
72
72
|
def handle_connector_builder_request(
|
73
|
-
source: ConcurrentDeclarativeSource
|
73
|
+
source: ConcurrentDeclarativeSource,
|
74
74
|
command: str,
|
75
75
|
config: Mapping[str, Any],
|
76
76
|
catalog: Optional[ConfiguredAirbyteCatalog],
|
@@ -85,7 +85,7 @@ class TestReader:
|
|
85
85
|
|
86
86
|
def run_test_read(
|
87
87
|
self,
|
88
|
-
source: ConcurrentDeclarativeSource
|
88
|
+
source: ConcurrentDeclarativeSource,
|
89
89
|
config: Mapping[str, Any],
|
90
90
|
configured_catalog: ConfiguredAirbyteCatalog,
|
91
91
|
stream_name: str,
|
@@ -383,7 +383,7 @@ class TestReader:
|
|
383
383
|
|
384
384
|
def _read_stream(
|
385
385
|
self,
|
386
|
-
source: ConcurrentDeclarativeSource
|
386
|
+
source: ConcurrentDeclarativeSource,
|
387
387
|
config: Mapping[str, Any],
|
388
388
|
configured_catalog: ConfiguredAirbyteCatalog,
|
389
389
|
state: List[AirbyteStateMessage],
|
@@ -11,7 +11,7 @@ FROM python:3.12-slim-bookworm
|
|
11
11
|
RUN apt-get update && \
|
12
12
|
apt-get install -y git && \
|
13
13
|
rm -rf /var/lib/apt/lists/* && \
|
14
|
-
pip install poetry==
|
14
|
+
pip install poetry==2.0.1
|
15
15
|
|
16
16
|
# Configure poetry to not create virtual environments and disable interactive mode
|
17
17
|
ENV POETRY_NO_INTERACTION=1 \
|
@@ -42,4 +42,4 @@ USER airbyte:airbyte
|
|
42
42
|
|
43
43
|
EXPOSE 8080
|
44
44
|
|
45
|
-
CMD ["uvicorn", "airbyte_cdk.manifest_server.app:app", "--host", "0.0.0.0", "--port", "8080"]
|
45
|
+
CMD ["uvicorn", "airbyte_cdk.manifest_server.app:app", "--host", "0.0.0.0", "--port", "8080"]
|
@@ -37,26 +37,31 @@ The server will start on `http://localhost:8000` by default.
|
|
37
37
|
## API Endpoints
|
38
38
|
|
39
39
|
### `/v1/manifest/test_read`
|
40
|
+
|
40
41
|
Test reading from a specific stream in the manifest.
|
41
42
|
|
42
43
|
**POST** - Test stream reading with configurable limits for records, pages, and slices.
|
43
44
|
|
44
45
|
### `/v1/manifest/check`
|
46
|
+
|
45
47
|
Check configuration against a manifest.
|
46
48
|
|
47
49
|
**POST** - Validates connector configuration and returns success/failure status with message.
|
48
50
|
|
49
51
|
### `/v1/manifest/discover`
|
52
|
+
|
50
53
|
Discover streams from a manifest.
|
51
54
|
|
52
55
|
**POST** - Returns the catalog of available streams from the manifest.
|
53
56
|
|
54
|
-
### `/v1/manifest/resolve`
|
57
|
+
### `/v1/manifest/resolve`
|
58
|
+
|
55
59
|
Resolve a manifest to its final configuration.
|
56
60
|
|
57
61
|
**POST** - Returns the resolved manifest without dynamic stream generation.
|
58
62
|
|
59
63
|
### `/v1/manifest/full_resolve`
|
64
|
+
|
60
65
|
Fully resolve a manifest including dynamic streams.
|
61
66
|
|
62
67
|
**POST** - Generates dynamic streams up to specified limits and includes them in the resolved manifest.
|
@@ -68,6 +73,7 @@ The manifest server supports custom Python components, but this feature is **dis
|
|
68
73
|
### Enabling Custom Components
|
69
74
|
|
70
75
|
To allow custom Python components in your manifest files, set the environment variable:
|
76
|
+
|
71
77
|
```bash
|
72
78
|
export AIRBYTE_ENABLE_UNSAFE_CODE=true
|
73
79
|
```
|
@@ -77,20 +83,25 @@ export AIRBYTE_ENABLE_UNSAFE_CODE=true
|
|
77
83
|
The manifest server supports optional JWT bearer token authentication:
|
78
84
|
|
79
85
|
### Configuration
|
86
|
+
|
80
87
|
Set the environment variable to enable authentication:
|
88
|
+
|
81
89
|
```bash
|
82
90
|
export AB_JWT_SIGNATURE_SECRET="your-jwt-secret-key"
|
83
91
|
```
|
84
92
|
|
85
93
|
### Usage
|
94
|
+
|
86
95
|
When authentication is enabled, include a valid JWT token in the Authorization header:
|
96
|
+
|
87
97
|
```bash
|
88
98
|
curl -H "Authorization: Bearer <your-jwt-token>" \
|
89
99
|
http://localhost:8000/v1/manifest/test_read
|
90
100
|
```
|
91
101
|
|
92
102
|
### Behavior
|
93
|
-
|
103
|
+
|
104
|
+
- **Without `AB_JWT_SIGNATURE_SECRET`**: All requests pass through
|
94
105
|
- **With `AB_JWT_SIGNATURE_SECRET`**: Requires valid JWT bearer token using HS256 algorithm
|
95
106
|
|
96
107
|
## OpenAPI Specification
|
@@ -98,6 +109,7 @@ curl -H "Authorization: Bearer <your-jwt-token>" \
|
|
98
109
|
The manifest server provides an OpenAPI specification for API client generation:
|
99
110
|
|
100
111
|
### Generating the OpenAPI Spec
|
112
|
+
|
101
113
|
```bash
|
102
114
|
# Generate OpenAPI YAML (default location)
|
103
115
|
manifest-server generate-openapi
|
@@ -107,6 +119,7 @@ manifest-server generate-openapi --output /path/to/openapi.yaml
|
|
107
119
|
```
|
108
120
|
|
109
121
|
The generated OpenAPI specification is consumed by other applications and tools to:
|
122
|
+
|
110
123
|
- Generate API clients in various programming languages
|
111
124
|
- Create SDK bindings for the manifest server
|
112
125
|
- Provide API documentation and validation
|
@@ -115,6 +128,7 @@ The generated OpenAPI specification is consumed by other applications and tools
|
|
115
128
|
### Interactive API Documentation
|
116
129
|
|
117
130
|
When running, interactive API documentation is available at:
|
131
|
+
|
118
132
|
- Swagger UI: `http://localhost:8000/docs`
|
119
133
|
- ReDoc: `http://localhost:8000/redoc`
|
120
134
|
|
@@ -139,4 +153,26 @@ docker build -f airbyte_cdk/manifest_server/Dockerfile -t manifest-server .
|
|
139
153
|
docker run -p 8080:8080 manifest-server
|
140
154
|
```
|
141
155
|
|
142
|
-
Note: The container runs on port 8080 by default.
|
156
|
+
Note: The container runs on port 8080 by default.
|
157
|
+
|
158
|
+
## Datadog APM
|
159
|
+
|
160
|
+
The manifest server supports Datadog APM tracing for monitoring and observability:
|
161
|
+
|
162
|
+
### Configuration
|
163
|
+
|
164
|
+
To enable Datadog tracing, set the environment variable:
|
165
|
+
|
166
|
+
```bash
|
167
|
+
export DD_ENABLED=true
|
168
|
+
```
|
169
|
+
|
170
|
+
This requires the `ddtrace` dependency, which is included in the `manifest-server` extra. For additional configuration options via environment variables, see [ddtrace configuration](https://ddtrace.readthedocs.io/en/stable/configuration.html).
|
171
|
+
|
172
|
+
### Usage
|
173
|
+
|
174
|
+
```bash
|
175
|
+
# Run with Datadog tracing enabled
|
176
|
+
DD_ENABLED=true manifest-server start
|
177
|
+
```
|
178
|
+
|
@@ -21,12 +21,10 @@ from airbyte_cdk.test.entrypoint_wrapper import AirbyteEntrypointException, Entr
|
|
21
21
|
|
22
22
|
|
23
23
|
class ManifestCommandProcessor:
|
24
|
-
_source: ConcurrentDeclarativeSource
|
24
|
+
_source: ConcurrentDeclarativeSource
|
25
25
|
_logger = logging.getLogger("airbyte.manifest-server")
|
26
26
|
|
27
|
-
def __init__(
|
28
|
-
self, source: ConcurrentDeclarativeSource[Optional[List[AirbyteStateMessage]]]
|
29
|
-
) -> None:
|
27
|
+
def __init__(self, source: ConcurrentDeclarativeSource) -> None:
|
30
28
|
self._source = source
|
31
29
|
|
32
30
|
def test_read(
|
@@ -41,7 +39,6 @@ class ManifestCommandProcessor:
|
|
41
39
|
"""
|
42
40
|
Test the read method of the source.
|
43
41
|
"""
|
44
|
-
|
45
42
|
test_read_handler = TestReader(
|
46
43
|
max_pages_per_slice=page_limit,
|
47
44
|
max_slices=slice_limit,
|
@@ -63,7 +63,7 @@ def build_source(
|
|
63
63
|
record_limit: Optional[int] = None,
|
64
64
|
page_limit: Optional[int] = None,
|
65
65
|
slice_limit: Optional[int] = None,
|
66
|
-
) -> ConcurrentDeclarativeSource
|
66
|
+
) -> ConcurrentDeclarativeSource:
|
67
67
|
# We enforce a concurrency level of 1 so that the stream is processed on a single thread
|
68
68
|
# to retain ordering for the grouping of the builder message responses.
|
69
69
|
definition = copy.deepcopy(manifest)
|
@@ -40,7 +40,7 @@ def safe_build_source(
|
|
40
40
|
page_limit: Optional[int] = None,
|
41
41
|
slice_limit: Optional[int] = None,
|
42
42
|
record_limit: Optional[int] = None,
|
43
|
-
) -> ConcurrentDeclarativeSource
|
43
|
+
) -> ConcurrentDeclarativeSource:
|
44
44
|
"""Wrapper around build_source that converts ValidationError to HTTPException."""
|
45
45
|
try:
|
46
46
|
return build_source(
|
@@ -162,16 +162,17 @@ def _get_declarative_component_schema() -> Dict[str, Any]:
|
|
162
162
|
# is no longer inherited from since the only external dependency is from that class.
|
163
163
|
#
|
164
164
|
# todo: It is worth investigating removal of the Generic[TState] since it will always be Optional[List[AirbyteStateMessage]]
|
165
|
-
class ConcurrentDeclarativeSource(AbstractSource
|
165
|
+
class ConcurrentDeclarativeSource(AbstractSource):
|
166
166
|
# By default, we defer to a value of 2. A value lower than could cause a PartitionEnqueuer to be stuck in a state of deadlock
|
167
167
|
# because it has hit the limit of futures but not partition reader is consuming them.
|
168
168
|
_LOWEST_SAFE_CONCURRENCY_LEVEL = 2
|
169
169
|
|
170
170
|
def __init__(
|
171
171
|
self,
|
172
|
-
catalog: Optional[ConfiguredAirbyteCatalog],
|
173
|
-
config: Optional[Mapping[str, Any]],
|
174
|
-
state:
|
172
|
+
catalog: Optional[ConfiguredAirbyteCatalog] = None,
|
173
|
+
config: Optional[Mapping[str, Any]] = None,
|
174
|
+
state: Optional[List[AirbyteStateMessage]] = None,
|
175
|
+
*,
|
175
176
|
source_config: ConnectionDefinition,
|
176
177
|
debug: bool = False,
|
177
178
|
emit_connector_builder_messages: bool = False,
|
@@ -149,6 +149,7 @@ class CartesianProductStreamSlicer(PartitionRouter):
|
|
149
149
|
for stream_slice_tuple in product:
|
150
150
|
partition = dict(ChainMap(*[s.partition for s in stream_slice_tuple])) # type: ignore # ChainMap expects a MutableMapping[Never, Never] for reasons
|
151
151
|
cursor_slices = [s.cursor_slice for s in stream_slice_tuple if s.cursor_slice]
|
152
|
+
extra_fields = dict(ChainMap(*[s.extra_fields for s in stream_slice_tuple])) # type: ignore # ChainMap expects a MutableMapping[Never, Never] for reasons
|
152
153
|
if len(cursor_slices) > 1:
|
153
154
|
raise ValueError(
|
154
155
|
f"There should only be a single cursor slice. Found {cursor_slices}"
|
@@ -157,7 +158,9 @@ class CartesianProductStreamSlicer(PartitionRouter):
|
|
157
158
|
cursor_slice = cursor_slices[0]
|
158
159
|
else:
|
159
160
|
cursor_slice = {}
|
160
|
-
yield StreamSlice(
|
161
|
+
yield StreamSlice(
|
162
|
+
partition=partition, cursor_slice=cursor_slice, extra_fields=extra_fields
|
163
|
+
)
|
161
164
|
|
162
165
|
def set_initial_state(self, stream_state: StreamState) -> None:
|
163
166
|
"""
|
@@ -14,10 +14,21 @@ from airbyte_cdk.sources.streams.concurrent.partitions.stream_slicer import Stre
|
|
14
14
|
from airbyte_cdk.sources.types import Record, StreamSlice
|
15
15
|
from airbyte_cdk.utils.slice_hasher import SliceHasher
|
16
16
|
|
17
|
+
|
17
18
|
# For Connector Builder test read operations, we track the total number of records
|
18
|
-
# read for the stream
|
19
|
-
|
20
|
-
|
19
|
+
# read for the stream so that we can stop reading early if we exceed the record limit.
|
20
|
+
class RecordCounter:
|
21
|
+
def __init__(self) -> None:
|
22
|
+
self.total_record_counter = 0
|
23
|
+
|
24
|
+
def increment(self) -> None:
|
25
|
+
self.total_record_counter += 1
|
26
|
+
|
27
|
+
def reset(self) -> None:
|
28
|
+
self.total_record_counter = 0
|
29
|
+
|
30
|
+
def get_total_records(self) -> int:
|
31
|
+
return self.total_record_counter
|
21
32
|
|
22
33
|
|
23
34
|
class SchemaLoaderCachingDecorator(SchemaLoader):
|
@@ -51,6 +62,7 @@ class DeclarativePartitionFactory:
|
|
51
62
|
self._retriever = retriever
|
52
63
|
self._message_repository = message_repository
|
53
64
|
self._max_records_limit = max_records_limit
|
65
|
+
self._record_counter = RecordCounter()
|
54
66
|
|
55
67
|
def create(self, stream_slice: StreamSlice) -> Partition:
|
56
68
|
return DeclarativePartition(
|
@@ -60,6 +72,7 @@ class DeclarativePartitionFactory:
|
|
60
72
|
message_repository=self._message_repository,
|
61
73
|
max_records_limit=self._max_records_limit,
|
62
74
|
stream_slice=stream_slice,
|
75
|
+
record_counter=self._record_counter,
|
63
76
|
)
|
64
77
|
|
65
78
|
|
@@ -72,6 +85,7 @@ class DeclarativePartition(Partition):
|
|
72
85
|
message_repository: MessageRepository,
|
73
86
|
max_records_limit: Optional[int],
|
74
87
|
stream_slice: StreamSlice,
|
88
|
+
record_counter: RecordCounter,
|
75
89
|
):
|
76
90
|
self._stream_name = stream_name
|
77
91
|
self._schema_loader = schema_loader
|
@@ -80,17 +94,17 @@ class DeclarativePartition(Partition):
|
|
80
94
|
self._max_records_limit = max_records_limit
|
81
95
|
self._stream_slice = stream_slice
|
82
96
|
self._hash = SliceHasher.hash(self._stream_name, self._stream_slice)
|
97
|
+
self._record_counter = record_counter
|
83
98
|
|
84
99
|
def read(self) -> Iterable[Record]:
|
85
100
|
if self._max_records_limit is not None:
|
86
|
-
|
87
|
-
if total_record_counter >= self._max_records_limit:
|
101
|
+
if self._record_counter.get_total_records() >= self._max_records_limit:
|
88
102
|
return
|
89
103
|
for stream_data in self._retriever.read_records(
|
90
104
|
self._schema_loader.get_json_schema(), self._stream_slice
|
91
105
|
):
|
92
106
|
if self._max_records_limit is not None:
|
93
|
-
if
|
107
|
+
if self._record_counter.get_total_records() >= self._max_records_limit:
|
94
108
|
break
|
95
109
|
|
96
110
|
if isinstance(stream_data, Mapping):
|
@@ -108,7 +122,7 @@ class DeclarativePartition(Partition):
|
|
108
122
|
self._message_repository.emit_message(stream_data)
|
109
123
|
|
110
124
|
if self._max_records_limit is not None:
|
111
|
-
|
125
|
+
self._record_counter.increment()
|
112
126
|
|
113
127
|
def to_slice(self) -> Optional[Mapping[str, Any]]:
|
114
128
|
return self._stream_slice
|
@@ -14,7 +14,7 @@ from airbyte_cdk.sources.declarative.concurrent_declarative_source import (
|
|
14
14
|
from airbyte_cdk.sources.types import ConnectionDefinition
|
15
15
|
|
16
16
|
|
17
|
-
class YamlDeclarativeSource(ConcurrentDeclarativeSource
|
17
|
+
class YamlDeclarativeSource(ConcurrentDeclarativeSource):
|
18
18
|
"""Declarative source defined by a yaml file"""
|
19
19
|
|
20
20
|
def __init__(
|
@@ -7,12 +7,16 @@ import importlib
|
|
7
7
|
import json
|
8
8
|
import os
|
9
9
|
import pkgutil
|
10
|
-
from
|
10
|
+
from copy import deepcopy
|
11
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Dict, List, Mapping, MutableMapping, Tuple, cast
|
11
12
|
|
12
13
|
import jsonref
|
13
|
-
from jsonschema import
|
14
|
+
from jsonschema import validate
|
14
15
|
from jsonschema.exceptions import ValidationError
|
15
16
|
from pydantic.v1 import BaseModel, Field
|
17
|
+
from referencing import Registry, Resource
|
18
|
+
from referencing._core import Resolver # used for type hints
|
19
|
+
from referencing.jsonschema import DRAFT7
|
16
20
|
|
17
21
|
from airbyte_cdk.models import ConnectorSpecification, FailureType
|
18
22
|
from airbyte_cdk.utils.traced_exception import AirbyteTracedException
|
@@ -63,18 +67,30 @@ def resolve_ref_links(obj: Any) -> Any:
|
|
63
67
|
return obj
|
64
68
|
|
65
69
|
|
66
|
-
def
|
70
|
+
def get_ref_resolver_registry(schema: dict[str, Any]) -> Registry:
|
71
|
+
"""Get a reference resolver registry for the given schema."""
|
72
|
+
resource: Resource = Resource.from_contents(
|
73
|
+
contents=schema,
|
74
|
+
default_specification=DRAFT7,
|
75
|
+
)
|
76
|
+
return cast( # Mypy has a hard time detecting this return type.
|
77
|
+
"Registry",
|
78
|
+
Registry().with_resource(
|
79
|
+
uri="",
|
80
|
+
resource=resource,
|
81
|
+
),
|
82
|
+
)
|
83
|
+
|
84
|
+
|
85
|
+
def _expand_refs(schema: Any, ref_resolver: Resolver) -> None:
|
67
86
|
"""Internal function to iterate over schema and replace all occurrences of $ref with their definitions. Recursive.
|
68
87
|
|
69
88
|
:param schema: schema that will be patched
|
70
|
-
:param ref_resolver: resolver to get definition from $ref, if None pass it will be instantiated
|
71
89
|
"""
|
72
|
-
ref_resolver = ref_resolver or RefResolver.from_schema(schema)
|
73
|
-
|
74
90
|
if isinstance(schema, MutableMapping):
|
75
91
|
if "$ref" in schema:
|
76
92
|
ref_url = schema.pop("$ref")
|
77
|
-
|
93
|
+
definition = ref_resolver.lookup(ref_url).contents
|
78
94
|
_expand_refs(
|
79
95
|
definition, ref_resolver=ref_resolver
|
80
96
|
) # expand refs in definitions as well
|
@@ -90,10 +106,14 @@ def _expand_refs(schema: Any, ref_resolver: Optional[RefResolver] = None) -> Non
|
|
90
106
|
def expand_refs(schema: Any) -> None:
|
91
107
|
"""Iterate over schema and replace all occurrences of $ref with their definitions.
|
92
108
|
|
109
|
+
If a "definitions" section is present at the root of the schema, it will be removed
|
110
|
+
after $ref resolution is complete.
|
111
|
+
|
93
112
|
:param schema: schema that will be patched
|
94
113
|
"""
|
95
|
-
|
96
|
-
schema
|
114
|
+
ref_resolver = get_ref_resolver_registry(schema).resolver()
|
115
|
+
_expand_refs(schema, ref_resolver)
|
116
|
+
schema.pop("definitions", None)
|
97
117
|
|
98
118
|
|
99
119
|
def rename_key(schema: Any, old_key: str, new_key: str) -> None:
|
@@ -3,10 +3,25 @@
|
|
3
3
|
#
|
4
4
|
|
5
5
|
import logging
|
6
|
+
from copy import deepcopy
|
6
7
|
from enum import Flag, auto
|
7
|
-
from typing import Any, Callable, Dict, Generator, Mapping, Optional, cast
|
8
|
+
from typing import TYPE_CHECKING, Any, Callable, Dict, Generator, Mapping, Optional, cast
|
9
|
+
|
10
|
+
from jsonschema import Draft7Validator, ValidationError, validators
|
11
|
+
from referencing import Registry, Resource
|
12
|
+
from referencing._core import Resolver
|
13
|
+
from referencing.exceptions import Unresolvable
|
14
|
+
from referencing.jsonschema import DRAFT7
|
15
|
+
|
16
|
+
from airbyte_cdk.sources.utils.schema_helpers import expand_refs
|
17
|
+
|
18
|
+
from .schema_helpers import get_ref_resolver_registry
|
19
|
+
|
20
|
+
try:
|
21
|
+
from jsonschema.validators import Validator
|
22
|
+
except:
|
23
|
+
from jsonschema import Validator
|
8
24
|
|
9
|
-
from jsonschema import Draft7Validator, RefResolver, ValidationError, Validator, validators
|
10
25
|
|
11
26
|
MAX_NESTING_DEPTH = 3
|
12
27
|
json_to_python_simple = {
|
@@ -191,15 +206,14 @@ class TypeTransformer:
|
|
191
206
|
validators parameter for detailed description.
|
192
207
|
:
|
193
208
|
"""
|
209
|
+
# Very first step is to expand $refs in the schema itself:
|
210
|
+
expand_refs(schema)
|
211
|
+
|
212
|
+
# Now we can expand $refs in the property value:
|
213
|
+
if isinstance(property_value, dict):
|
214
|
+
expand_refs(property_value)
|
194
215
|
|
195
|
-
|
196
|
-
if "$ref" in subschema:
|
197
|
-
_, resolved = cast(
|
198
|
-
RefResolver,
|
199
|
-
validator_instance.resolver,
|
200
|
-
).resolve(subschema["$ref"])
|
201
|
-
return cast(dict[str, Any], resolved)
|
202
|
-
return subschema
|
216
|
+
# Now we can validate and normalize the values:
|
203
217
|
|
204
218
|
# Transform object and array values before running json schema type checking for each element.
|
205
219
|
# Recursively normalize every value of the "instance" sub-object,
|
@@ -207,14 +221,12 @@ class TypeTransformer:
|
|
207
221
|
if schema_key == "properties" and isinstance(instance, dict):
|
208
222
|
for k, subschema in property_value.items():
|
209
223
|
if k in instance:
|
210
|
-
subschema = resolve(subschema)
|
211
224
|
instance[k] = self.__normalize(instance[k], subschema)
|
212
225
|
# Recursively normalize every item of the "instance" sub-array,
|
213
226
|
# if "instance" is an incorrect type - skip recursive normalization of "instance"
|
214
227
|
elif schema_key == "items" and isinstance(instance, list):
|
215
|
-
subschema = resolve(property_value)
|
216
228
|
for index, item in enumerate(instance):
|
217
|
-
instance[index] = self.__normalize(item,
|
229
|
+
instance[index] = self.__normalize(item, property_value)
|
218
230
|
|
219
231
|
# Running native jsonschema traverse algorithm after field normalization is done.
|
220
232
|
yield from original_validator(
|
@@ -6,7 +6,8 @@ import json
|
|
6
6
|
import re
|
7
7
|
from typing import Any
|
8
8
|
|
9
|
-
from
|
9
|
+
from referencing import Registry, Resource
|
10
|
+
from referencing.jsonschema import DRAFT7
|
10
11
|
|
11
12
|
|
12
13
|
def resolve_refs(schema: dict[str, Any]) -> dict[str, Any]:
|
@@ -14,13 +15,14 @@ def resolve_refs(schema: dict[str, Any]) -> dict[str, Any]:
|
|
14
15
|
For spec schemas generated using Pydantic models, the resulting JSON schema can contain refs between object
|
15
16
|
relationships.
|
16
17
|
"""
|
17
|
-
|
18
|
+
resource = Resource.from_contents(schema, default_specification=DRAFT7)
|
19
|
+
registry = Registry().with_resource("", resource)
|
20
|
+
resolver = registry.resolver()
|
18
21
|
str_schema = json.dumps(schema)
|
19
22
|
for ref_block in re.findall(r'{"\$ref": "#\/definitions\/.+?(?="})"}', str_schema):
|
20
23
|
ref = json.loads(ref_block)["$ref"]
|
21
|
-
|
22
|
-
|
23
|
-
)
|
24
|
+
resolved = resolver.lookup(ref).contents
|
25
|
+
str_schema = str_schema.replace(ref_block, json.dumps(resolved))
|
24
26
|
pyschema: dict[str, Any] = json.loads(str_schema)
|
25
27
|
del pyschema["definitions"]
|
26
28
|
return pyschema
|
@@ -1,13 +1,13 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: airbyte-cdk
|
3
|
-
Version: 6.61.
|
3
|
+
Version: 6.61.6
|
4
4
|
Summary: A framework for writing Airbyte Connectors.
|
5
5
|
Home-page: https://airbyte.com
|
6
6
|
License: MIT
|
7
7
|
Keywords: airbyte,connector-development-kit,cdk
|
8
8
|
Author: Airbyte
|
9
9
|
Author-email: contact@airbyte.io
|
10
|
-
Requires-Python: >=3.10,<3.
|
10
|
+
Requires-Python: >=3.10,<3.14
|
11
11
|
Classifier: Development Status :: 3 - Alpha
|
12
12
|
Classifier: Intended Audience :: Developers
|
13
13
|
Classifier: License :: OSI Approved :: MIT License
|
@@ -15,6 +15,7 @@ Classifier: Programming Language :: Python :: 3
|
|
15
15
|
Classifier: Programming Language :: Python :: 3.10
|
16
16
|
Classifier: Programming Language :: Python :: 3.11
|
17
17
|
Classifier: Programming Language :: Python :: 3.12
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
18
19
|
Classifier: Topic :: Scientific/Engineering
|
19
20
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
20
21
|
Provides-Extra: dev
|
@@ -31,18 +32,19 @@ Requires-Dist: backoff
|
|
31
32
|
Requires-Dist: boltons (>=25.0.0,<26.0.0)
|
32
33
|
Requires-Dist: cachetools
|
33
34
|
Requires-Dist: click (>=8.1.8,<9.0.0)
|
34
|
-
Requires-Dist: cohere (
|
35
|
+
Requires-Dist: cohere (>=4.21,<6.0.0) ; extra == "vector-db-based"
|
35
36
|
Requires-Dist: cryptography (>=44.0.0,<45.0.0)
|
36
37
|
Requires-Dist: dateparser (>=1.2.2,<2.0.0)
|
38
|
+
Requires-Dist: ddtrace (>=3.12.3,<4.0.0) ; extra == "manifest-server"
|
37
39
|
Requires-Dist: dpath (>=2.1.6,<3.0.0)
|
38
40
|
Requires-Dist: dunamai (>=1.22.0,<2.0.0)
|
39
41
|
Requires-Dist: fastapi (>=0.116.1) ; extra == "manifest-server"
|
40
|
-
Requires-Dist: fastavro (>=1.
|
42
|
+
Requires-Dist: fastavro (>=1.11.0,<2.0.0) ; extra == "file-based"
|
41
43
|
Requires-Dist: genson (==1.3.0)
|
42
44
|
Requires-Dist: google-cloud-secret-manager (>=2.17.0,<3.0.0)
|
43
45
|
Requires-Dist: isodate (>=0.6.1,<0.7.0)
|
44
46
|
Requires-Dist: jsonref (>=0.2,<0.3)
|
45
|
-
Requires-Dist: jsonschema (>=4.17.3,<
|
47
|
+
Requires-Dist: jsonschema (>=4.17.3,<5.0)
|
46
48
|
Requires-Dist: langchain (==0.1.16) ; extra == "vector-db-based"
|
47
49
|
Requires-Dist: langchain_core (==0.1.42)
|
48
50
|
Requires-Dist: markdown ; extra == "file-based"
|
@@ -51,7 +53,7 @@ Requires-Dist: numpy (<2)
|
|
51
53
|
Requires-Dist: openai[embeddings] (==0.27.9) ; extra == "vector-db-based"
|
52
54
|
Requires-Dist: orjson (>=3.10.7,<4.0.0)
|
53
55
|
Requires-Dist: packaging
|
54
|
-
Requires-Dist: pandas (==2.2.
|
56
|
+
Requires-Dist: pandas (==2.2.3)
|
55
57
|
Requires-Dist: pdf2image (==1.16.3) ; extra == "file-based"
|
56
58
|
Requires-Dist: pdfminer.six (==20221105) ; extra == "file-based"
|
57
59
|
Requires-Dist: psutil (==6.1.0)
|
@@ -67,6 +69,7 @@ Requires-Dist: python-snappy (==0.7.3) ; extra == "file-based"
|
|
67
69
|
Requires-Dist: python-ulid (>=3.0.0,<4.0.0)
|
68
70
|
Requires-Dist: pytz (==2024.2)
|
69
71
|
Requires-Dist: rapidfuzz (>=3.10.1,<4.0.0)
|
72
|
+
Requires-Dist: referencing (>=0.36.2)
|
70
73
|
Requires-Dist: requests
|
71
74
|
Requires-Dist: requests_cache
|
72
75
|
Requires-Dist: rich
|
@@ -15,13 +15,13 @@ airbyte_cdk/config_observation.py,sha256=7SSPxtN0nXPkm4euGNcTTr1iLbwUL01jy-24V1H
|
|
15
15
|
airbyte_cdk/connector.py,sha256=N6TUlrZOMjLAI85JrNAKkfyTqnO5xfBCw4oEfgjJd9o,4254
|
16
16
|
airbyte_cdk/connector_builder/README.md,sha256=Hw3wvVewuHG9-QgsAq1jDiKuLlStDxKBz52ftyNRnBw,1665
|
17
17
|
airbyte_cdk/connector_builder/__init__.py,sha256=4Hw-PX1-VgESLF16cDdvuYCzGJtHntThLF4qIiULWeo,61
|
18
|
-
airbyte_cdk/connector_builder/connector_builder_handler.py,sha256=
|
19
|
-
airbyte_cdk/connector_builder/main.py,sha256=
|
18
|
+
airbyte_cdk/connector_builder/connector_builder_handler.py,sha256=g3P7Ib27mOLEMH8tBIVhl3A-ZidothnXxevhNSuGHvM,6204
|
19
|
+
airbyte_cdk/connector_builder/main.py,sha256=dbVvNIFGIiAM9HKFsoB00lAHSvX16JY49dUImsGCpwQ,3920
|
20
20
|
airbyte_cdk/connector_builder/models.py,sha256=9pIZ98LW_d6fRS39VdnUOf3cxGt4TkC5MJ0_OrzcCRk,1578
|
21
21
|
airbyte_cdk/connector_builder/test_reader/__init__.py,sha256=iTwBMoI9vaJotEgpqZbFjlxRcbxXYypSVJ9YxeHk7wc,120
|
22
22
|
airbyte_cdk/connector_builder/test_reader/helpers.py,sha256=5GSrK9EVBDm5dwtudVbA-73EHh53-niRA-oj8eQVFHI,29236
|
23
23
|
airbyte_cdk/connector_builder/test_reader/message_grouper.py,sha256=bFoQMKCXJob98O6F4tgMW81cCquNOqCx2tkNXP7lPqc,7062
|
24
|
-
airbyte_cdk/connector_builder/test_reader/reader.py,sha256=
|
24
|
+
airbyte_cdk/connector_builder/test_reader/reader.py,sha256=QvIBtCJxcQhJqlHXOAHoFHGz_N7Z7ocpV2j5JO92XEU,21768
|
25
25
|
airbyte_cdk/connector_builder/test_reader/types.py,sha256=hPZG3jO03kBaPyW94NI3JHRS1jxXGSNBcN1HFzOxo5Y,2528
|
26
26
|
airbyte_cdk/destinations/__init__.py,sha256=FyDp28PT_YceJD5HDFhA-mrGfX9AONIyMQ4d68CHNxQ,213
|
27
27
|
airbyte_cdk/destinations/destination.py,sha256=CIq-yb8C_0QvcKCtmStaHfiqn53GEfRAIGGCkJhKP1Q,5880
|
@@ -55,31 +55,31 @@ airbyte_cdk/manifest_migrations/migrations/http_requester_request_body_json_data
|
|
55
55
|
airbyte_cdk/manifest_migrations/migrations/http_requester_url_base_to_url.py,sha256=EX1MVYVpoWypA28qoH48wA0SYZjGdlR8bcSixTDzfgo,1346
|
56
56
|
airbyte_cdk/manifest_migrations/migrations/registry.yaml,sha256=F-hdapvl_vZnsI7CQsV00Rb7g7j4Nt2zaM83-Tbwgbg,956
|
57
57
|
airbyte_cdk/manifest_migrations/migrations_registry.py,sha256=zly2fwaOxDukqC7eowzrDlvhA2v71FjW74kDzvRXhSY,2619
|
58
|
-
airbyte_cdk/manifest_server/Dockerfile,sha256=
|
59
|
-
airbyte_cdk/manifest_server/README.md,sha256=
|
58
|
+
airbyte_cdk/manifest_server/Dockerfile,sha256=9I8HUDHkHggzyUiGg4Bqj7oZjrTSaWrZrWyA2FKD7u8,1317
|
59
|
+
airbyte_cdk/manifest_server/README.md,sha256=bYzb3QAnkaM9mR9XgK7n4FKAvZkM4OWaBGcQb91f3vk,4341
|
60
60
|
airbyte_cdk/manifest_server/__init__.py,sha256=EE54nk2dbtExIEEvLPCTUkJ_ESV5OYP4B2rBJlDpJ5g,33
|
61
61
|
airbyte_cdk/manifest_server/api_models/__init__.py,sha256=1UFpMsJm1sjNBjgEasbOU98BgZxLthlPM1KdUpGfC4I,1015
|
62
62
|
airbyte_cdk/manifest_server/api_models/capabilities.py,sha256=eL88UxojIewHt97wMeCvyt92Hzh95UvLvVH6MSlsj5o,152
|
63
63
|
airbyte_cdk/manifest_server/api_models/dicts.py,sha256=Rm10IeV745MY8bLyrYyG7a9NGNrZBlnfkXct8gi7OTI,467
|
64
64
|
airbyte_cdk/manifest_server/api_models/manifest.py,sha256=cqxA4hU7Q29R8w6fqRDxtM7bVcFcADU2eQXZYKbib3M,1673
|
65
65
|
airbyte_cdk/manifest_server/api_models/stream.py,sha256=Jtz4TbqLf6Xbnu1KtTEQhzi_1rqClB2n22pueK8xgrI,2001
|
66
|
-
airbyte_cdk/manifest_server/app.py,sha256=
|
66
|
+
airbyte_cdk/manifest_server/app.py,sha256=RrjV73qx_PBoYoO_IAxDNV5v-UZNwjSG4muxZ4kiMj8,602
|
67
67
|
airbyte_cdk/manifest_server/auth.py,sha256=kKET6zg4olyf8p_UMcTnm7vkAtowxK6loSf8o83SdEM,1264
|
68
68
|
airbyte_cdk/manifest_server/cli/__init__.py,sha256=YfCEfXq3Jr7z3GOKMA6vF-D-7Y66BNHUwBLNM9UQbiQ,273
|
69
|
-
airbyte_cdk/manifest_server/cli/_common.py,sha256=
|
69
|
+
airbyte_cdk/manifest_server/cli/_common.py,sha256=_dV7Lq30-MFDAw4feNKJDnQkAaNpPnuHm4xcGJb9SvE,832
|
70
70
|
airbyte_cdk/manifest_server/cli/_info.py,sha256=-h8U1bSD1umqLuoXfg4yDNWFR1BZuxcXxLhVKfLWB0Y,982
|
71
71
|
airbyte_cdk/manifest_server/cli/_openapi.py,sha256=rNghqbBMMT118auUIsxr89Mu6L6hqoQAifxyDbv1ZqQ,1445
|
72
72
|
airbyte_cdk/manifest_server/cli/_start.py,sha256=SgkW_dQcpCIrXYNZ6qF95oYIVaCszm9tFEbYiAZo4EQ,876
|
73
73
|
airbyte_cdk/manifest_server/cli/run.py,sha256=-Yv_Jv_hDeMBVZdzuyeJJ_JBT1WUhCyUQn4f4mA21Ds,1224
|
74
74
|
airbyte_cdk/manifest_server/command_processor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
75
|
-
airbyte_cdk/manifest_server/command_processor/processor.py,sha256=
|
76
|
-
airbyte_cdk/manifest_server/command_processor/utils.py,sha256=
|
75
|
+
airbyte_cdk/manifest_server/command_processor/processor.py,sha256=BZPASuhPJix78NB7rD1xuxWfL1TmqdnOEa_8WR1R2FI,3741
|
76
|
+
airbyte_cdk/manifest_server/command_processor/utils.py,sha256=EbZAbX91n12g2TCqOWBUi8KKqdz2Ccrw2FAIN5JT2B8,3184
|
77
77
|
airbyte_cdk/manifest_server/main.py,sha256=iSgL7x8ifBpGpXi7Dq7017QjeC20l_CYBAIsumiyJn0,573
|
78
78
|
airbyte_cdk/manifest_server/openapi.yaml,sha256=jwJXohDXP3BLL0JGZhkyhpNLWLZu6_iXEgMtM58F2Pc,16693
|
79
79
|
airbyte_cdk/manifest_server/routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
80
80
|
airbyte_cdk/manifest_server/routers/capabilities.py,sha256=UeZQzbqEuDN23vizgDb_N7KEXR-YZUPnW5AkXeXy1hA,727
|
81
81
|
airbyte_cdk/manifest_server/routers/health.py,sha256=akBUaHUGN-jmN82lQ3kj_3-wdS6gsZx3iSD2KMI5dW8,200
|
82
|
-
airbyte_cdk/manifest_server/routers/manifest.py,sha256=
|
82
|
+
airbyte_cdk/manifest_server/routers/manifest.py,sha256=JmL5eaw4mDyjP7-ufQ_F6h0kmjttivrvXkEjPzYccTg,5533
|
83
83
|
airbyte_cdk/models/__init__.py,sha256=Et9wJWs5VOWynGbb-3aJRhsdAHAiLkNNLxdwqJAuqkw,2114
|
84
84
|
airbyte_cdk/models/airbyte_protocol.py,sha256=oZdKsZ7yPjUt9hvxdWNpxCtgjSV2RWhf4R9Np03sqyY,3613
|
85
85
|
airbyte_cdk/models/airbyte_protocol_serializers.py,sha256=Dq4ry_Wwvzsos6neDiaOZkY6riQYC33ZlPNWpfIIB1E,1926
|
@@ -118,7 +118,7 @@ airbyte_cdk/sources/declarative/checks/check_stream.py,sha256=sV-ZY7dZ03V8GdAxPY
|
|
118
118
|
airbyte_cdk/sources/declarative/checks/connection_checker.py,sha256=MBRJo6WJlZQHpIfOGaNOkkHUmgUl_4wDM6VPo41z5Ss,1383
|
119
119
|
airbyte_cdk/sources/declarative/concurrency_level/__init__.py,sha256=5XUqrmlstYlMM0j6crktlKQwALek0uiz2D3WdM46MyA,191
|
120
120
|
airbyte_cdk/sources/declarative/concurrency_level/concurrency_level.py,sha256=YIwCTCpOr_QSNW4ltQK0yUGWInI8PKNY216HOOegYLk,2101
|
121
|
-
airbyte_cdk/sources/declarative/concurrent_declarative_source.py,sha256=
|
121
|
+
airbyte_cdk/sources/declarative/concurrent_declarative_source.py,sha256=EpTpu7y8rK6QP9smRIXYi7NTjJwumTwI2FvoeFbigvc,52956
|
122
122
|
airbyte_cdk/sources/declarative/datetime/__init__.py,sha256=4Hw-PX1-VgESLF16cDdvuYCzGJtHntThLF4qIiULWeo,61
|
123
123
|
airbyte_cdk/sources/declarative/datetime/datetime_parser.py,sha256=_zGNGq31RNy_0QBLt_EcTvgPyhj7urPdx6oA3M5-r3o,3150
|
124
124
|
airbyte_cdk/sources/declarative/datetime/min_max_datetime.py,sha256=0BHBtDNQZfvwM45-tY5pNlTcKAFSGGNxemoi0Jic-0E,5785
|
@@ -173,7 +173,7 @@ airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py,sha256=pJ
|
|
173
173
|
airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=BTJ9CtBOukVrOhgkxejbXjpDvLgMVDt6nseR8K2k3xo,186944
|
174
174
|
airbyte_cdk/sources/declarative/partition_routers/__init__.py,sha256=TBC9AkGaUqHm2IKHMPN6punBIcY5tWGULowcLoAVkfw,1109
|
175
175
|
airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py,sha256=VelO7zKqKtzMJ35jyFeg0ypJLQC0plqqIBNXoBW1G2E,3001
|
176
|
-
airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py,sha256=
|
176
|
+
airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py,sha256=mPCtBpxBVM_TbLZI2qexlQuayhz1JLZM3-92boHm8JI,7116
|
177
177
|
airbyte_cdk/sources/declarative/partition_routers/grouping_partition_router.py,sha256=-W1CAg2NayCMDNj7QLWn7Nqipaz7av9sLjbMnyMGUek,6271
|
178
178
|
airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py,sha256=tmGGpMoOBmaMfhVZq53AEWxoHm2lmNVi6hA2_IVEnAA,4882
|
179
179
|
airbyte_cdk/sources/declarative/partition_routers/partition_router.py,sha256=YyEIzdmLd1FjbVP3QbQ2VFCLW_P-OGbVh6VpZShp54k,2218
|
@@ -249,7 +249,7 @@ airbyte_cdk/sources/declarative/schema/schema_loader.py,sha256=kjt8v0N5wWKA5zyLn
|
|
249
249
|
airbyte_cdk/sources/declarative/spec/__init__.py,sha256=9FYO-fVOclrwjAW4qwRTbZRVopTc9rOaauAJfThdNCQ,177
|
250
250
|
airbyte_cdk/sources/declarative/spec/spec.py,sha256=SwL_pfXZgcLYLJY-MAeFMHug9oYh2tOWjgG0C3DoLOY,3602
|
251
251
|
airbyte_cdk/sources/declarative/stream_slicers/__init__.py,sha256=UX-cP_C-9FIFFPL9z8nuxu_rglssRsMOqQmQHN8FLB8,341
|
252
|
-
airbyte_cdk/sources/declarative/stream_slicers/declarative_partition_generator.py,sha256=
|
252
|
+
airbyte_cdk/sources/declarative/stream_slicers/declarative_partition_generator.py,sha256=LLr5U_6UI3zp4i9gvP8dawIcdE-UYTSa-B0l5qkDW3Q,6161
|
253
253
|
airbyte_cdk/sources/declarative/stream_slicers/stream_slicer.py,sha256=SOkIPBi2Wu7yxIvA15yFzUAB95a3IzA8LPq5DEqHQQc,725
|
254
254
|
airbyte_cdk/sources/declarative/stream_slicers/stream_slicer_test_read_decorator.py,sha256=4vit5ADyhoZnd1psRVeM5jdySYzhjwspLVXxh8vt1M8,944
|
255
255
|
airbyte_cdk/sources/declarative/transformations/__init__.py,sha256=CPJ8TlMpiUmvG3624VYu_NfTzxwKcfBjM2Q2wJ7fkSA,919
|
@@ -273,7 +273,7 @@ airbyte_cdk/sources/declarative/validators/predicate_validator.py,sha256=Q4eVncl
|
|
273
273
|
airbyte_cdk/sources/declarative/validators/validate_adheres_to_schema.py,sha256=kjcuKxWMJEzpF4GiESITGMxBAXw6YZCAsgOQMgeBo4g,1085
|
274
274
|
airbyte_cdk/sources/declarative/validators/validation_strategy.py,sha256=LwqUX89cFdHTM1-h6c8vebBA9WC38HYoGBvJfCZHr0g,467
|
275
275
|
airbyte_cdk/sources/declarative/validators/validator.py,sha256=MAwo8OievUsuzBuPxI9pbPu87yq0tJZkGbydcrHZyQc,382
|
276
|
-
airbyte_cdk/sources/declarative/yaml_declarative_source.py,sha256
|
276
|
+
airbyte_cdk/sources/declarative/yaml_declarative_source.py,sha256=qDQXems3USwhapqzbcESeXyYAhTSp8PLBq47Hiw52PY,2767
|
277
277
|
airbyte_cdk/sources/file_based/README.md,sha256=iMqww4VZ882jfNQIdljjDgqreKs-mkdtSrRKA94iX6A,11085
|
278
278
|
airbyte_cdk/sources/file_based/__init__.py,sha256=EaxHv_9ot-eRlUCR47ZMZ0IOtB-n0HH24om7Bfn-uuQ,868
|
279
279
|
airbyte_cdk/sources/file_based/availability_strategy/__init__.py,sha256=VY-0PcTaPttXU_mGf-7w7u5VKQD7iQWJbKMvIYAOhcQ,288
|
@@ -393,9 +393,9 @@ airbyte_cdk/sources/utils/__init__.py,sha256=TTN6VUxVy6Is8BhYQZR5pxJGQh8yH4duXh4
|
|
393
393
|
airbyte_cdk/sources/utils/casing.py,sha256=QC-gV1O4e8DR4-bhdXieUPKm_JamzslVyfABLYYRSXA,256
|
394
394
|
airbyte_cdk/sources/utils/files_directory.py,sha256=z8Dmr-wkL1sAqdwCST4MBUFAyMHPD2cJIzVdAuCynp8,391
|
395
395
|
airbyte_cdk/sources/utils/record_helper.py,sha256=7wL-pDYrBpcmZHa8ORtiSOqBZJEZI5hdl2dA1RYiatk,2029
|
396
|
-
airbyte_cdk/sources/utils/schema_helpers.py,sha256=
|
396
|
+
airbyte_cdk/sources/utils/schema_helpers.py,sha256=_SCOPalKoMW3SX9J-zK6UsAO0oHsfCyW-F2wQlPJ3PU,9145
|
397
397
|
airbyte_cdk/sources/utils/slice_logger.py,sha256=M1TvcYGMftXR841XdJmeEpKpQqrdOD5X-qsspfAMKMs,2168
|
398
|
-
airbyte_cdk/sources/utils/transform.py,sha256=
|
398
|
+
airbyte_cdk/sources/utils/transform.py,sha256=49xcU97dZAO7FTQItrpN0mZ4qjz5d6huftF4DYbze6c,11971
|
399
399
|
airbyte_cdk/sources/utils/types.py,sha256=41ZQR681t5TUnOScij58d088sb99klH_ZENFcaYro_g,175
|
400
400
|
airbyte_cdk/sql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
401
401
|
airbyte_cdk/sql/_util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -451,12 +451,12 @@ airbyte_cdk/utils/oneof_option_config.py,sha256=N8EmWdYdwt0FM7fuShh6H8nj_r4KEL9t
|
|
451
451
|
airbyte_cdk/utils/print_buffer.py,sha256=PhMOi0C4Z91kWKrSvCQXcp8qRh1uCimpIdvrg6voZIA,2810
|
452
452
|
airbyte_cdk/utils/schema_inferrer.py,sha256=_jLzL9PzE4gfR44OSavkIqZNFM9t08c3LuRrkR7PZbk,9861
|
453
453
|
airbyte_cdk/utils/slice_hasher.py,sha256=EDxgROHDbfG-QKQb59m7h_7crN1tRiawdf5uU7GrKcg,1264
|
454
|
-
airbyte_cdk/utils/spec_schema_transformations.py,sha256
|
454
|
+
airbyte_cdk/utils/spec_schema_transformations.py,sha256=9YDJmnIGFsT51CVQf2tSSvTapGimITjEFGbUTSZAGTI,963
|
455
455
|
airbyte_cdk/utils/stream_status_utils.py,sha256=ZmBoiy5HVbUEHAMrUONxZvxnvfV9CesmQJLDTAIWnWw,1171
|
456
456
|
airbyte_cdk/utils/traced_exception.py,sha256=C8uIBuCL_E4WnBAOPSxBicD06JAldoN9fGsQDp463OY,6292
|
457
|
-
airbyte_cdk-6.61.
|
458
|
-
airbyte_cdk-6.61.
|
459
|
-
airbyte_cdk-6.61.
|
460
|
-
airbyte_cdk-6.61.
|
461
|
-
airbyte_cdk-6.61.
|
462
|
-
airbyte_cdk-6.61.
|
457
|
+
airbyte_cdk-6.61.6.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
|
458
|
+
airbyte_cdk-6.61.6.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
|
459
|
+
airbyte_cdk-6.61.6.dist-info/METADATA,sha256=2CK9PaFLE8ebRfYDTjK5S1dxFO-jlr3fD-wHPzVe4pY,6800
|
460
|
+
airbyte_cdk-6.61.6.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
461
|
+
airbyte_cdk-6.61.6.dist-info/entry_points.txt,sha256=eLZ2UYvJZGm1s07Pplcs--1Gim60YhZWTb53j_dghwU,195
|
462
|
+
airbyte_cdk-6.61.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|