interloper-toolkit 0.110.2__tar.gz → 0.113.0__tar.gz

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 (18) hide show
  1. {interloper_toolkit-0.110.2 → interloper_toolkit-0.113.0}/PKG-INFO +1 -1
  2. {interloper_toolkit-0.110.2 → interloper_toolkit-0.113.0}/pyproject.toml +1 -1
  3. {interloper_toolkit-0.110.2 → interloper_toolkit-0.113.0}/pyproject.toml.orig +1 -1
  4. {interloper_toolkit-0.110.2 → interloper_toolkit-0.113.0}/src/interloper_toolkit/catalog.py +19 -17
  5. {interloper_toolkit-0.110.2 → interloper_toolkit-0.113.0}/src/interloper_toolkit/collection.py +5 -15
  6. {interloper_toolkit-0.110.2 → interloper_toolkit-0.113.0}/src/interloper_toolkit/sources.py +4 -3
  7. {interloper_toolkit-0.110.2 → interloper_toolkit-0.113.0}/src/interloper_toolkit/utils.py +0 -1
  8. {interloper_toolkit-0.110.2 → interloper_toolkit-0.113.0}/README.md +0 -0
  9. {interloper_toolkit-0.110.2 → interloper_toolkit-0.113.0}/src/interloper_toolkit/__init__.py +0 -0
  10. {interloper_toolkit-0.110.2 → interloper_toolkit-0.113.0}/src/interloper_toolkit/analytics.py +0 -0
  11. {interloper_toolkit-0.110.2 → interloper_toolkit-0.113.0}/src/interloper_toolkit/authz.py +0 -0
  12. {interloper_toolkit-0.110.2 → interloper_toolkit-0.113.0}/src/interloper_toolkit/context.py +0 -0
  13. {interloper_toolkit-0.110.2 → interloper_toolkit-0.113.0}/src/interloper_toolkit/jobs.py +0 -0
  14. {interloper_toolkit-0.110.2 → interloper_toolkit-0.113.0}/src/interloper_toolkit/lineage.py +0 -0
  15. {interloper_toolkit-0.110.2 → interloper_toolkit-0.113.0}/src/interloper_toolkit/models.py +0 -0
  16. {interloper_toolkit-0.110.2 → interloper_toolkit-0.113.0}/src/interloper_toolkit/scheduling.py +0 -0
  17. {interloper_toolkit-0.110.2 → interloper_toolkit-0.113.0}/src/interloper_toolkit/stats.py +0 -0
  18. {interloper_toolkit-0.110.2 → interloper_toolkit-0.113.0}/src/interloper_toolkit/tools.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: interloper-toolkit
3
- Version: 0.110.2
3
+ Version: 0.113.0
4
4
  Summary: Interloper tool functions shared by the AI surfaces (agent, MCP)
5
5
  Author: Guillaume Onfroy
6
6
  Author-email: Guillaume Onfroy <guillaume@digitlcloud.com>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "interloper-toolkit"
3
- version = "0.110.2"
3
+ version = "0.113.0"
4
4
  description = "Interloper tool functions shared by the AI surfaces (agent, MCP)"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -3,7 +3,7 @@
3
3
  # ###############
4
4
  [project]
5
5
  name = "interloper-toolkit"
6
- version = "0.110.2"
6
+ version = "0.113.0"
7
7
  description = "Interloper tool functions shared by the AI surfaces (agent, MCP)"
8
8
  readme = "README.md"
9
9
  authors = [{ name = "Guillaume Onfroy", email = "guillaume@digitlcloud.com" }]
@@ -50,9 +50,7 @@ def _inline_refs(node: Any, defs: dict[str, Any] | None = None, _stack: frozense
50
50
  return {k: _inline_refs(v, defs, _stack) for k, v in node.items() if k not in ("$defs", "$ref")}
51
51
 
52
52
 
53
- def list_definitions(
54
- ctx: ToolkitContext, kind: str | None = None
55
- ) -> DefinitionCounts | DefinitionList | ToolError:
53
+ def list_definitions(ctx: ToolkitContext, kind: str | None = None) -> DefinitionCounts | DefinitionList | ToolError:
56
54
  """List the component definitions available in the catalog.
57
55
 
58
56
  This answers "what does Interloper support / what could we add?" — the
@@ -214,14 +212,16 @@ def search_fields(ctx: ToolkitContext, query: str, limit: int = 50, offset: int
214
212
  for field_name, field_info in schema["properties"].items():
215
213
  field_desc = field_info.get("description", "")
216
214
  if query_lower in field_name.lower() or query_lower in field_desc.lower():
217
- matches.append(FieldMatch(
218
- source_key=source_key,
219
- asset_key=asset_key,
220
- qualified_key=f"{source_key}.{asset_key}",
221
- field_name=field_name,
222
- field_type=_extract_type(field_info),
223
- description=field_desc,
224
- ))
215
+ matches.append(
216
+ FieldMatch(
217
+ source_key=source_key,
218
+ asset_key=asset_key,
219
+ qualified_key=f"{source_key}.{asset_key}",
220
+ field_name=field_name,
221
+ field_type=_extract_type(field_info),
222
+ description=field_desc,
223
+ )
224
+ )
225
225
 
226
226
  page = matches[offset : offset + limit]
227
227
  return FieldSearchResult(query=query, match_count=len(page), total=len(matches), matches=page)
@@ -266,12 +266,14 @@ def compare_schemas(
266
266
  for field in sorted(shared):
267
267
  type_a = _extract_type(schema_a[field])
268
268
  type_b = _extract_type(schema_b[field])
269
- shared_details.append(SharedField(
270
- field=field,
271
- type_a=type_a,
272
- type_b=type_b,
273
- type_match=type_a == type_b,
274
- ))
269
+ shared_details.append(
270
+ SharedField(
271
+ field=field,
272
+ type_a=type_a,
273
+ type_b=type_b,
274
+ type_match=type_a == type_b,
275
+ )
276
+ )
275
277
 
276
278
  return SchemaComparison(
277
279
  asset_a=f"{source_key_a}.{asset_key_a}",
@@ -19,20 +19,12 @@ from uuid import UUID
19
19
 
20
20
  import httpx2
21
21
  from interloper.component import KINDS
22
- from interloper.connection.base import Connection
23
- from interloper.errors import (
24
- CatalogKeyError,
25
- ComponentDriftError,
26
- ConfigError,
27
- ConnectionCheckError,
28
- HydrationError,
29
- InUseError,
30
- NotFoundError,
31
- )
22
+ from interloper.connection import Connection
23
+ from interloper.errors import CatalogKeyError, ConfigError, ConnectionCheckError
32
24
  from interloper.oauth import OAuthAppCredentials
33
25
  from interloper.settings import AppSettings
34
- from interloper.utils.concurrency import invoke
35
- from interloper_db import ComponentQuery
26
+ from interloper.utils import invoke
27
+ from interloper_db import ComponentDriftError, ComponentQuery, HydrationError, InUseError, NotFoundError
36
28
  from pydantic import ValidationError
37
29
 
38
30
  from interloper_toolkit.authz import requires_role
@@ -455,9 +447,7 @@ async def check_connection(ctx: ToolkitContext, connection_id: str) -> Connectio
455
447
  # Never forward the wrapped message: pydantic errors embed input
456
448
  # values, which for connections may be secrets — name fields only.
457
449
  if isinstance(e.__cause__, ValidationError):
458
- fields = ", ".join(
459
- ".".join(str(loc) for loc in err["loc"]) or "(root)" for err in e.__cause__.errors()
460
- )
450
+ fields = ", ".join(".".join(str(loc) for loc in err["loc"]) or "(root)" for err in e.__cause__.errors())
461
451
  message = f"The stored config is no longer valid for this connection type (invalid fields: {fields})."
462
452
  else:
463
453
  message = "The stored connection could not be reconstructed."
@@ -13,9 +13,10 @@ import logging
13
13
  from typing import Any
14
14
  from uuid import UUID
15
15
 
16
- from interloper.errors import CatalogKeyError, ComponentDriftError, ConfigError, HydrationError
17
- from interloper.resource.fields import is_fetch_field_provider
18
- from interloper.utils.concurrency import invoke
16
+ from interloper.errors import CatalogKeyError, ConfigError
17
+ from interloper.resource import is_fetch_field_provider
18
+ from interloper.utils import invoke
19
+ from interloper_db import ComponentDriftError, HydrationError
19
20
 
20
21
  from interloper_toolkit.authz import requires_role
21
22
  from interloper_toolkit.context import ToolkitContext
@@ -20,4 +20,3 @@ def clip(text: str | None, limit: int, *, tail: bool = False) -> str | None:
20
20
  return text
21
21
  marker = f"…[+{len(text) - limit} chars]"
22
22
  return marker + text[-limit:] if tail else text[:limit] + marker
23
-