airbyte-agent-zendesk-support 0.18.36__py3-none-any.whl → 0.18.38__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_agent_zendesk_support/_vendored/connector_sdk/auth_strategies.py +2 -5
- airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_template.py +1 -1
- airbyte_agent_zendesk_support/_vendored/connector_sdk/cloud_utils/client.py +1 -1
- airbyte_agent_zendesk_support/_vendored/connector_sdk/connector_model_loader.py +1 -2
- airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/local_executor.py +3 -4
- airbyte_agent_zendesk_support/_vendored/connector_sdk/extensions.py +1 -2
- airbyte_agent_zendesk_support/_vendored/connector_sdk/http/response.py +2 -0
- airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/logger.py +9 -9
- airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/types.py +10 -10
- airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/config.py +2 -2
- airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/models.py +6 -6
- airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/session.py +7 -5
- airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/metrics.py +3 -3
- airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/base.py +17 -17
- airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/components.py +58 -58
- airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/extensions.py +9 -9
- airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/operations.py +31 -31
- airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/security.py +36 -36
- airbyte_agent_zendesk_support/_vendored/connector_sdk/secrets.py +2 -2
- airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/events.py +7 -7
- airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/tracker.py +6 -5
- airbyte_agent_zendesk_support/_vendored/connector_sdk/types.py +2 -2
- airbyte_agent_zendesk_support/connector.py +1 -1
- {airbyte_agent_zendesk_support-0.18.36.dist-info → airbyte_agent_zendesk_support-0.18.38.dist-info}/METADATA +3 -3
- {airbyte_agent_zendesk_support-0.18.36.dist-info → airbyte_agent_zendesk_support-0.18.38.dist-info}/RECORD +26 -26
- {airbyte_agent_zendesk_support-0.18.36.dist-info → airbyte_agent_zendesk_support-0.18.38.dist-info}/WHEEL +0 -0
|
@@ -610,9 +610,7 @@ class OAuth2AuthStrategy(AuthStrategy):
|
|
|
610
610
|
has_refresh_token = bool(secrets.get("refresh_token"))
|
|
611
611
|
|
|
612
612
|
if not has_access_token and not has_refresh_token:
|
|
613
|
-
raise AuthenticationError(
|
|
614
|
-
"Missing OAuth2 credentials. Provide either 'access_token' " "or 'refresh_token' (for refresh-token-only mode)."
|
|
615
|
-
)
|
|
613
|
+
raise AuthenticationError("Missing OAuth2 credentials. Provide either 'access_token' or 'refresh_token' (for refresh-token-only mode).")
|
|
616
614
|
|
|
617
615
|
def can_refresh(self, secrets: OAuth2RefreshSecrets) -> bool:
|
|
618
616
|
"""Check if token refresh is possible.
|
|
@@ -1106,8 +1104,7 @@ class AuthStrategyFactory:
|
|
|
1106
1104
|
strategy = cls._strategies.get(auth_type)
|
|
1107
1105
|
if strategy is None:
|
|
1108
1106
|
raise AuthenticationError(
|
|
1109
|
-
f"Authentication type '{auth_type.value}' is not implemented. "
|
|
1110
|
-
f"Supported types: {', '.join(s.value for s in cls._strategies.keys())}"
|
|
1107
|
+
f"Authentication type '{auth_type.value}' is not implemented. Supported types: {', '.join(s.value for s in cls._strategies.keys())}"
|
|
1111
1108
|
)
|
|
1112
1109
|
return strategy
|
|
1113
1110
|
|
|
@@ -17,7 +17,7 @@ class MissingVariableError(ValueError):
|
|
|
17
17
|
def __init__(self, var_name: str, available_fields: list):
|
|
18
18
|
self.var_name = var_name
|
|
19
19
|
self.available_fields = available_fields
|
|
20
|
-
super().__init__(f"Template variable '${{{var_name}}}' not found in config.
|
|
20
|
+
super().__init__(f"Template variable '${{{var_name}}}' not found in config. Available fields: {available_fields}")
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
def apply_template(template: str, values: Dict[str, str]) -> str:
|
|
@@ -149,7 +149,7 @@ class AirbyteCloudClient:
|
|
|
149
149
|
instances = data["instances"]
|
|
150
150
|
|
|
151
151
|
if len(instances) == 0:
|
|
152
|
-
raise ValueError(f"No connector instance found for user '{external_user_id}'
|
|
152
|
+
raise ValueError(f"No connector instance found for user '{external_user_id}' and connector '{connector_definition_id}'")
|
|
153
153
|
|
|
154
154
|
if len(instances) > 1:
|
|
155
155
|
raise ValueError(
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import logging
|
|
5
6
|
import re
|
|
6
7
|
from pathlib import Path
|
|
7
8
|
from typing import Any
|
|
@@ -768,8 +769,6 @@ def _parse_auth_from_openapi(spec: OpenAPIConnector) -> AuthConfig:
|
|
|
768
769
|
options.append(auth_option)
|
|
769
770
|
except Exception as e:
|
|
770
771
|
# Log warning but continue - skip invalid schemes
|
|
771
|
-
import logging
|
|
772
|
-
|
|
773
772
|
logger = logging.getLogger(__name__)
|
|
774
773
|
logger.warning(f"Skipping invalid security scheme '{scheme_name}': {e}")
|
|
775
774
|
continue
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import asyncio
|
|
6
|
+
import inspect
|
|
6
7
|
import logging
|
|
7
8
|
import os
|
|
8
9
|
import re
|
|
@@ -11,6 +12,7 @@ from collections.abc import AsyncIterator
|
|
|
11
12
|
from typing import Any, Protocol
|
|
12
13
|
from urllib.parse import quote
|
|
13
14
|
|
|
15
|
+
from jinja2 import Environment, StrictUndefined
|
|
14
16
|
from jsonpath_ng import parse as parse_jsonpath
|
|
15
17
|
from opentelemetry import trace
|
|
16
18
|
|
|
@@ -506,8 +508,6 @@ class LocalExecutor:
|
|
|
506
508
|
result = handler.execute_operation(config.entity, action, params)
|
|
507
509
|
|
|
508
510
|
# Check if it's an async generator (download) or awaitable (standard)
|
|
509
|
-
import inspect
|
|
510
|
-
|
|
511
511
|
if inspect.isasyncgen(result):
|
|
512
512
|
# Download operation: return generator directly
|
|
513
513
|
return ExecutionResult(
|
|
@@ -814,7 +814,6 @@ class LocalExecutor:
|
|
|
814
814
|
>>> _substitute_file_field_params("attachments[{attachment_index}].url", {"attachment_index": 0})
|
|
815
815
|
"attachments[0].url"
|
|
816
816
|
"""
|
|
817
|
-
from jinja2 import Environment, StrictUndefined
|
|
818
817
|
|
|
819
818
|
# Use custom delimiters to match OpenAPI path parameter syntax {var}
|
|
820
819
|
# StrictUndefined raises clear error if a template variable is missing
|
|
@@ -1235,7 +1234,7 @@ class LocalExecutor:
|
|
|
1235
1234
|
|
|
1236
1235
|
if missing_fields:
|
|
1237
1236
|
raise MissingParameterError(
|
|
1238
|
-
f"Missing required body fields for {entity}.{action.value}: {missing_fields}.
|
|
1237
|
+
f"Missing required body fields for {entity}.{action.value}: {missing_fields}. Provided parameters: {list(params.keys())}"
|
|
1239
1238
|
)
|
|
1240
1239
|
|
|
1241
1240
|
async def close(self):
|
|
@@ -666,8 +666,7 @@ EXTENSION_REGISTRY = {
|
|
|
666
666
|
"type": "dict[str, str]",
|
|
667
667
|
"required": False,
|
|
668
668
|
"description": (
|
|
669
|
-
"Dictionary mapping field names to JSONPath expressions for extracting metadata "
|
|
670
|
-
"(pagination, request IDs, etc.) from response envelopes"
|
|
669
|
+
"Dictionary mapping field names to JSONPath expressions for extracting metadata (pagination, request IDs, etc.) from response envelopes"
|
|
671
670
|
),
|
|
672
671
|
},
|
|
673
672
|
AIRBYTE_FILE_URL: {
|
|
@@ -80,6 +80,8 @@ class HTTPResponse:
|
|
|
80
80
|
HTTPStatusError: For 4xx or 5xx status codes.
|
|
81
81
|
"""
|
|
82
82
|
if 400 <= self._status_code < 600:
|
|
83
|
+
# NOTE: Import here intentionally to avoid circular import.
|
|
84
|
+
# exceptions.py imports HTTPResponse for type hints.
|
|
83
85
|
from .exceptions import HTTPStatusError
|
|
84
86
|
|
|
85
87
|
raise HTTPStatusError(
|
|
@@ -5,7 +5,7 @@ import json
|
|
|
5
5
|
import time
|
|
6
6
|
import uuid
|
|
7
7
|
from pathlib import Path
|
|
8
|
-
from typing import Any, Dict,
|
|
8
|
+
from typing import Any, Dict, Set
|
|
9
9
|
|
|
10
10
|
from .types import LogSession, RequestLog
|
|
11
11
|
|
|
@@ -31,9 +31,9 @@ class RequestLogger:
|
|
|
31
31
|
|
|
32
32
|
def __init__(
|
|
33
33
|
self,
|
|
34
|
-
log_file:
|
|
35
|
-
connector_name:
|
|
36
|
-
max_logs:
|
|
34
|
+
log_file: str | None = None,
|
|
35
|
+
connector_name: str | None = None,
|
|
36
|
+
max_logs: int | None = 10000,
|
|
37
37
|
):
|
|
38
38
|
"""
|
|
39
39
|
Initialize the request logger.
|
|
@@ -99,9 +99,9 @@ class RequestLogger:
|
|
|
99
99
|
method: str,
|
|
100
100
|
url: str,
|
|
101
101
|
path: str,
|
|
102
|
-
headers:
|
|
103
|
-
params:
|
|
104
|
-
body:
|
|
102
|
+
headers: Dict[str, str] | None = None,
|
|
103
|
+
params: Dict[str, Any] | None = None,
|
|
104
|
+
body: Any | None = None,
|
|
105
105
|
) -> str:
|
|
106
106
|
"""
|
|
107
107
|
Log the start of an HTTP request.
|
|
@@ -133,7 +133,7 @@ class RequestLogger:
|
|
|
133
133
|
self,
|
|
134
134
|
request_id: str,
|
|
135
135
|
status_code: int,
|
|
136
|
-
response_body:
|
|
136
|
+
response_body: Any | None = None,
|
|
137
137
|
) -> None:
|
|
138
138
|
"""
|
|
139
139
|
Log a successful HTTP response.
|
|
@@ -176,7 +176,7 @@ class RequestLogger:
|
|
|
176
176
|
self,
|
|
177
177
|
request_id: str,
|
|
178
178
|
error: str,
|
|
179
|
-
status_code:
|
|
179
|
+
status_code: int | None = None,
|
|
180
180
|
) -> None:
|
|
181
181
|
"""
|
|
182
182
|
Log an HTTP request error.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import base64
|
|
4
4
|
from datetime import UTC, datetime
|
|
5
|
-
from typing import Any, Dict, List
|
|
5
|
+
from typing import Any, Dict, List
|
|
6
6
|
|
|
7
7
|
from pydantic import BaseModel, ConfigDict, Field, field_serializer, field_validator
|
|
8
8
|
|
|
@@ -27,12 +27,12 @@ class RequestLog(BaseModel):
|
|
|
27
27
|
url: str
|
|
28
28
|
path: str
|
|
29
29
|
headers: Dict[str, str] = Field(default_factory=dict)
|
|
30
|
-
params:
|
|
31
|
-
body:
|
|
32
|
-
response_status:
|
|
33
|
-
response_body:
|
|
34
|
-
timing_ms:
|
|
35
|
-
error:
|
|
30
|
+
params: Dict[str, Any] | None = None
|
|
31
|
+
body: Any | None = None
|
|
32
|
+
response_status: int | None = None
|
|
33
|
+
response_body: Any | None = None
|
|
34
|
+
timing_ms: float | None = None
|
|
35
|
+
error: str | None = None
|
|
36
36
|
|
|
37
37
|
@field_serializer("timestamp")
|
|
38
38
|
def serialize_datetime(self, value: datetime) -> str:
|
|
@@ -50,9 +50,9 @@ class LogSession(BaseModel):
|
|
|
50
50
|
|
|
51
51
|
session_id: str
|
|
52
52
|
started_at: datetime = Field(default_factory=_utc_now)
|
|
53
|
-
connector_name:
|
|
53
|
+
connector_name: str | None = None
|
|
54
54
|
logs: List[RequestLog] = Field(default_factory=list)
|
|
55
|
-
max_logs:
|
|
55
|
+
max_logs: int | None = Field(
|
|
56
56
|
default=10000,
|
|
57
57
|
description="Maximum number of logs to keep in memory. "
|
|
58
58
|
"When limit is reached, oldest logs should be flushed before removal. "
|
|
@@ -60,7 +60,7 @@ class LogSession(BaseModel):
|
|
|
60
60
|
)
|
|
61
61
|
chunk_logs: List[bytes] = Field(
|
|
62
62
|
default_factory=list,
|
|
63
|
-
description="Captured chunks from streaming responses.
|
|
63
|
+
description="Captured chunks from streaming responses. Each chunk is logged when log_chunk_fetch() is called.",
|
|
64
64
|
)
|
|
65
65
|
|
|
66
66
|
@field_validator("chunk_logs", mode="before")
|
|
@@ -6,7 +6,7 @@ import tempfile
|
|
|
6
6
|
import uuid
|
|
7
7
|
from dataclasses import dataclass, field
|
|
8
8
|
from pathlib import Path
|
|
9
|
-
from typing import Any
|
|
9
|
+
from typing import Any
|
|
10
10
|
|
|
11
11
|
import yaml
|
|
12
12
|
|
|
@@ -53,7 +53,7 @@ def _delete_legacy_files() -> None:
|
|
|
53
53
|
logger.debug(f"Could not delete legacy file {legacy_path}: {e}")
|
|
54
54
|
|
|
55
55
|
|
|
56
|
-
def _migrate_legacy_config() ->
|
|
56
|
+
def _migrate_legacy_config() -> SDKConfig | None:
|
|
57
57
|
"""
|
|
58
58
|
Migrate from legacy file-based config to new YAML format.
|
|
59
59
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from datetime import datetime
|
|
5
|
-
from typing import Any, Dict
|
|
5
|
+
from typing import Any, Dict
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
@dataclass
|
|
@@ -12,8 +12,8 @@ class OperationMetadata:
|
|
|
12
12
|
entity: str
|
|
13
13
|
action: str
|
|
14
14
|
timestamp: datetime
|
|
15
|
-
timing_ms:
|
|
16
|
-
status_code:
|
|
17
|
-
error_type:
|
|
18
|
-
error_message:
|
|
19
|
-
params:
|
|
15
|
+
timing_ms: float | None = None
|
|
16
|
+
status_code: int | None = None
|
|
17
|
+
error_type: str | None = None
|
|
18
|
+
error_message: str | None = None
|
|
19
|
+
params: Dict[str, Any] | None = None
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
import logging
|
|
4
4
|
import uuid
|
|
5
5
|
from datetime import UTC, datetime
|
|
6
|
-
from typing import Any, Dict
|
|
6
|
+
from typing import Any, Dict
|
|
7
7
|
|
|
8
8
|
from .config import SDKConfig, load_config
|
|
9
9
|
|
|
10
10
|
logger = logging.getLogger(__name__)
|
|
11
11
|
|
|
12
12
|
# Cache the config at module level to avoid repeated reads
|
|
13
|
-
_cached_config:
|
|
13
|
+
_cached_config: SDKConfig | None = None
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
def _get_config() -> SDKConfig:
|
|
@@ -39,7 +39,7 @@ def get_persistent_user_id() -> str:
|
|
|
39
39
|
return _get_config().user_id
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
def get_public_ip() ->
|
|
42
|
+
def get_public_ip() -> str | None:
|
|
43
43
|
"""
|
|
44
44
|
Fetch the public IP address of the user.
|
|
45
45
|
|
|
@@ -47,6 +47,8 @@ def get_public_ip() -> Optional[str]:
|
|
|
47
47
|
Uses httpx for a robust HTTP request to a public IP service.
|
|
48
48
|
"""
|
|
49
49
|
try:
|
|
50
|
+
# NOTE: Import here intentionally - this is a non-critical network call
|
|
51
|
+
# that may fail. Importing at module level would make httpx a hard dependency.
|
|
50
52
|
import httpx
|
|
51
53
|
|
|
52
54
|
# Use a short timeout to avoid blocking
|
|
@@ -77,9 +79,9 @@ class ObservabilitySession:
|
|
|
77
79
|
def __init__(
|
|
78
80
|
self,
|
|
79
81
|
connector_name: str,
|
|
80
|
-
connector_version:
|
|
82
|
+
connector_version: str | None = None,
|
|
81
83
|
execution_context: str = "direct",
|
|
82
|
-
session_id:
|
|
84
|
+
session_id: str | None = None,
|
|
83
85
|
):
|
|
84
86
|
self.session_id = session_id or str(uuid.uuid4())
|
|
85
87
|
self.user_id = get_persistent_user_id()
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import time
|
|
4
4
|
from contextlib import asynccontextmanager
|
|
5
|
-
from typing import Dict
|
|
5
|
+
from typing import Dict
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class PerformanceMonitor:
|
|
@@ -33,7 +33,7 @@ class PerformanceMonitor:
|
|
|
33
33
|
metrics["min"] = min(metrics["min"], duration)
|
|
34
34
|
metrics["max"] = max(metrics["max"], duration)
|
|
35
35
|
|
|
36
|
-
def get_stats(self, metric_name: str) ->
|
|
36
|
+
def get_stats(self, metric_name: str) -> Dict[str, float] | None:
|
|
37
37
|
"""Get statistics for a metric.
|
|
38
38
|
|
|
39
39
|
Args:
|
|
@@ -62,7 +62,7 @@ class PerformanceMonitor:
|
|
|
62
62
|
"""
|
|
63
63
|
return {name: self.get_stats(name) for name in self._metrics.keys()}
|
|
64
64
|
|
|
65
|
-
def reset(self, metric_name:
|
|
65
|
+
def reset(self, metric_name: str | None = None):
|
|
66
66
|
"""Reset metrics.
|
|
67
67
|
|
|
68
68
|
Args:
|
|
@@ -7,7 +7,7 @@ References:
|
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
9
|
from enum import StrEnum
|
|
10
|
-
from typing import Dict
|
|
10
|
+
from typing import Dict
|
|
11
11
|
from uuid import UUID
|
|
12
12
|
|
|
13
13
|
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
@@ -45,9 +45,9 @@ class Contact(BaseModel):
|
|
|
45
45
|
|
|
46
46
|
model_config = ConfigDict(populate_by_name=True, extra="forbid")
|
|
47
47
|
|
|
48
|
-
name:
|
|
49
|
-
url:
|
|
50
|
-
email:
|
|
48
|
+
name: str | None = None
|
|
49
|
+
url: str | None = None
|
|
50
|
+
email: str | None = None
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
class License(BaseModel):
|
|
@@ -60,7 +60,7 @@ class License(BaseModel):
|
|
|
60
60
|
model_config = ConfigDict(populate_by_name=True, extra="forbid")
|
|
61
61
|
|
|
62
62
|
name: str
|
|
63
|
-
url:
|
|
63
|
+
url: str | None = None
|
|
64
64
|
|
|
65
65
|
|
|
66
66
|
class DocUrlType(StrEnum):
|
|
@@ -85,7 +85,7 @@ class DocUrl(BaseModel):
|
|
|
85
85
|
|
|
86
86
|
url: str
|
|
87
87
|
type: DocUrlType
|
|
88
|
-
title:
|
|
88
|
+
title: str | None = None
|
|
89
89
|
|
|
90
90
|
@field_validator("url")
|
|
91
91
|
def validate_url(cls, v):
|
|
@@ -111,17 +111,17 @@ class Info(BaseModel):
|
|
|
111
111
|
|
|
112
112
|
title: str
|
|
113
113
|
version: str
|
|
114
|
-
description:
|
|
115
|
-
terms_of_service:
|
|
116
|
-
contact:
|
|
117
|
-
license:
|
|
114
|
+
description: str | None = None
|
|
115
|
+
terms_of_service: str | None = Field(None, alias="termsOfService")
|
|
116
|
+
contact: Contact | None = None
|
|
117
|
+
license: License | None = None
|
|
118
118
|
|
|
119
119
|
# Airbyte extension
|
|
120
|
-
x_airbyte_connector_name:
|
|
121
|
-
x_airbyte_connector_id:
|
|
120
|
+
x_airbyte_connector_name: str | None = Field(None, alias="x-airbyte-connector-name")
|
|
121
|
+
x_airbyte_connector_id: UUID | None = Field(None, alias="x-airbyte-connector-id")
|
|
122
122
|
x_airbyte_external_documentation_urls: list[DocUrl] = Field(..., alias="x-airbyte-external-documentation-urls")
|
|
123
|
-
x_airbyte_retry_config:
|
|
124
|
-
x_airbyte_example_questions:
|
|
123
|
+
x_airbyte_retry_config: RetryConfig | None = Field(None, alias="x-airbyte-retry-config")
|
|
124
|
+
x_airbyte_example_questions: ExampleQuestions | None = Field(None, alias="x-airbyte-example-questions")
|
|
125
125
|
|
|
126
126
|
|
|
127
127
|
class ServerVariable(BaseModel):
|
|
@@ -133,9 +133,9 @@ class ServerVariable(BaseModel):
|
|
|
133
133
|
|
|
134
134
|
model_config = ConfigDict(populate_by_name=True, extra="forbid")
|
|
135
135
|
|
|
136
|
-
enum:
|
|
136
|
+
enum: list[str] | None = None
|
|
137
137
|
default: str
|
|
138
|
-
description:
|
|
138
|
+
description: str | None = None
|
|
139
139
|
|
|
140
140
|
|
|
141
141
|
class Server(BaseModel):
|
|
@@ -148,7 +148,7 @@ class Server(BaseModel):
|
|
|
148
148
|
model_config = ConfigDict(populate_by_name=True, extra="forbid")
|
|
149
149
|
|
|
150
150
|
url: str
|
|
151
|
-
description:
|
|
151
|
+
description: str | None = None
|
|
152
152
|
variables: Dict[str, ServerVariable] = Field(default_factory=dict)
|
|
153
153
|
|
|
154
154
|
@field_validator("url")
|
|
@@ -7,7 +7,7 @@ References:
|
|
|
7
7
|
- https://spec.openapis.org/oas/v3.1.0#parameter-object
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
from typing import Any, Dict, List, Literal,
|
|
10
|
+
from typing import Any, Dict, List, Literal, Union
|
|
11
11
|
|
|
12
12
|
from pydantic import BaseModel, ConfigDict, Field
|
|
13
13
|
|
|
@@ -30,44 +30,44 @@ class Schema(BaseModel):
|
|
|
30
30
|
model_config = ConfigDict(populate_by_name=True, extra="forbid")
|
|
31
31
|
|
|
32
32
|
# Core JSON Schema fields
|
|
33
|
-
type:
|
|
34
|
-
format:
|
|
35
|
-
title:
|
|
36
|
-
description:
|
|
37
|
-
default:
|
|
38
|
-
example:
|
|
33
|
+
type: str | None = None
|
|
34
|
+
format: str | None = None
|
|
35
|
+
title: str | None = None
|
|
36
|
+
description: str | None = None
|
|
37
|
+
default: Any | None = None
|
|
38
|
+
example: Any | None = None
|
|
39
39
|
|
|
40
40
|
# Object properties
|
|
41
41
|
properties: Dict[str, Any] = Field(default_factory=dict) # May contain $ref
|
|
42
42
|
required: List[str] = Field(default_factory=list)
|
|
43
|
-
additional_properties:
|
|
43
|
+
additional_properties: Any | None = Field(None, alias="additionalProperties")
|
|
44
44
|
|
|
45
45
|
# Array properties
|
|
46
|
-
items:
|
|
46
|
+
items: Any | None = None # May be Schema or $ref
|
|
47
47
|
|
|
48
48
|
# Validation
|
|
49
|
-
enum:
|
|
50
|
-
min_length:
|
|
51
|
-
max_length:
|
|
52
|
-
minimum:
|
|
53
|
-
maximum:
|
|
54
|
-
pattern:
|
|
49
|
+
enum: List[Any] | None = None
|
|
50
|
+
min_length: int | None = Field(None, alias="minLength")
|
|
51
|
+
max_length: int | None = Field(None, alias="maxLength")
|
|
52
|
+
minimum: float | None = None
|
|
53
|
+
maximum: float | None = None
|
|
54
|
+
pattern: str | None = None
|
|
55
55
|
|
|
56
56
|
# Composition
|
|
57
|
-
all_of:
|
|
58
|
-
any_of:
|
|
59
|
-
one_of:
|
|
60
|
-
not_:
|
|
57
|
+
all_of: List[Any] | None = Field(None, alias="allOf")
|
|
58
|
+
any_of: List[Any] | None = Field(None, alias="anyOf")
|
|
59
|
+
one_of: List[Any] | None = Field(None, alias="oneOf")
|
|
60
|
+
not_: Any | None = Field(None, alias="not")
|
|
61
61
|
|
|
62
62
|
# Metadata
|
|
63
|
-
nullable:
|
|
64
|
-
read_only:
|
|
65
|
-
write_only:
|
|
66
|
-
deprecated:
|
|
63
|
+
nullable: bool | None = Field(None, deprecated="Use type union with null instead (OpenAPI 3.1)")
|
|
64
|
+
read_only: bool | None = Field(None, alias="readOnly")
|
|
65
|
+
write_only: bool | None = Field(None, alias="writeOnly")
|
|
66
|
+
deprecated: bool | None = None
|
|
67
67
|
|
|
68
68
|
# Airbyte extensions
|
|
69
|
-
x_airbyte_entity_name:
|
|
70
|
-
x_airbyte_stream_name:
|
|
69
|
+
x_airbyte_entity_name: str | None = Field(None, alias="x-airbyte-entity-name")
|
|
70
|
+
x_airbyte_stream_name: str | None = Field(None, alias="x-airbyte-stream-name")
|
|
71
71
|
|
|
72
72
|
|
|
73
73
|
class Parameter(BaseModel):
|
|
@@ -81,19 +81,19 @@ class Parameter(BaseModel):
|
|
|
81
81
|
|
|
82
82
|
name: str
|
|
83
83
|
in_: Literal["query", "header", "path", "cookie"] = Field(alias="in")
|
|
84
|
-
description:
|
|
85
|
-
required:
|
|
86
|
-
deprecated:
|
|
87
|
-
allow_empty_value:
|
|
84
|
+
description: str | None = None
|
|
85
|
+
required: bool | None = None
|
|
86
|
+
deprecated: bool | None = None
|
|
87
|
+
allow_empty_value: bool | None = Field(None, alias="allowEmptyValue")
|
|
88
88
|
|
|
89
89
|
# Schema can be inline or reference
|
|
90
|
-
schema_:
|
|
90
|
+
schema_: Dict[str, Any] | None = Field(None, alias="schema")
|
|
91
91
|
|
|
92
92
|
# Style and examples
|
|
93
|
-
style:
|
|
94
|
-
explode:
|
|
95
|
-
example:
|
|
96
|
-
examples:
|
|
93
|
+
style: str | None = None
|
|
94
|
+
explode: bool | None = None
|
|
95
|
+
example: Any | None = None
|
|
96
|
+
examples: Dict[str, Any] | None = None
|
|
97
97
|
|
|
98
98
|
|
|
99
99
|
class MediaType(BaseModel):
|
|
@@ -105,10 +105,10 @@ class MediaType(BaseModel):
|
|
|
105
105
|
|
|
106
106
|
model_config = ConfigDict(populate_by_name=True, extra="forbid")
|
|
107
107
|
|
|
108
|
-
schema_:
|
|
109
|
-
example:
|
|
110
|
-
examples:
|
|
111
|
-
encoding:
|
|
108
|
+
schema_: Dict[str, Any] | None = Field(None, alias="schema")
|
|
109
|
+
example: Any | None = None
|
|
110
|
+
examples: Dict[str, Any] | None = None
|
|
111
|
+
encoding: Dict[str, Any] | None = None
|
|
112
112
|
|
|
113
113
|
|
|
114
114
|
class GraphQLBodyConfig(BaseModel):
|
|
@@ -125,12 +125,12 @@ class GraphQLBodyConfig(BaseModel):
|
|
|
125
125
|
...,
|
|
126
126
|
description="GraphQL query or mutation string with optional template placeholders (e.g., {{ variable }})",
|
|
127
127
|
)
|
|
128
|
-
variables:
|
|
128
|
+
variables: Dict[str, Any] | None = Field(
|
|
129
129
|
None,
|
|
130
130
|
description="Variables to substitute in the GraphQL query using template syntax (e.g., {{ param_name }})",
|
|
131
131
|
)
|
|
132
|
-
operationName:
|
|
133
|
-
default_fields:
|
|
132
|
+
operationName: str | None = Field(None, description="Operation name for queries with multiple operations")
|
|
133
|
+
default_fields: Union[str, List[str]] | None = Field(
|
|
134
134
|
None,
|
|
135
135
|
description="Default fields to select if not provided in request parameters. Can be a string or array of field names.",
|
|
136
136
|
)
|
|
@@ -156,7 +156,7 @@ class PathOverrideConfig(BaseModel):
|
|
|
156
156
|
|
|
157
157
|
path: str = Field(
|
|
158
158
|
...,
|
|
159
|
-
description=("Actual HTTP path to use for requests (e.g., '/graphql').
|
|
159
|
+
description=("Actual HTTP path to use for requests (e.g., '/graphql'). Must start with '/'"),
|
|
160
160
|
)
|
|
161
161
|
|
|
162
162
|
|
|
@@ -173,17 +173,17 @@ class RequestBody(BaseModel):
|
|
|
173
173
|
|
|
174
174
|
model_config = ConfigDict(populate_by_name=True, extra="forbid")
|
|
175
175
|
|
|
176
|
-
description:
|
|
176
|
+
description: str | None = None
|
|
177
177
|
content: Dict[str, MediaType] = Field(default_factory=dict)
|
|
178
|
-
required:
|
|
178
|
+
required: bool | None = None
|
|
179
179
|
|
|
180
180
|
# Airbyte extensions for GraphQL support
|
|
181
181
|
# See connector_sdk.extensions for AIRBYTE_BODY_TYPE constant
|
|
182
|
-
x_airbyte_body_type:
|
|
182
|
+
x_airbyte_body_type: BodyTypeConfig | None = Field(
|
|
183
183
|
None,
|
|
184
184
|
alias="x-airbyte-body-type", # AIRBYTE_BODY_TYPE
|
|
185
185
|
description=(
|
|
186
|
-
"Body type and configuration. Contains 'type' field (e.g., 'graphql')
|
|
186
|
+
"Body type and configuration. Contains 'type' field (e.g., 'graphql') and type-specific configuration (query, variables, etc.)."
|
|
187
187
|
),
|
|
188
188
|
)
|
|
189
189
|
|
|
@@ -197,11 +197,11 @@ class Header(BaseModel):
|
|
|
197
197
|
|
|
198
198
|
model_config = ConfigDict(populate_by_name=True, extra="forbid")
|
|
199
199
|
|
|
200
|
-
description:
|
|
201
|
-
required:
|
|
202
|
-
deprecated:
|
|
203
|
-
schema_:
|
|
204
|
-
example:
|
|
200
|
+
description: str | None = None
|
|
201
|
+
required: bool | None = None
|
|
202
|
+
deprecated: bool | None = None
|
|
203
|
+
schema_: Dict[str, Any] | None = Field(None, alias="schema")
|
|
204
|
+
example: Any | None = None
|
|
205
205
|
|
|
206
206
|
|
|
207
207
|
class Response(BaseModel):
|
|
@@ -214,9 +214,9 @@ class Response(BaseModel):
|
|
|
214
214
|
model_config = ConfigDict(populate_by_name=True, extra="forbid")
|
|
215
215
|
|
|
216
216
|
description: str
|
|
217
|
-
headers:
|
|
218
|
-
content:
|
|
219
|
-
links:
|
|
217
|
+
headers: Dict[str, Header] | None = None
|
|
218
|
+
content: Dict[str, MediaType] | None = None
|
|
219
|
+
links: Dict[str, Any] | None = None
|
|
220
220
|
|
|
221
221
|
|
|
222
222
|
class Components(BaseModel):
|
|
@@ -231,9 +231,9 @@ class Components(BaseModel):
|
|
|
231
231
|
schemas: Dict[str, Schema] = Field(default_factory=dict)
|
|
232
232
|
responses: Dict[str, Response] = Field(default_factory=dict)
|
|
233
233
|
parameters: Dict[str, Parameter] = Field(default_factory=dict)
|
|
234
|
-
examples:
|
|
234
|
+
examples: Dict[str, Any] | None = None
|
|
235
235
|
request_bodies: Dict[str, RequestBody] = Field(default_factory=dict, alias="requestBodies")
|
|
236
|
-
headers:
|
|
236
|
+
headers: Dict[str, Header] | None = None
|
|
237
237
|
security_schemes: Dict[str, SecurityScheme] = Field(default_factory=dict, alias="securitySchemes")
|
|
238
|
-
links:
|
|
239
|
-
callbacks:
|
|
238
|
+
links: Dict[str, Any] | None = None
|
|
239
|
+
callbacks: Dict[str, Any] | None = None
|
|
@@ -12,7 +12,7 @@ to Operation, Schema, or other models when their respective features
|
|
|
12
12
|
are implemented.
|
|
13
13
|
"""
|
|
14
14
|
|
|
15
|
-
from typing import Literal
|
|
15
|
+
from typing import Literal
|
|
16
16
|
|
|
17
17
|
from pydantic import BaseModel, ConfigDict
|
|
18
18
|
|
|
@@ -33,22 +33,22 @@ class PaginationConfig(BaseModel):
|
|
|
33
33
|
limit_param: str = "limit"
|
|
34
34
|
|
|
35
35
|
# Cursor-based pagination
|
|
36
|
-
cursor_param:
|
|
37
|
-
cursor_source:
|
|
38
|
-
cursor_path:
|
|
36
|
+
cursor_param: str | None = None
|
|
37
|
+
cursor_source: Literal["body", "headers"] | None = "body"
|
|
38
|
+
cursor_path: str | None = None
|
|
39
39
|
|
|
40
40
|
# Offset-based pagination
|
|
41
|
-
offset_param:
|
|
41
|
+
offset_param: str | None = None
|
|
42
42
|
|
|
43
43
|
# Page-based pagination
|
|
44
|
-
page_param:
|
|
44
|
+
page_param: str | None = None
|
|
45
45
|
|
|
46
46
|
# Response parsing
|
|
47
47
|
data_path: str = "data"
|
|
48
|
-
has_more_path:
|
|
48
|
+
has_more_path: str | None = None
|
|
49
49
|
|
|
50
50
|
# Limits
|
|
51
|
-
max_page_size:
|
|
51
|
+
max_page_size: int | None = None
|
|
52
52
|
default_page_size: int = 100
|
|
53
53
|
|
|
54
54
|
|
|
@@ -66,7 +66,7 @@ class RateLimitConfig(BaseModel):
|
|
|
66
66
|
|
|
67
67
|
max_requests: int
|
|
68
68
|
time_window_seconds: int
|
|
69
|
-
retry_after_header:
|
|
69
|
+
retry_after_header: str | None = "Retry-After"
|
|
70
70
|
respect_retry_after: bool = True
|
|
71
71
|
|
|
72
72
|
|
|
@@ -6,7 +6,7 @@ References:
|
|
|
6
6
|
- https://spec.openapis.org/oas/v3.1.0#path-item-object
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
-
from typing import Any, Dict, List
|
|
9
|
+
from typing import Any, Dict, List
|
|
10
10
|
|
|
11
11
|
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
|
12
12
|
|
|
@@ -34,28 +34,28 @@ class Operation(BaseModel):
|
|
|
34
34
|
model_config = ConfigDict(populate_by_name=True, extra="forbid")
|
|
35
35
|
|
|
36
36
|
# Standard OpenAPI fields
|
|
37
|
-
tags:
|
|
38
|
-
summary:
|
|
39
|
-
description:
|
|
40
|
-
external_docs:
|
|
41
|
-
operation_id:
|
|
42
|
-
parameters:
|
|
43
|
-
request_body:
|
|
37
|
+
tags: List[str] | None = None
|
|
38
|
+
summary: str | None = None
|
|
39
|
+
description: str | None = None
|
|
40
|
+
external_docs: Dict[str, Any] | None = Field(None, alias="externalDocs")
|
|
41
|
+
operation_id: str | None = Field(None, alias="operationId")
|
|
42
|
+
parameters: List[Parameter] | None = None
|
|
43
|
+
request_body: RequestBody | None = Field(None, alias="requestBody")
|
|
44
44
|
responses: Dict[str, Response] = Field(default_factory=dict)
|
|
45
|
-
callbacks:
|
|
46
|
-
deprecated:
|
|
47
|
-
security:
|
|
48
|
-
servers:
|
|
45
|
+
callbacks: Dict[str, Any] | None = None
|
|
46
|
+
deprecated: bool | None = None
|
|
47
|
+
security: List[SecurityRequirement] | None = None
|
|
48
|
+
servers: List[Any] | None = None # Can override root servers
|
|
49
49
|
|
|
50
50
|
# Airbyte extensions
|
|
51
51
|
x_airbyte_entity: str = Field(..., alias="x-airbyte-entity")
|
|
52
52
|
x_airbyte_action: ActionTypeLiteral = Field(..., alias="x-airbyte-action")
|
|
53
|
-
x_airbyte_path_override:
|
|
53
|
+
x_airbyte_path_override: PathOverrideConfig | None = Field(
|
|
54
54
|
None,
|
|
55
55
|
alias="x-airbyte-path-override",
|
|
56
|
-
description=("Override path for HTTP requests when OpenAPI path
|
|
56
|
+
description=("Override path for HTTP requests when OpenAPI path differs from actual endpoint"),
|
|
57
57
|
)
|
|
58
|
-
x_airbyte_record_extractor:
|
|
58
|
+
x_airbyte_record_extractor: str | None = Field(
|
|
59
59
|
None,
|
|
60
60
|
alias="x-airbyte-record-extractor",
|
|
61
61
|
description=(
|
|
@@ -65,7 +65,7 @@ class Operation(BaseModel):
|
|
|
65
65
|
"get/create/update/delete actions."
|
|
66
66
|
),
|
|
67
67
|
)
|
|
68
|
-
x_airbyte_meta_extractor:
|
|
68
|
+
x_airbyte_meta_extractor: Dict[str, str] | None = Field(
|
|
69
69
|
None,
|
|
70
70
|
alias="x-airbyte-meta-extractor",
|
|
71
71
|
description=(
|
|
@@ -76,8 +76,8 @@ class Operation(BaseModel):
|
|
|
76
76
|
"Example: {'pagination': '$.pagination', 'request_id': '$.requestId'}"
|
|
77
77
|
),
|
|
78
78
|
)
|
|
79
|
-
x_airbyte_file_url:
|
|
80
|
-
x_airbyte_untested:
|
|
79
|
+
x_airbyte_file_url: str | None = Field(None, alias="x-airbyte-file-url")
|
|
80
|
+
x_airbyte_untested: bool | None = Field(
|
|
81
81
|
None,
|
|
82
82
|
alias="x-airbyte-untested",
|
|
83
83
|
description=(
|
|
@@ -127,20 +127,20 @@ class PathItem(BaseModel):
|
|
|
127
127
|
model_config = ConfigDict(populate_by_name=True, extra="forbid")
|
|
128
128
|
|
|
129
129
|
# Common fields for all operations
|
|
130
|
-
summary:
|
|
131
|
-
description:
|
|
132
|
-
servers:
|
|
133
|
-
parameters:
|
|
130
|
+
summary: str | None = None
|
|
131
|
+
description: str | None = None
|
|
132
|
+
servers: List[Any] | None = None
|
|
133
|
+
parameters: List[Parameter] | None = None
|
|
134
134
|
|
|
135
135
|
# HTTP methods (all optional)
|
|
136
|
-
get:
|
|
137
|
-
put:
|
|
138
|
-
post:
|
|
139
|
-
delete:
|
|
140
|
-
options:
|
|
141
|
-
head:
|
|
142
|
-
patch:
|
|
143
|
-
trace:
|
|
136
|
+
get: Operation | None = None
|
|
137
|
+
put: Operation | None = None
|
|
138
|
+
post: Operation | None = None
|
|
139
|
+
delete: Operation | None = None
|
|
140
|
+
options: Operation | None = None
|
|
141
|
+
head: Operation | None = None
|
|
142
|
+
patch: Operation | None = None
|
|
143
|
+
trace: Operation | None = None
|
|
144
144
|
|
|
145
145
|
# Reference support
|
|
146
|
-
ref:
|
|
146
|
+
ref: str | None = Field(None, alias="$ref")
|
|
@@ -6,7 +6,7 @@ References:
|
|
|
6
6
|
- https://spec.openapis.org/oas/v3.1.0#oauth-flows-object
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
-
from typing import Any, Dict, List, Literal
|
|
9
|
+
from typing import Any, Dict, List, Literal
|
|
10
10
|
|
|
11
11
|
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
|
|
12
12
|
|
|
@@ -20,9 +20,9 @@ class OAuth2Flow(BaseModel):
|
|
|
20
20
|
|
|
21
21
|
model_config = ConfigDict(populate_by_name=True, extra="forbid")
|
|
22
22
|
|
|
23
|
-
authorization_url:
|
|
24
|
-
token_url:
|
|
25
|
-
refresh_url:
|
|
23
|
+
authorization_url: str | None = Field(None, alias="authorizationUrl")
|
|
24
|
+
token_url: str | None = Field(None, alias="tokenUrl")
|
|
25
|
+
refresh_url: str | None = Field(None, alias="refreshUrl")
|
|
26
26
|
scopes: Dict[str, str] = Field(default_factory=dict)
|
|
27
27
|
|
|
28
28
|
|
|
@@ -35,10 +35,10 @@ class OAuth2Flows(BaseModel):
|
|
|
35
35
|
|
|
36
36
|
model_config = ConfigDict(populate_by_name=True, extra="forbid")
|
|
37
37
|
|
|
38
|
-
implicit:
|
|
39
|
-
password:
|
|
40
|
-
client_credentials:
|
|
41
|
-
authorization_code:
|
|
38
|
+
implicit: OAuth2Flow | None = None
|
|
39
|
+
password: OAuth2Flow | None = None
|
|
40
|
+
client_credentials: OAuth2Flow | None = Field(None, alias="clientCredentials")
|
|
41
|
+
authorization_code: OAuth2Flow | None = Field(None, alias="authorizationCode")
|
|
42
42
|
|
|
43
43
|
|
|
44
44
|
class AuthConfigFieldSpec(BaseModel):
|
|
@@ -51,12 +51,12 @@ class AuthConfigFieldSpec(BaseModel):
|
|
|
51
51
|
model_config = ConfigDict(populate_by_name=True, extra="forbid")
|
|
52
52
|
|
|
53
53
|
type: Literal["string", "integer", "boolean", "number"] = "string"
|
|
54
|
-
title:
|
|
55
|
-
description:
|
|
56
|
-
format:
|
|
57
|
-
pattern:
|
|
54
|
+
title: str | None = None
|
|
55
|
+
description: str | None = None
|
|
56
|
+
format: str | None = None # e.g., "email", "uri"
|
|
57
|
+
pattern: str | None = None # Regex validation
|
|
58
58
|
airbyte_secret: bool = Field(False, alias="airbyte_secret")
|
|
59
|
-
default:
|
|
59
|
+
default: Any | None = None
|
|
60
60
|
|
|
61
61
|
|
|
62
62
|
class AuthConfigOption(BaseModel):
|
|
@@ -68,8 +68,8 @@ class AuthConfigOption(BaseModel):
|
|
|
68
68
|
|
|
69
69
|
model_config = ConfigDict(populate_by_name=True, extra="forbid")
|
|
70
70
|
|
|
71
|
-
title:
|
|
72
|
-
description:
|
|
71
|
+
title: str | None = None
|
|
72
|
+
description: str | None = None
|
|
73
73
|
type: Literal["object"] = "object"
|
|
74
74
|
required: List[str] = Field(default_factory=list)
|
|
75
75
|
properties: Dict[str, AuthConfigFieldSpec] = Field(default_factory=dict)
|
|
@@ -77,7 +77,7 @@ class AuthConfigOption(BaseModel):
|
|
|
77
77
|
default_factory=dict,
|
|
78
78
|
description="Mapping from auth parameters (e.g., 'username', 'password', 'token') to template strings using ${field} syntax",
|
|
79
79
|
)
|
|
80
|
-
replication_auth_key_mapping:
|
|
80
|
+
replication_auth_key_mapping: Dict[str, str] | None = Field(
|
|
81
81
|
None,
|
|
82
82
|
description="Mapping from source config paths (e.g., 'credentials.api_key') to auth config keys for direct connectors",
|
|
83
83
|
)
|
|
@@ -96,21 +96,21 @@ class AirbyteAuthConfig(BaseModel):
|
|
|
96
96
|
model_config = ConfigDict(populate_by_name=True, extra="forbid")
|
|
97
97
|
|
|
98
98
|
# Single option fields
|
|
99
|
-
title:
|
|
100
|
-
description:
|
|
101
|
-
type:
|
|
102
|
-
required:
|
|
103
|
-
properties:
|
|
104
|
-
auth_mapping:
|
|
99
|
+
title: str | None = None
|
|
100
|
+
description: str | None = None
|
|
101
|
+
type: Literal["object"] | None = None
|
|
102
|
+
required: List[str] | None = None
|
|
103
|
+
properties: Dict[str, AuthConfigFieldSpec] | None = None
|
|
104
|
+
auth_mapping: Dict[str, str] | None = None
|
|
105
105
|
|
|
106
106
|
# Replication connector auth mapping
|
|
107
|
-
replication_auth_key_mapping:
|
|
107
|
+
replication_auth_key_mapping: Dict[str, str] | None = Field(
|
|
108
108
|
None,
|
|
109
109
|
description="Mapping from source config paths (e.g., 'credentials.api_key') to auth config keys for direct connectors",
|
|
110
110
|
)
|
|
111
111
|
|
|
112
112
|
# Multiple options (oneOf)
|
|
113
|
-
one_of:
|
|
113
|
+
one_of: List[AuthConfigOption] | None = Field(None, alias="oneOf")
|
|
114
114
|
|
|
115
115
|
@model_validator(mode="after")
|
|
116
116
|
def validate_config_structure(self) -> "AirbyteAuthConfig":
|
|
@@ -161,27 +161,27 @@ class SecurityScheme(BaseModel):
|
|
|
161
161
|
|
|
162
162
|
# Standard OpenAPI fields
|
|
163
163
|
type: Literal["apiKey", "http", "oauth2", "openIdConnect"]
|
|
164
|
-
description:
|
|
164
|
+
description: str | None = None
|
|
165
165
|
|
|
166
166
|
# apiKey specific
|
|
167
|
-
name:
|
|
168
|
-
in_:
|
|
167
|
+
name: str | None = None
|
|
168
|
+
in_: Literal["query", "header", "cookie"] | None = Field(None, alias="in")
|
|
169
169
|
|
|
170
170
|
# http specific
|
|
171
|
-
scheme:
|
|
172
|
-
bearer_format:
|
|
171
|
+
scheme: str | None = None # e.g., "basic", "bearer", "digest"
|
|
172
|
+
bearer_format: str | None = Field(None, alias="bearerFormat")
|
|
173
173
|
|
|
174
174
|
# oauth2 specific
|
|
175
|
-
flows:
|
|
175
|
+
flows: OAuth2Flows | None = None
|
|
176
176
|
|
|
177
177
|
# openIdConnect specific
|
|
178
|
-
open_id_connect_url:
|
|
178
|
+
open_id_connect_url: str | None = Field(None, alias="openIdConnectUrl")
|
|
179
179
|
|
|
180
180
|
# Airbyte extensions
|
|
181
|
-
x_token_path:
|
|
182
|
-
x_token_refresh:
|
|
183
|
-
x_airbyte_auth_config:
|
|
184
|
-
x_airbyte_token_extract:
|
|
181
|
+
x_token_path: str | None = Field(None, alias="x-airbyte-token-path")
|
|
182
|
+
x_token_refresh: Dict[str, Any] | None = Field(None, alias="x-airbyte-token-refresh")
|
|
183
|
+
x_airbyte_auth_config: AirbyteAuthConfig | None = Field(None, alias="x-airbyte-auth-config")
|
|
184
|
+
x_airbyte_token_extract: List[str] | None = Field(
|
|
185
185
|
None,
|
|
186
186
|
alias="x-airbyte-token-extract",
|
|
187
187
|
description="List of fields to extract from OAuth2 token responses and use as server variables",
|
|
@@ -189,7 +189,7 @@ class SecurityScheme(BaseModel):
|
|
|
189
189
|
|
|
190
190
|
@field_validator("x_airbyte_token_extract", mode="after")
|
|
191
191
|
@classmethod
|
|
192
|
-
def validate_token_extract(cls, v:
|
|
192
|
+
def validate_token_extract(cls, v: List[str] | None) -> List[str] | None:
|
|
193
193
|
"""Validate x-airbyte-token-extract has no duplicates."""
|
|
194
194
|
if v is not None:
|
|
195
195
|
if len(v) != len(set(v)):
|
|
@@ -14,7 +14,7 @@ Example:
|
|
|
14
14
|
|
|
15
15
|
import os
|
|
16
16
|
import re
|
|
17
|
-
from typing import Any, Dict
|
|
17
|
+
from typing import Any, Dict
|
|
18
18
|
|
|
19
19
|
from pydantic import SecretStr
|
|
20
20
|
|
|
@@ -72,7 +72,7 @@ class SecretResolutionError(Exception):
|
|
|
72
72
|
def resolve_env_var_references(
|
|
73
73
|
secret_mappings: Dict[str, Any],
|
|
74
74
|
strict: bool = True,
|
|
75
|
-
env_vars:
|
|
75
|
+
env_vars: Dict[str, str] | None = None,
|
|
76
76
|
) -> Dict[str, str]:
|
|
77
77
|
"""Resolve environment variable references in secret values.
|
|
78
78
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from dataclasses import asdict, dataclass, field
|
|
4
4
|
from datetime import datetime
|
|
5
|
-
from typing import Any, Dict
|
|
5
|
+
from typing import Any, Dict
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
@dataclass
|
|
@@ -30,8 +30,8 @@ class ConnectorInitEvent(BaseEvent):
|
|
|
30
30
|
python_version: str
|
|
31
31
|
os_name: str
|
|
32
32
|
os_version: str
|
|
33
|
-
public_ip:
|
|
34
|
-
connector_version:
|
|
33
|
+
public_ip: str | None = None
|
|
34
|
+
connector_version: str | None = None
|
|
35
35
|
|
|
36
36
|
|
|
37
37
|
@dataclass
|
|
@@ -42,9 +42,9 @@ class OperationEvent(BaseEvent):
|
|
|
42
42
|
entity: str
|
|
43
43
|
action: str
|
|
44
44
|
timing_ms: float
|
|
45
|
-
public_ip:
|
|
46
|
-
status_code:
|
|
47
|
-
error_type:
|
|
45
|
+
public_ip: str | None = None
|
|
46
|
+
status_code: int | None = None
|
|
47
|
+
error_type: str | None = None
|
|
48
48
|
|
|
49
49
|
|
|
50
50
|
@dataclass
|
|
@@ -56,4 +56,4 @@ class SessionEndEvent(BaseEvent):
|
|
|
56
56
|
operation_count: int
|
|
57
57
|
success_count: int
|
|
58
58
|
failure_count: int
|
|
59
|
-
public_ip:
|
|
59
|
+
public_ip: str | None = None
|
|
@@ -4,7 +4,6 @@ import logging
|
|
|
4
4
|
import platform
|
|
5
5
|
import sys
|
|
6
6
|
from datetime import datetime
|
|
7
|
-
from typing import Optional
|
|
8
7
|
|
|
9
8
|
from ..observability import ObservabilitySession
|
|
10
9
|
|
|
@@ -20,7 +19,7 @@ class SegmentTracker:
|
|
|
20
19
|
def __init__(
|
|
21
20
|
self,
|
|
22
21
|
session: ObservabilitySession,
|
|
23
|
-
mode:
|
|
22
|
+
mode: TelemetryMode | None = None,
|
|
24
23
|
):
|
|
25
24
|
self.session = session
|
|
26
25
|
self.mode = mode or TelemetryConfig.get_mode()
|
|
@@ -31,6 +30,8 @@ class SegmentTracker:
|
|
|
31
30
|
|
|
32
31
|
if self.enabled:
|
|
33
32
|
try:
|
|
33
|
+
# NOTE: Import here intentionally - segment is an optional dependency.
|
|
34
|
+
# This allows the SDK to work without telemetry if segment is not installed.
|
|
34
35
|
import segment.analytics as analytics
|
|
35
36
|
|
|
36
37
|
analytics.write_key = SEGMENT_WRITE_KEY
|
|
@@ -47,7 +48,7 @@ class SegmentTracker:
|
|
|
47
48
|
|
|
48
49
|
def track_connector_init(
|
|
49
50
|
self,
|
|
50
|
-
connector_version:
|
|
51
|
+
connector_version: str | None = None,
|
|
51
52
|
) -> None:
|
|
52
53
|
"""Track connector initialization."""
|
|
53
54
|
if not self.enabled or not self._analytics:
|
|
@@ -82,9 +83,9 @@ class SegmentTracker:
|
|
|
82
83
|
self,
|
|
83
84
|
entity: str,
|
|
84
85
|
action: str,
|
|
85
|
-
status_code:
|
|
86
|
+
status_code: int | None,
|
|
86
87
|
timing_ms: float,
|
|
87
|
-
error_type:
|
|
88
|
+
error_type: str | None = None,
|
|
88
89
|
) -> None:
|
|
89
90
|
"""Track API operation."""
|
|
90
91
|
# Always track success/failure counts (useful even when tracking is disabled)
|
|
@@ -140,7 +140,7 @@ class AuthConfig(BaseModel):
|
|
|
140
140
|
ValueError: If this is a multi-auth config or invalid
|
|
141
141
|
"""
|
|
142
142
|
if self.is_multi_auth():
|
|
143
|
-
raise ValueError("Cannot call get_single_option() on multi-auth config.
|
|
143
|
+
raise ValueError("Cannot call get_single_option() on multi-auth config. Use options list instead.")
|
|
144
144
|
|
|
145
145
|
if self.type is None:
|
|
146
146
|
raise ValueError("Invalid AuthConfig: neither single-auth nor multi-auth")
|
|
@@ -161,7 +161,7 @@ class EndpointDefinition(BaseModel):
|
|
|
161
161
|
path: str # e.g., /v1/customers/{id} (OpenAPI path)
|
|
162
162
|
path_override: PathOverrideConfig | None = Field(
|
|
163
163
|
None,
|
|
164
|
-
description=("Path override config from x-airbyte-path-override.
|
|
164
|
+
description=("Path override config from x-airbyte-path-override. When set, overrides the path for actual HTTP requests."),
|
|
165
165
|
)
|
|
166
166
|
action: Action | None = None # Semantic action (get, list, create, update, delete)
|
|
167
167
|
description: str | None = None
|
|
@@ -748,7 +748,7 @@ class ZendeskSupportConnector:
|
|
|
748
748
|
|
|
749
749
|
original_doc = func.__doc__ or ""
|
|
750
750
|
if original_doc.strip():
|
|
751
|
-
func.__doc__ = f"{original_doc.strip()}\n
|
|
751
|
+
func.__doc__ = f"{original_doc.strip()}\n{description}"
|
|
752
752
|
else:
|
|
753
753
|
func.__doc__ = description
|
|
754
754
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: airbyte-agent-zendesk-support
|
|
3
|
-
Version: 0.18.
|
|
3
|
+
Version: 0.18.38
|
|
4
4
|
Summary: Airbyte Zendesk-Support Connector for AI platforms
|
|
5
5
|
Project-URL: Homepage, https://github.com/airbytehq/airbyte-embedded
|
|
6
6
|
Project-URL: Documentation, https://github.com/airbytehq/airbyte-embedded/tree/main/integrations
|
|
@@ -137,6 +137,6 @@ For the service's official API docs, see the [Zendesk-Support API reference](htt
|
|
|
137
137
|
|
|
138
138
|
## Version information
|
|
139
139
|
|
|
140
|
-
- **Package version:** 0.18.
|
|
140
|
+
- **Package version:** 0.18.38
|
|
141
141
|
- **Connector version:** 0.1.4
|
|
142
|
-
- **Generated with Connector SDK commit SHA:**
|
|
142
|
+
- **Generated with Connector SDK commit SHA:** 7ef098166194d1a23714e586f61ebefe7b4e85dd
|
|
@@ -1,57 +1,57 @@
|
|
|
1
1
|
airbyte_agent_zendesk_support/__init__.py,sha256=MPz4HU055DRA3-1qgbGXh2E0YHmhcexQCFl-Tz21gm4,6227
|
|
2
|
-
airbyte_agent_zendesk_support/connector.py,sha256=
|
|
2
|
+
airbyte_agent_zendesk_support/connector.py,sha256=bW99aXhfnVwjoTPXr0tJ2kjr6Prl_5AqMRlC4cgn2Dg,67056
|
|
3
3
|
airbyte_agent_zendesk_support/connector_model.py,sha256=M1phs0lN_6nxKgEF4enlA2znIMIDOMPkQiHY6BYszeE,241309
|
|
4
4
|
airbyte_agent_zendesk_support/models.py,sha256=31bsOmf4nBdf8EXN3JpYzXW8mx6gv1xaZjeuEBgSzws,36399
|
|
5
5
|
airbyte_agent_zendesk_support/types.py,sha256=vaWdcxDIJ8_nH7sv9PBsdWOKuTPVkskLur7fQF5Ln94,6320
|
|
6
6
|
airbyte_agent_zendesk_support/_vendored/__init__.py,sha256=ILl7AHXMui__swyrjxrh9yRa4dLiwBvV6axPWFWty80,38
|
|
7
7
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/__init__.py,sha256=T5o7roU6NSpH-lCAGZ338sE5dlh4ZU6i6IkeG1zpems,1949
|
|
8
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_strategies.py,sha256=
|
|
9
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_template.py,sha256=
|
|
10
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/connector_model_loader.py,sha256=
|
|
8
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_strategies.py,sha256=BdjAzFRTwXCmLFqYWqZ4Dx9RsqtI7pAkw-8NynSK4sQ,39914
|
|
9
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_template.py,sha256=nju4jqlFC_KI82ILNumNIyiUtRJcy7J94INIZ0QraI4,4454
|
|
10
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/connector_model_loader.py,sha256=Cx9wPhKwWfzkc8i63IevL0EsN3iWUl_OA-_jA9EKNcE,34877
|
|
11
11
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/constants.py,sha256=AtzOvhDMWbRJgpsQNWl5tkogHD6mWgEY668PgRmgtOY,2737
|
|
12
12
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/exceptions.py,sha256=ss5MGv9eVPmsbLcLWetuu3sDmvturwfo6Pw3M37Oq5k,481
|
|
13
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/extensions.py,sha256=
|
|
13
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/extensions.py,sha256=XWRRoJOOrwUHSKbuQt5DU7CCu8ePzhd_HuP7c_uD77w,21376
|
|
14
14
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/http_client.py,sha256=NdccrrBHI5rW56XnXcP54arCwywIVKnMeSQPas6KlOM,27466
|
|
15
15
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/introspection.py,sha256=2CyKXZHT74-1Id97uw1RLeyOi6TV24_hoNbQ6-6y7uI,10335
|
|
16
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/secrets.py,sha256=
|
|
17
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/types.py,sha256=
|
|
16
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/secrets.py,sha256=J9ezMu4xNnLW11xY5RCre6DHP7YMKZCqwGJfk7ufHAM,6855
|
|
17
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/types.py,sha256=CStkOsLtmZZdXylkdCsbYORDzughxygt1-Ucma0j-qE,8287
|
|
18
18
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/utils.py,sha256=G4LUXOC2HzPoND2v4tQW68R9uuPX9NQyCjaGxb7Kpl0,1958
|
|
19
19
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/validation.py,sha256=CDjCux1eg35a0Y4BegSivzIwZjiTqOxYWotWNLqTSVU,31792
|
|
20
20
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/cloud_utils/__init__.py,sha256=4799Hv9f2zxDVj1aLyQ8JpTEuFTp_oOZMRz-NZCdBJg,134
|
|
21
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/cloud_utils/client.py,sha256=
|
|
21
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/cloud_utils/client.py,sha256=HgY2eJKjztlTW9h2-As5z2MuMGOepYq7N-R6fchcX4s,7184
|
|
22
22
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/__init__.py,sha256=EmG9YQNAjSuYCVB4D5VoLm4qpD1KfeiiOf7bpALj8p8,702
|
|
23
23
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/hosted_executor.py,sha256=YQ-qfT7PZh9izNFHHe7SAcETiZOKrWjTU-okVb0_VL8,7079
|
|
24
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/local_executor.py,sha256=
|
|
24
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/local_executor.py,sha256=bfvdObgQ6NsriDMf85Ykxx1TPvjr7tuURl_K12md1YA,65258
|
|
25
25
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/models.py,sha256=lYVT_bNcw-PoIks4WHNyl2VY-lJVf2FntzINSOBIheE,5845
|
|
26
26
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/http/__init__.py,sha256=y8fbzZn-3yV9OxtYz8Dy6FFGI5v6TOqADd1G3xHH3Hw,911
|
|
27
27
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/http/config.py,sha256=6J7YIIwHC6sRu9i-yKa5XvArwK2KU60rlnmxzDZq3lw,3283
|
|
28
28
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/http/exceptions.py,sha256=eYdYmxqcwA6pgrSoRXNfR6_nRBGRH6upp2-r1jcKaZo,3586
|
|
29
29
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/http/protocols.py,sha256=eV7NbBIQOcPLw-iu8mtkV2zCVgScDwP0ek1SbPNQo0g,3323
|
|
30
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/http/response.py,sha256=
|
|
30
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/http/response.py,sha256=Q-RyM5D0D05ZhmZVJk4hVpmoS8YtyXNOTM5hqBt7rWI,3475
|
|
31
31
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/http/adapters/__init__.py,sha256=gjbWdU4LfzUG2PETI0TkfkukdzoCAhpL6FZtIEnkO-s,209
|
|
32
32
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/http/adapters/httpx_adapter.py,sha256=dkYhzBWiKBmzWZlc-cRTx50Hb6fy3OI8kOQvXRfS1CQ,8465
|
|
33
33
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/__init__.py,sha256=IZoE5yXhwSA0m3xQqh0FiCifjp1sB3S8jnnFPuJLYf8,227
|
|
34
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/logger.py,sha256=
|
|
35
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/types.py,sha256=
|
|
34
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/logger.py,sha256=GKm03UgDMNlvGuuH_c07jNcZmUccC3DISG269Ehj1Uo,8084
|
|
35
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/types.py,sha256=z0UiSdXP_r71mtwWkJydo0InsNpYOMyI7SVutzd2PEo,3172
|
|
36
36
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/__init__.py,sha256=ojx1n9vaWCXFFvb3-90Pwtg845trFdV2v6wcCoO75Ko,269
|
|
37
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/config.py,sha256=
|
|
38
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/models.py,sha256=
|
|
37
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/config.py,sha256=uWvRAPHnEusVKviQQncqcpnHKNhoZ4ZoFK6nUOSVClY,5372
|
|
38
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/models.py,sha256=IRGjlJia28_IU7BMSBb5RHWs47yAOLvE20JIIXHazLY,448
|
|
39
39
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/redactor.py,sha256=HRbSwGxsfQYbYlG4QBVvv8Qnw0d4SMowMv0dTFHsHqQ,2361
|
|
40
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/session.py,sha256=
|
|
40
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/session.py,sha256=WYRIB3bVz9HhpElkUO9CILCRIrWs9p2MR2hmf8uJm3E,3086
|
|
41
41
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/__init__.py,sha256=Sp5fSd1LvtIQkv-fnrKqPsM7-6IWp0sSZSK0mhzal_A,200
|
|
42
42
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/instrumentation.py,sha256=_dXvNiqdndIBwDjeDKNViWzn_M5FkSUsMmJtFldrmsM,1504
|
|
43
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/metrics.py,sha256=
|
|
43
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/metrics.py,sha256=FRff7dKt4iwt_A7pxV5n9kAGBR756PC7q8-weWygPSM,2817
|
|
44
44
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/__init__.py,sha256=Uymu-QuzGJuMxexBagIvUxpVAigIuIhz3KeBl_Vu4Ko,1638
|
|
45
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/base.py,sha256=
|
|
46
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/components.py,sha256=
|
|
45
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/base.py,sha256=swe27f6sWuuGmG54VAW9K8P5USuhmncpIqAliFcB-OU,4741
|
|
46
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/components.py,sha256=x3YCM1p2n_xHi50fMeOX0mXUiPqjGlLHs3Go8jXokb0,7895
|
|
47
47
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/connector.py,sha256=VFBOzIkLgYBR1XUTmyrPGqBkX8PP-zsG8avQcdJUqXs,3864
|
|
48
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/extensions.py,sha256=
|
|
49
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/operations.py,sha256=
|
|
50
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/security.py,sha256=
|
|
48
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/extensions.py,sha256=0SKtv1WaW2sHaSZF-gi5dI3p0heGbegphjU2PAyIe-M,3277
|
|
49
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/operations.py,sha256=RpzGtAI4yvAtMHAfMUMcUwgHv_qJojnKlNb75_agUF8,5729
|
|
50
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/security.py,sha256=zQ9RRuF3LBgLQi_4cItmjXbG_5WKlmCNM3nCil30H90,8470
|
|
51
51
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/__init__.py,sha256=RaLgkBU4dfxn1LC5Y0Q9rr2PJbrwjxvPgBLmq8_WafE,211
|
|
52
52
|
airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/config.py,sha256=tLmQwAFD0kP1WyBGWBS3ysaudN9H3e-3EopKZi6cGKg,885
|
|
53
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/events.py,sha256=
|
|
54
|
-
airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/tracker.py,sha256=
|
|
55
|
-
airbyte_agent_zendesk_support-0.18.
|
|
56
|
-
airbyte_agent_zendesk_support-0.18.
|
|
57
|
-
airbyte_agent_zendesk_support-0.18.
|
|
53
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/events.py,sha256=8Y1NbXiwISX-V_wRofY7PqcwEXD0dLMnntKkY6XFU2s,1328
|
|
54
|
+
airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/tracker.py,sha256=Ftrk0_ddfM7dZG8hF9xBuPwhbc9D6JZ7Q9qs5o3LEyA,5579
|
|
55
|
+
airbyte_agent_zendesk_support-0.18.38.dist-info/METADATA,sha256=-FvGz_Or4VOz5LOH_mSKjyWNrlrPWyn9Im-_gq2LrCk,6065
|
|
56
|
+
airbyte_agent_zendesk_support-0.18.38.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
57
|
+
airbyte_agent_zendesk_support-0.18.38.dist-info/RECORD,,
|
|
File without changes
|