airbyte.exceptions

All exceptions used in the PyAirbyte.

This design is modeled after structlog's exceptions, in that we bias towards auto-generated property prints rather than sentence-like string concatenation.

E.g. Instead of this:

Subprocess failed with exit code '1'

We do this:

Subprocess failed. (exit_code=1)

The benefit of this approach is that we can easily support structured logging, and we can easily add new properties to exceptions without having to update all the places where they are raised. We can also support any arbitrary number of properties in exceptions, without spending time on building sentence-like string constructions with optional inputs.

In addition, the following principles are applied for exception class design:

  • All exceptions inherit from a common base class.
  • All exceptions have a message attribute.
  • The first line of the docstring is used as the default message.
  • The default message can be overridden by explicitly setting the message attribute.
  • Exceptions may optionally have a guidance attribute.
  • Exceptions may optionally have a help_url attribute.
  • Rendering is automatically handled by the base class.
  • Any helpful context not defined by the exception class can be passed in the context dict arg.
  • Within reason, avoid sending PII to the exception constructor.
  • Exceptions are dataclasses, so they can be instantiated with keyword arguments.
  • Use the 'from' syntax to chain exceptions when it is helpful to do so. E.g. raise AirbyteConnectorNotFoundError(...) from FileNotFoundError(connector_path)
  • Any exception that adds a new property should also be decorated as @dataclass.
  1# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
  2
  3"""All exceptions used in the PyAirbyte.
  4
  5This design is modeled after structlog's exceptions, in that we bias towards auto-generated
  6property prints rather than sentence-like string concatenation.
  7
  8E.g. Instead of this:
  9
 10> `Subprocess failed with exit code '1'`
 11
 12We do this:
 13
 14> `Subprocess failed. (exit_code=1)`
 15
 16The benefit of this approach is that we can easily support structured logging, and we can
 17easily add new properties to exceptions without having to update all the places where they
 18are raised. We can also support any arbitrary number of properties in exceptions, without spending
 19time on building sentence-like string constructions with optional inputs.
 20
 21
 22In addition, the following principles are applied for exception class design:
 23
 24- All exceptions inherit from a common base class.
 25- All exceptions have a message attribute.
 26- The first line of the docstring is used as the default message.
 27- The default message can be overridden by explicitly setting the message attribute.
 28- Exceptions may optionally have a guidance attribute.
 29- Exceptions may optionally have a help_url attribute.
 30- Rendering is automatically handled by the base class.
 31- Any helpful context not defined by the exception class can be passed in the `context` dict arg.
 32- Within reason, avoid sending PII to the exception constructor.
 33- Exceptions are dataclasses, so they can be instantiated with keyword arguments.
 34- Use the 'from' syntax to chain exceptions when it is helpful to do so.
 35  E.g. `raise AirbyteConnectorNotFoundError(...) from FileNotFoundError(connector_path)`
 36- Any exception that adds a new property should also be decorated as `@dataclass`.
 37"""
 38
 39from __future__ import annotations
 40
 41import logging
 42from dataclasses import dataclass
 43from pathlib import Path
 44from textwrap import indent
 45from typing import TYPE_CHECKING, Any
 46
 47from airbyte.constants import AIRBYTE_PRINT_FULL_ERROR_LOGS
 48
 49
 50if TYPE_CHECKING:
 51    from airbyte._util.api_duck_types import AirbyteApiResponseDuckType
 52    from airbyte.cloud.workspaces import CloudWorkspace
 53
 54
 55NEW_ISSUE_URL = "https://github.com/airbytehq/airbyte/issues/new/choose"
 56DOCS_URL_BASE = "https://airbytehq.github.io/PyAirbyte"
 57DOCS_URL = f"{DOCS_URL_BASE}/airbyte.html"
 58
 59VERTICAL_SEPARATOR = "\n" + "-" * 60
 60
 61
 62# Base error class
 63
 64
 65@dataclass
 66class PyAirbyteError(Exception):
 67    """Base class for exceptions in Airbyte."""
 68
 69    guidance: str | None = None
 70    help_url: str | None = None
 71    log_text: str | list[str] | None = None
 72    log_file: Path | None = None
 73    print_full_log: bool = AIRBYTE_PRINT_FULL_ERROR_LOGS
 74    context: dict[str, Any] | None = None
 75    message: str | None = None
 76    original_exception: Exception | None = None
 77
 78    def get_message(self) -> str:
 79        """Return the best description for the exception.
 80
 81        We resolve the following in order:
 82        1. The message sent to the exception constructor (if provided).
 83        2. The first line of the class's docstring.
 84        """
 85        if self.message:
 86            return self.message
 87
 88        return self.__doc__.split("\n")[0] if self.__doc__ else ""
 89
 90    def __str__(self) -> str:
 91        """Return a string representation of the exception."""
 92        special_properties = [
 93            "message",
 94            "guidance",
 95            "help_url",
 96            "log_text",
 97            "context",
 98            "log_file",
 99            "print_full_log",
100            "original_exception",
101        ]
102        display_properties = {
103            k: v
104            for k, v in self.__dict__.items()
105            if k not in special_properties and not k.startswith("_") and v is not None
106        }
107        display_properties.update(self.context or {})
108        context_str = "\n    ".join(
109            f"{str(k).replace('_', ' ').title()}: {v!r}" for k, v in display_properties.items()
110        )
111        exception_str = (
112            f"{self.get_message()} ({self.__class__.__name__})"
113            + VERTICAL_SEPARATOR
114            + f"\n{self.__class__.__name__}: {self.get_message()}"
115        )
116
117        if self.guidance:
118            exception_str += f"\n    {self.guidance}"
119
120        if self.help_url:
121            exception_str += f"\n    More info: {self.help_url}"
122
123        if context_str:
124            exception_str += "\n    " + context_str
125
126        if self.log_text:
127            if isinstance(self.log_text, list):
128                self.log_text = "\n".join(self.log_text)
129
130            exception_str += f"\n    Log output: \n    {indent(self.log_text, '    ')}"
131
132        if self.original_exception:
133            exception_str += VERTICAL_SEPARATOR + f"\nCaused by: {self.original_exception!s}"
134
135        if self.log_file:
136            if self.print_full_log:
137                if not self.log_file.is_file():
138                    exception_str += f"\n    No log file found at: {self.log_file.absolute()!s}"
139
140                else:
141                    try:
142                        full_log_file_text = self.log_file.read_text()
143                    except Exception as ex:
144                        full_log_file_text = (
145                            f"[ERROR] Log file could not be read from: {self.log_file.absolute()!s}"
146                            f"\nRead error: {ex!s}"
147                        )
148
149                    exception_str += (
150                        f"\n    Full log file text from {self.log_file.absolute()!s}:"
151                        + VERTICAL_SEPARATOR
152                        + full_log_file_text
153                        + VERTICAL_SEPARATOR
154                    )
155            else:
156                exception_str += f"\n    Log file: {self.log_file.absolute()!s}"
157        return exception_str
158
159    def __repr__(self) -> str:
160        """Return a string representation of the exception."""
161        class_name = self.__class__.__name__
162        properties_str = ", ".join(
163            f"{k}={v!r}" for k, v in self.__dict__.items() if not k.startswith("_")
164        )
165        return f"{class_name}({properties_str})"
166
167    def safe_logging_dict(self) -> dict[str, Any]:
168        """Return a dictionary of the exception's properties which is safe for logging.
169
170        We avoid any properties which could potentially contain PII.
171        """
172        result = {
173            # The class name is safe to log:
174            "class": self.__class__.__name__,
175            # We discourage interpolated strings in 'message' so that this should never contain PII:
176            "message": self.get_message(),
177        }
178        safe_attrs = ["connector_name", "stream_name", "violation", "exit_code"]
179        for attr in safe_attrs:
180            if hasattr(self, attr):
181                result[attr] = getattr(self, attr)
182
183        return result
184
185
186# PyAirbyte Internal Errors (these are probably bugs)
187
188
189@dataclass
190class PyAirbyteInternalError(PyAirbyteError):
191    """An internal error occurred in PyAirbyte."""
192
193    guidance = "Please consider reporting this error to the Airbyte team."
194    help_url = NEW_ISSUE_URL
195
196
197# PyAirbyte Input Errors (replaces ValueError for user input)
198
199
200@dataclass
201class PyAirbyteInputError(PyAirbyteError, ValueError):
202    """The input provided to PyAirbyte did not match expected validation rules.
203
204    This inherits from ValueError so that it can be used as a drop-in replacement for
205    ValueError in the PyAirbyte API.
206    """
207
208    guidance = "Please check the provided value and try again."
209    help_url = DOCS_URL
210    input_value: str | None = None
211
212
213@dataclass
214class PyAirbyteNoStreamsSelectedError(PyAirbyteInputError):
215    """No streams were selected for the source."""
216
217    guidance = (
218        "Please call `select_streams()` to select at least one stream from the list provided. "
219        "You can also call `select_all_streams()` to select all available streams for this source."
220    )
221    connector_name: str | None = None
222    available_streams: list[str] | None = None
223
224
225# Normalization Errors
226
227
228@dataclass
229class PyAirbyteNameNormalizationError(PyAirbyteError, ValueError):
230    """Error occurred while normalizing a table or column name."""
231
232    guidance = (
233        "Please consider renaming the source object if possible, or "
234        "raise an issue in GitHub if not."
235    )
236    help_url = NEW_ISSUE_URL
237
238    raw_name: str | None = None
239    normalization_result: str | None = None
240
241
242# PyAirbyte Cache Errors
243
244
245class PyAirbyteCacheError(PyAirbyteError):
246    """Error occurred while accessing the cache."""
247
248
249@dataclass
250class PyAirbyteCacheTableValidationError(PyAirbyteCacheError):
251    """Cache table validation failed."""
252
253    violation: str | None = None
254
255
256@dataclass
257class AirbyteConnectorConfigurationMissingError(PyAirbyteCacheError):
258    """Connector is missing configuration."""
259
260    connector_name: str | None = None
261
262
263# Subprocess Errors
264
265
266@dataclass
267class AirbyteSubprocessError(PyAirbyteError):
268    """Error when running subprocess."""
269
270    run_args: list[str] | None = None
271
272
273@dataclass
274class AirbyteSubprocessFailedError(AirbyteSubprocessError):
275    """Subprocess failed."""
276
277    exit_code: int | None = None
278
279
280# Connector Registry Errors
281
282
283class AirbyteConnectorRegistryError(PyAirbyteError):
284    """Error when accessing the connector registry."""
285
286
287@dataclass
288class AirbyteConnectorNotRegisteredError(AirbyteConnectorRegistryError):
289    """Connector not found in registry."""
290
291    connector_name: str | None = None
292    guidance = (
293        "Please double check the connector name. "
294        "Alternatively, you can provide an explicit connector install method to `get_source()`: "
295        "`pip_url`, `local_executable`, `docker_image`, or `source_manifest`."
296    )
297    help_url = DOCS_URL_BASE + "/airbyte/sources/util.html#get_source"
298
299
300@dataclass
301class AirbyteConnectorNotPyPiPublishedError(AirbyteConnectorRegistryError):
302    """Connector found, but not published to PyPI."""
303
304    connector_name: str | None = None
305    guidance = "This likely means that the connector is not ready for use with PyAirbyte."
306
307
308# Connector Errors
309
310
311@dataclass
312class AirbyteConnectorError(PyAirbyteError):
313    """Error when running the connector."""
314
315    connector_name: str | None = None
316
317    def __post_init__(self) -> None:
318        """Set the log file path for the connector."""
319        self.log_file = self._get_log_file()
320        if not self.guidance and self.log_file:
321            self.guidance = "Please review the log file for more information."
322
323    def _get_log_file(self) -> Path | None:
324        """Return the log file path for the connector."""
325        if self.connector_name:
326            logger = logging.getLogger(f"airbyte.{self.connector_name}")
327
328            log_paths: list[Path] = [
329                Path(handler.baseFilename).absolute()
330                for handler in logger.handlers
331                if isinstance(handler, logging.FileHandler)
332            ]
333
334            if log_paths:
335                return log_paths[0]
336
337        return None
338
339
340class AirbyteConnectorExecutableNotFoundError(AirbyteConnectorError):
341    """Connector executable not found."""
342
343
344class AirbyteConnectorInstallationError(AirbyteConnectorError):
345    """Error when installing the connector."""
346
347
348class AirbyteConnectorReadError(AirbyteConnectorError):
349    """Error when reading from the connector."""
350
351
352class AirbyteConnectorWriteError(AirbyteConnectorError):
353    """Error when writing to the connector."""
354
355
356class AirbyteConnectorSpecFailedError(AirbyteConnectorError):
357    """Error when getting spec from the connector."""
358
359
360class AirbyteConnectorDiscoverFailedError(AirbyteConnectorError):
361    """Error when running discovery on the connector."""
362
363
364class AirbyteNoDataFromConnectorError(AirbyteConnectorError):
365    """No data was provided from the connector."""
366
367
368class AirbyteConnectorMissingCatalogError(AirbyteConnectorError):
369    """Connector did not return a catalog."""
370
371
372class AirbyteConnectorMissingSpecError(AirbyteConnectorError):
373    """Connector did not return a spec."""
374
375
376class AirbyteConnectorValidationFailedError(AirbyteConnectorError):
377    """Connector config validation failed."""
378
379    guidance = (
380        "Please double-check your config and review the validation errors for more information."
381    )
382
383
384class AirbyteConnectorCheckFailedError(AirbyteConnectorError):
385    """Connector check failed."""
386
387    guidance = (
388        "Please double-check your config or review the connector's logs for more information."
389    )
390
391
392@dataclass
393class AirbyteConnectorFailedError(AirbyteConnectorError):
394    """Connector failed."""
395
396    exit_code: int | None = None
397
398
399@dataclass
400class AirbyteStreamNotFoundError(AirbyteConnectorError):
401    """Connector stream not found."""
402
403    stream_name: str | None = None
404    available_streams: list[str] | None = None
405
406
407@dataclass
408class AirbyteStateNotFoundError(AirbyteConnectorError, KeyError):
409    """State entry not found."""
410
411    stream_name: str | None = None
412    available_streams: list[str] | None = None
413
414
415@dataclass
416class PyAirbyteSecretNotFoundError(PyAirbyteError):
417    """Secret not found."""
418
419    guidance = "Please ensure that the secret is set."
420    help_url = (
421        "https://docs.airbyte.com/using-airbyte/airbyte-lib/getting-started#secrets-management"
422    )
423
424    secret_name: str | None = None
425    sources: list[str] | None = None
426
427
428# Airbyte API Errors
429
430
431@dataclass
432class AirbyteError(PyAirbyteError):
433    """An error occurred while communicating with the hosted Airbyte instance."""
434
435    response: AirbyteApiResponseDuckType | None = None
436    """The API response from the failed request."""
437
438    workspace: CloudWorkspace | None = None
439    """The workspace where the error occurred."""
440
441    @property
442    def workspace_url(self) -> str | None:
443        """The URL to the workspace where the error occurred."""
444        if self.workspace:
445            return self.workspace.workspace_url
446
447        return None
448
449
450@dataclass
451class AirbyteConnectionError(AirbyteError):
452    """An connection error occurred while communicating with the hosted Airbyte instance."""
453
454    connection_id: str | None = None
455    """The connection ID where the error occurred."""
456
457    job_id: int | None = None
458    """The job ID where the error occurred (if applicable)."""
459
460    job_status: str | None = None
461    """The latest status of the job where the error occurred (if applicable)."""
462
463    @property
464    def connection_url(self) -> str | None:
465        """The URL to the connection where the error occurred."""
466        if self.workspace_url and self.connection_id:
467            return f"{self.workspace_url}/connections/{self.connection_id}"
468
469        return None
470
471    @property
472    def job_history_url(self) -> str | None:
473        """The URL to the job history where the error occurred."""
474        if self.connection_url:
475            return f"{self.connection_url}/job-history"
476
477        return None
478
479    @property
480    def job_url(self) -> str | None:
481        """The URL to the job where the error occurred."""
482        if self.job_history_url and self.job_id:
483            return f"{self.job_history_url}#{self.job_id}::0"
484
485        return None
486
487
488@dataclass
489class AirbyteConnectionSyncError(AirbyteConnectionError):
490    """An error occurred while executing the remote Airbyte job."""
491
492
493@dataclass
494class AirbyteConnectionSyncTimeoutError(AirbyteConnectionSyncError):
495    """An timeout occurred while waiting for the remote Airbyte job to complete."""
496
497    timeout: int | None = None
498    """The timeout in seconds that was reached."""
499
500
501# Airbyte Resource Errors (General)
502
503
504@dataclass
505class AirbyteMissingResourceError(AirbyteError):
506    """Remote Airbyte resources does not exist."""
507
508    resource_type: str | None = None
509    resource_name_or_id: str | None = None
510
511
512@dataclass
513class AirbyteDuplicateResourcesError(AirbyteError):
514    """Process failed because resource name was not unique."""
515
516    resource_type: str | None = None
517    resource_name: str | None = None
518
519
520# Custom Warnings
521@dataclass
522class AirbyteMultipleResourcesError(AirbyteError):
523    """Could not locate the resource because multiple matching resources were found."""
524
525    resource_type: str | None = None
526    resource_name_or_id: str | None = None
527
528
529# Custom Warnings
530
531
532class AirbyteExperimentalFeatureWarning(FutureWarning):
533    """Warning whenever using experimental features in PyAirbyte."""
534
535
536# PyAirbyte Warnings
537
538
539class PyAirbyteWarning(Warning):
540    """General warnings from PyAirbyte."""
541
542
543class PyAirbyteDataLossWarning(PyAirbyteWarning):
544    """Warning for potential data loss.
545
546    Users can ignore this warning by running:
547    > warnings.filterwarnings("ignore", category="airbyte.exceptions.PyAirbyteDataLossWarning")
548    """
NEW_ISSUE_URL = 'https://github.com/airbytehq/airbyte/issues/new/choose'
DOCS_URL_BASE = 'https://airbytehq.github.io/PyAirbyte'
DOCS_URL = 'https://airbytehq.github.io/PyAirbyte/airbyte.html'
VERTICAL_SEPARATOR = '\n------------------------------------------------------------'
@dataclass
class PyAirbyteError(builtins.Exception):
 66@dataclass
 67class PyAirbyteError(Exception):
 68    """Base class for exceptions in Airbyte."""
 69
 70    guidance: str | None = None
 71    help_url: str | None = None
 72    log_text: str | list[str] | None = None
 73    log_file: Path | None = None
 74    print_full_log: bool = AIRBYTE_PRINT_FULL_ERROR_LOGS
 75    context: dict[str, Any] | None = None
 76    message: str | None = None
 77    original_exception: Exception | None = None
 78
 79    def get_message(self) -> str:
 80        """Return the best description for the exception.
 81
 82        We resolve the following in order:
 83        1. The message sent to the exception constructor (if provided).
 84        2. The first line of the class's docstring.
 85        """
 86        if self.message:
 87            return self.message
 88
 89        return self.__doc__.split("\n")[0] if self.__doc__ else ""
 90
 91    def __str__(self) -> str:
 92        """Return a string representation of the exception."""
 93        special_properties = [
 94            "message",
 95            "guidance",
 96            "help_url",
 97            "log_text",
 98            "context",
 99            "log_file",
100            "print_full_log",
101            "original_exception",
102        ]
103        display_properties = {
104            k: v
105            for k, v in self.__dict__.items()
106            if k not in special_properties and not k.startswith("_") and v is not None
107        }
108        display_properties.update(self.context or {})
109        context_str = "\n    ".join(
110            f"{str(k).replace('_', ' ').title()}: {v!r}" for k, v in display_properties.items()
111        )
112        exception_str = (
113            f"{self.get_message()} ({self.__class__.__name__})"
114            + VERTICAL_SEPARATOR
115            + f"\n{self.__class__.__name__}: {self.get_message()}"
116        )
117
118        if self.guidance:
119            exception_str += f"\n    {self.guidance}"
120
121        if self.help_url:
122            exception_str += f"\n    More info: {self.help_url}"
123
124        if context_str:
125            exception_str += "\n    " + context_str
126
127        if self.log_text:
128            if isinstance(self.log_text, list):
129                self.log_text = "\n".join(self.log_text)
130
131            exception_str += f"\n    Log output: \n    {indent(self.log_text, '    ')}"
132
133        if self.original_exception:
134            exception_str += VERTICAL_SEPARATOR + f"\nCaused by: {self.original_exception!s}"
135
136        if self.log_file:
137            if self.print_full_log:
138                if not self.log_file.is_file():
139                    exception_str += f"\n    No log file found at: {self.log_file.absolute()!s}"
140
141                else:
142                    try:
143                        full_log_file_text = self.log_file.read_text()
144                    except Exception as ex:
145                        full_log_file_text = (
146                            f"[ERROR] Log file could not be read from: {self.log_file.absolute()!s}"
147                            f"\nRead error: {ex!s}"
148                        )
149
150                    exception_str += (
151                        f"\n    Full log file text from {self.log_file.absolute()!s}:"
152                        + VERTICAL_SEPARATOR
153                        + full_log_file_text
154                        + VERTICAL_SEPARATOR
155                    )
156            else:
157                exception_str += f"\n    Log file: {self.log_file.absolute()!s}"
158        return exception_str
159
160    def __repr__(self) -> str:
161        """Return a string representation of the exception."""
162        class_name = self.__class__.__name__
163        properties_str = ", ".join(
164            f"{k}={v!r}" for k, v in self.__dict__.items() if not k.startswith("_")
165        )
166        return f"{class_name}({properties_str})"
167
168    def safe_logging_dict(self) -> dict[str, Any]:
169        """Return a dictionary of the exception's properties which is safe for logging.
170
171        We avoid any properties which could potentially contain PII.
172        """
173        result = {
174            # The class name is safe to log:
175            "class": self.__class__.__name__,
176            # We discourage interpolated strings in 'message' so that this should never contain PII:
177            "message": self.get_message(),
178        }
179        safe_attrs = ["connector_name", "stream_name", "violation", "exit_code"]
180        for attr in safe_attrs:
181            if hasattr(self, attr):
182                result[attr] = getattr(self, attr)
183
184        return result

Base class for exceptions in Airbyte.

PyAirbyteError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None)
guidance: str | None = None
help_url: str | None = None
log_text: str | list[str] | None = None
log_file: pathlib.Path | None = None
print_full_log: bool = True
context: dict[str, typing.Any] | None = None
message: str | None = None
original_exception: Exception | None = None
def get_message(self) -> str:
79    def get_message(self) -> str:
80        """Return the best description for the exception.
81
82        We resolve the following in order:
83        1. The message sent to the exception constructor (if provided).
84        2. The first line of the class's docstring.
85        """
86        if self.message:
87            return self.message
88
89        return self.__doc__.split("\n")[0] if self.__doc__ else ""

Return the best description for the exception.

We resolve the following in order:

  1. The message sent to the exception constructor (if provided).
  2. The first line of the class's docstring.
def safe_logging_dict(self) -> dict[str, typing.Any]:
168    def safe_logging_dict(self) -> dict[str, Any]:
169        """Return a dictionary of the exception's properties which is safe for logging.
170
171        We avoid any properties which could potentially contain PII.
172        """
173        result = {
174            # The class name is safe to log:
175            "class": self.__class__.__name__,
176            # We discourage interpolated strings in 'message' so that this should never contain PII:
177            "message": self.get_message(),
178        }
179        safe_attrs = ["connector_name", "stream_name", "violation", "exit_code"]
180        for attr in safe_attrs:
181            if hasattr(self, attr):
182                result[attr] = getattr(self, attr)
183
184        return result

Return a dictionary of the exception's properties which is safe for logging.

We avoid any properties which could potentially contain PII.

Inherited Members
builtins.BaseException
with_traceback
args
@dataclass
class PyAirbyteInternalError(PyAirbyteError):
190@dataclass
191class PyAirbyteInternalError(PyAirbyteError):
192    """An internal error occurred in PyAirbyte."""
193
194    guidance = "Please consider reporting this error to the Airbyte team."
195    help_url = NEW_ISSUE_URL

An internal error occurred in PyAirbyte.

PyAirbyteInternalError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None)
guidance = 'Please consider reporting this error to the Airbyte team.'
help_url = 'https://github.com/airbytehq/airbyte/issues/new/choose'
Inherited Members
PyAirbyteError
log_text
log_file
print_full_log
context
message
original_exception
get_message
safe_logging_dict
builtins.BaseException
with_traceback
args
@dataclass
class PyAirbyteInputError(PyAirbyteError, builtins.ValueError):
201@dataclass
202class PyAirbyteInputError(PyAirbyteError, ValueError):
203    """The input provided to PyAirbyte did not match expected validation rules.
204
205    This inherits from ValueError so that it can be used as a drop-in replacement for
206    ValueError in the PyAirbyte API.
207    """
208
209    guidance = "Please check the provided value and try again."
210    help_url = DOCS_URL
211    input_value: str | None = None

The input provided to PyAirbyte did not match expected validation rules.

This inherits from ValueError so that it can be used as a drop-in replacement for ValueError in the PyAirbyte API.

PyAirbyteInputError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, input_value: str | None = None)
guidance = 'Please check the provided value and try again.'
help_url = 'https://airbytehq.github.io/PyAirbyte/airbyte.html'
input_value: str | None = None
Inherited Members
PyAirbyteError
log_text
log_file
print_full_log
context
message
original_exception
get_message
safe_logging_dict
builtins.BaseException
with_traceback
args
@dataclass
class PyAirbyteNoStreamsSelectedError(PyAirbyteInputError):
214@dataclass
215class PyAirbyteNoStreamsSelectedError(PyAirbyteInputError):
216    """No streams were selected for the source."""
217
218    guidance = (
219        "Please call `select_streams()` to select at least one stream from the list provided. "
220        "You can also call `select_all_streams()` to select all available streams for this source."
221    )
222    connector_name: str | None = None
223    available_streams: list[str] | None = None

No streams were selected for the source.

PyAirbyteNoStreamsSelectedError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, input_value: str | None = None, connector_name: str | None = None, available_streams: list[str] | None = None)
guidance = 'Please call `select_streams()` to select at least one stream from the list provided. You can also call `select_all_streams()` to select all available streams for this source.'
connector_name: str | None = None
available_streams: list[str] | None = None
@dataclass
class PyAirbyteNameNormalizationError(PyAirbyteError, builtins.ValueError):
229@dataclass
230class PyAirbyteNameNormalizationError(PyAirbyteError, ValueError):
231    """Error occurred while normalizing a table or column name."""
232
233    guidance = (
234        "Please consider renaming the source object if possible, or "
235        "raise an issue in GitHub if not."
236    )
237    help_url = NEW_ISSUE_URL
238
239    raw_name: str | None = None
240    normalization_result: str | None = None

Error occurred while normalizing a table or column name.

PyAirbyteNameNormalizationError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, raw_name: str | None = None, normalization_result: str | None = None)
guidance = 'Please consider renaming the source object if possible, or raise an issue in GitHub if not.'
help_url = 'https://github.com/airbytehq/airbyte/issues/new/choose'
raw_name: str | None = None
normalization_result: str | None = None
Inherited Members
PyAirbyteError
log_text
log_file
print_full_log
context
message
original_exception
get_message
safe_logging_dict
builtins.BaseException
with_traceback
args
class PyAirbyteCacheError(PyAirbyteError):
246class PyAirbyteCacheError(PyAirbyteError):
247    """Error occurred while accessing the cache."""

Error occurred while accessing the cache.

@dataclass
class PyAirbyteCacheTableValidationError(PyAirbyteCacheError):
250@dataclass
251class PyAirbyteCacheTableValidationError(PyAirbyteCacheError):
252    """Cache table validation failed."""
253
254    violation: str | None = None

Cache table validation failed.

PyAirbyteCacheTableValidationError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, violation: str | None = None)
violation: str | None = None
@dataclass
class AirbyteConnectorConfigurationMissingError(PyAirbyteCacheError):
257@dataclass
258class AirbyteConnectorConfigurationMissingError(PyAirbyteCacheError):
259    """Connector is missing configuration."""
260
261    connector_name: str | None = None

Connector is missing configuration.

AirbyteConnectorConfigurationMissingError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, connector_name: str | None = None)
connector_name: str | None = None
@dataclass
class AirbyteSubprocessError(PyAirbyteError):
267@dataclass
268class AirbyteSubprocessError(PyAirbyteError):
269    """Error when running subprocess."""
270
271    run_args: list[str] | None = None

Error when running subprocess.

AirbyteSubprocessError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, run_args: list[str] | None = None)
run_args: list[str] | None = None
@dataclass
class AirbyteSubprocessFailedError(AirbyteSubprocessError):
274@dataclass
275class AirbyteSubprocessFailedError(AirbyteSubprocessError):
276    """Subprocess failed."""
277
278    exit_code: int | None = None

Subprocess failed.

AirbyteSubprocessFailedError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, run_args: list[str] | None = None, exit_code: int | None = None)
exit_code: int | None = None
class AirbyteConnectorRegistryError(PyAirbyteError):
284class AirbyteConnectorRegistryError(PyAirbyteError):
285    """Error when accessing the connector registry."""

Error when accessing the connector registry.

@dataclass
class AirbyteConnectorNotRegisteredError(AirbyteConnectorRegistryError):
288@dataclass
289class AirbyteConnectorNotRegisteredError(AirbyteConnectorRegistryError):
290    """Connector not found in registry."""
291
292    connector_name: str | None = None
293    guidance = (
294        "Please double check the connector name. "
295        "Alternatively, you can provide an explicit connector install method to `get_source()`: "
296        "`pip_url`, `local_executable`, `docker_image`, or `source_manifest`."
297    )
298    help_url = DOCS_URL_BASE + "/airbyte/sources/util.html#get_source"

Connector not found in registry.

AirbyteConnectorNotRegisteredError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, connector_name: str | None = None)
connector_name: str | None = None
guidance = 'Please double check the connector name. Alternatively, you can provide an explicit connector install method to `get_source()`: `pip_url`, `local_executable`, `docker_image`, or `source_manifest`.'
help_url = 'https://airbytehq.github.io/PyAirbyte/airbyte/sources/util.html#get_source'
Inherited Members
PyAirbyteError
log_text
log_file
print_full_log
context
message
original_exception
get_message
safe_logging_dict
builtins.BaseException
with_traceback
args
@dataclass
class AirbyteConnectorNotPyPiPublishedError(AirbyteConnectorRegistryError):
301@dataclass
302class AirbyteConnectorNotPyPiPublishedError(AirbyteConnectorRegistryError):
303    """Connector found, but not published to PyPI."""
304
305    connector_name: str | None = None
306    guidance = "This likely means that the connector is not ready for use with PyAirbyte."

Connector found, but not published to PyPI.

AirbyteConnectorNotPyPiPublishedError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, connector_name: str | None = None)
connector_name: str | None = None
guidance = 'This likely means that the connector is not ready for use with PyAirbyte.'
@dataclass
class AirbyteConnectorError(PyAirbyteError):
312@dataclass
313class AirbyteConnectorError(PyAirbyteError):
314    """Error when running the connector."""
315
316    connector_name: str | None = None
317
318    def __post_init__(self) -> None:
319        """Set the log file path for the connector."""
320        self.log_file = self._get_log_file()
321        if not self.guidance and self.log_file:
322            self.guidance = "Please review the log file for more information."
323
324    def _get_log_file(self) -> Path | None:
325        """Return the log file path for the connector."""
326        if self.connector_name:
327            logger = logging.getLogger(f"airbyte.{self.connector_name}")
328
329            log_paths: list[Path] = [
330                Path(handler.baseFilename).absolute()
331                for handler in logger.handlers
332                if isinstance(handler, logging.FileHandler)
333            ]
334
335            if log_paths:
336                return log_paths[0]
337
338        return None

Error when running the connector.

AirbyteConnectorError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, connector_name: str | None = None)
connector_name: str | None = None
class AirbyteConnectorExecutableNotFoundError(AirbyteConnectorError):
341class AirbyteConnectorExecutableNotFoundError(AirbyteConnectorError):
342    """Connector executable not found."""

Connector executable not found.

class AirbyteConnectorInstallationError(AirbyteConnectorError):
345class AirbyteConnectorInstallationError(AirbyteConnectorError):
346    """Error when installing the connector."""

Error when installing the connector.

class AirbyteConnectorReadError(AirbyteConnectorError):
349class AirbyteConnectorReadError(AirbyteConnectorError):
350    """Error when reading from the connector."""

Error when reading from the connector.

class AirbyteConnectorWriteError(AirbyteConnectorError):
353class AirbyteConnectorWriteError(AirbyteConnectorError):
354    """Error when writing to the connector."""

Error when writing to the connector.

class AirbyteConnectorSpecFailedError(AirbyteConnectorError):
357class AirbyteConnectorSpecFailedError(AirbyteConnectorError):
358    """Error when getting spec from the connector."""

Error when getting spec from the connector.

class AirbyteConnectorDiscoverFailedError(AirbyteConnectorError):
361class AirbyteConnectorDiscoverFailedError(AirbyteConnectorError):
362    """Error when running discovery on the connector."""

Error when running discovery on the connector.

class AirbyteNoDataFromConnectorError(AirbyteConnectorError):
365class AirbyteNoDataFromConnectorError(AirbyteConnectorError):
366    """No data was provided from the connector."""

No data was provided from the connector.

class AirbyteConnectorMissingCatalogError(AirbyteConnectorError):
369class AirbyteConnectorMissingCatalogError(AirbyteConnectorError):
370    """Connector did not return a catalog."""

Connector did not return a catalog.

class AirbyteConnectorMissingSpecError(AirbyteConnectorError):
373class AirbyteConnectorMissingSpecError(AirbyteConnectorError):
374    """Connector did not return a spec."""

Connector did not return a spec.

class AirbyteConnectorValidationFailedError(AirbyteConnectorError):
377class AirbyteConnectorValidationFailedError(AirbyteConnectorError):
378    """Connector config validation failed."""
379
380    guidance = (
381        "Please double-check your config and review the validation errors for more information."
382    )

Connector config validation failed.

guidance = 'Please double-check your config and review the validation errors for more information.'
class AirbyteConnectorCheckFailedError(AirbyteConnectorError):
385class AirbyteConnectorCheckFailedError(AirbyteConnectorError):
386    """Connector check failed."""
387
388    guidance = (
389        "Please double-check your config or review the connector's logs for more information."
390    )

Connector check failed.

guidance = "Please double-check your config or review the connector's logs for more information."
@dataclass
class AirbyteConnectorFailedError(AirbyteConnectorError):
393@dataclass
394class AirbyteConnectorFailedError(AirbyteConnectorError):
395    """Connector failed."""
396
397    exit_code: int | None = None

Connector failed.

AirbyteConnectorFailedError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, connector_name: str | None = None, exit_code: int | None = None)
exit_code: int | None = None
@dataclass
class AirbyteStreamNotFoundError(AirbyteConnectorError):
400@dataclass
401class AirbyteStreamNotFoundError(AirbyteConnectorError):
402    """Connector stream not found."""
403
404    stream_name: str | None = None
405    available_streams: list[str] | None = None

Connector stream not found.

AirbyteStreamNotFoundError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, connector_name: str | None = None, stream_name: str | None = None, available_streams: list[str] | None = None)
stream_name: str | None = None
available_streams: list[str] | None = None
@dataclass
class AirbyteStateNotFoundError(AirbyteConnectorError, builtins.KeyError):
408@dataclass
409class AirbyteStateNotFoundError(AirbyteConnectorError, KeyError):
410    """State entry not found."""
411
412    stream_name: str | None = None
413    available_streams: list[str] | None = None

State entry not found.

AirbyteStateNotFoundError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, connector_name: str | None = None, stream_name: str | None = None, available_streams: list[str] | None = None)
stream_name: str | None = None
available_streams: list[str] | None = None
@dataclass
class PyAirbyteSecretNotFoundError(PyAirbyteError):
416@dataclass
417class PyAirbyteSecretNotFoundError(PyAirbyteError):
418    """Secret not found."""
419
420    guidance = "Please ensure that the secret is set."
421    help_url = (
422        "https://docs.airbyte.com/using-airbyte/airbyte-lib/getting-started#secrets-management"
423    )
424
425    secret_name: str | None = None
426    sources: list[str] | None = None

Secret not found.

PyAirbyteSecretNotFoundError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, secret_name: str | None = None, sources: list[str] | None = None)
guidance = 'Please ensure that the secret is set.'
help_url = 'https://docs.airbyte.com/using-airbyte/airbyte-lib/getting-started#secrets-management'
secret_name: str | None = None
sources: list[str] | None = None
Inherited Members
PyAirbyteError
log_text
log_file
print_full_log
context
message
original_exception
get_message
safe_logging_dict
builtins.BaseException
with_traceback
args
@dataclass
class AirbyteError(PyAirbyteError):
432@dataclass
433class AirbyteError(PyAirbyteError):
434    """An error occurred while communicating with the hosted Airbyte instance."""
435
436    response: AirbyteApiResponseDuckType | None = None
437    """The API response from the failed request."""
438
439    workspace: CloudWorkspace | None = None
440    """The workspace where the error occurred."""
441
442    @property
443    def workspace_url(self) -> str | None:
444        """The URL to the workspace where the error occurred."""
445        if self.workspace:
446            return self.workspace.workspace_url
447
448        return None

An error occurred while communicating with the hosted Airbyte instance.

AirbyteError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, response: airbyte._util.api_duck_types.AirbyteApiResponseDuckType | None = None, workspace: airbyte.cloud.CloudWorkspace | None = None)
response: airbyte._util.api_duck_types.AirbyteApiResponseDuckType | None = None

The API response from the failed request.

workspace: airbyte.cloud.CloudWorkspace | None = None

The workspace where the error occurred.

workspace_url: str | None
442    @property
443    def workspace_url(self) -> str | None:
444        """The URL to the workspace where the error occurred."""
445        if self.workspace:
446            return self.workspace.workspace_url
447
448        return None

The URL to the workspace where the error occurred.

@dataclass
class AirbyteConnectionError(AirbyteError):
451@dataclass
452class AirbyteConnectionError(AirbyteError):
453    """An connection error occurred while communicating with the hosted Airbyte instance."""
454
455    connection_id: str | None = None
456    """The connection ID where the error occurred."""
457
458    job_id: int | None = None
459    """The job ID where the error occurred (if applicable)."""
460
461    job_status: str | None = None
462    """The latest status of the job where the error occurred (if applicable)."""
463
464    @property
465    def connection_url(self) -> str | None:
466        """The URL to the connection where the error occurred."""
467        if self.workspace_url and self.connection_id:
468            return f"{self.workspace_url}/connections/{self.connection_id}"
469
470        return None
471
472    @property
473    def job_history_url(self) -> str | None:
474        """The URL to the job history where the error occurred."""
475        if self.connection_url:
476            return f"{self.connection_url}/job-history"
477
478        return None
479
480    @property
481    def job_url(self) -> str | None:
482        """The URL to the job where the error occurred."""
483        if self.job_history_url and self.job_id:
484            return f"{self.job_history_url}#{self.job_id}::0"
485
486        return None

An connection error occurred while communicating with the hosted Airbyte instance.

AirbyteConnectionError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, response: airbyte._util.api_duck_types.AirbyteApiResponseDuckType | None = None, workspace: airbyte.cloud.CloudWorkspace | None = None, connection_id: str | None = None, job_id: int | None = None, job_status: str | None = None)
connection_id: str | None = None

The connection ID where the error occurred.

job_id: int | None = None

The job ID where the error occurred (if applicable).

job_status: str | None = None

The latest status of the job where the error occurred (if applicable).

connection_url: str | None
464    @property
465    def connection_url(self) -> str | None:
466        """The URL to the connection where the error occurred."""
467        if self.workspace_url and self.connection_id:
468            return f"{self.workspace_url}/connections/{self.connection_id}"
469
470        return None

The URL to the connection where the error occurred.

job_history_url: str | None
472    @property
473    def job_history_url(self) -> str | None:
474        """The URL to the job history where the error occurred."""
475        if self.connection_url:
476            return f"{self.connection_url}/job-history"
477
478        return None

The URL to the job history where the error occurred.

job_url: str | None
480    @property
481    def job_url(self) -> str | None:
482        """The URL to the job where the error occurred."""
483        if self.job_history_url and self.job_id:
484            return f"{self.job_history_url}#{self.job_id}::0"
485
486        return None

The URL to the job where the error occurred.

@dataclass
class AirbyteConnectionSyncError(AirbyteConnectionError):
489@dataclass
490class AirbyteConnectionSyncError(AirbyteConnectionError):
491    """An error occurred while executing the remote Airbyte job."""

An error occurred while executing the remote Airbyte job.

AirbyteConnectionSyncError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, response: airbyte._util.api_duck_types.AirbyteApiResponseDuckType | None = None, workspace: airbyte.cloud.CloudWorkspace | None = None, connection_id: str | None = None, job_id: int | None = None, job_status: str | None = None)
@dataclass
class AirbyteConnectionSyncTimeoutError(AirbyteConnectionSyncError):
494@dataclass
495class AirbyteConnectionSyncTimeoutError(AirbyteConnectionSyncError):
496    """An timeout occurred while waiting for the remote Airbyte job to complete."""
497
498    timeout: int | None = None
499    """The timeout in seconds that was reached."""

An timeout occurred while waiting for the remote Airbyte job to complete.

AirbyteConnectionSyncTimeoutError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, response: airbyte._util.api_duck_types.AirbyteApiResponseDuckType | None = None, workspace: airbyte.cloud.CloudWorkspace | None = None, connection_id: str | None = None, job_id: int | None = None, job_status: str | None = None, timeout: int | None = None)
timeout: int | None = None

The timeout in seconds that was reached.

@dataclass
class AirbyteMissingResourceError(AirbyteError):
505@dataclass
506class AirbyteMissingResourceError(AirbyteError):
507    """Remote Airbyte resources does not exist."""
508
509    resource_type: str | None = None
510    resource_name_or_id: str | None = None

Remote Airbyte resources does not exist.

AirbyteMissingResourceError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, response: airbyte._util.api_duck_types.AirbyteApiResponseDuckType | None = None, workspace: airbyte.cloud.CloudWorkspace | None = None, resource_type: str | None = None, resource_name_or_id: str | None = None)
resource_type: str | None = None
resource_name_or_id: str | None = None
@dataclass
class AirbyteDuplicateResourcesError(AirbyteError):
513@dataclass
514class AirbyteDuplicateResourcesError(AirbyteError):
515    """Process failed because resource name was not unique."""
516
517    resource_type: str | None = None
518    resource_name: str | None = None

Process failed because resource name was not unique.

AirbyteDuplicateResourcesError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, response: airbyte._util.api_duck_types.AirbyteApiResponseDuckType | None = None, workspace: airbyte.cloud.CloudWorkspace | None = None, resource_type: str | None = None, resource_name: str | None = None)
resource_type: str | None = None
resource_name: str | None = None
@dataclass
class AirbyteMultipleResourcesError(AirbyteError):
522@dataclass
523class AirbyteMultipleResourcesError(AirbyteError):
524    """Could not locate the resource because multiple matching resources were found."""
525
526    resource_type: str | None = None
527    resource_name_or_id: str | None = None

Could not locate the resource because multiple matching resources were found.

AirbyteMultipleResourcesError( guidance: str | None = None, help_url: str | None = None, log_text: str | list[str] | None = None, log_file: pathlib.Path | None = None, print_full_log: bool = True, context: dict[str, typing.Any] | None = None, message: str | None = None, original_exception: Exception | None = None, response: airbyte._util.api_duck_types.AirbyteApiResponseDuckType | None = None, workspace: airbyte.cloud.CloudWorkspace | None = None, resource_type: str | None = None, resource_name_or_id: str | None = None)
resource_type: str | None = None
resource_name_or_id: str | None = None
class AirbyteExperimentalFeatureWarning(builtins.FutureWarning):
533class AirbyteExperimentalFeatureWarning(FutureWarning):
534    """Warning whenever using experimental features in PyAirbyte."""

Warning whenever using experimental features in PyAirbyte.

Inherited Members
builtins.FutureWarning
FutureWarning
builtins.BaseException
with_traceback
args
class PyAirbyteWarning(builtins.Warning):
540class PyAirbyteWarning(Warning):
541    """General warnings from PyAirbyte."""

General warnings from PyAirbyte.

Inherited Members
builtins.Warning
Warning
builtins.BaseException
with_traceback
args
class PyAirbyteDataLossWarning(PyAirbyteWarning):
544class PyAirbyteDataLossWarning(PyAirbyteWarning):
545    """Warning for potential data loss.
546
547    Users can ignore this warning by running:
548    > warnings.filterwarnings("ignore", category="airbyte.exceptions.PyAirbyteDataLossWarning")
549    """

Warning for potential data loss.

Users can ignore this warning by running:

warnings.filterwarnings("ignore", category="airbyte.exceptions.PyAirbyteDataLossWarning")

Inherited Members
builtins.Warning
Warning
builtins.BaseException
with_traceback
args