vendor-fabric 2.1.3__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 (149) hide show
  1. vendor_fabric-2.1.3/.gitignore +15 -0
  2. vendor_fabric-2.1.3/CHANGELOG.md +33 -0
  3. vendor_fabric-2.1.3/PKG-INFO +189 -0
  4. vendor_fabric-2.1.3/README.md +75 -0
  5. vendor_fabric-2.1.3/examples/README.md +69 -0
  6. vendor_fabric-2.1.3/examples/basic_aws.py +71 -0
  7. vendor_fabric-2.1.3/examples/basic_google.py +72 -0
  8. vendor_fabric-2.1.3/examples/basic_meshy.py +73 -0
  9. vendor_fabric-2.1.3/pyproject.toml +231 -0
  10. vendor_fabric-2.1.3/src/vendor_fabric/__init__.py +147 -0
  11. vendor_fabric-2.1.3/src/vendor_fabric/_optional.py +257 -0
  12. vendor_fabric-2.1.3/src/vendor_fabric/anthropic/__init__.py +543 -0
  13. vendor_fabric-2.1.3/src/vendor_fabric/anthropic/tools.py +111 -0
  14. vendor_fabric-2.1.3/src/vendor_fabric/aws/__init__.py +641 -0
  15. vendor_fabric-2.1.3/src/vendor_fabric/aws/_diagnostics.py +44 -0
  16. vendor_fabric-2.1.3/src/vendor_fabric/aws/codedeploy.py +394 -0
  17. vendor_fabric-2.1.3/src/vendor_fabric/aws/organizations.py +796 -0
  18. vendor_fabric-2.1.3/src/vendor_fabric/aws/s3.py +785 -0
  19. vendor_fabric-2.1.3/src/vendor_fabric/aws/sso.py +857 -0
  20. vendor_fabric-2.1.3/src/vendor_fabric/aws/tools.py +342 -0
  21. vendor_fabric-2.1.3/src/vendor_fabric/base.py +620 -0
  22. vendor_fabric-2.1.3/src/vendor_fabric/capabilities.py +115 -0
  23. vendor_fabric-2.1.3/src/vendor_fabric/cli.py +338 -0
  24. vendor_fabric-2.1.3/src/vendor_fabric/cloud_params.py +129 -0
  25. vendor_fabric-2.1.3/src/vendor_fabric/connectors.py +489 -0
  26. vendor_fabric-2.1.3/src/vendor_fabric/cursor/__init__.py +721 -0
  27. vendor_fabric-2.1.3/src/vendor_fabric/cursor/tools.py +124 -0
  28. vendor_fabric-2.1.3/src/vendor_fabric/github/__init__.py +1066 -0
  29. vendor_fabric-2.1.3/src/vendor_fabric/github/_diagnostics.py +33 -0
  30. vendor_fabric-2.1.3/src/vendor_fabric/github/tools.py +314 -0
  31. vendor_fabric-2.1.3/src/vendor_fabric/google/__init__.py +609 -0
  32. vendor_fabric-2.1.3/src/vendor_fabric/google/_diagnostics.py +33 -0
  33. vendor_fabric-2.1.3/src/vendor_fabric/google/billing.py +400 -0
  34. vendor_fabric-2.1.3/src/vendor_fabric/google/cloud.py +544 -0
  35. vendor_fabric-2.1.3/src/vendor_fabric/google/constants.py +111 -0
  36. vendor_fabric-2.1.3/src/vendor_fabric/google/jules.py +439 -0
  37. vendor_fabric-2.1.3/src/vendor_fabric/google/services.py +891 -0
  38. vendor_fabric-2.1.3/src/vendor_fabric/google/tools.py +348 -0
  39. vendor_fabric-2.1.3/src/vendor_fabric/google/workspace.py +664 -0
  40. vendor_fabric-2.1.3/src/vendor_fabric/meshy/README.md +109 -0
  41. vendor_fabric-2.1.3/src/vendor_fabric/meshy/__init__.py +49 -0
  42. vendor_fabric-2.1.3/src/vendor_fabric/meshy/animate.py +93 -0
  43. vendor_fabric-2.1.3/src/vendor_fabric/meshy/animations.py +4895 -0
  44. vendor_fabric-2.1.3/src/vendor_fabric/meshy/base.py +238 -0
  45. vendor_fabric-2.1.3/src/vendor_fabric/meshy/connector.py +92 -0
  46. vendor_fabric-2.1.3/src/vendor_fabric/meshy/image3d.py +114 -0
  47. vendor_fabric-2.1.3/src/vendor_fabric/meshy/jobs.py +193 -0
  48. vendor_fabric-2.1.3/src/vendor_fabric/meshy/logging.py +47 -0
  49. vendor_fabric-2.1.3/src/vendor_fabric/meshy/models.py +304 -0
  50. vendor_fabric-2.1.3/src/vendor_fabric/meshy/persistence/__init__.py +51 -0
  51. vendor_fabric-2.1.3/src/vendor_fabric/meshy/persistence/repository.py +361 -0
  52. vendor_fabric-2.1.3/src/vendor_fabric/meshy/persistence/schemas.py +97 -0
  53. vendor_fabric-2.1.3/src/vendor_fabric/meshy/persistence/utils.py +35 -0
  54. vendor_fabric-2.1.3/src/vendor_fabric/meshy/persistence/vector_store.py +593 -0
  55. vendor_fabric-2.1.3/src/vendor_fabric/meshy/retexture.py +123 -0
  56. vendor_fabric-2.1.3/src/vendor_fabric/meshy/rigging.py +114 -0
  57. vendor_fabric-2.1.3/src/vendor_fabric/meshy/text3d.py +107 -0
  58. vendor_fabric-2.1.3/src/vendor_fabric/meshy/tools.py +578 -0
  59. vendor_fabric-2.1.3/src/vendor_fabric/meshy/webhooks/__init__.py +9 -0
  60. vendor_fabric-2.1.3/src/vendor_fabric/meshy/webhooks/handler.py +219 -0
  61. vendor_fabric-2.1.3/src/vendor_fabric/meshy/webhooks/schemas.py +147 -0
  62. vendor_fabric-2.1.3/src/vendor_fabric/py.typed +0 -0
  63. vendor_fabric-2.1.3/src/vendor_fabric/registry.py +699 -0
  64. vendor_fabric-2.1.3/src/vendor_fabric/secrets_sync/__init__.py +79 -0
  65. vendor_fabric-2.1.3/src/vendor_fabric/secrets_sync/__main__.py +7 -0
  66. vendor_fabric-2.1.3/src/vendor_fabric/secrets_sync/_binding.py +350 -0
  67. vendor_fabric-2.1.3/src/vendor_fabric/secrets_sync/bundles.py +21 -0
  68. vendor_fabric-2.1.3/src/vendor_fabric/secrets_sync/cli.py +93 -0
  69. vendor_fabric-2.1.3/src/vendor_fabric/secrets_sync/deepmerge.py +47 -0
  70. vendor_fabric-2.1.3/src/vendor_fabric/secrets_sync/files.py +120 -0
  71. vendor_fabric-2.1.3/src/vendor_fabric/secrets_sync/graph.py +129 -0
  72. vendor_fabric-2.1.3/src/vendor_fabric/secrets_sync/models.py +703 -0
  73. vendor_fabric-2.1.3/src/vendor_fabric/secrets_sync/pipeline.py +429 -0
  74. vendor_fabric-2.1.3/src/vendor_fabric/secrets_sync/stores.py +293 -0
  75. vendor_fabric-2.1.3/src/vendor_fabric/secrets_sync/tools.py +280 -0
  76. vendor_fabric-2.1.3/src/vendor_fabric/slack/__init__.py +584 -0
  77. vendor_fabric-2.1.3/src/vendor_fabric/slack/tools.py +296 -0
  78. vendor_fabric-2.1.3/src/vendor_fabric/surface.py +70 -0
  79. vendor_fabric-2.1.3/src/vendor_fabric/vault/__init__.py +579 -0
  80. vendor_fabric-2.1.3/src/vendor_fabric/vault/tools.py +128 -0
  81. vendor_fabric-2.1.3/src/vendor_fabric/vendor_data.py +405 -0
  82. vendor_fabric-2.1.3/src/vendor_fabric/zoom/__init__.py +287 -0
  83. vendor_fabric-2.1.3/src/vendor_fabric/zoom/tools.py +162 -0
  84. vendor_fabric-2.1.3/tests/conftest.py +6 -0
  85. vendor_fabric-2.1.3/tests/e2e/conftest.py +21 -0
  86. vendor_fabric-2.1.3/tests/e2e/meshy/test_meshy_provider.py +28 -0
  87. vendor_fabric-2.1.3/tests/meshy/conftest.py +175 -0
  88. vendor_fabric-2.1.3/tests/meshy/test_animations.py +61 -0
  89. vendor_fabric-2.1.3/tests/meshy/test_connector.py +105 -0
  90. vendor_fabric-2.1.3/tests/meshy/test_jobs.py +341 -0
  91. vendor_fabric-2.1.3/tests/meshy/test_meshy_base.py +241 -0
  92. vendor_fabric-2.1.3/tests/meshy/test_meshy_logging.py +46 -0
  93. vendor_fabric-2.1.3/tests/meshy/test_models.py +308 -0
  94. vendor_fabric-2.1.3/tests/meshy/test_persistence_utils.py +80 -0
  95. vendor_fabric-2.1.3/tests/meshy/test_repository.py +477 -0
  96. vendor_fabric-2.1.3/tests/meshy/test_task_ids.py +506 -0
  97. vendor_fabric-2.1.3/tests/meshy/test_tools.py +420 -0
  98. vendor_fabric-2.1.3/tests/meshy/test_vector_store.py +170 -0
  99. vendor_fabric-2.1.3/tests/meshy/test_webhooks.py +460 -0
  100. vendor_fabric-2.1.3/tests/secrets_sync/test_binding.py +437 -0
  101. vendor_fabric-2.1.3/tests/secrets_sync/test_bundles.py +16 -0
  102. vendor_fabric-2.1.3/tests/secrets_sync/test_config_models.py +180 -0
  103. vendor_fabric-2.1.3/tests/secrets_sync/test_file_and_merge_helpers.py +113 -0
  104. vendor_fabric-2.1.3/tests/secrets_sync/test_pipeline.py +294 -0
  105. vendor_fabric-2.1.3/tests/secrets_sync/test_secrets_sync_cli.py +110 -0
  106. vendor_fabric-2.1.3/tests/secrets_sync/test_secrets_sync_tools.py +213 -0
  107. vendor_fabric-2.1.3/tests/secrets_sync/test_stores_and_graph.py +197 -0
  108. vendor_fabric-2.1.3/tests/test_agentic_boundary.py +74 -0
  109. vendor_fabric-2.1.3/tests/test_anthropic.py +400 -0
  110. vendor_fabric-2.1.3/tests/test_anthropic_tools.py +50 -0
  111. vendor_fabric-2.1.3/tests/test_aws_codedeploy.py +430 -0
  112. vendor_fabric-2.1.3/tests/test_aws_connector.py +573 -0
  113. vendor_fabric-2.1.3/tests/test_aws_organizations.py +703 -0
  114. vendor_fabric-2.1.3/tests/test_aws_s3.py +686 -0
  115. vendor_fabric-2.1.3/tests/test_aws_sso.py +726 -0
  116. vendor_fabric-2.1.3/tests/test_aws_tools.py +292 -0
  117. vendor_fabric-2.1.3/tests/test_base.py +580 -0
  118. vendor_fabric-2.1.3/tests/test_capabilities.py +26 -0
  119. vendor_fabric-2.1.3/tests/test_cli.py +377 -0
  120. vendor_fabric-2.1.3/tests/test_cloud_params.py +121 -0
  121. vendor_fabric-2.1.3/tests/test_connector_payload_contracts.py +399 -0
  122. vendor_fabric-2.1.3/tests/test_connectors.py +594 -0
  123. vendor_fabric-2.1.3/tests/test_cursor.py +583 -0
  124. vendor_fabric-2.1.3/tests/test_cursor_tools.py +83 -0
  125. vendor_fabric-2.1.3/tests/test_diagnostics.py +89 -0
  126. vendor_fabric-2.1.3/tests/test_github_connector.py +186 -0
  127. vendor_fabric-2.1.3/tests/test_github_payload_contract.py +792 -0
  128. vendor_fabric-2.1.3/tests/test_github_tools.py +413 -0
  129. vendor_fabric-2.1.3/tests/test_github_workflow_builder.py +47 -0
  130. vendor_fabric-2.1.3/tests/test_google_activity.py +77 -0
  131. vendor_fabric-2.1.3/tests/test_google_billing.py +460 -0
  132. vendor_fabric-2.1.3/tests/test_google_cloud.py +374 -0
  133. vendor_fabric-2.1.3/tests/test_google_connector.py +306 -0
  134. vendor_fabric-2.1.3/tests/test_google_jules.py +401 -0
  135. vendor_fabric-2.1.3/tests/test_google_services.py +546 -0
  136. vendor_fabric-2.1.3/tests/test_google_tools.py +441 -0
  137. vendor_fabric-2.1.3/tests/test_google_workspace.py +718 -0
  138. vendor_fabric-2.1.3/tests/test_optional_dependencies.py +281 -0
  139. vendor_fabric-2.1.3/tests/test_public_api.py +23 -0
  140. vendor_fabric-2.1.3/tests/test_registry.py +612 -0
  141. vendor_fabric-2.1.3/tests/test_slack_connector.py +667 -0
  142. vendor_fabric-2.1.3/tests/test_slack_tools.py +255 -0
  143. vendor_fabric-2.1.3/tests/test_surface.py +173 -0
  144. vendor_fabric-2.1.3/tests/test_tool_payload_contracts.py +40 -0
  145. vendor_fabric-2.1.3/tests/test_vault_connector.py +436 -0
  146. vendor_fabric-2.1.3/tests/test_vault_tools.py +199 -0
  147. vendor_fabric-2.1.3/tests/test_vendor_data.py +243 -0
  148. vendor_fabric-2.1.3/tests/test_zoom_connector.py +528 -0
  149. vendor_fabric-2.1.3/tests/test_zoom_tools.py +289 -0
@@ -0,0 +1,15 @@
1
+ .DS_Store
2
+ .coverage
3
+ .mypy_cache/
4
+ .pytest_cache/
5
+ .ruff_cache/
6
+ .tox/
7
+ .venv/
8
+ build/
9
+ dist/
10
+ htmlcov/
11
+ *.egg-info/
12
+ __pycache__/
13
+ *.py[cod]
14
+ docs/_build/
15
+ docs/apidocs/
@@ -0,0 +1,33 @@
1
+ # Changelog
2
+
3
+ ## [2.1.3](https://github.com/jbcom/vendor-fabric/compare/vendor-fabric-v2.1.2...vendor-fabric-v2.1.3) (2026-07-01)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * align SecretSync binding session facade ([089ce7c](https://github.com/jbcom/vendor-fabric/commit/089ce7c3874a50f16ee7d84c75f8a84bda121f12))
9
+
10
+ ## [2.1.2](https://github.com/jbcom/vendor-fabric/compare/vendor-fabric-v2.1.1...vendor-fabric-v2.1.2) (2026-06-27)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * align PyPI trusted publishing claim ([5c56532](https://github.com/jbcom/vendor-fabric/commit/5c56532169179e1899143389a7658e89e3772d6d))
16
+
17
+ ## [2.1.1](https://github.com/jbcom/vendor-fabric/compare/vendor-fabric-v2.1.0...vendor-fabric-v2.1.1) (2026-06-27)
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * keep release lock version in sync ([5f437a5](https://github.com/jbcom/vendor-fabric/commit/5f437a5384b7b66968e6adac9c1b36274c8ebaf6))
23
+
24
+ ## [2.1.0](https://github.com/jbcom/vendor-fabric/compare/vendor-fabric-v2.0.0...vendor-fabric-v2.1.0) (2026-06-27)
25
+
26
+
27
+ ### Features
28
+
29
+ * consolidate vendor fabric sync and agentic surfaces ([ef1a4dd](https://github.com/jbcom/vendor-fabric/commit/ef1a4dd66c269b259ee5c98dfd096909cca61eb7))
30
+
31
+ ## Changelog
32
+
33
+ This repository uses release-please for versioning and changelog generation.
@@ -0,0 +1,189 @@
1
+ Metadata-Version: 2.4
2
+ Name: vendor-fabric
3
+ Version: 2.1.3
4
+ Summary: Extended Data-native vendor connectors and sync capabilities
5
+ Project-URL: Documentation, https://jonbogaty.com/vendor-fabric/
6
+ Project-URL: Issues, https://github.com/jbcom/vendor-fabric/issues
7
+ Project-URL: Source, https://github.com/jbcom/vendor-fabric
8
+ Project-URL: Changelog, https://github.com/jbcom/vendor-fabric/blob/main/packages/vendor-fabric/CHANGELOG.md
9
+ Author-email: Jon Bogaty <jon@jonbogaty.com>
10
+ Maintainer-email: Jon Bogaty <jon@jonbogaty.com>
11
+ License: MIT
12
+ Keywords: aws,connectors,gcp,github,meshy,secrets,slack,vault,zoom
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
21
+ Classifier: Typing :: Typed
22
+ Requires-Python: >=3.11
23
+ Requires-Dist: extended-data<9.0.0,>=8.4.0
24
+ Requires-Dist: httpx>=0.28.1
25
+ Requires-Dist: more-itertools>=11.0.2
26
+ Requires-Dist: pydantic<3.0.0,>=2.13.4
27
+ Requires-Dist: pyyaml>=6.0.3
28
+ Requires-Dist: requests>=2.33.1
29
+ Requires-Dist: tenacity<10.0.0,>=8.4.1
30
+ Provides-Extra: all
31
+ Requires-Dist: anthropic>=0.96.0; extra == 'all'
32
+ Requires-Dist: boto3>=1.42.92; extra == 'all'
33
+ Requires-Dist: fastapi>=0.136.0; extra == 'all'
34
+ Requires-Dist: filelock>=3.29.0; extra == 'all'
35
+ Requires-Dist: google-api-python-client>=2.194.0; extra == 'all'
36
+ Requires-Dist: google-cloud-billing>=1.19.0; extra == 'all'
37
+ Requires-Dist: google-cloud-resource-manager>=1.17.0; extra == 'all'
38
+ Requires-Dist: hvac>=2.4.0; extra == 'all'
39
+ Requires-Dist: numpy>=2.2.6; extra == 'all'
40
+ Requires-Dist: pygithub>=2.9.1; extra == 'all'
41
+ Requires-Dist: pyngrok>=8.0.0; extra == 'all'
42
+ Requires-Dist: python-graphql-client>=0.4.3; extra == 'all'
43
+ Requires-Dist: rich<16.0.0,>=13.7.0; extra == 'all'
44
+ Requires-Dist: slack-sdk>=3.41.0; extra == 'all'
45
+ Requires-Dist: sqlite-vec>=0.1.9; extra == 'all'
46
+ Requires-Dist: starlette>=1.3.1; extra == 'all'
47
+ Requires-Dist: uvicorn>=0.45.0; extra == 'all'
48
+ Requires-Dist: validators>=0.35.0; extra == 'all'
49
+ Provides-Extra: anthropic
50
+ Requires-Dist: anthropic>=0.96.0; extra == 'anthropic'
51
+ Provides-Extra: aws
52
+ Requires-Dist: boto3>=1.42.92; extra == 'aws'
53
+ Provides-Extra: cursor
54
+ Provides-Extra: dev
55
+ Requires-Dist: coverage[toml]>=7.6.0; extra == 'dev'
56
+ Requires-Dist: hypothesis>=6.100.2; extra == 'dev'
57
+ Requires-Dist: mypy>=1.20.1; extra == 'dev'
58
+ Requires-Dist: pytest-asyncio>=1.3.0; extra == 'dev'
59
+ Requires-Dist: pytest-cov>=7.1.0; extra == 'dev'
60
+ Requires-Dist: pytest-mock>=3.15.1; extra == 'dev'
61
+ Requires-Dist: pytest-timeout>=2.4.0; extra == 'dev'
62
+ Requires-Dist: pytest-xdist>=3.6.1; extra == 'dev'
63
+ Requires-Dist: pytest>=9.0.3; extra == 'dev'
64
+ Requires-Dist: ruff>=0.8.0; extra == 'dev'
65
+ Requires-Dist: types-pyyaml>=6.0.12.20240724; extra == 'dev'
66
+ Requires-Dist: types-requests>=2.33.0.20260408; extra == 'dev'
67
+ Provides-Extra: docs
68
+ Requires-Dist: furo>=2025.12.19; extra == 'docs'
69
+ Requires-Dist: myst-parser<6.0.0,>=4.0.1; extra == 'docs'
70
+ Requires-Dist: sphinx-autodoc2>=0.5.0; extra == 'docs'
71
+ Requires-Dist: sphinx-copybutton>=0.5.2; extra == 'docs'
72
+ Requires-Dist: sphinx<10.0.0,>=8.2.3; extra == 'docs'
73
+ Provides-Extra: github
74
+ Requires-Dist: pygithub>=2.9.1; extra == 'github'
75
+ Requires-Dist: python-graphql-client>=0.4.3; extra == 'github'
76
+ Provides-Extra: google
77
+ Requires-Dist: google-api-python-client>=2.194.0; extra == 'google'
78
+ Requires-Dist: google-cloud-billing>=1.19.0; extra == 'google'
79
+ Requires-Dist: google-cloud-resource-manager>=1.17.0; extra == 'google'
80
+ Provides-Extra: meshy
81
+ Requires-Dist: filelock>=3.29.0; extra == 'meshy'
82
+ Requires-Dist: numpy>=2.2.6; extra == 'meshy'
83
+ Requires-Dist: rich<16.0.0,>=13.7.0; extra == 'meshy'
84
+ Requires-Dist: validators>=0.35.0; extra == 'meshy'
85
+ Provides-Extra: secrets-sync
86
+ Requires-Dist: boto3>=1.42.92; extra == 'secrets-sync'
87
+ Requires-Dist: hvac>=2.4.0; extra == 'secrets-sync'
88
+ Provides-Extra: slack
89
+ Requires-Dist: slack-sdk>=3.41.0; extra == 'slack'
90
+ Provides-Extra: tests
91
+ Requires-Dist: coverage[toml]>=7.6.0; extra == 'tests'
92
+ Requires-Dist: hypothesis>=6.100.2; extra == 'tests'
93
+ Requires-Dist: pytest-asyncio>=1.3.0; extra == 'tests'
94
+ Requires-Dist: pytest-cov>=7.1.0; extra == 'tests'
95
+ Requires-Dist: pytest-mock>=3.15.1; extra == 'tests'
96
+ Requires-Dist: pytest-timeout>=2.4.0; extra == 'tests'
97
+ Requires-Dist: pytest-xdist>=3.6.1; extra == 'tests'
98
+ Requires-Dist: pytest>=9.0.3; extra == 'tests'
99
+ Provides-Extra: typing
100
+ Requires-Dist: mypy>=1.20.1; extra == 'typing'
101
+ Requires-Dist: types-pyyaml>=6.0.12.20240724; extra == 'typing'
102
+ Requires-Dist: types-requests>=2.33.0.20260408; extra == 'typing'
103
+ Provides-Extra: vault
104
+ Requires-Dist: hvac>=2.4.0; extra == 'vault'
105
+ Provides-Extra: vector
106
+ Requires-Dist: sqlite-vec>=0.1.9; extra == 'vector'
107
+ Provides-Extra: webhooks
108
+ Requires-Dist: fastapi>=0.136.0; extra == 'webhooks'
109
+ Requires-Dist: pyngrok>=8.0.0; extra == 'webhooks'
110
+ Requires-Dist: starlette>=1.3.1; extra == 'webhooks'
111
+ Requires-Dist: uvicorn>=0.45.0; extra == 'webhooks'
112
+ Provides-Extra: zoom
113
+ Description-Content-Type: text/markdown
114
+
115
+ # Vendor Fabric
116
+
117
+ `vendor-fabric` is the optional vendor integration layer for the
118
+ Extended Data Python stack. It depends on `extended-data>=8.4.0` for the
119
+ polymorphic `ExtendedData` root, concrete containers, local file sync, inputs,
120
+ logging, and workflow utilities, then adds
121
+ adapter-registered API clients and vendor-backed sync capabilities.
122
+
123
+ Documentation: [jonbogaty.com/vendor-fabric](https://jonbogaty.com/vendor-fabric/)
124
+
125
+ ```bash
126
+ pip install vendor-fabric
127
+ pip install "vendor-fabric[github,slack]"
128
+ pip install "vendor-fabric[aws,google,vault,secrets-sync]"
129
+ pip install secrets-sync-python-binding
130
+ pip install pytest-vendor-fabric
131
+ ```
132
+
133
+ The base install keeps vendor SDKs out of the environment. Connector metadata
134
+ is available even when an optional SDK is absent:
135
+
136
+ ```python
137
+ from vendor_fabric import get_connector_info, list_connector_info
138
+
139
+ print(get_connector_info("github")["available"])
140
+ print(list_connector_info(include_unavailable=True))
141
+ ```
142
+
143
+ Construct connectors through the registry or `ConnectorFabric`:
144
+
145
+ ```python
146
+ from vendor_fabric import ConnectorFabric
147
+
148
+ fabric = ConnectorFabric(inputs={"GITHUB_TOKEN": "..."})
149
+ github = fabric.get_connector("github")
150
+ ```
151
+
152
+ Unavailable features report install guidance instead of requiring callers to
153
+ wrap their own imports.
154
+
155
+ SecretSync access is exposed through a binding-backed facade:
156
+
157
+ ```python
158
+ from vendor_fabric.secrets_sync import ProviderSession, SyncOptions, get_targets, run_pipeline
159
+
160
+ result = run_pipeline("pipeline.yaml", SyncOptions(dry_run=True))
161
+ targets = get_targets("pipeline.yaml")
162
+
163
+ print(result["success"])
164
+ print(targets["targets"])
165
+
166
+ session = ProviderSession(
167
+ vault_address="https://vault.example.com",
168
+ vault_token=vault_token,
169
+ aws_region="us-east-1",
170
+ aws_access_key_id=aws_credentials.access_key,
171
+ aws_secret_access_key=aws_credentials.secret_key,
172
+ aws_session_token=aws_credentials.token,
173
+ )
174
+ run_pipeline("pipeline.yaml", SyncOptions(dry_run=True), provider_session=session)
175
+ ```
176
+
177
+ `vendor-fabric` consumes the `secrets_sync` import from
178
+ `secrets-sync-python-binding` and shapes those payloads into Extended Data
179
+ values. The canonical SecretSync runtime, CLI, pipeline semantics, and gopy
180
+ binding source live in `jbcom/secrets-sync`.
181
+
182
+ Connector and sync payloads are `ExtendedData` values at the boundary. Dict,
183
+ list, string, tuple, and set payloads are concrete extended subclasses, so code
184
+ can use normal container operations and extended-data methods without import
185
+ juggling.
186
+
187
+ Testing support lives in the separately published `pytest-vendor-fabric`
188
+ package. It provides connector fixtures, E2E controls, and credential guards
189
+ without forcing test-only dependencies into the runtime package.
@@ -0,0 +1,75 @@
1
+ # Vendor Fabric
2
+
3
+ `vendor-fabric` is the optional vendor integration layer for the
4
+ Extended Data Python stack. It depends on `extended-data>=8.4.0` for the
5
+ polymorphic `ExtendedData` root, concrete containers, local file sync, inputs,
6
+ logging, and workflow utilities, then adds
7
+ adapter-registered API clients and vendor-backed sync capabilities.
8
+
9
+ Documentation: [jonbogaty.com/vendor-fabric](https://jonbogaty.com/vendor-fabric/)
10
+
11
+ ```bash
12
+ pip install vendor-fabric
13
+ pip install "vendor-fabric[github,slack]"
14
+ pip install "vendor-fabric[aws,google,vault,secrets-sync]"
15
+ pip install secrets-sync-python-binding
16
+ pip install pytest-vendor-fabric
17
+ ```
18
+
19
+ The base install keeps vendor SDKs out of the environment. Connector metadata
20
+ is available even when an optional SDK is absent:
21
+
22
+ ```python
23
+ from vendor_fabric import get_connector_info, list_connector_info
24
+
25
+ print(get_connector_info("github")["available"])
26
+ print(list_connector_info(include_unavailable=True))
27
+ ```
28
+
29
+ Construct connectors through the registry or `ConnectorFabric`:
30
+
31
+ ```python
32
+ from vendor_fabric import ConnectorFabric
33
+
34
+ fabric = ConnectorFabric(inputs={"GITHUB_TOKEN": "..."})
35
+ github = fabric.get_connector("github")
36
+ ```
37
+
38
+ Unavailable features report install guidance instead of requiring callers to
39
+ wrap their own imports.
40
+
41
+ SecretSync access is exposed through a binding-backed facade:
42
+
43
+ ```python
44
+ from vendor_fabric.secrets_sync import ProviderSession, SyncOptions, get_targets, run_pipeline
45
+
46
+ result = run_pipeline("pipeline.yaml", SyncOptions(dry_run=True))
47
+ targets = get_targets("pipeline.yaml")
48
+
49
+ print(result["success"])
50
+ print(targets["targets"])
51
+
52
+ session = ProviderSession(
53
+ vault_address="https://vault.example.com",
54
+ vault_token=vault_token,
55
+ aws_region="us-east-1",
56
+ aws_access_key_id=aws_credentials.access_key,
57
+ aws_secret_access_key=aws_credentials.secret_key,
58
+ aws_session_token=aws_credentials.token,
59
+ )
60
+ run_pipeline("pipeline.yaml", SyncOptions(dry_run=True), provider_session=session)
61
+ ```
62
+
63
+ `vendor-fabric` consumes the `secrets_sync` import from
64
+ `secrets-sync-python-binding` and shapes those payloads into Extended Data
65
+ values. The canonical SecretSync runtime, CLI, pipeline semantics, and gopy
66
+ binding source live in `jbcom/secrets-sync`.
67
+
68
+ Connector and sync payloads are `ExtendedData` values at the boundary. Dict,
69
+ list, string, tuple, and set payloads are concrete extended subclasses, so code
70
+ can use normal container operations and extended-data methods without import
71
+ juggling.
72
+
73
+ Testing support lives in the separately published `pytest-vendor-fabric`
74
+ package. It provides connector fixtures, E2E controls, and credential guards
75
+ without forcing test-only dependencies into the runtime package.
@@ -0,0 +1,69 @@
1
+ # Connector Examples
2
+
3
+ This directory contains working examples for `vendor_fabric` and the
4
+ registered integrations that hang off `ConnectorFabric`.
5
+
6
+ Connector examples assume the `extended-data>=8.4.0` contract: external data
7
+ payloads are promoted through the `ExtendedData` root at connector boundaries.
8
+ Callers can use `ExtendedDict`, `ExtendedList`, and `ExtendedString` methods on
9
+ decoded API, file, and SDK-shaped results, then call `to_builtin()` only when a
10
+ plain Python payload is needed for serialization or SDK handoff.
11
+ Provider capability functions follow that same payload contract. Agent runtime
12
+ wrappers and framework-specific tool objects belong in `agentic-fabric`.
13
+
14
+ ## Quick Start
15
+
16
+ Install vendor-fabric with the extras you need:
17
+
18
+ ```bash
19
+ # Install with all connectors
20
+ pip install "vendor-fabric[all]"
21
+
22
+ # Or install specific connectors
23
+ pip install "vendor-fabric[aws,google,meshy]"
24
+
25
+ ```
26
+
27
+ ## Examples
28
+
29
+ ### Basic Connectors
30
+
31
+ - [`basic_aws.py`](basic_aws.py) - AWS connector with Organizations and S3
32
+ - [`basic_google.py`](basic_google.py) - Google Vendor fabric with Workspace and Billing
33
+ - [`basic_meshy.py`](basic_meshy.py) - Meshy AI 3D generation
34
+
35
+ ### Provider Capability Integration
36
+
37
+ Provider capability metadata lives in the provider modules. Agent-facing
38
+ runtime transports over those capabilities belong in `agentic-fabric`.
39
+
40
+ ## Environment Variables
41
+
42
+ Most examples require API keys set as environment variables:
43
+
44
+ ```bash
45
+ # AWS
46
+ export AWS_ACCESS_KEY_ID="your-key"
47
+ export AWS_SECRET_ACCESS_KEY="your-secret"
48
+
49
+ # Google Cloud
50
+ export GOOGLE_SERVICE_ACCOUNT='{"type": "service_account", ...}'
51
+
52
+ # Meshy AI
53
+ export MESHY_API_KEY="msy_your_key"
54
+
55
+ ```
56
+
57
+ ## Running Examples
58
+
59
+ ```bash
60
+ # Run any example
61
+ uv run --package vendor-fabric python packages/vendor-fabric/examples/basic_meshy.py
62
+
63
+ # Run with debug logging
64
+ LOGLEVEL=DEBUG uv run --package vendor-fabric python packages/vendor-fabric/examples/basic_meshy.py
65
+ ```
66
+
67
+ SecretSync examples live in this repository because that surface composes
68
+ vendor capabilities. Install `vendor-fabric[secrets-sync]` for vendor secret
69
+ sync. Agent runtime examples belong in `agentic-fabric`.
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env python3
2
+ """Example: Basic AWS Connector usage.
3
+
4
+ This example demonstrates how to use the AWS connector to interact with
5
+ AWS Organizations and S3.
6
+
7
+ Requirements:
8
+ pip install vendor-fabric[aws]
9
+
10
+ Environment Variables:
11
+ AWS_ACCESS_KEY_ID: AWS access key
12
+ AWS_SECRET_ACCESS_KEY: AWS secret key
13
+ AWS_DEFAULT_REGION: AWS region (optional, defaults to us-east-1)
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import os
19
+ import sys
20
+
21
+ from vendor_fabric import ConnectorFabric
22
+
23
+
24
+ def main() -> int:
25
+ """Demonstrate AWS connector usage."""
26
+ # Check for required environment variables
27
+ if not os.getenv("AWS_ACCESS_KEY_ID"):
28
+ print("Error: AWS_ACCESS_KEY_ID environment variable is required.")
29
+ return 1
30
+
31
+ fabric = ConnectorFabric()
32
+ info = fabric.get_connector_info("aws")
33
+ if not info["available"]:
34
+ print(f"Error: AWS connector is unavailable. Install with: {info['install']}")
35
+ if info["missing"]:
36
+ print(f"Missing packages: {', '.join(info['missing'])}")
37
+ return 1
38
+
39
+ print("Creating AWS connector...")
40
+ connector = fabric.get_connector("aws")
41
+ print("AWS connector created successfully.")
42
+
43
+ # List S3 buckets
44
+ print("\n--- S3 Buckets ---")
45
+ try:
46
+ buckets = connector.list_s3_buckets()
47
+ for bucket_name, bucket in list(buckets.items())[:5]: # Show first 5
48
+ created = bucket.get("creation_date") or bucket.get("CreationDate")
49
+ print(f" Bucket: {bucket_name} ({created})")
50
+ if len(buckets) > 5:
51
+ print(f" ... and {len(buckets) - 5} more buckets")
52
+ except Exception as e:
53
+ print(f" Could not list buckets: {e}")
54
+
55
+ # List organization accounts (if using Organizations)
56
+ print("\n--- Organization Accounts ---")
57
+ try:
58
+ accounts = connector.get_accounts()
59
+ for account_id, account in list(accounts.items())[:5]:
60
+ name = account.get("name") or account.get("Name") or account_id
61
+ print(f" Account: {account_id} ({name})")
62
+ if len(accounts) > 5:
63
+ print(f" ... and {len(accounts) - 5} more accounts")
64
+ except Exception as e:
65
+ print(f" Could not list accounts: {e}")
66
+
67
+ return 0
68
+
69
+
70
+ if __name__ == "__main__":
71
+ sys.exit(main())
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env python3
2
+ """Example: Basic Google Cloud Connector usage.
3
+
4
+ This example demonstrates how to use the Google Vendor fabric to interact
5
+ with Google Workspace and Cloud Platform.
6
+
7
+ Requirements:
8
+ pip install vendor-fabric[google]
9
+
10
+ Environment Variables:
11
+ GOOGLE_SERVICE_ACCOUNT: JSON service account credentials
12
+ GOOGLE_DOMAIN: Google Workspace domain (for Workspace operations)
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ import os
18
+ import sys
19
+
20
+ from vendor_fabric import ConnectorFabric
21
+
22
+
23
+ def main() -> int:
24
+ """Demonstrate Google connector usage."""
25
+ # Check for required environment variables
26
+ if not os.getenv("GOOGLE_SERVICE_ACCOUNT"):
27
+ print("Error: GOOGLE_SERVICE_ACCOUNT environment variable is required.")
28
+ return 1
29
+
30
+ fabric = ConnectorFabric()
31
+ info = fabric.get_connector_info("google")
32
+ if not info["available"]:
33
+ print(f"Error: Google connector is unavailable. Install with: {info['install']}")
34
+ if info["missing"]:
35
+ print(f"Missing packages: {', '.join(info['missing'])}")
36
+ return 1
37
+
38
+ print("Creating Google connector...")
39
+ connector = fabric.get_connector("google")
40
+ print("Google connector created successfully.")
41
+
42
+ # List projects
43
+ print("\n--- Google Cloud Projects ---")
44
+ try:
45
+ projects = connector.list_projects()
46
+ for project in projects[:5]:
47
+ print(f" Project: {project}")
48
+ if len(projects) > 5:
49
+ print(f" ... and {len(projects) - 5} more projects")
50
+ except Exception as e:
51
+ print(f" Could not list projects: {e}")
52
+
53
+ # List workspace users (if domain configured)
54
+ if os.getenv("GOOGLE_DOMAIN"):
55
+ print("\n--- Workspace Users ---")
56
+ try:
57
+ users = connector.list_users()
58
+ for user in users[:5]:
59
+ email = user.get("primaryEmail", "Unknown")
60
+ print(f" User: {email}")
61
+ if len(users) > 5:
62
+ print(f" ... and {len(users) - 5} more users")
63
+ except Exception as e:
64
+ print(f" Could not list users: {e}")
65
+ else:
66
+ print("\nSkipping Workspace users (GOOGLE_DOMAIN not set).")
67
+
68
+ return 0
69
+
70
+
71
+ if __name__ == "__main__":
72
+ sys.exit(main())
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env python3
2
+ """Example: Meshy AI 3D Generation.
3
+
4
+ This example demonstrates how to use the Meshy connector for AI-powered
5
+ 3D asset generation.
6
+
7
+ Requirements:
8
+ pip install vendor-fabric[meshy]
9
+
10
+ Environment Variables:
11
+ MESHY_API_KEY: Your Meshy API key (get one at https://meshy.ai)
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import os
17
+ import sys
18
+
19
+
20
+ def main() -> int:
21
+ """Demonstrate Meshy AI 3D generation."""
22
+ if not os.getenv("MESHY_API_KEY"):
23
+ print("Error: MESHY_API_KEY environment variable is required.")
24
+ print("Get an API key at https://meshy.ai")
25
+ return 1
26
+
27
+ from vendor_fabric.meshy import text3d
28
+
29
+ prompt = "a medieval sword with ornate handle"
30
+ print(f"Generating 3D model for prompt: '{prompt}'")
31
+
32
+ try:
33
+ # `generate` submits a preview task and polls until it completes.
34
+ # Pass `wait=False` to get the task id back immediately and poll
35
+ # yourself with `text3d.poll(task_id)`.
36
+ result = text3d.generate(
37
+ prompt=prompt,
38
+ art_style="realistic",
39
+ negative_prompt="blurry, low detail",
40
+ target_polycount=15000,
41
+ enable_pbr=True,
42
+ )
43
+
44
+ # text3d.generate returns an ExtendedDict when wait=True.
45
+ status = result["status"]
46
+ print(f"Final status: {status}")
47
+
48
+ if status != "SUCCEEDED":
49
+ error = result.get("error")
50
+ print(f"Generation failed: {error}")
51
+ return 1
52
+
53
+ model_urls = result.get("model_urls") or {}
54
+ print(f"GLB url: {model_urls.get('glb')}")
55
+ print(f"OBJ url: {model_urls.get('obj')}")
56
+
57
+ # Refine the preview to full quality using the task id.
58
+ task_id = str(result["id"])
59
+ print(f"Refining task {task_id} to full quality...")
60
+ refined_id = text3d.refine(task_id)
61
+ refined = text3d.poll(str(refined_id))
62
+ refined_urls = refined.get("model_urls") or {}
63
+ print(f"Refined GLB url: {refined_urls.get('glb')}")
64
+
65
+ except Exception as e:
66
+ print(f"Error during generation: {e}")
67
+ return 1
68
+
69
+ return 0
70
+
71
+
72
+ if __name__ == "__main__":
73
+ sys.exit(main())