Skip to content

Commit fdd7050

Browse files
author
peter scholz
committed
Merge pull request #351 from LeFnord/master
(re)adding some documentations
2 parents f57dd80 + 6e181f1 commit fdd7050

17 files changed

+690
-134
lines changed

CHANGELOG.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
2-
n.n.n / 2016-02-05
1+
n.n.n / 2016-02-14
32
==================
43

54
### 0.10.4 (Next)

README.md

Lines changed: 52 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ This branch is work in progress for bringing grape-swagger to Swagger 2.0 spec.
99
[Usage](#usage)
1010
[Configure](#configure)
1111
[Routes Configuration](#routes)
12-
[Additional documentation](#additions)
12+
[Markdown](#md_usage)
13+
[Response documentation](#response)
14+
[Extensions](#extensions)
1315
[Example](#example)
1416

1517
For how to use at the moment see [v2 specs](tree/master/spec/swagger_v2) and or [Hussars](https://github.com/LeFnord/hussars) sample app.
@@ -681,24 +683,61 @@ The result is then something like following:
681683
},
682684
```
683685
686+
<a name="extensions" />
687+
## Extensions
684688
685-
## direct adding of additional swagger information for the route
686-
687-
- The amazon api gateway parameters can be added by indicated a aws hash with auth and integration keys, example:
689+
Swagger spec2.0 supports extensions on different levels, for the moment,
690+
the documentation on `verb`, `path` and `definition` level would be supported.
691+
The documented key would be generated from the `x` + `-` + key of the submitted hash,
692+
for possibilities refer to the [extensions spec](spec/lib/extensions_spec.rb).
693+
To get an overview *how* the extensions would be defined on grape level, see the following examples:
688694
695+
- `verb` extension, add a `x` key to the `desc` hash:
689696
```ruby
690-
desc 'thing',
691-
aws: {
692-
auth: 'aws_iam',
693-
integration: {
694-
type: 'aws',
695-
uri: 'foo_bar_uri',
696-
httpMethod: 'get'
697-
}
697+
desc 'This returns something with extension on verb level',
698+
x: { some: 'stuff' }
699+
```
700+
this would generate:
701+
```json
702+
"/path":{
703+
"get":{
704+
"…":"…",
705+
"x-some":"stuff"
698706
}
707+
}
708+
```
699709
700-
710+
- `path` extension, by setting via route settings:
711+
```ruby
712+
route_setting :x_path, { some: 'stuff' }
713+
```
714+
this would generate:
715+
```json
716+
"/path":{
717+
"x-some":"stuff",
718+
"get":{
719+
"…":"…",
720+
}
721+
}
722+
```
701723
724+
- `definition` extension, again by setting via route settings,
725+
here the status code must be provided, for which definition the extensions should be:
726+
```ruby
727+
route_setting :x_def, { for: 422, other: 'stuff' }
728+
```
729+
this would generate:
730+
```json
731+
"/definitions":{
732+
"ApiError":{
733+
"x-other":"stuff",
734+
"…":"…",
735+
}
736+
}
737+
```
738+
or, for more definitions:
739+
```ruby
740+
route_setting :x_def, [{ for: 422, other: 'stuff' }, { for: 200, some: 'stuff' }]
702741
```
703742
704743
<a="example" />

example/api/entities.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ module Api
44
module Entities
55
class Splines < Grape::Entity
66
expose :id, documentation: { type: Integer, desc: 'identity of a resource' }
7-
expose :x, documentation: { type: Numeric, desc: 'x-value' }
8-
expose :y, documentation: { type: Numeric, desc: 'y-value' }
7+
expose :x, documentation: { type: Float, desc: 'x-value' }
8+
expose :y, documentation: { type: Float, desc: 'y-value' }
99
expose :path, documentation: { type: String, desc: 'the requested resource'}
1010

1111
private

lib/grape-swagger.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
require 'grape-swagger/endpoint'
44
require 'grape-swagger/errors'
55
require 'grape-swagger/doc_methods/produces'
6+
require 'grape-swagger/doc_methods/data_type'
7+
require 'grape-swagger/doc_methods/extensions'
68
require 'grape-swagger/doc_methods'
79
require 'grape-swagger/markdown/kramdown_adapter'
810
require 'grape-swagger/markdown/redcarpet_adapter'
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
module GrapeSwagger
2+
module DocMethods
3+
class DataType
4+
class << self
5+
def call(value)
6+
raw_data_type = value[:type] if value.is_a?(Hash)
7+
raw_data_type ||= 'string'
8+
case raw_data_type.to_s
9+
when 'Hash'
10+
'object'
11+
when 'Rack::Multipart::UploadedFile'
12+
'File'
13+
when 'Virtus::Attribute::Boolean'
14+
'boolean'
15+
when 'Boolean', 'Date', 'Integer', 'String', 'Float'
16+
raw_data_type.to_s.downcase
17+
when 'BigDecimal'
18+
'long'
19+
when 'DateTime'
20+
'dateTime'
21+
when 'Numeric'
22+
'double'
23+
when 'Symbol'
24+
'string'
25+
else
26+
parse_entity_name(raw_data_type)
27+
end
28+
end
29+
30+
def parse_entity_name(model)
31+
if model.respond_to?(:entity_name)
32+
model.entity_name
33+
else
34+
name = model.to_s
35+
entity_parts = name.split('::')
36+
entity_parts.reject! { |p| p == 'Entity' || p == 'Entities' }
37+
entity_parts.join('::')
38+
end
39+
end
40+
end
41+
42+
PRIMITIVE_MAPPINGS = {
43+
'integer' => %w(integer int32),
44+
'long' => %w(integer int64),
45+
'float' => %w(number float),
46+
'double' => %w(number double),
47+
'byte' => %w(string byte),
48+
'date' => %w(string date),
49+
'dateTime' => %w(string date-time)
50+
}.freeze
51+
end
52+
end
53+
end
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
module GrapeSwagger
2+
module DocMethods
3+
class Extensions
4+
class << self
5+
def add(path, definitions, route)
6+
@route = route
7+
description = route.route_settings[:description]
8+
add_extension_to(path[method], extension(description)) if description && extended?(description, :x)
9+
10+
settings = route.route_settings
11+
add_extensions_to_path(settings, path) if settings && extended?(settings, :x_path)
12+
add_extensions_to_definition(settings, path, definitions) if settings && extended?(settings, :x_def)
13+
end
14+
15+
def add_extensions_to_path(settings, path)
16+
add_extension_to(path, extension(settings, :x_path))
17+
end
18+
19+
def add_extensions_to_definition(settings, path, definitions)
20+
def_extension = extension(settings, :x_def)
21+
22+
if def_extension[:x_def].is_a?(Array)
23+
def_extension[:x_def].each do |extension|
24+
next unless extension.key?(:for)
25+
status = extension.delete(:for)
26+
definition = find_definition(status, path)
27+
add_extension_to(definitions[definition], x_def: extension)
28+
end
29+
else
30+
return unless def_extension[:x_def].key?(:for)
31+
status = def_extension[:x_def].delete(:for)
32+
definition = find_definition(status, path)
33+
add_extension_to(definitions[definition], def_extension)
34+
end
35+
end
36+
37+
def find_definition(status, path)
38+
response = path[method][:responses][status]
39+
40+
response[:schema]['$ref'].split('/').last
41+
end
42+
43+
def add_extension_to(part, extensions)
44+
concatenate(extensions).each do |key, value|
45+
part[key] = value
46+
end
47+
end
48+
49+
def concatenate(extensions)
50+
result = {}
51+
52+
extensions.values.each do |extension|
53+
extension.each do |key, value|
54+
result["x-#{key}"] = value
55+
end
56+
end
57+
58+
result
59+
end
60+
61+
def extended?(part, identifier = :x)
62+
!extension(part, identifier).empty?
63+
end
64+
65+
def extension(part, identifier = :x)
66+
part.select { |x| x == identifier }
67+
end
68+
69+
def method
70+
@route.route_method.downcase.to_sym
71+
end
72+
end
73+
end
74+
end
75+
end

0 commit comments

Comments
 (0)