From a707de3baba6f007cd98c8465e94fc870e1cad79 Mon Sep 17 00:00:00 2001 From: Charlie Zhang Date: Mon, 8 Jun 2026 09:47:21 -0400 Subject: [PATCH 1/2] Support x-keep-typed-in-additional-properties in Ruby model generator When a schema sets `x-keep-typed-in-additional-properties: true`, also add typed property keys to `additional_properties` so all fields are accessible from a single map regardless of when they were added to the spec. Co-Authored-By: Claude Sonnet 4.6 --- .generator/src/generator/templates/model_generic.j2 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.generator/src/generator/templates/model_generic.j2 b/.generator/src/generator/templates/model_generic.j2 index 61bfcab4004a..1ff1368deb0e 100644 --- a/.generator/src/generator/templates/model_generic.j2 +++ b/.generator/src/generator/templates/model_generic.j2 @@ -82,6 +82,9 @@ self.additional_properties[k.to_sym] = v else h[k.to_sym] = v +{%- if model.get("x-keep-typed-in-additional-properties") %} + self.additional_properties[k.to_sym] = v +{%- endif %} end {%- else %} fail ArgumentError, "`#{k}` is not a valid attribute in `{{ module_name }}::{{ version|upper }}::{{ name }}`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect From b24263c3b2849d72d1f01e6abd53a07870e43c08 Mon Sep 17 00:00:00 2001 From: Charlie Zhang Date: Mon, 8 Jun 2026 10:10:59 -0400 Subject: [PATCH 2/2] fix: copy typed fields into additional_properties after coercion, not before The previous approach stored the raw pre-coercion hash value. After setters run, self.attr_name holds the coerced value. We now copy post-coercion so both access paths return consistent types. Co-Authored-By: Claude Sonnet 4.6 --- .generator/src/generator/templates/model_generic.j2 | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.generator/src/generator/templates/model_generic.j2 b/.generator/src/generator/templates/model_generic.j2 index 1ff1368deb0e..8ebe035e1b7e 100644 --- a/.generator/src/generator/templates/model_generic.j2 +++ b/.generator/src/generator/templates/model_generic.j2 @@ -82,9 +82,6 @@ self.additional_properties[k.to_sym] = v else h[k.to_sym] = v -{%- if model.get("x-keep-typed-in-additional-properties") %} - self.additional_properties[k.to_sym] = v -{%- endif %} end {%- else %} fail ArgumentError, "`#{k}` is not a valid attribute in `{{ module_name }}::{{ version|upper }}::{{ name }}`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect @@ -104,6 +101,11 @@ {%- endif %} end {%- endfor %} +{%- if model.get("x-keep-typed-in-additional-properties") %} +{%- for attr, definition in model.get("properties", {}).items() %} + self.additional_properties[:'{{ attr|attribute_name }}'] = self.{{ attr|attribute_name }} if attributes.key?(:'{{ attr|attribute_name }}') +{%- endfor %} +{%- endif %} end {%- set ns = namespace(hasValidation=False) %}