swagger-docs 0.2.1 → 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -0
- data/README.md +23 -1
- data/lib/swagger/docs/api_declaration_file.rb +1 -1
- data/lib/swagger/docs/api_declaration_file_metadata.rb +4 -1
- data/lib/swagger/docs/dsl.rb +10 -0
- data/lib/swagger/docs/generator.rb +18 -14
- data/lib/swagger/docs/impotent_methods.rb +1 -1
- data/lib/swagger/docs/methods.rb +1 -0
- data/lib/swagger/docs/version.rb +1 -1
- data/spec/fixtures/controllers/custom_resource_path_controller.rb +18 -0
- data/spec/fixtures/controllers/multiple_routes_controller.rb +13 -0
- data/spec/fixtures/controllers/sample_controller.rb +2 -0
- data/spec/lib/swagger/docs/api_declaration_file_spec.rb +14 -12
- data/spec/lib/swagger/docs/generator_spec.rb +51 -12
- metadata +5 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 850e7d77a965af9ee323f25bc7ab3e3a91d370c8
|
4
|
+
data.tar.gz: 6b724ad6dd87abc8cab15e2b4a30055c6910e198
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e155052e677d44500ce278b910766d6c0e9eae07cacd5bc9514b79af5f61a98d510dd073ce1bc86ad0be3d4bdcc5eb4e8fd8e3f2cd51b66523e40ce2c7344cac
|
7
|
+
data.tar.gz: 66cf934624dbf944215ddc98401dc3a6a8c3608014fb62b4de88b9500394d2deabcdd89bd668240fe9cd7f379392d6565b29de3ab2c8f3f8ee0d13547bce2c4a
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
## 0.2.6
|
2
|
+
|
3
|
+
- swagger_controller DSL can accept a resource_path which will be used over a generated path #126 @sb8244
|
4
|
+
|
5
|
+
## 0.2.5
|
6
|
+
|
7
|
+
- Enabled option to set 'items' inside swagger_api method #99 @krakatoa
|
8
|
+
|
9
|
+
## 0.2.4
|
10
|
+
|
11
|
+
- Parent controller option for register_apis config. #123 @mskubenich
|
12
|
+
|
13
|
+
## 0.2.3
|
14
|
+
|
15
|
+
- Added property_list to SwaggerModelDSL #108 @dr-impossible
|
16
|
+
|
17
|
+
## 0.2.2
|
18
|
+
|
19
|
+
- Support multiple route methods #128 @frodrigo
|
20
|
+
|
1
21
|
## 0.2.1
|
2
22
|
|
3
23
|
- Add support for Authorizations (OAuth 2.0) - Thanks to @RKushnir #97
|
data/README.md
CHANGED
@@ -62,6 +62,8 @@ Swagger::Docs::Config.register_apis({
|
|
62
62
|
:base_path => "http://api.somedomain.com",
|
63
63
|
# if you want to delete all .json files at each generation
|
64
64
|
:clean_directory => false,
|
65
|
+
# Ability to setup base controller for each api version. Api::V1::SomeController for example.
|
66
|
+
:parent_controller => Api::V1::SomeController
|
65
67
|
# add custom attributes to api-docs
|
66
68
|
:attributes => {
|
67
69
|
:info => {
|
@@ -133,6 +135,12 @@ The following table shows all the current configuration options and their defaul
|
|
133
135
|
<td>true</td>
|
134
136
|
</tr>
|
135
137
|
|
138
|
+
<tr>
|
139
|
+
<td><b>parent_controller</b></td>
|
140
|
+
<td>Assign a different controller to use for the configuration</td>
|
141
|
+
<td>ClassName</td>
|
142
|
+
</tr>
|
143
|
+
|
136
144
|
</tbody>
|
137
145
|
</table>
|
138
146
|
|
@@ -198,11 +206,25 @@ class Api::V1::UsersController < ApplicationController
|
|
198
206
|
description "A Tag object."
|
199
207
|
property :id, :integer, :required, "User Id"
|
200
208
|
property :name, :string, :optional, "Name"
|
209
|
+
property_list :type, :string, :optional, "Tag Type", ["info", "warning", "error"]
|
201
210
|
end
|
202
|
-
|
203
211
|
end
|
204
212
|
```
|
205
213
|
|
214
|
+
#### Support for Enums (PR #108)
|
215
|
+
|
216
|
+
```
|
217
|
+
property_list :type, :string, :optional, "Type", ["info", "warning", "error"]
|
218
|
+
```
|
219
|
+
|
220
|
+
#### Custom resource paths`(PR #126)
|
221
|
+
|
222
|
+
```ruby
|
223
|
+
class Api::V1::UsersController < ApplicationController
|
224
|
+
|
225
|
+
swagger_controller :users, "User Management", resource_path: "/some/where"
|
226
|
+
```
|
227
|
+
|
206
228
|
### DRYing up common documentation
|
207
229
|
|
208
230
|
Suppose you have a header or a parameter that must be present on several controllers and methods. Instead of duplicating it on all the controllers you can do this on your API base controller:
|
@@ -2,8 +2,10 @@ module Swagger
|
|
2
2
|
module Docs
|
3
3
|
class ApiDeclarationFileMetadata
|
4
4
|
DEFAULT_SWAGGER_VERSION = "1.2"
|
5
|
+
DEFAULT_RESOURCE_PATH = nil
|
5
6
|
|
6
|
-
attr_reader :api_version, :path, :base_path, :controller_base_path, :swagger_version, :camelize_model_properties
|
7
|
+
attr_reader :api_version, :path, :base_path, :controller_base_path, :swagger_version, :camelize_model_properties
|
8
|
+
attr_reader :authorizations, :overridden_resource_path
|
7
9
|
|
8
10
|
def initialize(api_version, path, base_path, controller_base_path, options={})
|
9
11
|
@api_version = api_version
|
@@ -13,6 +15,7 @@ module Swagger
|
|
13
15
|
@swagger_version = options.fetch(:swagger_version, DEFAULT_SWAGGER_VERSION)
|
14
16
|
@camelize_model_properties = options.fetch(:camelize_model_properties, true)
|
15
17
|
@authorizations = options.fetch(:authorizations, {})
|
18
|
+
@overridden_resource_path = options.fetch(:resource_path, DEFAULT_RESOURCE_PATH)
|
16
19
|
end
|
17
20
|
end
|
18
21
|
end
|
data/lib/swagger/docs/dsl.rb
CHANGED
@@ -29,6 +29,10 @@ module Swagger
|
|
29
29
|
@type = type
|
30
30
|
end
|
31
31
|
|
32
|
+
def items(items)
|
33
|
+
@items = items
|
34
|
+
end
|
35
|
+
|
32
36
|
def consumes(mime_types)
|
33
37
|
@consumes = mime_types
|
34
38
|
end
|
@@ -104,6 +108,12 @@ module Swagger
|
|
104
108
|
}.merge!(hash)
|
105
109
|
self.required << name if required == :required
|
106
110
|
end
|
111
|
+
|
112
|
+
# helper method to generate enums
|
113
|
+
def property_list(name, type, required, description = nil, allowed_values = [], hash = {})
|
114
|
+
hash.merge!({allowable_values: {value_type: "LIST", values: allowed_values}})
|
115
|
+
property(name, type, required, description, hash)
|
116
|
+
end
|
107
117
|
end
|
108
118
|
end
|
109
119
|
end
|
@@ -75,7 +75,7 @@ module Swagger
|
|
75
75
|
ret = process_path(path, root, config, settings)
|
76
76
|
results[ret[:action]] << ret
|
77
77
|
if ret[:action] == :processed
|
78
|
-
resources << generate_resource(ret[:path], ret[:apis], ret[:models], settings, root, config)
|
78
|
+
resources << generate_resource(ret[:path], ret[:apis], ret[:models], settings, root, config, ret[:klass].swagger_config)
|
79
79
|
debased_path = get_debased_path(ret[:path], settings[:controller_base_path])
|
80
80
|
resource_api = {
|
81
81
|
path: "/#{Config.transform_path(trim_leading_slash(debased_path), api_version)}.{format}",
|
@@ -136,6 +136,7 @@ module Swagger
|
|
136
136
|
klass = Config.log_exception { "#{path.to_s.camelize}Controller".constantize } rescue nil
|
137
137
|
return {action: :skipped, path: path, reason: :klass_not_present} if !klass
|
138
138
|
return {action: :skipped, path: path, reason: :not_swagger_resource} if !klass.methods.include?(:swagger_config) or !klass.swagger_config[:controller]
|
139
|
+
return {action: :skipped, path: path, reason: :not_kind_of_parent_controller} if config[:parent_controller] && !klass < config[:parent_controller]
|
139
140
|
apis, models, defined_nicknames = [], {}, []
|
140
141
|
routes.select{|i| i.defaults[:controller] == path}.each do |route|
|
141
142
|
unless nickname_defined?(defined_nicknames, path, route) # only add once for each route once e.g. PATCH, PUT
|
@@ -148,8 +149,8 @@ module Swagger
|
|
148
149
|
{action: :processed, path: path, apis: apis, models: models, klass: klass}
|
149
150
|
end
|
150
151
|
|
151
|
-
def
|
152
|
-
if defined?(route.verb.source) then route.verb.source.to_s.delete('$'+'^') else route.verb end.downcase.to_sym
|
152
|
+
def route_verbs(route)
|
153
|
+
if defined?(route.verb.source) then route.verb.source.to_s.delete('$'+'^').split('|') else [route.verb] end.collect{|verb| verb.downcase.to_sym}
|
153
154
|
end
|
154
155
|
|
155
156
|
def path_route_nickname(path, route)
|
@@ -158,19 +159,19 @@ module Swagger
|
|
158
159
|
end
|
159
160
|
|
160
161
|
def nickname_defined?(defined_nicknames, path, route)
|
161
|
-
verb = route_verb(route)
|
162
162
|
target_nickname = path_route_nickname(path, route)
|
163
163
|
defined_nicknames.each{|nickname| return true if nickname == target_nickname }
|
164
164
|
false
|
165
165
|
end
|
166
166
|
|
167
|
-
def generate_resource(path, apis, models, settings, root, config)
|
167
|
+
def generate_resource(path, apis, models, settings, root, config, swagger_config)
|
168
168
|
metadata = ApiDeclarationFileMetadata.new(
|
169
169
|
root["apiVersion"], path, root["basePath"],
|
170
170
|
settings[:controller_base_path],
|
171
171
|
camelize_model_properties: config.fetch(:camelize_model_properties, true),
|
172
172
|
swagger_version: root["swaggerVersion"],
|
173
|
-
authorizations: root[:authorizations]
|
173
|
+
authorizations: root[:authorizations],
|
174
|
+
resource_path: swagger_config[:resource_path]
|
174
175
|
)
|
175
176
|
declaration = ApiDeclarationFile.new(metadata, apis, models)
|
176
177
|
declaration.generate_resource
|
@@ -183,17 +184,20 @@ module Swagger
|
|
183
184
|
def get_route_path_apis(path, route, klass, settings, config)
|
184
185
|
models, apis = {}, []
|
185
186
|
action = route.defaults[:action]
|
186
|
-
|
187
|
-
return {apis: apis, models: models, nickname: nil} if !
|
188
|
-
|
189
|
-
|
190
|
-
nickname = operations[:nickname] = path_route_nickname(path, route)
|
187
|
+
verbs = route_verbs(route)
|
188
|
+
return {apis: apis, models: models, nickname: nil} if !operation = klass.swagger_actions[action.to_sym]
|
189
|
+
operation = Hash[operation.map {|k, v| [k.to_s.gsub("@","").to_sym, v.respond_to?(:deep_dup) ? v.deep_dup : v.dup] }] # rename :@instance hash keys
|
190
|
+
nickname = operation[:nickname] = path_route_nickname(path, route)
|
191
191
|
|
192
192
|
route_path = if defined?(route.path.spec) then route.path.spec else route.path end
|
193
193
|
api_path = transform_spec_to_api_path(route_path, settings[:controller_base_path], config[:api_extension_type])
|
194
|
-
|
195
|
-
|
196
|
-
|
194
|
+
operation[:parameters] = filter_path_params(api_path, operation[:parameters]) if operation[:parameters]
|
195
|
+
operations = verbs.collect{|verb|
|
196
|
+
op = operation.dup
|
197
|
+
op[:method] = verb
|
198
|
+
op
|
199
|
+
}
|
200
|
+
apis << {:path => api_path, :operations => operations}
|
197
201
|
models = get_klass_models(klass)
|
198
202
|
|
199
203
|
{apis: apis, models: models, nickname: nickname}
|
data/lib/swagger/docs/methods.rb
CHANGED
data/lib/swagger/docs/version.rb
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
module Api
|
2
|
+
module V1
|
3
|
+
class SuperclassController < ApplicationController
|
4
|
+
end
|
5
|
+
class CustomResourcePathController < SuperclassController
|
6
|
+
swagger_controller :custom_resource_path, "User Management", resource_path: "resource/testing"
|
7
|
+
|
8
|
+
swagger_api :index do
|
9
|
+
summary "Fetches all User items"
|
10
|
+
param :query, :page, :integer, :optional, "Page number"
|
11
|
+
param :path, :nested_id, :integer, :optional, "Team Id"
|
12
|
+
response :unauthorized
|
13
|
+
response :not_acceptable, "The request you made is not acceptable"
|
14
|
+
response :requested_range_not_satisfiable
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Api
|
2
|
+
module V1
|
3
|
+
class MultipleRoutesController < ApplicationController
|
4
|
+
swagger_controller :multiple_routes, "Multiple Routes"
|
5
|
+
|
6
|
+
swagger_api :index do
|
7
|
+
summary "Creates a new User"
|
8
|
+
param :form, :first_name, :string, :required, "First name"
|
9
|
+
response :unauthorized
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -31,6 +31,7 @@ module Api
|
|
31
31
|
param :form, :email, :string, :required, "Email address"
|
32
32
|
param_list :form, :role, :string, :required, "Role", [ "admin", "superadmin", "user" ]
|
33
33
|
param :body, :body, :json, :required, 'JSON formatted body'
|
34
|
+
items '{$ref" => "setup"}'
|
34
35
|
response :unauthorized
|
35
36
|
response :not_acceptable
|
36
37
|
end
|
@@ -73,6 +74,7 @@ module Api
|
|
73
74
|
description "A Tag object."
|
74
75
|
property :id, :integer, :required, "User Id"
|
75
76
|
property :name, :string, :optional, "Name", foo: "test"
|
77
|
+
property_list :type, :string, :optional, "Type", ["info", "warning", "error"]
|
76
78
|
end
|
77
79
|
end
|
78
80
|
end
|
@@ -29,7 +29,6 @@ describe Swagger::Docs::ApiDeclarationFile do
|
|
29
29
|
}
|
30
30
|
]
|
31
31
|
end
|
32
|
-
|
33
32
|
let(:models) do
|
34
33
|
{
|
35
34
|
:Tag=>
|
@@ -46,13 +45,11 @@ describe Swagger::Docs::ApiDeclarationFile do
|
|
46
45
|
}
|
47
46
|
}
|
48
47
|
end
|
49
|
-
|
50
48
|
let(:metadata) do
|
51
49
|
Swagger::Docs::ApiDeclarationFileMetadata.new("1.0", "api/v1/sample", "http://api.no.where/", "")
|
52
50
|
end
|
53
51
|
|
54
52
|
describe "#generate_resource" do
|
55
|
-
|
56
53
|
it "generates the appropriate response" do
|
57
54
|
declaration = described_class.new(metadata, apis, models)
|
58
55
|
|
@@ -69,7 +66,6 @@ describe Swagger::Docs::ApiDeclarationFile do
|
|
69
66
|
expect(declaration.generate_resource).to eq(expected_response)
|
70
67
|
end
|
71
68
|
end
|
72
|
-
|
73
69
|
describe "#base_path" do
|
74
70
|
it "returns metadata.base_path" do
|
75
71
|
metadata = double("metadata", base_path: "/hello")
|
@@ -77,7 +73,6 @@ describe Swagger::Docs::ApiDeclarationFile do
|
|
77
73
|
expect(declaration.base_path).to eq(metadata.base_path)
|
78
74
|
end
|
79
75
|
end
|
80
|
-
|
81
76
|
describe "#path" do
|
82
77
|
it "returns metadata.path" do
|
83
78
|
metadata = double("metadata", path: "/hello")
|
@@ -85,7 +80,6 @@ describe Swagger::Docs::ApiDeclarationFile do
|
|
85
80
|
expect(declaration.path).to eq(metadata.path)
|
86
81
|
end
|
87
82
|
end
|
88
|
-
|
89
83
|
describe "#controller_base_path" do
|
90
84
|
it "returns metadata.controller_base_path" do
|
91
85
|
metadata = double("metadata", controller_base_path: "/hello")
|
@@ -93,7 +87,20 @@ describe Swagger::Docs::ApiDeclarationFile do
|
|
93
87
|
expect(declaration.controller_base_path).to eq(metadata.controller_base_path)
|
94
88
|
end
|
95
89
|
end
|
96
|
-
|
90
|
+
describe "#resource_path" do
|
91
|
+
it "returns the debased controller path" do
|
92
|
+
metadata = double("metadata", overridden_resource_path: nil, controller_base_path: "/hello", path: "/hello/test-endpoint")
|
93
|
+
declaration = described_class.new(metadata, apis, models)
|
94
|
+
expect(declaration.resource_path).to eq("test_endpoint")
|
95
|
+
end
|
96
|
+
context "with an overridden_resource_path" do
|
97
|
+
it "returns the overriden resource path directly" do
|
98
|
+
metadata = double("metadata", overridden_resource_path: "testing-path", controller_base_path: "/hello", path: "/hello/test-endpoint")
|
99
|
+
declaration = described_class.new(metadata, apis, models)
|
100
|
+
expect(declaration.resource_path).to eq("testing-path")
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
97
104
|
describe "#swagger_version" do
|
98
105
|
it "returns metadata.swagger_version" do
|
99
106
|
metadata = double("metadata", swagger_version: "1.2")
|
@@ -101,7 +108,6 @@ describe Swagger::Docs::ApiDeclarationFile do
|
|
101
108
|
expect(declaration.swagger_version).to eq(metadata.swagger_version)
|
102
109
|
end
|
103
110
|
end
|
104
|
-
|
105
111
|
describe "#api_version" do
|
106
112
|
it "returns metadata.api_version" do
|
107
113
|
metadata = double("metadata", api_version: "1.0")
|
@@ -109,7 +115,6 @@ describe Swagger::Docs::ApiDeclarationFile do
|
|
109
115
|
expect(declaration.api_version).to eq(metadata.api_version)
|
110
116
|
end
|
111
117
|
end
|
112
|
-
|
113
118
|
describe "#camelize_model_properties" do
|
114
119
|
it "returns metadata.camelize_model_properties" do
|
115
120
|
metadata = double("metadata", camelize_model_properties: false)
|
@@ -117,7 +122,6 @@ describe Swagger::Docs::ApiDeclarationFile do
|
|
117
122
|
expect(declaration.camelize_model_properties).to eq(metadata.camelize_model_properties)
|
118
123
|
end
|
119
124
|
end
|
120
|
-
|
121
125
|
describe "#models" do
|
122
126
|
context "with camelize_model_properties set to true" do
|
123
127
|
it "returns a models hash that's ready for output" do
|
@@ -141,7 +145,6 @@ describe Swagger::Docs::ApiDeclarationFile do
|
|
141
145
|
expect(declaration.models).to eq(expected_models_hash)
|
142
146
|
end
|
143
147
|
end
|
144
|
-
|
145
148
|
context "with camelize_model_properties set to false" do
|
146
149
|
it "returns a models hash that's ready for output" do
|
147
150
|
declaration = described_class.new(metadata, apis, models)
|
@@ -165,7 +168,6 @@ describe Swagger::Docs::ApiDeclarationFile do
|
|
165
168
|
end
|
166
169
|
end
|
167
170
|
end
|
168
|
-
|
169
171
|
describe "#apis" do
|
170
172
|
it "returns a api hash that's ready for output" do
|
171
173
|
declaration = described_class.new(metadata, apis, models)
|
@@ -14,6 +14,7 @@ describe Swagger::Docs::Generator do
|
|
14
14
|
stub_route( "^GET$", "index", "api/v1/ignored", "/api/v1/ignored(.:format)"),
|
15
15
|
stub_route( "^GET$", "index", "api/v1/sample", "/api/v1/sample(.:format)"),
|
16
16
|
stub_string_verb_route("GET", "index", "api/v1/nested", "/api/v1/nested/:nested_id/nested_sample(.:format)"),
|
17
|
+
stub_string_verb_route("GET", "index", "api/v1/custom_resource_path", "/api/v1/custom_resource_path/:custom_resource_path/custom_resource_path_sample(.:format)"),
|
17
18
|
stub_route( "^PATCH$", "create", "api/v1/sample", "/api/v1/sample(.:format)"),
|
18
19
|
stub_route( "^PUT$", "create", "api/v1/sample", "/api/v1/sample(.:format)"), # intentional duplicate of above route to ensure PATCH is used
|
19
20
|
stub_route( "^GET$", "show", "api/v1/sample", "/api/v1/sample/:id(.:format)"),
|
@@ -21,13 +22,22 @@ describe Swagger::Docs::Generator do
|
|
21
22
|
stub_route( "^DELETE$", "destroy", "api/v1/sample", "/api/v1/sample/:id(.:format)"),
|
22
23
|
stub_route( "^GET$", "new", "api/v1/sample", "/api/v1/sample/new(.:format)"), # no parameters for this method
|
23
24
|
stub_route( "^GET$", "index", "", "/api/v1/empty_path"), # intentional empty path should not cause any errors
|
24
|
-
stub_route( "^GET$", "ignored", "api/v1/sample", "/api/v1/ignored(.:format)") # an action without documentation should not cause any errors
|
25
|
+
stub_route( "^GET$", "ignored", "api/v1/sample", "/api/v1/ignored(.:format)"), # an action without documentation should not cause any errors
|
26
|
+
stub_route( "^GET|POST$","index", "api/v1/multiple_routes", "/api/v1/multiple_routes(.:format)") # multiple route methods
|
25
27
|
]}
|
26
28
|
|
27
29
|
let(:tmp_dir) { Pathname.new('/tmp/swagger-docs/') }
|
28
30
|
let(:file_resources) { tmp_dir + 'api-docs.json' }
|
29
31
|
let(:file_resource) { tmp_dir + 'api/v1/sample.json' }
|
30
32
|
let(:file_resource_nested) { tmp_dir + 'nested.json' }
|
33
|
+
let(:file_resource_custom_resource_path) { tmp_dir + 'custom_resource_path.json' }
|
34
|
+
|
35
|
+
let(:controllers) { [
|
36
|
+
"fixtures/controllers/sample_controller",
|
37
|
+
"fixtures/controllers/nested_controller",
|
38
|
+
"fixtures/controllers/custom_resource_path_controller",
|
39
|
+
"fixtures/controllers/multiple_routes_controller"
|
40
|
+
]}
|
31
41
|
|
32
42
|
context "without controller base path" do
|
33
43
|
let(:config) {
|
@@ -89,7 +99,6 @@ describe Swagger::Docs::Generator do
|
|
89
99
|
end
|
90
100
|
end
|
91
101
|
end
|
92
|
-
|
93
102
|
context "with controller base path" do
|
94
103
|
let(:config) { Swagger::Docs::Config.register_apis({
|
95
104
|
DEFAULT_VER => {:controller_base_path => "api/v1", :api_file_path => "#{tmp_dir}", :base_path => "http://api.no.where/",
|
@@ -106,13 +115,14 @@ describe Swagger::Docs::Generator do
|
|
106
115
|
}
|
107
116
|
})}
|
108
117
|
let(:file_resource) { tmp_dir + 'sample.json' }
|
118
|
+
let(:resource) { file_resource.read }
|
119
|
+
let(:response) { JSON.parse(resource) }
|
120
|
+
let(:apis) { response["apis"] }
|
109
121
|
before(:each) do
|
110
122
|
allow(Rails).to receive_message_chain(:application, :routes, :routes).and_return(routes)
|
111
123
|
Swagger::Docs::Generator.set_real_methods
|
112
|
-
require
|
113
|
-
require "fixtures/controllers/nested_controller"
|
124
|
+
controllers.each{ |path| require path }
|
114
125
|
end
|
115
|
-
|
116
126
|
context "test suite initialization" do
|
117
127
|
it "the resources file does not exist" do
|
118
128
|
expect(file_resource).to_not exist
|
@@ -121,7 +131,6 @@ describe Swagger::Docs::Generator do
|
|
121
131
|
expect(file_resource).to_not exist
|
122
132
|
end
|
123
133
|
end
|
124
|
-
|
125
134
|
describe "#write_docs" do
|
126
135
|
context "no apis registered" do
|
127
136
|
before(:each) do
|
@@ -129,7 +138,7 @@ describe Swagger::Docs::Generator do
|
|
129
138
|
end
|
130
139
|
it "generates using default config" do
|
131
140
|
results = generate({})
|
132
|
-
expect(results[DEFAULT_VER][:processed].count).to eq
|
141
|
+
expect(results[DEFAULT_VER][:processed].count).to eq(controllers.count)
|
133
142
|
end
|
134
143
|
end
|
135
144
|
before(:each) do
|
@@ -174,7 +183,7 @@ describe Swagger::Docs::Generator do
|
|
174
183
|
end
|
175
184
|
it "returns results hash" do
|
176
185
|
results = generate(config)
|
177
|
-
expect(results[DEFAULT_VER][:processed].count).to eq
|
186
|
+
expect(results[DEFAULT_VER][:processed].count).to eq(controllers.count)
|
178
187
|
expect(results[DEFAULT_VER][:skipped].count).to eq 1
|
179
188
|
end
|
180
189
|
it "writes pretty json files when set" do
|
@@ -196,7 +205,7 @@ describe Swagger::Docs::Generator do
|
|
196
205
|
expect(response["basePath"]).to eq "http://api.no.where/api/v1"
|
197
206
|
end
|
198
207
|
it "writes apis correctly" do
|
199
|
-
expect(response["apis"].count).to eq
|
208
|
+
expect(response["apis"].count).to eq(controllers.count)
|
200
209
|
end
|
201
210
|
it "writes api path correctly" do
|
202
211
|
expect(response["apis"][0]["path"]).to eq "/sample.{format}"
|
@@ -221,10 +230,18 @@ describe Swagger::Docs::Generator do
|
|
221
230
|
end
|
222
231
|
end
|
223
232
|
end
|
233
|
+
context "multiple routes resource file" do
|
234
|
+
let(:file_resource) { tmp_dir + 'multiple_routes.json' }
|
235
|
+
it "handles multiple GET path" do
|
236
|
+
resource = get_api_operation(apis, "/multiple_routes", :get)
|
237
|
+
expect(resource["method"]).to eq "get"
|
238
|
+
end
|
239
|
+
it "handles multiple POST path" do
|
240
|
+
resource = get_api_operation(apis, "/multiple_routes", :post)
|
241
|
+
expect(resource["method"]).to eq "post"
|
242
|
+
end
|
243
|
+
end
|
224
244
|
context "sample resource file" do
|
225
|
-
let(:resource) { file_resource.read }
|
226
|
-
let(:response) { JSON.parse(resource) }
|
227
|
-
let(:apis) { response["apis"] }
|
228
245
|
# {"apiVersion":"1.0","swaggerVersion":"1.2","basePath":"/api/v1","resourcePath":"/sample"
|
229
246
|
it "writes version correctly" do
|
230
247
|
expect(response["apiVersion"]).to eq DEFAULT_VER
|
@@ -347,6 +364,7 @@ describe Swagger::Docs::Generator do
|
|
347
364
|
expect(get_api_parameter(api, "role")["allowableValues"]).to eq expected_param
|
348
365
|
expect(get_api_parameter(api, "body")).to eq expected_body
|
349
366
|
expect(api["consumes"]).to eq ["application/json", "text/xml"]
|
367
|
+
expect(api["items"]).to eq("{$ref\" => \"setup\"}")
|
350
368
|
end
|
351
369
|
it "doesn't write out route put method" do
|
352
370
|
expect(get_api_operation(apis, "sample", :put)).to be_nil
|
@@ -386,12 +404,33 @@ describe Swagger::Docs::Generator do
|
|
386
404
|
"id" => {
|
387
405
|
"type" => "integer",
|
388
406
|
"description" => "User Id",
|
407
|
+
},
|
408
|
+
"type" => {
|
409
|
+
"type" => "string",
|
410
|
+
"description" => "Type",
|
411
|
+
"allowableValues" => {
|
412
|
+
"valueType" => "LIST",
|
413
|
+
"values" => [
|
414
|
+
"info",
|
415
|
+
"warning",
|
416
|
+
"error"
|
417
|
+
]
|
418
|
+
}
|
389
419
|
}
|
390
420
|
}
|
391
421
|
}
|
392
422
|
expect(models['Tag']).to eq expected_model
|
393
423
|
end
|
394
424
|
end
|
425
|
+
context "custom resource_path resource file" do
|
426
|
+
let(:resource) { file_resource_custom_resource_path.read }
|
427
|
+
let(:response) { JSON.parse(resource) }
|
428
|
+
let(:apis) { response["apis"] }
|
429
|
+
# {"apiVersion":"1.0","swaggerVersion":"1.2","basePath":"/api/v1","resourcePath":"/sample"
|
430
|
+
it "writes resourcePath correctly" do
|
431
|
+
expect(response["resourcePath"]).to eq "resource/testing"
|
432
|
+
end
|
433
|
+
end
|
395
434
|
end
|
396
435
|
end
|
397
436
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: swagger-docs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rich Hollis
|
@@ -133,7 +133,9 @@ files:
|
|
133
133
|
- lib/swagger/docs/version.rb
|
134
134
|
- lib/tasks/swagger.rake
|
135
135
|
- spec/fixtures/controllers/application_controller.rb
|
136
|
+
- spec/fixtures/controllers/custom_resource_path_controller.rb
|
136
137
|
- spec/fixtures/controllers/ignored_controller.rb
|
138
|
+
- spec/fixtures/controllers/multiple_routes_controller.rb
|
137
139
|
- spec/fixtures/controllers/nested_controller.rb
|
138
140
|
- spec/fixtures/controllers/sample_controller.rb
|
139
141
|
- spec/lib/swagger/docs/api_declaration_file_metadata_spec.rb
|
@@ -171,7 +173,9 @@ summary: Generates swagger-ui json files for rails apps with APIs. You add the s
|
|
171
173
|
DSL to your controller classes and then run one rake task to generate the json files.
|
172
174
|
test_files:
|
173
175
|
- spec/fixtures/controllers/application_controller.rb
|
176
|
+
- spec/fixtures/controllers/custom_resource_path_controller.rb
|
174
177
|
- spec/fixtures/controllers/ignored_controller.rb
|
178
|
+
- spec/fixtures/controllers/multiple_routes_controller.rb
|
175
179
|
- spec/fixtures/controllers/nested_controller.rb
|
176
180
|
- spec/fixtures/controllers/sample_controller.rb
|
177
181
|
- spec/lib/swagger/docs/api_declaration_file_metadata_spec.rb
|