apipie-rails 1.2.3 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/build.yml +5 -4
- data/.github/workflows/rubocop-challenger.yml +1 -3
- data/.github/workflows/rubocop.yml +1 -1
- data/.rubocop_todo.yml +22 -28
- data/CHANGELOG.md +22 -0
- data/Gemfile +2 -3
- data/README.md +2088 -0
- data/apipie-rails.gemspec +7 -1
- data/app/views/apipie/apipies/_method_detail.erb +2 -0
- data/app/views/apipie/apipies/_params.html.erb +1 -0
- data/app/views/apipie/apipies/_params_plain.html.erb +1 -0
- data/config/locales/en.yml +1 -0
- data/config/locales/ko.yml +1 -0
- data/lib/apipie/application.rb +1 -1
- data/lib/apipie/dsl_definition.rb +10 -11
- data/lib/apipie/errors.rb +1 -1
- data/lib/apipie/extractor/collector.rb +1 -1
- data/lib/apipie/extractor/recorder.rb +1 -1
- data/lib/apipie/extractor/writer.rb +2 -2
- data/lib/apipie/generator/swagger/config.rb +1 -1
- data/lib/apipie/generator/swagger/method_description/parameters_service.rb +1 -1
- data/lib/apipie/generator/swagger/method_description/response_service.rb +14 -1
- data/lib/apipie/generator/swagger/param_description/builder.rb +9 -0
- data/lib/apipie/generator/swagger/param_description/type.rb +15 -2
- data/lib/apipie/generator/swagger/resource_description_collection.rb +2 -2
- data/lib/apipie/param_description.rb +1 -1
- data/lib/apipie/response_description.rb +34 -9
- data/lib/apipie/response_description_adapter.rb +3 -3
- data/lib/apipie/routes_formatter.rb +1 -1
- data/lib/apipie/static_dispatcher.rb +7 -1
- data/lib/apipie/version.rb +1 -1
- data/lib/tasks/apipie.rake +3 -3
- data/rel-eng/gem_release.ipynb +5 -5
- data/spec/controllers/users_controller_spec.rb +1 -1
- data/spec/dummy/app/controllers/api/v2/empty_middle_controller.rb +1 -1
- data/spec/dummy/app/controllers/pets_controller.rb +2 -2
- data/spec/dummy/app/controllers/twitter_example_controller.rb +3 -3
- data/spec/lib/apipie/apipies_controller_spec.rb +1 -1
- data/spec/lib/apipie/extractor_spec.rb +1 -1
- data/spec/lib/apipie/file_handler_spec.rb +1 -1
- data/spec/lib/apipie/generator/swagger/method_description/response_schema_service_spec.rb +6 -6
- data/spec/lib/apipie/generator/swagger/method_description/response_service_spec.rb +62 -0
- data/spec/lib/apipie/generator/swagger/param_description/builder_spec.rb +14 -2
- data/spec/lib/apipie/generator/swagger/param_description/type_spec.rb +6 -1
- data/spec/lib/apipie/param_description_spec.rb +1 -1
- data/spec/lib/apipie/response_description/response_object_spec.rb +22 -0
- data/spec/lib/apipie/response_description_spec.rb +56 -0
- data/spec/lib/apipie/swagger_generator_spec.rb +2 -2
- data/spec/lib/swagger/rake_swagger_spec.rb +6 -1
- data/spec/lib/swagger/swagger_dsl_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- metadata +12 -6
- data/README.rst +0 -1965
@@ -19,8 +19,8 @@ describe Apipie::Generator::Swagger::MethodDescription::ResponseSchemaService do
|
|
19
19
|
|
20
20
|
let(:response_description_dsl) do
|
21
21
|
proc do
|
22
|
-
property :a_number, Integer
|
23
|
-
property :an_optional_number, Integer, required: false
|
22
|
+
property :a_number, Integer, example: 1
|
23
|
+
property :an_optional_number, Integer, required: false, example: 2
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
@@ -56,10 +56,10 @@ describe Apipie::Generator::Swagger::MethodDescription::ResponseSchemaService do
|
|
56
56
|
expect(properties).to eq(
|
57
57
|
{
|
58
58
|
a_number: {
|
59
|
-
type: 'number', required: true
|
59
|
+
type: 'number', required: true, example: 1
|
60
60
|
},
|
61
61
|
an_optional_number: {
|
62
|
-
type: 'number'
|
62
|
+
type: 'number', example: 2
|
63
63
|
}
|
64
64
|
}
|
65
65
|
)
|
@@ -72,10 +72,10 @@ describe Apipie::Generator::Swagger::MethodDescription::ResponseSchemaService do
|
|
72
72
|
expect(properties).to eq(
|
73
73
|
{
|
74
74
|
a_number: {
|
75
|
-
type: %w[number null], required: true
|
75
|
+
type: %w[number null], required: true, example: 1
|
76
76
|
},
|
77
77
|
an_optional_number: {
|
78
|
-
type: %w[number null]
|
78
|
+
type: %w[number null], example: 2
|
79
79
|
}
|
80
80
|
}
|
81
81
|
)
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Apipie::Generator::Swagger::MethodDescription::ResponseService do
|
4
|
+
let(:http_method) { nil }
|
5
|
+
let(:language) { :en }
|
6
|
+
let(:dsl_data) { ActionController::Base.send(:_apipie_dsl_data_init) }
|
7
|
+
|
8
|
+
let(:method_description) do
|
9
|
+
Apipie::Generator::Swagger::MethodDescription::Decorator.new(
|
10
|
+
Apipie::MethodDescription.new(
|
11
|
+
'create',
|
12
|
+
Apipie::ResourceDescription.new(ApplicationController, 'pets'),
|
13
|
+
dsl_data
|
14
|
+
)
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
let(:returns) { [] }
|
19
|
+
|
20
|
+
let(:service) do
|
21
|
+
described_class.new(
|
22
|
+
method_description,
|
23
|
+
http_method: http_method,
|
24
|
+
language: language
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#call' do
|
29
|
+
describe 'headers' do
|
30
|
+
subject(:headers) { service.call[status_code][:headers] }
|
31
|
+
|
32
|
+
let(:status_code) { 200 }
|
33
|
+
|
34
|
+
it { is_expected.to be_blank }
|
35
|
+
|
36
|
+
context 'when headers exists' do
|
37
|
+
let(:dsl_data) { super().merge({ returns: returns }) }
|
38
|
+
let(:returns) { { status_code => [{}, nil, returns_dsl, nil] } }
|
39
|
+
|
40
|
+
let(:returns_dsl) do
|
41
|
+
proc do
|
42
|
+
header 'link', String, 'Relative links'
|
43
|
+
header 'Current-Page', Integer, 'The current page'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'returns the correct format headers' do
|
48
|
+
expect(headers).to eq({
|
49
|
+
'link' => {
|
50
|
+
description: 'Relative links',
|
51
|
+
type: 'string'
|
52
|
+
},
|
53
|
+
'Current-Page' => {
|
54
|
+
description: 'The current page',
|
55
|
+
type: 'integer'
|
56
|
+
}
|
57
|
+
})
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -118,7 +118,7 @@ describe Apipie::Generator::Swagger::ParamDescription::Builder do
|
|
118
118
|
{ required: false, default_value: nil }
|
119
119
|
end
|
120
120
|
|
121
|
-
it '
|
121
|
+
it 'does not warn' do
|
122
122
|
expect { subject }.not_to output(
|
123
123
|
/is optional but default value is not specified/
|
124
124
|
).to_stderr
|
@@ -130,7 +130,7 @@ describe Apipie::Generator::Swagger::ParamDescription::Builder do
|
|
130
130
|
{ required: false, default_value: 123 }
|
131
131
|
end
|
132
132
|
|
133
|
-
it '
|
133
|
+
it 'does not warn' do
|
134
134
|
expect { subject }.not_to output(
|
135
135
|
/is optional but default value is not specified/
|
136
136
|
).to_stderr
|
@@ -200,4 +200,16 @@ describe Apipie::Generator::Swagger::ParamDescription::Builder do
|
|
200
200
|
it { is_expected.to be_present }
|
201
201
|
end
|
202
202
|
end
|
203
|
+
|
204
|
+
describe 'example' do
|
205
|
+
subject { generated_block[:example] }
|
206
|
+
|
207
|
+
it { is_expected.to be_blank }
|
208
|
+
|
209
|
+
context 'when example is assigned' do
|
210
|
+
let(:base_param_description_options) { { example: 'example' } }
|
211
|
+
|
212
|
+
it { is_expected.to eq('example') }
|
213
|
+
end
|
214
|
+
end
|
203
215
|
end
|
@@ -115,10 +115,15 @@ describe Apipie::Generator::Swagger::ParamDescription::Type do
|
|
115
115
|
it 'returns the reference' do
|
116
116
|
expect(subject).to eq({ '$ref' => reference })
|
117
117
|
end
|
118
|
-
|
119
118
|
end
|
120
119
|
end
|
121
120
|
|
121
|
+
context 'of a Swagger type' do
|
122
|
+
let(:validator_options) { { of: Integer } }
|
123
|
+
|
124
|
+
it { is_expected.to eq({ type: 'integer' }) }
|
125
|
+
end
|
126
|
+
|
122
127
|
describe 'enum' do
|
123
128
|
subject { items[:enum] }
|
124
129
|
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Apipie::ResponseDescription::ResponseObject do
|
4
|
+
describe '#header' do
|
5
|
+
let(:response_object) { described_class.new(nil, nil, nil, nil) }
|
6
|
+
let(:name) { 'Current-Page' }
|
7
|
+
let(:description) { 'The current page in the pagination' }
|
8
|
+
|
9
|
+
before { response_object.header(name, String, description) }
|
10
|
+
|
11
|
+
it 'adds it to the headers' do
|
12
|
+
expect(response_object.headers).to(
|
13
|
+
contain_exactly({
|
14
|
+
name: name,
|
15
|
+
description: description,
|
16
|
+
validator: 'string',
|
17
|
+
options: {}
|
18
|
+
})
|
19
|
+
)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Apipie::ResponseDescription do
|
4
|
+
let(:resource_description) do
|
5
|
+
Apipie::ResourceDescription.new(PetsController, 'pets')
|
6
|
+
end
|
7
|
+
|
8
|
+
let(:method_description) do
|
9
|
+
Apipie::MethodDescription.new(
|
10
|
+
'create',
|
11
|
+
resource_description,
|
12
|
+
ActionController::Base.send(:_apipie_dsl_data_init)
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:response_description_dsl) { proc {} }
|
17
|
+
let(:options) { {} }
|
18
|
+
|
19
|
+
let(:response_description) do
|
20
|
+
described_class.new(
|
21
|
+
method_description,
|
22
|
+
204,
|
23
|
+
options,
|
24
|
+
PetsController,
|
25
|
+
response_description_dsl,
|
26
|
+
nil
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#to_json' do
|
31
|
+
let(:to_json) { response_description.to_json }
|
32
|
+
|
33
|
+
describe 'headers' do
|
34
|
+
subject(:headers) { to_json[:headers] }
|
35
|
+
|
36
|
+
it { is_expected.to be_blank }
|
37
|
+
|
38
|
+
context 'when response has headers' do
|
39
|
+
let(:response_description_dsl) do
|
40
|
+
proc do
|
41
|
+
header 'Current-Page', Integer, 'The current page in the pagination', required: true
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'returns the header' do
|
46
|
+
expect(headers).to contain_exactly({
|
47
|
+
name: 'Current-Page',
|
48
|
+
description: 'The current page in the pagination',
|
49
|
+
validator: 'integer',
|
50
|
+
options: { required: true }
|
51
|
+
})
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -7,7 +7,7 @@ describe Apipie::SwaggerGenerator do
|
|
7
7
|
|
8
8
|
let(:response_description_dsl) do
|
9
9
|
proc do
|
10
|
-
property :a_number, Integer
|
10
|
+
property :a_number, Integer, example: 1
|
11
11
|
property :an_optional_number, Integer, required: false
|
12
12
|
end
|
13
13
|
end
|
@@ -61,7 +61,7 @@ describe Apipie::SwaggerGenerator do
|
|
61
61
|
expect(properties).to eq(
|
62
62
|
{
|
63
63
|
a_number: {
|
64
|
-
type: 'number', required: true
|
64
|
+
type: 'number', required: true, example: 1
|
65
65
|
},
|
66
66
|
an_optional_number: {
|
67
67
|
type: 'number'
|
@@ -82,6 +82,10 @@ describe 'rake tasks' do
|
|
82
82
|
expect(param[field]).to eq(value)
|
83
83
|
end
|
84
84
|
|
85
|
+
def expect_response_params_def(http_method, path, response_code, param_name, field, value)
|
86
|
+
param = apidoc_swagger["paths"][path][http_method]["responses"][response_code.to_s]["schema"]["properties"][param_name]
|
87
|
+
expect(param[field]).to eq(value)
|
88
|
+
end
|
85
89
|
|
86
90
|
describe 'apipie:static_swagger_json[development,json,_tmp]' do
|
87
91
|
it "generates static swagger files for the default version of apipie docs" do
|
@@ -105,6 +109,7 @@ describe 'rake tasks' do
|
|
105
109
|
%w[finance operations sales marketing HR])
|
106
110
|
|
107
111
|
expect_tags_def("get", "/twitter_example/{id}/followers", %w[twitter_example following index search])
|
112
|
+
expect_response_params_def("get", "/pets/{id}/as_properties", 200, "pet_name", "example", "mypet")
|
108
113
|
end
|
109
114
|
|
110
115
|
it "generates a valid swagger file" do
|
@@ -146,7 +151,7 @@ describe 'rake tasks' do
|
|
146
151
|
|
147
152
|
describe 'apipie:did_swagger_change[development,form_data,_tmp]' do
|
148
153
|
it "keeps a reference file" do
|
149
|
-
expect(Pathname(ref_output).children.count).to eq(2)
|
154
|
+
expect(Pathname(ref_output).children.count).to eq(2) # one file for each language
|
150
155
|
end
|
151
156
|
end
|
152
157
|
end
|
@@ -283,7 +283,7 @@ describe "Swagger Responses" do
|
|
283
283
|
expect(schema).to have_field(:pet_id, 'number', {:description => 'id of pet'})
|
284
284
|
expect(schema).to have_field(:pet_name, 'string', {:description => 'Name of pet', :required => false})
|
285
285
|
expect(schema).to have_field(:animal_type, 'string', {:description => 'Type of pet', :enum => %w[dog cat iguana kangaroo]})
|
286
|
-
expect(schema).not_to have_field(:partial_match_allowed, 'boolean', {:required => false})
|
286
|
+
expect(schema).not_to have_field(:partial_match_allowed, 'boolean', {:required => false}) # rubocop:disable Capybara/NegationMatcher
|
287
287
|
end
|
288
288
|
|
289
289
|
it "creates a swagger definition with all input parameters" do
|
data/spec/spec_helper.rb
CHANGED
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: 1.
|
4
|
+
version: 1.4.0
|
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:
|
12
|
+
date: 2024-05-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: actionpack
|
@@ -215,7 +215,7 @@ files:
|
|
215
215
|
- MIT-LICENSE
|
216
216
|
- NOTICE
|
217
217
|
- PROPOSAL_FOR_RESPONSE_DESCRIPTIONS.md
|
218
|
-
- README.
|
218
|
+
- README.md
|
219
219
|
- Rakefile
|
220
220
|
- apipie-rails.gemspec
|
221
221
|
- app/controllers/apipie/apipies_controller.rb
|
@@ -419,6 +419,7 @@ files:
|
|
419
419
|
- spec/lib/apipie/generator/swagger/context_spec.rb
|
420
420
|
- spec/lib/apipie/generator/swagger/method_description/api_schema_service_spec.rb
|
421
421
|
- spec/lib/apipie/generator/swagger/method_description/response_schema_service_spec.rb
|
422
|
+
- spec/lib/apipie/generator/swagger/method_description/response_service_spec.rb
|
422
423
|
- spec/lib/apipie/generator/swagger/operation_id_spec.rb
|
423
424
|
- spec/lib/apipie/generator/swagger/param_description/builder_spec.rb
|
424
425
|
- spec/lib/apipie/generator/swagger/param_description/composite_spec.rb
|
@@ -442,6 +443,8 @@ files:
|
|
442
443
|
- spec/lib/apipie/param_description_spec.rb
|
443
444
|
- spec/lib/apipie/param_group_spec.rb
|
444
445
|
- spec/lib/apipie/resource_description_spec.rb
|
446
|
+
- spec/lib/apipie/response_description/response_object_spec.rb
|
447
|
+
- spec/lib/apipie/response_description_spec.rb
|
445
448
|
- spec/lib/apipie/response_does_not_match_swagger_schema_spec.rb
|
446
449
|
- spec/lib/apipie/swagger_generator_spec.rb
|
447
450
|
- spec/lib/apipie/validator_spec.rb
|
@@ -454,9 +457,12 @@ files:
|
|
454
457
|
- spec/support/custom_bool_validator.rb
|
455
458
|
- spec/support/rake.rb
|
456
459
|
- spec/test_engine/memes_controller_spec.rb
|
457
|
-
homepage:
|
460
|
+
homepage: https://github.com/Apipie/apipie-rails
|
458
461
|
licenses: []
|
459
|
-
metadata:
|
462
|
+
metadata:
|
463
|
+
bug_tracker_uri: https://github.com/Apipie/apipie-rails/issues
|
464
|
+
changelog_uri: https://github.com/Apipie/apipie-rails/blob/master/CHANGELOG.md
|
465
|
+
source_code_uri: https://github.com/Apipie/apipie-rails
|
460
466
|
post_install_message:
|
461
467
|
rdoc_options: []
|
462
468
|
require_paths:
|
@@ -472,7 +478,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
472
478
|
- !ruby/object:Gem::Version
|
473
479
|
version: '0'
|
474
480
|
requirements: []
|
475
|
-
rubygems_version: 3.
|
481
|
+
rubygems_version: 3.5.9
|
476
482
|
signing_key:
|
477
483
|
specification_version: 4
|
478
484
|
summary: Rails REST API documentation tool
|