Skip to content

Commit a774026

Browse files
Merge pull request #3204 from airbytehq/publish/freshdesk-v0.1.26
chore(freshdesk): bump to 0.1.26
2 parents 54ed7b5 + 471ecde commit a774026

File tree

13 files changed

+85
-26
lines changed

13 files changed

+85
-26
lines changed

connectors/freshdesk/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Freshdesk changelog
22

3+
## [0.1.26] - 2026-04-09
4+
- Updated connector definition (YAML version 1.0.3)
5+
- Source commit: 6bf360a5
6+
- SDK version: 0.1.0
7+
38
## [0.1.25] - 2026-04-09
49
- Updated connector definition (YAML version 1.0.2)
510
- Source commit: 3cecc817

connectors/freshdesk/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ See the official [Freshdesk API reference](https://developers.freshdesk.com/api/
118118

119119
## Version information
120120

121-
- **Package version:** 0.1.25
122-
- **Connector version:** 1.0.2
123-
- **Generated with Connector SDK commit SHA:** 3cecc817f060335c13c5d88bc9ad34a4dace961f
121+
- **Package version:** 0.1.26
122+
- **Connector version:** 1.0.3
123+
- **Generated with Connector SDK commit SHA:** 6bf360a546d577c9f76e8a6b8abf9ffc4dbfcf3a
124124
- **Changelog:** [View changelog](https://github.com/airbytehq/airbyte-agent-connectors/blob/main/connectors/freshdesk/CHANGELOG.md)

connectors/freshdesk/airbyte_agent_freshdesk/_vendored/connector_sdk/connector_model_loader.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ def _dedupe_strings(values: list[str]) -> list[str]:
238238

239239

240240
def _extract_search_field_paths(spec: OpenAPIConnector) -> dict[str, list[str]]:
241-
cache_config = getattr(spec.info, "x_airbyte_cache", None)
241+
cache_config = getattr(spec.info, "x_airbyte_context_store", None)
242242
entities = getattr(cache_config, "entities", None)
243243
if not isinstance(entities, list):
244244
return {}

connectors/freshdesk/airbyte_agent_freshdesk/_vendored/connector_sdk/introspection.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ def _collect_search_field_paths(model: ConnectorModelProtocol) -> dict[str, list
169169

170170
openapi_spec = getattr(model, "openapi_spec", None)
171171
info = getattr(openapi_spec, "info", None)
172-
cache_config = getattr(info, "x_airbyte_cache", None)
172+
cache_config = getattr(info, "x_airbyte_context_store", None)
173173
entities = getattr(cache_config, "entities", None)
174174
if not isinstance(entities, list):
175175
return {}

connectors/freshdesk/airbyte_agent_freshdesk/_vendored/connector_sdk/schema/base.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ class Info(BaseModel):
119119
- x-airbyte-external-documentation-urls: List of external documentation URLs (Airbyte extension)
120120
- x-airbyte-retry-config: Retry configuration for transient errors (Airbyte extension)
121121
- x-airbyte-example-questions: Example questions for AI connector README (Airbyte extension)
122-
- x-airbyte-cache: Cache configuration for field mapping between API and cache schemas (Airbyte extension)
122+
- x-airbyte-context-store: Cache configuration for field mapping between API and cache schemas (Airbyte extension)
123123
- x-airbyte-replication-config: Replication configuration for MULTI mode connectors (Airbyte extension)
124124
- x-airbyte-entity-relationships: Entity relationship declarations (Airbyte extension)
125125
- x-airbyte-scoping: Scoping parameter resolution from config (Airbyte extension)
@@ -140,7 +140,7 @@ class Info(BaseModel):
140140
x_airbyte_external_documentation_urls: list[DocUrl] = Field(..., alias="x-airbyte-external-documentation-urls")
141141
x_airbyte_retry_config: RetryConfig | None = Field(None, alias="x-airbyte-retry-config")
142142
x_airbyte_example_questions: ExampleQuestions | None = Field(None, alias="x-airbyte-example-questions")
143-
x_airbyte_cache: CacheConfig | None = Field(None, alias="x-airbyte-cache")
143+
x_airbyte_context_store: CacheConfig | None = Field(None, alias="x-airbyte-context-store")
144144
x_airbyte_entity_relationships: list[EntityRelationshipConfig] = Field(
145145
default_factory=list, alias="x-airbyte-entity-relationships"
146146
)
@@ -167,6 +167,12 @@ class Info(BaseModel):
167167
description="List of Airbyte auth methods to skip when validating auth compatibility. "
168168
"Use the SelectiveAuthenticator option key (e.g., 'Private App Credentials', 'oauth2.0')",
169169
)
170+
x_airbyte_skip_context_store: str | None = Field(
171+
default=None,
172+
alias="x-airbyte-skip-context-store",
173+
description="Reason why this connector does not define x-airbyte-context-store. "
174+
"Connectors must have either x-airbyte-context-store or x-airbyte-skip-context-store with a justification.",
175+
)
170176

171177

172178
class ServerVariable(BaseModel):

connectors/freshdesk/airbyte_agent_freshdesk/_vendored/connector_sdk/schema/extensions.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ class CacheFieldConfig(BaseModel):
8787
For object-type fields, supports nested properties to define the internal structure
8888
of complex nested schemas.
8989
90-
Used in x-airbyte-cache extension for api_search operations.
90+
Used in x-airbyte-context-store extension for api_search operations.
9191
"""
9292

9393
model_config = ConfigDict(populate_by_name=True, extra="forbid")
@@ -111,7 +111,7 @@ class CacheEntityConfig(BaseModel):
111111
Defines a cache-enabled entity with its fields and optional name aliasing
112112
to map between user-facing entity names and cache storage names.
113113
114-
Used in x-airbyte-cache extension for api_search operations.
114+
Used in x-airbyte-context-store extension for api_search operations.
115115
"""
116116

117117
model_config = ConfigDict(populate_by_name=True, extra="forbid")
@@ -237,7 +237,7 @@ def validate_replication_config_key_mapping(self) -> "ReplicationConfig":
237237

238238
class CacheConfig(BaseModel):
239239
"""
240-
Cache configuration extension (x-airbyte-cache).
240+
Cache configuration extension (x-airbyte-context-store).
241241
242242
Defines cache-enabled entities and their field mappings for api_search operations.
243243
Supports optional name aliasing via x-airbyte-name for both entities and fields,
@@ -249,7 +249,7 @@ class CacheConfig(BaseModel):
249249
Example YAML usage:
250250
info:
251251
title: Stripe API
252-
x-airbyte-cache:
252+
x-airbyte-context-store:
253253
entities:
254254
- entity: customers
255255
stream: customers

connectors/freshdesk/airbyte_agent_freshdesk/_vendored/connector_sdk/validation/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
This module provides validation for connector definitions, including:
44
- Readiness validation (cassettes, schemas, auth coverage)
55
- Replication compatibility validation (Airbyte registry mappings)
6-
- Cache schema validation (x-airbyte-cache vs manifest)
6+
- Cache schema validation (x-airbyte-context-store vs manifest)
77
- Connector overview (structured status reporting)
88
"""
99

connectors/freshdesk/airbyte_agent_freshdesk/_vendored/connector_sdk/validation/cache.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""
2-
Validate x-airbyte-cache entities against the Airbyte source connector manifest.
2+
Validate x-airbyte-context-store entities against the Airbyte source connector manifest.
33
44
Checks that each cache entity name corresponds to a real stream in the manifest,
55
and that cache field names exist as properties in the manifest stream schema.
@@ -61,9 +61,9 @@ def validate_cache_against_manifest(
6161
connector_yaml_path: str | Path,
6262
connector_def: dict[str, Any] | None = None,
6363
) -> dict[str, Any]:
64-
"""Validate that x-airbyte-cache entities match the Airbyte manifest.
64+
"""Validate that x-airbyte-context-store entities match the Airbyte manifest.
6565
66-
For each entity in x-airbyte-cache, checks:
66+
For each entity in x-airbyte-context-store, checks:
6767
1. A stream with a matching name exists in the manifest. If the entity has
6868
an ``x-airbyte-name`` field, that value is used for the manifest lookup;
6969
otherwise the ``entity`` name is used.
@@ -89,12 +89,12 @@ def validate_cache_against_manifest(
8989
return {"errors": [f"Failed to load connector.yaml: {e}"], "warnings": []}
9090

9191
info = connector_def.get("info", {})
92-
cache_entities: list[dict[str, Any]] = info.get("x-airbyte-cache", {}).get("entities", [])
92+
cache_entities: list[dict[str, Any]] = info.get("x-airbyte-context-store", {}).get("entities", [])
9393

9494
if not cache_entities:
9595
return {
9696
"errors": [],
97-
"warnings": ["No x-airbyte-cache entities found in connector.yaml — skipping cache validation"],
97+
"warnings": ["No x-airbyte-context-store entities found in connector.yaml — skipping cache validation"],
9898
"entities_checked": 0,
9999
"manifest_streams": [],
100100
}

connectors/freshdesk/airbyte_agent_freshdesk/_vendored/connector_sdk/validation/overview.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,7 @@ def _extract_auth_schemes(config) -> Dict[str, Any]:
293293
def _extract_exceptions(info: dict, config) -> Dict[str, Any]:
294294
skip_streams = info.get("x-airbyte-skip-suggested-streams", []) or []
295295
skip_auth = info.get("x-airbyte-skip-auth-methods", []) or []
296+
skip_context_store = info.get("x-airbyte-skip-context-store") or None
296297

297298
untested_ops = []
298299
for entity in config.entities:
@@ -304,10 +305,13 @@ def _extract_exceptions(info: dict, config) -> Dict[str, Any]:
304305
untested_auth = [opt.scheme_name for opt in (config.auth.options or []) if opt.untested]
305306

306307
total = len(skip_streams) + len(skip_auth) + len(untested_ops) + len(untested_auth)
308+
if skip_context_store:
309+
total += 1
307310

308311
return {
309312
"skip_suggested_streams": skip_streams,
310313
"skip_auth_methods": skip_auth,
314+
"skip_context_store": skip_context_store,
311315
"untested_operations": untested_ops,
312316
"untested_auth_schemes": untested_auth,
313317
"total_count": total,
@@ -558,6 +562,16 @@ def diff_overviews(base: Dict[str, Any] | None, head: Dict[str, Any]) -> Dict[st
558562
if removed:
559563
changes[f"removed_{key}"] = sorted(removed)
560564

565+
base_skip_context_store = base_exc.get("skip_context_store")
566+
head_skip_context_store = head_exc.get("skip_context_store")
567+
if base_skip_context_store != head_skip_context_store:
568+
if head_skip_context_store and not base_skip_context_store:
569+
changes["skip_context_store_added"] = head_skip_context_store
570+
elif base_skip_context_store and not head_skip_context_store:
571+
changes["skip_context_store_removed"] = base_skip_context_store
572+
else:
573+
changes["skip_context_store_changed"] = {"from": base_skip_context_store, "to": head_skip_context_store}
574+
561575
base_readiness = base.get("readiness", {}).get("success", False)
562576
head_readiness = head.get("readiness", {}).get("success", False)
563577
if base_readiness != head_readiness:
@@ -762,6 +776,16 @@ def _format_diff_section(diff: Dict[str, Any] | None) -> str:
762776
if removed:
763777
items.append(f"✅ Removed {label}: {', '.join(f'`{v}`' for v in removed)}")
764778

779+
skip_context_store_added = diff.get("skip_context_store_added")
780+
if skip_context_store_added:
781+
items.append(f"🔇 Added skip-cache exception: {skip_context_store_added}")
782+
skip_context_store_removed = diff.get("skip_context_store_removed")
783+
if skip_context_store_removed:
784+
items.append("✅ Removed skip-cache exception")
785+
skip_context_store_changed = diff.get("skip_context_store_changed")
786+
if skip_context_store_changed:
787+
items.append(f"🔇 Skip-cache reason changed: {skip_context_store_changed['to']}")
788+
765789
errors_delta = diff.get("errors_delta")
766790
if errors_delta is not None and errors_delta != 0:
767791
if errors_delta > 0:
@@ -815,6 +839,10 @@ def _format_exceptions_section(overview: dict) -> str:
815839
auth_str = ", ".join(f"`{a}`" for a in skip_auth)
816840
lines.append(f"> - 🔇 Skipped auth methods: {auth_str}")
817841

842+
skip_context_store = exceptions.get("skip_context_store")
843+
if skip_context_store:
844+
lines.append(f"> - 🔇 Skipped cache: {skip_context_store}")
845+
818846
untested_ops = exceptions.get("untested_operations", [])
819847
if untested_ops:
820848
ops_str = ", ".join(f"`{o}`" for o in untested_ops)

connectors/freshdesk/airbyte_agent_freshdesk/_vendored/connector_sdk/validation/readiness.py

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,11 +1126,26 @@ def validate_connector_readiness(connector_dir: str | Path) -> Dict[str, Any]:
11261126
replication_warnings.append(drift_warning)
11271127
total_warnings += 1
11281128

1129-
# Validate x-airbyte-cache entities against manifest
1130-
cache_result = validate_cache_against_manifest(
1131-
connector_yaml_path=config_file,
1132-
connector_def=raw_spec,
1133-
)
1129+
# Check x-airbyte-context-store presence (must have context-store or explicit skip reason)
1130+
cache_config = raw_spec.get("info", {}).get("x-airbyte-context-store")
1131+
skip_context_store = raw_spec.get("info", {}).get("x-airbyte-skip-context-store")
1132+
cache_presence_errors: list[str] = []
1133+
if not cache_config and not skip_context_store:
1134+
cache_presence_errors.append(
1135+
"Connector is missing x-airbyte-context-store. "
1136+
"Either add x-airbyte-context-store with entity definitions to enable api_search, "
1137+
"or add x-airbyte-skip-context-store with a justification to opt out."
1138+
)
1139+
total_errors += len(cache_presence_errors)
1140+
1141+
# Validate x-airbyte-context-store entities against manifest (skip if opted out)
1142+
if not skip_context_store:
1143+
cache_result = validate_cache_against_manifest(
1144+
connector_yaml_path=config_file,
1145+
connector_def=raw_spec,
1146+
)
1147+
else:
1148+
cache_result = {"errors": [], "warnings": []}
11341149
cache_errors = cache_result.get("errors", [])
11351150
cache_warnings = cache_result.get("warnings", [])
11361151
total_errors += len(cache_errors)
@@ -1151,6 +1166,7 @@ def validate_connector_readiness(connector_dir: str | Path) -> Dict[str, Any]:
11511166
and cassettes_invalid == 0
11521167
and total_operations > 0
11531168
and len(replication_errors) == 0
1169+
and len(cache_presence_errors) == 0
11541170
and len(cache_errors) == 0
11551171
and auth_valid
11561172
and len(relationship_coverage_errors) == 0
@@ -1175,6 +1191,10 @@ def validate_connector_readiness(connector_dir: str | Path) -> Dict[str, Any]:
11751191
"to enable reliable health checks."
11761192
)
11771193

1194+
# Add cache presence errors to readiness_errors
1195+
readiness_errors = list(relationship_coverage_errors) # copy to avoid mutating original
1196+
readiness_errors.extend(cache_presence_errors)
1197+
11781198
# Add coverage warnings to readiness_warnings (errors already counted above)
11791199
readiness_warnings.extend(relationship_coverage_warnings)
11801200

@@ -1227,7 +1247,7 @@ def validate_connector_readiness(connector_dir: str | Path) -> Dict[str, Any]:
12271247
"missing_schemes": missing_tested,
12281248
"untested_schemes": untested_schemes_list,
12291249
},
1230-
"readiness_errors": relationship_coverage_errors,
1250+
"readiness_errors": readiness_errors,
12311251
"readiness_warnings": readiness_warnings,
12321252
"summary": {
12331253
"total_operations": total_operations,

0 commit comments

Comments
 (0)