openapi-rails 0.3.2 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +37 -49
- data/README.md +21 -4
- data/lib/openapi.rb +4 -3
- data/lib/openapi/activerecord.rb +0 -0
- data/lib/openapi/configuration.rb +2 -0
- data/lib/openapi/engine.rb +3 -19
- data/lib/openapi/middleware.rb +31 -0
- data/lib/openapi/mongoid.rb +2 -0
- data/lib/openapi/mongoid/crud_actions.rb +40 -32
- data/lib/openapi/mongoid/spec_builder.rb +42 -37
- data/lib/openapi/version.rb +1 -1
- data/lib/swagger/blocks/items_node.rb +4 -2
- data/lib/swagger/blocks/property_node.rb +4 -2
- data/lib/swagger/blocks/schema_builder.rb +67 -65
- data/lib/swagger/blocks/schema_node.rb +4 -2
- data/openapi-rails.gemspec +1 -5
- metadata +9 -34
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2b1aa34c54005e99ae4306aa08e2d7497f687327
|
|
4
|
+
data.tar.gz: a287a9ddddd26db598041115cb326be15eba9e06
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8976d41adeeb8e08aef3acbf70f11a814d977b1e83868bc157aa861d8c6feb91dc8a840c280d79c4a38cfd90b77a83ed8300b349def8b224932fa1b29baec0e6
|
|
7
|
+
data.tar.gz: 92d5e820340fd7dc6c1c3d76dc03b74db721ae9766d04e6034529973166c349ee1151eede7f5d8192232a523b17c4cacf8d59c5d0ffdb72abbb0f6fbea47f41d
|
data/Gemfile.lock
CHANGED
|
@@ -1,99 +1,87 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
openapi (0.3.
|
|
4
|
+
openapi-rails (0.3.3)
|
|
5
5
|
bson_ext
|
|
6
6
|
has_scope
|
|
7
|
-
kaminari
|
|
8
7
|
mongoid
|
|
9
8
|
responders (~> 2.3)
|
|
10
|
-
swagger-blocks
|
|
9
|
+
swagger-blocks (~> 2.0)
|
|
11
10
|
yajl-ruby
|
|
12
11
|
|
|
13
12
|
GEM
|
|
14
13
|
remote: http://rubygems.org/
|
|
15
14
|
specs:
|
|
16
|
-
actionpack (
|
|
17
|
-
actionview (=
|
|
18
|
-
activesupport (=
|
|
19
|
-
rack (~>
|
|
20
|
-
rack-test (~> 0.6.
|
|
21
|
-
rails-dom-testing (~>
|
|
15
|
+
actionpack (5.0.0.1)
|
|
16
|
+
actionview (= 5.0.0.1)
|
|
17
|
+
activesupport (= 5.0.0.1)
|
|
18
|
+
rack (~> 2.0)
|
|
19
|
+
rack-test (~> 0.6.3)
|
|
20
|
+
rails-dom-testing (~> 2.0)
|
|
22
21
|
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
|
23
|
-
actionview (
|
|
24
|
-
activesupport (=
|
|
22
|
+
actionview (5.0.0.1)
|
|
23
|
+
activesupport (= 5.0.0.1)
|
|
25
24
|
builder (~> 3.1)
|
|
26
25
|
erubis (~> 2.7.0)
|
|
27
|
-
rails-dom-testing (~>
|
|
26
|
+
rails-dom-testing (~> 2.0)
|
|
28
27
|
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
|
29
|
-
activemodel (
|
|
30
|
-
activesupport (=
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
activemodel (5.0.0.1)
|
|
29
|
+
activesupport (= 5.0.0.1)
|
|
30
|
+
activesupport (5.0.0.1)
|
|
31
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
33
32
|
i18n (~> 0.7)
|
|
34
|
-
json (~> 1.7, >= 1.7.7)
|
|
35
33
|
minitest (~> 5.1)
|
|
36
|
-
thread_safe (~> 0.3, >= 0.3.4)
|
|
37
34
|
tzinfo (~> 1.1)
|
|
38
|
-
bson (4.
|
|
35
|
+
bson (4.2.0)
|
|
39
36
|
bson_ext (1.5.1)
|
|
40
37
|
builder (3.2.2)
|
|
38
|
+
concurrent-ruby (1.0.2)
|
|
41
39
|
erubis (2.7.0)
|
|
42
40
|
has_scope (0.7.0)
|
|
43
41
|
actionpack (>= 4.1, < 5.1)
|
|
44
42
|
activesupport (>= 4.1, < 5.1)
|
|
45
43
|
i18n (0.7.0)
|
|
46
|
-
json (1.8.3)
|
|
47
|
-
kaminari (0.17.0)
|
|
48
|
-
actionpack (>= 3.0.0)
|
|
49
|
-
activesupport (>= 3.0.0)
|
|
50
44
|
loofah (2.0.3)
|
|
51
45
|
nokogiri (>= 1.5.9)
|
|
46
|
+
method_source (0.8.2)
|
|
52
47
|
mini_portile2 (2.1.0)
|
|
53
|
-
minitest (5.
|
|
54
|
-
mongo (2.
|
|
55
|
-
bson (~> 4.
|
|
56
|
-
mongoid (
|
|
57
|
-
activemodel (~>
|
|
58
|
-
mongo (~> 2.
|
|
59
|
-
|
|
60
|
-
tzinfo (>= 0.3.37)
|
|
61
|
-
nokogiri (1.6.8)
|
|
48
|
+
minitest (5.10.1)
|
|
49
|
+
mongo (2.4.0)
|
|
50
|
+
bson (~> 4.2.0)
|
|
51
|
+
mongoid (6.0.3)
|
|
52
|
+
activemodel (~> 5.0)
|
|
53
|
+
mongo (~> 2.3)
|
|
54
|
+
nokogiri (1.6.8.1)
|
|
62
55
|
mini_portile2 (~> 2.1.0)
|
|
63
|
-
|
|
64
|
-
origin (2.2.0)
|
|
65
|
-
pkg-config (1.1.7)
|
|
66
|
-
rack (1.6.4)
|
|
56
|
+
rack (2.0.1)
|
|
67
57
|
rack-test (0.6.3)
|
|
68
58
|
rack (>= 1.0)
|
|
69
|
-
rails-
|
|
70
|
-
activesupport (>= 4.2.0.
|
|
71
|
-
rails-dom-testing (1.0.7)
|
|
72
|
-
activesupport (>= 4.2.0.beta, < 5.0)
|
|
59
|
+
rails-dom-testing (2.0.1)
|
|
60
|
+
activesupport (>= 4.2.0, < 6.0)
|
|
73
61
|
nokogiri (~> 1.6.0)
|
|
74
|
-
rails-deprecated_sanitizer (>= 1.0.1)
|
|
75
62
|
rails-html-sanitizer (1.0.3)
|
|
76
63
|
loofah (~> 2.0)
|
|
77
|
-
railties (
|
|
78
|
-
actionpack (=
|
|
79
|
-
activesupport (=
|
|
64
|
+
railties (5.0.0.1)
|
|
65
|
+
actionpack (= 5.0.0.1)
|
|
66
|
+
activesupport (= 5.0.0.1)
|
|
67
|
+
method_source
|
|
80
68
|
rake (>= 0.8.7)
|
|
81
69
|
thor (>= 0.18.1, < 2.0)
|
|
82
|
-
rake (
|
|
70
|
+
rake (12.0.0)
|
|
83
71
|
responders (2.3.0)
|
|
84
72
|
railties (>= 4.2.0, < 5.1)
|
|
85
|
-
swagger-blocks (
|
|
86
|
-
thor (0.19.
|
|
73
|
+
swagger-blocks (2.0.0)
|
|
74
|
+
thor (0.19.4)
|
|
87
75
|
thread_safe (0.3.5)
|
|
88
76
|
tzinfo (1.2.2)
|
|
89
77
|
thread_safe (~> 0.1)
|
|
90
|
-
yajl-ruby (1.
|
|
78
|
+
yajl-ruby (1.3.0)
|
|
91
79
|
|
|
92
80
|
PLATFORMS
|
|
93
81
|
ruby
|
|
94
82
|
|
|
95
83
|
DEPENDENCIES
|
|
96
|
-
openapi!
|
|
84
|
+
openapi-rails!
|
|
97
85
|
|
|
98
86
|
BUNDLED WITH
|
|
99
87
|
1.12.4
|
data/README.md
CHANGED
|
@@ -10,6 +10,7 @@ integration.
|
|
|
10
10
|
|
|
11
11
|
**This gem supports only Mongoid, for other ORMs RPs are welcome.**
|
|
12
12
|
|
|
13
|
+
[Demo](https://openapi-demo1.herokuapp.com/openapi#/Books) project for basic `openapi-rails` integration.
|
|
13
14
|
|
|
14
15
|
## Installation
|
|
15
16
|
|
|
@@ -97,7 +98,6 @@ manually.
|
|
|
97
98
|
|
|
98
99
|
Following features are supported out of the box:
|
|
99
100
|
|
|
100
|
-
- pagination via [kaminari](https://github.com/amatsuda/kaminari)
|
|
101
101
|
- has_scope via [has_scope](https://github.com/plataformatec/has_scope)
|
|
102
102
|
- search via [mongoid-search](https://github.com/mauriciozaffari/mongoid_search)
|
|
103
103
|
- version via [mongoid-history](https://github.com/aq1018/mongoid-history)
|
|
@@ -109,9 +109,20 @@ Following features are supported out of the box:
|
|
|
109
109
|
|
|
110
110
|
In the controller there is a way override default behaviour with helpers:
|
|
111
111
|
|
|
112
|
-
- `
|
|
113
|
-
- `resource_class` — set model class manually
|
|
114
|
-
- `resource_params` — override default method that allows everything
|
|
112
|
+
- `paginates_per(number)` — set page size (default `50`) for `index` action
|
|
113
|
+
- `resource_class(klass)` — set model class manually
|
|
114
|
+
- `def resource_params` — override default method that allows everything
|
|
115
|
+
|
|
116
|
+
Helpers to customize specification build:
|
|
117
|
+
|
|
118
|
+
- `spec_params(options)`
|
|
119
|
+
|
|
120
|
+
Supported specification `options`:
|
|
121
|
+
- `collection_name` —
|
|
122
|
+
- `resource_name` —
|
|
123
|
+
- `resource_class` —
|
|
124
|
+
- `except_actions` —
|
|
125
|
+
- `relative_path` —
|
|
115
126
|
|
|
116
127
|
|
|
117
128
|
## Custom Actions
|
|
@@ -214,6 +225,12 @@ Controllers with custom logic would be placed at `app/controllers/api/v1` and
|
|
|
214
225
|

|
|
215
226
|
|
|
216
227
|
|
|
228
|
+
## Related Documents
|
|
229
|
+
|
|
230
|
+
- [OpenAPI ❤️ Rails](http://www.kra.vc/openapi-rails) — tutorial for setting
|
|
231
|
+
up a new rails project with OpenAPI support.
|
|
232
|
+
|
|
233
|
+
|
|
217
234
|
## Contributors
|
|
218
235
|
|
|
219
236
|
- [Alexander Kravets](http://www.kra.vc)
|
data/lib/openapi.rb
CHANGED
|
@@ -7,20 +7,21 @@ require 'rails/routes'
|
|
|
7
7
|
require 'has_scope'
|
|
8
8
|
require 'responders'
|
|
9
9
|
require 'renderers/csv'
|
|
10
|
-
require 'kaminari'
|
|
11
|
-
require 'openapi/mongoid/crud_actions'
|
|
12
10
|
|
|
13
11
|
require 'swagger/blocks/schema_builder'
|
|
14
12
|
require 'swagger/blocks/schema_node'
|
|
15
13
|
require 'swagger/blocks/property_node'
|
|
16
14
|
require 'swagger/blocks/items_node'
|
|
17
|
-
require 'openapi/mongoid/spec_builder'
|
|
18
15
|
|
|
19
16
|
require 'openapi/configuration'
|
|
20
17
|
require 'openapi/routes_parser'
|
|
21
18
|
require 'openapi/engine'
|
|
19
|
+
require 'openapi/middleware'
|
|
22
20
|
require 'openapi/version'
|
|
23
21
|
|
|
22
|
+
require 'openapi/mongoid' if defined?(Mongoid)
|
|
23
|
+
require 'openapi/activerecord' if defined?(ActiveRecord)
|
|
24
|
+
|
|
24
25
|
module Openapi
|
|
25
26
|
extend Configuration
|
|
26
27
|
end
|
|
File without changes
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
module Openapi
|
|
2
2
|
module Configuration
|
|
3
3
|
attr_accessor :apis
|
|
4
|
+
attr_accessor :has_specs
|
|
4
5
|
|
|
5
6
|
def configure
|
|
6
7
|
yield self
|
|
@@ -12,6 +13,7 @@ module Openapi
|
|
|
12
13
|
|
|
13
14
|
def set_default_configuration
|
|
14
15
|
self.apis = {}
|
|
16
|
+
self.has_specs = false
|
|
15
17
|
end
|
|
16
18
|
end
|
|
17
19
|
end
|
data/lib/openapi/engine.rb
CHANGED
|
@@ -7,26 +7,10 @@ module Openapi
|
|
|
7
7
|
openapi/favicon-32x32.png
|
|
8
8
|
openapi/favicon-16x16.png)
|
|
9
9
|
end
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
class Railtie < Rails::Railtie
|
|
13
|
-
initializer 'openapi.builders', after: :load_config_initializers do
|
|
14
|
-
Rails.application.reload_routes!
|
|
15
|
-
|
|
16
|
-
Openapi.apis.each do |name, config|
|
|
17
|
-
base_path = config[:base_path] || '/api'
|
|
18
|
-
|
|
19
|
-
config[:controllers].each do |controller|
|
|
20
|
-
controller.build_openapi_specification(base_path: base_path)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
name = name.to_s.titleize.remove(' ')
|
|
24
|
-
root_klass_name = "#{name}SwaggerRootController"
|
|
25
|
-
klass = Object.const_set root_klass_name, Class.new(SwaggerRoot)
|
|
26
|
-
klass.build_specification(config, config[:controllers])
|
|
27
10
|
|
|
28
|
-
|
|
29
|
-
|
|
11
|
+
initializer 'openapi.builders_middleware' do
|
|
12
|
+
# NOTE: Use middleware cause we need application routes to be loaded.
|
|
13
|
+
Rails.application.middleware.use Openapi::Middleware
|
|
30
14
|
end
|
|
31
15
|
end
|
|
32
16
|
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Openapi
|
|
2
|
+
class Middleware
|
|
3
|
+
def initialize(app)
|
|
4
|
+
@app = app
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def call(env)
|
|
8
|
+
unless Openapi.has_specs
|
|
9
|
+
puts "[Openapi::Middleware] Building openapi specs..."
|
|
10
|
+
Openapi.apis.each do |name, config|
|
|
11
|
+
base_path = config[:base_path] || '/api'
|
|
12
|
+
|
|
13
|
+
config[:controllers].each do |controller|
|
|
14
|
+
controller.build_openapi_specification(base_path: base_path)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
name = name.to_s.titleize.remove(' ')
|
|
18
|
+
root_klass_name = "#{name}SwaggerRootController"
|
|
19
|
+
klass = Object.const_set root_klass_name, Class.new(SwaggerRoot)
|
|
20
|
+
klass.build_specification(config, config[:controllers])
|
|
21
|
+
|
|
22
|
+
config[:controllers].push klass
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
Openapi.has_specs = true
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
@app.call(env)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -3,12 +3,22 @@ module Openapi
|
|
|
3
3
|
module CrudActions
|
|
4
4
|
extend ActiveSupport::Concern
|
|
5
5
|
|
|
6
|
+
class_methods do
|
|
7
|
+
def resource_class(klass)
|
|
8
|
+
self.crud_resource_class = klass
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def paginates_per(number)
|
|
12
|
+
self.crud_per_page = number
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
6
16
|
included do
|
|
7
17
|
respond_to :json
|
|
8
18
|
respond_to :csv, only: %w(index)
|
|
9
19
|
|
|
10
|
-
class_attribute :
|
|
11
|
-
class_attribute :
|
|
20
|
+
class_attribute :crud_resource_class
|
|
21
|
+
class_attribute :crud_per_page
|
|
12
22
|
|
|
13
23
|
## Actions
|
|
14
24
|
|
|
@@ -104,7 +114,7 @@ module Openapi
|
|
|
104
114
|
end
|
|
105
115
|
|
|
106
116
|
def resource_class
|
|
107
|
-
@resource_class ||= self.class.
|
|
117
|
+
@resource_class ||= self.class.crud_resource_class
|
|
108
118
|
@resource_class ||= self.class.
|
|
109
119
|
to_s.
|
|
110
120
|
split('::').
|
|
@@ -147,40 +157,48 @@ module Openapi
|
|
|
147
157
|
end
|
|
148
158
|
|
|
149
159
|
def search_filter_chain!
|
|
150
|
-
query = params[:search]
|
|
151
|
-
if query && support_search?
|
|
160
|
+
query = params[:search] || ''
|
|
161
|
+
if !query.empty? && support_search?
|
|
152
162
|
normalized_query = query.to_s.downcase
|
|
153
163
|
@chain = @chain.search(normalized_query, match: :all)
|
|
154
164
|
end
|
|
155
165
|
end
|
|
156
166
|
|
|
157
167
|
def page
|
|
158
|
-
@page ||= params[:page]
|
|
168
|
+
@page ||= (params[:page] || 1).to_i
|
|
159
169
|
end
|
|
160
170
|
|
|
161
171
|
def per_page
|
|
162
|
-
@per_page ||=
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
@chain.page(page).per(per_page)
|
|
172
|
+
@per_page ||= begin
|
|
173
|
+
value = params[:perPage].try(:to_i)
|
|
174
|
+
if value.nil?
|
|
175
|
+
self.class.crud_per_page || 25
|
|
176
|
+
elsif value == 0
|
|
177
|
+
25
|
|
169
178
|
else
|
|
170
|
-
|
|
179
|
+
value
|
|
171
180
|
end
|
|
172
181
|
end
|
|
173
182
|
end
|
|
174
183
|
|
|
184
|
+
def paginate_chain!
|
|
185
|
+
@unpaginated_chain = @chain
|
|
186
|
+
@chain = @chain.skip((page - 1) * per_page).limit(per_page)
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def last_page?(total_number)
|
|
190
|
+
total_number <= (page - 1) * per_page + per_page
|
|
191
|
+
end
|
|
192
|
+
|
|
175
193
|
def set_index_headers!
|
|
176
|
-
|
|
177
|
-
response.headers['X-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
response.headers['
|
|
194
|
+
unpaginated_chain_size = @chain.count
|
|
195
|
+
response.headers['X-Page'] = page
|
|
196
|
+
response.headers['X-Total-Count'] = unpaginated_chain_size
|
|
197
|
+
response.headers['X-Pages-Count'] = (unpaginated_chain_size.to_f / per_page).ceil
|
|
198
|
+
response.headers['X-Per-Page'] = per_page
|
|
199
|
+
|
|
200
|
+
unless last_page?(unpaginated_chain_size)
|
|
201
|
+
response.headers['X-Next-Page'] = page + 1
|
|
184
202
|
end
|
|
185
203
|
end
|
|
186
204
|
|
|
@@ -204,16 +222,6 @@ module Openapi
|
|
|
204
222
|
gsub('::', '_')
|
|
205
223
|
end
|
|
206
224
|
end
|
|
207
|
-
|
|
208
|
-
class_methods do
|
|
209
|
-
def resource_class(name)
|
|
210
|
-
self.resource_class = name
|
|
211
|
-
end
|
|
212
|
-
|
|
213
|
-
def per_page(number)
|
|
214
|
-
self.per_page = number
|
|
215
|
-
end
|
|
216
|
-
end
|
|
217
225
|
end
|
|
218
226
|
end
|
|
219
227
|
end
|
|
@@ -21,7 +21,7 @@ module Openapi
|
|
|
21
21
|
|
|
22
22
|
controller_classes.each do |c|
|
|
23
23
|
tag do
|
|
24
|
-
key :name, c.
|
|
24
|
+
key :name, c.spec_collection_name
|
|
25
25
|
end
|
|
26
26
|
end
|
|
27
27
|
end
|
|
@@ -37,42 +37,42 @@ module Openapi
|
|
|
37
37
|
included do
|
|
38
38
|
include Swagger::Blocks
|
|
39
39
|
|
|
40
|
-
class_attribute :
|
|
41
|
-
class_attribute :
|
|
42
|
-
class_attribute :
|
|
43
|
-
class_attribute :
|
|
44
|
-
class_attribute :
|
|
40
|
+
class_attribute :spec_collection_name
|
|
41
|
+
class_attribute :spec_resource_name
|
|
42
|
+
class_attribute :spec_resource_class
|
|
43
|
+
class_attribute :spec_except_actions
|
|
44
|
+
class_attribute :spec_relative_path
|
|
45
45
|
|
|
46
|
-
class_attribute :
|
|
46
|
+
class_attribute :spec_base_path
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
class_methods do
|
|
50
|
-
def
|
|
51
|
-
self.
|
|
52
|
-
self.
|
|
53
|
-
self.
|
|
54
|
-
self.
|
|
55
|
-
self.
|
|
50
|
+
def spec_params(options)
|
|
51
|
+
self.spec_collection_name = options[:collection_name]
|
|
52
|
+
self.spec_resource_name = options[:resource_name]
|
|
53
|
+
self.spec_resource_class = options[:resource_class]
|
|
54
|
+
self.spec_except_actions = options[:except_actions]
|
|
55
|
+
self.spec_relative_path = options[:relative_path]
|
|
56
56
|
end
|
|
57
57
|
|
|
58
58
|
def build_openapi_specification(options)
|
|
59
|
-
self.
|
|
59
|
+
self.spec_base_path = options[:base_path]
|
|
60
60
|
|
|
61
|
-
self.
|
|
61
|
+
self.spec_relative_path ||=
|
|
62
62
|
('/' + to_s.remove(/Controller$/).gsub('::', '/').underscore).
|
|
63
|
-
remove(
|
|
63
|
+
remove(spec_base_path)
|
|
64
64
|
|
|
65
|
-
self.
|
|
65
|
+
self.spec_except_actions ||= []
|
|
66
66
|
|
|
67
|
-
self.
|
|
67
|
+
self.spec_collection_name ||=
|
|
68
68
|
to_s.split('::').last.sub(/Controller$/, '')
|
|
69
69
|
|
|
70
|
-
self.
|
|
71
|
-
self.
|
|
70
|
+
self.spec_resource_name ||=
|
|
71
|
+
self.spec_collection_name.singularize
|
|
72
72
|
|
|
73
|
-
self.
|
|
74
|
-
self.
|
|
75
|
-
self.
|
|
73
|
+
self.spec_resource_class ||= self.try(:crud_resource_class)
|
|
74
|
+
self.spec_resource_class ||=
|
|
75
|
+
self.spec_resource_name.constantize
|
|
76
76
|
|
|
77
77
|
build_openapi_definitions
|
|
78
78
|
build_openapi_paths
|
|
@@ -88,9 +88,9 @@ module Openapi
|
|
|
88
88
|
end
|
|
89
89
|
|
|
90
90
|
def build_openapi_definitions
|
|
91
|
-
collection_name =
|
|
92
|
-
resource_class =
|
|
93
|
-
resource_name =
|
|
91
|
+
collection_name = spec_collection_name
|
|
92
|
+
resource_class = spec_resource_class
|
|
93
|
+
resource_name = spec_resource_name
|
|
94
94
|
resource_property_name = resource_name.underscore.to_sym
|
|
95
95
|
|
|
96
96
|
swagger_schema resource_name do
|
|
@@ -103,6 +103,12 @@ module Openapi
|
|
|
103
103
|
relation_name =
|
|
104
104
|
relation.name.to_s.singularize.titleize.remove(' ')
|
|
105
105
|
|
|
106
|
+
# TODO: This is not accurate, class might be in the same
|
|
107
|
+
# namespace as related.
|
|
108
|
+
# namespace = resource_class.to_s.split('::')[0...-1].join('::')
|
|
109
|
+
# generated_embedded_resource_class_name = [namespace, relation_name].join('::')
|
|
110
|
+
|
|
111
|
+
# TODO: Add error handler in case class is not guessed here.
|
|
106
112
|
embedded_resource_class =
|
|
107
113
|
(relation.class_name || relation_name).constantize
|
|
108
114
|
|
|
@@ -131,32 +137,31 @@ module Openapi
|
|
|
131
137
|
end
|
|
132
138
|
|
|
133
139
|
def build_crud_specification(routes)
|
|
134
|
-
name =
|
|
140
|
+
name = spec_resource_name
|
|
135
141
|
sym_name = name.underscore.to_sym
|
|
136
|
-
plural_name =
|
|
137
|
-
path =
|
|
142
|
+
plural_name = spec_collection_name
|
|
143
|
+
path = spec_relative_path
|
|
138
144
|
scopes = try(:scopes_configuration) || []
|
|
139
145
|
actions = routes.map {|r| r[2]}.uniq
|
|
140
146
|
json_mime = %w(application/json)
|
|
141
147
|
|
|
142
148
|
include_index = actions.include?('index') &&
|
|
143
|
-
!
|
|
149
|
+
!spec_except_actions.include?('index')
|
|
144
150
|
include_create = actions.include?('create') &&
|
|
145
|
-
!
|
|
151
|
+
!spec_except_actions.include?('create')
|
|
146
152
|
include_show = actions.include?('show') &&
|
|
147
|
-
!
|
|
153
|
+
!spec_except_actions.include?('show')
|
|
148
154
|
include_update = actions.include?('update') &&
|
|
149
|
-
!
|
|
155
|
+
!spec_except_actions.include?('update')
|
|
150
156
|
include_destroy = actions.include?('destroy') &&
|
|
151
|
-
!
|
|
157
|
+
!spec_except_actions.include?('destroy')
|
|
152
158
|
|
|
153
159
|
include_collection_actions =
|
|
154
160
|
(include_index || include_create)
|
|
155
161
|
include_resource_actions =
|
|
156
162
|
(include_show || include_update || include_destroy)
|
|
157
163
|
|
|
158
|
-
support_search =
|
|
159
|
-
.include?(:search)
|
|
164
|
+
support_search = spec_resource_class.methods.include?(:search)
|
|
160
165
|
|
|
161
166
|
if include_collection_actions
|
|
162
167
|
swagger_path path do
|
|
@@ -426,7 +431,7 @@ module Openapi
|
|
|
426
431
|
custom_routes = routes.select {|r| !CRUD_ACTIONS.include?(r[2])}
|
|
427
432
|
no_spec_methods = custom_routes.select do |route|
|
|
428
433
|
method = route[0].to_sym
|
|
429
|
-
path = route[1].remove(
|
|
434
|
+
path = route[1].remove(spec_base_path)
|
|
430
435
|
path_sym = path.gsub(/:(\w+)/, '{\1}').to_sym
|
|
431
436
|
|
|
432
437
|
! action_specification_exists?(method, path_sym)
|
data/lib/openapi/version.rb
CHANGED
|
@@ -1,85 +1,87 @@
|
|
|
1
1
|
module Swagger
|
|
2
2
|
module Blocks
|
|
3
|
-
module
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def build_model_schema(model_class, include_only_required_fields=false)
|
|
27
|
-
required_fields = get_required_fields(model_class)
|
|
3
|
+
module Nodes
|
|
4
|
+
module SchemaBuilder
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
SUPPORTED_TYPES = %w(Mongoid::Boolean
|
|
8
|
+
BSON::ObjectId
|
|
9
|
+
Object
|
|
10
|
+
Time
|
|
11
|
+
String
|
|
12
|
+
Integer
|
|
13
|
+
Array
|
|
14
|
+
Date
|
|
15
|
+
Symbol).freeze
|
|
16
|
+
|
|
17
|
+
def get_required_fields(model_class)
|
|
18
|
+
presence_validators = model_class.
|
|
19
|
+
validators.
|
|
20
|
+
select { |v| v.class == Mongoid::Validatable::PresenceValidator }
|
|
21
|
+
|
|
22
|
+
required_fields = presence_validators.map { |v| v.attributes.first }
|
|
23
|
+
required_fields << '_id'
|
|
24
|
+
required_fields
|
|
25
|
+
end
|
|
28
26
|
|
|
29
|
-
|
|
27
|
+
def build_model_schema(model_class, include_only_required_fields=false)
|
|
28
|
+
required_fields = get_required_fields(model_class)
|
|
30
29
|
|
|
31
|
-
|
|
32
|
-
type = options.type.to_s
|
|
33
|
-
defaul_value = options.options[:default]
|
|
30
|
+
key :required, required_fields
|
|
34
31
|
|
|
35
|
-
|
|
32
|
+
model_class.fields.each do |name, options|
|
|
33
|
+
type = options.type.to_s
|
|
34
|
+
defaul_value = options.options[:default]
|
|
36
35
|
|
|
37
|
-
|
|
38
|
-
next if name == '_id'
|
|
39
|
-
next unless required_fields.include?(name.to_sym)
|
|
40
|
-
end
|
|
36
|
+
next unless SUPPORTED_TYPES.include?(type)
|
|
41
37
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
constant = name.sub('_', '').upcase
|
|
47
|
-
values = "#{klass}::#{constant}".constantize
|
|
38
|
+
if include_only_required_fields
|
|
39
|
+
next if name == '_id'
|
|
40
|
+
next unless required_fields.include?(name.to_sym)
|
|
41
|
+
end
|
|
48
42
|
|
|
49
|
-
|
|
50
|
-
|
|
43
|
+
property name do
|
|
44
|
+
case type
|
|
45
|
+
when 'Symbol'
|
|
46
|
+
klass = options.options[:klass].to_s
|
|
47
|
+
constant = name.sub('_', '').upcase
|
|
48
|
+
values = "#{klass}::#{constant}".constantize
|
|
51
49
|
|
|
52
|
-
when 'Array'
|
|
53
|
-
key :type, :array
|
|
54
|
-
# TODO: autodetect type of Array Item
|
|
55
|
-
items do
|
|
56
50
|
key :type, :string
|
|
57
|
-
|
|
51
|
+
key :enum, values
|
|
58
52
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
53
|
+
when 'Array'
|
|
54
|
+
key :type, :array
|
|
55
|
+
# TODO: autodetect type of Array Item
|
|
56
|
+
items do
|
|
57
|
+
key :type, :string
|
|
58
|
+
end
|
|
62
59
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
60
|
+
when 'BSON::ObjectId'
|
|
61
|
+
key :type, :string
|
|
62
|
+
key :format, :uuid
|
|
63
|
+
|
|
64
|
+
when 'Date'
|
|
65
|
+
key :type, :string
|
|
66
|
+
key :format, :date
|
|
66
67
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
when 'Time'
|
|
69
|
+
key :type, :string
|
|
70
|
+
key :format, 'date-time'
|
|
70
71
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
when 'Mongoid::Boolean'
|
|
73
|
+
key :type, :boolean
|
|
74
|
+
key :default, defaul_value
|
|
74
75
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
76
|
+
when 'Integer'
|
|
77
|
+
key :type, :integer
|
|
78
|
+
key :default, defaul_value.to_i
|
|
78
79
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
else
|
|
81
|
+
key :type, :string
|
|
82
|
+
key :default, defaul_value.to_s
|
|
82
83
|
|
|
84
|
+
end
|
|
83
85
|
end
|
|
84
86
|
end
|
|
85
87
|
end
|
data/openapi-rails.gemspec
CHANGED
|
@@ -19,17 +19,13 @@ Gem::Specification.new do |s|
|
|
|
19
19
|
s.platform = Gem::Platform::RUBY
|
|
20
20
|
|
|
21
21
|
# DSL for pure Ruby code blocks that can be turned into JSON
|
|
22
|
-
s.add_dependency 'swagger-blocks'
|
|
22
|
+
s.add_dependency 'swagger-blocks', '~> 2.0'
|
|
23
23
|
# A set of Rails responders to dry up application controllers
|
|
24
24
|
s.add_dependency 'responders', '~> 2.3'
|
|
25
|
-
# Clean, powerful, customizable and sophisticated paginator
|
|
26
|
-
s.add_dependency 'kaminari'
|
|
27
25
|
# C extensions to accelerate the Ruby BSON serialization
|
|
28
26
|
s.add_dependency 'bson_ext'
|
|
29
27
|
# Fast streaming JSON parsing and encoding library for Ruby
|
|
30
28
|
s.add_dependency 'yajl-ruby'
|
|
31
|
-
# Ruby ODM framework for MongoDB
|
|
32
|
-
s.add_dependency 'mongoid'
|
|
33
29
|
# Map incoming controller parameters to named scopes in resources
|
|
34
30
|
s.add_dependency 'has_scope'
|
|
35
31
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: openapi-rails
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Alexander Kravets
|
|
@@ -9,22 +9,22 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2017-01-08 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: swagger-blocks
|
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
|
17
17
|
requirements:
|
|
18
|
-
- - "
|
|
18
|
+
- - "~>"
|
|
19
19
|
- !ruby/object:Gem::Version
|
|
20
|
-
version: '0'
|
|
20
|
+
version: '2.0'
|
|
21
21
|
type: :runtime
|
|
22
22
|
prerelease: false
|
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
|
24
24
|
requirements:
|
|
25
|
-
- - "
|
|
25
|
+
- - "~>"
|
|
26
26
|
- !ruby/object:Gem::Version
|
|
27
|
-
version: '0'
|
|
27
|
+
version: '2.0'
|
|
28
28
|
- !ruby/object:Gem::Dependency
|
|
29
29
|
name: responders
|
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -39,20 +39,6 @@ dependencies:
|
|
|
39
39
|
- - "~>"
|
|
40
40
|
- !ruby/object:Gem::Version
|
|
41
41
|
version: '2.3'
|
|
42
|
-
- !ruby/object:Gem::Dependency
|
|
43
|
-
name: kaminari
|
|
44
|
-
requirement: !ruby/object:Gem::Requirement
|
|
45
|
-
requirements:
|
|
46
|
-
- - ">="
|
|
47
|
-
- !ruby/object:Gem::Version
|
|
48
|
-
version: '0'
|
|
49
|
-
type: :runtime
|
|
50
|
-
prerelease: false
|
|
51
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
52
|
-
requirements:
|
|
53
|
-
- - ">="
|
|
54
|
-
- !ruby/object:Gem::Version
|
|
55
|
-
version: '0'
|
|
56
42
|
- !ruby/object:Gem::Dependency
|
|
57
43
|
name: bson_ext
|
|
58
44
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -81,20 +67,6 @@ dependencies:
|
|
|
81
67
|
- - ">="
|
|
82
68
|
- !ruby/object:Gem::Version
|
|
83
69
|
version: '0'
|
|
84
|
-
- !ruby/object:Gem::Dependency
|
|
85
|
-
name: mongoid
|
|
86
|
-
requirement: !ruby/object:Gem::Requirement
|
|
87
|
-
requirements:
|
|
88
|
-
- - ">="
|
|
89
|
-
- !ruby/object:Gem::Version
|
|
90
|
-
version: '0'
|
|
91
|
-
type: :runtime
|
|
92
|
-
prerelease: false
|
|
93
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
94
|
-
requirements:
|
|
95
|
-
- - ">="
|
|
96
|
-
- !ruby/object:Gem::Version
|
|
97
|
-
version: '0'
|
|
98
70
|
- !ruby/object:Gem::Dependency
|
|
99
71
|
name: has_scope
|
|
100
72
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -163,8 +135,11 @@ files:
|
|
|
163
135
|
- lib/generators/openapi/templates/openapi.rb
|
|
164
136
|
- lib/openapi-rails.rb
|
|
165
137
|
- lib/openapi.rb
|
|
138
|
+
- lib/openapi/activerecord.rb
|
|
166
139
|
- lib/openapi/configuration.rb
|
|
167
140
|
- lib/openapi/engine.rb
|
|
141
|
+
- lib/openapi/middleware.rb
|
|
142
|
+
- lib/openapi/mongoid.rb
|
|
168
143
|
- lib/openapi/mongoid/crud_actions.rb
|
|
169
144
|
- lib/openapi/mongoid/spec_builder.rb
|
|
170
145
|
- lib/openapi/routes_parser.rb
|