Skip to content

Commit f05375d

Browse files
committed
Add required type and property
1 parent 2fb7c32 commit f05375d

5 files changed

Lines changed: 47 additions & 8 deletions

File tree

lib/grape-swagger/entity.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
require 'grape-entity'
33

44
require 'grape-swagger/entity/version'
5+
require 'grape-swagger/entity/helper'
56
require 'grape-swagger/entity/attribute_parser'
67
require 'grape-swagger/entity/parser'
78

lib/grape-swagger/entity/attribute_parser.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def call(entity_options)
1212
entity_model = model_from(entity_options)
1313

1414
if entity_model
15-
name = endpoint.nil? ? entity_model.to_s.demodulize : endpoint.send(:expose_params_from_model, entity_model)
15+
name = GrapeSwagger::Entity::Helper.model_name(entity_model, endpoint)
1616

1717
entity_model_type = entity_model_type(name, entity_options)
1818
return entity_model_type unless documentation

lib/grape-swagger/entity/helper.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module GrapeSwagger
2+
module Entity
3+
class Helper
4+
def self.model_name(entity_model, endpoint)
5+
if endpoint.nil?
6+
entity_model.to_s.demodulize
7+
else
8+
endpoint.send(:expose_params_from_model, entity_model)
9+
end
10+
end
11+
end
12+
end
13+
end

lib/grape-swagger/entity/parser.rb

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def initialize(original, renamed)
2727

2828
def extract_params(exposure)
2929
root_exposures =
30-
if superclass_contains_discriminator?(exposure)
30+
if discriminator(exposure)
3131
root_exposures_without_parent(exposure)
3232
else
3333
exposure.root_exposures
@@ -45,7 +45,7 @@ def extract_params(exposure)
4545
end
4646
end
4747

48-
def superclass_contains_discriminator?(exposure)
48+
def discriminator(exposure)
4949
exposure.superclass.root_exposures.detect do |value|
5050
value.documentation.try(:[], :is_discriminator)
5151
end
@@ -81,15 +81,19 @@ def parse_grape_entity_params(params, parent_model = nil)
8181
memo[final_entity_name][:readOnly] = documentation[:read_only].to_s == 'true' if documentation[:read_only]
8282
memo[final_entity_name][:description] = documentation[:desc] if documentation[:desc]
8383
end
84-
if superclass_contains_discriminator?(model)
85-
respond_with_all_of(parsed, params)
84+
85+
discriminator = discriminator(model)
86+
if discriminator
87+
respond_with_all_of(parsed, params, discriminator)
8688
else
8789
[parsed, required_params(params)]
8890
end
8991
end
9092

91-
def respond_with_all_of(parsed, params)
93+
def respond_with_all_of(parsed, params, discriminator)
9294
parent_name =
95+
GrapeSwagger::Entity::Helper.model_name(model.superclass, endpoint)
96+
9397
if endpoint.nil?
9498
model.superclass.to_s.demodulize
9599
else
@@ -100,11 +104,27 @@ def respond_with_all_of(parsed, params)
100104
{
101105
'$ref' => "#/definitions/#{parent_name}"
102106
},
103-
[parsed, required_params(params)]
107+
[
108+
add_discriminator(parsed, discriminator),
109+
required_params(params).push(discriminator.attribute)
110+
]
104111
]
105112
}
106113
end
107114

115+
def add_discriminator(parsed, discriminator)
116+
model_name = GrapeSwagger::Entity::Helper.model_name(model, endpoint)
117+
118+
parsed.merge(
119+
{
120+
discriminator.attribute => {
121+
type: 'string',
122+
enum: [model_name]
123+
}
124+
}
125+
)
126+
end
127+
108128
def parse_nested(entity_name, entity_options, parent_model = nil)
109129
nested_entity = if parent_model.nil?
110130
model.root_exposures.find_by(entity_name)

spec/grape-swagger/entity/parser_spec.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,13 @@
6262
it 'parses the model with allOf' do
6363
expect(properties).to include(:allOf)
6464
all_of = properties[:allOf]
65+
child_property = all_of.last.first
66+
child_required = all_of.last.last
6567
expect(all_of.first['$ref']).to eq('#/definitions/Parent')
66-
expect(all_of.last.first[:name][:type]).to eq('string')
68+
expect(child_property[:name][:type]).to eq('string')
69+
expect(child_property[:type][:type]).to eq('string')
70+
expect(child_property[:type][:enum]).to eq(['Child'])
71+
expect(child_required).to include(:type)
6772
end
6873
end
6974
end

0 commit comments

Comments
 (0)