diff --git a/README.md b/README.md index 8668ecf7..128b19e9 100644 --- a/README.md +++ b/README.md @@ -809,6 +809,9 @@ Apipie::prop(, , [, true', in which case the property is understood to be # an array of the described type. +# +# x-extensions: any option key starting with 'x-' will be passed through to the +# generated OpenAPI/Swagger specification. This is useful for vendor-specific extensions. ``` To describe an embedded object: diff --git a/lib/apipie/generator/swagger/param_description/builder.rb b/lib/apipie/generator/swagger/param_description/builder.rb index 5fca774a..5f941b61 100644 --- a/lib/apipie/generator/swagger/param_description/builder.rb +++ b/lib/apipie/generator/swagger/param_description/builder.rb @@ -55,6 +55,7 @@ def to_swagger definition.merge!(for_required) definition.merge!(for_example) definition.merge!(@description.to_hash) if @description.present? + definition.merge!(for_x_extensions) warn_optional_without_default_value(definition) @@ -63,6 +64,10 @@ def to_swagger private + def for_x_extensions + @param_description.options.select { |key, _| key.to_s.start_with?('x-') } + end + def for_required return {} if !required? diff --git a/spec/lib/apipie/generator/swagger/param_description/builder_spec.rb b/spec/lib/apipie/generator/swagger/param_description/builder_spec.rb index c2fb5de0..6c3660bb 100644 --- a/spec/lib/apipie/generator/swagger/param_description/builder_spec.rb +++ b/spec/lib/apipie/generator/swagger/param_description/builder_spec.rb @@ -242,4 +242,33 @@ it { is_expected.to eq('example') } end end + + describe 'x-extensions' do + context 'when x-extension options are provided' do + let(:base_param_description_options) do + { + required: true, + 'x-param-sensitive': true, + 'x-custom-extension': 'custom-value' + } + end + + it 'includes x-param-sensitive in the output' do + expect(generated_block[:'x-param-sensitive']).to eq(true) + end + + it 'includes x-custom-extension in the output' do + expect(generated_block[:'x-custom-extension']).to eq('custom-value') + end + end + + context 'when no x-extension options are provided' do + let(:base_param_description_options) { { required: true } } + + it 'does not include any x-extension keys' do + x_extension_keys = generated_block.keys.select { |k| k.to_s.start_with?('x-') } + expect(x_extension_keys).to be_empty + end + end + end end