Metadata-Version: 2.4
Name: vendor-fabric
Version: 2.1.3
Summary: Extended Data-native vendor connectors and sync capabilities
Project-URL: Documentation, https://jonbogaty.com/vendor-fabric/
Project-URL: Issues, https://github.com/jbcom/vendor-fabric/issues
Project-URL: Source, https://github.com/jbcom/vendor-fabric
Project-URL: Changelog, https://github.com/jbcom/vendor-fabric/blob/main/packages/vendor-fabric/CHANGELOG.md
Author-email: Jon Bogaty <jon@jonbogaty.com>
Maintainer-email: Jon Bogaty <jon@jonbogaty.com>
License: MIT
Keywords: aws,connectors,gcp,github,meshy,secrets,slack,vault,zoom
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Typing :: Typed
Requires-Python: >=3.11
Requires-Dist: extended-data<9.0.0,>=8.4.0
Requires-Dist: httpx>=0.28.1
Requires-Dist: more-itertools>=11.0.2
Requires-Dist: pydantic<3.0.0,>=2.13.4
Requires-Dist: pyyaml>=6.0.3
Requires-Dist: requests>=2.33.1
Requires-Dist: tenacity<10.0.0,>=8.4.1
Provides-Extra: all
Requires-Dist: anthropic>=0.96.0; extra == 'all'
Requires-Dist: boto3>=1.42.92; extra == 'all'
Requires-Dist: fastapi>=0.136.0; extra == 'all'
Requires-Dist: filelock>=3.29.0; extra == 'all'
Requires-Dist: google-api-python-client>=2.194.0; extra == 'all'
Requires-Dist: google-cloud-billing>=1.19.0; extra == 'all'
Requires-Dist: google-cloud-resource-manager>=1.17.0; extra == 'all'
Requires-Dist: hvac>=2.4.0; extra == 'all'
Requires-Dist: numpy>=2.2.6; extra == 'all'
Requires-Dist: pygithub>=2.9.1; extra == 'all'
Requires-Dist: pyngrok>=8.0.0; extra == 'all'
Requires-Dist: python-graphql-client>=0.4.3; extra == 'all'
Requires-Dist: rich<16.0.0,>=13.7.0; extra == 'all'
Requires-Dist: slack-sdk>=3.41.0; extra == 'all'
Requires-Dist: sqlite-vec>=0.1.9; extra == 'all'
Requires-Dist: starlette>=1.3.1; extra == 'all'
Requires-Dist: uvicorn>=0.45.0; extra == 'all'
Requires-Dist: validators>=0.35.0; extra == 'all'
Provides-Extra: anthropic
Requires-Dist: anthropic>=0.96.0; extra == 'anthropic'
Provides-Extra: aws
Requires-Dist: boto3>=1.42.92; extra == 'aws'
Provides-Extra: cursor
Provides-Extra: dev
Requires-Dist: coverage[toml]>=7.6.0; extra == 'dev'
Requires-Dist: hypothesis>=6.100.2; extra == 'dev'
Requires-Dist: mypy>=1.20.1; extra == 'dev'
Requires-Dist: pytest-asyncio>=1.3.0; extra == 'dev'
Requires-Dist: pytest-cov>=7.1.0; extra == 'dev'
Requires-Dist: pytest-mock>=3.15.1; extra == 'dev'
Requires-Dist: pytest-timeout>=2.4.0; extra == 'dev'
Requires-Dist: pytest-xdist>=3.6.1; extra == 'dev'
Requires-Dist: pytest>=9.0.3; extra == 'dev'
Requires-Dist: ruff>=0.8.0; extra == 'dev'
Requires-Dist: types-pyyaml>=6.0.12.20240724; extra == 'dev'
Requires-Dist: types-requests>=2.33.0.20260408; extra == 'dev'
Provides-Extra: docs
Requires-Dist: furo>=2025.12.19; extra == 'docs'
Requires-Dist: myst-parser<6.0.0,>=4.0.1; extra == 'docs'
Requires-Dist: sphinx-autodoc2>=0.5.0; extra == 'docs'
Requires-Dist: sphinx-copybutton>=0.5.2; extra == 'docs'
Requires-Dist: sphinx<10.0.0,>=8.2.3; extra == 'docs'
Provides-Extra: github
Requires-Dist: pygithub>=2.9.1; extra == 'github'
Requires-Dist: python-graphql-client>=0.4.3; extra == 'github'
Provides-Extra: google
Requires-Dist: google-api-python-client>=2.194.0; extra == 'google'
Requires-Dist: google-cloud-billing>=1.19.0; extra == 'google'
Requires-Dist: google-cloud-resource-manager>=1.17.0; extra == 'google'
Provides-Extra: meshy
Requires-Dist: filelock>=3.29.0; extra == 'meshy'
Requires-Dist: numpy>=2.2.6; extra == 'meshy'
Requires-Dist: rich<16.0.0,>=13.7.0; extra == 'meshy'
Requires-Dist: validators>=0.35.0; extra == 'meshy'
Provides-Extra: secrets-sync
Requires-Dist: boto3>=1.42.92; extra == 'secrets-sync'
Requires-Dist: hvac>=2.4.0; extra == 'secrets-sync'
Provides-Extra: slack
Requires-Dist: slack-sdk>=3.41.0; extra == 'slack'
Provides-Extra: tests
Requires-Dist: coverage[toml]>=7.6.0; extra == 'tests'
Requires-Dist: hypothesis>=6.100.2; extra == 'tests'
Requires-Dist: pytest-asyncio>=1.3.0; extra == 'tests'
Requires-Dist: pytest-cov>=7.1.0; extra == 'tests'
Requires-Dist: pytest-mock>=3.15.1; extra == 'tests'
Requires-Dist: pytest-timeout>=2.4.0; extra == 'tests'
Requires-Dist: pytest-xdist>=3.6.1; extra == 'tests'
Requires-Dist: pytest>=9.0.3; extra == 'tests'
Provides-Extra: typing
Requires-Dist: mypy>=1.20.1; extra == 'typing'
Requires-Dist: types-pyyaml>=6.0.12.20240724; extra == 'typing'
Requires-Dist: types-requests>=2.33.0.20260408; extra == 'typing'
Provides-Extra: vault
Requires-Dist: hvac>=2.4.0; extra == 'vault'
Provides-Extra: vector
Requires-Dist: sqlite-vec>=0.1.9; extra == 'vector'
Provides-Extra: webhooks
Requires-Dist: fastapi>=0.136.0; extra == 'webhooks'
Requires-Dist: pyngrok>=8.0.0; extra == 'webhooks'
Requires-Dist: starlette>=1.3.1; extra == 'webhooks'
Requires-Dist: uvicorn>=0.45.0; extra == 'webhooks'
Provides-Extra: zoom
Description-Content-Type: text/markdown

# Vendor Fabric

`vendor-fabric` is the optional vendor integration layer for the
Extended Data Python stack. It depends on `extended-data>=8.4.0` for the
polymorphic `ExtendedData` root, concrete containers, local file sync, inputs,
logging, and workflow utilities, then adds
adapter-registered API clients and vendor-backed sync capabilities.

Documentation: [jonbogaty.com/vendor-fabric](https://jonbogaty.com/vendor-fabric/)

```bash
pip install vendor-fabric
pip install "vendor-fabric[github,slack]"
pip install "vendor-fabric[aws,google,vault,secrets-sync]"
pip install secrets-sync-python-binding
pip install pytest-vendor-fabric
```

The base install keeps vendor SDKs out of the environment. Connector metadata
is available even when an optional SDK is absent:

```python
from vendor_fabric import get_connector_info, list_connector_info

print(get_connector_info("github")["available"])
print(list_connector_info(include_unavailable=True))
```

Construct connectors through the registry or `ConnectorFabric`:

```python
from vendor_fabric import ConnectorFabric

fabric = ConnectorFabric(inputs={"GITHUB_TOKEN": "..."})
github = fabric.get_connector("github")
```

Unavailable features report install guidance instead of requiring callers to
wrap their own imports.

SecretSync access is exposed through a binding-backed facade:

```python
from vendor_fabric.secrets_sync import ProviderSession, SyncOptions, get_targets, run_pipeline

result = run_pipeline("pipeline.yaml", SyncOptions(dry_run=True))
targets = get_targets("pipeline.yaml")

print(result["success"])
print(targets["targets"])

session = ProviderSession(
    vault_address="https://vault.example.com",
    vault_token=vault_token,
    aws_region="us-east-1",
    aws_access_key_id=aws_credentials.access_key,
    aws_secret_access_key=aws_credentials.secret_key,
    aws_session_token=aws_credentials.token,
)
run_pipeline("pipeline.yaml", SyncOptions(dry_run=True), provider_session=session)
```

`vendor-fabric` consumes the `secrets_sync` import from
`secrets-sync-python-binding` and shapes those payloads into Extended Data
values. The canonical SecretSync runtime, CLI, pipeline semantics, and gopy
binding source live in `jbcom/secrets-sync`.

Connector and sync payloads are `ExtendedData` values at the boundary. Dict,
list, string, tuple, and set payloads are concrete extended subclasses, so code
can use normal container operations and extended-data methods without import
juggling.

Testing support lives in the separately published `pytest-vendor-fabric`
package. It provides connector fixtures, E2E controls, and credential guards
without forcing test-only dependencies into the runtime package.
