epistola-client 0.13.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 (156) hide show
  1. epistola_client-0.13.0/.gitignore +16 -0
  2. epistola_client-0.13.0/CHANGELOG.md +45 -0
  3. epistola_client-0.13.0/PKG-INFO +146 -0
  4. epistola_client-0.13.0/README.md +125 -0
  5. epistola_client-0.13.0/generated/epistola_client_generated/__init__.py +292 -0
  6. epistola_client-0.13.0/generated/epistola_client_generated/api/__init__.py +18 -0
  7. epistola_client-0.13.0/generated/epistola_client_generated/api/attributes_api.py +1657 -0
  8. epistola_client-0.13.0/generated/epistola_client_generated/api/catalogs_api.py +1004 -0
  9. epistola_client-0.13.0/generated/epistola_client_generated/api/code_lists_api.py +2285 -0
  10. epistola_client-0.13.0/generated/epistola_client_generated/api/consumers_api.py +2528 -0
  11. epistola_client-0.13.0/generated/epistola_client_generated/api/environments_api.py +1585 -0
  12. epistola_client-0.13.0/generated/epistola_client_generated/api/fonts_api.py +697 -0
  13. epistola_client-0.13.0/generated/epistola_client_generated/api/generation_api.py +3080 -0
  14. epistola_client-0.13.0/generated/epistola_client_generated/api/stencils_api.py +4430 -0
  15. epistola_client-0.13.0/generated/epistola_client_generated/api/system_api.py +311 -0
  16. epistola_client-0.13.0/generated/epistola_client_generated/api/templates_api.py +2009 -0
  17. epistola_client-0.13.0/generated/epistola_client_generated/api/tenants_api.py +1515 -0
  18. epistola_client-0.13.0/generated/epistola_client_generated/api/themes_api.py +1677 -0
  19. epistola_client-0.13.0/generated/epistola_client_generated/api/variants_api.py +3702 -0
  20. epistola_client-0.13.0/generated/epistola_client_generated/api/versions_api.py +1843 -0
  21. epistola_client-0.13.0/generated/epistola_client_generated/api_client.py +804 -0
  22. epistola_client-0.13.0/generated/epistola_client_generated/api_response.py +21 -0
  23. epistola_client-0.13.0/generated/epistola_client_generated/configuration.py +617 -0
  24. epistola_client-0.13.0/generated/epistola_client_generated/exceptions.py +219 -0
  25. epistola_client-0.13.0/generated/epistola_client_generated/models/__init__.py +125 -0
  26. epistola_client-0.13.0/generated/epistola_client_generated/models/activation_dto.py +102 -0
  27. epistola_client-0.13.0/generated/epistola_client_generated/models/activation_list_response.py +95 -0
  28. epistola_client-0.13.0/generated/epistola_client_generated/models/approve_consumer_request.py +99 -0
  29. epistola_client-0.13.0/generated/epistola_client_generated/models/attribute_dto.py +146 -0
  30. epistola_client-0.13.0/generated/epistola_client_generated/models/attribute_dto_code_list_binding.py +89 -0
  31. epistola_client-0.13.0/generated/epistola_client_generated/models/attribute_list_response.py +101 -0
  32. epistola_client-0.13.0/generated/epistola_client_generated/models/batch_generation_item.py +178 -0
  33. epistola_client-0.13.0/generated/epistola_client_generated/models/block_style_preset_dto.py +91 -0
  34. epistola_client-0.13.0/generated/epistola_client_generated/models/catalog_dto.py +119 -0
  35. epistola_client-0.13.0/generated/epistola_client_generated/models/catalog_list_response.py +101 -0
  36. epistola_client-0.13.0/generated/epistola_client_generated/models/catalog_upgrade_diff.py +110 -0
  37. epistola_client-0.13.0/generated/epistola_client_generated/models/code_list_dto.py +177 -0
  38. epistola_client-0.13.0/generated/epistola_client_generated/models/code_list_entries_response.py +95 -0
  39. epistola_client-0.13.0/generated/epistola_client_generated/models/code_list_entry_dto.py +93 -0
  40. epistola_client-0.13.0/generated/epistola_client_generated/models/code_list_list_response.py +101 -0
  41. epistola_client-0.13.0/generated/epistola_client_generated/models/collect_meta.py +99 -0
  42. epistola_client-0.13.0/generated/epistola_client_generated/models/collect_request.py +95 -0
  43. epistola_client-0.13.0/generated/epistola_client_generated/models/consumer_dto.py +197 -0
  44. epistola_client-0.13.0/generated/epistola_client_generated/models/consumer_list_response.py +101 -0
  45. epistola_client-0.13.0/generated/epistola_client_generated/models/consumer_node_dto.py +99 -0
  46. epistola_client-0.13.0/generated/epistola_client_generated/models/consumer_permissions.py +193 -0
  47. epistola_client-0.13.0/generated/epistola_client_generated/models/create_attribute_request.py +112 -0
  48. epistola_client-0.13.0/generated/epistola_client_generated/models/create_attribute_request_code_list_binding.py +89 -0
  49. epistola_client-0.13.0/generated/epistola_client_generated/models/create_code_list_request.py +149 -0
  50. epistola_client-0.13.0/generated/epistola_client_generated/models/create_environment_request.py +97 -0
  51. epistola_client-0.13.0/generated/epistola_client_generated/models/create_stencil_request.py +114 -0
  52. epistola_client-0.13.0/generated/epistola_client_generated/models/create_stencil_version_request.py +98 -0
  53. epistola_client-0.13.0/generated/epistola_client_generated/models/create_template_request.py +99 -0
  54. epistola_client-0.13.0/generated/epistola_client_generated/models/create_tenant_request.py +97 -0
  55. epistola_client-0.13.0/generated/epistola_client_generated/models/create_theme_request.py +124 -0
  56. epistola_client-0.13.0/generated/epistola_client_generated/models/create_variant_request.py +106 -0
  57. epistola_client-0.13.0/generated/epistola_client_generated/models/data_example_dto.py +91 -0
  58. epistola_client-0.13.0/generated/epistola_client_generated/models/data_model_validation_error.py +89 -0
  59. epistola_client-0.13.0/generated/epistola_client_generated/models/data_model_validation_problem_detail.py +114 -0
  60. epistola_client-0.13.0/generated/epistola_client_generated/models/document_dto.py +141 -0
  61. epistola_client-0.13.0/generated/epistola_client_generated/models/document_generation_item_dto.py +187 -0
  62. epistola_client-0.13.0/generated/epistola_client_generated/models/document_generation_job_dto.py +138 -0
  63. epistola_client-0.13.0/generated/epistola_client_generated/models/document_list_response.py +101 -0
  64. epistola_client-0.13.0/generated/epistola_client_generated/models/environment_dto.py +109 -0
  65. epistola_client-0.13.0/generated/epistola_client_generated/models/environment_list_response.py +101 -0
  66. epistola_client-0.13.0/generated/epistola_client_generated/models/font_dto.py +141 -0
  67. epistola_client-0.13.0/generated/epistola_client_generated/models/font_list_response.py +101 -0
  68. epistola_client-0.13.0/generated/epistola_client_generated/models/font_variant_dto.py +90 -0
  69. epistola_client-0.13.0/generated/epistola_client_generated/models/generate_batch_request.py +103 -0
  70. epistola_client-0.13.0/generated/epistola_client_generated/models/generate_document_request.py +178 -0
  71. epistola_client-0.13.0/generated/epistola_client_generated/models/generation_job_detail.py +101 -0
  72. epistola_client-0.13.0/generated/epistola_client_generated/models/generation_job_list_response.py +101 -0
  73. epistola_client-0.13.0/generated/epistola_client_generated/models/generation_job_response.py +111 -0
  74. epistola_client-0.13.0/generated/epistola_client_generated/models/generation_result.py +174 -0
  75. epistola_client-0.13.0/generated/epistola_client_generated/models/import_catalog_response.py +99 -0
  76. epistola_client-0.13.0/generated/epistola_client_generated/models/import_template_result_dto.py +107 -0
  77. epistola_client-0.13.0/generated/epistola_client_generated/models/margins_dto.py +94 -0
  78. epistola_client-0.13.0/generated/epistola_client_generated/models/node_dto.py +98 -0
  79. epistola_client-0.13.0/generated/epistola_client_generated/models/page_meta.py +93 -0
  80. epistola_client-0.13.0/generated/epistola_client_generated/models/page_settings_dto.py +117 -0
  81. epistola_client-0.13.0/generated/epistola_client_generated/models/partition_assignment.py +98 -0
  82. epistola_client-0.13.0/generated/epistola_client_generated/models/ping_request.py +92 -0
  83. epistola_client-0.13.0/generated/epistola_client_generated/models/pong_details_dto.py +97 -0
  84. epistola_client-0.13.0/generated/epistola_client_generated/models/pong_response.py +103 -0
  85. epistola_client-0.13.0/generated/epistola_client_generated/models/preview_document_request.py +157 -0
  86. epistola_client-0.13.0/generated/epistola_client_generated/models/problem_detail.py +95 -0
  87. epistola_client-0.13.0/generated/epistola_client_generated/models/publish_version_request.py +95 -0
  88. epistola_client-0.13.0/generated/epistola_client_generated/models/register_consumer_request.py +109 -0
  89. epistola_client-0.13.0/generated/epistola_client_generated/models/reject_consumer_request.py +88 -0
  90. epistola_client-0.13.0/generated/epistola_client_generated/models/rotate_public_key_request.py +88 -0
  91. epistola_client-0.13.0/generated/epistola_client_generated/models/slot_dto.py +94 -0
  92. epistola_client-0.13.0/generated/epistola_client_generated/models/stencil_dto.py +130 -0
  93. epistola_client-0.13.0/generated/epistola_client_generated/models/stencil_list_response.py +101 -0
  94. epistola_client-0.13.0/generated/epistola_client_generated/models/stencil_summary_dto.py +127 -0
  95. epistola_client-0.13.0/generated/epistola_client_generated/models/stencil_usage_dto.py +110 -0
  96. epistola_client-0.13.0/generated/epistola_client_generated/models/stencil_usage_list_response.py +101 -0
  97. epistola_client-0.13.0/generated/epistola_client_generated/models/stencil_version_dto.py +136 -0
  98. epistola_client-0.13.0/generated/epistola_client_generated/models/stencil_version_list_response.py +101 -0
  99. epistola_client-0.13.0/generated/epistola_client_generated/models/stencil_version_summary_dto.py +114 -0
  100. epistola_client-0.13.0/generated/epistola_client_generated/models/template_data_validation_error.py +91 -0
  101. epistola_client-0.13.0/generated/epistola_client_generated/models/template_data_validation_result.py +97 -0
  102. epistola_client-0.13.0/generated/epistola_client_generated/models/template_document_dto.py +141 -0
  103. epistola_client-0.13.0/generated/epistola_client_generated/models/template_dto.py +135 -0
  104. epistola_client-0.13.0/generated/epistola_client_generated/models/template_list_response.py +101 -0
  105. epistola_client-0.13.0/generated/epistola_client_generated/models/template_summary_dto.py +111 -0
  106. epistola_client-0.13.0/generated/epistola_client_generated/models/tenant_dto.py +100 -0
  107. epistola_client-0.13.0/generated/epistola_client_generated/models/tenant_list_response.py +101 -0
  108. epistola_client-0.13.0/generated/epistola_client_generated/models/theme_dto.py +138 -0
  109. epistola_client-0.13.0/generated/epistola_client_generated/models/theme_list_response.py +101 -0
  110. epistola_client-0.13.0/generated/epistola_client_generated/models/theme_ref_dto.py +97 -0
  111. epistola_client-0.13.0/generated/epistola_client_generated/models/update_attribute_request.py +102 -0
  112. epistola_client-0.13.0/generated/epistola_client_generated/models/update_attribute_request_code_list_binding.py +89 -0
  113. epistola_client-0.13.0/generated/epistola_client_generated/models/update_code_list_request.py +130 -0
  114. epistola_client-0.13.0/generated/epistola_client_generated/models/update_consumer_request.py +128 -0
  115. epistola_client-0.13.0/generated/epistola_client_generated/models/update_draft_request.py +91 -0
  116. epistola_client-0.13.0/generated/epistola_client_generated/models/update_environment_request.py +88 -0
  117. epistola_client-0.13.0/generated/epistola_client_generated/models/update_stencil_draft_request.py +98 -0
  118. epistola_client-0.13.0/generated/epistola_client_generated/models/update_stencil_request.py +97 -0
  119. epistola_client-0.13.0/generated/epistola_client_generated/models/update_template_request.py +104 -0
  120. epistola_client-0.13.0/generated/epistola_client_generated/models/update_tenant_request.py +88 -0
  121. epistola_client-0.13.0/generated/epistola_client_generated/models/update_theme_request.py +125 -0
  122. epistola_client-0.13.0/generated/epistola_client_generated/models/update_variant_request.py +97 -0
  123. epistola_client-0.13.0/generated/epistola_client_generated/models/upgrade_preview_dto.py +121 -0
  124. epistola_client-0.13.0/generated/epistola_client_generated/models/upgrade_preview_list_response.py +95 -0
  125. epistola_client-0.13.0/generated/epistola_client_generated/models/validate_template_data_request.py +87 -0
  126. epistola_client-0.13.0/generated/epistola_client_generated/models/validation_error.py +96 -0
  127. epistola_client-0.13.0/generated/epistola_client_generated/models/validation_problem_detail.py +105 -0
  128. epistola_client-0.13.0/generated/epistola_client_generated/models/variant_dto.py +126 -0
  129. epistola_client-0.13.0/generated/epistola_client_generated/models/variant_list_response.py +101 -0
  130. epistola_client-0.13.0/generated/epistola_client_generated/models/variant_selection_attribute.py +98 -0
  131. epistola_client-0.13.0/generated/epistola_client_generated/models/variant_summary_dto.py +105 -0
  132. epistola_client-0.13.0/generated/epistola_client_generated/models/version_dto.py +129 -0
  133. epistola_client-0.13.0/generated/epistola_client_generated/models/version_list_response.py +101 -0
  134. epistola_client-0.13.0/generated/epistola_client_generated/models/version_summary_dto.py +123 -0
  135. epistola_client-0.13.0/generated/epistola_client_generated/py.typed +0 -0
  136. epistola_client-0.13.0/generated/epistola_client_generated/rest.py +263 -0
  137. epistola_client-0.13.0/pyproject.toml +78 -0
  138. epistola_client-0.13.0/src/epistola_client/__init__.py +94 -0
  139. epistola_client-0.13.0/src/epistola_client/_generated/__init__.py +19 -0
  140. epistola_client-0.13.0/src/epistola_client/_generated/contract_version.py +4 -0
  141. epistola_client-0.13.0/src/epistola_client/_generated/known_problem_slugs.py +39 -0
  142. epistola_client-0.13.0/src/epistola_client/_generated/model_validation.py +298 -0
  143. epistola_client-0.13.0/src/epistola_client/auth/__init__.py +5 -0
  144. epistola_client-0.13.0/src/epistola_client/auth/jwt_signer.py +122 -0
  145. epistola_client-0.13.0/src/epistola_client/collect/__init__.py +17 -0
  146. epistola_client-0.13.0/src/epistola_client/collect/result_collector.py +538 -0
  147. epistola_client-0.13.0/src/epistola_client/error/__init__.py +13 -0
  148. epistola_client-0.13.0/src/epistola_client/error/problem_detail_exception.py +104 -0
  149. epistola_client-0.13.0/src/epistola_client/error/problem_detail_handler.py +86 -0
  150. epistola_client-0.13.0/src/epistola_client/error/problem_types.py +35 -0
  151. epistola_client-0.13.0/src/epistola_client/http/__init__.py +5 -0
  152. epistola_client-0.13.0/src/epistola_client/http/client.py +132 -0
  153. epistola_client-0.13.0/src/epistola_client/identity/__init__.py +5 -0
  154. epistola_client-0.13.0/src/epistola_client/identity/client_identity.py +86 -0
  155. epistola_client-0.13.0/src/epistola_client/validation/__init__.py +19 -0
  156. epistola_client-0.13.0/src/epistola_client/validation/schema.py +189 -0
@@ -0,0 +1,16 @@
1
+ # Stock OpenAPI-generated client — regenerated from the spec by generate.sh.
2
+ /generated/
3
+
4
+ # Derived sources — regenerated from the spec by gen/generate_derived.py.
5
+ /src/epistola_client/_generated/
6
+
7
+ # Build / packaging artifacts.
8
+ /dist/
9
+ /build/
10
+ *.egg-info/
11
+
12
+ # Virtualenv / caches.
13
+ /.venv/
14
+ __pycache__/
15
+ .pytest_cache/
16
+ uv.lock
@@ -0,0 +1,45 @@
1
+ # Changelog — Epistola Python Client
2
+
3
+ All notable changes to the `epistola-client` PyPI package are documented here.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). This package's
6
+ version tracks the Epistola contract version (`info.version` in the OpenAPI spec), so it releases in
7
+ lockstep with the other generated artifacts; the repository-level [CHANGELOG](../CHANGELOG.md)
8
+ records contract/spec changes. This file records changes specific to the Python client library.
9
+
10
+ ## [Unreleased]
11
+
12
+ ### Fixed
13
+
14
+ - `generate.sh` now runs the derived-source generator without installing the package first, fixing
15
+ GitHub Actions failures where hatchling tried to read the generated `contract_version.py` before
16
+ it existed.
17
+ - Pull request CI now builds the Python wheel and source distribution after tests, so packaging
18
+ failures are caught before release or snapshot publishing.
19
+ - Snapshot CI now stamps the generated contract version to a PEP 440 `dev` version before pytest
20
+ installs the package, matching the TestPyPI publish version.
21
+
22
+ ### Changed
23
+
24
+ - Documented that PyPI/TestPyPI trusted publishing should temporarily be configured under Sander de
25
+ Groot's personal PyPI account while the Epistola organization approval is pending.
26
+
27
+ ### Added
28
+
29
+ - **Initial release** — a Python client for the Epistola API, generated from the OpenAPI contract
30
+ with OpenAPI Generator (`python` / urllib3, pydantic v2 models), at feature parity with the Kotlin
31
+ and .NET clients.
32
+ - `ClientIdentity` — mandatory `User-Agent` / `X-EP-Node-Id` headers, built via a fluent builder.
33
+ - `JwtSigner` — self-signed RSA / EC P-256 JWT bearer authentication, minting a fresh short-lived
34
+ token per request.
35
+ - `ProblemDetailException` and the opt-in problem-detail handler — RFC 9457 problem-detail error
36
+ handling, with `KnownProblemSlugs` generated from the spec's `x-problem-types` registry.
37
+ - `EpistolaClientBuilder` / `EpistolaApiClient` — compose identity, JWT, and problem-detail
38
+ handling onto the generated `ApiClient` for the generated APIs. (No media-type handler is needed:
39
+ the Python generator already emits the versioned `application/vnd.epistola.v1+json` content type.)
40
+ - `ResultCollector` — NDJSON result streaming with constant memory, gzip (plus optional lz4/zstd),
41
+ adaptive polling, and murmur3 partition-routing helpers.
42
+ - Client-side JSON-Schema validation (`TemplateSchemaValidator`, `ValidatingGenerationApi`) and a
43
+ generated `validate()` helper covering the models that carry schema constraints.
44
+ - A `ProblemRegistryTest`-equivalent guard test keeping the hand-written problem-type base in sync
45
+ with the value the build-time generator derives from the spec.
@@ -0,0 +1,146 @@
1
+ Metadata-Version: 2.4
2
+ Name: epistola-client
3
+ Version: 0.13.0
4
+ Summary: Python client library for the Epistola document generation API, using urllib3. Generated from the Epistola OpenAPI contract, with identity headers, RFC 9457 problem-detail error handling, self-signed JWT auth, NDJSON result collection, and client-side schema validation.
5
+ Project-URL: Homepage, https://github.com/epistola-app/epistola-contract
6
+ Project-URL: Repository, https://github.com/epistola-app/epistola-contract.git
7
+ Author: Sander de Groot
8
+ License-Expression: EUPL-1.2
9
+ Keywords: api,client,document-generation,epistola,openapi
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Topic :: Software Development :: Libraries
13
+ Requires-Python: >=3.9
14
+ Requires-Dist: jsonschema>=4.21.0
15
+ Requires-Dist: pydantic>=2
16
+ Requires-Dist: pyjwt[crypto]>=2.8.0
17
+ Requires-Dist: python-dateutil>=2.8.2
18
+ Requires-Dist: typing-extensions>=4.7.1
19
+ Requires-Dist: urllib3<3.0.0,>=2.1.0
20
+ Description-Content-Type: text/markdown
21
+
22
+ # Epistola Python Client
23
+
24
+ Python client library for the [Epistola](https://github.com/epistola-app/epistola-contract)
25
+ document generation API, generated from the Epistola OpenAPI contract with
26
+ [OpenAPI Generator](https://openapi-generator.tech) (`python` / urllib3, pydantic v2 models).
27
+
28
+ It adds, on top of the stock generated client:
29
+
30
+ - **Client identity** headers (`User-Agent` + `X-EP-Node-Id`) required on every request.
31
+ - **RFC 9457 problem-detail** error handling — typed `ProblemDetailException` with a
32
+ `type_slug` discriminator and generated `KnownProblemSlugs` constants.
33
+ - **Self-signed JWT** authentication (`JwtSigner`), minting a fresh short-lived token per request.
34
+ - **NDJSON result collection** (`ResultCollector`) with adaptive polling, compression, and
35
+ partition-aware routing helpers.
36
+ - **Client-side JSON Schema validation** of template data (`TemplateSchemaValidator`).
37
+
38
+ The package version tracks the Epistola contract version (`info.version`) and releases in
39
+ lockstep with the Kotlin and .NET clients.
40
+
41
+ ## Install
42
+
43
+ ```bash
44
+ pip install epistola-client
45
+ ```
46
+
47
+ Prerelease snapshots (published on every push to `main`) are available from TestPyPI:
48
+
49
+ ```bash
50
+ pip install -i https://test.pypi.org/simple/ \
51
+ --extra-index-url https://pypi.org/simple/ epistola-client
52
+ ```
53
+
54
+ ## Quick start
55
+
56
+ ```python
57
+ from epistola_client import (
58
+ EpistolaClientBuilder, ClientIdentity, JwtSigner, TemplatesApi,
59
+ )
60
+
61
+ identity = ClientIdentity.builder().node_id("my-pod-123").build()
62
+ signer = (
63
+ JwtSigner.builder()
64
+ .consumer_id("invoice-service")
65
+ .private_key(JwtSigner.load_private_key("private.pem"))
66
+ .build()
67
+ )
68
+
69
+ http = (
70
+ EpistolaClientBuilder()
71
+ .base_url("https://epistola.example.com/api")
72
+ .identity(identity)
73
+ .jwt_signer(signer)
74
+ .install_problem_detail_handler()
75
+ .build()
76
+ )
77
+
78
+ templates = TemplatesApi(http)
79
+ template = templates.get_template("acme", "invoices", "invoice")
80
+ ```
81
+
82
+ ## Error handling
83
+
84
+ Install the opt-in problem-detail handler on the client
85
+ (`.install_problem_detail_handler()`), then switch on `type_slug` against
86
+ `KnownProblemSlugs`. The slug list is **open** — the API can introduce new problem types
87
+ without a client release — so always keep a fallback branch and fall back to the HTTP
88
+ status for unrecognized types.
89
+
90
+ ```python
91
+ from epistola_client import (
92
+ TenantsApi, ProblemDetailException, KnownProblemSlugs,
93
+ )
94
+
95
+ try:
96
+ tenants_api.get_tenant("acme")
97
+ except ProblemDetailException as e:
98
+ match e.type_slug:
99
+ case KnownProblemSlugs.NOT_FOUND:
100
+ log.warning("tenant not found: %s", e.detail)
101
+ case KnownProblemSlugs.FORBIDDEN:
102
+ raise PermissionError(e.detail)
103
+ case KnownProblemSlugs.VALIDATION_ERROR:
104
+ for err in e.errors: # field-level ValidationProblemDetail
105
+ log.warning("%s: %s", err.var_field, err.message)
106
+ case KnownProblemSlugs.DATA_MODEL_VALIDATION_ERROR:
107
+ for example, failures in e.validation_errors.items(): # 422 data-model failures
108
+ for f in failures:
109
+ log.warning("%s %s: %s", example, f.path, f.message)
110
+ case _:
111
+ raise # unknown / framework error — fall back to status
112
+ ```
113
+
114
+ `ProblemDetailException` extends the generated `ApiException`, so existing
115
+ `except ApiException` sites keep working. It exposes `type`, `type_slug`, `title`,
116
+ `problem_status`, `detail`, `errors`, `validation_errors`, `is_validation_problem`, and
117
+ `is_data_model_validation_problem`.
118
+
119
+ ## Result collection
120
+
121
+ ```python
122
+ from epistola_client import ResultCollector
123
+
124
+ collector = (
125
+ ResultCollector.builder()
126
+ .api_client(http)
127
+ .tenant_id("acme")
128
+ .handler(lambda result: print(result.request_id, result.status))
129
+ .build()
130
+ )
131
+ collector.start() # blocks; adaptive polling until collector.stop()
132
+ ```
133
+
134
+ ## Development
135
+
136
+ The client is generated from the bundled spec. From the repository root:
137
+
138
+ ```bash
139
+ make bundle # produce openapi.yaml
140
+ cd client-python-urllib3
141
+ ./generate.sh # stock client + derived sources
142
+ uv run pytest # run the tests
143
+ ```
144
+
145
+ `generated/` (stock client) and `src/epistola_client/_generated/` (derived sources) are
146
+ gitignored and rebuilt from the spec each time.
@@ -0,0 +1,125 @@
1
+ # Epistola Python Client
2
+
3
+ Python client library for the [Epistola](https://github.com/epistola-app/epistola-contract)
4
+ document generation API, generated from the Epistola OpenAPI contract with
5
+ [OpenAPI Generator](https://openapi-generator.tech) (`python` / urllib3, pydantic v2 models).
6
+
7
+ It adds, on top of the stock generated client:
8
+
9
+ - **Client identity** headers (`User-Agent` + `X-EP-Node-Id`) required on every request.
10
+ - **RFC 9457 problem-detail** error handling — typed `ProblemDetailException` with a
11
+ `type_slug` discriminator and generated `KnownProblemSlugs` constants.
12
+ - **Self-signed JWT** authentication (`JwtSigner`), minting a fresh short-lived token per request.
13
+ - **NDJSON result collection** (`ResultCollector`) with adaptive polling, compression, and
14
+ partition-aware routing helpers.
15
+ - **Client-side JSON Schema validation** of template data (`TemplateSchemaValidator`).
16
+
17
+ The package version tracks the Epistola contract version (`info.version`) and releases in
18
+ lockstep with the Kotlin and .NET clients.
19
+
20
+ ## Install
21
+
22
+ ```bash
23
+ pip install epistola-client
24
+ ```
25
+
26
+ Prerelease snapshots (published on every push to `main`) are available from TestPyPI:
27
+
28
+ ```bash
29
+ pip install -i https://test.pypi.org/simple/ \
30
+ --extra-index-url https://pypi.org/simple/ epistola-client
31
+ ```
32
+
33
+ ## Quick start
34
+
35
+ ```python
36
+ from epistola_client import (
37
+ EpistolaClientBuilder, ClientIdentity, JwtSigner, TemplatesApi,
38
+ )
39
+
40
+ identity = ClientIdentity.builder().node_id("my-pod-123").build()
41
+ signer = (
42
+ JwtSigner.builder()
43
+ .consumer_id("invoice-service")
44
+ .private_key(JwtSigner.load_private_key("private.pem"))
45
+ .build()
46
+ )
47
+
48
+ http = (
49
+ EpistolaClientBuilder()
50
+ .base_url("https://epistola.example.com/api")
51
+ .identity(identity)
52
+ .jwt_signer(signer)
53
+ .install_problem_detail_handler()
54
+ .build()
55
+ )
56
+
57
+ templates = TemplatesApi(http)
58
+ template = templates.get_template("acme", "invoices", "invoice")
59
+ ```
60
+
61
+ ## Error handling
62
+
63
+ Install the opt-in problem-detail handler on the client
64
+ (`.install_problem_detail_handler()`), then switch on `type_slug` against
65
+ `KnownProblemSlugs`. The slug list is **open** — the API can introduce new problem types
66
+ without a client release — so always keep a fallback branch and fall back to the HTTP
67
+ status for unrecognized types.
68
+
69
+ ```python
70
+ from epistola_client import (
71
+ TenantsApi, ProblemDetailException, KnownProblemSlugs,
72
+ )
73
+
74
+ try:
75
+ tenants_api.get_tenant("acme")
76
+ except ProblemDetailException as e:
77
+ match e.type_slug:
78
+ case KnownProblemSlugs.NOT_FOUND:
79
+ log.warning("tenant not found: %s", e.detail)
80
+ case KnownProblemSlugs.FORBIDDEN:
81
+ raise PermissionError(e.detail)
82
+ case KnownProblemSlugs.VALIDATION_ERROR:
83
+ for err in e.errors: # field-level ValidationProblemDetail
84
+ log.warning("%s: %s", err.var_field, err.message)
85
+ case KnownProblemSlugs.DATA_MODEL_VALIDATION_ERROR:
86
+ for example, failures in e.validation_errors.items(): # 422 data-model failures
87
+ for f in failures:
88
+ log.warning("%s %s: %s", example, f.path, f.message)
89
+ case _:
90
+ raise # unknown / framework error — fall back to status
91
+ ```
92
+
93
+ `ProblemDetailException` extends the generated `ApiException`, so existing
94
+ `except ApiException` sites keep working. It exposes `type`, `type_slug`, `title`,
95
+ `problem_status`, `detail`, `errors`, `validation_errors`, `is_validation_problem`, and
96
+ `is_data_model_validation_problem`.
97
+
98
+ ## Result collection
99
+
100
+ ```python
101
+ from epistola_client import ResultCollector
102
+
103
+ collector = (
104
+ ResultCollector.builder()
105
+ .api_client(http)
106
+ .tenant_id("acme")
107
+ .handler(lambda result: print(result.request_id, result.status))
108
+ .build()
109
+ )
110
+ collector.start() # blocks; adaptive polling until collector.stop()
111
+ ```
112
+
113
+ ## Development
114
+
115
+ The client is generated from the bundled spec. From the repository root:
116
+
117
+ ```bash
118
+ make bundle # produce openapi.yaml
119
+ cd client-python-urllib3
120
+ ./generate.sh # stock client + derived sources
121
+ uv run pytest # run the tests
122
+ ```
123
+
124
+ `generated/` (stock client) and `src/epistola_client/_generated/` (derived sources) are
125
+ gitignored and rebuilt from the spec each time.
@@ -0,0 +1,292 @@
1
+ # coding: utf-8
2
+
3
+ # flake8: noqa
4
+
5
+ """
6
+ Epistola API
7
+
8
+ Document template management API for Epistola Suite. ## Versioning This API uses header-based versioning via the Accept header. Use `application/vnd.epistola.v1+json` for API version 1. ## Authentication The API uses JWT Bearer tokens for authentication. Two paths are supported: - **OAuth 2.0** (recommended): Use Client Credentials flow to obtain a JWT from your IdP - **Self-signed JWT**: Register with a public key, then sign short-lived JWTs with your private key Both paths use `Authorization: Bearer <jwt>`. Permissions (allowed tenants, roles) are managed in Epistola's consumer record, not in JWT claims. See the [Authentication Guide](/docs/auth.md) for details. ## Client Identity All requests must include the following headers for client identification: - **`User-Agent`** (required) — identifies the client software stack using standard [RFC 9110 §10.1.5](https://www.rfc-editor.org/rfc/rfc9110#name-user-agent) product tokens. The first token **must** be `epistola-contract/{version}` indicating the contract version the client was built against. Additional product/version pairs can be appended to describe the full software stack. Example: `epistola-contract/x.y.z valtimo-epistola-plugin/1.2.0 gzac/5.0.0` - **`X-EP-Node-Id`** (required) — identifies the specific client node. Use the Kubernetes pod name, container ID, or hostname. In local/dev environments, the machine hostname is acceptable. The generated Epistola client libraries set both headers automatically — `User-Agent` with the contract version, and `X-EP-Node-Id` with the hostname. Consumers wrapping the client library can append additional product tokens to `User-Agent` for their own software and override the node ID as needed. ## Error Responses The API uses [RFC 9457 Problem Details](https://www.rfc-editor.org/rfc/rfc9457) for error responses. Error responses have `Content-Type: application/problem+json` and include the following fields: - `type` (string, URI) — identifies the problem type; the stable, machine-readable discriminator clients should switch on - `title` (string) — short human-readable summary - `status` (integer) — HTTP status code - `detail` (string, optional) — human-readable explanation of this occurrence - `instance` (string, URI, optional) — identifies this specific occurrence Problem `type` URIs use the `https://epistola.app/errors/{slug}` namespace and resolve to human-readable HTML documentation for that problem type. A response may also carry domain-specific extension members as top-level fields; clients should ignore members they do not recognize. For validation errors (`type: .../validation-error`), the response also includes an `errors` array with field-level details. The canonical problem `type` slugs are registered in [`docs/error-types.md`](docs/error-types.md); the machine-readable registry is this document's top-level `x-problem-types` extension. ## Authorization Access is controlled via roles (`reader`, `editor`, `generator`, `manager`, `tenant_control`) and tenant permissions. These are set by an administrator when approving a consumer registration.
9
+
10
+ The version of the OpenAPI document: 0.13.0
11
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
12
+
13
+ Do not edit the class manually.
14
+ """ # noqa: E501
15
+
16
+
17
+ __version__ = "1.0.0"
18
+
19
+ # Define package exports
20
+ __all__ = [
21
+ "AttributesApi",
22
+ "CatalogsApi",
23
+ "CodeListsApi",
24
+ "ConsumersApi",
25
+ "EnvironmentsApi",
26
+ "FontsApi",
27
+ "GenerationApi",
28
+ "StencilsApi",
29
+ "SystemApi",
30
+ "TemplatesApi",
31
+ "TenantsApi",
32
+ "ThemesApi",
33
+ "VariantsApi",
34
+ "VersionsApi",
35
+ "ApiResponse",
36
+ "ApiClient",
37
+ "Configuration",
38
+ "OpenApiException",
39
+ "ApiTypeError",
40
+ "ApiValueError",
41
+ "ApiKeyError",
42
+ "ApiAttributeError",
43
+ "ApiException",
44
+ "ActivationDto",
45
+ "ActivationListResponse",
46
+ "ApproveConsumerRequest",
47
+ "AttributeDto",
48
+ "AttributeDtoCodeListBinding",
49
+ "AttributeListResponse",
50
+ "BatchGenerationItem",
51
+ "BlockStylePresetDto",
52
+ "CatalogDto",
53
+ "CatalogListResponse",
54
+ "CatalogUpgradeDiff",
55
+ "CodeListDto",
56
+ "CodeListEntriesResponse",
57
+ "CodeListEntryDto",
58
+ "CodeListListResponse",
59
+ "CollectMeta",
60
+ "CollectRequest",
61
+ "ConsumerDto",
62
+ "ConsumerListResponse",
63
+ "ConsumerNodeDto",
64
+ "ConsumerPermissions",
65
+ "CreateAttributeRequest",
66
+ "CreateAttributeRequestCodeListBinding",
67
+ "CreateCodeListRequest",
68
+ "CreateEnvironmentRequest",
69
+ "CreateStencilRequest",
70
+ "CreateStencilVersionRequest",
71
+ "CreateTemplateRequest",
72
+ "CreateTenantRequest",
73
+ "CreateThemeRequest",
74
+ "CreateVariantRequest",
75
+ "DataExampleDto",
76
+ "DataModelValidationError",
77
+ "DataModelValidationProblemDetail",
78
+ "DocumentDto",
79
+ "DocumentGenerationItemDto",
80
+ "DocumentGenerationJobDto",
81
+ "DocumentListResponse",
82
+ "EnvironmentDto",
83
+ "EnvironmentListResponse",
84
+ "FontDto",
85
+ "FontListResponse",
86
+ "FontVariantDto",
87
+ "GenerateBatchRequest",
88
+ "GenerateDocumentRequest",
89
+ "GenerationJobDetail",
90
+ "GenerationJobListResponse",
91
+ "GenerationJobResponse",
92
+ "GenerationResult",
93
+ "ImportCatalogResponse",
94
+ "ImportTemplateResultDto",
95
+ "MarginsDto",
96
+ "NodeDto",
97
+ "PageMeta",
98
+ "PageSettingsDto",
99
+ "PartitionAssignment",
100
+ "PingRequest",
101
+ "PongDetailsDto",
102
+ "PongResponse",
103
+ "PreviewDocumentRequest",
104
+ "ProblemDetail",
105
+ "PublishVersionRequest",
106
+ "RegisterConsumerRequest",
107
+ "RejectConsumerRequest",
108
+ "RotatePublicKeyRequest",
109
+ "SlotDto",
110
+ "StencilDto",
111
+ "StencilListResponse",
112
+ "StencilSummaryDto",
113
+ "StencilUsageDto",
114
+ "StencilUsageListResponse",
115
+ "StencilVersionDto",
116
+ "StencilVersionListResponse",
117
+ "StencilVersionSummaryDto",
118
+ "TemplateDataValidationError",
119
+ "TemplateDataValidationResult",
120
+ "TemplateDocumentDto",
121
+ "TemplateDto",
122
+ "TemplateListResponse",
123
+ "TemplateSummaryDto",
124
+ "TenantDto",
125
+ "TenantListResponse",
126
+ "ThemeDto",
127
+ "ThemeListResponse",
128
+ "ThemeRefDto",
129
+ "UpdateAttributeRequest",
130
+ "UpdateAttributeRequestCodeListBinding",
131
+ "UpdateCodeListRequest",
132
+ "UpdateConsumerRequest",
133
+ "UpdateDraftRequest",
134
+ "UpdateEnvironmentRequest",
135
+ "UpdateStencilDraftRequest",
136
+ "UpdateStencilRequest",
137
+ "UpdateTemplateRequest",
138
+ "UpdateTenantRequest",
139
+ "UpdateThemeRequest",
140
+ "UpdateVariantRequest",
141
+ "UpgradePreviewDto",
142
+ "UpgradePreviewListResponse",
143
+ "ValidateTemplateDataRequest",
144
+ "ValidationError",
145
+ "ValidationProblemDetail",
146
+ "VariantDto",
147
+ "VariantListResponse",
148
+ "VariantSelectionAttribute",
149
+ "VariantSummaryDto",
150
+ "VersionDto",
151
+ "VersionListResponse",
152
+ "VersionSummaryDto",
153
+ ]
154
+
155
+ # import apis into sdk package
156
+ from epistola_client_generated.api.attributes_api import AttributesApi as AttributesApi
157
+ from epistola_client_generated.api.catalogs_api import CatalogsApi as CatalogsApi
158
+ from epistola_client_generated.api.code_lists_api import CodeListsApi as CodeListsApi
159
+ from epistola_client_generated.api.consumers_api import ConsumersApi as ConsumersApi
160
+ from epistola_client_generated.api.environments_api import EnvironmentsApi as EnvironmentsApi
161
+ from epistola_client_generated.api.fonts_api import FontsApi as FontsApi
162
+ from epistola_client_generated.api.generation_api import GenerationApi as GenerationApi
163
+ from epistola_client_generated.api.stencils_api import StencilsApi as StencilsApi
164
+ from epistola_client_generated.api.system_api import SystemApi as SystemApi
165
+ from epistola_client_generated.api.templates_api import TemplatesApi as TemplatesApi
166
+ from epistola_client_generated.api.tenants_api import TenantsApi as TenantsApi
167
+ from epistola_client_generated.api.themes_api import ThemesApi as ThemesApi
168
+ from epistola_client_generated.api.variants_api import VariantsApi as VariantsApi
169
+ from epistola_client_generated.api.versions_api import VersionsApi as VersionsApi
170
+
171
+ # import ApiClient
172
+ from epistola_client_generated.api_response import ApiResponse as ApiResponse
173
+ from epistola_client_generated.api_client import ApiClient as ApiClient
174
+ from epistola_client_generated.configuration import Configuration as Configuration
175
+ from epistola_client_generated.exceptions import OpenApiException as OpenApiException
176
+ from epistola_client_generated.exceptions import ApiTypeError as ApiTypeError
177
+ from epistola_client_generated.exceptions import ApiValueError as ApiValueError
178
+ from epistola_client_generated.exceptions import ApiKeyError as ApiKeyError
179
+ from epistola_client_generated.exceptions import ApiAttributeError as ApiAttributeError
180
+ from epistola_client_generated.exceptions import ApiException as ApiException
181
+
182
+ # import models into sdk package
183
+ from epistola_client_generated.models.activation_dto import ActivationDto as ActivationDto
184
+ from epistola_client_generated.models.activation_list_response import ActivationListResponse as ActivationListResponse
185
+ from epistola_client_generated.models.approve_consumer_request import ApproveConsumerRequest as ApproveConsumerRequest
186
+ from epistola_client_generated.models.attribute_dto import AttributeDto as AttributeDto
187
+ from epistola_client_generated.models.attribute_dto_code_list_binding import AttributeDtoCodeListBinding as AttributeDtoCodeListBinding
188
+ from epistola_client_generated.models.attribute_list_response import AttributeListResponse as AttributeListResponse
189
+ from epistola_client_generated.models.batch_generation_item import BatchGenerationItem as BatchGenerationItem
190
+ from epistola_client_generated.models.block_style_preset_dto import BlockStylePresetDto as BlockStylePresetDto
191
+ from epistola_client_generated.models.catalog_dto import CatalogDto as CatalogDto
192
+ from epistola_client_generated.models.catalog_list_response import CatalogListResponse as CatalogListResponse
193
+ from epistola_client_generated.models.catalog_upgrade_diff import CatalogUpgradeDiff as CatalogUpgradeDiff
194
+ from epistola_client_generated.models.code_list_dto import CodeListDto as CodeListDto
195
+ from epistola_client_generated.models.code_list_entries_response import CodeListEntriesResponse as CodeListEntriesResponse
196
+ from epistola_client_generated.models.code_list_entry_dto import CodeListEntryDto as CodeListEntryDto
197
+ from epistola_client_generated.models.code_list_list_response import CodeListListResponse as CodeListListResponse
198
+ from epistola_client_generated.models.collect_meta import CollectMeta as CollectMeta
199
+ from epistola_client_generated.models.collect_request import CollectRequest as CollectRequest
200
+ from epistola_client_generated.models.consumer_dto import ConsumerDto as ConsumerDto
201
+ from epistola_client_generated.models.consumer_list_response import ConsumerListResponse as ConsumerListResponse
202
+ from epistola_client_generated.models.consumer_node_dto import ConsumerNodeDto as ConsumerNodeDto
203
+ from epistola_client_generated.models.consumer_permissions import ConsumerPermissions as ConsumerPermissions
204
+ from epistola_client_generated.models.create_attribute_request import CreateAttributeRequest as CreateAttributeRequest
205
+ from epistola_client_generated.models.create_attribute_request_code_list_binding import CreateAttributeRequestCodeListBinding as CreateAttributeRequestCodeListBinding
206
+ from epistola_client_generated.models.create_code_list_request import CreateCodeListRequest as CreateCodeListRequest
207
+ from epistola_client_generated.models.create_environment_request import CreateEnvironmentRequest as CreateEnvironmentRequest
208
+ from epistola_client_generated.models.create_stencil_request import CreateStencilRequest as CreateStencilRequest
209
+ from epistola_client_generated.models.create_stencil_version_request import CreateStencilVersionRequest as CreateStencilVersionRequest
210
+ from epistola_client_generated.models.create_template_request import CreateTemplateRequest as CreateTemplateRequest
211
+ from epistola_client_generated.models.create_tenant_request import CreateTenantRequest as CreateTenantRequest
212
+ from epistola_client_generated.models.create_theme_request import CreateThemeRequest as CreateThemeRequest
213
+ from epistola_client_generated.models.create_variant_request import CreateVariantRequest as CreateVariantRequest
214
+ from epistola_client_generated.models.data_example_dto import DataExampleDto as DataExampleDto
215
+ from epistola_client_generated.models.data_model_validation_error import DataModelValidationError as DataModelValidationError
216
+ from epistola_client_generated.models.data_model_validation_problem_detail import DataModelValidationProblemDetail as DataModelValidationProblemDetail
217
+ from epistola_client_generated.models.document_dto import DocumentDto as DocumentDto
218
+ from epistola_client_generated.models.document_generation_item_dto import DocumentGenerationItemDto as DocumentGenerationItemDto
219
+ from epistola_client_generated.models.document_generation_job_dto import DocumentGenerationJobDto as DocumentGenerationJobDto
220
+ from epistola_client_generated.models.document_list_response import DocumentListResponse as DocumentListResponse
221
+ from epistola_client_generated.models.environment_dto import EnvironmentDto as EnvironmentDto
222
+ from epistola_client_generated.models.environment_list_response import EnvironmentListResponse as EnvironmentListResponse
223
+ from epistola_client_generated.models.font_dto import FontDto as FontDto
224
+ from epistola_client_generated.models.font_list_response import FontListResponse as FontListResponse
225
+ from epistola_client_generated.models.font_variant_dto import FontVariantDto as FontVariantDto
226
+ from epistola_client_generated.models.generate_batch_request import GenerateBatchRequest as GenerateBatchRequest
227
+ from epistola_client_generated.models.generate_document_request import GenerateDocumentRequest as GenerateDocumentRequest
228
+ from epistola_client_generated.models.generation_job_detail import GenerationJobDetail as GenerationJobDetail
229
+ from epistola_client_generated.models.generation_job_list_response import GenerationJobListResponse as GenerationJobListResponse
230
+ from epistola_client_generated.models.generation_job_response import GenerationJobResponse as GenerationJobResponse
231
+ from epistola_client_generated.models.generation_result import GenerationResult as GenerationResult
232
+ from epistola_client_generated.models.import_catalog_response import ImportCatalogResponse as ImportCatalogResponse
233
+ from epistola_client_generated.models.import_template_result_dto import ImportTemplateResultDto as ImportTemplateResultDto
234
+ from epistola_client_generated.models.margins_dto import MarginsDto as MarginsDto
235
+ from epistola_client_generated.models.node_dto import NodeDto as NodeDto
236
+ from epistola_client_generated.models.page_meta import PageMeta as PageMeta
237
+ from epistola_client_generated.models.page_settings_dto import PageSettingsDto as PageSettingsDto
238
+ from epistola_client_generated.models.partition_assignment import PartitionAssignment as PartitionAssignment
239
+ from epistola_client_generated.models.ping_request import PingRequest as PingRequest
240
+ from epistola_client_generated.models.pong_details_dto import PongDetailsDto as PongDetailsDto
241
+ from epistola_client_generated.models.pong_response import PongResponse as PongResponse
242
+ from epistola_client_generated.models.preview_document_request import PreviewDocumentRequest as PreviewDocumentRequest
243
+ from epistola_client_generated.models.problem_detail import ProblemDetail as ProblemDetail
244
+ from epistola_client_generated.models.publish_version_request import PublishVersionRequest as PublishVersionRequest
245
+ from epistola_client_generated.models.register_consumer_request import RegisterConsumerRequest as RegisterConsumerRequest
246
+ from epistola_client_generated.models.reject_consumer_request import RejectConsumerRequest as RejectConsumerRequest
247
+ from epistola_client_generated.models.rotate_public_key_request import RotatePublicKeyRequest as RotatePublicKeyRequest
248
+ from epistola_client_generated.models.slot_dto import SlotDto as SlotDto
249
+ from epistola_client_generated.models.stencil_dto import StencilDto as StencilDto
250
+ from epistola_client_generated.models.stencil_list_response import StencilListResponse as StencilListResponse
251
+ from epistola_client_generated.models.stencil_summary_dto import StencilSummaryDto as StencilSummaryDto
252
+ from epistola_client_generated.models.stencil_usage_dto import StencilUsageDto as StencilUsageDto
253
+ from epistola_client_generated.models.stencil_usage_list_response import StencilUsageListResponse as StencilUsageListResponse
254
+ from epistola_client_generated.models.stencil_version_dto import StencilVersionDto as StencilVersionDto
255
+ from epistola_client_generated.models.stencil_version_list_response import StencilVersionListResponse as StencilVersionListResponse
256
+ from epistola_client_generated.models.stencil_version_summary_dto import StencilVersionSummaryDto as StencilVersionSummaryDto
257
+ from epistola_client_generated.models.template_data_validation_error import TemplateDataValidationError as TemplateDataValidationError
258
+ from epistola_client_generated.models.template_data_validation_result import TemplateDataValidationResult as TemplateDataValidationResult
259
+ from epistola_client_generated.models.template_document_dto import TemplateDocumentDto as TemplateDocumentDto
260
+ from epistola_client_generated.models.template_dto import TemplateDto as TemplateDto
261
+ from epistola_client_generated.models.template_list_response import TemplateListResponse as TemplateListResponse
262
+ from epistola_client_generated.models.template_summary_dto import TemplateSummaryDto as TemplateSummaryDto
263
+ from epistola_client_generated.models.tenant_dto import TenantDto as TenantDto
264
+ from epistola_client_generated.models.tenant_list_response import TenantListResponse as TenantListResponse
265
+ from epistola_client_generated.models.theme_dto import ThemeDto as ThemeDto
266
+ from epistola_client_generated.models.theme_list_response import ThemeListResponse as ThemeListResponse
267
+ from epistola_client_generated.models.theme_ref_dto import ThemeRefDto as ThemeRefDto
268
+ from epistola_client_generated.models.update_attribute_request import UpdateAttributeRequest as UpdateAttributeRequest
269
+ from epistola_client_generated.models.update_attribute_request_code_list_binding import UpdateAttributeRequestCodeListBinding as UpdateAttributeRequestCodeListBinding
270
+ from epistola_client_generated.models.update_code_list_request import UpdateCodeListRequest as UpdateCodeListRequest
271
+ from epistola_client_generated.models.update_consumer_request import UpdateConsumerRequest as UpdateConsumerRequest
272
+ from epistola_client_generated.models.update_draft_request import UpdateDraftRequest as UpdateDraftRequest
273
+ from epistola_client_generated.models.update_environment_request import UpdateEnvironmentRequest as UpdateEnvironmentRequest
274
+ from epistola_client_generated.models.update_stencil_draft_request import UpdateStencilDraftRequest as UpdateStencilDraftRequest
275
+ from epistola_client_generated.models.update_stencil_request import UpdateStencilRequest as UpdateStencilRequest
276
+ from epistola_client_generated.models.update_template_request import UpdateTemplateRequest as UpdateTemplateRequest
277
+ from epistola_client_generated.models.update_tenant_request import UpdateTenantRequest as UpdateTenantRequest
278
+ from epistola_client_generated.models.update_theme_request import UpdateThemeRequest as UpdateThemeRequest
279
+ from epistola_client_generated.models.update_variant_request import UpdateVariantRequest as UpdateVariantRequest
280
+ from epistola_client_generated.models.upgrade_preview_dto import UpgradePreviewDto as UpgradePreviewDto
281
+ from epistola_client_generated.models.upgrade_preview_list_response import UpgradePreviewListResponse as UpgradePreviewListResponse
282
+ from epistola_client_generated.models.validate_template_data_request import ValidateTemplateDataRequest as ValidateTemplateDataRequest
283
+ from epistola_client_generated.models.validation_error import ValidationError as ValidationError
284
+ from epistola_client_generated.models.validation_problem_detail import ValidationProblemDetail as ValidationProblemDetail
285
+ from epistola_client_generated.models.variant_dto import VariantDto as VariantDto
286
+ from epistola_client_generated.models.variant_list_response import VariantListResponse as VariantListResponse
287
+ from epistola_client_generated.models.variant_selection_attribute import VariantSelectionAttribute as VariantSelectionAttribute
288
+ from epistola_client_generated.models.variant_summary_dto import VariantSummaryDto as VariantSummaryDto
289
+ from epistola_client_generated.models.version_dto import VersionDto as VersionDto
290
+ from epistola_client_generated.models.version_list_response import VersionListResponse as VersionListResponse
291
+ from epistola_client_generated.models.version_summary_dto import VersionSummaryDto as VersionSummaryDto
292
+
@@ -0,0 +1,18 @@
1
+ # flake8: noqa
2
+
3
+ # import apis into api package
4
+ from epistola_client_generated.api.attributes_api import AttributesApi
5
+ from epistola_client_generated.api.catalogs_api import CatalogsApi
6
+ from epistola_client_generated.api.code_lists_api import CodeListsApi
7
+ from epistola_client_generated.api.consumers_api import ConsumersApi
8
+ from epistola_client_generated.api.environments_api import EnvironmentsApi
9
+ from epistola_client_generated.api.fonts_api import FontsApi
10
+ from epistola_client_generated.api.generation_api import GenerationApi
11
+ from epistola_client_generated.api.stencils_api import StencilsApi
12
+ from epistola_client_generated.api.system_api import SystemApi
13
+ from epistola_client_generated.api.templates_api import TemplatesApi
14
+ from epistola_client_generated.api.tenants_api import TenantsApi
15
+ from epistola_client_generated.api.themes_api import ThemesApi
16
+ from epistola_client_generated.api.variants_api import VariantsApi
17
+ from epistola_client_generated.api.versions_api import VersionsApi
18
+