plynt 0.11.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 (472) hide show
  1. plynt-0.11.0/.github/CODEOWNERS +2 -0
  2. plynt-0.11.0/.github/ISSUE_TEMPLATE/bug_report.yml +37 -0
  3. plynt-0.11.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  4. plynt-0.11.0/.github/ISSUE_TEMPLATE/feature_request.yml +25 -0
  5. plynt-0.11.0/.github/ISSUE_TEMPLATE/release_smoke_checklist.yml +84 -0
  6. plynt-0.11.0/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +16 -0
  7. plynt-0.11.0/.github/copilot-instructions.md +310 -0
  8. plynt-0.11.0/.github/dependabot.yml +41 -0
  9. plynt-0.11.0/.github/workflows/automerge.yml +128 -0
  10. plynt-0.11.0/.github/workflows/check.yml +74 -0
  11. plynt-0.11.0/.github/workflows/commit.yml +111 -0
  12. plynt-0.11.0/.github/workflows/distribution.yml +90 -0
  13. plynt-0.11.0/.github/workflows/publish.yml +139 -0
  14. plynt-0.11.0/.github/workflows/release.yml +74 -0
  15. plynt-0.11.0/.github/workflows/salesforce-cdc-proto-watch.yml +44 -0
  16. plynt-0.11.0/.github/workflows/security.yml +64 -0
  17. plynt-0.11.0/.github/workflows/verify.yml +63 -0
  18. plynt-0.11.0/.gitignore +59 -0
  19. plynt-0.11.0/.gitlint +7 -0
  20. plynt-0.11.0/.markdownlint.yml +5 -0
  21. plynt-0.11.0/.pre-commit-config.yaml +43 -0
  22. plynt-0.11.0/.python-version +4 -0
  23. plynt-0.11.0/.release-please-config.json +70 -0
  24. plynt-0.11.0/.release-please-manifest.json +3 -0
  25. plynt-0.11.0/.yamllint.yml +15 -0
  26. plynt-0.11.0/AGENTS.md +121 -0
  27. plynt-0.11.0/CHANGELOG.md +400 -0
  28. plynt-0.11.0/CODE_OF_CONDUCT.md +32 -0
  29. plynt-0.11.0/CONTRIBUTING.md +237 -0
  30. plynt-0.11.0/LICENSE +21 -0
  31. plynt-0.11.0/Makefile +266 -0
  32. plynt-0.11.0/PKG-INFO +188 -0
  33. plynt-0.11.0/README-pypi.md +113 -0
  34. plynt-0.11.0/README.md +219 -0
  35. plynt-0.11.0/SECURITY.md +22 -0
  36. plynt-0.11.0/cchk.toml +55 -0
  37. plynt-0.11.0/docs/architecture/adr/0001-architecture-principles.md +80 -0
  38. plynt-0.11.0/docs/architecture/adr/0002-layered-architecture.md +209 -0
  39. plynt-0.11.0/docs/architecture/adr/0003-dependency-policy.md +33 -0
  40. plynt-0.11.0/docs/architecture/adr/0004-settings-and-configuration.md +264 -0
  41. plynt-0.11.0/docs/architecture/adr/0005-request-layer.md +129 -0
  42. plynt-0.11.0/docs/architecture/adr/0006-transport-layer.md +124 -0
  43. plynt-0.11.0/docs/architecture/adr/0007-response-layer.md +215 -0
  44. plynt-0.11.0/docs/architecture/adr/0008-client-layer.md +241 -0
  45. plynt-0.11.0/docs/architecture/adr/0009-service-layer.md +197 -0
  46. plynt-0.11.0/docs/architecture/adr/0010-caching.md +247 -0
  47. plynt-0.11.0/docs/architecture/adr/0011-authentication.md +319 -0
  48. plynt-0.11.0/docs/architecture/adr/0012-retry-strategy.md +206 -0
  49. plynt-0.11.0/docs/architecture/adr/0013-transport-base-class.md +248 -0
  50. plynt-0.11.0/docs/architecture/adr/0014-logging.md +318 -0
  51. plynt-0.11.0/docs/architecture/adr/0015-header-middleware.md +115 -0
  52. plynt-0.11.0/docs/architecture/adr/0016-vcr-testsupport.md +164 -0
  53. plynt-0.11.0/docs/architecture/adr/0017-streaming-response.md +270 -0
  54. plynt-0.11.0/docs/architecture/adr/0018-raw-response-access.md +141 -0
  55. plynt-0.11.0/docs/architecture/adr/0019-circuit-breaker-middleware.md +148 -0
  56. plynt-0.11.0/docs/architecture/adr/0020-rate-limit-middleware.md +150 -0
  57. plynt-0.11.0/docs/architecture/adr/0021-llm-contract-boundary.md +178 -0
  58. plynt-0.11.0/docs/architecture/adr/0022-upstream-rate-governance.md +175 -0
  59. plynt-0.11.0/docs/architecture/adr/0023-httpx2-transport-backend.md +136 -0
  60. plynt-0.11.0/docs/architecture/adr/0024-framework-adapter-strategy.md +157 -0
  61. plynt-0.11.0/docs/architecture/adr/0025-django-adapter-sync-async-strategy.md +189 -0
  62. plynt-0.11.0/docs/architecture/adr/0026-fastapi-adapter-lifecycle-and-di.md +169 -0
  63. plynt-0.11.0/docs/architecture/adr/0027-public-api-compatibility-and-deprecation-policy.md +111 -0
  64. plynt-0.11.0/docs/architecture/adr/0028-supported-environments-and-extras-policy.md +117 -0
  65. plynt-0.11.0/docs/architecture/adr/0029-release-acceptance-gates-and-evidence-model.md +117 -0
  66. plynt-0.11.0/docs/architecture/adr/0030-grpc-protocol-boundary.md +170 -0
  67. plynt-0.11.0/docs/architecture/adr/0031-experimental-release-installation-contract.md +109 -0
  68. plynt-0.11.0/docs/architecture/adr/0032-grpc-codegen-version-refresh.md +72 -0
  69. plynt-0.11.0/docs/architecture/adr/0033-python-315-support-and-local-pyenv.md +129 -0
  70. plynt-0.11.0/docs/architecture/adr/0034-django-6-support.md +76 -0
  71. plynt-0.11.0/docs/architecture/adr/0035-pre-1-versioning-policy.md +72 -0
  72. plynt-0.11.0/docs/architecture/adr/0036-project-and-package-rebrand-to-plynt.md +230 -0
  73. plynt-0.11.0/docs/architecture/adr/README.md +65 -0
  74. plynt-0.11.0/docs/architecture/overview.md +140 -0
  75. plynt-0.11.0/docs/architecture/risks/ai-connectors.md +49 -0
  76. plynt-0.11.0/docs/changes/django-framework-adapter_django_adapter_20260713.md +537 -0
  77. plynt-0.11.0/docs/changes/fastapi-framework-adapter_fastapi_adapter_20260725.md +184 -0
  78. plynt-0.11.0/docs/changes/llm-adapters_openai_anthropic_20260705.md +172 -0
  79. plynt-0.11.0/docs/changes/public-release-readiness_20260802.md +737 -0
  80. plynt-0.11.0/docs/connectors/llm/README.md +128 -0
  81. plynt-0.11.0/docs/connectors/salesforce/README.md +538 -0
  82. plynt-0.11.0/docs/connectors/salesforce/architecture/adr/README.md +31 -0
  83. plynt-0.11.0/docs/connectors/salesforce/architecture/adr/sf-0001-error-mapping.md +173 -0
  84. plynt-0.11.0/docs/connectors/salesforce/architecture/adr/sf-0002-sobject-api-facade.md +63 -0
  85. plynt-0.11.0/docs/connectors/salesforce/architecture/adr/sf-0003-query-service-design.md +290 -0
  86. plynt-0.11.0/docs/connectors/salesforce/architecture/adr/sf-0004-search-capability-design.md +140 -0
  87. plynt-0.11.0/docs/connectors/salesforce/architecture/adr/sf-0005-bulk-api-2-design.md +313 -0
  88. plynt-0.11.0/docs/connectors/salesforce/architecture/adr/sf-0006-jwt-bearer-auth.md +114 -0
  89. plynt-0.11.0/docs/connectors/salesforce/architecture/adr/sf-0007-composite-rest-primitives.md +122 -0
  90. plynt-0.11.0/docs/connectors/salesforce/architecture/adr/sf-0008-metadata-rest-deploy.md +117 -0
  91. plynt-0.11.0/docs/connectors/salesforce/architecture/adr/sf-0009-identity-access-primitives.md +112 -0
  92. plynt-0.11.0/docs/connectors/salesforce/architecture/adr/sf-0010-query-response-normalization.md +124 -0
  93. plynt-0.11.0/docs/connectors/salesforce/architecture/adr/sf-0011-ai-connector-boundary.md +89 -0
  94. plynt-0.11.0/docs/connectors/salesforce/architecture/adr/sf-0012-extraction-strategy.md +176 -0
  95. plynt-0.11.0/docs/connectors/salesforce/architecture/adr/sf-0013-salesforce-eventing-architecture.md +162 -0
  96. plynt-0.11.0/docs/connectors/salesforce/architecture/overview.md +84 -0
  97. plynt-0.11.0/docs/connectors/salesforce/design/ai-models-design.md +160 -0
  98. plynt-0.11.0/docs/connectors/salesforce/product/roadmap.md +350 -0
  99. plynt-0.11.0/docs/connectors/salesforce/user/README.md +49 -0
  100. plynt-0.11.0/docs/connectors/salesforce/user/explanation/README.md +8 -0
  101. plynt-0.11.0/docs/connectors/salesforce/user/explanation/api-limits.md +90 -0
  102. plynt-0.11.0/docs/connectors/salesforce/user/explanation/auth-flows.md +172 -0
  103. plynt-0.11.0/docs/connectors/salesforce/user/how-to/README.md +42 -0
  104. plynt-0.11.0/docs/connectors/salesforce/user/how-to/authenticate.md +257 -0
  105. plynt-0.11.0/docs/connectors/salesforce/user/how-to/bulk.md +190 -0
  106. plynt-0.11.0/docs/connectors/salesforce/user/how-to/deploy-cdc.md +255 -0
  107. plynt-0.11.0/docs/connectors/salesforce/user/how-to/handle-errors.md +97 -0
  108. plynt-0.11.0/docs/connectors/salesforce/user/how-to/query-records.md +94 -0
  109. plynt-0.11.0/docs/connectors/salesforce/user/how-to/resilience.md +141 -0
  110. plynt-0.11.0/docs/connectors/salesforce/user/how-to/search.md +100 -0
  111. plynt-0.11.0/docs/connectors/salesforce/user/how-to/sobject-crud.md +200 -0
  112. plynt-0.11.0/docs/connectors/salesforce/user/how-to/use-agent-api.md +163 -0
  113. plynt-0.11.0/docs/connectors/salesforce/user/how-to/use-composite.md +175 -0
  114. plynt-0.11.0/docs/connectors/salesforce/user/how-to/use-models-api.md +183 -0
  115. plynt-0.11.0/docs/connectors/salesforce/user/reference/README.md +13 -0
  116. plynt-0.11.0/docs/connectors/salesforce/user/reference/errors.md +116 -0
  117. plynt-0.11.0/docs/connectors/salesforce/user/reference/models.md +77 -0
  118. plynt-0.11.0/docs/connectors/salesforce/user/reference/services.md +260 -0
  119. plynt-0.11.0/docs/connectors/salesforce/user/reference/settings.md +58 -0
  120. plynt-0.11.0/docs/connectors/salesforce/user/tutorials/01-connect-and-query.md +110 -0
  121. plynt-0.11.0/docs/connectors/salesforce/user/tutorials/README.md +7 -0
  122. plynt-0.11.0/docs/product/ideas/flask-adapter.md +134 -0
  123. plynt-0.11.0/docs/product/ideas/middleware-extensions.md +90 -0
  124. plynt-0.11.0/docs/product/requirements.md +92 -0
  125. plynt-0.11.0/docs/product/roadmap.md +853 -0
  126. plynt-0.11.0/docs/product/vision.md +65 -0
  127. plynt-0.11.0/docs/releases/2026-08-02-public-readiness-evidence.md +39 -0
  128. plynt-0.11.0/docs/releases/2026-10-13-experimental-rc-hardening-evidence.md +338 -0
  129. plynt-0.11.0/docs/user/README.md +91 -0
  130. plynt-0.11.0/docs/user/explanation/README.md +14 -0
  131. plynt-0.11.0/docs/user/explanation/architecture.md +236 -0
  132. plynt-0.11.0/docs/user/explanation/middleware-model.md +164 -0
  133. plynt-0.11.0/docs/user/explanation/sync-async.md +74 -0
  134. plynt-0.11.0/docs/user/how-to/README.md +47 -0
  135. plynt-0.11.0/docs/user/how-to/add-authentication.md +161 -0
  136. plynt-0.11.0/docs/user/how-to/configure-logging.md +128 -0
  137. plynt-0.11.0/docs/user/how-to/django/django-middleware-interoperability.md +80 -0
  138. plynt-0.11.0/docs/user/how-to/django/use-django-cache-backend.md +81 -0
  139. plynt-0.11.0/docs/user/how-to/django/use-django-transport-helper.md +183 -0
  140. plynt-0.11.0/docs/user/how-to/drf/drf-serializer-business-patterns.md +246 -0
  141. plynt-0.11.0/docs/user/how-to/drf/use-drf-plynt-service-mixin.md +391 -0
  142. plynt-0.11.0/docs/user/how-to/fastapi/use-fastapi-service-facade.md +407 -0
  143. plynt-0.11.0/docs/user/how-to/handle-errors.md +124 -0
  144. plynt-0.11.0/docs/user/how-to/salesforce/README.md +5 -0
  145. plynt-0.11.0/docs/user/how-to/use-async.md +114 -0
  146. plynt-0.11.0/docs/user/how-to/use-cache.md +181 -0
  147. plynt-0.11.0/docs/user/how-to/use-middleware.md +200 -0
  148. plynt-0.11.0/docs/user/how-to/write-middleware.md +196 -0
  149. plynt-0.11.0/docs/user/reference/README.md +22 -0
  150. plynt-0.11.0/docs/user/reference/auth-configs.md +157 -0
  151. plynt-0.11.0/docs/user/reference/cache-backends.md +121 -0
  152. plynt-0.11.0/docs/user/reference/installation.md +124 -0
  153. plynt-0.11.0/docs/user/reference/middleware.md +212 -0
  154. plynt-0.11.0/docs/user/reference/settings.md +148 -0
  155. plynt-0.11.0/docs/user/tutorials/01-getting-started.md +140 -0
  156. plynt-0.11.0/docs/user/tutorials/02-build-a-connector.md +185 -0
  157. plynt-0.11.0/docs/user/tutorials/03-add-middleware.md +160 -0
  158. plynt-0.11.0/docs/user/tutorials/04-add-caching.md +148 -0
  159. plynt-0.11.0/docs/user/tutorials/05-test-with-vcr.md +194 -0
  160. plynt-0.11.0/docs/user/tutorials/README.md +25 -0
  161. plynt-0.11.0/examples/django/README.md +34 -0
  162. plynt-0.11.0/examples/django/cache_backend.md +34 -0
  163. plynt-0.11.0/examples/django/middleware_profile.md +30 -0
  164. plynt-0.11.0/examples/django/transport_from_settings.md +70 -0
  165. plynt-0.11.0/examples/drf/README.md +30 -0
  166. plynt-0.11.0/examples/drf/drf_service_view.md +96 -0
  167. plynt-0.11.0/examples/drf/exception_handler_setup.md +30 -0
  168. plynt-0.11.0/examples/drf/serializer_orchestrator_view.md +111 -0
  169. plynt-0.11.0/examples/llm/README.md +88 -0
  170. plynt-0.11.0/examples/llm/anthropic_messages.md +77 -0
  171. plynt-0.11.0/examples/llm/example.env +16 -0
  172. plynt-0.11.0/examples/llm/openai_responses.md +69 -0
  173. plynt-0.11.0/examples/salesforce/README.md +173 -0
  174. plynt-0.11.0/examples/salesforce/client_credentials.md +69 -0
  175. plynt-0.11.0/examples/salesforce/example.env +79 -0
  176. plynt-0.11.0/examples/salesforce/shared_demo.md +169 -0
  177. plynt-0.11.0/examples/salesforce/username_password.md +123 -0
  178. plynt-0.11.0/pyproject.toml +262 -0
  179. plynt-0.11.0/setup.cfg +4 -0
  180. plynt-0.11.0/src/plynt/__init__.py +1 -0
  181. plynt-0.11.0/src/plynt/adapters/__init__.py +8 -0
  182. plynt-0.11.0/src/plynt/adapters/django/__init__.py +23 -0
  183. plynt-0.11.0/src/plynt/adapters/django/cache.py +159 -0
  184. plynt-0.11.0/src/plynt/adapters/django/drf/__init__.py +28 -0
  185. plynt-0.11.0/src/plynt/adapters/django/drf/errors.py +119 -0
  186. plynt-0.11.0/src/plynt/adapters/django/drf/headers.py +140 -0
  187. plynt-0.11.0/src/plynt/adapters/django/drf/views.py +354 -0
  188. plynt-0.11.0/src/plynt/adapters/django/settings.py +114 -0
  189. plynt-0.11.0/src/plynt/adapters/django/transport.py +155 -0
  190. plynt-0.11.0/src/plynt/adapters/fastapi/__init__.py +38 -0
  191. plynt-0.11.0/src/plynt/adapters/fastapi/dependencies.py +57 -0
  192. plynt-0.11.0/src/plynt/adapters/fastapi/errors.py +140 -0
  193. plynt-0.11.0/src/plynt/adapters/fastapi/headers.py +141 -0
  194. plynt-0.11.0/src/plynt/adapters/fastapi/lifespan.py +76 -0
  195. plynt-0.11.0/src/plynt/adapters/fastapi/services.py +98 -0
  196. plynt-0.11.0/src/plynt/base/__init__.py +68 -0
  197. plynt-0.11.0/src/plynt/base/cache.py +264 -0
  198. plynt-0.11.0/src/plynt/base/errors.py +319 -0
  199. plynt-0.11.0/src/plynt/base/mapping.py +22 -0
  200. plynt-0.11.0/src/plynt/base/middleware.py +152 -0
  201. plynt-0.11.0/src/plynt/base/policies.py +279 -0
  202. plynt-0.11.0/src/plynt/base/request.py +62 -0
  203. plynt-0.11.0/src/plynt/base/response.py +275 -0
  204. plynt-0.11.0/src/plynt/base/settings.py +52 -0
  205. plynt-0.11.0/src/plynt/base/transport.py +255 -0
  206. plynt-0.11.0/src/plynt/cache/__init__.py +171 -0
  207. plynt-0.11.0/src/plynt/cache/cachetools.py +78 -0
  208. plynt-0.11.0/src/plynt/cache/dummy.py +65 -0
  209. plynt-0.11.0/src/plynt/cache/locmem.py +209 -0
  210. plynt-0.11.0/src/plynt/cache/redis.py +222 -0
  211. plynt-0.11.0/src/plynt/connectors/__init__.py +1 -0
  212. plynt-0.11.0/src/plynt/connectors/llm/__init__.py +59 -0
  213. plynt-0.11.0/src/plynt/connectors/llm/adapters/__init__.py +43 -0
  214. plynt-0.11.0/src/plynt/connectors/llm/adapters/anthropic.py +628 -0
  215. plynt-0.11.0/src/plynt/connectors/llm/adapters/base.py +176 -0
  216. plynt-0.11.0/src/plynt/connectors/llm/adapters/openai.py +918 -0
  217. plynt-0.11.0/src/plynt/connectors/llm/models.py +264 -0
  218. plynt-0.11.0/src/plynt/connectors/llm/service.py +593 -0
  219. plynt-0.11.0/src/plynt/connectors/salesforce/__init__.py +203 -0
  220. plynt-0.11.0/src/plynt/connectors/salesforce/agent.py +201 -0
  221. plynt-0.11.0/src/plynt/connectors/salesforce/ai.py +252 -0
  222. plynt-0.11.0/src/plynt/connectors/salesforce/apex.py +92 -0
  223. plynt-0.11.0/src/plynt/connectors/salesforce/auth/__init__.py +49 -0
  224. plynt-0.11.0/src/plynt/connectors/salesforce/auth/bearer.py +217 -0
  225. plynt-0.11.0/src/plynt/connectors/salesforce/auth/credentials.py +60 -0
  226. plynt-0.11.0/src/plynt/connectors/salesforce/auth/mixins.py +109 -0
  227. plynt-0.11.0/src/plynt/connectors/salesforce/auth/password.py +87 -0
  228. plynt-0.11.0/src/plynt/connectors/salesforce/auth/session.py +40 -0
  229. plynt-0.11.0/src/plynt/connectors/salesforce/bulk/__init__.py +27 -0
  230. plynt-0.11.0/src/plynt/connectors/salesforce/bulk/service.py +932 -0
  231. plynt-0.11.0/src/plynt/connectors/salesforce/cdc/__init__.py +53 -0
  232. plynt-0.11.0/src/plynt/connectors/salesforce/cdc/_bitmap.py +190 -0
  233. plynt-0.11.0/src/plynt/connectors/salesforce/cdc/_proto/README.md +33 -0
  234. plynt-0.11.0/src/plynt/connectors/salesforce/cdc/_proto/SOURCE.md +20 -0
  235. plynt-0.11.0/src/plynt/connectors/salesforce/cdc/_proto/__init__.py +5 -0
  236. plynt-0.11.0/src/plynt/connectors/salesforce/cdc/_proto/pubsub_api.proto +413 -0
  237. plynt-0.11.0/src/plynt/connectors/salesforce/cdc/_proto/pubsub_api_pb2.py +75 -0
  238. plynt-0.11.0/src/plynt/connectors/salesforce/cdc/_proto/pubsub_api_pb2_grpc.py +422 -0
  239. plynt-0.11.0/src/plynt/connectors/salesforce/cdc/auth.py +100 -0
  240. plynt-0.11.0/src/plynt/connectors/salesforce/cdc/avro.py +87 -0
  241. plynt-0.11.0/src/plynt/connectors/salesforce/cdc/checkpoint.py +80 -0
  242. plynt-0.11.0/src/plynt/connectors/salesforce/cdc/errors.py +44 -0
  243. plynt-0.11.0/src/plynt/connectors/salesforce/cdc/models.py +109 -0
  244. plynt-0.11.0/src/plynt/connectors/salesforce/cdc/pubsub.py +436 -0
  245. plynt-0.11.0/src/plynt/connectors/salesforce/cdc/service.py +846 -0
  246. plynt-0.11.0/src/plynt/connectors/salesforce/client.py +368 -0
  247. plynt-0.11.0/src/plynt/connectors/salesforce/composite.py +370 -0
  248. plynt-0.11.0/src/plynt/connectors/salesforce/constants.py +65 -0
  249. plynt-0.11.0/src/plynt/connectors/salesforce/errors.py +362 -0
  250. plynt-0.11.0/src/plynt/connectors/salesforce/facade.py +428 -0
  251. plynt-0.11.0/src/plynt/connectors/salesforce/helpers.py +270 -0
  252. plynt-0.11.0/src/plynt/connectors/salesforce/identity/__init__.py +13 -0
  253. plynt-0.11.0/src/plynt/connectors/salesforce/identity/service.py +496 -0
  254. plynt-0.11.0/src/plynt/connectors/salesforce/lookup/__init__.py +65 -0
  255. plynt-0.11.0/src/plynt/connectors/salesforce/lookup/base.py +173 -0
  256. plynt-0.11.0/src/plynt/connectors/salesforce/lookup/factory.py +90 -0
  257. plynt-0.11.0/src/plynt/connectors/salesforce/lookup/pricebook.py +105 -0
  258. plynt-0.11.0/src/plynt/connectors/salesforce/lookup/profile.py +130 -0
  259. plynt-0.11.0/src/plynt/connectors/salesforce/lookup/queue.py +134 -0
  260. plynt-0.11.0/src/plynt/connectors/salesforce/lookup/record_type.py +111 -0
  261. plynt-0.11.0/src/plynt/connectors/salesforce/lookup/types.py +15 -0
  262. plynt-0.11.0/src/plynt/connectors/salesforce/lookup/user.py +108 -0
  263. plynt-0.11.0/src/plynt/connectors/salesforce/metadata.py +319 -0
  264. plynt-0.11.0/src/plynt/connectors/salesforce/models/__init__.py +63 -0
  265. plynt-0.11.0/src/plynt/connectors/salesforce/models/schemas.py +611 -0
  266. plynt-0.11.0/src/plynt/connectors/salesforce/query/__init__.py +17 -0
  267. plynt-0.11.0/src/plynt/connectors/salesforce/query/service.py +694 -0
  268. plynt-0.11.0/src/plynt/connectors/salesforce/renderer.py +61 -0
  269. plynt-0.11.0/src/plynt/connectors/salesforce/search.py +134 -0
  270. plynt-0.11.0/src/plynt/connectors/salesforce/settings.py +101 -0
  271. plynt-0.11.0/src/plynt/connectors/salesforce/sobject/__init__.py +15 -0
  272. plynt-0.11.0/src/plynt/connectors/salesforce/sobject/service.py +732 -0
  273. plynt-0.11.0/src/plynt/connectors/salesforce/utility.py +445 -0
  274. plynt-0.11.0/src/plynt/grpc/__init__.py +33 -0
  275. plynt-0.11.0/src/plynt/grpc/client.py +302 -0
  276. plynt-0.11.0/src/plynt/grpc/errors.py +35 -0
  277. plynt-0.11.0/src/plynt/grpc/handler.py +22 -0
  278. plynt-0.11.0/src/plynt/grpc/interceptor.py +18 -0
  279. plynt-0.11.0/src/plynt/grpc/protobuf.py +73 -0
  280. plynt-0.11.0/src/plynt/grpc/settings.py +23 -0
  281. plynt-0.11.0/src/plynt/grpc/transport.py +296 -0
  282. plynt-0.11.0/src/plynt/http/__init__.py +93 -0
  283. plynt-0.11.0/src/plynt/http/auth.py +377 -0
  284. plynt-0.11.0/src/plynt/http/client.py +749 -0
  285. plynt-0.11.0/src/plynt/http/errors.py +464 -0
  286. plynt-0.11.0/src/plynt/http/mapping.py +47 -0
  287. plynt-0.11.0/src/plynt/http/middleware/__init__.py +40 -0
  288. plynt-0.11.0/src/plynt/http/middleware/auth/__init__.py +61 -0
  289. plynt-0.11.0/src/plynt/http/middleware/auth/basic.py +88 -0
  290. plynt-0.11.0/src/plynt/http/middleware/auth/bearer.py +81 -0
  291. plynt-0.11.0/src/plynt/http/middleware/auth/oauth2.py +853 -0
  292. plynt-0.11.0/src/plynt/http/policies.py +67 -0
  293. plynt-0.11.0/src/plynt/http/renderer.py +121 -0
  294. plynt-0.11.0/src/plynt/http/response.py +131 -0
  295. plynt-0.11.0/src/plynt/http/service.py +176 -0
  296. plynt-0.11.0/src/plynt/http/settings.py +303 -0
  297. plynt-0.11.0/src/plynt/http/transport.py +696 -0
  298. plynt-0.11.0/src/plynt/log/__init__.py +45 -0
  299. plynt-0.11.0/src/plynt/log/filters.py +189 -0
  300. plynt-0.11.0/src/plynt/log/formatter.py +131 -0
  301. plynt-0.11.0/src/plynt/middleware/__init__.py +60 -0
  302. plynt-0.11.0/src/plynt/middleware/cache.py +163 -0
  303. plynt-0.11.0/src/plynt/middleware/circuit_breaker.py +159 -0
  304. plynt-0.11.0/src/plynt/middleware/header.py +149 -0
  305. plynt-0.11.0/src/plynt/middleware/logging.py +227 -0
  306. plynt-0.11.0/src/plynt/middleware/rate_limit.py +90 -0
  307. plynt-0.11.0/src/plynt/middleware/retry.py +301 -0
  308. plynt-0.11.0/src/plynt/middleware/throttle.py +313 -0
  309. plynt-0.11.0/src/plynt/testsupport/__init__.py +43 -0
  310. plynt-0.11.0/src/plynt/testsupport/vcr/README.md +501 -0
  311. plynt-0.11.0/src/plynt/testsupport/vcr/__init__.py +48 -0
  312. plynt-0.11.0/src/plynt/testsupport/vcr/config.py +64 -0
  313. plynt-0.11.0/src/plynt/testsupport/vcr/matchers.py +141 -0
  314. plynt-0.11.0/src/plynt/testsupport/vcr/middleware.py +77 -0
  315. plynt-0.11.0/src/plynt/testsupport/vcr/path.py +170 -0
  316. plynt-0.11.0/src/plynt/testsupport/vcr/py.typed +0 -0
  317. plynt-0.11.0/src/plynt/testsupport/vcr/serializer.py +94 -0
  318. plynt-0.11.0/src/plynt/testsupport/vcr/session.py +378 -0
  319. plynt-0.11.0/src/plynt.egg-info/PKG-INFO +188 -0
  320. plynt-0.11.0/src/plynt.egg-info/SOURCES.txt +470 -0
  321. plynt-0.11.0/src/plynt.egg-info/dependency_links.txt +1 -0
  322. plynt-0.11.0/src/plynt.egg-info/requires.txt +55 -0
  323. plynt-0.11.0/src/plynt.egg-info/scm_file_list.json +467 -0
  324. plynt-0.11.0/src/plynt.egg-info/scm_version.json +8 -0
  325. plynt-0.11.0/src/plynt.egg-info/top_level.txt +1 -0
  326. plynt-0.11.0/tests/__init__.py +1 -0
  327. plynt-0.11.0/tests/_mock/cassettes/connectors/salesforce/ai_smoke/salesforceaivcrsmoke/models_generate_chat__6b8ea57e.yaml +398 -0
  328. plynt-0.11.0/tests/_mock/cassettes/connectors/salesforce/ai_smoke/salesforceaivcrsmoke/models_generate_text__4321b893.yaml +398 -0
  329. plynt-0.11.0/tests/_mock/cassettes/connectors/salesforce/smoke/salesforcevcrsmoke/limits__eea7066d.yaml +670 -0
  330. plynt-0.11.0/tests/_mock/cassettes/connectors/salesforce/smoke/salesforcevcrsmoke/objects_catalog__b14b1071.yaml +7386 -0
  331. plynt-0.11.0/tests/_mock/cassettes/connectors/salesforce/smoke/salesforcevcrsmoke/query_accounts__58b98669.yaml +766 -0
  332. plynt-0.11.0/tests/_mock/cassettes/connectors/salesforce/smoke/salesforcevcrsmoke/query_org_metadata__a9358913.yaml +456 -0
  333. plynt-0.11.0/tests/_mock/cassettes/connectors/salesforce/smoke/salesforcevcrsmoke/quick_search__1101ee82.yaml +838 -0
  334. plynt-0.11.0/tests/_mock/cassettes/connectors/salesforce/smoke/salesforcevcrsmoke/versions__679797d3.yaml +576 -0
  335. plynt-0.11.0/tests/adapters/__init__.py +1 -0
  336. plynt-0.11.0/tests/adapters/django/__init__.py +1 -0
  337. plynt-0.11.0/tests/adapters/django/drf/__init__.py +1 -0
  338. plynt-0.11.0/tests/adapters/django/drf/test_drf_package.py +52 -0
  339. plynt-0.11.0/tests/adapters/django/drf/test_errors.py +378 -0
  340. plynt-0.11.0/tests/adapters/django/drf/test_headers.py +234 -0
  341. plynt-0.11.0/tests/adapters/django/drf/test_smoke.py +110 -0
  342. plynt-0.11.0/tests/adapters/django/drf/test_views.py +882 -0
  343. plynt-0.11.0/tests/adapters/django/test_cache.py +456 -0
  344. plynt-0.11.0/tests/adapters/django/test_django_package.py +42 -0
  345. plynt-0.11.0/tests/adapters/django/test_settings.py +127 -0
  346. plynt-0.11.0/tests/adapters/django/test_smoke.py +97 -0
  347. plynt-0.11.0/tests/adapters/django/test_transport.py +374 -0
  348. plynt-0.11.0/tests/adapters/fastapi/test_errors.py +91 -0
  349. plynt-0.11.0/tests/adapters/fastapi/test_fastapi_package.py +69 -0
  350. plynt-0.11.0/tests/adapters/fastapi/test_headers.py +75 -0
  351. plynt-0.11.0/tests/adapters/fastapi/test_lifespan.py +252 -0
  352. plynt-0.11.0/tests/adapters/fastapi/test_services.py +222 -0
  353. plynt-0.11.0/tests/base/__init__.py +1 -0
  354. plynt-0.11.0/tests/base/test_base.py +93 -0
  355. plynt-0.11.0/tests/base/test_base_package.py +65 -0
  356. plynt-0.11.0/tests/base/test_errors.py +142 -0
  357. plynt-0.11.0/tests/base/test_mapping.py +72 -0
  358. plynt-0.11.0/tests/base/test_middleware.py +264 -0
  359. plynt-0.11.0/tests/base/test_policies.py +91 -0
  360. plynt-0.11.0/tests/base/test_request.py +57 -0
  361. plynt-0.11.0/tests/base/test_response.py +488 -0
  362. plynt-0.11.0/tests/base/test_retry.py +56 -0
  363. plynt-0.11.0/tests/base/test_settings.py +46 -0
  364. plynt-0.11.0/tests/base/test_transport.py +649 -0
  365. plynt-0.11.0/tests/cache/__init__.py +0 -0
  366. plynt-0.11.0/tests/cache/test_cache.py +215 -0
  367. plynt-0.11.0/tests/cache/test_cachetools.py +117 -0
  368. plynt-0.11.0/tests/cache/test_dummy.py +77 -0
  369. plynt-0.11.0/tests/cache/test_locmem.py +184 -0
  370. plynt-0.11.0/tests/cache/test_redis.py +215 -0
  371. plynt-0.11.0/tests/conftest.py +124 -0
  372. plynt-0.11.0/tests/connectors/__init__.py +1 -0
  373. plynt-0.11.0/tests/connectors/llm/__init__.py +1 -0
  374. plynt-0.11.0/tests/connectors/llm/adapters/test_anthropic.py +789 -0
  375. plynt-0.11.0/tests/connectors/llm/adapters/test_base.py +126 -0
  376. plynt-0.11.0/tests/connectors/llm/adapters/test_openai.py +980 -0
  377. plynt-0.11.0/tests/connectors/llm/models/test_models.py +163 -0
  378. plynt-0.11.0/tests/connectors/llm/test_service.py +877 -0
  379. plynt-0.11.0/tests/connectors/salesforce/__init__.py +1 -0
  380. plynt-0.11.0/tests/connectors/salesforce/auth/__init__.py +1 -0
  381. plynt-0.11.0/tests/connectors/salesforce/auth/helpers.py +221 -0
  382. plynt-0.11.0/tests/connectors/salesforce/auth/test_bearer.py +240 -0
  383. plynt-0.11.0/tests/connectors/salesforce/auth/test_credentials.py +221 -0
  384. plynt-0.11.0/tests/connectors/salesforce/auth/test_password.py +107 -0
  385. plynt-0.11.0/tests/connectors/salesforce/auth/test_session.py +41 -0
  386. plynt-0.11.0/tests/connectors/salesforce/bulk/__init__.py +1 -0
  387. plynt-0.11.0/tests/connectors/salesforce/bulk/test_service.py +1339 -0
  388. plynt-0.11.0/tests/connectors/salesforce/cdc/__init__.py +1 -0
  389. plynt-0.11.0/tests/connectors/salesforce/cdc/test_auth.py +118 -0
  390. plynt-0.11.0/tests/connectors/salesforce/cdc/test_avro.py +169 -0
  391. plynt-0.11.0/tests/connectors/salesforce/cdc/test_bitmap.py +240 -0
  392. plynt-0.11.0/tests/connectors/salesforce/cdc/test_checkpoint.py +74 -0
  393. plynt-0.11.0/tests/connectors/salesforce/cdc/test_integration_grpc.py +456 -0
  394. plynt-0.11.0/tests/connectors/salesforce/cdc/test_models.py +194 -0
  395. plynt-0.11.0/tests/connectors/salesforce/cdc/test_pubsub.py +437 -0
  396. plynt-0.11.0/tests/connectors/salesforce/cdc/test_service.py +1285 -0
  397. plynt-0.11.0/tests/connectors/salesforce/conftest.py +197 -0
  398. plynt-0.11.0/tests/connectors/salesforce/identity/test_service.py +784 -0
  399. plynt-0.11.0/tests/connectors/salesforce/lookup/__init__.py +1 -0
  400. plynt-0.11.0/tests/connectors/salesforce/lookup/conftest.py +29 -0
  401. plynt-0.11.0/tests/connectors/salesforce/lookup/test_facade.py +73 -0
  402. plynt-0.11.0/tests/connectors/salesforce/lookup/test_pricebook.py +84 -0
  403. plynt-0.11.0/tests/connectors/salesforce/lookup/test_profile.py +129 -0
  404. plynt-0.11.0/tests/connectors/salesforce/lookup/test_queue.py +138 -0
  405. plynt-0.11.0/tests/connectors/salesforce/lookup/test_record_type.py +112 -0
  406. plynt-0.11.0/tests/connectors/salesforce/lookup/test_user.py +106 -0
  407. plynt-0.11.0/tests/connectors/salesforce/models/__init__.py +1 -0
  408. plynt-0.11.0/tests/connectors/salesforce/models/test_schemas.py +329 -0
  409. plynt-0.11.0/tests/connectors/salesforce/query/__init__.py +1 -0
  410. plynt-0.11.0/tests/connectors/salesforce/query/test_service.py +791 -0
  411. plynt-0.11.0/tests/connectors/salesforce/sobject/__init__.py +1 -0
  412. plynt-0.11.0/tests/connectors/salesforce/sobject/test_service.py +821 -0
  413. plynt-0.11.0/tests/connectors/salesforce/test_agent.py +268 -0
  414. plynt-0.11.0/tests/connectors/salesforce/test_ai.py +383 -0
  415. plynt-0.11.0/tests/connectors/salesforce/test_ai_smoke.py +182 -0
  416. plynt-0.11.0/tests/connectors/salesforce/test_apex.py +148 -0
  417. plynt-0.11.0/tests/connectors/salesforce/test_client.py +685 -0
  418. plynt-0.11.0/tests/connectors/salesforce/test_composite.py +433 -0
  419. plynt-0.11.0/tests/connectors/salesforce/test_constants.py +106 -0
  420. plynt-0.11.0/tests/connectors/salesforce/test_errors.py +270 -0
  421. plynt-0.11.0/tests/connectors/salesforce/test_helpers.py +317 -0
  422. plynt-0.11.0/tests/connectors/salesforce/test_metadata.py +370 -0
  423. plynt-0.11.0/tests/connectors/salesforce/test_renderer.py +123 -0
  424. plynt-0.11.0/tests/connectors/salesforce/test_salesforce_package.py +51 -0
  425. plynt-0.11.0/tests/connectors/salesforce/test_search.py +238 -0
  426. plynt-0.11.0/tests/connectors/salesforce/test_settings.py +51 -0
  427. plynt-0.11.0/tests/connectors/salesforce/test_smoke.py +277 -0
  428. plynt-0.11.0/tests/connectors/salesforce/test_throttle.py +200 -0
  429. plynt-0.11.0/tests/connectors/salesforce/test_utility.py +557 -0
  430. plynt-0.11.0/tests/distribution/test_installed.py +192 -0
  431. plynt-0.11.0/tests/grpc/test_client.py +418 -0
  432. plynt-0.11.0/tests/grpc/test_errors_interceptor.py +49 -0
  433. plynt-0.11.0/tests/grpc/test_protobuf.py +91 -0
  434. plynt-0.11.0/tests/grpc/test_settings.py +32 -0
  435. plynt-0.11.0/tests/grpc/test_transport.py +420 -0
  436. plynt-0.11.0/tests/http/__init__.py +0 -0
  437. plynt-0.11.0/tests/http/conftest.py +119 -0
  438. plynt-0.11.0/tests/http/middleware/__init__.py +0 -0
  439. plynt-0.11.0/tests/http/middleware/auth/__init__.py +0 -0
  440. plynt-0.11.0/tests/http/middleware/auth/test_basic.py +90 -0
  441. plynt-0.11.0/tests/http/middleware/auth/test_bearer.py +86 -0
  442. plynt-0.11.0/tests/http/middleware/auth/test_oauth2.py +1382 -0
  443. plynt-0.11.0/tests/http/test_auth.py +311 -0
  444. plynt-0.11.0/tests/http/test_client.py +710 -0
  445. plynt-0.11.0/tests/http/test_errors.py +325 -0
  446. plynt-0.11.0/tests/http/test_http_package.py +80 -0
  447. plynt-0.11.0/tests/http/test_mapping.py +92 -0
  448. plynt-0.11.0/tests/http/test_response.py +189 -0
  449. plynt-0.11.0/tests/http/test_retry.py +71 -0
  450. plynt-0.11.0/tests/http/test_service.py +418 -0
  451. plynt-0.11.0/tests/http/test_settings.py +393 -0
  452. plynt-0.11.0/tests/http/test_transport.py +1531 -0
  453. plynt-0.11.0/tests/log/__init__.py +1 -0
  454. plynt-0.11.0/tests/log/test_filters.py +254 -0
  455. plynt-0.11.0/tests/log/test_formatter.py +99 -0
  456. plynt-0.11.0/tests/middleware/__init__.py +0 -0
  457. plynt-0.11.0/tests/middleware/test_cache.py +653 -0
  458. plynt-0.11.0/tests/middleware/test_circuit_breaker.py +378 -0
  459. plynt-0.11.0/tests/middleware/test_header.py +267 -0
  460. plynt-0.11.0/tests/middleware/test_logging.py +326 -0
  461. plynt-0.11.0/tests/middleware/test_rate_limit.py +180 -0
  462. plynt-0.11.0/tests/middleware/test_retry.py +338 -0
  463. plynt-0.11.0/tests/middleware/test_throttle.py +618 -0
  464. plynt-0.11.0/tests/testsupport/__init__.py +1 -0
  465. plynt-0.11.0/tests/testsupport/vcr/__init__.py +1 -0
  466. plynt-0.11.0/tests/testsupport/vcr/_helpers.py +50 -0
  467. plynt-0.11.0/tests/testsupport/vcr/test_context.py +76 -0
  468. plynt-0.11.0/tests/testsupport/vcr/test_matchers.py +226 -0
  469. plynt-0.11.0/tests/testsupport/vcr/test_middleware.py +354 -0
  470. plynt-0.11.0/tests/testsupport/vcr/test_path.py +114 -0
  471. plynt-0.11.0/tests/testsupport/vcr/test_serializer.py +142 -0
  472. plynt-0.11.0/tests/testsupport/vcr/test_session.py +106 -0
@@ -0,0 +1,2 @@
1
+ # Default ownership for all files in this repository
2
+ * @eschaar
@@ -0,0 +1,37 @@
1
+ name: Bug report
2
+ description: Report a reproducible bug
3
+ labels: ["bug"]
4
+ body:
5
+ - type: textarea
6
+ id: summary
7
+ attributes:
8
+ label: Summary
9
+ description: What happened?
10
+ placeholder: A clear and concise description of the bug.
11
+ validations:
12
+ required: true
13
+
14
+ - type: textarea
15
+ id: steps
16
+ attributes:
17
+ label: Steps to reproduce
18
+ description: Exact steps to reproduce the issue.
19
+ placeholder: |
20
+ 1. ...
21
+ 2. ...
22
+ 3. ...
23
+ validations:
24
+ required: true
25
+
26
+ - type: textarea
27
+ id: expected
28
+ attributes:
29
+ label: Expected behavior
30
+ validations:
31
+ required: true
32
+
33
+ - type: textarea
34
+ id: environment
35
+ attributes:
36
+ label: Environment
37
+ description: Python version, OS, and any relevant details.
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Security vulnerability report
4
+ url: https://github.com/eschaar/plynt/security/advisories/new
5
+ about: Please report security issues privately via GitHub Security Advisories.
@@ -0,0 +1,25 @@
1
+ name: Feature request
2
+ description: Suggest an improvement
3
+ labels: ["enhancement"]
4
+ body:
5
+ - type: textarea
6
+ id: problem
7
+ attributes:
8
+ label: Problem statement
9
+ description: What user or developer problem does this solve?
10
+ validations:
11
+ required: true
12
+
13
+ - type: textarea
14
+ id: proposal
15
+ attributes:
16
+ label: Proposed solution
17
+ description: Describe your proposed approach.
18
+ validations:
19
+ required: true
20
+
21
+ - type: textarea
22
+ id: alternatives
23
+ attributes:
24
+ label: Alternatives considered
25
+ description: What alternatives did you consider?
@@ -0,0 +1,84 @@
1
+ name: Release smoke checklist
2
+ description: Verify release automation and publish safety for a real release
3
+ labels: ["release"]
4
+ body:
5
+ - type: input
6
+ id: target_version
7
+ attributes:
8
+ label: Target version
9
+ description: Planned release version (SemVer)
10
+ placeholder: 0.2.2
11
+ validations:
12
+ required: true
13
+
14
+ - type: dropdown
15
+ id: release_reason
16
+ attributes:
17
+ label: Release reason
18
+ description: Select why this release is being made
19
+ options:
20
+ - Feature delivery
21
+ - Bug fix
22
+ - Security fix
23
+ - Maintenance
24
+ - Other
25
+ validations:
26
+ required: true
27
+
28
+ - type: checkboxes
29
+ id: pre_release_checks
30
+ attributes:
31
+ label: Pre-release checks
32
+ description: Validate the baseline before merging the release PR
33
+ options:
34
+ - label: make check passed locally
35
+ required: true
36
+ - label: No manual version bump or manual git tag was created
37
+ required: true
38
+ - label: Release-please PR was reviewed and merged to main
39
+ required: true
40
+
41
+ - type: checkboxes
42
+ id: release_artifact_checks
43
+ attributes:
44
+ label: Release artifact checks
45
+ description: Confirm naming and generated artifacts
46
+ options:
47
+ - label: Git tag format is X.Y.Z (no v prefix)
48
+ required: true
49
+ - label: GitHub release title format is vX.Y.Z
50
+ required: true
51
+ - label: CHANGELOG entry exists for X.Y.Z
52
+ required: true
53
+
54
+ - type: checkboxes
55
+ id: publish_checks
56
+ attributes:
57
+ label: Publish checks
58
+ description: Validate publish workflow and guard settings
59
+ options:
60
+ - label: Publish workflow run succeeded for this release
61
+ required: true
62
+ - label: OIDC was used (no API token in workflow)
63
+ required: true
64
+ - label: ENABLE_PYPI_PUBLISH was intentionally set for this release path
65
+ required: true
66
+
67
+ - type: textarea
68
+ id: evidence
69
+ attributes:
70
+ label: Evidence links
71
+ description: Add links to PR, release page, and workflow runs
72
+ placeholder: |
73
+ - Release PR:
74
+ - GitHub release:
75
+ - Publish run:
76
+ - Verify run:
77
+ validations:
78
+ required: true
79
+
80
+ - type: textarea
81
+ id: notes
82
+ attributes:
83
+ label: Notes
84
+ description: Optional risks, follow-ups, or deviations
@@ -0,0 +1,16 @@
1
+ # Pull Request
2
+
3
+ ## Summary
4
+
5
+ <!-- What does this PR do? -->
6
+
7
+ ## Why
8
+
9
+ <!-- Why is this change needed? -->
10
+
11
+ ## Version impact
12
+
13
+ - [ ] None
14
+ - [ ] Patch
15
+ - [ ] Minor
16
+ - [ ] Major
@@ -0,0 +1,310 @@
1
+ # Copilot Instructions
2
+
3
+ These instructions define how GitHub Copilot and other AI agents must operate within this repository. They are aligned with the project's architecture, ADRs, and long-term goals.
4
+
5
+
6
+
7
+ ## Language, Documentation, and Coding Requirements
8
+
9
+ - All comments, docstrings, and documentation must be written in clear, developer-friendly English.
10
+ - Use language that is easy to understand for developers of varying backgrounds.
11
+ - All markdown files must conform to markdown linting rules (e.g., blank lines around headings and lists, proper heading levels, no hard tabs, etc.).
12
+ - Keep documentation lines, comments, and docstrings concise: aim for 80 characters per line, and never exceed 120 characters per line.
13
+ - All code must use type hinting (type annotations) wherever possible, including function arguments, return types, and class attributes.
14
+ - All tests must be written using pytest (no unittest or nose). Use pytest idioms and fixtures.
15
+ - Prefer grouping tests in a class (e.g., TestSettings) that corresponds to the class under test.
16
+
17
+ ### Docstring style
18
+
19
+ Use **Google-style docstrings** throughout. Apply the following rules:
20
+
21
+ **Summary line**
22
+
23
+ - One sentence, imperative mood, no trailing period.
24
+ - Must stand alone — a reader should understand the purpose without reading
25
+ the body.
26
+ - Good: `"""Return the global SObject catalog for the org."""`
27
+ - Avoid: `"""This method returns..."""`
28
+
29
+ **When to add `Args:` / `Returns:` / `Raises:` sections**
30
+
31
+ Only add a section when it adds information not already expressed by the type
32
+ hints and parameter names. Omit it when the signature is self-explanatory.
33
+
34
+ | Situation | Add section? |
35
+ | --- | --- |
36
+ | Parameter has non-trivial semantics (format, validation, side-effects) | Yes |
37
+ | Parameter name and type are self-explanatory | No |
38
+ | Return type is a typed model and the summary says what it contains | No |
39
+ | Return has subtle behaviour (e.g. `None` on 204, pagination semantics) | Yes |
40
+ | Function always raises under a specific condition | Yes (`Raises:`) |
41
+ | Private / internal method | No — one-liner only |
42
+
43
+ **`Args:` format**
44
+
45
+ ```python
46
+ Args:
47
+ record_id: Salesforce 15- or 18-character record ID.
48
+ fields: Field API names to include. Returns all fields when omitted.
49
+ ```
50
+
51
+ - One line per parameter where possible.
52
+ - No Sphinx cross-references (`:class:`, `:meth:`, `:attr:`).
53
+ - Use plain names: `SalesforceQueryResponse`, not
54
+ `:class:`~plynt.connectors.salesforce.models.SalesforceQueryResponse``.
55
+
56
+ **`Returns:` format**
57
+
58
+ ```python
59
+ Returns:
60
+ Parsed query response with a ``records`` list and pagination state.
61
+ ```
62
+
63
+ - Describe the value, not the type — the type is already in the signature.
64
+ - Never repeat the class name as the sole content.
65
+
66
+ **`Example::` blocks**
67
+
68
+ - Add only on public API methods where usage is non-obvious.
69
+ - Omit on private methods, simple getters, and one-liners.
70
+ - Keep examples short — 4–8 lines maximum.
71
+
72
+ **Class docstrings**
73
+
74
+ - Describe the responsibility of the class, not its constructor.
75
+ - Put constructor parameter docs on the class docstring, not on `__init__`.
76
+ - Keep `__init__` docstrings to a single line or omit them entirely.
77
+
78
+ **What to avoid**
79
+
80
+ - Sphinx cross-reference syntax (`:class:`, `:meth:`, `:attr:`, `:param:`).
81
+ - Restating the type hint in prose: `"Returns a str"` when `-> str` is present.
82
+ - Long `Returns:` blocks that copy the class definition.
83
+ - Docstrings on private helpers (`_method`) longer than one line.
84
+
85
+ ---
86
+
87
+ ## 1. Project Intent & Scope
88
+
89
+ - Treat this repository as a framework-agnostic external API client library.
90
+ - Prioritize long-term reuse and architectural consistency over short-term feature delivery or local optimizations.
91
+ - When in doubt, defer to existing ADRs and design documentation.
92
+
93
+ ## 2. Architectural Decision Records (ADRs)
94
+
95
+ - Always consult ADRs before making architectural or structural changes.
96
+ - Do **not** override or reinterpret an accepted ADR.
97
+ - If a required decision is missing or unclear:
98
+ - Flag the gap.
99
+ - Propose a new ADR instead of making assumptions.
100
+ - Reference ADR identifiers (e.g., ADR-003) in code comments and commit messages.
101
+
102
+ ## 3. Core vs Optional Components
103
+
104
+ - Treat the core package as minimal and framework-independent.
105
+ - Do **not** introduce framework dependencies into the core.
106
+ - All framework-specific functionality must live in optional modules.
107
+ - Respect the modular installation model (extras such as `[django]`, `[fastapi]`, `[oauth]`).
108
+ - Assume users may install only a subset of the package.
109
+
110
+ ## 4. Dependency Management Principles
111
+
112
+ - Keep core dependencies minimal and stable.
113
+ - Avoid introducing new dependencies without architectural justification.
114
+ - When adding a dependency:
115
+ - Document the rationale.
116
+ - Assess impact on optional installs.
117
+ - Reference or propose an ADR.
118
+ - Prefer standard library solutions when feasible.
119
+
120
+ ## 5. Sync and Async Design Constraints
121
+
122
+ - Treat sync vs async as a transport concern only.
123
+ - Services, models, and responses must remain execution-model agnostic.
124
+ - Never duplicate business logic for sync and async paths.
125
+ - Follow documented transport abstractions.
126
+
127
+ ## 6. Composition Over Inheritance
128
+
129
+ - Prefer composition, explicit objects, and small interfaces.
130
+ - Avoid deep inheritance hierarchies or “god base classes.”
131
+ - Do **not** introduce implicit behavior via magic methods.
132
+ - Align with documented architectural patterns.
133
+
134
+ ## 7. Service Layer Responsibilities
135
+
136
+ - Services represent external domains or APIs.
137
+ - Services:
138
+ - Define endpoints.
139
+ - Orchestrate requests.
140
+ - Select response models.
141
+ - Services must **not**:
142
+ - Manage HTTP internals.
143
+ - Manage framework concerns.
144
+ - Perform I/O outside the client abstraction.
145
+
146
+ ## 8. Response and Error Handling
147
+
148
+ - Centralize response parsing and error handling.
149
+ - Avoid leaking raw HTTP responses outside the response layer.
150
+ - Use typed response models consistently.
151
+ - Do **not** implement ad-hoc error handling inside services or frameworks.
152
+
153
+ ## 9. Models and Validation
154
+
155
+ - Models are data carriers only.
156
+ - No business logic inside models.
157
+ - Models must remain framework-independent.
158
+ - Reuse models across services, framework adapters, and tests.
159
+ - Follow documented validation and serialization rules.
160
+
161
+ ## 10. Authentication and Caching
162
+
163
+ - Authentication must be pluggable, optional, and non-intrusive.
164
+ - Do **not** hard-code authentication logic into services.
165
+ - Token and response caching must:
166
+ - Be explicitly enabled.
167
+ - Use abstract cache interfaces.
168
+ - Framework-specific caches must be implemented via adapters.
169
+
170
+ ## 11. Framework Integrations
171
+
172
+ - Framework integrations (Django, FastAPI, etc.) must:
173
+ - Be thin adapters.
174
+ - Avoid duplicating core logic.
175
+ - Only depend on the core through public interfaces.
176
+ - No framework assumptions may leak back into the core.
177
+
178
+ ## 12. Testing and Mocking Expectations
179
+
180
+ - Design all code to be testable without real network calls.
181
+ - Avoid global state and singletons.
182
+ - Prefer HTTP-level mocking over service stubbing.
183
+ - Follow documented testing conventions and tooling.
184
+
185
+ ## 13. Documentation-Driven Development
186
+
187
+ - When behavior is unclear:
188
+ - Search for existing documentation.
189
+ - Reference ADRs, README, or design docs.
190
+ - If documentation is missing or outdated:
191
+ - Note the discrepancy.
192
+ - Suggest documentation updates.
193
+ - Do **not** “invent” undocumented behavior.
194
+
195
+ ## 14. Code Generation & Refactoring Behavior
196
+
197
+ - Favor small, incremental changes.
198
+ - Keep changes aligned with existing patterns.
199
+ - Avoid large refactors without architectural context.
200
+ - Always preserve backward compatibility unless explicitly instructed otherwise.
201
+
202
+ ## 15. Decision Escalation Rules
203
+
204
+ - If a change impacts:
205
+ - Public APIs
206
+ - Dependency structure
207
+ - Installation model
208
+ - Core abstractions
209
+ → Stop and request an architectural decision.
210
+ - Do **not** silently introduce breaking changes.
211
+
212
+ ## 16. Branch Workflow Safety
213
+
214
+ - Do **not** commit directly to `main` or `master` unless the user explicitly
215
+ approves this in the current conversation.
216
+ - Implement new functionality on a dedicated branch first.
217
+ - Before starting work on a branch name, check whether that branch already
218
+ exists on the remote and whether it has already been merged.
219
+ - If a branch has already been merged remotely, do not reuse it for new work;
220
+ create a new branch.
221
+
222
+ ## 17. Repo Operating Profile
223
+
224
+ Use this profile for day-to-day implementation decisions in this repository.
225
+
226
+ ### 17.1 Source Boundaries
227
+
228
+ - Core framework-agnostic code lives in `src/plynt/base`, `src/plynt/http`,
229
+ `src/plynt/middleware`, and `src/plynt/cache`.
230
+ - Connector-specific code lives under `src/plynt/connectors/*`.
231
+ - `src/plynt/connectors/salesforce` is the active validation connector.
232
+ - Keep connector-to-connector dependencies out of scope.
233
+ - If shared behavior is needed, move it to a neutral core abstraction.
234
+
235
+ ### 17.2 Canonical Local Commands
236
+
237
+ - Bootstrap: `make install`
238
+ - Full local gate: `make check`
239
+ - Lint only: `make lint`
240
+ - Tests only: `make unittests`
241
+ - Full test matrix: `make test-all`
242
+ - Coverage report: `make coverage`
243
+
244
+ When validating focused changes, prefer targeted pytest runs first, then run
245
+ `make check` before final handoff.
246
+
247
+ ### 17.3 Testing Conventions
248
+
249
+ - Use pytest test classes that map to the unit under test where practical.
250
+ - Prefer HTTP-level mocking over service stubbing.
251
+ - Keep tests deterministic and avoid time- or network-dependent flakiness.
252
+ - For connector additions, maintain sync and async parity in both code and
253
+ tests.
254
+
255
+ ### 17.4 AI Connector Track Rules
256
+
257
+ - `plynt.connectors.llm` and Salesforce AI services may progress in parallel.
258
+ - Do not make the LLM connector depend on Salesforce internals.
259
+ - Do not make Salesforce AI services depend on `plynt.connectors.llm`.
260
+ - Share only transport, streaming, middleware, and typed core abstractions.
261
+
262
+ ### 17.5 ADR Trigger Checklist
263
+
264
+ Stop and request an ADR before implementation if the change affects:
265
+
266
+ - Public API shape or compatibility promises
267
+ - Dependency model (including new runtime dependencies)
268
+ - Installation extras or package extraction boundaries
269
+ - Transport contracts (HTTP, streaming, gRPC, SOAP)
270
+ - Core abstraction responsibilities across layers
271
+
272
+ ### 17.6 Local Tooling Artifacts
273
+
274
+ - Local vstack artifacts may exist for developer workflow support.
275
+ - Do not commit local-only generated vstack artifacts unless explicitly
276
+ requested for repository governance.
277
+ - Keep `.gitignore` aligned so local vstack output stays out of commits by
278
+ default.
279
+
280
+ ---
281
+
282
+ ## 🧭 Meta-Instruction for Copilot and AI Agents
283
+
284
+ - Act as an architectural contributor, not just a code generator.
285
+ - Prefer referencing decisions, documentation, and constraints over guessing intent.
286
+ - When uncertain, surface questions and propose ADRs instead of making assumptions.
287
+
288
+ ### Python file/module naming conventions
289
+
290
+ - Use the singular form for modules (files) that define a single main concept (e.g., `request.py`, `response.py`, `client.py`).
291
+ - Use the plural form for modules that contain a collection of related objects or utilities (e.g., `errors.py`, `settings.py`, `utils.py`).
292
+ - Classes are always singular (e.g., `Request`, `Response`, `User`).
293
+ - Packages (folders) are usually plural if they contain a collection (e.g., `models`, `services`), but singular is allowed if it fits the domain.
294
+ - Follow the conventions of the Python standard library and popular frameworks for consistency.
295
+
296
+ > Example: `request.py` and `response.py` for single data carriers; `errors.py` for multiple error types.
297
+
298
+ ### Class naming length and consistency
299
+
300
+ - Before naming a new public class, check sibling classes already exported in
301
+ the same module's `__all__` and follow their established
302
+ `<Adjective><Domain><Concept>` pattern instead of inventing a new shape.
303
+ - Avoid redundant words that repeat what a wrapped protocol or base type
304
+ already conveys (e.g. prefer `CacheSalesforceCDCCheckpointStore` over
305
+ `CacheBackendSalesforceCDCCheckpointStore` when the sibling
306
+ `InMemorySalesforceCDCCheckpointStore` already sets the pattern).
307
+ - Renaming an already-exported public symbol touches the defining module, the
308
+ package `__init__.py` (import and `__all__`), tests, and any docs/how-to
309
+ examples referencing it. Grep the repository for the old name before
310
+ declaring a rename complete.
@@ -0,0 +1,41 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "pip"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ assignees:
8
+ - "eschaar"
9
+ open-pull-requests-limit: 5
10
+ labels:
11
+ - "dependencies"
12
+ - "python"
13
+ commit-message:
14
+ prefix: "chore(deps)"
15
+ groups:
16
+ pip-patch-minor:
17
+ patterns:
18
+ - "*"
19
+ update-types:
20
+ - "patch"
21
+ - "minor"
22
+
23
+ - package-ecosystem: "github-actions"
24
+ directory: "/"
25
+ schedule:
26
+ interval: "daily"
27
+ assignees:
28
+ - "eschaar"
29
+ open-pull-requests-limit: 5
30
+ labels:
31
+ - "dependencies"
32
+ - "github-actions"
33
+ commit-message:
34
+ prefix: "chore(ci)"
35
+ groups:
36
+ gha-patch-minor:
37
+ patterns:
38
+ - "*"
39
+ update-types:
40
+ - "patch"
41
+ - "minor"
@@ -0,0 +1,128 @@
1
+ # Automerge workflow.
2
+ # Purpose: automatically merge safe Dependabot pull requests without manual review.
3
+ # Policy: auto-merge is enabled for:
4
+ # - github-actions ecosystem: patch and minor version updates
5
+ # - pip ecosystem: patch version updates only
6
+ # Major version bumps and non-Dependabot PRs are never auto-merged.
7
+ # Requires the repository setting "Allow auto-merge" to be enabled.
8
+ name: "Dependabot Safe Auto-merge for Patch and Minor Updates"
9
+
10
+ on:
11
+ pull_request_target:
12
+ branches:
13
+ - main
14
+ types:
15
+ - opened
16
+ - synchronize
17
+ - reopened
18
+
19
+ permissions:
20
+ contents: write
21
+ pull-requests: write
22
+
23
+ jobs:
24
+ auto-merge:
25
+ if: github.actor == 'dependabot[bot]'
26
+ runs-on: ubuntu-latest
27
+
28
+ steps:
29
+ - name: Fetch Dependabot metadata
30
+ id: metadata
31
+ uses: dependabot/fetch-metadata@v3
32
+ with:
33
+ github-token: ${{ secrets.GITHUB_TOKEN }}
34
+
35
+ - name: Decide if this PR is eligible
36
+ id: decision
37
+ env:
38
+ PACKAGE_ECOSYSTEM: ${{ steps.metadata.outputs.package-ecosystem }}
39
+ UPDATE_TYPE: ${{ steps.metadata.outputs.update-type }}
40
+ run: |
41
+ should_automerge=false
42
+
43
+ if [[ "$PACKAGE_ECOSYSTEM" == "github-actions" ]]; then
44
+ if [[ "$UPDATE_TYPE" == "version-update:semver-patch" || "$UPDATE_TYPE" == "version-update:semver-minor" ]]; then
45
+ should_automerge=true
46
+ fi
47
+ fi
48
+
49
+ if [[ "$PACKAGE_ECOSYSTEM" == "pip" ]]; then
50
+ if [[ "$UPDATE_TYPE" == "version-update:semver-patch" ]]; then
51
+ should_automerge=true
52
+ fi
53
+ fi
54
+
55
+ echo "should_automerge=$should_automerge" >> "$GITHUB_OUTPUT"
56
+ echo "package_ecosystem=$PACKAGE_ECOSYSTEM" >> "$GITHUB_OUTPUT"
57
+ echo "update_type=$UPDATE_TYPE" >> "$GITHUB_OUTPUT"
58
+
59
+ - name: Approve eligible PR
60
+ if: steps.decision.outputs.should_automerge == 'true'
61
+ uses: actions/github-script@v9
62
+ with:
63
+ github-token: ${{ secrets.GITHUB_TOKEN }}
64
+ script: |
65
+ await github.rest.pulls.createReview({
66
+ owner: context.repo.owner,
67
+ repo: context.repo.repo,
68
+ pull_number: context.payload.pull_request.number,
69
+ event: "APPROVE",
70
+ body: "Auto-approved for safe Dependabot update policy."
71
+ })
72
+
73
+ - name: Update branch for eligible PR
74
+ if: steps.decision.outputs.should_automerge == 'true'
75
+ uses: actions/github-script@v9
76
+ with:
77
+ github-token: ${{ secrets.GITHUB_TOKEN }}
78
+ script: |
79
+ // Intentional strategy:
80
+ // - Always request an update for eligible PRs instead of pre-checking merge state.
81
+ // - GitHub may report transient/unknown merge state during event handling.
82
+ // - updateBranch is idempotent; if already current, GitHub returns a benign 422/no-op.
83
+ // This keeps automerge flow deterministic without relying on flaky preconditions.
84
+ try {
85
+ await github.rest.pulls.updateBranch({
86
+ owner: context.repo.owner,
87
+ repo: context.repo.repo,
88
+ pull_number: context.payload.pull_request.number
89
+ })
90
+ core.info("Requested branch update from base branch.")
91
+ } catch (error) {
92
+ const msg = String(error.message || "")
93
+ if (error.status === 422 || msg.includes("not behind")) {
94
+ // Expected no-op path when branch is already up to date.
95
+ core.info("Branch already up to date; continuing.")
96
+ } else {
97
+ core.setFailed("Could not update branch before automerge. " + msg)
98
+ }
99
+ }
100
+
101
+ - name: Enable auto-merge for eligible PR
102
+ if: steps.decision.outputs.should_automerge == 'true'
103
+ uses: actions/github-script@v9
104
+ with:
105
+ github-token: ${{ secrets.GITHUB_TOKEN }}
106
+ script: |
107
+ try {
108
+ await github.graphql(
109
+ `mutation($pullRequestId: ID!) {
110
+ enablePullRequestAutoMerge(input: {pullRequestId: $pullRequestId, mergeMethod: SQUASH}) {
111
+ pullRequest { number }
112
+ }
113
+ }`,
114
+ { pullRequestId: context.payload.pull_request.node_id }
115
+ )
116
+ } catch (error) {
117
+ core.setFailed(
118
+ "Could not enable auto-merge. Ensure repository auto-merge is enabled and branch protections are satisfied.\n" +
119
+ error.message
120
+ )
121
+ }
122
+
123
+ - name: Log skipped PR
124
+ if: steps.decision.outputs.should_automerge != 'true'
125
+ run: |
126
+ echo "Automerge skipped by policy."
127
+ echo "ecosystem=${{ steps.decision.outputs.package_ecosystem }}"
128
+ echo "update_type=${{ steps.decision.outputs.update_type }}"