airbyte-agent-slack 0.1.40__py3-none-any.whl → 0.1.41__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.
@@ -18,9 +18,9 @@ from .models import (
18
18
  ChannelPurpose,
19
19
  ChannelsListResponse,
20
20
  ChannelResponse,
21
+ File,
21
22
  Reaction,
22
23
  Attachment,
23
- File,
24
24
  Message,
25
25
  Thread,
26
26
  EditedInfo,
@@ -98,9 +98,9 @@ __all__ = [
98
98
  "ChannelPurpose",
99
99
  "ChannelsListResponse",
100
100
  "ChannelResponse",
101
+ "File",
101
102
  "Reaction",
102
103
  "Attachment",
103
- "File",
104
104
  "Message",
105
105
  "Thread",
106
106
  "EditedInfo",
@@ -10,7 +10,7 @@ from enum import StrEnum
10
10
  from typing import Any, Dict
11
11
  from uuid import UUID
12
12
 
13
- from pydantic import BaseModel, ConfigDict, Field, field_validator
13
+ from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
14
14
  from pydantic_core import Url
15
15
 
16
16
  from .extensions import CacheConfig, ReplicationConfig, RetryConfig
@@ -210,3 +210,34 @@ class Server(BaseModel):
210
210
  raise ValueError("Server URL cannot be empty")
211
211
  # Allow both absolute URLs and relative paths
212
212
  return v
213
+
214
+ @model_validator(mode="after")
215
+ def validate_replication_environment_mapping(self) -> "Server":
216
+ """Validate that x-airbyte-replication-environment-mapping sources exist in variables.
217
+
218
+ For simple mappings like {"subdomain": "subdomain"}, the key is the source variable.
219
+ For transform mappings like {"domain": {"source": "subdomain", "format": "..."}},
220
+ the "source" field is the source variable.
221
+ """
222
+ env_mapping = self.x_airbyte_replication_environment_mapping
223
+ if not env_mapping or not self.variables:
224
+ return self
225
+
226
+ variable_names = set(self.variables.keys())
227
+
228
+ for env_key, mapping_value in env_mapping.items():
229
+ if isinstance(mapping_value, str):
230
+ source_var = env_key
231
+ elif isinstance(mapping_value, EnvironmentMappingTransform):
232
+ source_var = mapping_value.source
233
+ else:
234
+ continue
235
+
236
+ if source_var not in variable_names:
237
+ available = ", ".join(sorted(variable_names)) if variable_names else "(none)"
238
+ raise ValueError(
239
+ f"x-airbyte-replication-environment-mapping: source variable '{source_var}' "
240
+ f"not found in server variables. Available: {available}"
241
+ )
242
+
243
+ return self
@@ -14,7 +14,7 @@ are implemented.
14
14
 
15
15
  from typing import Literal
16
16
 
17
- from pydantic import BaseModel, ConfigDict, Field
17
+ from pydantic import BaseModel, ConfigDict, Field, model_validator
18
18
 
19
19
 
20
20
  class PaginationConfig(BaseModel):
@@ -252,6 +252,24 @@ class ReplicationConfig(BaseModel):
252
252
  description="Mapping from replication_config field names to source_config field names",
253
253
  )
254
254
 
255
+ @model_validator(mode="after")
256
+ def validate_replication_config_key_mapping(self) -> "ReplicationConfig":
257
+ """Validate that replication_config_key_mapping keys exist in properties.
258
+
259
+ The mapping is: {local_key: airbyte_path}
260
+ We validate that local_key exists in our properties.
261
+ """
262
+ if self.replication_config_key_mapping and self.properties:
263
+ property_names = set(self.properties.keys())
264
+ for local_key, airbyte_path in self.replication_config_key_mapping.items():
265
+ if local_key not in property_names:
266
+ available = ", ".join(sorted(property_names)) if property_names else "(none)"
267
+ raise ValueError(
268
+ f"replication_config_key_mapping: local key '{local_key}' "
269
+ f"(mapped to '{airbyte_path}') not found in properties. Available: {available}"
270
+ )
271
+ return self
272
+
255
273
 
256
274
  class CacheConfig(BaseModel):
257
275
  """
@@ -81,6 +81,21 @@ class AuthConfigOption(BaseModel):
81
81
  description="Mapping from source config paths (e.g., 'credentials.api_key') to auth config keys for direct connectors",
82
82
  )
83
83
 
84
+ @model_validator(mode="after")
85
+ def validate_replication_auth_key_mapping(self) -> "AuthConfigOption":
86
+ """Validate that replication_auth_key_mapping target keys exist in properties."""
87
+ if self.replication_auth_key_mapping and self.properties:
88
+ property_names = set(self.properties.keys())
89
+ for airbyte_path, our_key in self.replication_auth_key_mapping.items():
90
+ if our_key not in property_names:
91
+ option_context = f"oneOf option '{self.title}'" if self.title else "oneOf option"
92
+ available = ", ".join(sorted(property_names)) if property_names else "(none)"
93
+ raise ValueError(
94
+ f"replication_auth_key_mapping in {option_context}: target key '{our_key}' "
95
+ f"(mapped from '{airbyte_path}') not found in properties. Available: {available}"
96
+ )
97
+ return self
98
+
84
99
 
85
100
  class AirbyteAuthConfig(BaseModel):
86
101
  """
@@ -146,8 +161,30 @@ class AirbyteAuthConfig(BaseModel):
146
161
  if not self.auth_mapping:
147
162
  raise ValueError("Single auth option must have auth_mapping")
148
163
 
164
+ # Validate replication_auth_key_mapping targets exist in properties
165
+ if self.replication_auth_key_mapping and self.properties:
166
+ self._validate_replication_auth_key_mapping(self.replication_auth_key_mapping, self.properties, context="x-airbyte-auth-config")
167
+
149
168
  return self
150
169
 
170
+ @staticmethod
171
+ def _validate_replication_auth_key_mapping(mapping: Dict[str, str], properties: Dict[str, AuthConfigFieldSpec], context: str) -> None:
172
+ """Validate that replication_auth_key_mapping target keys exist in properties.
173
+
174
+ Args:
175
+ mapping: The replication_auth_key_mapping dict (airbyte_path -> our_key)
176
+ properties: The properties dict from x-airbyte-auth-config
177
+ context: Context string for error messages
178
+ """
179
+ property_names = set(properties.keys())
180
+ for airbyte_path, our_key in mapping.items():
181
+ if our_key not in property_names:
182
+ available = ", ".join(sorted(property_names)) if property_names else "(none)"
183
+ raise ValueError(
184
+ f"replication_auth_key_mapping in {context}: target key '{our_key}' "
185
+ f"(mapped from '{airbyte_path}') not found in properties. Available: {available}"
186
+ )
187
+
151
188
 
152
189
  class SecurityScheme(BaseModel):
153
190
  """
@@ -190,6 +190,30 @@ class ChannelResponse(BaseModel):
190
190
  ok: Union[bool, Any] = Field(default=None)
191
191
  channel: Union[Channel, Any] = Field(default=None)
192
192
 
193
+ class File(BaseModel):
194
+ """File object"""
195
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
196
+
197
+ id: Union[str | None, Any] = Field(default=None)
198
+ name: Union[str | None, Any] = Field(default=None)
199
+ title: Union[str | None, Any] = Field(default=None)
200
+ mimetype: Union[str | None, Any] = Field(default=None)
201
+ filetype: Union[str | None, Any] = Field(default=None)
202
+ pretty_type: Union[str | None, Any] = Field(default=None)
203
+ user: Union[str | None, Any] = Field(default=None)
204
+ size: Union[int | None, Any] = Field(default=None)
205
+ mode: Union[str | None, Any] = Field(default=None)
206
+ is_external: Union[bool | None, Any] = Field(default=None)
207
+ external_type: Union[str | None, Any] = Field(default=None)
208
+ is_public: Union[bool | None, Any] = Field(default=None)
209
+ public_url_shared: Union[bool | None, Any] = Field(default=None)
210
+ url_private: Union[str | None, Any] = Field(default=None)
211
+ url_private_download: Union[str | None, Any] = Field(default=None)
212
+ permalink: Union[str | None, Any] = Field(default=None)
213
+ permalink_public: Union[str | None, Any] = Field(default=None)
214
+ created: Union[int | None, Any] = Field(default=None)
215
+ timestamp: Union[int | None, Any] = Field(default=None)
216
+
193
217
  class Reaction(BaseModel):
194
218
  """Message reaction"""
195
219
  model_config = ConfigDict(extra="allow", populate_by_name=True)
@@ -219,30 +243,6 @@ class Attachment(BaseModel):
219
243
  footer_icon: Union[str | None, Any] = Field(default=None)
220
244
  ts: Union[Any, Any] = Field(default=None)
221
245
 
222
- class File(BaseModel):
223
- """File object"""
224
- model_config = ConfigDict(extra="allow", populate_by_name=True)
225
-
226
- id: Union[str | None, Any] = Field(default=None)
227
- name: Union[str | None, Any] = Field(default=None)
228
- title: Union[str | None, Any] = Field(default=None)
229
- mimetype: Union[str | None, Any] = Field(default=None)
230
- filetype: Union[str | None, Any] = Field(default=None)
231
- pretty_type: Union[str | None, Any] = Field(default=None)
232
- user: Union[str | None, Any] = Field(default=None)
233
- size: Union[int | None, Any] = Field(default=None)
234
- mode: Union[str | None, Any] = Field(default=None)
235
- is_external: Union[bool | None, Any] = Field(default=None)
236
- external_type: Union[str | None, Any] = Field(default=None)
237
- is_public: Union[bool | None, Any] = Field(default=None)
238
- public_url_shared: Union[bool | None, Any] = Field(default=None)
239
- url_private: Union[str | None, Any] = Field(default=None)
240
- url_private_download: Union[str | None, Any] = Field(default=None)
241
- permalink: Union[str | None, Any] = Field(default=None)
242
- permalink_public: Union[str | None, Any] = Field(default=None)
243
- created: Union[int | None, Any] = Field(default=None)
244
- timestamp: Union[int | None, Any] = Field(default=None)
245
-
246
246
  class Message(BaseModel):
247
247
  """Slack message object"""
248
248
  model_config = ConfigDict(extra="allow", populate_by_name=True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: airbyte-agent-slack
3
- Version: 0.1.40
3
+ Version: 0.1.41
4
4
  Summary: Airbyte Slack 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/
@@ -158,7 +158,7 @@ See the official [Slack API reference](https://api.slack.com/methods).
158
158
 
159
159
  ## Version information
160
160
 
161
- - **Package version:** 0.1.40
161
+ - **Package version:** 0.1.41
162
162
  - **Connector version:** 0.1.12
163
- - **Generated with Connector SDK commit SHA:** 9d9866b0aae8c3494d04d34e193b9bd860bfc1c6
163
+ - **Generated with Connector SDK commit SHA:** 940246757c7476ed4edd7d16b873ebe54ea2b456
164
164
  - **Changelog:** [View changelog](https://github.com/airbytehq/airbyte-agent-connectors/blob/main/connectors/slack/CHANGELOG.md)
@@ -1,7 +1,7 @@
1
- airbyte_agent_slack/__init__.py,sha256=gJS52JC97BmPpgjF1WcbI4HNDioHJcnlGRVDYVpBFe8,3807
1
+ airbyte_agent_slack/__init__.py,sha256=QiHB--d_1YeJh66NUumjFDnffDjwfKvksgKilPvzC78,3807
2
2
  airbyte_agent_slack/connector.py,sha256=BFcKp3buXgo6Sh-DOu5lBGYmnTqF3R4Rz6SE1G2l2io,49392
3
3
  airbyte_agent_slack/connector_model.py,sha256=W8DFMX20VxPr2IxTzEIjYcYNSt-E0JNj1b5UizuaWV0,194577
4
- airbyte_agent_slack/models.py,sha256=1CANLg66D2QD5TkK06mbYGLkQyv9WpZmeN0QBGaLX_0,30019
4
+ airbyte_agent_slack/models.py,sha256=Lndn_Ryb-hb-OUj_JzRcfja_YTkiw9Cxm14q08cuJxM,30019
5
5
  airbyte_agent_slack/types.py,sha256=QDLOYuH23w4H_5fxVjTcBBz6BMYm2PWbuM1K_EOcD4o,32154
6
6
  airbyte_agent_slack/_vendored/__init__.py,sha256=ILl7AHXMui__swyrjxrh9yRa4dLiwBvV6axPWFWty80,38
7
7
  airbyte_agent_slack/_vendored/connector_sdk/__init__.py,sha256=T5o7roU6NSpH-lCAGZ338sE5dlh4ZU6i6IkeG1zpems,1949
@@ -43,16 +43,16 @@ airbyte_agent_slack/_vendored/connector_sdk/performance/__init__.py,sha256=Sp5fS
43
43
  airbyte_agent_slack/_vendored/connector_sdk/performance/instrumentation.py,sha256=_dXvNiqdndIBwDjeDKNViWzn_M5FkSUsMmJtFldrmsM,1504
44
44
  airbyte_agent_slack/_vendored/connector_sdk/performance/metrics.py,sha256=FRff7dKt4iwt_A7pxV5n9kAGBR756PC7q8-weWygPSM,2817
45
45
  airbyte_agent_slack/_vendored/connector_sdk/schema/__init__.py,sha256=Uymu-QuzGJuMxexBagIvUxpVAigIuIhz3KeBl_Vu4Ko,1638
46
- airbyte_agent_slack/_vendored/connector_sdk/schema/base.py,sha256=mOO5eZSK-FB7S-ZXpt5HFG5YBg8x-oM6RZRLPOEGxZM,7115
46
+ airbyte_agent_slack/_vendored/connector_sdk/schema/base.py,sha256=0R0aR4HjcJpu3vN0jZ4nPBEwVZ_7J9_XLQgWaQGT3Fs,8476
47
47
  airbyte_agent_slack/_vendored/connector_sdk/schema/components.py,sha256=nJIPieavwX3o3ODvdtLHPk84d_V229xmg6LDfwEHjzc,8119
48
48
  airbyte_agent_slack/_vendored/connector_sdk/schema/connector.py,sha256=mSZk1wr2YSdRj9tTRsPAuIlCzd_xZLw-Bzl1sMwE0rE,3731
49
- airbyte_agent_slack/_vendored/connector_sdk/schema/extensions.py,sha256=5hgpFHK7fzpzegCkJk882DeIP79bCx_qairKJhvPMZ8,9590
49
+ airbyte_agent_slack/_vendored/connector_sdk/schema/extensions.py,sha256=DqWCvyWKLnPxAbJirq6uITf-MBeJRVCcsEjySF4fuhQ,10558
50
50
  airbyte_agent_slack/_vendored/connector_sdk/schema/operations.py,sha256=St-A75m6sZUZlsoM6WcoPaShYu_X1K19pdyPvJbabOE,6214
51
- airbyte_agent_slack/_vendored/connector_sdk/schema/security.py,sha256=R-21DLnp-ANIRO1Dzqo53TYFJL6lCp0aO8GSuxa_bDI,9225
51
+ airbyte_agent_slack/_vendored/connector_sdk/schema/security.py,sha256=5UeaN63InuInS_XHNZSm5yDXrMLm5lhz298l-3GSc_4,11435
52
52
  airbyte_agent_slack/_vendored/connector_sdk/telemetry/__init__.py,sha256=RaLgkBU4dfxn1LC5Y0Q9rr2PJbrwjxvPgBLmq8_WafE,211
53
53
  airbyte_agent_slack/_vendored/connector_sdk/telemetry/config.py,sha256=tLmQwAFD0kP1WyBGWBS3ysaudN9H3e-3EopKZi6cGKg,885
54
54
  airbyte_agent_slack/_vendored/connector_sdk/telemetry/events.py,sha256=8Y1NbXiwISX-V_wRofY7PqcwEXD0dLMnntKkY6XFU2s,1328
55
55
  airbyte_agent_slack/_vendored/connector_sdk/telemetry/tracker.py,sha256=SginFQbHqVUVYG82NnNzG34O-tAQ_wZYjGDcuo0q4Kk,5584
56
- airbyte_agent_slack-0.1.40.dist-info/METADATA,sha256=deKG1jZg_tccxVlEvidcw4Bgbntux6UDOhLTdM1jFdk,6597
57
- airbyte_agent_slack-0.1.40.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
58
- airbyte_agent_slack-0.1.40.dist-info/RECORD,,
56
+ airbyte_agent_slack-0.1.41.dist-info/METADATA,sha256=co9r5Bvkw_eBDRwHvV9t-PC8oHlKr1QlGxSeHygLFXk,6597
57
+ airbyte_agent_slack-0.1.41.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
58
+ airbyte_agent_slack-0.1.41.dist-info/RECORD,,