apipie-rails 0.5.13 → 0.5.14
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 +5 -5
- data/CHANGELOG.md +9 -0
- data/Gemfile +1 -1
- data/app/views/apipie/apipies/_method_detail.erb +4 -0
- data/lib/apipie/dsl_definition.rb +1 -1
- data/lib/apipie/extractor.rb +1 -0
- data/lib/apipie/extractor/recorder.rb +3 -2
- data/lib/apipie/param_description.rb +8 -0
- data/lib/apipie/validator.rb +10 -5
- data/lib/apipie/version.rb +1 -1
- data/spec/controllers/extended_controller_spec.rb +1 -0
- data/spec/dummy/app/controllers/extended_controller.rb +4 -0
- data/spec/lib/swagger/swagger_dsl_spec.rb +20 -10
- data/spec/lib/validator_spec.rb +52 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: '018d734565f6849bf6c073c6774b2a99082bd6b88f15221999ae80b40c0efacc'
|
4
|
+
data.tar.gz: 00711a809dbdab171df9f447a3a6e7a8613cc89fa3ec7d632a036b5e2970c83d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 239806146c1a87920924fcb3ea63d8401edb21aa69b13a1f1305cdd4c2404c05f000cda9684fbdddd785b4124c0dde5540c6eaf78371e3e30172a96af6c54ac5
|
7
|
+
data.tar.gz: 1a58f612309c9c58c646805dabb64543257e26aa77e0132e8fc7b7d23fbe270008d449e39b00f4e89cc20b4920a044e428721df88c7427d6f114c7a3ee3b2423
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,15 @@
|
|
1
1
|
Changelog
|
2
2
|
===========
|
3
3
|
|
4
|
+
v0.5.14
|
5
|
+
-------
|
6
|
+
- HTML escape validator values [\#645](https://github.com/Apipie/apipie-rails/pull/645) ([ekohl](https://github.com/ekohl))
|
7
|
+
- Support for adding new params via `update\_api` [\#642](https://github.com/Apipie/apipie-rails/pull/642) ([iNecas](https://github.com/iNecas))
|
8
|
+
- Allow the "null" JSON string to be used as a parameter in Apipie spec examples \(`show\_in\_doc`\) [\#641](https://github.com/Apipie/apipie-rails/pull/641) ([enrique-guillen](https://github.com/enrique-guillen))
|
9
|
+
- Fix examples recording for specific cases [\#640](https://github.com/Apipie/apipie-rails/pull/640) ([Marri](https://github.com/Marri))
|
10
|
+
- Add description section to response [\#639](https://github.com/Apipie/apipie-rails/pull/639) ([X1ting](https://github.com/X1ting))
|
11
|
+
|
12
|
+
|
4
13
|
v0.5.13
|
5
14
|
-------
|
6
15
|
- Fix swagger generation if a controller's parent doesn't define a resource_description [\#637](https://github.com/Apipie/apipie-rails/pull/637) ([enrique-guillen](https://github.com/enrique-guillen))
|
data/Gemfile
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Gemfile.rails50
|
1
|
+
./Gemfile.rails50
|
@@ -40,6 +40,10 @@
|
|
40
40
|
<%= heading(t('apipie.returns'), h_level) %>
|
41
41
|
<% method[:returns].each do |item| %>
|
42
42
|
<%= heading("#{t('apipie.code')}: #{item[:code]}", h_level + 1) %>
|
43
|
+
<% if item[:description] %>
|
44
|
+
<%= heading("#{t('apipie.description')}:", h_level + 2) %>
|
45
|
+
<p><%= item[:description] %></p>
|
46
|
+
<% end %>
|
43
47
|
<table class='table'>
|
44
48
|
<thead>
|
45
49
|
<tr>
|
@@ -498,7 +498,7 @@ module Apipie
|
|
498
498
|
params_ordered = dsl_data[:params].map do |args|
|
499
499
|
Apipie::ParamDescription.from_dsl_data(method_description, args)
|
500
500
|
end
|
501
|
-
ParamDescription.
|
501
|
+
ParamDescription.merge(method_description.params_ordered_self, params_ordered)
|
502
502
|
end
|
503
503
|
end
|
504
504
|
|
data/lib/apipie/extractor.rb
CHANGED
@@ -23,6 +23,7 @@ class Apipie::Railtie
|
|
23
23
|
end
|
24
24
|
else
|
25
25
|
ActionController::TestCase.send(:prepend, Apipie::Extractor::Recorder::FunctionalTestRecording)
|
26
|
+
ActionController::TestCase::Behavior.send(:prepend, Apipie::Extractor::Recorder::FunctionalTestRecording)
|
26
27
|
end
|
27
28
|
end
|
28
29
|
end
|
@@ -13,12 +13,13 @@ module Apipie
|
|
13
13
|
@query = env["QUERY_STRING"] unless env["QUERY_STRING"].blank?
|
14
14
|
@params = Rack::Utils.parse_nested_query(@query)
|
15
15
|
@params.merge!(env["action_dispatch.request.request_parameters"] || {})
|
16
|
-
|
16
|
+
rack_input = env["rack.input"]
|
17
|
+
if data = parse_data(rack_input.read)
|
17
18
|
@request_data = data
|
18
|
-
env["rack.input"].rewind
|
19
19
|
elsif form_hash = env["rack.request.form_hash"]
|
20
20
|
@request_data = reformat_multipart_data(form_hash)
|
21
21
|
end
|
22
|
+
rack_input.rewind
|
22
23
|
end
|
23
24
|
|
24
25
|
def analyse_controller(controller)
|
@@ -197,6 +197,14 @@ module Apipie
|
|
197
197
|
end.sort_by { |param| ordering.index(param.name) }
|
198
198
|
end
|
199
199
|
|
200
|
+
def self.merge(target_params, source_params)
|
201
|
+
params_to_merge, params_to_add = source_params.partition do |source_param|
|
202
|
+
target_params.any? { |target_param| source_param.name == target_param.name }
|
203
|
+
end
|
204
|
+
unify(target_params + params_to_merge)
|
205
|
+
target_params.concat(params_to_add)
|
206
|
+
end
|
207
|
+
|
200
208
|
# action awareness is being inherited from ancestors (in terms of
|
201
209
|
# nested params)
|
202
210
|
def action_aware?
|
data/lib/apipie/validator.rb
CHANGED
@@ -57,6 +57,10 @@ module Apipie
|
|
57
57
|
"TODO: validator description"
|
58
58
|
end
|
59
59
|
|
60
|
+
def format_description_value(value)
|
61
|
+
"<code>#{CGI::escapeHTML(value.to_s)}</code>"
|
62
|
+
end
|
63
|
+
|
60
64
|
def error
|
61
65
|
ParamInvalid.new(param_name, @error_value, description)
|
62
66
|
end
|
@@ -148,7 +152,7 @@ module Apipie
|
|
148
152
|
end
|
149
153
|
|
150
154
|
def description
|
151
|
-
"Must match regular expression
|
155
|
+
"Must match regular expression #{format_description_value("/#{@regexp.source}/")}."
|
152
156
|
end
|
153
157
|
end
|
154
158
|
|
@@ -172,7 +176,7 @@ module Apipie
|
|
172
176
|
end
|
173
177
|
|
174
178
|
def description
|
175
|
-
string = @array.map { |value|
|
179
|
+
string = @array.map { |value| format_description_value(value) }.join(', ')
|
176
180
|
"Must be one of: #{string}."
|
177
181
|
end
|
178
182
|
end
|
@@ -272,7 +276,8 @@ module Apipie
|
|
272
276
|
end
|
273
277
|
|
274
278
|
def description
|
275
|
-
|
279
|
+
string = @array.map { |value| format_description_value(value) }.join(', ')
|
280
|
+
"Must be one of: #{string}."
|
276
281
|
end
|
277
282
|
end
|
278
283
|
|
@@ -467,8 +472,8 @@ module Apipie
|
|
467
472
|
end
|
468
473
|
|
469
474
|
def description
|
470
|
-
string = %w(true false 1 0).map { |value|
|
471
|
-
"Must be one of: #{string}"
|
475
|
+
string = %w(true false 1 0).map { |value| format_description_value(value) }.join(', ')
|
476
|
+
"Must be one of: #{string}."
|
472
477
|
end
|
473
478
|
end
|
474
479
|
|
data/lib/apipie/version.rb
CHANGED
@@ -3,6 +3,7 @@ require "spec_helper"
|
|
3
3
|
describe ExtendedController do
|
4
4
|
|
5
5
|
it 'should include params from both original controller and extending concern' do
|
6
|
+
expect(Apipie["extended#create"].params.keys).to eq [:oauth, :user, :admin]
|
6
7
|
user_param = Apipie["extended#create"].params[:user]
|
7
8
|
expect(user_param.validator.params_ordered.map(&:name)).to eq [:name, :password, :from_concern]
|
8
9
|
end
|
@@ -73,18 +73,28 @@ describe "Swagger Responses" do
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def deep_match?(actual, expected, breadcrumb=[])
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
return false
|
76
|
+
pending_params = actual.params_ordered.dup
|
77
|
+
expected.each do |expected_param|
|
78
|
+
expected_param_name = expected_param.is_a?(Hash) ? expected_param.keys.first : expected_param
|
79
|
+
actual_param = pending_params.find { |param| param.name.to_s == expected_param_name.to_s }
|
80
|
+
unless actual_param
|
81
|
+
@fail_message = "Couldn't find #{expected_param_name.inspect} among #{pending_params.map(&:name)} in #{breadcrumb.join('.')}"
|
82
|
+
return false
|
83
|
+
else
|
84
|
+
pending_params.delete_if { |p| p.object_id == actual_param.object_id }
|
83
85
|
end
|
84
|
-
|
86
|
+
|
87
|
+
return false unless fields_match?(actual_param, expected_param_name, breadcrumb)
|
88
|
+
if expected_param.is_a? Hash
|
89
|
+
return false unless deep_match?(actual_param.validator, expected_param.values[0], breadcrumb + [expected_param.keys.first])
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
unless pending_params.empty?
|
94
|
+
@fail_message = "Unexpected properties #{pending_params.map(&:name)} in #{breadcrumb.join('.')}"
|
95
|
+
return false
|
85
96
|
end
|
86
|
-
|
87
|
-
actual.params_ordered.count == num
|
97
|
+
true
|
88
98
|
end
|
89
99
|
|
90
100
|
def fields_match?(param, expected_name, breadcrumb)
|
data/spec/lib/validator_spec.rb
CHANGED
@@ -50,6 +50,23 @@ describe Apipie::Validator do
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
+
describe 'BooleanValidator' do
|
54
|
+
it "should validate by object class" do
|
55
|
+
validator = Apipie::Validator::BooleanValidator.new(params_desc)
|
56
|
+
expect(validator.validate("1")).to be_truthy
|
57
|
+
expect(validator.validate(1)).to be_truthy
|
58
|
+
expect(validator.validate(true)).to be_truthy
|
59
|
+
expect(validator.validate(0)).to be_truthy
|
60
|
+
expect(validator.validate(false)).to be_truthy
|
61
|
+
expect(validator.validate({ 1 => 1 })).to be_falsey
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should have a valid description" do
|
65
|
+
validator = Apipie::Validator::BooleanValidator.new(params_desc)
|
66
|
+
expect(validator.description).to eq('Must be one of: <code>true</code>, <code>false</code>, <code>1</code>, <code>0</code>.')
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
53
70
|
describe 'ArrayClassValidator' do
|
54
71
|
it "should validate by object class" do
|
55
72
|
validator = Apipie::Validator::ArrayClassValidator.new(params_desc, [Fixnum, String])
|
@@ -57,5 +74,40 @@ describe Apipie::Validator do
|
|
57
74
|
expect(validator.validate(1)).to be_truthy
|
58
75
|
expect(validator.validate({ 1 => 1 })).to be_falsey
|
59
76
|
end
|
77
|
+
|
78
|
+
it "should have a valid description" do
|
79
|
+
validator = Apipie::Validator::ArrayClassValidator.new(params_desc, [Float, String])
|
80
|
+
expect(validator.description).to eq('Must be one of: <code>Float</code>, <code>String</code>.')
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe 'RegexpValidator' do
|
85
|
+
it "should validate by object class" do
|
86
|
+
validator = Apipie::Validator::RegexpValidator.new(params_desc, /^valid( extra)*$/)
|
87
|
+
expect(validator.validate("valid")).to be_truthy
|
88
|
+
expect(validator.validate("valid extra")).to be_truthy
|
89
|
+
expect(validator.validate("valid extra extra")).to be_truthy
|
90
|
+
expect(validator.validate("invalid")).to be_falsey
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should have a valid description" do
|
94
|
+
validator = Apipie::Validator::RegexpValidator.new(params_desc, /^valid( extra)*$/)
|
95
|
+
expect(validator.description).to eq('Must match regular expression <code>/^valid( extra)*$/</code>.')
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe 'EnumValidator' do
|
100
|
+
it "should validate by object class" do
|
101
|
+
validator = Apipie::Validator::EnumValidator.new(params_desc, ['first', 'second & third'])
|
102
|
+
expect(validator.validate("first")).to be_truthy
|
103
|
+
expect(validator.validate("second & third")).to be_truthy
|
104
|
+
expect(validator.validate(1)).to be_falsey
|
105
|
+
expect(validator.validate({ 1 => 1 })).to be_falsey
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should have a valid description" do
|
109
|
+
validator = Apipie::Validator::EnumValidator.new(params_desc, ['first', 'second & third'])
|
110
|
+
expect(validator.description).to eq('Must be one of: <code>first</code>, <code>second & third</code>.')
|
111
|
+
end
|
60
112
|
end
|
61
113
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apipie-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pavel Pokorny
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-
|
12
|
+
date: 2018-11-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -331,7 +331,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
331
331
|
version: '0'
|
332
332
|
requirements: []
|
333
333
|
rubyforge_project:
|
334
|
-
rubygems_version: 2.
|
334
|
+
rubygems_version: 2.7.6
|
335
335
|
signing_key:
|
336
336
|
specification_version: 4
|
337
337
|
summary: Rails REST API documentation tool
|