Skip to content

Commit 982f71a

Browse files
Levente Bagidblock
Levente Bagi
authored andcommitted
Allow customizing entity name.
1 parent 99b1430 commit 982f71a

File tree

3 files changed

+69
-53
lines changed

3 files changed

+69
-53
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
### Next Release
22

3-
* [#110](https://github.com/tim-vandecasteele/grape-swagger/pull/110) - Added `responseModel` support - [@bagilevi](https://github.com/bagilevi).
3+
* [#110](https://github.com/tim-vandecasteele/grape-swagger/pull/110), [#111](https://github.com/tim-vandecasteele/grape-swagger/pull/111) - Added `responseModel` support - [@bagilevi](https://github.com/bagilevi).
44
* [#105](https://github.com/tim-vandecasteele/grape-swagger/pull/105): Fixed compatibility with Swagger-UI - [@CraigCottingham](https://github.com/CraigCottingham).
55
* [#87](https://github.com/tim-vandecasteele/grape-swagger/pull/87): Fixed mapping of `default` to `defaultValue` - [@m-o-e](https://github.com/m-o-e).
66
* Rewritten .gemspec and removed Jeweler - [@dblock](https://github.com/dblock).

lib/grape-swagger.rb

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ def self.setup(options)
131131
ops.each do |path, op_routes|
132132
operations = op_routes.map do |route|
133133
notes = as_markdown(route.route_notes)
134+
134135
http_codes = parse_http_codes(route.route_http_codes, models)
135136

136137
models << if @@models.present?
@@ -320,10 +321,15 @@ def parse_path(path, version)
320321
version ? parsed_path.gsub('{version}', version) : parsed_path
321322
end
322323

323-
def parse_entity_name(name)
324-
entity_parts = name.to_s.split('::')
325-
entity_parts.reject! { |p| p == 'Entity' || p == 'Entities' }
326-
entity_parts.join('::')
324+
def parse_entity_name(model)
325+
if model.respond_to?(:entity_name)
326+
model.entity_name
327+
else
328+
name = model.to_s
329+
entity_parts = name.split('::')
330+
entity_parts.reject! { |p| p == 'Entity' || p == 'Entities' }
331+
entity_parts.join('::')
332+
end
327333
end
328334

329335
def parse_entity_models(models)
@@ -378,12 +384,12 @@ def parse_http_codes(codes, models)
378384
codes ||= {}
379385
codes.map do |k, v, m|
380386
models << m if m
381-
code = {
387+
http_code_hash = {
382388
code: k,
383389
message: v
384390
}
385-
code[:responseModel] = parse_entity_name(m) if m
386-
code
391+
http_code_hash[:responseModel] = parse_entity_name(m) if m
392+
http_code_hash
387393
end
388394
end
389395

spec/response_model_spec.rb

Lines changed: 55 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,66 +2,76 @@
22

33
describe 'responseModel' do
44
before :all do
5-
module Entities
6-
class Something < Grape::Entity
7-
expose :text, documentation: { type: 'string', desc: 'Content of something.' }
8-
end
5+
module MyAPI
6+
module Entities
7+
class BaseEntity < Grape::Entity
8+
def self.entity_name
9+
name.sub(/^MyAPI::Entities::/, '')
10+
end
11+
end
912

10-
class Error < Grape::Entity
11-
expose :code, documentation: { type: 'string', desc: 'Error code' }
12-
expose :message, documentation: { type: 'string', desc: 'Error message' }
13+
class Something < BaseEntity
14+
expose :text, documentation: { type: 'string', desc: 'Content of something.' }
15+
end
16+
17+
class Error < BaseEntity
18+
expose :code, documentation: { type: 'string', desc: 'Error code' }
19+
expose :message, documentation: { type: 'string', desc: 'Error message' }
20+
end
1321
end
14-
end
1522

16-
class ResponseModelApi < Grape::API
17-
format :json
18-
desc 'This returns something or an error',
19-
entity: Entities::Something,
20-
http_codes: [
21-
[200, 'OK', Entities::Something],
22-
[403, 'Refused to return something', Entities::Error]
23-
]
23+
class ResponseModelApi < Grape::API
24+
format :json
25+
desc 'This returns something or an error',
26+
entity: Entities::Something,
27+
http_codes: [
28+
[200, 'OK', Entities::Something],
29+
[403, 'Refused to return something', Entities::Error]
30+
]
2431

25-
get '/something/:id' do
26-
if params[:id] == 1
27-
something = OpenStruct.new text: 'something'
28-
present something, with: Entities::Something
29-
else
30-
error = OpenStruct.new code: 'some_error', message: 'Some error'
31-
present error, with: Entities::Error
32+
get '/something/:id' do
33+
if params[:id] == 1
34+
something = OpenStruct.new text: 'something'
35+
present something, with: Entities::Something
36+
else
37+
error = OpenStruct.new code: 'some_error', message: 'Some error'
38+
present error, with: Entities::Error
39+
end
3240
end
33-
end
3441

35-
add_swagger_documentation
42+
add_swagger_documentation
43+
end
3644
end
3745
end
3846

3947
def app
40-
ResponseModelApi
48+
MyAPI::ResponseModelApi
4149
end
4250

4351
it 'should document specified models' do
4452
get '/swagger_doc/something'
4553
parsed_response = JSON.parse(last_response.body)
46-
parsed_response['apis'][0]['operations'][0]['responseMessages'].should eq([
47-
{
48-
'code' => 200,
49-
'message' => 'OK',
50-
'responseModel' => 'Something'
51-
},
52-
{
53-
'code' => 403,
54-
'message' => 'Refused to return something',
55-
'responseModel' => 'Error'
56-
}
57-
])
54+
parsed_response['apis'][0]['operations'][0]['responseMessages'].should eq(
55+
[
56+
{
57+
'code' => 200,
58+
'message' => 'OK',
59+
'responseModel' => 'Something'
60+
},
61+
{
62+
'code' => 403,
63+
'message' => 'Refused to return something',
64+
'responseModel' => 'Error'
65+
}
66+
]
67+
)
5868
parsed_response['models'].keys.should include 'Error'
59-
parsed_response['models']['Error'].should eq(
60-
'id' => 'Error',
61-
'properties' => {
62-
'code' => { 'type' => 'string', 'description' => 'Error code' },
63-
'message' => { 'type' => 'string', 'description' => 'Error message' }
64-
}
65-
)
69+
parsed_response['models']['Error'].should == {
70+
'id' => 'Error',
71+
'properties' => {
72+
'code' => { 'type' => 'string', 'description' => 'Error code' },
73+
'message' => { 'type' => 'string', 'description' => 'Error message' }
74+
}
75+
}
6676
end
6777
end

0 commit comments

Comments
 (0)