airbyte-agent-mailchimp 0.1.4__py3-none-any.whl → 0.1.7__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_mailchimp/__init__.py +24 -24
- airbyte_agent_mailchimp/_vendored/connector_sdk/executor/local_executor.py +104 -21
- airbyte_agent_mailchimp/_vendored/connector_sdk/http_client.py +13 -6
- airbyte_agent_mailchimp/_vendored/connector_sdk/logging/logger.py +10 -1
- airbyte_agent_mailchimp/_vendored/connector_sdk/logging/types.py +1 -0
- airbyte_agent_mailchimp/_vendored/connector_sdk/validation.py +12 -6
- airbyte_agent_mailchimp/models.py +178 -178
- {airbyte_agent_mailchimp-0.1.4.dist-info → airbyte_agent_mailchimp-0.1.7.dist-info}/METADATA +3 -3
- {airbyte_agent_mailchimp-0.1.4.dist-info → airbyte_agent_mailchimp-0.1.7.dist-info}/RECORD +10 -10
- {airbyte_agent_mailchimp-0.1.4.dist-info → airbyte_agent_mailchimp-0.1.7.dist-info}/WHEEL +0 -0
|
@@ -7,44 +7,44 @@ Auto-generated from OpenAPI specification.
|
|
|
7
7
|
from .connector import MailchimpConnector
|
|
8
8
|
from .models import (
|
|
9
9
|
MailchimpAuthConfig,
|
|
10
|
+
CampaignDeliveryStatus,
|
|
10
11
|
CampaignRecipients,
|
|
11
|
-
CampaignTracking,
|
|
12
12
|
CampaignSettings,
|
|
13
|
-
CampaignDeliveryStatus,
|
|
14
13
|
CampaignReportSummaryEcommerce,
|
|
15
14
|
CampaignReportSummary,
|
|
15
|
+
CampaignTracking,
|
|
16
16
|
Campaign,
|
|
17
17
|
CampaignsList,
|
|
18
|
+
ListStats,
|
|
18
19
|
ListCampaignDefaults,
|
|
19
20
|
ListContact,
|
|
20
|
-
ListStats,
|
|
21
21
|
List,
|
|
22
22
|
ListsList,
|
|
23
23
|
ListMemberStatsEcommerceData,
|
|
24
24
|
ListMemberStats,
|
|
25
|
-
ListMemberLocation,
|
|
26
25
|
ListMemberTagsItem,
|
|
26
|
+
ListMemberLocation,
|
|
27
27
|
ListMember,
|
|
28
28
|
ListMembersList,
|
|
29
|
-
ReportListStats,
|
|
30
|
-
ReportEcommerce,
|
|
31
|
-
ReportFacebookLikes,
|
|
32
|
-
ReportIndustryStats,
|
|
33
29
|
ReportOpens,
|
|
34
|
-
ReportBounces,
|
|
35
|
-
ReportDeliveryStatus,
|
|
36
30
|
ReportForwards,
|
|
37
31
|
ReportClicks,
|
|
32
|
+
ReportDeliveryStatus,
|
|
33
|
+
ReportIndustryStats,
|
|
34
|
+
ReportFacebookLikes,
|
|
35
|
+
ReportEcommerce,
|
|
36
|
+
ReportListStats,
|
|
37
|
+
ReportBounces,
|
|
38
38
|
Report,
|
|
39
39
|
ReportsList,
|
|
40
40
|
EmailActivityActivityItem,
|
|
41
41
|
EmailActivity,
|
|
42
42
|
EmailActivityList,
|
|
43
43
|
AutomationReportSummary,
|
|
44
|
-
|
|
44
|
+
AutomationSettings,
|
|
45
45
|
AutomationRecipientsSegmentOpts,
|
|
46
46
|
AutomationRecipients,
|
|
47
|
-
|
|
47
|
+
AutomationTracking,
|
|
48
48
|
Automation,
|
|
49
49
|
AutomationsList,
|
|
50
50
|
Tag,
|
|
@@ -114,44 +114,44 @@ from .types import (
|
|
|
114
114
|
__all__ = [
|
|
115
115
|
"MailchimpConnector",
|
|
116
116
|
"MailchimpAuthConfig",
|
|
117
|
+
"CampaignDeliveryStatus",
|
|
117
118
|
"CampaignRecipients",
|
|
118
|
-
"CampaignTracking",
|
|
119
119
|
"CampaignSettings",
|
|
120
|
-
"CampaignDeliveryStatus",
|
|
121
120
|
"CampaignReportSummaryEcommerce",
|
|
122
121
|
"CampaignReportSummary",
|
|
122
|
+
"CampaignTracking",
|
|
123
123
|
"Campaign",
|
|
124
124
|
"CampaignsList",
|
|
125
|
+
"ListStats",
|
|
125
126
|
"ListCampaignDefaults",
|
|
126
127
|
"ListContact",
|
|
127
|
-
"ListStats",
|
|
128
128
|
"List",
|
|
129
129
|
"ListsList",
|
|
130
130
|
"ListMemberStatsEcommerceData",
|
|
131
131
|
"ListMemberStats",
|
|
132
|
-
"ListMemberLocation",
|
|
133
132
|
"ListMemberTagsItem",
|
|
133
|
+
"ListMemberLocation",
|
|
134
134
|
"ListMember",
|
|
135
135
|
"ListMembersList",
|
|
136
|
-
"ReportListStats",
|
|
137
|
-
"ReportEcommerce",
|
|
138
|
-
"ReportFacebookLikes",
|
|
139
|
-
"ReportIndustryStats",
|
|
140
136
|
"ReportOpens",
|
|
141
|
-
"ReportBounces",
|
|
142
|
-
"ReportDeliveryStatus",
|
|
143
137
|
"ReportForwards",
|
|
144
138
|
"ReportClicks",
|
|
139
|
+
"ReportDeliveryStatus",
|
|
140
|
+
"ReportIndustryStats",
|
|
141
|
+
"ReportFacebookLikes",
|
|
142
|
+
"ReportEcommerce",
|
|
143
|
+
"ReportListStats",
|
|
144
|
+
"ReportBounces",
|
|
145
145
|
"Report",
|
|
146
146
|
"ReportsList",
|
|
147
147
|
"EmailActivityActivityItem",
|
|
148
148
|
"EmailActivity",
|
|
149
149
|
"EmailActivityList",
|
|
150
150
|
"AutomationReportSummary",
|
|
151
|
-
"
|
|
151
|
+
"AutomationSettings",
|
|
152
152
|
"AutomationRecipientsSegmentOpts",
|
|
153
153
|
"AutomationRecipients",
|
|
154
|
-
"
|
|
154
|
+
"AutomationTracking",
|
|
155
155
|
"Automation",
|
|
156
156
|
"AutomationsList",
|
|
157
157
|
"Tag",
|
|
@@ -987,7 +987,9 @@ class LocalExecutor:
|
|
|
987
987
|
|
|
988
988
|
# Substitute variables from params
|
|
989
989
|
if "variables" in graphql_config and graphql_config["variables"]:
|
|
990
|
-
|
|
990
|
+
variables = self._interpolate_variables(graphql_config["variables"], params, param_defaults)
|
|
991
|
+
# Filter out None values (optional fields not provided) - matches REST _extract_body() behavior
|
|
992
|
+
body["variables"] = {k: v for k, v in variables.items() if v is not None}
|
|
991
993
|
|
|
992
994
|
# Add operation name if specified
|
|
993
995
|
if "operationName" in graphql_config:
|
|
@@ -1222,15 +1224,22 @@ class LocalExecutor:
|
|
|
1222
1224
|
def _extract_metadata(
|
|
1223
1225
|
self,
|
|
1224
1226
|
response_data: dict[str, Any],
|
|
1227
|
+
response_headers: dict[str, str],
|
|
1225
1228
|
endpoint: EndpointDefinition,
|
|
1226
1229
|
) -> dict[str, Any] | None:
|
|
1227
1230
|
"""Extract metadata from response using meta extractor.
|
|
1228
1231
|
|
|
1229
|
-
Each field in meta_extractor dict is independently extracted using JSONPath
|
|
1232
|
+
Each field in meta_extractor dict is independently extracted using JSONPath
|
|
1233
|
+
for body extraction, or special prefixes for header extraction:
|
|
1234
|
+
- @link.{rel}: Extract URL from RFC 5988 Link header by rel type
|
|
1235
|
+
- @header.{name}: Extract raw header value by header name
|
|
1236
|
+
- Otherwise: JSONPath expression for body extraction
|
|
1237
|
+
|
|
1230
1238
|
Missing or invalid paths result in None for that field (no crash).
|
|
1231
1239
|
|
|
1232
1240
|
Args:
|
|
1233
1241
|
response_data: Full API response (before record extraction)
|
|
1242
|
+
response_headers: HTTP response headers
|
|
1234
1243
|
endpoint: Endpoint with optional meta extractor configuration
|
|
1235
1244
|
|
|
1236
1245
|
Returns:
|
|
@@ -1241,11 +1250,15 @@ class LocalExecutor:
|
|
|
1241
1250
|
Example:
|
|
1242
1251
|
meta_extractor = {
|
|
1243
1252
|
"pagination": "$.records",
|
|
1244
|
-
"request_id": "$.requestId"
|
|
1253
|
+
"request_id": "$.requestId",
|
|
1254
|
+
"next_page_url": "@link.next",
|
|
1255
|
+
"rate_limit": "@header.X-RateLimit-Remaining"
|
|
1245
1256
|
}
|
|
1246
1257
|
Returns: {
|
|
1247
1258
|
"pagination": {"cursor": "abc", "total": 100},
|
|
1248
|
-
"request_id": "xyz123"
|
|
1259
|
+
"request_id": "xyz123",
|
|
1260
|
+
"next_page_url": "https://api.example.com/data?cursor=abc",
|
|
1261
|
+
"rate_limit": "99"
|
|
1249
1262
|
}
|
|
1250
1263
|
"""
|
|
1251
1264
|
# Check if endpoint has meta extractor
|
|
@@ -1255,26 +1268,96 @@ class LocalExecutor:
|
|
|
1255
1268
|
extracted_meta: dict[str, Any] = {}
|
|
1256
1269
|
|
|
1257
1270
|
# Extract each field independently
|
|
1258
|
-
for field_name,
|
|
1271
|
+
for field_name, extractor_expr in endpoint.meta_extractor.items():
|
|
1259
1272
|
try:
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
#
|
|
1266
|
-
|
|
1273
|
+
if extractor_expr.startswith("@link."):
|
|
1274
|
+
# RFC 5988 Link header extraction
|
|
1275
|
+
rel = extractor_expr[6:]
|
|
1276
|
+
extracted_meta[field_name] = self._extract_link_url(response_headers, rel)
|
|
1277
|
+
elif extractor_expr.startswith("@header."):
|
|
1278
|
+
# Raw header value extraction (case-insensitive lookup)
|
|
1279
|
+
header_name = extractor_expr[8:]
|
|
1280
|
+
extracted_meta[field_name] = self._get_header_value(response_headers, header_name)
|
|
1267
1281
|
else:
|
|
1268
|
-
#
|
|
1269
|
-
|
|
1282
|
+
# JSONPath body extraction
|
|
1283
|
+
jsonpath_expr = parse_jsonpath(extractor_expr)
|
|
1284
|
+
matches = [match.value for match in jsonpath_expr.find(response_data)]
|
|
1285
|
+
|
|
1286
|
+
if matches:
|
|
1287
|
+
# Return first match (most common case)
|
|
1288
|
+
extracted_meta[field_name] = matches[0]
|
|
1289
|
+
else:
|
|
1290
|
+
# Path not found - set to None
|
|
1291
|
+
extracted_meta[field_name] = None
|
|
1270
1292
|
|
|
1271
1293
|
except Exception as e:
|
|
1272
1294
|
# Log error but continue with other fields
|
|
1273
|
-
logging.warning(f"Failed to apply meta extractor for field '{field_name}' with
|
|
1295
|
+
logging.warning(f"Failed to apply meta extractor for field '{field_name}' with expression '{extractor_expr}': {e}. Setting to None.")
|
|
1274
1296
|
extracted_meta[field_name] = None
|
|
1275
1297
|
|
|
1276
1298
|
return extracted_meta
|
|
1277
1299
|
|
|
1300
|
+
@staticmethod
|
|
1301
|
+
def _extract_link_url(headers: dict[str, str], rel: str) -> str | None:
|
|
1302
|
+
"""Extract URL from RFC 5988 Link header by rel type.
|
|
1303
|
+
|
|
1304
|
+
Parses Link header format: <url>; param1="value1"; rel="next"; param2="value2"
|
|
1305
|
+
|
|
1306
|
+
Supports:
|
|
1307
|
+
- Multiple parameters per link in any order
|
|
1308
|
+
- Both quoted and unquoted rel values
|
|
1309
|
+
- Multiple links separated by commas
|
|
1310
|
+
|
|
1311
|
+
Args:
|
|
1312
|
+
headers: Response headers dict
|
|
1313
|
+
rel: The rel type to extract (e.g., "next", "prev", "first", "last")
|
|
1314
|
+
|
|
1315
|
+
Returns:
|
|
1316
|
+
The URL for the specified rel type, or None if not found
|
|
1317
|
+
"""
|
|
1318
|
+
link_header = headers.get("Link") or headers.get("link", "")
|
|
1319
|
+
if not link_header:
|
|
1320
|
+
return None
|
|
1321
|
+
|
|
1322
|
+
for link_segment in re.split(r",(?=\s*<)", link_header):
|
|
1323
|
+
link_segment = link_segment.strip()
|
|
1324
|
+
|
|
1325
|
+
url_match = re.match(r"<([^>]+)>", link_segment)
|
|
1326
|
+
if not url_match:
|
|
1327
|
+
continue
|
|
1328
|
+
|
|
1329
|
+
url = url_match.group(1)
|
|
1330
|
+
params_str = link_segment[url_match.end() :]
|
|
1331
|
+
|
|
1332
|
+
rel_match = re.search(r';\s*rel="?([^";,]+)"?', params_str, re.IGNORECASE)
|
|
1333
|
+
if rel_match and rel_match.group(1).strip() == rel:
|
|
1334
|
+
return url
|
|
1335
|
+
|
|
1336
|
+
return None
|
|
1337
|
+
|
|
1338
|
+
@staticmethod
|
|
1339
|
+
def _get_header_value(headers: dict[str, str], header_name: str) -> str | None:
|
|
1340
|
+
"""Get header value with case-insensitive lookup.
|
|
1341
|
+
|
|
1342
|
+
Args:
|
|
1343
|
+
headers: Response headers dict
|
|
1344
|
+
header_name: Header name to look up
|
|
1345
|
+
|
|
1346
|
+
Returns:
|
|
1347
|
+
Header value or None if not found
|
|
1348
|
+
"""
|
|
1349
|
+
# Try exact match first
|
|
1350
|
+
if header_name in headers:
|
|
1351
|
+
return headers[header_name]
|
|
1352
|
+
|
|
1353
|
+
# Case-insensitive lookup
|
|
1354
|
+
header_name_lower = header_name.lower()
|
|
1355
|
+
for key, value in headers.items():
|
|
1356
|
+
if key.lower() == header_name_lower:
|
|
1357
|
+
return value
|
|
1358
|
+
|
|
1359
|
+
return None
|
|
1360
|
+
|
|
1278
1361
|
def _validate_required_body_fields(self, endpoint: Any, params: dict[str, Any], action: Action, entity: str) -> None:
|
|
1279
1362
|
"""Validate that required body fields are present for CREATE/UPDATE operations.
|
|
1280
1363
|
|
|
@@ -1402,7 +1485,7 @@ class _StandardOperationHandler:
|
|
|
1402
1485
|
request_kwargs = self.ctx.determine_request_format(endpoint, body)
|
|
1403
1486
|
|
|
1404
1487
|
# Execute async HTTP request
|
|
1405
|
-
|
|
1488
|
+
response_data, response_headers = await self.ctx.http_client.request(
|
|
1406
1489
|
method=endpoint.method,
|
|
1407
1490
|
path=path,
|
|
1408
1491
|
params=query_params if query_params else None,
|
|
@@ -1411,10 +1494,10 @@ class _StandardOperationHandler:
|
|
|
1411
1494
|
)
|
|
1412
1495
|
|
|
1413
1496
|
# Extract metadata from original response (before record extraction)
|
|
1414
|
-
metadata = self.ctx.executor._extract_metadata(
|
|
1497
|
+
metadata = self.ctx.executor._extract_metadata(response_data, response_headers, endpoint)
|
|
1415
1498
|
|
|
1416
1499
|
# Extract records if extractor configured
|
|
1417
|
-
response = self.ctx.extract_records(
|
|
1500
|
+
response = self.ctx.extract_records(response_data, endpoint)
|
|
1418
1501
|
|
|
1419
1502
|
# Assume success with 200 status code if no exception raised
|
|
1420
1503
|
status_code = 200
|
|
@@ -1540,7 +1623,7 @@ class _DownloadOperationHandler:
|
|
|
1540
1623
|
request_format = self.ctx.determine_request_format(operation, request_body)
|
|
1541
1624
|
self.ctx.validate_required_body_fields(operation, params, action, entity)
|
|
1542
1625
|
|
|
1543
|
-
metadata_response = await self.ctx.http_client.request(
|
|
1626
|
+
metadata_response, _ = await self.ctx.http_client.request(
|
|
1544
1627
|
method=operation.method,
|
|
1545
1628
|
path=path,
|
|
1546
1629
|
params=query_params,
|
|
@@ -1555,7 +1638,7 @@ class _DownloadOperationHandler:
|
|
|
1555
1638
|
)
|
|
1556
1639
|
|
|
1557
1640
|
# Step 3: Stream file from extracted URL
|
|
1558
|
-
file_response = await self.ctx.http_client.request(
|
|
1641
|
+
file_response, _ = await self.ctx.http_client.request(
|
|
1559
1642
|
method="GET",
|
|
1560
1643
|
path=file_url,
|
|
1561
1644
|
headers=headers,
|
|
@@ -1563,7 +1646,7 @@ class _DownloadOperationHandler:
|
|
|
1563
1646
|
)
|
|
1564
1647
|
else:
|
|
1565
1648
|
# One-step direct download: stream file directly from endpoint
|
|
1566
|
-
file_response = await self.ctx.http_client.request(
|
|
1649
|
+
file_response, _ = await self.ctx.http_client.request(
|
|
1567
1650
|
method=operation.method,
|
|
1568
1651
|
path=path,
|
|
1569
1652
|
params=query_params,
|
|
@@ -421,10 +421,14 @@ class HTTPClient:
|
|
|
421
421
|
headers: dict[str, str] | None = None,
|
|
422
422
|
*,
|
|
423
423
|
stream: bool = False,
|
|
424
|
-
):
|
|
424
|
+
) -> tuple[dict[str, Any], dict[str, str]]:
|
|
425
425
|
"""Execute a single HTTP request attempt (no retries).
|
|
426
426
|
|
|
427
427
|
This is the core request logic, separated from retry handling.
|
|
428
|
+
|
|
429
|
+
Returns:
|
|
430
|
+
Tuple of (response_data, response_headers) for non-streaming requests.
|
|
431
|
+
For streaming requests, returns (response_object, response_headers).
|
|
428
432
|
"""
|
|
429
433
|
# Ensure auth credentials are initialized (proactive refresh if needed)
|
|
430
434
|
await self._ensure_auth_initialized()
|
|
@@ -474,8 +478,9 @@ class HTTPClient:
|
|
|
474
478
|
request_id=request_id,
|
|
475
479
|
status_code=status_code,
|
|
476
480
|
response_body=f"<binary content, {response.headers.get('content-length', 'unknown')} bytes>",
|
|
481
|
+
response_headers=dict(response.headers),
|
|
477
482
|
)
|
|
478
|
-
return response
|
|
483
|
+
return response, dict(response.headers)
|
|
479
484
|
|
|
480
485
|
# Parse response - handle non-JSON responses gracefully
|
|
481
486
|
content_type = response.headers.get("content-type", "")
|
|
@@ -500,8 +505,9 @@ class HTTPClient:
|
|
|
500
505
|
request_id=request_id,
|
|
501
506
|
status_code=status_code,
|
|
502
507
|
response_body=response_data,
|
|
508
|
+
response_headers=dict(response.headers),
|
|
503
509
|
)
|
|
504
|
-
return response_data
|
|
510
|
+
return response_data, dict(response.headers)
|
|
505
511
|
|
|
506
512
|
except AuthenticationError as e:
|
|
507
513
|
# Auth error (401, 403) - handle token refresh
|
|
@@ -631,7 +637,7 @@ class HTTPClient:
|
|
|
631
637
|
*,
|
|
632
638
|
stream: bool = False,
|
|
633
639
|
_auth_retry_attempted: bool = False,
|
|
634
|
-
):
|
|
640
|
+
) -> tuple[dict[str, Any], dict[str, str]]:
|
|
635
641
|
"""Make an async HTTP request with optional streaming and automatic retries.
|
|
636
642
|
|
|
637
643
|
Args:
|
|
@@ -644,8 +650,9 @@ class HTTPClient:
|
|
|
644
650
|
stream: If True, do not eagerly read the body (useful for downloads)
|
|
645
651
|
|
|
646
652
|
Returns:
|
|
647
|
-
|
|
648
|
-
- If stream=
|
|
653
|
+
Tuple of (response_data, response_headers):
|
|
654
|
+
- If stream=False: (parsed JSON dict or empty dict, response headers dict)
|
|
655
|
+
- If stream=True: (response object suitable for streaming, response headers dict)
|
|
649
656
|
|
|
650
657
|
Raises:
|
|
651
658
|
HTTPStatusError: If request fails with 4xx/5xx status after all retries
|
|
@@ -134,6 +134,7 @@ class RequestLogger:
|
|
|
134
134
|
request_id: str,
|
|
135
135
|
status_code: int,
|
|
136
136
|
response_body: Any | None = None,
|
|
137
|
+
response_headers: Dict[str, str] | None = None,
|
|
137
138
|
) -> None:
|
|
138
139
|
"""
|
|
139
140
|
Log a successful HTTP response.
|
|
@@ -142,6 +143,7 @@ class RequestLogger:
|
|
|
142
143
|
request_id: ID returned from log_request
|
|
143
144
|
status_code: HTTP status code
|
|
144
145
|
response_body: Response body
|
|
146
|
+
response_headers: Response headers
|
|
145
147
|
"""
|
|
146
148
|
if request_id not in self._active_requests:
|
|
147
149
|
return
|
|
@@ -166,6 +168,7 @@ class RequestLogger:
|
|
|
166
168
|
body=request_data["body"],
|
|
167
169
|
response_status=status_code,
|
|
168
170
|
response_body=serializable_body,
|
|
171
|
+
response_headers=response_headers or {},
|
|
169
172
|
timing_ms=timing_ms,
|
|
170
173
|
)
|
|
171
174
|
|
|
@@ -243,7 +246,13 @@ class NullLogger:
|
|
|
243
246
|
"""No-op log_request."""
|
|
244
247
|
return ""
|
|
245
248
|
|
|
246
|
-
def log_response(
|
|
249
|
+
def log_response(
|
|
250
|
+
self,
|
|
251
|
+
request_id: str,
|
|
252
|
+
status_code: int,
|
|
253
|
+
response_body: Any | None = None,
|
|
254
|
+
response_headers: Dict[str, str] | None = None,
|
|
255
|
+
) -> None:
|
|
247
256
|
"""No-op log_response."""
|
|
248
257
|
pass
|
|
249
258
|
|
|
@@ -486,30 +486,36 @@ def validate_meta_extractor_fields(
|
|
|
486
486
|
response_body = spec.captured_response.body
|
|
487
487
|
|
|
488
488
|
# Validate each meta extractor field
|
|
489
|
-
for field_name,
|
|
489
|
+
for field_name, extractor_expr in endpoint.meta_extractor.items():
|
|
490
|
+
# Skip header-based extractors - they extract from headers, not response body
|
|
491
|
+
# @link.next extracts from RFC 5988 Link header
|
|
492
|
+
# @header.X-Name extracts raw header value
|
|
493
|
+
if extractor_expr.startswith("@link.") or extractor_expr.startswith("@header."):
|
|
494
|
+
continue
|
|
495
|
+
|
|
490
496
|
# Check 1: Does the JSONPath find data in the actual response?
|
|
491
497
|
try:
|
|
492
|
-
parsed_expr = parse_jsonpath(
|
|
498
|
+
parsed_expr = parse_jsonpath(extractor_expr)
|
|
493
499
|
matches = [match.value for match in parsed_expr.find(response_body)]
|
|
494
500
|
|
|
495
501
|
if not matches:
|
|
496
502
|
warnings.append(
|
|
497
503
|
f"{entity_name}.{action}: x-airbyte-meta-extractor field '{field_name}' "
|
|
498
|
-
f"with JSONPath '{
|
|
504
|
+
f"with JSONPath '{extractor_expr}' found no matches in cassette response"
|
|
499
505
|
)
|
|
500
506
|
except Exception as e:
|
|
501
507
|
warnings.append(
|
|
502
|
-
f"{entity_name}.{action}: x-airbyte-meta-extractor field '{field_name}' has invalid JSONPath '{
|
|
508
|
+
f"{entity_name}.{action}: x-airbyte-meta-extractor field '{field_name}' has invalid JSONPath '{extractor_expr}': {str(e)}"
|
|
503
509
|
)
|
|
504
510
|
|
|
505
511
|
# Check 2: Is this field path declared in the response schema?
|
|
506
512
|
if endpoint.response_schema:
|
|
507
|
-
field_in_schema = _check_field_in_schema(
|
|
513
|
+
field_in_schema = _check_field_in_schema(extractor_expr, endpoint.response_schema)
|
|
508
514
|
|
|
509
515
|
if not field_in_schema:
|
|
510
516
|
warnings.append(
|
|
511
517
|
f"{entity_name}.{action}: x-airbyte-meta-extractor field '{field_name}' "
|
|
512
|
-
f"extracts from '{
|
|
518
|
+
f"extracts from '{extractor_expr}' but this path is not declared in response schema"
|
|
513
519
|
)
|
|
514
520
|
|
|
515
521
|
except Exception as e:
|
|
@@ -25,6 +25,21 @@ class MailchimpAuthConfig(BaseModel):
|
|
|
25
25
|
|
|
26
26
|
# ===== RESPONSE TYPE DEFINITIONS (PYDANTIC) =====
|
|
27
27
|
|
|
28
|
+
class CampaignDeliveryStatus(BaseModel):
|
|
29
|
+
"""Updates on campaigns in the process of sending"""
|
|
30
|
+
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
31
|
+
|
|
32
|
+
enabled: Union[bool | None, Any] = Field(default=None, description="Whether Campaign Delivery Status is enabled for this account and target campaign")
|
|
33
|
+
"""Whether Campaign Delivery Status is enabled for this account and target campaign"""
|
|
34
|
+
can_cancel: Union[bool | None, Any] = Field(default=None, description="Whether a campaign send can be canceled")
|
|
35
|
+
"""Whether a campaign send can be canceled"""
|
|
36
|
+
status: Union[str | None, Any] = Field(default=None, description="The current state of a campaign delivery")
|
|
37
|
+
"""The current state of a campaign delivery"""
|
|
38
|
+
emails_sent: Union[int | None, Any] = Field(default=None, description="The total number of emails confirmed sent for this campaign so far")
|
|
39
|
+
"""The total number of emails confirmed sent for this campaign so far"""
|
|
40
|
+
emails_canceled: Union[int | None, Any] = Field(default=None, description="The total number of emails canceled for this campaign")
|
|
41
|
+
"""The total number of emails canceled for this campaign"""
|
|
42
|
+
|
|
28
43
|
class CampaignRecipients(BaseModel):
|
|
29
44
|
"""List settings for the campaign"""
|
|
30
45
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
@@ -40,25 +55,6 @@ class CampaignRecipients(BaseModel):
|
|
|
40
55
|
recipient_count: Union[int | None, Any] = Field(default=None, description="Count of the recipients on the associated list")
|
|
41
56
|
"""Count of the recipients on the associated list"""
|
|
42
57
|
|
|
43
|
-
class CampaignTracking(BaseModel):
|
|
44
|
-
"""The tracking options for a campaign"""
|
|
45
|
-
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
46
|
-
|
|
47
|
-
opens: Union[bool | None, Any] = Field(default=None, description="Whether to track opens")
|
|
48
|
-
"""Whether to track opens"""
|
|
49
|
-
html_clicks: Union[bool | None, Any] = Field(default=None, description="Whether to track clicks in the HTML version of the campaign")
|
|
50
|
-
"""Whether to track clicks in the HTML version of the campaign"""
|
|
51
|
-
text_clicks: Union[bool | None, Any] = Field(default=None, description="Whether to track clicks in the plain-text version of the campaign")
|
|
52
|
-
"""Whether to track clicks in the plain-text version of the campaign"""
|
|
53
|
-
goal_tracking: Union[bool | None, Any] = Field(default=None, description="Whether to enable Goal tracking")
|
|
54
|
-
"""Whether to enable Goal tracking"""
|
|
55
|
-
ecomm360: Union[bool | None, Any] = Field(default=None, description="Whether to enable eCommerce360 tracking")
|
|
56
|
-
"""Whether to enable eCommerce360 tracking"""
|
|
57
|
-
google_analytics: Union[str | None, Any] = Field(default=None, description="The custom slug for Google Analytics tracking")
|
|
58
|
-
"""The custom slug for Google Analytics tracking"""
|
|
59
|
-
clicktale: Union[str | None, Any] = Field(default=None, description="The custom slug for ClickTale tracking")
|
|
60
|
-
"""The custom slug for ClickTale tracking"""
|
|
61
|
-
|
|
62
58
|
class CampaignSettings(BaseModel):
|
|
63
59
|
"""The settings for your campaign"""
|
|
64
60
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
@@ -96,21 +92,6 @@ class CampaignSettings(BaseModel):
|
|
|
96
92
|
drag_and_drop: Union[bool | None, Any] = Field(default=None, description="Whether the campaign uses the drag-and-drop editor")
|
|
97
93
|
"""Whether the campaign uses the drag-and-drop editor"""
|
|
98
94
|
|
|
99
|
-
class CampaignDeliveryStatus(BaseModel):
|
|
100
|
-
"""Updates on campaigns in the process of sending"""
|
|
101
|
-
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
102
|
-
|
|
103
|
-
enabled: Union[bool | None, Any] = Field(default=None, description="Whether Campaign Delivery Status is enabled for this account and target campaign")
|
|
104
|
-
"""Whether Campaign Delivery Status is enabled for this account and target campaign"""
|
|
105
|
-
can_cancel: Union[bool | None, Any] = Field(default=None, description="Whether a campaign send can be canceled")
|
|
106
|
-
"""Whether a campaign send can be canceled"""
|
|
107
|
-
status: Union[str | None, Any] = Field(default=None, description="The current state of a campaign delivery")
|
|
108
|
-
"""The current state of a campaign delivery"""
|
|
109
|
-
emails_sent: Union[int | None, Any] = Field(default=None, description="The total number of emails confirmed sent for this campaign so far")
|
|
110
|
-
"""The total number of emails confirmed sent for this campaign so far"""
|
|
111
|
-
emails_canceled: Union[int | None, Any] = Field(default=None, description="The total number of emails canceled for this campaign")
|
|
112
|
-
"""The total number of emails canceled for this campaign"""
|
|
113
|
-
|
|
114
95
|
class CampaignReportSummaryEcommerce(BaseModel):
|
|
115
96
|
"""E-Commerce stats for a campaign"""
|
|
116
97
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
@@ -141,6 +122,25 @@ class CampaignReportSummary(BaseModel):
|
|
|
141
122
|
ecommerce: Union[CampaignReportSummaryEcommerce | None, Any] = Field(default=None, description="E-Commerce stats for a campaign")
|
|
142
123
|
"""E-Commerce stats for a campaign"""
|
|
143
124
|
|
|
125
|
+
class CampaignTracking(BaseModel):
|
|
126
|
+
"""The tracking options for a campaign"""
|
|
127
|
+
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
128
|
+
|
|
129
|
+
opens: Union[bool | None, Any] = Field(default=None, description="Whether to track opens")
|
|
130
|
+
"""Whether to track opens"""
|
|
131
|
+
html_clicks: Union[bool | None, Any] = Field(default=None, description="Whether to track clicks in the HTML version of the campaign")
|
|
132
|
+
"""Whether to track clicks in the HTML version of the campaign"""
|
|
133
|
+
text_clicks: Union[bool | None, Any] = Field(default=None, description="Whether to track clicks in the plain-text version of the campaign")
|
|
134
|
+
"""Whether to track clicks in the plain-text version of the campaign"""
|
|
135
|
+
goal_tracking: Union[bool | None, Any] = Field(default=None, description="Whether to enable Goal tracking")
|
|
136
|
+
"""Whether to enable Goal tracking"""
|
|
137
|
+
ecomm360: Union[bool | None, Any] = Field(default=None, description="Whether to enable eCommerce360 tracking")
|
|
138
|
+
"""Whether to enable eCommerce360 tracking"""
|
|
139
|
+
google_analytics: Union[str | None, Any] = Field(default=None, description="The custom slug for Google Analytics tracking")
|
|
140
|
+
"""The custom slug for Google Analytics tracking"""
|
|
141
|
+
clicktale: Union[str | None, Any] = Field(default=None, description="The custom slug for ClickTale tracking")
|
|
142
|
+
"""The custom slug for ClickTale tracking"""
|
|
143
|
+
|
|
144
144
|
class Campaign(BaseModel):
|
|
145
145
|
"""A summary of an individual campaign's settings and content"""
|
|
146
146
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
@@ -171,40 +171,6 @@ class CampaignsList(BaseModel):
|
|
|
171
171
|
campaigns: Union[list[Campaign], Any] = Field(default=None)
|
|
172
172
|
total_items: Union[int, Any] = Field(default=None)
|
|
173
173
|
|
|
174
|
-
class ListCampaignDefaults(BaseModel):
|
|
175
|
-
"""Default values for campaigns created for this list"""
|
|
176
|
-
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
177
|
-
|
|
178
|
-
from_name: Union[str | None, Any] = Field(default=None, description="The default from name for campaigns sent to this list")
|
|
179
|
-
"""The default from name for campaigns sent to this list"""
|
|
180
|
-
from_email: Union[str | None, Any] = Field(default=None, description="The default from email for campaigns sent to this list")
|
|
181
|
-
"""The default from email for campaigns sent to this list"""
|
|
182
|
-
subject: Union[str | None, Any] = Field(default=None, description="The default subject line for campaigns sent to this list")
|
|
183
|
-
"""The default subject line for campaigns sent to this list"""
|
|
184
|
-
language: Union[str | None, Any] = Field(default=None, description="The default language for this list's forms")
|
|
185
|
-
"""The default language for this list's forms"""
|
|
186
|
-
|
|
187
|
-
class ListContact(BaseModel):
|
|
188
|
-
"""Contact information displayed in campaign footers to comply with international spam laws"""
|
|
189
|
-
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
190
|
-
|
|
191
|
-
company: Union[str | None, Any] = Field(default=None, description="The company name for the list")
|
|
192
|
-
"""The company name for the list"""
|
|
193
|
-
address1: Union[str | None, Any] = Field(default=None, description="The street address for the list contact")
|
|
194
|
-
"""The street address for the list contact"""
|
|
195
|
-
address2: Union[str | None, Any] = Field(default=None, description="The street address for the list contact")
|
|
196
|
-
"""The street address for the list contact"""
|
|
197
|
-
city: Union[str | None, Any] = Field(default=None, description="The city for the list contact")
|
|
198
|
-
"""The city for the list contact"""
|
|
199
|
-
state: Union[str | None, Any] = Field(default=None, description="The state for the list contact")
|
|
200
|
-
"""The state for the list contact"""
|
|
201
|
-
zip: Union[str | None, Any] = Field(default=None, description="The postal or zip code for the list contact")
|
|
202
|
-
"""The postal or zip code for the list contact"""
|
|
203
|
-
country: Union[str | None, Any] = Field(default=None, description="A two-character ISO3166 country code")
|
|
204
|
-
"""A two-character ISO3166 country code"""
|
|
205
|
-
phone: Union[str | None, Any] = Field(default=None, description="The phone number for the list contact")
|
|
206
|
-
"""The phone number for the list contact"""
|
|
207
|
-
|
|
208
174
|
class ListStats(BaseModel):
|
|
209
175
|
"""Stats for the list"""
|
|
210
176
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
@@ -244,6 +210,40 @@ class ListStats(BaseModel):
|
|
|
244
210
|
last_unsub_date: Union[str | None, Any] = Field(default=None, description="The date and time of the last time someone unsubscribed from this list")
|
|
245
211
|
"""The date and time of the last time someone unsubscribed from this list"""
|
|
246
212
|
|
|
213
|
+
class ListCampaignDefaults(BaseModel):
|
|
214
|
+
"""Default values for campaigns created for this list"""
|
|
215
|
+
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
216
|
+
|
|
217
|
+
from_name: Union[str | None, Any] = Field(default=None, description="The default from name for campaigns sent to this list")
|
|
218
|
+
"""The default from name for campaigns sent to this list"""
|
|
219
|
+
from_email: Union[str | None, Any] = Field(default=None, description="The default from email for campaigns sent to this list")
|
|
220
|
+
"""The default from email for campaigns sent to this list"""
|
|
221
|
+
subject: Union[str | None, Any] = Field(default=None, description="The default subject line for campaigns sent to this list")
|
|
222
|
+
"""The default subject line for campaigns sent to this list"""
|
|
223
|
+
language: Union[str | None, Any] = Field(default=None, description="The default language for this list's forms")
|
|
224
|
+
"""The default language for this list's forms"""
|
|
225
|
+
|
|
226
|
+
class ListContact(BaseModel):
|
|
227
|
+
"""Contact information displayed in campaign footers to comply with international spam laws"""
|
|
228
|
+
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
229
|
+
|
|
230
|
+
company: Union[str | None, Any] = Field(default=None, description="The company name for the list")
|
|
231
|
+
"""The company name for the list"""
|
|
232
|
+
address1: Union[str | None, Any] = Field(default=None, description="The street address for the list contact")
|
|
233
|
+
"""The street address for the list contact"""
|
|
234
|
+
address2: Union[str | None, Any] = Field(default=None, description="The street address for the list contact")
|
|
235
|
+
"""The street address for the list contact"""
|
|
236
|
+
city: Union[str | None, Any] = Field(default=None, description="The city for the list contact")
|
|
237
|
+
"""The city for the list contact"""
|
|
238
|
+
state: Union[str | None, Any] = Field(default=None, description="The state for the list contact")
|
|
239
|
+
"""The state for the list contact"""
|
|
240
|
+
zip: Union[str | None, Any] = Field(default=None, description="The postal or zip code for the list contact")
|
|
241
|
+
"""The postal or zip code for the list contact"""
|
|
242
|
+
country: Union[str | None, Any] = Field(default=None, description="A two-character ISO3166 country code")
|
|
243
|
+
"""A two-character ISO3166 country code"""
|
|
244
|
+
phone: Union[str | None, Any] = Field(default=None, description="The phone number for the list contact")
|
|
245
|
+
"""The phone number for the list contact"""
|
|
246
|
+
|
|
247
247
|
class List(BaseModel):
|
|
248
248
|
"""Information about a specific list"""
|
|
249
249
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
@@ -298,6 +298,15 @@ class ListMemberStats(BaseModel):
|
|
|
298
298
|
ecommerce_data: Union[ListMemberStatsEcommerceData | None, Any] = Field(default=None, description="Ecommerce stats for the list member if the list is attached to a store")
|
|
299
299
|
"""Ecommerce stats for the list member if the list is attached to a store"""
|
|
300
300
|
|
|
301
|
+
class ListMemberTagsItem(BaseModel):
|
|
302
|
+
"""Nested schema for ListMember.tags_item"""
|
|
303
|
+
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
304
|
+
|
|
305
|
+
id: Union[int | None, Any] = Field(default=None, description="The tag id")
|
|
306
|
+
"""The tag id"""
|
|
307
|
+
name: Union[str | None, Any] = Field(default=None, description="The name of the tag")
|
|
308
|
+
"""The name of the tag"""
|
|
309
|
+
|
|
301
310
|
class ListMemberLocation(BaseModel):
|
|
302
311
|
"""Subscriber location information"""
|
|
303
312
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
@@ -317,15 +326,6 @@ class ListMemberLocation(BaseModel):
|
|
|
317
326
|
region: Union[str | None, Any] = Field(default=None, description="The region for the location")
|
|
318
327
|
"""The region for the location"""
|
|
319
328
|
|
|
320
|
-
class ListMemberTagsItem(BaseModel):
|
|
321
|
-
"""Nested schema for ListMember.tags_item"""
|
|
322
|
-
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
323
|
-
|
|
324
|
-
id: Union[int | None, Any] = Field(default=None, description="The tag id")
|
|
325
|
-
"""The tag id"""
|
|
326
|
-
name: Union[str | None, Any] = Field(default=None, description="The name of the tag")
|
|
327
|
-
"""The name of the tag"""
|
|
328
|
-
|
|
329
329
|
class ListMember(BaseModel):
|
|
330
330
|
"""Individuals who are currently or have been previously subscribed to this list"""
|
|
331
331
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
@@ -366,40 +366,49 @@ class ListMembersList(BaseModel):
|
|
|
366
366
|
list_id: Union[str | None, Any] = Field(default=None)
|
|
367
367
|
total_items: Union[int, Any] = Field(default=None)
|
|
368
368
|
|
|
369
|
-
class
|
|
370
|
-
"""
|
|
369
|
+
class ReportOpens(BaseModel):
|
|
370
|
+
"""An object describing the open activity for the campaign"""
|
|
371
371
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
372
372
|
|
|
373
|
-
|
|
374
|
-
"""The
|
|
375
|
-
|
|
376
|
-
"""The
|
|
377
|
-
open_rate: Union[float | None, Any] = Field(default=None, description="The
|
|
378
|
-
"""The
|
|
379
|
-
|
|
380
|
-
"""The
|
|
373
|
+
opens_total: Union[int | None, Any] = Field(default=None, description="The total number of opens for a campaign")
|
|
374
|
+
"""The total number of opens for a campaign"""
|
|
375
|
+
unique_opens: Union[int | None, Any] = Field(default=None, description="The total number of unique opens")
|
|
376
|
+
"""The total number of unique opens"""
|
|
377
|
+
open_rate: Union[float | None, Any] = Field(default=None, description="The number of unique opens divided by the total number of successful deliveries")
|
|
378
|
+
"""The number of unique opens divided by the total number of successful deliveries"""
|
|
379
|
+
last_open: Union[str | None, Any] = Field(default=None, description="The date and time of the last recorded open")
|
|
380
|
+
"""The date and time of the last recorded open"""
|
|
381
381
|
|
|
382
|
-
class
|
|
383
|
-
"""
|
|
382
|
+
class ReportForwards(BaseModel):
|
|
383
|
+
"""An object describing the forwards and forward activity for the campaign"""
|
|
384
384
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
385
385
|
|
|
386
|
-
|
|
387
|
-
"""
|
|
388
|
-
|
|
389
|
-
"""
|
|
390
|
-
total_revenue: Union[float | None, Any] = Field(default=None, description="The total revenue for a campaign")
|
|
391
|
-
"""The total revenue for a campaign"""
|
|
386
|
+
forwards_count: Union[int | None, Any] = Field(default=None, description="How many times the campaign has been forwarded")
|
|
387
|
+
"""How many times the campaign has been forwarded"""
|
|
388
|
+
forwards_opens: Union[int | None, Any] = Field(default=None, description="How many times the forwarded campaign has been opened")
|
|
389
|
+
"""How many times the forwarded campaign has been opened"""
|
|
392
390
|
|
|
393
|
-
class
|
|
394
|
-
"""An object describing
|
|
391
|
+
class ReportClicks(BaseModel):
|
|
392
|
+
"""An object describing the click activity for the campaign"""
|
|
395
393
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
396
394
|
|
|
397
|
-
|
|
398
|
-
"""The number of
|
|
399
|
-
|
|
400
|
-
"""The number of unique
|
|
401
|
-
|
|
402
|
-
"""The number of
|
|
395
|
+
clicks_total: Union[int | None, Any] = Field(default=None, description="The total number of clicks for the campaign")
|
|
396
|
+
"""The total number of clicks for the campaign"""
|
|
397
|
+
unique_clicks: Union[int | None, Any] = Field(default=None, description="The total number of unique clicks for links across a campaign")
|
|
398
|
+
"""The total number of unique clicks for links across a campaign"""
|
|
399
|
+
unique_subscriber_clicks: Union[int | None, Any] = Field(default=None, description="The total number of subscribers who clicked on a campaign")
|
|
400
|
+
"""The total number of subscribers who clicked on a campaign"""
|
|
401
|
+
click_rate: Union[float | None, Any] = Field(default=None, description="The number of unique clicks divided by the total number of successful deliveries")
|
|
402
|
+
"""The number of unique clicks divided by the total number of successful deliveries"""
|
|
403
|
+
last_click: Union[str | None, Any] = Field(default=None, description="The date and time of the last recorded click for the campaign")
|
|
404
|
+
"""The date and time of the last recorded click for the campaign"""
|
|
405
|
+
|
|
406
|
+
class ReportDeliveryStatus(BaseModel):
|
|
407
|
+
"""Updates on campaigns in the process of sending"""
|
|
408
|
+
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
409
|
+
|
|
410
|
+
enabled: Union[bool | None, Any] = Field(default=None, description="Whether Campaign Delivery Status is enabled for this account and target campaign")
|
|
411
|
+
"""Whether Campaign Delivery Status is enabled for this account and target campaign"""
|
|
403
412
|
|
|
404
413
|
class ReportIndustryStats(BaseModel):
|
|
405
414
|
"""The average campaign statistics for your industry"""
|
|
@@ -420,18 +429,40 @@ class ReportIndustryStats(BaseModel):
|
|
|
420
429
|
abuse_rate: Union[float | None, Any] = Field(default=None, description="The industry abuse rate")
|
|
421
430
|
"""The industry abuse rate"""
|
|
422
431
|
|
|
423
|
-
class
|
|
424
|
-
"""An object describing
|
|
432
|
+
class ReportFacebookLikes(BaseModel):
|
|
433
|
+
"""An object describing campaign engagement on Facebook"""
|
|
425
434
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
426
435
|
|
|
427
|
-
|
|
428
|
-
"""The
|
|
429
|
-
|
|
430
|
-
"""The
|
|
431
|
-
|
|
432
|
-
"""The number of
|
|
433
|
-
|
|
434
|
-
|
|
436
|
+
recipient_likes: Union[int | None, Any] = Field(default=None, description="The number of recipients who liked the campaign on Facebook")
|
|
437
|
+
"""The number of recipients who liked the campaign on Facebook"""
|
|
438
|
+
unique_likes: Union[int | None, Any] = Field(default=None, description="The number of unique likes")
|
|
439
|
+
"""The number of unique likes"""
|
|
440
|
+
facebook_likes: Union[int | None, Any] = Field(default=None, description="The number of Facebook likes for the campaign")
|
|
441
|
+
"""The number of Facebook likes for the campaign"""
|
|
442
|
+
|
|
443
|
+
class ReportEcommerce(BaseModel):
|
|
444
|
+
"""E-Commerce stats for a campaign"""
|
|
445
|
+
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
446
|
+
|
|
447
|
+
total_orders: Union[int | None, Any] = Field(default=None, description="The total orders for a campaign")
|
|
448
|
+
"""The total orders for a campaign"""
|
|
449
|
+
total_spent: Union[float | None, Any] = Field(default=None, description="The total spent for a campaign")
|
|
450
|
+
"""The total spent for a campaign"""
|
|
451
|
+
total_revenue: Union[float | None, Any] = Field(default=None, description="The total revenue for a campaign")
|
|
452
|
+
"""The total revenue for a campaign"""
|
|
453
|
+
|
|
454
|
+
class ReportListStats(BaseModel):
|
|
455
|
+
"""The average campaign statistics for your list"""
|
|
456
|
+
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
457
|
+
|
|
458
|
+
sub_rate: Union[float | None, Any] = Field(default=None, description="The average number of subscriptions per month for the list")
|
|
459
|
+
"""The average number of subscriptions per month for the list"""
|
|
460
|
+
unsub_rate: Union[float | None, Any] = Field(default=None, description="The average number of unsubscriptions per month for the list")
|
|
461
|
+
"""The average number of unsubscriptions per month for the list"""
|
|
462
|
+
open_rate: Union[float | None, Any] = Field(default=None, description="The average open rate for campaigns sent to this list")
|
|
463
|
+
"""The average open rate for campaigns sent to this list"""
|
|
464
|
+
click_rate: Union[float | None, Any] = Field(default=None, description="The average click rate for campaigns sent to this list")
|
|
465
|
+
"""The average click rate for campaigns sent to this list"""
|
|
435
466
|
|
|
436
467
|
class ReportBounces(BaseModel):
|
|
437
468
|
"""An object describing the bounce summary for the campaign"""
|
|
@@ -444,37 +475,6 @@ class ReportBounces(BaseModel):
|
|
|
444
475
|
syntax_errors: Union[int | None, Any] = Field(default=None, description="The total number of addresses that were syntax-related bounces")
|
|
445
476
|
"""The total number of addresses that were syntax-related bounces"""
|
|
446
477
|
|
|
447
|
-
class ReportDeliveryStatus(BaseModel):
|
|
448
|
-
"""Updates on campaigns in the process of sending"""
|
|
449
|
-
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
450
|
-
|
|
451
|
-
enabled: Union[bool | None, Any] = Field(default=None, description="Whether Campaign Delivery Status is enabled for this account and target campaign")
|
|
452
|
-
"""Whether Campaign Delivery Status is enabled for this account and target campaign"""
|
|
453
|
-
|
|
454
|
-
class ReportForwards(BaseModel):
|
|
455
|
-
"""An object describing the forwards and forward activity for the campaign"""
|
|
456
|
-
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
457
|
-
|
|
458
|
-
forwards_count: Union[int | None, Any] = Field(default=None, description="How many times the campaign has been forwarded")
|
|
459
|
-
"""How many times the campaign has been forwarded"""
|
|
460
|
-
forwards_opens: Union[int | None, Any] = Field(default=None, description="How many times the forwarded campaign has been opened")
|
|
461
|
-
"""How many times the forwarded campaign has been opened"""
|
|
462
|
-
|
|
463
|
-
class ReportClicks(BaseModel):
|
|
464
|
-
"""An object describing the click activity for the campaign"""
|
|
465
|
-
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
466
|
-
|
|
467
|
-
clicks_total: Union[int | None, Any] = Field(default=None, description="The total number of clicks for the campaign")
|
|
468
|
-
"""The total number of clicks for the campaign"""
|
|
469
|
-
unique_clicks: Union[int | None, Any] = Field(default=None, description="The total number of unique clicks for links across a campaign")
|
|
470
|
-
"""The total number of unique clicks for links across a campaign"""
|
|
471
|
-
unique_subscriber_clicks: Union[int | None, Any] = Field(default=None, description="The total number of subscribers who clicked on a campaign")
|
|
472
|
-
"""The total number of subscribers who clicked on a campaign"""
|
|
473
|
-
click_rate: Union[float | None, Any] = Field(default=None, description="The number of unique clicks divided by the total number of successful deliveries")
|
|
474
|
-
"""The number of unique clicks divided by the total number of successful deliveries"""
|
|
475
|
-
last_click: Union[str | None, Any] = Field(default=None, description="The date and time of the last recorded click for the campaign")
|
|
476
|
-
"""The date and time of the last recorded click for the campaign"""
|
|
477
|
-
|
|
478
478
|
class Report(BaseModel):
|
|
479
479
|
"""Report details about a sent campaign"""
|
|
480
480
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
@@ -560,24 +560,26 @@ class AutomationReportSummary(BaseModel):
|
|
|
560
560
|
click_rate: Union[float | None, Any] = Field(default=None, description="The number of unique clicks divided by the total number of successful deliveries")
|
|
561
561
|
"""The number of unique clicks divided by the total number of successful deliveries"""
|
|
562
562
|
|
|
563
|
-
class
|
|
564
|
-
"""The
|
|
563
|
+
class AutomationSettings(BaseModel):
|
|
564
|
+
"""The settings for the Automation workflow"""
|
|
565
565
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
566
566
|
|
|
567
|
-
|
|
568
|
-
"""
|
|
569
|
-
|
|
570
|
-
"""
|
|
571
|
-
|
|
572
|
-
"""
|
|
573
|
-
|
|
574
|
-
"""Whether to
|
|
575
|
-
|
|
576
|
-
"""
|
|
577
|
-
|
|
578
|
-
"""
|
|
579
|
-
|
|
580
|
-
"""
|
|
567
|
+
title: Union[str | None, Any] = Field(default=None, description="The title of the Automation")
|
|
568
|
+
"""The title of the Automation"""
|
|
569
|
+
from_name: Union[str | None, Any] = Field(default=None, description="The from name for the Automation")
|
|
570
|
+
"""The from name for the Automation"""
|
|
571
|
+
reply_to: Union[str | None, Any] = Field(default=None, description="The reply-to email address for the Automation")
|
|
572
|
+
"""The reply-to email address for the Automation"""
|
|
573
|
+
use_conversation: Union[bool | None, Any] = Field(default=None, description="Whether to use Mailchimp Conversation feature")
|
|
574
|
+
"""Whether to use Mailchimp Conversation feature"""
|
|
575
|
+
to_name: Union[str | None, Any] = Field(default=None, description="The Automation's custom to name")
|
|
576
|
+
"""The Automation's custom to name"""
|
|
577
|
+
authenticate: Union[bool | None, Any] = Field(default=None, description="Whether Mailchimp authenticated the Automation")
|
|
578
|
+
"""Whether Mailchimp authenticated the Automation"""
|
|
579
|
+
auto_footer: Union[bool | None, Any] = Field(default=None, description="Whether to automatically append Mailchimp's default footer")
|
|
580
|
+
"""Whether to automatically append Mailchimp's default footer"""
|
|
581
|
+
inline_css: Union[bool | None, Any] = Field(default=None, description="Whether to automatically inline the CSS")
|
|
582
|
+
"""Whether to automatically inline the CSS"""
|
|
581
583
|
|
|
582
584
|
class AutomationRecipientsSegmentOpts(BaseModel):
|
|
583
585
|
"""An object representing all segmentation options"""
|
|
@@ -605,26 +607,24 @@ class AutomationRecipients(BaseModel):
|
|
|
605
607
|
store_id: Union[str | None, Any] = Field(default=None, description="The id of the store")
|
|
606
608
|
"""The id of the store"""
|
|
607
609
|
|
|
608
|
-
class
|
|
609
|
-
"""The
|
|
610
|
+
class AutomationTracking(BaseModel):
|
|
611
|
+
"""The tracking options for the Automation"""
|
|
610
612
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
611
613
|
|
|
612
|
-
|
|
613
|
-
"""
|
|
614
|
-
|
|
615
|
-
"""
|
|
616
|
-
|
|
617
|
-
"""
|
|
618
|
-
|
|
619
|
-
"""Whether to
|
|
620
|
-
|
|
621
|
-
"""
|
|
622
|
-
|
|
623
|
-
"""
|
|
624
|
-
|
|
625
|
-
"""
|
|
626
|
-
inline_css: Union[bool | None, Any] = Field(default=None, description="Whether to automatically inline the CSS")
|
|
627
|
-
"""Whether to automatically inline the CSS"""
|
|
614
|
+
opens: Union[bool | None, Any] = Field(default=None, description="Whether to track opens")
|
|
615
|
+
"""Whether to track opens"""
|
|
616
|
+
html_clicks: Union[bool | None, Any] = Field(default=None, description="Whether to track clicks in the HTML version")
|
|
617
|
+
"""Whether to track clicks in the HTML version"""
|
|
618
|
+
text_clicks: Union[bool | None, Any] = Field(default=None, description="Whether to track clicks in the plain-text version")
|
|
619
|
+
"""Whether to track clicks in the plain-text version"""
|
|
620
|
+
goal_tracking: Union[bool | None, Any] = Field(default=None, description="Whether to enable Goal tracking")
|
|
621
|
+
"""Whether to enable Goal tracking"""
|
|
622
|
+
ecomm360: Union[bool | None, Any] = Field(default=None, description="Whether to enable eCommerce360 tracking")
|
|
623
|
+
"""Whether to enable eCommerce360 tracking"""
|
|
624
|
+
google_analytics: Union[str | None, Any] = Field(default=None, description="The custom slug for Google Analytics tracking")
|
|
625
|
+
"""The custom slug for Google Analytics tracking"""
|
|
626
|
+
clicktale: Union[str | None, Any] = Field(default=None, description="The custom slug for ClickTale tracking")
|
|
627
|
+
"""The custom slug for ClickTale tracking"""
|
|
628
628
|
|
|
629
629
|
class Automation(BaseModel):
|
|
630
630
|
"""A summary of an individual Automation workflow's settings and content"""
|
{airbyte_agent_mailchimp-0.1.4.dist-info → airbyte_agent_mailchimp-0.1.7.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: airbyte-agent-mailchimp
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.7
|
|
4
4
|
Summary: Airbyte Mailchimp Connector for AI platforms
|
|
5
5
|
Project-URL: Homepage, https://github.com/airbytehq/airbyte-agent-connectors
|
|
6
6
|
Project-URL: Documentation, https://docs.airbyte.com/ai-agents/
|
|
@@ -114,6 +114,6 @@ For the service's official API docs, see the [Mailchimp API reference](https://m
|
|
|
114
114
|
|
|
115
115
|
## Version information
|
|
116
116
|
|
|
117
|
-
- **Package version:** 0.1.
|
|
117
|
+
- **Package version:** 0.1.7
|
|
118
118
|
- **Connector version:** 1.0.1
|
|
119
|
-
- **Generated with Connector SDK commit SHA:**
|
|
119
|
+
- **Generated with Connector SDK commit SHA:** c46670b9e4ca5238c0372e143b44088a0d1a68ee
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
airbyte_agent_mailchimp/__init__.py,sha256=
|
|
1
|
+
airbyte_agent_mailchimp/__init__.py,sha256=yafBcpb8eP266D-XBj05UdokNYrzQ9DV-PokBx7Hf5c,5275
|
|
2
2
|
airbyte_agent_mailchimp/connector.py,sha256=gUki4sLvMzmHCCLIhbMZx-DJH7xO6jXM5yipWZaFQyM,45867
|
|
3
3
|
airbyte_agent_mailchimp/connector_model.py,sha256=LTOadOFSXgfDn7kqZrFlOymAzhOpDq2V7tKopmHFPPQ,281492
|
|
4
|
-
airbyte_agent_mailchimp/models.py,sha256=
|
|
4
|
+
airbyte_agent_mailchimp/models.py,sha256=67JYvyMZd7QEl1qEbym4tE6gnYE2FehX_El6tvIZFd8,56168
|
|
5
5
|
airbyte_agent_mailchimp/types.py,sha256=9OeRLHJdQY3F4Y5gS5tn6lcF-Vfx45CIheTUH3hAZbA,4881
|
|
6
6
|
airbyte_agent_mailchimp/_vendored/__init__.py,sha256=ILl7AHXMui__swyrjxrh9yRa4dLiwBvV6axPWFWty80,38
|
|
7
7
|
airbyte_agent_mailchimp/_vendored/connector_sdk/__init__.py,sha256=T5o7roU6NSpH-lCAGZ338sE5dlh4ZU6i6IkeG1zpems,1949
|
|
@@ -11,17 +11,17 @@ airbyte_agent_mailchimp/_vendored/connector_sdk/connector_model_loader.py,sha256
|
|
|
11
11
|
airbyte_agent_mailchimp/_vendored/connector_sdk/constants.py,sha256=AtzOvhDMWbRJgpsQNWl5tkogHD6mWgEY668PgRmgtOY,2737
|
|
12
12
|
airbyte_agent_mailchimp/_vendored/connector_sdk/exceptions.py,sha256=ss5MGv9eVPmsbLcLWetuu3sDmvturwfo6Pw3M37Oq5k,481
|
|
13
13
|
airbyte_agent_mailchimp/_vendored/connector_sdk/extensions.py,sha256=XWRRoJOOrwUHSKbuQt5DU7CCu8ePzhd_HuP7c_uD77w,21376
|
|
14
|
-
airbyte_agent_mailchimp/_vendored/connector_sdk/http_client.py,sha256=
|
|
14
|
+
airbyte_agent_mailchimp/_vendored/connector_sdk/http_client.py,sha256=yucwu3OvJh5wLQa1mk-gTKjtqjKKucMw5ltmlE7mk1c,28000
|
|
15
15
|
airbyte_agent_mailchimp/_vendored/connector_sdk/introspection.py,sha256=2CyKXZHT74-1Id97uw1RLeyOi6TV24_hoNbQ6-6y7uI,10335
|
|
16
16
|
airbyte_agent_mailchimp/_vendored/connector_sdk/secrets.py,sha256=J9ezMu4xNnLW11xY5RCre6DHP7YMKZCqwGJfk7ufHAM,6855
|
|
17
17
|
airbyte_agent_mailchimp/_vendored/connector_sdk/types.py,sha256=CStkOsLtmZZdXylkdCsbYORDzughxygt1-Ucma0j-qE,8287
|
|
18
18
|
airbyte_agent_mailchimp/_vendored/connector_sdk/utils.py,sha256=G4LUXOC2HzPoND2v4tQW68R9uuPX9NQyCjaGxb7Kpl0,1958
|
|
19
|
-
airbyte_agent_mailchimp/_vendored/connector_sdk/validation.py,sha256=
|
|
19
|
+
airbyte_agent_mailchimp/_vendored/connector_sdk/validation.py,sha256=4MPrxYmQh8TbCU0KdvvRKe35Lg1YYLEBd0u4aKySl_E,32122
|
|
20
20
|
airbyte_agent_mailchimp/_vendored/connector_sdk/cloud_utils/__init__.py,sha256=4799Hv9f2zxDVj1aLyQ8JpTEuFTp_oOZMRz-NZCdBJg,134
|
|
21
21
|
airbyte_agent_mailchimp/_vendored/connector_sdk/cloud_utils/client.py,sha256=YxdRpQr9XjDzih6csSseBVGn9kfMtaqbOCXP0TPuzFY,7189
|
|
22
22
|
airbyte_agent_mailchimp/_vendored/connector_sdk/executor/__init__.py,sha256=EmG9YQNAjSuYCVB4D5VoLm4qpD1KfeiiOf7bpALj8p8,702
|
|
23
23
|
airbyte_agent_mailchimp/_vendored/connector_sdk/executor/hosted_executor.py,sha256=ydHcG-biRS1ITT5ELwPShdJW-KYpvK--Fos1ipNgHho,6995
|
|
24
|
-
airbyte_agent_mailchimp/_vendored/connector_sdk/executor/local_executor.py,sha256=
|
|
24
|
+
airbyte_agent_mailchimp/_vendored/connector_sdk/executor/local_executor.py,sha256=oJDliuS7zU8GILJUjn7T_WNIu25sy5serJHxhnBKyB8,71411
|
|
25
25
|
airbyte_agent_mailchimp/_vendored/connector_sdk/executor/models.py,sha256=lYVT_bNcw-PoIks4WHNyl2VY-lJVf2FntzINSOBIheE,5845
|
|
26
26
|
airbyte_agent_mailchimp/_vendored/connector_sdk/http/__init__.py,sha256=y8fbzZn-3yV9OxtYz8Dy6FFGI5v6TOqADd1G3xHH3Hw,911
|
|
27
27
|
airbyte_agent_mailchimp/_vendored/connector_sdk/http/config.py,sha256=6J7YIIwHC6sRu9i-yKa5XvArwK2KU60rlnmxzDZq3lw,3283
|
|
@@ -31,8 +31,8 @@ airbyte_agent_mailchimp/_vendored/connector_sdk/http/response.py,sha256=Q-RyM5D0
|
|
|
31
31
|
airbyte_agent_mailchimp/_vendored/connector_sdk/http/adapters/__init__.py,sha256=gjbWdU4LfzUG2PETI0TkfkukdzoCAhpL6FZtIEnkO-s,209
|
|
32
32
|
airbyte_agent_mailchimp/_vendored/connector_sdk/http/adapters/httpx_adapter.py,sha256=dkYhzBWiKBmzWZlc-cRTx50Hb6fy3OI8kOQvXRfS1CQ,8465
|
|
33
33
|
airbyte_agent_mailchimp/_vendored/connector_sdk/logging/__init__.py,sha256=IZoE5yXhwSA0m3xQqh0FiCifjp1sB3S8jnnFPuJLYf8,227
|
|
34
|
-
airbyte_agent_mailchimp/_vendored/connector_sdk/logging/logger.py,sha256=
|
|
35
|
-
airbyte_agent_mailchimp/_vendored/connector_sdk/logging/types.py,sha256=
|
|
34
|
+
airbyte_agent_mailchimp/_vendored/connector_sdk/logging/logger.py,sha256=rUdKDEQe3pOODmBLEcvhgZeEZi48BvrgKXKq1xvCXu0,8387
|
|
35
|
+
airbyte_agent_mailchimp/_vendored/connector_sdk/logging/types.py,sha256=ONb9xKNXUkrR2lojSBMF7ruof7S2r92WjrO_kEZic84,3239
|
|
36
36
|
airbyte_agent_mailchimp/_vendored/connector_sdk/observability/__init__.py,sha256=ojx1n9vaWCXFFvb3-90Pwtg845trFdV2v6wcCoO75Ko,269
|
|
37
37
|
airbyte_agent_mailchimp/_vendored/connector_sdk/observability/config.py,sha256=uWvRAPHnEusVKviQQncqcpnHKNhoZ4ZoFK6nUOSVClY,5372
|
|
38
38
|
airbyte_agent_mailchimp/_vendored/connector_sdk/observability/models.py,sha256=IRGjlJia28_IU7BMSBb5RHWs47yAOLvE20JIIXHazLY,448
|
|
@@ -52,6 +52,6 @@ airbyte_agent_mailchimp/_vendored/connector_sdk/telemetry/__init__.py,sha256=RaL
|
|
|
52
52
|
airbyte_agent_mailchimp/_vendored/connector_sdk/telemetry/config.py,sha256=tLmQwAFD0kP1WyBGWBS3ysaudN9H3e-3EopKZi6cGKg,885
|
|
53
53
|
airbyte_agent_mailchimp/_vendored/connector_sdk/telemetry/events.py,sha256=8Y1NbXiwISX-V_wRofY7PqcwEXD0dLMnntKkY6XFU2s,1328
|
|
54
54
|
airbyte_agent_mailchimp/_vendored/connector_sdk/telemetry/tracker.py,sha256=Ftrk0_ddfM7dZG8hF9xBuPwhbc9D6JZ7Q9qs5o3LEyA,5579
|
|
55
|
-
airbyte_agent_mailchimp-0.1.
|
|
56
|
-
airbyte_agent_mailchimp-0.1.
|
|
57
|
-
airbyte_agent_mailchimp-0.1.
|
|
55
|
+
airbyte_agent_mailchimp-0.1.7.dist-info/METADATA,sha256=gXO0B8sR7ptnZ4UAUDj2UVxDVMYx21B662a9eTojbP8,4592
|
|
56
|
+
airbyte_agent_mailchimp-0.1.7.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
57
|
+
airbyte_agent_mailchimp-0.1.7.dist-info/RECORD,,
|
|
File without changes
|