airbyte-cdk 6.26.0.dev4101__py3-none-any.whl → 6.26.0.dev4102__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/sources/file_based/config/abstract_file_based_spec.py +11 -3
- airbyte_cdk/sources/file_based/config/identities_based_stream_config.py +8 -0
- airbyte_cdk/sources/file_based/config/permissions.py +34 -0
- airbyte_cdk/sources/file_based/file_based_source.py +52 -7
- airbyte_cdk/sources/file_based/file_based_stream_reader.py +12 -21
- airbyte_cdk/sources/file_based/schema_helpers.py +25 -0
- airbyte_cdk/sources/file_based/stream/__init__.py +2 -1
- airbyte_cdk/sources/file_based/stream/default_file_based_stream.py +11 -10
- airbyte_cdk/sources/file_based/stream/identities_stream.py +99 -0
- {airbyte_cdk-6.26.0.dev4101.dist-info → airbyte_cdk-6.26.0.dev4102.dist-info}/METADATA +1 -1
- {airbyte_cdk-6.26.0.dev4101.dist-info → airbyte_cdk-6.26.0.dev4102.dist-info}/RECORD +14 -11
- {airbyte_cdk-6.26.0.dev4101.dist-info → airbyte_cdk-6.26.0.dev4102.dist-info}/LICENSE.txt +0 -0
- {airbyte_cdk-6.26.0.dev4101.dist-info → airbyte_cdk-6.26.0.dev4102.dist-info}/WHEEL +0 -0
- {airbyte_cdk-6.26.0.dev4101.dist-info → airbyte_cdk-6.26.0.dev4102.dist-info}/entry_points.txt +0 -0
@@ -11,6 +11,9 @@ from pydantic.v1 import AnyUrl, BaseModel, Field
|
|
11
11
|
|
12
12
|
from airbyte_cdk import OneOfOptionConfig
|
13
13
|
from airbyte_cdk.sources.file_based.config.file_based_stream_config import FileBasedStreamConfig
|
14
|
+
from airbyte_cdk.sources.file_based.config.identities_based_stream_config import (
|
15
|
+
IdentitiesStreamConfig,
|
16
|
+
)
|
14
17
|
from airbyte_cdk.sources.utils import schema_helpers
|
15
18
|
|
16
19
|
|
@@ -22,12 +25,17 @@ class DeliverRecords(BaseModel):
|
|
22
25
|
|
23
26
|
delivery_type: Literal["use_records_transfer"] = Field("use_records_transfer", const=True)
|
24
27
|
|
25
|
-
|
26
|
-
title="
|
27
|
-
description="
|
28
|
+
sync_acl_permissions: bool = Field(
|
29
|
+
title="Include ACL Permissions",
|
30
|
+
description="Joins Document allowlists to each stream.",
|
28
31
|
default=False,
|
29
32
|
airbyte_hidden=True,
|
30
33
|
)
|
34
|
+
identities: Optional[IdentitiesStreamConfig] = Field(
|
35
|
+
title="Identities configuration",
|
36
|
+
description="Configuration for identities",
|
37
|
+
airbyte_hidden=True,
|
38
|
+
)
|
31
39
|
|
32
40
|
|
33
41
|
class DeliverRawFiles(BaseModel):
|
@@ -0,0 +1,8 @@
|
|
1
|
+
from typing import Literal
|
2
|
+
|
3
|
+
from pydantic.v1 import BaseModel, Field
|
4
|
+
|
5
|
+
|
6
|
+
class IdentitiesStreamConfig(BaseModel):
|
7
|
+
name: Literal["identities"] = Field("identities", const=True, airbyte_hidden=True)
|
8
|
+
domain: str = Field(title="Domain", description="The domain of the identities.")
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2024 Airbyte, Inc., all rights reserved.
|
3
|
+
#
|
4
|
+
|
5
|
+
import uuid
|
6
|
+
from datetime import datetime
|
7
|
+
from enum import Enum
|
8
|
+
|
9
|
+
from pydantic.v1 import BaseModel
|
10
|
+
|
11
|
+
|
12
|
+
class RemoteFileIdentityType(Enum):
|
13
|
+
USER = "user"
|
14
|
+
GROUP = "group"
|
15
|
+
|
16
|
+
|
17
|
+
class RemoteFileIdentity(BaseModel):
|
18
|
+
id: uuid.UUID
|
19
|
+
remote_id: str
|
20
|
+
parent_id: str | None = None
|
21
|
+
name: str | None = None
|
22
|
+
description: str | None = None
|
23
|
+
email_address: str | None = None
|
24
|
+
member_email_addresses: list[str] | None = None
|
25
|
+
type: RemoteFileIdentityType
|
26
|
+
modified_at: datetime
|
27
|
+
|
28
|
+
|
29
|
+
class RemoteFilePermissions(BaseModel):
|
30
|
+
id: str
|
31
|
+
file_path: str
|
32
|
+
allowed_identity_remote_ids: list[str] | None = None
|
33
|
+
denied_identity_remote_ids: list[str] | None = None
|
34
|
+
publicly_accessible: bool = False
|
@@ -33,6 +33,9 @@ from airbyte_cdk.sources.file_based.config.file_based_stream_config import (
|
|
33
33
|
FileBasedStreamConfig,
|
34
34
|
ValidationPolicy,
|
35
35
|
)
|
36
|
+
from airbyte_cdk.sources.file_based.config.identities_based_stream_config import (
|
37
|
+
IdentitiesStreamConfig,
|
38
|
+
)
|
36
39
|
from airbyte_cdk.sources.file_based.discovery_policy import (
|
37
40
|
AbstractDiscoveryPolicy,
|
38
41
|
DefaultDiscoveryPolicy,
|
@@ -49,7 +52,11 @@ from airbyte_cdk.sources.file_based.schema_validation_policies import (
|
|
49
52
|
DEFAULT_SCHEMA_VALIDATION_POLICIES,
|
50
53
|
AbstractSchemaValidationPolicy,
|
51
54
|
)
|
52
|
-
from airbyte_cdk.sources.file_based.stream import
|
55
|
+
from airbyte_cdk.sources.file_based.stream import (
|
56
|
+
AbstractFileBasedStream,
|
57
|
+
DefaultFileBasedStream,
|
58
|
+
IdentitiesStream,
|
59
|
+
)
|
53
60
|
from airbyte_cdk.sources.file_based.stream.concurrent.adapters import FileBasedStreamFacade
|
54
61
|
from airbyte_cdk.sources.file_based.stream.concurrent.cursor import (
|
55
62
|
AbstractConcurrentFileBasedCursor,
|
@@ -157,13 +164,17 @@ class FileBasedSource(ConcurrentSourceAdapter, ABC):
|
|
157
164
|
errors = []
|
158
165
|
tracebacks = []
|
159
166
|
for stream in streams:
|
167
|
+
if isinstance(stream, IdentitiesStream):
|
168
|
+
# Probably need to check identities endpoint/api access but will skip for now.
|
169
|
+
continue
|
160
170
|
if not isinstance(stream, AbstractFileBasedStream):
|
161
171
|
raise ValueError(f"Stream {stream} is not a file-based stream.")
|
162
172
|
try:
|
163
173
|
parsed_config = self._get_parsed_config(config)
|
164
174
|
availability_method = (
|
165
175
|
stream.availability_strategy.check_availability
|
166
|
-
if self._use_file_transfer(parsed_config)
|
176
|
+
if self._use_file_transfer(parsed_config)
|
177
|
+
or self._sync_acl_permissions(parsed_config)
|
167
178
|
else stream.availability_strategy.check_availability_and_parsability
|
168
179
|
)
|
169
180
|
(
|
@@ -289,6 +300,13 @@ class FileBasedSource(ConcurrentSourceAdapter, ABC):
|
|
289
300
|
)
|
290
301
|
|
291
302
|
streams.append(stream)
|
303
|
+
|
304
|
+
identities_stream_config = self._get_identities_stream_config(parsed_config)
|
305
|
+
if identities_stream_config:
|
306
|
+
identities_stream = self._make_identities_stream(
|
307
|
+
stream_config=identities_stream_config
|
308
|
+
)
|
309
|
+
streams.append(identities_stream)
|
292
310
|
return streams
|
293
311
|
|
294
312
|
except ValidationError as exc:
|
@@ -312,7 +330,19 @@ class FileBasedSource(ConcurrentSourceAdapter, ABC):
|
|
312
330
|
cursor=cursor,
|
313
331
|
use_file_transfer=self._use_file_transfer(parsed_config),
|
314
332
|
preserve_directory_structure=self._preserve_directory_structure(parsed_config),
|
315
|
-
|
333
|
+
sync_acl_permissions=self._sync_acl_permissions(parsed_config),
|
334
|
+
)
|
335
|
+
|
336
|
+
def _make_identities_stream(
|
337
|
+
self,
|
338
|
+
stream_config: IdentitiesStreamConfig,
|
339
|
+
) -> Stream:
|
340
|
+
return IdentitiesStream(
|
341
|
+
config=stream_config,
|
342
|
+
catalog_schema=self.stream_schemas.get(stream_config.name),
|
343
|
+
stream_reader=self.stream_reader,
|
344
|
+
discovery_policy=self.discovery_policy,
|
345
|
+
errors_collector=self.errors_collector,
|
316
346
|
)
|
317
347
|
|
318
348
|
def _get_stream_from_catalog(
|
@@ -419,11 +449,26 @@ class FileBasedSource(ConcurrentSourceAdapter, ABC):
|
|
419
449
|
return True
|
420
450
|
|
421
451
|
@staticmethod
|
422
|
-
def
|
452
|
+
def _sync_acl_permissions(parsed_config: AbstractFileBasedSpec) -> bool:
|
423
453
|
if (
|
424
454
|
FileBasedSource._use_records_transfer(parsed_config)
|
425
|
-
and hasattr(parsed_config.delivery_method, "
|
426
|
-
and parsed_config.delivery_method.
|
455
|
+
and hasattr(parsed_config.delivery_method, "sync_acl_permissions")
|
456
|
+
and parsed_config.delivery_method.sync_acl_permissions is not None
|
427
457
|
):
|
428
|
-
return parsed_config.delivery_method.
|
458
|
+
return parsed_config.delivery_method.sync_acl_permissions
|
429
459
|
return False
|
460
|
+
|
461
|
+
@staticmethod
|
462
|
+
def _get_identities_stream_config(
|
463
|
+
parsed_config: AbstractFileBasedSpec,
|
464
|
+
) -> Optional[IdentitiesStreamConfig]:
|
465
|
+
identities_stream_config = None
|
466
|
+
if (
|
467
|
+
FileBasedSource._sync_acl_permissions(parsed_config)
|
468
|
+
and hasattr(parsed_config.delivery_method, "identities")
|
469
|
+
and parsed_config.delivery_method.identities is not None
|
470
|
+
and isinstance(parsed_config.delivery_method.identities, IdentitiesStreamConfig)
|
471
|
+
and parsed_config.delivery_method.identities.domain
|
472
|
+
):
|
473
|
+
identities_stream_config = parsed_config.delivery_method.identities
|
474
|
+
return identities_stream_config
|
@@ -155,14 +155,14 @@ class AbstractFileBasedStreamReader(ABC):
|
|
155
155
|
return self.config.delivery_method.preserve_directory_structure
|
156
156
|
return True
|
157
157
|
|
158
|
-
def
|
158
|
+
def sync_acl_permissions(self) -> bool:
|
159
159
|
if (
|
160
160
|
self.config
|
161
161
|
and self.use_records_transfer()
|
162
|
-
and hasattr(self.config.delivery_method, "
|
163
|
-
and self.config.delivery_method.
|
162
|
+
and hasattr(self.config.delivery_method, "sync_acl_permissions")
|
163
|
+
and self.config.delivery_method.sync_acl_permissions is not None
|
164
164
|
):
|
165
|
-
return self.config.delivery_method.
|
165
|
+
return self.config.delivery_method.sync_acl_permissions
|
166
166
|
return False
|
167
167
|
|
168
168
|
@abstractmethod
|
@@ -203,25 +203,16 @@ class AbstractFileBasedStreamReader(ABC):
|
|
203
203
|
absolute_file_path = path.abspath(local_file_path)
|
204
204
|
return [file_relative_path, local_file_path, absolute_file_path]
|
205
205
|
|
206
|
-
def
|
206
|
+
def get_file_acl_permissions(self, file: RemoteFile, logger: logging.Logger) -> Dict[str, Any]:
|
207
207
|
"""
|
208
208
|
This is required for connectors that will support syncing
|
209
|
-
|
209
|
+
ACL Permissions from files.
|
210
210
|
"""
|
211
211
|
return {}
|
212
212
|
|
213
|
-
def
|
214
|
-
"""
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
return {
|
220
|
-
"type": "object",
|
221
|
-
"properties": {
|
222
|
-
"id": {"type": "string"},
|
223
|
-
"file_path": {"type": "string"},
|
224
|
-
"allowed_identity_remote_ids": {"type": "array", "items": "string"},
|
225
|
-
"is_public": {"type": "boolean"},
|
226
|
-
},
|
227
|
-
}
|
213
|
+
def load_identity_groups(self) -> Iterable[Dict[str, Any]]:
|
214
|
+
"""
|
215
|
+
This is required for connectors that will support syncing
|
216
|
+
identities.
|
217
|
+
"""
|
218
|
+
yield {}
|
@@ -23,6 +23,31 @@ file_transfer_schema = {
|
|
23
23
|
"properties": {"data": {"type": "object"}, "file": {"type": "object"}},
|
24
24
|
}
|
25
25
|
|
26
|
+
remote_file_permissions_schema = {
|
27
|
+
"type": "object",
|
28
|
+
"properties": {
|
29
|
+
"id": {"type": "string"},
|
30
|
+
"file_path": {"type": "string"},
|
31
|
+
"allowed_identity_remote_ids": {"type": "array", "items": {"type": "string"}},
|
32
|
+
"publicly_accessible": {"type": "boolean"},
|
33
|
+
},
|
34
|
+
}
|
35
|
+
|
36
|
+
remote_file_identity_schema = {
|
37
|
+
"type": "object",
|
38
|
+
"properties": {
|
39
|
+
"id": {"type": "string"},
|
40
|
+
"remote_id": {"type": "string"},
|
41
|
+
"parent_id": {"type": ["null", "string"]},
|
42
|
+
"name": {"type": ["null", "string"]},
|
43
|
+
"description": {"type": ["null", "string"]},
|
44
|
+
"email_address": {"type": ["null", "string"]},
|
45
|
+
"member_email_addresses": {"type": ["null", "array"]},
|
46
|
+
"type": {"type": "string"},
|
47
|
+
"modified_at": {"type": "string"},
|
48
|
+
},
|
49
|
+
}
|
50
|
+
|
26
51
|
|
27
52
|
@total_ordering
|
28
53
|
class ComparableType(Enum):
|
@@ -1,4 +1,5 @@
|
|
1
1
|
from airbyte_cdk.sources.file_based.stream.abstract_file_based_stream import AbstractFileBasedStream
|
2
2
|
from airbyte_cdk.sources.file_based.stream.default_file_based_stream import DefaultFileBasedStream
|
3
|
+
from airbyte_cdk.sources.file_based.stream.identities_stream import IdentitiesStream
|
3
4
|
|
4
|
-
__all__ = ["AbstractFileBasedStream", "DefaultFileBasedStream"]
|
5
|
+
__all__ = ["AbstractFileBasedStream", "DefaultFileBasedStream", "IdentitiesStream"]
|
@@ -29,6 +29,7 @@ from airbyte_cdk.sources.file_based.schema_helpers import (
|
|
29
29
|
SchemaType,
|
30
30
|
file_transfer_schema,
|
31
31
|
merge_schemas,
|
32
|
+
remote_file_permissions_schema,
|
32
33
|
schemaless_schema,
|
33
34
|
)
|
34
35
|
from airbyte_cdk.sources.file_based.stream import AbstractFileBasedStream
|
@@ -47,7 +48,7 @@ class DefaultFileBasedStream(AbstractFileBasedStream, IncrementalMixin):
|
|
47
48
|
|
48
49
|
FILE_TRANSFER_KW = "use_file_transfer"
|
49
50
|
PRESERVE_DIRECTORY_STRUCTURE_KW = "preserve_directory_structure"
|
50
|
-
|
51
|
+
SYNC_ACL_PERMISSIONS_KW = "sync_acl_permissions"
|
51
52
|
FILES_KEY = "files"
|
52
53
|
DATE_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ"
|
53
54
|
ab_last_mod_col = "_ab_source_file_last_modified"
|
@@ -57,7 +58,7 @@ class DefaultFileBasedStream(AbstractFileBasedStream, IncrementalMixin):
|
|
57
58
|
airbyte_columns = [ab_last_mod_col, ab_file_name_col]
|
58
59
|
use_file_transfer = False
|
59
60
|
preserve_directory_structure = True
|
60
|
-
|
61
|
+
sync_acl_permissions = False
|
61
62
|
|
62
63
|
def __init__(self, **kwargs: Any):
|
63
64
|
if self.FILE_TRANSFER_KW in kwargs:
|
@@ -66,8 +67,8 @@ class DefaultFileBasedStream(AbstractFileBasedStream, IncrementalMixin):
|
|
66
67
|
self.preserve_directory_structure = kwargs.pop(
|
67
68
|
self.PRESERVE_DIRECTORY_STRUCTURE_KW, True
|
68
69
|
)
|
69
|
-
if self.
|
70
|
-
self.
|
70
|
+
if self.SYNC_ACL_PERMISSIONS_KW in kwargs:
|
71
|
+
self.sync_acl_permissions = kwargs.pop(self.SYNC_ACL_PERMISSIONS_KW, False)
|
71
72
|
super().__init__(**kwargs)
|
72
73
|
|
73
74
|
@property
|
@@ -109,8 +110,8 @@ class DefaultFileBasedStream(AbstractFileBasedStream, IncrementalMixin):
|
|
109
110
|
self.ab_file_name_col: {"type": "string"},
|
110
111
|
},
|
111
112
|
}
|
112
|
-
elif self.
|
113
|
-
return
|
113
|
+
elif self.sync_acl_permissions:
|
114
|
+
return remote_file_permissions_schema
|
114
115
|
else:
|
115
116
|
return super()._filter_schema_invalid_properties(configured_catalog_json_schema)
|
116
117
|
|
@@ -193,9 +194,9 @@ class DefaultFileBasedStream(AbstractFileBasedStream, IncrementalMixin):
|
|
193
194
|
yield stream_data_to_airbyte_message(
|
194
195
|
self.name, record, is_file_transfer_message=True
|
195
196
|
)
|
196
|
-
elif self.
|
197
|
+
elif self.sync_acl_permissions:
|
197
198
|
try:
|
198
|
-
metadata_record = self.stream_reader.
|
199
|
+
metadata_record = self.stream_reader.get_file_acl_permissions(
|
199
200
|
file, logger=self.logger
|
200
201
|
)
|
201
202
|
yield stream_data_to_airbyte_message(
|
@@ -310,8 +311,8 @@ class DefaultFileBasedStream(AbstractFileBasedStream, IncrementalMixin):
|
|
310
311
|
def _get_raw_json_schema(self) -> JsonSchema:
|
311
312
|
if self.use_file_transfer:
|
312
313
|
return file_transfer_schema
|
313
|
-
elif self.
|
314
|
-
return
|
314
|
+
elif self.sync_acl_permissions:
|
315
|
+
return remote_file_permissions_schema
|
315
316
|
elif self.config.input_schema:
|
316
317
|
return self.config.get_input_schema() # type: ignore
|
317
318
|
elif self.config.schemaless:
|
@@ -0,0 +1,99 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2024 Airbyte, Inc., all rights reserved.
|
3
|
+
#
|
4
|
+
|
5
|
+
import traceback
|
6
|
+
from functools import cache
|
7
|
+
from typing import Any, Iterable, List, Mapping, MutableMapping, Optional
|
8
|
+
|
9
|
+
from airbyte_protocol_dataclasses.models import SyncMode
|
10
|
+
|
11
|
+
from airbyte_cdk.models import AirbyteLogMessage, AirbyteMessage, Level
|
12
|
+
from airbyte_cdk.models import Type as MessageType
|
13
|
+
from airbyte_cdk.sources.file_based.config.file_based_stream_config import PrimaryKeyType
|
14
|
+
from airbyte_cdk.sources.file_based.config.identities_based_stream_config import (
|
15
|
+
IdentitiesStreamConfig,
|
16
|
+
)
|
17
|
+
from airbyte_cdk.sources.file_based.discovery_policy import AbstractDiscoveryPolicy
|
18
|
+
from airbyte_cdk.sources.file_based.exceptions import FileBasedErrorsCollector, FileBasedSourceError
|
19
|
+
from airbyte_cdk.sources.file_based.file_based_stream_reader import AbstractFileBasedStreamReader
|
20
|
+
from airbyte_cdk.sources.file_based.schema_helpers import remote_file_identity_schema
|
21
|
+
from airbyte_cdk.sources.file_based.types import StreamSlice
|
22
|
+
from airbyte_cdk.sources.streams import Stream
|
23
|
+
from airbyte_cdk.sources.streams.checkpoint import Cursor
|
24
|
+
from airbyte_cdk.sources.streams.core import JsonSchema
|
25
|
+
from airbyte_cdk.sources.utils.record_helper import stream_data_to_airbyte_message
|
26
|
+
from airbyte_cdk.utils.traced_exception import AirbyteTracedException
|
27
|
+
|
28
|
+
|
29
|
+
class IdentitiesStream(Stream):
|
30
|
+
"""
|
31
|
+
The identities stream. A full refresh stream to sync identities from a certain domain.
|
32
|
+
The stream reader manage the logic to get such data, which is implemented on connector side.
|
33
|
+
"""
|
34
|
+
|
35
|
+
is_resumable = False
|
36
|
+
|
37
|
+
def __init__(
|
38
|
+
self,
|
39
|
+
config: IdentitiesStreamConfig,
|
40
|
+
catalog_schema: Optional[Mapping[str, Any]],
|
41
|
+
stream_reader: AbstractFileBasedStreamReader,
|
42
|
+
discovery_policy: AbstractDiscoveryPolicy,
|
43
|
+
errors_collector: FileBasedErrorsCollector,
|
44
|
+
):
|
45
|
+
super().__init__()
|
46
|
+
self.config = config
|
47
|
+
self.catalog_schema = catalog_schema
|
48
|
+
self.stream_reader = stream_reader
|
49
|
+
self._discovery_policy = discovery_policy
|
50
|
+
self.errors_collector = errors_collector
|
51
|
+
self._cursor: MutableMapping[str, Any] = {}
|
52
|
+
|
53
|
+
@property
|
54
|
+
def state(self) -> MutableMapping[str, Any]:
|
55
|
+
return self._cursor
|
56
|
+
|
57
|
+
@state.setter
|
58
|
+
def state(self, value: MutableMapping[str, Any]) -> None:
|
59
|
+
"""State setter, accept state serialized by state getter."""
|
60
|
+
self._cursor = value
|
61
|
+
|
62
|
+
@property
|
63
|
+
def primary_key(self) -> PrimaryKeyType:
|
64
|
+
return None
|
65
|
+
|
66
|
+
def read_records(
|
67
|
+
self,
|
68
|
+
sync_mode: SyncMode,
|
69
|
+
cursor_field: Optional[List[str]] = None,
|
70
|
+
stream_slice: Optional[StreamSlice] = None,
|
71
|
+
stream_state: Optional[Mapping[str, Any]] = None,
|
72
|
+
) -> Iterable[Mapping[str, Any] | AirbyteMessage]:
|
73
|
+
try:
|
74
|
+
identity_groups = self.stream_reader.load_identity_groups()
|
75
|
+
for record in identity_groups:
|
76
|
+
yield stream_data_to_airbyte_message(self.name, record)
|
77
|
+
except AirbyteTracedException as exc:
|
78
|
+
# Re-raise the exception to stop the whole sync immediately as this is a fatal error
|
79
|
+
raise exc
|
80
|
+
except Exception:
|
81
|
+
yield AirbyteMessage(
|
82
|
+
type=MessageType.LOG,
|
83
|
+
log=AirbyteLogMessage(
|
84
|
+
level=Level.ERROR,
|
85
|
+
message=f"{FileBasedSourceError.ERROR_PARSING_RECORD.value} stream={self.name}",
|
86
|
+
stack_trace=traceback.format_exc(),
|
87
|
+
),
|
88
|
+
)
|
89
|
+
|
90
|
+
@cache
|
91
|
+
def get_json_schema(self) -> JsonSchema:
|
92
|
+
return remote_file_identity_schema
|
93
|
+
|
94
|
+
@property
|
95
|
+
def name(self) -> str:
|
96
|
+
return self.config.name
|
97
|
+
|
98
|
+
def get_cursor(self) -> Optional[Cursor]:
|
99
|
+
return None
|
@@ -201,20 +201,22 @@ airbyte_cdk/sources/file_based/availability_strategy/__init__.py,sha256=ddKQfUmk
|
|
201
201
|
airbyte_cdk/sources/file_based/availability_strategy/abstract_file_based_availability_strategy.py,sha256=01Nd4b7ERAbp-OZo_8rrAzFXWPTMwr02SnWiN17nx8Q,2363
|
202
202
|
airbyte_cdk/sources/file_based/availability_strategy/default_file_based_availability_strategy.py,sha256=j9T5TimfWFUz7nqsaj-83G3xWmDpsmeSbDnaUNmz0UM,5849
|
203
203
|
airbyte_cdk/sources/file_based/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
204
|
-
airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py,sha256=
|
204
|
+
airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py,sha256=891uAzErUPQIPqr9mdzNBdU5aXGHCFCH4X64puVzQvI,7402
|
205
205
|
airbyte_cdk/sources/file_based/config/avro_format.py,sha256=NxTF96ewzn6HuhgodsY7Rpb-ybr1ZEWW5d4Vid64g5A,716
|
206
206
|
airbyte_cdk/sources/file_based/config/csv_format.py,sha256=NWekkyT8dTwiVK0mwa_krQD4FJPHSDfILo8kPAg3-Vs,8006
|
207
207
|
airbyte_cdk/sources/file_based/config/excel_format.py,sha256=9qAmTsT6SoVzNfNv0oBVkVCmiyqQuVAbfRKajjoa7Js,378
|
208
208
|
airbyte_cdk/sources/file_based/config/file_based_stream_config.py,sha256=rkTuHpz9G8o2YEnCkOZJM2vJZt_hEE4zklHivRfx43s,4647
|
209
|
+
airbyte_cdk/sources/file_based/config/identities_based_stream_config.py,sha256=VNlY8otsCLT8nvB6drT9CO1UqDGaRqP0VeQpdCJApw8,284
|
209
210
|
airbyte_cdk/sources/file_based/config/jsonl_format.py,sha256=cxtpz4t9_ERQyj_1Bx4DjOxuYLykWt0B02S4dWW5BgM,378
|
210
211
|
airbyte_cdk/sources/file_based/config/parquet_format.py,sha256=XOp-7nmm_WcbGI8SjKH2fs3Mkf1H4RAOYSWeUFYAz3w,741
|
212
|
+
airbyte_cdk/sources/file_based/config/permissions.py,sha256=CmXKilhNQOfm4NFlXVBFF2pz3hIUrt3JFp5bPVerE_8,781
|
211
213
|
airbyte_cdk/sources/file_based/config/unstructured_format.py,sha256=tIbB9Pn1HqU67ju7hEZ9dBstRrb2eojUNMsdckzbj58,3565
|
212
214
|
airbyte_cdk/sources/file_based/discovery_policy/__init__.py,sha256=gl3ey6mZbyfraB9P3pFhf9UJp2JeTZ1SUFAopy2iBvY,301
|
213
215
|
airbyte_cdk/sources/file_based/discovery_policy/abstract_discovery_policy.py,sha256=dCfXX529Rd5rtopg4VeEgTPJjFtqjtjzPq6LCw18Wt0,605
|
214
216
|
airbyte_cdk/sources/file_based/discovery_policy/default_discovery_policy.py,sha256=-xujTidtrq6HC00WKbjQh1CZdT5LMuzkp5BLjqDmfTY,1007
|
215
217
|
airbyte_cdk/sources/file_based/exceptions.py,sha256=WP0qkG6fpWoBpOyyicgp5YNE393VWyegq5qSy0v4QtM,7362
|
216
|
-
airbyte_cdk/sources/file_based/file_based_source.py,sha256=
|
217
|
-
airbyte_cdk/sources/file_based/file_based_stream_reader.py,sha256=
|
218
|
+
airbyte_cdk/sources/file_based/file_based_source.py,sha256=EQSua5n3OihEt95ROCmdv7pVLCZfdNn4jxJKyLvhMR0,20267
|
219
|
+
airbyte_cdk/sources/file_based/file_based_stream_reader.py,sha256=5TOUfVas5wiH7PaR5hrFfJFpbx12tAvBDLQy2xzFNJ0,8012
|
218
220
|
airbyte_cdk/sources/file_based/file_types/__init__.py,sha256=blCLn0-2LC-ZdgcNyDEhqM2RiUvEjEBh-G4-t32ZtuM,1268
|
219
221
|
airbyte_cdk/sources/file_based/file_types/avro_parser.py,sha256=XNx-JC-sgzH9u3nOJ2M59FxBXvtig8LN6BIkeDOavZA,10858
|
220
222
|
airbyte_cdk/sources/file_based/file_types/csv_parser.py,sha256=QlCXB-ry3np67Q_VerQEPoWDOTcPTB6Go4ydZxY9ae4,20445
|
@@ -225,11 +227,11 @@ airbyte_cdk/sources/file_based/file_types/jsonl_parser.py,sha256=GwyNyxmST4RX-Xp
|
|
225
227
|
airbyte_cdk/sources/file_based/file_types/parquet_parser.py,sha256=XenFg5sJ-UBnIkSmsiNJRou11NO0zZXx-RXgPHMT2NA,10487
|
226
228
|
airbyte_cdk/sources/file_based/file_types/unstructured_parser.py,sha256=2TYOQl62FQPCa8otLbkDIk_j01EP3oWaKSfXGhCjCHg,19492
|
227
229
|
airbyte_cdk/sources/file_based/remote_file.py,sha256=yqRz93vPe8PBXLIMJ5W5u2JRlZRhg6sBrAjn3pPjJ8A,315
|
228
|
-
airbyte_cdk/sources/file_based/schema_helpers.py,sha256=
|
230
|
+
airbyte_cdk/sources/file_based/schema_helpers.py,sha256=GJJgJPDtd0MjcB5Qt2ulqBrUT-A308loQOvoHvynUTk,10408
|
229
231
|
airbyte_cdk/sources/file_based/schema_validation_policies/__init__.py,sha256=FkByIyEy56x2_awYnxGPqGaOp7zAzpAoRkPZHKySI9M,536
|
230
232
|
airbyte_cdk/sources/file_based/schema_validation_policies/abstract_schema_validation_policy.py,sha256=kjvX7nOmUALYd7HuZHilUzgJPZ-MnZ08mtvuBnt2tQ0,618
|
231
233
|
airbyte_cdk/sources/file_based/schema_validation_policies/default_schema_validation_policies.py,sha256=vjTlmYT_nqzY3DbT5xem7X-bwgA9RyXHoKFqiMO2URk,1728
|
232
|
-
airbyte_cdk/sources/file_based/stream/__init__.py,sha256=
|
234
|
+
airbyte_cdk/sources/file_based/stream/__init__.py,sha256=Ib2D59Ehj3PKCfFvn_pamg_aMC1IN-XcYpWCfTw0oxg,370
|
233
235
|
airbyte_cdk/sources/file_based/stream/abstract_file_based_stream.py,sha256=9pQh3BHYcxm8CRC8XawfmBxL8O9HggpWwCCbX_ncINE,7509
|
234
236
|
airbyte_cdk/sources/file_based/stream/concurrent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
235
237
|
airbyte_cdk/sources/file_based/stream/concurrent/adapters.py,sha256=WZ5q2uovgohauJgwfxq_LFeZ92WMZd0LoH6c5QQURPo,13931
|
@@ -240,7 +242,8 @@ airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_final_state_c
|
|
240
242
|
airbyte_cdk/sources/file_based/stream/cursor/__init__.py,sha256=MhFB5hOo8sjwvCh8gangaymdg3EJWYt_72brFOZt068,191
|
241
243
|
airbyte_cdk/sources/file_based/stream/cursor/abstract_file_based_cursor.py,sha256=om-x3gZFPgWDpi15S9RxZmR36VHnk8sytgN6LlBQhAw,1934
|
242
244
|
airbyte_cdk/sources/file_based/stream/cursor/default_file_based_cursor.py,sha256=VGV7xLyBribuBMVrXtO1xqkWJD86bl7yhXtjnwLMohM,7051
|
243
|
-
airbyte_cdk/sources/file_based/stream/default_file_based_stream.py,sha256=
|
245
|
+
airbyte_cdk/sources/file_based/stream/default_file_based_stream.py,sha256=SFb1UXtJtaqo-1t7hM3ahM1ZTH2k01oqX1mAJvz08Y0,19529
|
246
|
+
airbyte_cdk/sources/file_based/stream/identities_stream.py,sha256=hDb_XgfD6d42mVVMMRwUg7t3CTGOmHGVspoqjNha_Gc,3763
|
244
247
|
airbyte_cdk/sources/file_based/types.py,sha256=INxG7OPnkdUP69oYNKMAbwhvV1AGvLRHs1J6pIia2FI,218
|
245
248
|
airbyte_cdk/sources/http_config.py,sha256=OBZeuyFilm6NlDlBhFQvHhTWabEvZww6OHDIlZujIS0,730
|
246
249
|
airbyte_cdk/sources/http_logger.py,sha256=l_1fk5YwdonZ1wvAsTwjj6d36fj2WrVraIAMj5jTQdM,1575
|
@@ -350,8 +353,8 @@ airbyte_cdk/utils/slice_hasher.py,sha256=-pHexlNYoWYPnXNH-M7HEbjmeJe9Zk7SJijdQ7d
|
|
350
353
|
airbyte_cdk/utils/spec_schema_transformations.py,sha256=-5HTuNsnDBAhj-oLeQXwpTGA0HdcjFOf2zTEMUTTg_Y,816
|
351
354
|
airbyte_cdk/utils/stream_status_utils.py,sha256=ZmBoiy5HVbUEHAMrUONxZvxnvfV9CesmQJLDTAIWnWw,1171
|
352
355
|
airbyte_cdk/utils/traced_exception.py,sha256=C8uIBuCL_E4WnBAOPSxBicD06JAldoN9fGsQDp463OY,6292
|
353
|
-
airbyte_cdk-6.26.0.
|
354
|
-
airbyte_cdk-6.26.0.
|
355
|
-
airbyte_cdk-6.26.0.
|
356
|
-
airbyte_cdk-6.26.0.
|
357
|
-
airbyte_cdk-6.26.0.
|
356
|
+
airbyte_cdk-6.26.0.dev4102.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
|
357
|
+
airbyte_cdk-6.26.0.dev4102.dist-info/METADATA,sha256=gtF4bkA79n-3Qpw6hYkCkH2N7t6RlXxprSdcb_wkj8c,6004
|
358
|
+
airbyte_cdk-6.26.0.dev4102.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
|
359
|
+
airbyte_cdk-6.26.0.dev4102.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
|
360
|
+
airbyte_cdk-6.26.0.dev4102.dist-info/RECORD,,
|
File without changes
|
File without changes
|
{airbyte_cdk-6.26.0.dev4101.dist-info → airbyte_cdk-6.26.0.dev4102.dist-info}/entry_points.txt
RENAMED
File without changes
|