airbyte-agent-zendesk-support 0.18.37__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.
Files changed (25) hide show
  1. airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_strategies.py +2 -5
  2. airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_template.py +1 -1
  3. airbyte_agent_zendesk_support/_vendored/connector_sdk/cloud_utils/client.py +1 -1
  4. airbyte_agent_zendesk_support/_vendored/connector_sdk/connector_model_loader.py +1 -2
  5. airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/local_executor.py +3 -4
  6. airbyte_agent_zendesk_support/_vendored/connector_sdk/extensions.py +1 -2
  7. airbyte_agent_zendesk_support/_vendored/connector_sdk/http/response.py +2 -0
  8. airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/logger.py +9 -9
  9. airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/types.py +10 -10
  10. airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/config.py +2 -2
  11. airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/models.py +6 -6
  12. airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/session.py +7 -5
  13. airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/metrics.py +3 -3
  14. airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/base.py +17 -17
  15. airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/components.py +58 -58
  16. airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/extensions.py +9 -9
  17. airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/operations.py +31 -31
  18. airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/security.py +36 -36
  19. airbyte_agent_zendesk_support/_vendored/connector_sdk/secrets.py +2 -2
  20. airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/events.py +7 -7
  21. airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/tracker.py +6 -5
  22. airbyte_agent_zendesk_support/_vendored/connector_sdk/types.py +2 -2
  23. {airbyte_agent_zendesk_support-0.18.37.dist-info → airbyte_agent_zendesk_support-0.18.38.dist-info}/METADATA +3 -3
  24. {airbyte_agent_zendesk_support-0.18.37.dist-info → airbyte_agent_zendesk_support-0.18.38.dist-info}/RECORD +25 -25
  25. {airbyte_agent_zendesk_support-0.18.37.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. " f"Available fields: {available_fields}")
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}' " f"and connector '{connector_definition_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}. " f"Provided parameters: {list(params.keys())}"
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, Optional, Set
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: Optional[str] = None,
35
- connector_name: Optional[str] = None,
36
- max_logs: Optional[int] = 10000,
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: Optional[Dict[str, str]] = None,
103
- params: Optional[Dict[str, Any]] = None,
104
- body: Optional[Any] = None,
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: Optional[Any] = None,
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: Optional[int] = None,
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, Optional
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: Optional[Dict[str, Any]] = None
31
- body: Optional[Any] = None
32
- response_status: Optional[int] = None
33
- response_body: Optional[Any] = None
34
- timing_ms: Optional[float] = None
35
- error: Optional[str] = None
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: Optional[str] = None
53
+ connector_name: str | None = None
54
54
  logs: List[RequestLog] = Field(default_factory=list)
55
- max_logs: Optional[int] = Field(
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. " "Each chunk is logged when log_chunk_fetch() is called.",
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, Optional
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() -> Optional[SDKConfig]:
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, Optional
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: Optional[float] = None
16
- status_code: Optional[int] = None
17
- error_type: Optional[str] = None
18
- error_message: Optional[str] = None
19
- params: Optional[Dict[str, Any]] = None
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, Optional
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: Optional[SDKConfig] = None
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() -> Optional[str]:
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: Optional[str] = None,
82
+ connector_version: str | None = None,
81
83
  execution_context: str = "direct",
82
- session_id: Optional[str] = None,
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, Optional
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) -> Optional[Dict[str, float]]:
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: Optional[str] = None):
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, Optional
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: Optional[str] = None
49
- url: Optional[str] = None
50
- email: Optional[str] = None
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: Optional[str] = None
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: Optional[str] = None
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: Optional[str] = None
115
- terms_of_service: Optional[str] = Field(None, alias="termsOfService")
116
- contact: Optional[Contact] = None
117
- license: Optional[License] = None
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: Optional[str] = Field(None, alias="x-airbyte-connector-name")
121
- x_airbyte_connector_id: Optional[UUID] = Field(None, alias="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: Optional[RetryConfig] = Field(None, alias="x-airbyte-retry-config")
124
- x_airbyte_example_questions: Optional[ExampleQuestions] = Field(None, alias="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: Optional[list[str]] = None
136
+ enum: list[str] | None = None
137
137
  default: str
138
- description: Optional[str] = None
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: Optional[str] = None
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, Optional, Union
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: Optional[str] = None
34
- format: Optional[str] = None
35
- title: Optional[str] = None
36
- description: Optional[str] = None
37
- default: Optional[Any] = None
38
- example: Optional[Any] = None
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: Optional[Any] = Field(None, alias="additionalProperties")
43
+ additional_properties: Any | None = Field(None, alias="additionalProperties")
44
44
 
45
45
  # Array properties
46
- items: Optional[Any] = None # May be Schema or $ref
46
+ items: Any | None = None # May be Schema or $ref
47
47
 
48
48
  # Validation
49
- enum: Optional[List[Any]] = None
50
- min_length: Optional[int] = Field(None, alias="minLength")
51
- max_length: Optional[int] = Field(None, alias="maxLength")
52
- minimum: Optional[float] = None
53
- maximum: Optional[float] = None
54
- pattern: Optional[str] = None
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: Optional[List[Any]] = Field(None, alias="allOf")
58
- any_of: Optional[List[Any]] = Field(None, alias="anyOf")
59
- one_of: Optional[List[Any]] = Field(None, alias="oneOf")
60
- not_: Optional[Any] = Field(None, alias="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: Optional[bool] = Field(None, deprecated="Use type union with null instead (OpenAPI 3.1)")
64
- read_only: Optional[bool] = Field(None, alias="readOnly")
65
- write_only: Optional[bool] = Field(None, alias="writeOnly")
66
- deprecated: Optional[bool] = None
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: Optional[str] = Field(None, alias="x-airbyte-entity-name")
70
- x_airbyte_stream_name: Optional[str] = Field(None, alias="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: Optional[str] = None
85
- required: Optional[bool] = None
86
- deprecated: Optional[bool] = None
87
- allow_empty_value: Optional[bool] = Field(None, alias="allowEmptyValue")
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_: Optional[Dict[str, Any]] = Field(None, alias="schema")
90
+ schema_: Dict[str, Any] | None = Field(None, alias="schema")
91
91
 
92
92
  # Style and examples
93
- style: Optional[str] = None
94
- explode: Optional[bool] = None
95
- example: Optional[Any] = None
96
- examples: Optional[Dict[str, Any]] = None
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_: Optional[Dict[str, Any]] = Field(None, alias="schema")
109
- example: Optional[Any] = None
110
- examples: Optional[Dict[str, Any]] = None
111
- encoding: Optional[Dict[str, Any]] = None
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: Optional[Dict[str, Any]] = Field(
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: Optional[str] = Field(None, description="Operation name for queries with multiple operations")
133
- default_fields: Optional[Union[str, List[str]]] = Field(
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'). " "Must start with '/'"),
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: Optional[str] = None
176
+ description: str | None = None
177
177
  content: Dict[str, MediaType] = Field(default_factory=dict)
178
- required: Optional[bool] = None
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: Optional[BodyTypeConfig] = Field(
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') " "and type-specific configuration (query, variables, etc.)."
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: Optional[str] = None
201
- required: Optional[bool] = None
202
- deprecated: Optional[bool] = None
203
- schema_: Optional[Dict[str, Any]] = Field(None, alias="schema")
204
- example: Optional[Any] = None
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: Optional[Dict[str, Header]] = None
218
- content: Optional[Dict[str, MediaType]] = None
219
- links: Optional[Dict[str, Any]] = None
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: Optional[Dict[str, Any]] = None
234
+ examples: Dict[str, Any] | None = None
235
235
  request_bodies: Dict[str, RequestBody] = Field(default_factory=dict, alias="requestBodies")
236
- headers: Optional[Dict[str, Header]] = None
236
+ headers: Dict[str, Header] | None = None
237
237
  security_schemes: Dict[str, SecurityScheme] = Field(default_factory=dict, alias="securitySchemes")
238
- links: Optional[Dict[str, Any]] = None
239
- callbacks: Optional[Dict[str, Any]] = None
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, Optional
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: Optional[str] = None
37
- cursor_source: Optional[Literal["body", "headers"]] = "body"
38
- cursor_path: Optional[str] = None
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: Optional[str] = None
41
+ offset_param: str | None = None
42
42
 
43
43
  # Page-based pagination
44
- page_param: Optional[str] = None
44
+ page_param: str | None = None
45
45
 
46
46
  # Response parsing
47
47
  data_path: str = "data"
48
- has_more_path: Optional[str] = None
48
+ has_more_path: str | None = None
49
49
 
50
50
  # Limits
51
- max_page_size: Optional[int] = None
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: Optional[str] = "Retry-After"
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, Optional
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: Optional[List[str]] = None
38
- summary: Optional[str] = None
39
- description: Optional[str] = None
40
- external_docs: Optional[Dict[str, Any]] = Field(None, alias="externalDocs")
41
- operation_id: Optional[str] = Field(None, alias="operationId")
42
- parameters: Optional[List[Parameter]] = None
43
- request_body: Optional[RequestBody] = Field(None, alias="requestBody")
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: Optional[Dict[str, Any]] = None
46
- deprecated: Optional[bool] = None
47
- security: Optional[List[SecurityRequirement]] = None
48
- servers: Optional[List[Any]] = None # Can override root 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: Optional[PathOverrideConfig] = Field(
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 " "differs from actual endpoint"),
56
+ description=("Override path for HTTP requests when OpenAPI path differs from actual endpoint"),
57
57
  )
58
- x_airbyte_record_extractor: Optional[str] = Field(
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: Optional[Dict[str, str]] = Field(
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: Optional[str] = Field(None, alias="x-airbyte-file-url")
80
- x_airbyte_untested: Optional[bool] = Field(
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: Optional[str] = None
131
- description: Optional[str] = None
132
- servers: Optional[List[Any]] = None
133
- parameters: Optional[List[Parameter]] = None
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: Optional[Operation] = None
137
- put: Optional[Operation] = None
138
- post: Optional[Operation] = None
139
- delete: Optional[Operation] = None
140
- options: Optional[Operation] = None
141
- head: Optional[Operation] = None
142
- patch: Optional[Operation] = None
143
- trace: Optional[Operation] = None
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: Optional[str] = Field(None, alias="$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, Optional
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: Optional[str] = Field(None, alias="authorizationUrl")
24
- token_url: Optional[str] = Field(None, alias="tokenUrl")
25
- refresh_url: Optional[str] = Field(None, alias="refreshUrl")
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: Optional[OAuth2Flow] = None
39
- password: Optional[OAuth2Flow] = None
40
- client_credentials: Optional[OAuth2Flow] = Field(None, alias="clientCredentials")
41
- authorization_code: Optional[OAuth2Flow] = Field(None, alias="authorizationCode")
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: Optional[str] = None
55
- description: Optional[str] = None
56
- format: Optional[str] = None # e.g., "email", "uri"
57
- pattern: Optional[str] = None # Regex validation
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: Optional[Any] = None
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: Optional[str] = None
72
- description: Optional[str] = None
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: Optional[Dict[str, str]] = Field(
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: Optional[str] = None
100
- description: Optional[str] = None
101
- type: Optional[Literal["object"]] = None
102
- required: Optional[List[str]] = None
103
- properties: Optional[Dict[str, AuthConfigFieldSpec]] = None
104
- auth_mapping: Optional[Dict[str, str]] = None
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: Optional[Dict[str, str]] = Field(
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: Optional[List[AuthConfigOption]] = Field(None, alias="oneOf")
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: Optional[str] = None
164
+ description: str | None = None
165
165
 
166
166
  # apiKey specific
167
- name: Optional[str] = None
168
- in_: Optional[Literal["query", "header", "cookie"]] = Field(None, alias="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: Optional[str] = None # e.g., "basic", "bearer", "digest"
172
- bearer_format: Optional[str] = Field(None, alias="bearerFormat")
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: Optional[OAuth2Flows] = None
175
+ flows: OAuth2Flows | None = None
176
176
 
177
177
  # openIdConnect specific
178
- open_id_connect_url: Optional[str] = Field(None, alias="openIdConnectUrl")
178
+ open_id_connect_url: str | None = Field(None, alias="openIdConnectUrl")
179
179
 
180
180
  # Airbyte extensions
181
- x_token_path: Optional[str] = Field(None, alias="x-airbyte-token-path")
182
- x_token_refresh: Optional[Dict[str, Any]] = Field(None, alias="x-airbyte-token-refresh")
183
- x_airbyte_auth_config: Optional[AirbyteAuthConfig] = Field(None, alias="x-airbyte-auth-config")
184
- x_airbyte_token_extract: Optional[List[str]] = Field(
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: Optional[List[str]]) -> Optional[List[str]]:
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, Optional
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: Optional[Dict[str, str]] = None,
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, Optional
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: Optional[str] = None
34
- connector_version: Optional[str] = None
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: Optional[str] = None
46
- status_code: Optional[int] = None
47
- error_type: Optional[str] = None
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: Optional[str] = None
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: Optional[TelemetryMode] = None,
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: Optional[str] = None,
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: Optional[int],
86
+ status_code: int | None,
86
87
  timing_ms: float,
87
- error_type: Optional[str] = None,
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. " "Use options list instead.")
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. " "When set, overrides the path for actual HTTP requests."),
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: airbyte-agent-zendesk-support
3
- Version: 0.18.37
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.37
140
+ - **Package version:** 0.18.38
141
141
  - **Connector version:** 0.1.4
142
- - **Generated with Connector SDK commit SHA:** e6285db53fdc1d0dd43d30ef752a009226e47d48
142
+ - **Generated with Connector SDK commit SHA:** 7ef098166194d1a23714e586f61ebefe7b4e85dd
@@ -5,53 +5,53 @@ airbyte_agent_zendesk_support/models.py,sha256=31bsOmf4nBdf8EXN3JpYzXW8mx6gv1xaZ
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=0BfIISVzuvZTAYZjQFOOhKTpw0QuKDlLQBQ1PQo-V2M,39967
9
- airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_template.py,sha256=vKnyA21Jp33EuDjkIUAf1PGicwk4t9kZAPJuAgAZKzU,4458
10
- airbyte_agent_zendesk_support/_vendored/connector_sdk/connector_model_loader.py,sha256=nKrXfe-FAyvNMkW7AqGzxrp5wXdaHiqC0yIFJoIVwlY,34890
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=Ks4LR1lbJfBoJ-gN6byj7WtFGE1xMuerVTHXGKJcFKk,21391
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=UWcO9fP-vZwcfkAuvlZahlOCTOwdNN860BIwe8X4jxw,6868
17
- airbyte_agent_zendesk_support/_vendored/connector_sdk/types.py,sha256=0yY6mF03Dan5W9RNVHIEYlOijxa1j5T28TErjN_kUvQ,8293
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=HoDgZuEgGHj78P-BGwUf6HGPVWynbdKjGOmjb-JDk58,7188
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=ODbOLjlHjh_63T8XYGEJLuIz9e8QOZOGVdWFBsWWL44,65283
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=r7QFYRkw6is-Na7WozAyzZynpCQ90RBUhnX4pBSJ1Yc,3338
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=Nh0h3C0aO-rAqZhDIyeEXG6Jd7yj1Gk32ECMPth0wl8,8118
35
- airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/types.py,sha256=iI-xLoOg33OUGQOp3CeaxKtHh73WXE-oul6ZCNf3Nzc,3209
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=GJLzILUc7X6hqwL_Ger6sLAhlrecwV3GcjBJzvmXnqg,5385
38
- airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/models.py,sha256=rF6-SoAAywqL8bhEv7yCbmr_W_w0vmApO-MCxcHq9RI,473
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=Q1U6qaH_Uj_eZ9sT6_Wrl27YWd95cxjA7S0GYWUrXkU,2941
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=3-wPwlJyfVLUIG3y7ESxk0avhkILk3z8K7zSrnlZf5U,2833
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=eN6YfHwsYNz_0CE-S715Me8x3gQWTtaRk1vhFjEZF8I,4799
46
- airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/components.py,sha256=4clYbIJNqfmFj7Te31ZqC3Rr5E2v33BeXyQx1wp3oj0,8076
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=LdoCuMLNdCj68O47qAL4v8xmqGz5tJgRiNZL5JnL9uw,3311
49
- airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/operations.py,sha256=HV_4mWya-kvSXOWVGPU1uD4GK3GIWneqETFqy9cnrpM,5829
50
- airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/security.py,sha256=Xo6Z0-NCryMY4EDZgvg8ABSPglskpXANvm_iI34meV8,8588
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=xUiasLicB818vfGVB108U7noVVDxz35g5vMomRKi0eE,1356
54
- airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/tracker.py,sha256=lURbjZVZSWLluX3OTK_0D8xrc3HAzK9xixtMTOEWnQ4,5439
55
- airbyte_agent_zendesk_support-0.18.37.dist-info/METADATA,sha256=1bG5jyFaXcqHlBSOYThVTZFxeAVYs8q6GPpwqeGZIdA,6065
56
- airbyte_agent_zendesk_support-0.18.37.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
57
- airbyte_agent_zendesk_support-0.18.37.dist-info/RECORD,,
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,,