tag:github.com,2008:https://github.com/blueprint-platform/openapi-generics/releases Release notes from openapi-generics 2026-06-27T14:08:37Z tag:github.com,2008:Repository/1045192298/v1.2.0 2026-06-27T14:13:17Z v1.2.0 — Application-Defined Generic Containers and Deterministic Generated Source Hygiene <p>This release extends the container-aware infrastructure introduced in 1.1.0 by allowing applications to register their own generic container contracts.</p> <p>OpenAPI Generics can now preserve and reconstruct both built-in containers and application-defined containers through the same contract-first projection and deterministic client generation pipeline.</p> <p>This release also improves projection metadata by preserving Java container identity and adds generated-source hygiene for cleaner Java client artifacts.</p> <p>All 1.1.x contracts remain fully supported.</p> <p>No migration is required for existing users.</p> <hr> <h2>What This Release Adds</h2> <h3>Application-Defined Generic Containers</h3> <p>OpenAPI Generics previously supported built-in container shapes such as:</p> <div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ServiceResponse&lt;List&lt;T&gt;&gt; ServiceResponse&lt;Set&lt;T&gt;&gt; ServiceResponse&lt;Page&lt;T&gt;&gt;"><pre><span class="pl-s1">ServiceResponse</span>&lt;<span class="pl-s1">List</span>&lt;<span class="pl-s1">T</span>&gt;&gt; <span class="pl-s1">ServiceResponse</span>&lt;<span class="pl-s1">Set</span>&lt;<span class="pl-s1">T</span>&gt;&gt; <span class="pl-smi">ServiceResponse</span>&lt;<span class="pl-smi">Page</span>&lt;<span class="pl-smi">T</span>&gt;&gt;</pre></div> <p>and equivalent BYOE shapes:</p> <div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ApiResponse&lt;List&lt;T&gt;&gt; ApiResponse&lt;Set&lt;T&gt;&gt; ApiResponse&lt;Page&lt;T&gt;&gt;"><pre><span class="pl-s1">ApiResponse</span>&lt;<span class="pl-s1">List</span>&lt;<span class="pl-s1">T</span>&gt;&gt; <span class="pl-s1">ApiResponse</span>&lt;<span class="pl-s1">Set</span>&lt;<span class="pl-s1">T</span>&gt;&gt; <span class="pl-smi">ApiResponse</span>&lt;<span class="pl-smi">Page</span>&lt;<span class="pl-smi">T</span>&gt;&gt;</pre></div> <p>Version 1.2.0 allows applications to register their own generic container contracts.</p> <p>Example:</p> <div class="highlight highlight-source-yaml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="openapi-generics: envelope: type: io.example.contract.ApiResponse containers: - type: io.example.contract.Paging item-property: content - type: io.example.contract.Window item-property: items"><pre><span class="pl-ent">openapi-generics</span>: <span class="pl-ent">envelope</span>: <span class="pl-ent">type</span>: <span class="pl-s">io.example.contract.ApiResponse</span> <span class="pl-ent">containers</span>: - <span class="pl-ent">type</span>: <span class="pl-s">io.example.contract.Paging</span> <span class="pl-ent">item-property</span>: <span class="pl-s">content</span> - <span class="pl-ent">type</span>: <span class="pl-s">io.example.contract.Window</span> <span class="pl-ent">item-property</span>: <span class="pl-s">items</span></pre></div> <p>These containers participate in the same projection and reconstruction pipeline as built-in <code>List&lt;T&gt;</code>, <code>Set&lt;T&gt;</code>, and platform <code>Page&lt;T&gt;</code> containers.</p> <p>Example supported shapes now include:</p> <div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ApiResponse&lt;Paging&lt;CustomerDto&gt;&gt; ApiResponse&lt;Window&lt;CustomerDto&gt;&gt;"><pre><span class="pl-s1">ApiResponse</span>&lt;<span class="pl-s1">Paging</span>&lt;<span class="pl-s1">CustomerDto</span>&gt;&gt; <span class="pl-smi">ApiResponse</span>&lt;<span class="pl-smi">Window</span>&lt;<span class="pl-smi">CustomerDto</span>&gt;&gt;</pre></div> <p>Configured containers are validated during startup to ensure the container contract is structurally supported.</p> <hr> <h2>Java Container Identity in Projection Metadata</h2> <p>Projection metadata now preserves the resolved Java container type through:</p> <div class="highlight highlight-source-yaml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="x-data-container-type"><pre><span class="pl-s">x-data-container-type</span></pre></div> <p>Built-in container example:</p> <div class="highlight highlight-source-yaml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="x-api-wrapper: true x-api-wrapper-datatype: PageCustomerDto x-data-container: Page x-data-container-type: io.github.blueprintplatform.openapi.generics.contract.paging.Page x-data-item: CustomerDto"><pre><span class="pl-ent">x-api-wrapper</span>: <span class="pl-c1">true</span> <span class="pl-ent">x-api-wrapper-datatype</span>: <span class="pl-s">PageCustomerDto</span> <span class="pl-ent">x-data-container</span>: <span class="pl-s">Page</span> <span class="pl-ent">x-data-container-type</span>: <span class="pl-s">io.github.blueprintplatform.openapi.generics.contract.paging.Page</span> <span class="pl-ent">x-data-item</span>: <span class="pl-s">CustomerDto</span></pre></div> <p>Application-defined container example:</p> <div class="highlight highlight-source-yaml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="x-api-wrapper: true x-api-wrapper-datatype: PagingCustomerDto x-data-container: Paging x-data-container-type: io.example.contract.Paging x-data-item: CustomerDto"><pre><span class="pl-ent">x-api-wrapper</span>: <span class="pl-c1">true</span> <span class="pl-ent">x-api-wrapper-datatype</span>: <span class="pl-s">PagingCustomerDto</span> <span class="pl-ent">x-data-container</span>: <span class="pl-s">Paging</span> <span class="pl-ent">x-data-container-type</span>: <span class="pl-s">io.example.contract.Paging</span> <span class="pl-ent">x-data-item</span>: <span class="pl-s">CustomerDto</span></pre></div> <p>This makes container metadata more explicit and deterministic while preserving backward compatibility with the existing <code>x-data-container</code> and <code>x-data-item</code> model.</p> <hr> <h2>Generated-Source Hygiene</h2> <p>The Java code generation parent now includes a deterministic generated-source hygiene phase.</p> <p>After generation, OpenAPI Generics cleans generated Java sources by removing duplicate and unused imports and applying consistent formatting.</p> <p>This improves generated artifact quality without changing contract semantics or runtime behavior.</p> <p>The generation lifecycle now becomes:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="OpenAPI Generator ↓ Template overlays ↓ Generated sources ↓ Generated-source hygiene ↓ Compilation"><pre lang="text" class="notranslate"><code>OpenAPI Generator ↓ Template overlays ↓ Generated sources ↓ Generated-source hygiene ↓ Compilation </code></pre></div> <hr> <h2>Platform Improvements</h2> <ul> <li>Added application-defined generic container registration through <code>openapi-generics.containers</code>.</li> <li>Added startup validation for configured generic containers.</li> <li>Added configurable item-property support for custom container contracts.</li> <li>Added <code>x-data-container-type</code> projection metadata.</li> <li>Preserved Java container identity across introspection, projection, and reconstruction.</li> <li>Unified built-in and configured containers under the same descriptor model.</li> <li>Added generated-source hygiene to the Java client generation parent.</li> <li>Removed duplicate and unused generated Java imports deterministically.</li> <li>Updated README, GitHub Pages documentation, module documentation, compatibility policy, security policy, and contributing guidance for 1.2.0.</li> <li>Expanded type coverage samples for BYOE and application-defined generic containers.</li> </ul> <hr> <h2>Quality &amp; Verification</h2> <ul> <li>Added regression coverage for configured container registration and validation.</li> <li>Added metadata validation for <code>x-data-container-type</code>.</li> <li>Added projection and reconstruction coverage for <code>Paging&lt;T&gt;</code> and <code>Window&lt;T&gt;</code> sample containers.</li> <li>Added generated-source hygiene verification.</li> <li>Verified producer → OpenAPI → generated client → consumer flows for: <ul> <li>built-in containers</li> <li>BYOE envelopes</li> <li>application-defined generic containers</li> </ul> </li> <li>Verified backward compatibility with all 1.1.x response contracts.</li> </ul> <hr> <h2>Compatibility</h2> <p>Fully backward compatible with all 1.1.x releases.</p> <p>Supported platforms:</p> <ul> <li>Java 17+</li> <li>Spring Boot 3.x</li> <li>Spring Boot 4.x</li> <li>OpenAPI Generator 7.x</li> <li>Maven-based client generation</li> </ul> <hr> <h2>Impact</h2> <ul> <li>No migration required</li> <li>No breaking contract changes</li> <li>Application-owned generic containers are now supported</li> <li>Projection metadata is more explicit and deterministic</li> <li>Generated Java clients are cleaner and easier to inspect</li> <li>BYOE scenarios are significantly more flexible</li> <li>Contract-first architecture remains unchanged</li> </ul> <hr> <h2>Closed Issues</h2> <ul> <li><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4730107489" data-permission-text="Title is private" data-url="https://github.com/blueprint-platform/openapi-generics/issues/27" data-hovercard-type="issue" data-hovercard-url="/blueprint-platform/openapi-generics/issues/27/hovercard" href="https://github.com/blueprint-platform/openapi-generics/issues/27">#27</a> Preserve Java container type in projection metadata</li> <li><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4736980376" data-permission-text="Title is private" data-url="https://github.com/blueprint-platform/openapi-generics/issues/28" data-hovercard-type="issue" data-hovercard-url="/blueprint-platform/openapi-generics/issues/28/hovercard" href="https://github.com/blueprint-platform/openapi-generics/issues/28">#28</a> Introduce generated-source hygiene phase</li> <li><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4758216004" data-permission-text="Title is private" data-url="https://github.com/blueprint-platform/openapi-generics/issues/29" data-hovercard-type="issue" data-hovercard-url="/blueprint-platform/openapi-generics/issues/29/hovercard" href="https://github.com/blueprint-platform/openapi-generics/issues/29">#29</a> Support application-defined generic containers</li> </ul> <hr> <h2>Summary</h2> <p>v1.2.0 turns the container model introduced in 1.1.0 into an extensible platform capability.</p> <p>The release adds:</p> <ul> <li>configurable application-defined generic containers</li> <li>Java container identity preservation through <code>x-data-container-type</code></li> <li>deterministic generated-source hygiene</li> <li>expanded BYOE type coverage</li> <li>updated documentation and release guidance</li> </ul> <p>while keeping all existing 1.1.x contracts fully compatible.</p> bsayli tag:github.com,2008:Repository/1045192298/v1.1.0 2026-06-21T15:42:37Z v1.1.0 — Container-Aware Generic Infrastructure and Deterministic Contract Validation <p>This release introduces the first major capability expansion since the 1.0.0 GA release.</p> <p>OpenAPI Generics now supports container-aware contract reconstruction through a dedicated generic container infrastructure and introduces deterministic OpenAPI specification validation across sample projects.</p> <p>All 1.0.x contracts remain fully supported.</p> <p>No migration is required for existing users.</p> <hr> <h2>What This Release Adds</h2> <h3>Container-Aware Generic Infrastructure</h3> <p>OpenAPI Generics previously focused on canonical response shapes such as:</p> <div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ServiceResponse&lt;T&gt; ServiceResponse&lt;Page&lt;T&gt;&gt;"><pre><span class="pl-s1">ServiceResponse</span>&lt;<span class="pl-s1">T</span>&gt; <span class="pl-smi">ServiceResponse</span>&lt;<span class="pl-smi">Page</span>&lt;<span class="pl-smi">T</span>&gt;&gt;</pre></div> <p>Version 1.1.0 introduces a dedicated container model that treats generic containers as a first-class platform capability.</p> <p>Supported response shapes now include:</p> <div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ServiceResponse&lt;T&gt; ServiceResponse&lt;List&lt;T&gt;&gt; ServiceResponse&lt;Set&lt;T&gt;&gt; ServiceResponse&lt;Page&lt;T&gt;&gt;"><pre><span class="pl-s1">ServiceResponse</span>&lt;<span class="pl-s1">T</span>&gt; <span class="pl-s1">ServiceResponse</span>&lt;<span class="pl-s1">List</span>&lt;<span class="pl-s1">T</span>&gt;&gt; <span class="pl-s1">ServiceResponse</span>&lt;<span class="pl-s1">Set</span>&lt;<span class="pl-s1">T</span>&gt;&gt; <span class="pl-smi">ServiceResponse</span>&lt;<span class="pl-smi">Page</span>&lt;<span class="pl-smi">T</span>&gt;&gt;</pre></div> <p>The same capability is available for custom BYOE envelopes:</p> <div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ApiResponse&lt;T&gt; ApiResponse&lt;List&lt;T&gt;&gt; ApiResponse&lt;Set&lt;T&gt;&gt; ApiResponse&lt;Page&lt;T&gt;&gt;"><pre><span class="pl-s1">ApiResponse</span>&lt;<span class="pl-s1">T</span>&gt; <span class="pl-s1">ApiResponse</span>&lt;<span class="pl-s1">List</span>&lt;<span class="pl-s1">T</span>&gt;&gt; <span class="pl-s1">ApiResponse</span>&lt;<span class="pl-s1">Set</span>&lt;<span class="pl-s1">T</span>&gt;&gt; <span class="pl-smi">ApiResponse</span>&lt;<span class="pl-smi">Page</span>&lt;<span class="pl-smi">T</span>&gt;&gt;</pre></div> <p>Container handling is now resolved through shared metadata rather than container-specific implementations.</p> <hr> <h2>Unified Projection and Reconstruction</h2> <p>Container metadata now participates consistently across:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="Java Contract ↓ Projection ↓ OpenAPI Schema ↓ Vendor Extensions ↓ Code Generation ↓ Runtime Reconstruction"><pre lang="text" class="notranslate"><code>Java Contract ↓ Projection ↓ OpenAPI Schema ↓ Vendor Extensions ↓ Code Generation ↓ Runtime Reconstruction </code></pre></div> <p>This eliminates container-specific branching and establishes a single reconstruction model for supported generic response types.</p> <p>Generated wrapper examples:</p> <div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ServiceResponseCustomerDto ServiceResponseListCustomerDto ServiceResponseSetCustomerDto ServiceResponsePageCustomerDto"><pre><span class="pl-smi">ServiceResponseCustomerDto</span> <span class="pl-s1">ServiceResponseListCustomerDto</span> <span class="pl-smi">ServiceResponseSetCustomerDto</span> <span class="pl-s1">ServiceResponsePageCustomerDto</span></pre></div> <div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ApiResponseCustomerDto ApiResponseListCustomerDto ApiResponseSetCustomerDto ApiResponsePageCustomerDto"><pre><span class="pl-smi">ApiResponseCustomerDto</span> <span class="pl-s1">ApiResponseListCustomerDto</span> <span class="pl-smi">ApiResponseSetCustomerDto</span> <span class="pl-s1">ApiResponsePageCustomerDto</span></pre></div> <p>All wrappers are reconstructed through the same container-aware infrastructure.</p> <hr> <h2>Deterministic OpenAPI Snapshot Validation</h2> <p>Generated OpenAPI specifications are now treated as validation artifacts.</p> <p>Sample projects now:</p> <ul> <li>generate OpenAPI specifications during validation</li> <li>commit deterministic specification snapshots</li> <li>validate projection metadata through automated assertions</li> <li>detect specification drift through CI verification</li> </ul> <p>This makes projection changes visible immediately and significantly reduces regression risk when evolving projection logic, metadata generation, schema naming, or reconstruction behavior.</p> <hr> <h2>Type Coverage Expansion</h2> <p>Validation coverage has been expanded across both canonical and BYOE contracts.</p> <p>Covered scenarios include:</p> <div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ServiceResponse&lt;T&gt; ServiceResponse&lt;List&lt;T&gt;&gt; ServiceResponse&lt;Set&lt;T&gt;&gt; ServiceResponse&lt;Page&lt;T&gt;&gt;"><pre><span class="pl-s1">ServiceResponse</span>&lt;<span class="pl-s1">T</span>&gt; <span class="pl-s1">ServiceResponse</span>&lt;<span class="pl-s1">List</span>&lt;<span class="pl-s1">T</span>&gt;&gt; <span class="pl-s1">ServiceResponse</span>&lt;<span class="pl-s1">Set</span>&lt;<span class="pl-s1">T</span>&gt;&gt; <span class="pl-smi">ServiceResponse</span>&lt;<span class="pl-smi">Page</span>&lt;<span class="pl-smi">T</span>&gt;&gt;</pre></div> <div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ApiResponse&lt;T&gt; ApiResponse&lt;List&lt;T&gt;&gt; ApiResponse&lt;Set&lt;T&gt;&gt; ApiResponse&lt;Page&lt;T&gt;&gt;"><pre><span class="pl-s1">ApiResponse</span>&lt;<span class="pl-s1">T</span>&gt; <span class="pl-s1">ApiResponse</span>&lt;<span class="pl-s1">List</span>&lt;<span class="pl-s1">T</span>&gt;&gt; <span class="pl-s1">ApiResponse</span>&lt;<span class="pl-s1">Set</span>&lt;<span class="pl-s1">T</span>&gt;&gt; <span class="pl-smi">ApiResponse</span>&lt;<span class="pl-smi">Page</span>&lt;<span class="pl-smi">T</span>&gt;&gt;</pre></div> <p>Validation includes:</p> <ul> <li>scalar payloads</li> <li>value payloads</li> <li>enum payloads</li> <li>DTO payloads</li> <li>collection payloads</li> <li>paged payloads</li> <li>generated client reconstruction</li> <li>runtime deserialization</li> <li>consumer integration</li> </ul> <p>All scenarios are verified through producer → OpenAPI → generated client → consumer pipelines.</p> <hr> <h2>Platform Improvements</h2> <ul> <li>Introduced extensible generic container metadata model.</li> <li>Unified container handling across projection and generation.</li> <li>Added descriptor-based container resolution.</li> <li>Added deterministic OpenAPI snapshot verification.</li> <li>Added specification drift detection to CI validation.</li> <li>Reorganized sample hierarchy and aggregators.</li> <li>Expanded architecture, adoption, compatibility, and release documentation.</li> <li>Updated all project documentation for the 1.1.0 release line.</li> </ul> <hr> <h2>Compatibility</h2> <p>Fully backward compatible with all 1.0.x releases.</p> <p>Supported platforms:</p> <ul> <li>Java 17+</li> <li>Spring Boot 3.x</li> <li>Spring Boot 4.x</li> <li>OpenAPI Generator 7.x</li> <li>Maven-based client generation</li> </ul> <hr> <h2>Impact</h2> <ul> <li>No migration required</li> <li>No breaking contract changes</li> <li>Expanded supported generic response shapes</li> <li>BYOE nested container support</li> <li>Stronger projection guarantees</li> <li>Deterministic specification validation</li> <li>Improved long-term maintainability of projection and reconstruction logic</li> </ul> <hr> <h2>Closed Issues</h2> <ul> <li><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4706728239" data-permission-text="Title is private" data-url="https://github.com/blueprint-platform/openapi-generics/issues/24" data-hovercard-type="issue" data-hovercard-url="/blueprint-platform/openapi-generics/issues/24/hovercard" href="https://github.com/blueprint-platform/openapi-generics/issues/24">#24</a> Introduce extensible generic container infrastructure</li> <li><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4707977956" data-permission-text="Title is private" data-url="https://github.com/blueprint-platform/openapi-generics/issues/25" data-hovercard-type="issue" data-hovercard-url="/blueprint-platform/openapi-generics/issues/25/hovercard" href="https://github.com/blueprint-platform/openapi-generics/issues/25">#25</a> Establish deterministic OpenAPI specification validation</li> </ul> <hr> <h2>Summary</h2> <p>v1.1.0 expands OpenAPI Generics from a Page-oriented generic reconstruction model into a container-aware platform architecture.</p> <p>The release introduces:</p> <ul> <li>extensible generic container support</li> <li>List, Set, and Page reconstruction</li> <li>BYOE container support</li> <li>deterministic OpenAPI snapshot validation</li> <li>expanded end-to-end verification coverage</li> </ul> <p>while preserving the contract-first architecture and backward compatibility established in the 1.0.x GA line.</p> bsayli tag:github.com,2008:Repository/1045192298/v1.0.3 2026-06-13T10:25:05Z v1.0.3 — Type Coverage Validation, Platform Hardening and Generator Alignment <p>This release is a <strong>patch-level update</strong> for the 1.0.x GA line, focusing on platform correctness, validation coverage, generation consistency, and end-to-end verification.</p> <p>No contract changes.<br> No public API behavior changes.<br> No generated client structure changes.</p> <p>Fully compatible with the <strong>1.0.0, 1.0.1, and 1.0.2 GA contracts</strong>.</p> <hr> <h2>What This Release Improves</h2> <ul> <li>Generic wrapper reconstruction is now validated through dedicated type coverage suites</li> <li>Direct enum payload support is formally enforced and documented</li> <li>OpenAPI Generator version alignment is now deterministic across the entire generation pipeline</li> <li>Ignored model handling is aligned with upstream OpenAPI Generator processing lifecycle</li> <li>Spring Boot 3 and Spring Boot 4 sample verification has been refreshed and upgraded</li> </ul> <hr> <h2>Type Coverage Validation</h2> <p>This release introduces dedicated type coverage samples that verify the complete contract-to-client lifecycle.</p> <p>The new validation suites cover:</p> <ul> <li>Canonical <code>ServiceResponse&lt;T&gt;</code> usage</li> <li>Custom BYOE response envelopes</li> <li>Generic wrapper reconstruction</li> <li>OpenAPI projection correctness</li> <li>Generated client compatibility</li> <li>End-to-end producer/client/consumer verification</li> </ul> <p>These samples provide a focused environment for validating supported generic response patterns and preventing regressions in future releases.</p> <hr> <h2>Enum Payload Validation</h2> <p>Direct enum payload support is now explicitly validated.</p> <p>OpenAPI Generics relies on stable OpenAPI component identities for generic wrapper reconstruction.</p> <p>As a result:</p> <ul> <li>Direct enum payloads are supported only when exposed as reusable OpenAPI schema components</li> <li><code>@Schema(enumAsRef = true)</code> is now required for enum payload reconstruction</li> <li>Unsupported inline enum payloads are rejected during response type discovery</li> <li>DTOs containing enum fields remain fully supported</li> </ul> <p>This change enforces an existing architectural boundary rather than introducing a new capability.</p> <hr> <h2>Generator Consistency</h2> <p>Generator version alignment has been hardened across the full client-generation lifecycle.</p> <p>The configured OpenAPI Generator version now consistently drives:</p> <ul> <li>plugin execution</li> <li>generator runtime dependencies</li> <li>upstream template extraction</li> <li>internal generation behavior</li> </ul> <p>This removes version drift scenarios and improves reproducibility for advanced customization and generator upgrades.</p> <hr> <h2>Generator Lifecycle Hardening</h2> <p>Ignored models are now removed before upstream OpenAPI Generator global model processing begins.</p> <p>This prevents intentionally excluded schemas from participating in model graph traversal and eliminates misleading warning messages during generation.</p> <p>Benefits include:</p> <ul> <li>cleaner generation output</li> <li>improved CI/CD log quality</li> <li>better alignment with upstream generator lifecycle expectations</li> </ul> <p>Generated source behavior remains unchanged.</p> <hr> <h2>Platform &amp; Sample Updates</h2> <ul> <li>Upgraded platform modules and samples to Spring Boot 3.5.15</li> <li>Upgraded OpenAPI Generator alignment to 7.23.0</li> <li>Upgraded Spring Boot 4 samples to Spring Boot 4.0.7</li> <li>Simplified sample module structure and metadata</li> <li>Expanded sample documentation and verification workflows</li> </ul> <hr> <h2>Quality &amp; Verification</h2> <ul> <li>Added regression coverage for enum payload discovery</li> <li>Added regression coverage for ignored model lifecycle handling</li> <li>Added regression coverage for generator version consistency</li> <li>Verified Spring Boot 3 sample pipeline</li> <li>Verified Spring Boot 4 sample pipeline</li> <li>Verified Docker-based sample execution</li> <li>Verified end-to-end producer/client/consumer flows</li> </ul> <hr> <h2>Impact</h2> <ul> <li>No migration required</li> <li>No contract changes</li> <li>No generated client changes</li> <li>More deterministic generation behavior</li> <li>Stronger validation of supported response patterns</li> <li>Improved sample-based verification coverage</li> <li>Cleaner and more predictable build output</li> </ul> <hr> <h2>Summary</h2> <p>v1.0.3 is a <strong>platform hardening, validation, and verification update</strong>.</p> <p>It strengthens the platform by:</p> <ul> <li>validating generic response reconstruction through dedicated coverage suites</li> <li>enforcing supported enum payload boundaries</li> <li>eliminating generator lifecycle inconsistencies</li> <li>guaranteeing generator version alignment</li> <li>improving reproducibility across local, CI, and sample verification environments</li> </ul> <p>Without changing the contract-first architecture introduced in <strong>1.0.0 GA</strong>.</p> <h2>Closed Issues</h2> <ul> <li><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4654567978" data-permission-text="Title is private" data-url="https://github.com/blueprint-platform/openapi-generics/issues/23" data-hovercard-type="issue" data-hovercard-url="/blueprint-platform/openapi-generics/issues/23/hovercard" href="https://github.com/blueprint-platform/openapi-generics/issues/23">#23</a> Enforce reusable enum component requirement for direct enum payloads</li> <li><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4528294530" data-permission-text="Title is private" data-url="https://github.com/blueprint-platform/openapi-generics/issues/22" data-hovercard-type="issue" data-hovercard-url="/blueprint-platform/openapi-generics/issues/22/hovercard" href="https://github.com/blueprint-platform/openapi-generics/issues/22">#22</a> Prevent ignored models from entering upstream global model post-processing</li> <li><a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4508017993" data-permission-text="Title is private" data-url="https://github.com/blueprint-platform/openapi-generics/issues/21" data-hovercard-type="issue" data-hovercard-url="/blueprint-platform/openapi-generics/issues/21/hovercard" href="https://github.com/blueprint-platform/openapi-generics/issues/21">#21</a> Honor configured OpenAPI Generator version across generation pipeline</li> </ul> bsayli tag:github.com,2008:Repository/1045192298/v1.0.2 2026-05-16T14:32:29Z v1.0.2 — Documentation Clarity, BYOC Hardening and Verified Build Quality <p>This release is a <strong>patch-level update</strong> for the 1.0.x GA line, focusing on documentation clarity, defensive validation, and build verification.</p> <p>No contract changes.<br> No public API behavior changes.<br> No generated client structure changes.</p> <p>Fully compatible with the <strong>1.0.0 and 1.0.1 GA contracts</strong>.</p> <hr> <h2>What This Release Improves</h2> <ul> <li>Documentation now follows a clearer <strong>problem → proof → adoption</strong> flow</li> <li>Server and client adoption guides are more explicit and easier to follow</li> <li>BYOE and BYOC configuration semantics are clarified</li> <li>External model validation is more defensive and provides better diagnostics</li> <li>Sample pipelines and CI verification are more robust and reproducible</li> </ul> <hr> <h2>Documentation &amp; Adoption Clarity</h2> <ul> <li>Reworked README and documentation site structure for faster evaluation and onboarding</li> <li>Clarified server-side and client-side adoption guides</li> <li>Documented that <code>openapi-generics-server-starter</code> runs <strong>only during Springdoc OpenAPI document generation</strong> (<code>/v3/api-docs</code> and CI generation)</li> <li>Clarified Bring Your Own Envelope (BYOE) configuration and constraints</li> <li>Clarified Bring Your Own Contract (BYOC) usage and shared-contract patterns</li> <li>Clarified fallback behavior for reverting to standard OpenAPI Generator output</li> <li>Improved sample documentation and run-and-verify instructions</li> </ul> <hr> <h2>Build &amp; Dependency Quality</h2> <ul> <li>Centralized version management and strengthened parent POM alignment</li> <li>Added Spotless-based source formatting to the build</li> <li>Improved Docker-based sample builds for self-contained local verification</li> <li>Strengthened CI workflows for snapshot and local-install validation</li> </ul> <hr> <h2>BYOC Hardening</h2> <p>External model registration is now more defensive.</p> <ul> <li>Ignores null, blank, and invalid FQCN mappings</li> <li>Emits clear diagnostic warnings for invalid configuration</li> <li>Prevents accidental registration of malformed external model definitions</li> </ul> <p>This improves reliability when reusing DTOs from shared contract modules.</p> <hr> <h2>Quality &amp; Verification</h2> <ul> <li>Added unit tests for invalid and edge-case external model configurations</li> <li>Stabilized Spring Boot 3 and Spring Boot 4 sample pipelines</li> <li>Verified end-to-end Docker-based sample execution</li> </ul> <hr> <h2>Impact</h2> <ul> <li>No migration required</li> <li>No behavior changes for existing users</li> <li>Improved clarity of adoption and configuration</li> <li>More robust BYOC diagnostics</li> <li>Stronger reproducibility across local and CI builds</li> </ul> <hr> <h2>Summary</h2> <p>v1.0.2 is a <strong>documentation, diagnostics, and build quality update</strong>.</p> <p>It makes the platform:</p> <ul> <li>easier to understand</li> <li>easier to adopt</li> <li>more defensive in BYOC configuration</li> <li>more reproducible across build and verification pipelines</li> </ul> <p>Without changing the contract-first architecture introduced in <strong>1.0.0 GA</strong>.</p> bsayli tag:github.com,2008:Repository/1045192298/v1.0.1 2026-05-01T13:26:29Z v1.0.1 — Build Hygiene, Dependency Alignment and Verified Release Stability <p>This release is a <strong>patch-level update</strong> for the 1.0.x GA line, focusing on build correctness, dependency alignment, and release readiness.</p> <p>No contract changes.<br> No public API behavior changes.<br> No generated client structure changes.</p> <p>Fully compatible with the <strong>1.0.0 GA contract</strong>.</p> <hr> <h2>What This Release Improves</h2> <ul> <li>Maven build structure is now <strong>cleanly partitioned between aggregator and modules</strong></li> <li>Plugin execution boundaries are <strong>strictly enforced</strong></li> <li>Dependency alignment is <strong>deterministic across all modules</strong></li> <li>Release pipeline is <strong>fully verified and reproducible</strong></li> </ul> <hr> <h2>Build &amp; Dependency Alignment</h2> <ul> <li>Refined Maven POM hygiene across all platform modules</li> <li>Ensured root aggregator remains lifecycle-safe (no unintended plugin execution)</li> <li>Scoped build orchestration strictly to child modules</li> <li>Strengthened dependency management and explicitly controlled transitive versions</li> <li>Updated OpenAPI Generator alignment to <strong>7.22.0</strong></li> <li>Upgraded Spring Boot baseline to <strong>3.5.14</strong> across platform modules and samples</li> </ul> <hr> <h2>Template Governance (Zero-Drift Guarantee)</h2> <p>The platform continues to enforce a <strong>no-fork, no-drift strategy</strong> for OpenAPI Generator templates.</p> <ul> <li>Upstream templates are dynamically extracted during build</li> <li>A targeted, non-destructive patch injects generics-aware wrapper logic</li> <li>The patch is <strong>signature-validated at build time</strong></li> </ul> <p>If upstream structure changes:</p> <blockquote> <p>The build fails fast instead of producing invalid clients</p> </blockquote> <p>This guarantees long-term alignment with the OpenAPI Generator <strong>7.x</strong> line without template divergence.</p> <hr> <h2>Quality &amp; Verification</h2> <ul> <li> <p>Integrated JaCoCo + Codecov for coverage visibility</p> </li> <li> <p>Added unit and edge-case coverage for:</p> <ul> <li>server-side projection</li> <li>wrapper enrichment logic</li> </ul> </li> <li> <p>Verified full pipelines across:</p> <ul> <li>Spring Boot 3</li> <li>Spring Boot 4</li> </ul> </li> </ul> <hr> <h2>Impact</h2> <ul> <li> <p>No behavioral change for existing users</p> </li> <li> <p>No migration required</p> </li> <li> <p>Improved reliability of:</p> <ul> <li>build lifecycle</li> <li>dependency resolution</li> <li>release publishing</li> </ul> </li> </ul> <hr> <h2>Summary</h2> <p>v1.0.1 is a <strong>release-hygiene and alignment update</strong>.</p> <p>It ensures that the platform is:</p> <ul> <li>structurally clean</li> <li>dependency-stable</li> <li>reproducible in build and release pipelines</li> </ul> <p>Without altering the core contract model introduced in <strong>1.0.0 GA</strong>.</p> bsayli tag:github.com,2008:Repository/1045192298/v1.0.0 2026-04-22T20:23:26Z v1.0.0 — Contract-First Generics Platform with Bring Your Own Envelope (BYOE) and End-to-End Stability <p>This release marks the <strong>General Availability</strong> of the openapi-generics platform.</p> <p>The architecture is now <strong>complete, stable, and adoption-ready</strong>.</p> <blockquote> <p>The platform no longer defines how you should build APIs —<br> it adapts to how you already build them.</p> </blockquote> <hr> <h2>What This Release Establishes</h2> <ul> <li>Contract-first architecture is now <strong>fully enforced and stable</strong></li> <li>Custom response envelopes (<strong>BYOE</strong>) are now <strong>fully supported</strong></li> <li>External contract reuse (<strong>BYOC</strong>) is <strong>first-class</strong></li> <li>OpenAPI is strictly a <strong>projection layer (not a contract source)</strong></li> <li>The full pipeline is <strong>deterministic and validated end-to-end</strong></li> </ul> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="Contract → Server → OpenAPI → Client → Consumer"><pre class="notranslate"><code>Contract → Server → OpenAPI → Client → Consumer </code></pre></div> <hr> <h2>Key Feature — BYOE (Bring Your Own Envelope)</h2> <p>The platform no longer requires <code>ServiceResponse&lt;T&gt;</code>.</p> <p>Teams can now use their <strong>existing envelope</strong> without migration.</p> <h3>Server</h3> <div class="highlight highlight-source-yaml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="openapi-generics: envelope: type: io.example.ApiResponse"><pre><span class="pl-ent">openapi-generics</span>: <span class="pl-ent">envelope</span>: <span class="pl-ent">type</span>: <span class="pl-s">io.example.ApiResponse</span></pre></div> <h3>Client (Codegen)</h3> <div class="highlight highlight-text-xml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="&lt;additionalProperty&gt; openapi-generics.envelope=io.example.ApiResponse &lt;/additionalProperty&gt;"><pre>&lt;<span class="pl-ent">additionalProperty</span>&gt; openapi-generics.envelope=io.example.ApiResponse &lt;/<span class="pl-ent">additionalProperty</span>&gt;</pre></div> <h3>Behavior</h3> <ul> <li>Default → <code>ServiceResponse&lt;T&gt;</code> (no change)</li> <li>Configured → custom envelope fully replaces default</li> </ul> <h3>Scope</h3> <ul> <li><code>ApiResponse&lt;T&gt;</code> ✅</li> <li><code>ApiResponse&lt;Page&lt;T&gt;&gt;</code> ❌ (intentionally out of scope)</li> </ul> <hr> <h2>What Changed</h2> <h3>Envelope Abstraction Becomes Configurable</h3> <ul> <li> <p>Introduced <code>EnvelopeMetadataResolver</code></p> </li> <li> <p>Injects:</p> <ul> <li><code>x-envelope-import</code></li> <li><code>x-envelope-type</code></li> </ul> </li> <li> <p><code>api_wrapper.mustache</code> is now fully dynamic</p> </li> </ul> <p>Result:</p> <blockquote> <p>Envelope is no longer hardcoded — it is resolved at generation time</p> </blockquote> <hr> <h3>Server Projection Refinement</h3> <ul> <li> <p>Removed class-level annotation injection from projection</p> </li> <li> <p>Projection is now strictly:</p> <ul> <li>language-agnostic</li> <li>semantic-only</li> </ul> </li> <li> <p>Wrapper processing is now <strong>non-destructive</strong>:</p> <ul> <li>no schema overrides</li> <li>only enrichment</li> </ul> </li> <li> <p>Relaxed validation constraints:</p> <ul> <li><code>allOf</code> no longer required</li> </ul> </li> </ul> <p>Result:</p> <blockquote> <p>OpenAPI remains a clean projection of the contract</p> </blockquote> <hr> <h3>Codegen Alignment</h3> <ul> <li>Full support for BYOE in generator layer</li> <li>Wrapper models dynamically extend configured envelope</li> <li>External models + envelope now resolved consistently</li> </ul> <p>Result:</p> <blockquote> <p>Client generation remains deterministic under customization</p> </blockquote> <hr> <h3>Documentation Overhaul</h3> <p>All sample documentation rewritten to be:</p> <ul> <li>minimal</li> <li>action-oriented</li> <li>usage-first</li> </ul> <p>Removed:</p> <ul> <li>narrative explanations</li> <li>redundant architecture descriptions</li> </ul> <p>Result:</p> <blockquote> <p>Faster onboarding, clearer intent</p> </blockquote> <hr> <h3>Pipeline Stabilization</h3> <p>The full system is now verified as:</p> <ul> <li>deterministic</li> <li>reproducible</li> <li>contract-aligned</li> </ul> <p>Across:</p> <ul> <li>Server projection</li> <li>OpenAPI output</li> <li>Client generation</li> <li>Consumer integration</li> </ul> <hr> <h2>Impact</h2> <ul> <li> <p>No forced envelope migration</p> </li> <li> <p>Existing systems can adopt incrementally</p> </li> <li> <p>No model duplication in clients</p> </li> <li> <p>Clear separation of concerns:</p> <ul> <li>contract</li> <li>projection</li> <li>generation</li> <li>consumption</li> </ul> </li> <li> <p>Reduced cognitive load for adopters</p> </li> </ul> <hr> <h2>🔐 Compatibility</h2> <table> <thead> <tr> <th>Component</th> <th>Supported Versions</th> </tr> </thead> <tbody> <tr> <td>Java</td> <td>17+</td> </tr> <tr> <td>Spring Boot</td> <td>3.x / 4.x</td> </tr> </tbody> </table> <hr> <h2>Context</h2> <p>Previous releases established:</p> <ul> <li>modular platform structure</li> <li>contract-first baseline</li> <li>generics-aware generation</li> <li>BYOC (Bring Your Own Contract)</li> </ul> <p>This release completes the model by introducing:</p> <blockquote> <p>BYOE — making the platform adaptable to existing systems</p> </blockquote> <hr> <h2>Summary</h2> <p>v1.0.0 is a <strong>stability and adoption release</strong>.</p> <p>The platform is now:</p> <ul> <li>contract-first</li> <li>projection-driven</li> <li>generator-aligned</li> <li>envelope-agnostic</li> </ul> <p>No hidden behavior.<br> No forced abstractions.</p> <p>Just:</p> <blockquote> <p>deterministic contracts, adaptable integration, and end-to-end alignment.</p> </blockquote> bsayli tag:github.com,2008:Repository/1045192298/v0.9.0 2026-04-12T16:15:46Z v0.9.0 — Contract-First Generics Platform, BYOC, and End-to-End Validation <p>This release formalizes the architecture that has been evolving across previous versions.</p> <p>The platform is now <strong>explicitly contract-first</strong>, supports <strong>external contract reuse (BYOC)</strong>, and is <strong>validated end-to-end</strong> with real consumer modules.</p> <blockquote> <p>This is the release where the architecture is no longer a concept — it runs.</p> </blockquote> <hr> <h2>🎯 What This Release Establishes</h2> <ul> <li>Contract-first generation is now <strong>explicit and enforced</strong></li> <li>External contract reuse (<strong>Bring Your Own Contract - BYOC</strong>) is now <strong>first-class</strong></li> <li>The full pipeline is <strong>proven end-to-end</strong>:</li> </ul> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="Contract → OpenAPI → Generated Client → Consumer"><pre class="notranslate"><code>Contract → OpenAPI → Generated Client → Consumer </code></pre></div> <ul> <li>Both <strong>Spring Boot 3</strong> and <strong>Spring Boot 4</strong> stacks are validated</li> </ul> <hr> <h2>🔧 What Changed</h2> <h3>Explicit Generator Activation</h3> <ul> <li><code>generatorName=java-generics-contract</code> is now required</li> <li>implicit activation removed from parent configuration</li> </ul> <p>This makes generation behavior:</p> <blockquote> <p>explicit, predictable, and debuggable</p> </blockquote> <hr> <h3>External Contract Reuse (BYOC)</h3> <ul> <li>Introduced <code>openapiGenerics.responseContract.*</code> mapping</li> <li>Enabled reuse of externally owned DTOs</li> <li>Prevented duplicate model generation</li> <li>Ensured correct import injection in generated wrappers</li> </ul> <p>This establishes:</p> <blockquote> <p>contract ownership outside the generator, without drift</p> </blockquote> <hr> <h3>Codegen Refactoring</h3> <p>Generator internals were decomposed for clarity and control:</p> <ul> <li><code>ExternalModelRegistry</code></li> <li><code>ModelIgnoreDecider</code></li> <li><code>ExternalImportResolver</code></li> </ul> <p><code>GenericAwareJavaCodegen</code> is now focused on orchestration only.</p> <hr> <h3>Spring Boot 4 Client Support</h3> <ul> <li>RestClient-based client generation</li> <li>Jackson 3 compatibility</li> <li>Fixed compile-time issues in SB4 client</li> </ul> <hr> <h3>Consumer Module (NEW)</h3> <ul> <li>Added <code>customer-service-consumer</code> (SB3 &amp; SB4)</li> <li>Demonstrates real client usage</li> <li>Validates full pipeline integration</li> </ul> <p>This provides:</p> <blockquote> <p>executable proof that contract alignment holds in real usage</p> </blockquote> <hr> <h3>CI &amp; Coverage Updates</h3> <ul> <li>Coverage scoped to sample modules</li> <li>Baseline adjusted to 50%</li> <li>Workflows updated for SB3 / SB4 structure</li> </ul> <hr> <h3>Documentation Updates</h3> <ul> <li>Aligned client adoption guide with explicit configuration model</li> <li>Clarified generator usage</li> <li>Documented contract reuse approach</li> </ul> <hr> <h2>📦 Impact</h2> <ul> <li>Client generation is now <strong>explicit and deterministic</strong></li> <li>External contract models are <strong>reused (no duplication)</strong></li> <li>Generator behavior is <strong>easier to reason about and debug</strong></li> <li>Architecture is <strong>validated with real consumer integration</strong></li> <li>Documentation reflects <strong>actual system behavior</strong></li> </ul> <hr> <h2>🔐 Compatibility</h2> <table> <thead> <tr> <th>Component</th> <th>Supported Versions</th> </tr> </thead> <tbody> <tr> <td>Java</td> <td>17+</td> </tr> <tr> <td>Spring Boot</td> <td>3.x / 4.x</td> </tr> </tbody> </table> <hr> <h2>🧭 Context</h2> <p>Previous releases established:</p> <ul> <li>platform modularization</li> <li>Maven Central publishing</li> <li>generics-aware generation baseline</li> </ul> <p>This release completes the picture by ensuring:</p> <blockquote> <p>contract definition, projection, generation, and consumption are aligned and verifiable</p> </blockquote> <hr> <h2>🎯 Summary</h2> <p>v0.9.0 is an <strong>architecture consolidation release</strong>.</p> <p>No shortcuts. No implicit behavior.</p> <p>Just:</p> <blockquote> <p>explicit contracts, deterministic generation, and proven end-to-end alignment.</p> </blockquote> bsayli tag:github.com,2008:Repository/1045192298/v0.8.2 2026-04-05T21:58:17Z v0.8.2 — Java 17 Baseline & Compatibility Alignment <p>This release focuses on <strong>broadening runtime compatibility</strong> by aligning the platform to a <strong>Java 17 baseline</strong>.</p> <p>No architectural changes are introduced.</p> <blockquote> <p>This is a follow-up release to v0.8.1, which established the platform structure and Maven Central distribution.</p> </blockquote> <hr> <h2>🔧 What Changed</h2> <h3>Java Baseline Alignment</h3> <p>All core modules are now:</p> <ul> <li>compiled with <strong>Java 17</strong></li> <li>compatible with <strong>Java 17+ runtimes</strong></li> </ul> <p>This allows the platform to be used in:</p> <ul> <li>enterprise environments still on Java 17</li> <li>newer runtimes (Java 21, 25+) without restriction</li> </ul> <hr> <h2>📦 Impact</h2> <ul> <li>no changes to public API</li> <li>no changes to contract semantics</li> <li>no changes to OpenAPI generation behavior</li> <li>no changes to client generation</li> </ul> <p>Only:</p> <blockquote> <p>compilation baseline is lowered for wider adoption</p> </blockquote> <hr> <h2>🔐 Compatibility</h2> <table> <thead> <tr> <th>Component</th> <th>Supported Versions</th> </tr> </thead> <tbody> <tr> <td>Java</td> <td>17+</td> </tr> </tbody> </table> <hr> <h2>🧭 Context</h2> <p>Release <strong>0.8.1</strong> introduced:</p> <ul> <li>platform modularization</li> <li>Maven Central publishing</li> <li>contract-first architecture</li> </ul> <p>This release ensures that foundation is:</p> <blockquote> <p>accessible to a broader Java ecosystem</p> </blockquote> <hr> <h2>🎯 Summary</h2> <p>v0.8.2 is a <strong>compatibility refinement release</strong>.</p> <p>No new features. No behavioral changes.</p> <p>Just:</p> <blockquote> <p>wider reach, same architecture.</p> </blockquote> bsayli tag:github.com,2008:Repository/1045192298/v0.8.1 2026-04-04T17:03:14Z v0.8.1 — Platform Modularization & Maven Central Publishing <h1>OpenAPI Generics v0.8.1 — Platform Modularization &amp; Maven Central Publishing</h1> <p>Release <strong>0.8.1</strong> marks the point where the project transitions from a reference implementation into a <strong>publishable, dependency-driven platform</strong>.</p> <p>All core capabilities are now packaged as modular artifacts and <strong>available on Maven Central</strong>, enabling direct adoption without copying code or maintaining local templates.</p> <blockquote> <p>Define your contract once. Depend on the platform. Generate clients deterministically.</p> </blockquote> <hr> <h1>✨ Highlights</h1> <h2>📦 Maven Central Publishing (First-Class Distribution)</h2> <p>All platform modules are now published and versioned:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="io.github.blueprint-platform version: 0.8.x"><pre class="notranslate"><code>io.github.blueprint-platform version: 0.8.x </code></pre></div> <p>Available artifacts:</p> <ul> <li><code>openapi-generics</code></li> <li><code>openapi-generics-contract</code></li> <li><code>openapi-generics-server-starter</code></li> <li><code>openapi-generics-java-codegen</code></li> <li><code>openapi-generics-java-codegen-parent</code></li> <li><code>openapi-generics-platform-bom</code></li> </ul> <p>This establishes the platform as a <strong>consumable dependency</strong>, not a codebase to replicate.</p> <hr> <h2>🧱 Platform Modularization (Clear Ownership Boundaries)</h2> <p>The system is now decomposed into <strong>independently versioned modules</strong> with explicit responsibilities:</p> <ul> <li><strong>Contract</strong> → <code>openapi-generics-contract</code></li> <li><strong>Projection (OpenAPI)</strong> → <code>openapi-generics-server-starter</code></li> <li><strong>Generation</strong> → <code>openapi-generics-java-codegen</code></li> <li><strong>Build orchestration</strong> → <code>openapi-generics-java-codegen-parent</code></li> <li><strong>Dependency alignment</strong> → <code>openapi-generics-platform-bom</code></li> </ul> <p>Ownership is no longer implicit.</p> <blockquote> <p>Contract defines truth → OpenAPI represents it → Generator reconstructs it.</p> </blockquote> <hr> <h2>🚀 Dependency-Based Usage (No Copying, No Templates)</h2> <p>The platform is designed for <strong>direct integration via dependencies</strong>.</p> <h3>Server (producer)</h3> <div class="highlight highlight-text-xml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="&lt;dependency&gt; &lt;groupId&gt;io.github.blueprint-platform&lt;/groupId&gt; &lt;artifactId&gt;openapi-generics-server-starter&lt;/artifactId&gt; &lt;version&gt;0.8.x&lt;/version&gt; &lt;/dependency&gt;"><pre>&lt;<span class="pl-ent">dependency</span>&gt; &lt;<span class="pl-ent">groupId</span>&gt;io.github.blueprint-platform&lt;/<span class="pl-ent">groupId</span>&gt; &lt;<span class="pl-ent">artifactId</span>&gt;openapi-generics-server-starter&lt;/<span class="pl-ent">artifactId</span>&gt; &lt;<span class="pl-ent">version</span>&gt;0.8.x&lt;/<span class="pl-ent">version</span>&gt; &lt;/<span class="pl-ent">dependency</span>&gt;</pre></div> <h3>Client (consumer)</h3> <div class="highlight highlight-text-xml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="&lt;parent&gt; &lt;groupId&gt;io.github.blueprint-platform&lt;/groupId&gt; &lt;artifactId&gt;openapi-generics-java-codegen-parent&lt;/artifactId&gt; &lt;version&gt;0.8.x&lt;/version&gt; &lt;/parent&gt;"><pre>&lt;<span class="pl-ent">parent</span>&gt; &lt;<span class="pl-ent">groupId</span>&gt;io.github.blueprint-platform&lt;/<span class="pl-ent">groupId</span>&gt; &lt;<span class="pl-ent">artifactId</span>&gt;openapi-generics-java-codegen-parent&lt;/<span class="pl-ent">artifactId</span>&gt; &lt;<span class="pl-ent">version</span>&gt;0.8.x&lt;/<span class="pl-ent">version</span>&gt; &lt;/<span class="pl-ent">parent</span>&gt;</pre></div> <p>That’s it.</p> <p>Everything else in this repository is a <strong>reference implementation</strong> of this setup.</p> <hr> <h2>🧱 First-Class Canonical Contract (SSOT)</h2> <p>The response model is now a dedicated artifact:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="openapi-generics-contract"><pre class="notranslate"><code>openapi-generics-contract </code></pre></div> <p>It defines:</p> <ul> <li><code>ServiceResponse&lt;T&gt;</code> as the canonical envelope</li> <li><code>Page&lt;T&gt;</code> and pagination primitives</li> <li>a consistent RFC 9457-aligned error model</li> </ul> <p>The contract is now explicit and reusable.</p> <blockquote> <p>It is the <strong>single source of truth (SSOT)</strong> across all layers.</p> </blockquote> <hr> <h2>⚙️ Deterministic OpenAPI Projection Pipeline</h2> <p>OpenAPI generation is implemented as a <strong>single orchestrated pipeline</strong>:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="Discovery → Introspection → Wrapper Processing → Ignore Marking → Validation"><pre class="notranslate"><code>Discovery → Introspection → Wrapper Processing → Ignore Marking → Validation </code></pre></div> <p>Guarantees:</p> <ul> <li>deterministic output (same input → same OpenAPI)</li> <li>single execution path (no fragmented lifecycle)</li> <li>fail-fast validation</li> <li>framework isolation (MVC/WebFlux via strategy)</li> </ul> <hr> <h2>🧩 Contract-Aware Client Generation</h2> <p>Client generation is now <strong>aligned with the contract</strong>, not template hacks.</p> <p>Behavior:</p> <ul> <li>contract-owned models are <strong>never generated</strong></li> <li><code>x-ignore-model</code> is enforced</li> <li>only <strong>thin wrapper types</strong> are emitted</li> <li>imports bind directly to canonical types</li> </ul> <p>Example:</p> <div class="highlight highlight-source-java notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="public class ServiceResponsePageCustomerDto extends ServiceResponse&lt;Page&lt;CustomerDto&gt;&gt; {}"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-smi">ServiceResponsePageCustomerDto</span> <span class="pl-k">extends</span> <span class="pl-smi">ServiceResponse</span>&lt;<span class="pl-smi">Page</span>&lt;<span class="pl-smi">CustomerDto</span>&gt;&gt; {}</pre></div> <p>Result:</p> <ul> <li>generics preserved end-to-end</li> <li>zero duplication</li> <li>stable type system</li> </ul> <hr> <h2>🚫 Elimination of Generation Hacks</h2> <p>Removed completely:</p> <ul> <li><code>.openapi-generator-ignore</code></li> <li>DTO cleanup steps</li> <li>formatter-based import fixes</li> <li>scattered template overrides</li> </ul> <p>Replaced by:</p> <ul> <li>contract ownership</li> <li>projection-time semantics</li> <li>generator-level enforcement</li> </ul> <blockquote> <p>No post-processing. No cleanup. No hidden behavior.</p> </blockquote> <hr> <h2>🧠 Vendor Extensions as a Formal DSL</h2> <p>Contract semantics are expressed via a deterministic extension model:</p> <ul> <li><code>x-api-wrapper</code></li> <li><code>x-api-wrapper-datatype</code></li> <li><code>x-data-container</code></li> <li><code>x-data-item</code></li> <li><code>x-ignore-model</code></li> </ul> <p>These are:</p> <ul> <li>defined during projection</li> <li>carried through OpenAPI</li> <li>enforced during generation</li> </ul> <hr> <h2>🧪 Samples Decoupled from Runtime</h2> <p>Samples are moved to <code>/samples</code> and act as:</p> <blockquote> <p>external consumers validating the platform</p> </blockquote> <p>This separates platform logic from usage examples.</p> <hr> <h2>📘 Documentation Realignment</h2> <p>Docs are restructured around a <strong>contract lifecycle model</strong>:</p> <ul> <li>problem → solution → proof → usage</li> <li>clear server vs client responsibilities</li> <li>projection vs authority distinction</li> <li>mental model: <em>thin adapters, not models</em></li> </ul> <hr> <h1>🎯 Outcome</h1> <p>Release <strong>0.8.1</strong> establishes the platform foundation:</p> <ul> <li>platform is consumable via Maven Central</li> <li>contract is defined once and reused everywhere</li> <li>OpenAPI is a deterministic projection (not authority)</li> <li>clients reconstruct contract shape instead of redefining it</li> <li>build pipelines are predictable and maintainable</li> </ul> <hr> <h1>🔐 Compatibility</h1> <p>No breaking changes to:</p> <ul> <li>response envelope semantics</li> <li>OpenAPI schema meaning</li> <li>runtime behavior</li> </ul> <p>Changes are architectural and structural.</p> <hr> <h1>🧭 Direction</h1> <p>The platform now follows a strict principle:</p> <blockquote> <p>define semantic contracts once — project, reconstruct, and consume them without reinterpretation</p> </blockquote> <p>Everything else is infrastructure.</p> <hr> <h1>🚀 Looking Ahead</h1> <p>Next iterations will focus on:</p> <ul> <li>expanding reusable contract tooling</li> <li>validating multi-service adoption</li> <li>preparing for <strong>1.0.0</strong> stabilization</li> </ul> <p>The direction remains unchanged:</p> <p><strong>contract integrity, deterministic pipelines, and dependency-driven adoption.</strong></p> bsayli tag:github.com,2008:Repository/1045192298/v0.7.9 2026-03-25T14:48:21Z v0.7.9 — Deterministic Client Generation & OpenAPI Template Governance <p>Release <strong>0.7.9</strong> focuses on making generics‑aware client generation <strong>upgrade‑safe, deterministic, and operationally maintainable</strong>.</p> <p>While earlier versions demonstrated the architectural pattern and stabilized runtime contract behavior, this release delivers a key engineering improvement:</p> <blockquote> <p><strong>Automated, fail‑fast governance of upstream OpenAPI Generator template changes.</strong></p> </blockquote> <p>The result is a significantly more robust client build pipeline that removes manual template maintenance risks and improves long‑term evolution safety.</p> <p>No breaking changes were introduced to response envelope semantics or canonical contract usage.</p> <hr> <h1>✨ Highlights</h1> <h2>⚙️ Fail‑Fast Governed OpenAPI Template Patching</h2> <p>Client generation now applies a <strong>deterministic build‑time patch</strong> to the upstream <code>model.mustache</code> template using Maven Antrun.</p> <p>This replaces the previous approach where modified templates had to be:</p> <ul> <li>manually copied</li> <li>locally maintained</li> <li>periodically re‑aligned with upstream generator changes</li> </ul> <p>The new mechanism:</p> <ul> <li>automatically extracts the upstream template during build</li> <li>applies a controlled semantic patch targeting wrapper rendering</li> <li>verifies the patch signature</li> <li><strong>fails the build immediately</strong> if upstream template structure changes</li> </ul> <p>This establishes a safer upgrade path for OpenAPI Generator versions while preserving the generics‑aware wrapper model.</p> <hr> <h2>🧩 Simplified Generics Wrapper Rendering Strategy</h2> <p>Wrapper generation logic has been streamlined to reduce template surface area and eliminate redundant overlay complexity.</p> <p>The client build now:</p> <ul> <li>intercepts only the <strong>model rendering branch</strong> relevant to canonical response envelopes</li> <li>keeps local template overlays minimal and declarative</li> <li>preserves thin inheritance‑based wrappers bound to the shared <code>api‑contract</code></li> </ul> <p>This reduces maintenance burden and improves architectural clarity.</p> <hr> <h2>🔁 Deterministic Client Build Pipeline</h2> <p>The effective template generation process has been redesigned for reproducibility and developer ergonomics.</p> <p>Key improvements include:</p> <ul> <li>removal of unused upstream template copying stages</li> <li>clearer separation between upstream extraction and local semantic governance</li> <li>stable effective template directory structure</li> <li>reduced risk of silent drift across generator upgrades</li> </ul> <p>Client regeneration behaviour is now <strong>more predictable and observable</strong>.</p> <hr> <h2>🚀 Platform Stack Alignment</h2> <p>This release also aligns the example client module with updated platform components:</p> <ul> <li>Spring Boot <strong>3.5.12</strong></li> <li>OpenAPI Generator <strong>7.21.0</strong></li> </ul> <p>These upgrades are incorporated within the new governed template pipeline to ensure compatibility and forward evolution safety.</p> <hr> <h2>📘 Architecture Documentation Refinement</h2> <p>Documentation has been restructured to better communicate the project as a <strong>contract lifecycle reference architecture</strong>.</p> <p>Updates include:</p> <ul> <li>clearer explanation of server vs client lifecycle responsibilities</li> <li>explicit scoping of supported generic response shapes</li> <li>improved conceptual flow across README and adoption guides</li> </ul> <p>These changes improve onboarding clarity without affecting runtime behaviour.</p> <hr> <h1>🎯 Outcome</h1> <p>Release <strong>0.7.9</strong> represents an important engineering maturity milestone:</p> <ul> <li>generics‑aware client generation becomes <strong>upgrade‑safe by design</strong></li> <li>manual template maintenance is eliminated</li> <li>build failures surface upstream generator incompatibilities early</li> <li>contract‑driven integration patterns become easier to operationalize</li> </ul> <p>This strengthens the project’s long‑term goal:</p> <p><strong>stable response contracts, deterministic client regeneration, and architecture‑aware API integration boundaries for Spring ecosystems.</strong></p> <hr> <h1>🧭 Looking Ahead</h1> <p>With governed template evolution now in place, future iterations are expected to focus on:</p> <ul> <li>further modularization of reusable contract tooling</li> <li>broader validation of the lifecycle pattern in multi‑service scenarios</li> <li>incremental preparation for structural evolution in the upcoming <strong>0.8.x</strong> line</li> </ul> <p>The architectural direction remains consistent:</p> <p><strong>publish semantic contracts once — interpret and consume them safely across system boundaries.</strong></p> bsayli