From 6d845404c35cb1f89c9b7a4014f593fb327bdb83 Mon Sep 17 00:00:00 2001 From: Murray Steele Date: Fri, 12 Jul 2024 08:21:23 +0100 Subject: [PATCH] Handle warnings for param descriptions without a controller method If we're generating swagger via `SwaggerGenerator.json_schema_for_self_describing_class` we explicitly don't have a `controller_method` being passed around so we can't use it for the warnings. Introduce a test for type and builder to cover this scenario (first spotted by a failing spec for `SwaggerGenerator`) and then change the implementation to cope with it. Luckily, `Apipie::Generator::Swagger::MethodDescription::Decorator` already had a `ruby_name` implementation that handles being given `nil`, so we use that. --- .../swagger/param_description/builder.rb | 4 +-- .../swagger/param_description/type.rb | 6 +++- .../swagger/param_description/builder_spec.rb | 30 +++++++++++++------ .../swagger/param_description/type_spec.rb | 24 ++++++++++----- 4 files changed, 45 insertions(+), 19 deletions(-) diff --git a/lib/apipie/generator/swagger/param_description/builder.rb b/lib/apipie/generator/swagger/param_description/builder.rb index a92e4d26..5fca774a 100644 --- a/lib/apipie/generator/swagger/param_description/builder.rb +++ b/lib/apipie/generator/swagger/param_description/builder.rb @@ -1,7 +1,7 @@ class Apipie::Generator::Swagger::ParamDescription::Builder # @param [Apipie::ParamDescription] param_description # @param [TrueClass, FalseClass] in_schema - # @param [Apipie::MethodDescription] controller_method + # @param [Apipie::MethodDescription, nil] controller_method def initialize(param_description, in_schema:, controller_method:) @param_description = param_description @in_schema = in_schema @@ -98,7 +98,7 @@ def required_from_path? def warn_optional_without_default_value(definition) if !required? && !definition.key?(:default) method_id = - if @param_description.is_a?(Apipie::ResponseDescriptionAdapter::PropDesc) + if @controller_method.present? && @param_description.is_a?(Apipie::ResponseDescriptionAdapter::PropDesc) @controller_method.method_name else Apipie::Generator::Swagger::MethodDescription::Decorator.new(@controller_method).ruby_name diff --git a/lib/apipie/generator/swagger/param_description/type.rb b/lib/apipie/generator/swagger/param_description/type.rb index 50443b72..37c799fa 100644 --- a/lib/apipie/generator/swagger/param_description/type.rb +++ b/lib/apipie/generator/swagger/param_description/type.rb @@ -114,7 +114,11 @@ def validator def warn_hash_without_internal_typespec method_id = if @param_description.is_a?(Apipie::ResponseDescriptionAdapter::PropDesc) - @controller_method.method_name + if @controller_method.present? + @controller_method.method_name + else + Apipie::Generator::Swagger::MethodDescription::Decorator.new(nil).ruby_name + end else Apipie::Generator::Swagger::MethodDescription::Decorator.new(@param_description.method_description).ruby_name end 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 bd73ed7f..c2fb5de0 100644 --- a/spec/lib/apipie/generator/swagger/param_description/builder_spec.rb +++ b/spec/lib/apipie/generator/swagger/param_description/builder_spec.rb @@ -146,21 +146,33 @@ ).to_stderr end - context 'and param is a prop desc with a delegated controller method' do + context 'and param is a prop desc' do let(:param_description) do Apipie.prop(:param, 'object', param_description_options, []) end - let(:method_desc) do - Apipie::Generator::Swagger::MethodDescription::Decorator.new( - Apipie::MethodDescription.new(:show, resource_desc, dsl_data) - ) + context 'with a delegated controller method' do + let(:method_desc) do + Apipie::Generator::Swagger::MethodDescription::Decorator.new( + Apipie::MethodDescription.new(:show, resource_desc, dsl_data) + ) + end + + it 'warns' do + expect { subject }.to output( + /is optional but default value is not specified/ + ).to_stderr + end end - it 'warns' do - expect { subject }.to output( - /is optional but default value is not specified/ - ).to_stderr + context 'with a nil controller method' do + let(:method_desc) { nil } + + it 'warns' do + expect { subject }.to output( + /is optional but default value is not specified/ + ).to_stderr + end end end end diff --git a/spec/lib/apipie/generator/swagger/param_description/type_spec.rb b/spec/lib/apipie/generator/swagger/param_description/type_spec.rb index 9d45ec62..f08396ec 100644 --- a/spec/lib/apipie/generator/swagger/param_description/type_spec.rb +++ b/spec/lib/apipie/generator/swagger/param_description/type_spec.rb @@ -180,19 +180,29 @@ expect { subject }.to output(/is a generic Hash without an internal type specification/).to_stderr end - context 'and param is a prop desc with a delegated controller method' do + context 'and param is a prop desc' do let(:param_description) do Apipie.prop(param_description_name, 'object', {}, []) end - let(:controller_method) do - Apipie::Generator::Swagger::MethodDescription::Decorator.new( - method_desc - ) + context 'with a delegated controller method' do + let(:controller_method) do + Apipie::Generator::Swagger::MethodDescription::Decorator.new( + method_desc + ) + end + + it 'outputs a hash without internal typespec warning' do + expect { subject }.to output(/is a generic Hash without an internal type specification/).to_stderr + end end - it 'outputs a hash without internal typespec warning' do - expect { subject }.to output(/is a generic Hash without an internal type specification/).to_stderr + context 'and controller method is nil' do + let(:controller_method) { nil } + + it 'outputs a hash without internal typespec warning' do + expect { subject }.to output(/is a generic Hash without an internal type specification/).to_stderr + end end end end