apipie-rails 0.9.3 → 1.0.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/rubocop.yml +2 -2
- data/.rubocop.yml +23 -14
- data/.rubocop_todo.yml +103 -487
- data/CHANGELOG.md +20 -3
- data/README.rst +12 -12
- data/app/controllers/apipie/apipies_controller.rb +6 -6
- data/app/helpers/apipie_helper.rb +1 -1
- data/lib/apipie/apipie_module.rb +5 -5
- data/lib/apipie/application.rb +81 -55
- data/lib/apipie/configuration.rb +19 -26
- data/lib/apipie/dsl_definition.rb +8 -9
- data/lib/apipie/error_description.rb +1 -1
- data/lib/apipie/errors.rb +2 -16
- data/lib/apipie/extractor/collector.rb +3 -3
- data/lib/apipie/extractor/recorder.rb +1 -1
- data/lib/apipie/extractor.rb +2 -2
- data/lib/apipie/generator/config.rb +12 -0
- data/lib/apipie/generator/swagger/computed_interface_id.rb +23 -0
- data/lib/apipie/generator/swagger/config.rb +78 -0
- data/lib/apipie/generator/swagger/context.rb +12 -1
- data/lib/apipie/generator/swagger/method_description/api_decorator.rb +20 -0
- data/lib/apipie/generator/swagger/method_description/api_schema_service.rb +86 -0
- data/lib/apipie/generator/swagger/method_description/decorator.rb +22 -0
- data/lib/apipie/generator/swagger/method_description/parameters_service.rb +139 -0
- data/lib/apipie/generator/swagger/method_description/response_schema_service.rb +46 -0
- data/lib/apipie/generator/swagger/method_description/response_service.rb +58 -0
- data/lib/apipie/generator/swagger/method_description.rb +2 -0
- data/lib/apipie/generator/swagger/operation_id.rb +2 -2
- data/lib/apipie/generator/swagger/param_description/builder.rb +4 -4
- data/lib/apipie/generator/swagger/param_description/composite.rb +9 -1
- data/lib/apipie/generator/swagger/param_description/in.rb +1 -1
- data/lib/apipie/generator/swagger/param_description/path_params_composite.rb +61 -0
- data/lib/apipie/generator/swagger/param_description/referenced_composite.rb +36 -0
- data/lib/apipie/generator/swagger/param_description/type.rb +9 -2
- data/lib/apipie/generator/swagger/path_decorator.rb +36 -0
- data/lib/apipie/generator/swagger/referenced_definitions.rb +17 -0
- data/lib/apipie/generator/swagger/resource_description_collection.rb +30 -0
- data/lib/apipie/generator/swagger/resource_description_composite.rb +56 -0
- data/lib/apipie/generator/swagger/schema.rb +63 -0
- data/lib/apipie/generator/swagger/type_extractor.rb +0 -19
- data/lib/apipie/generator/swagger/warning.rb +3 -6
- data/lib/apipie/generator/swagger/warning_writer.rb +7 -1
- data/lib/apipie/helpers.rb +3 -3
- data/lib/apipie/method_description.rb +5 -3
- data/lib/apipie/param_description.rb +4 -2
- data/lib/apipie/resource_description.rb +11 -8
- data/lib/apipie/response_description.rb +1 -1
- data/lib/apipie/response_description_adapter.rb +3 -3
- data/lib/apipie/routing.rb +1 -1
- data/lib/apipie/rspec/response_validation_helper.rb +1 -1
- data/lib/apipie/swagger_generator.rb +27 -551
- data/lib/apipie/validator.rb +9 -5
- data/lib/apipie/version.rb +1 -1
- data/lib/apipie-rails.rb +17 -0
- data/lib/tasks/apipie.rake +25 -20
- data/spec/controllers/api/v2/nested/resources_controller_spec.rb +2 -2
- data/spec/controllers/pets_controller_spec.rb +10 -16
- data/spec/controllers/users_controller_spec.rb +2 -2
- data/spec/dummy/app/controllers/pets_controller.rb +4 -4
- data/spec/dummy/app/controllers/pets_using_self_describing_classes_controller.rb +2 -2
- data/spec/dummy/app/controllers/twitter_example_controller.rb +2 -2
- data/spec/dummy/app/controllers/users_controller.rb +5 -5
- data/spec/dummy/config.ru +1 -1
- data/spec/lib/apipie/apipies_controller_spec.rb +4 -0
- data/spec/lib/apipie/application_spec.rb +25 -15
- data/spec/lib/apipie/configuration_spec.rb +15 -0
- data/spec/lib/apipie/generator/swagger/config_spec.rb +19 -0
- data/spec/lib/apipie/generator/swagger/context_spec.rb +23 -2
- data/spec/lib/apipie/generator/swagger/method_description/api_schema_service_spec.rb +106 -0
- data/spec/lib/apipie/generator/swagger/method_description/response_schema_service_spec.rb +105 -0
- data/spec/lib/apipie/generator/swagger/param_description/builder_spec.rb +1 -1
- data/spec/lib/apipie/generator/swagger/param_description/composite_spec.rb +2 -2
- data/spec/lib/apipie/generator/swagger/param_description/type_spec.rb +7 -7
- data/spec/lib/apipie/generator/swagger/path_decorator_spec.rb +57 -0
- data/spec/lib/apipie/generator/swagger/referenced_definitions_spec.rb +35 -0
- data/spec/lib/apipie/generator/swagger/resource_description_composite_spec.rb +37 -0
- data/spec/lib/apipie/generator/swagger/resource_descriptions_collection_spec.rb +57 -0
- data/spec/lib/apipie/generator/swagger/schema_spec.rb +89 -0
- data/spec/lib/apipie/generator/swagger/type_extractor_spec.rb +0 -43
- data/spec/lib/apipie/generator/swagger/warning_spec.rb +1 -1
- data/spec/lib/apipie/generator/swagger/warning_writer_spec.rb +19 -7
- data/spec/lib/apipie/method_description_spec.rb +101 -66
- data/spec/lib/apipie/no_documented_method_spec.rb +17 -0
- data/spec/lib/apipie/param_description_spec.rb +209 -49
- data/spec/lib/apipie/param_group_spec.rb +1 -0
- data/spec/lib/apipie/resource_description_spec.rb +71 -28
- data/spec/lib/apipie/response_does_not_match_swagger_schema_spec.rb +35 -0
- data/spec/lib/apipie/swagger_generator_spec.rb +94 -0
- data/spec/lib/apipie/validator_spec.rb +47 -11
- data/spec/lib/rake_spec.rb +1 -1
- data/spec/lib/swagger/rake_swagger_spec.rb +6 -6
- data/spec/lib/swagger/swagger_dsl_spec.rb +17 -11
- data/spec/lib/validators/array_validator_spec.rb +1 -1
- data/spec/spec_helper.rb +2 -2
- metadata +31 -3
data/lib/tasks/apipie.rake
CHANGED
@@ -20,7 +20,7 @@ namespace :apipie do
|
|
20
20
|
task :static, [:version] => :environment do |t, args|
|
21
21
|
with_loaded_documentation do
|
22
22
|
args.with_defaults(:version => Apipie.configuration.default_version)
|
23
|
-
out = ENV["OUT"] || File.join(
|
23
|
+
out = ENV["OUT"] || File.join(Rails.root, Apipie.configuration.doc_path, 'apidoc')
|
24
24
|
subdir = File.basename(out)
|
25
25
|
copy_jscss(out)
|
26
26
|
Apipie.configuration.version_in_url = false
|
@@ -44,7 +44,7 @@ namespace :apipie do
|
|
44
44
|
task :static_json, [:version] => :environment do |t, args|
|
45
45
|
with_loaded_documentation do
|
46
46
|
args.with_defaults(:version => Apipie.configuration.default_version)
|
47
|
-
out = ENV["OUT"] || File.join(
|
47
|
+
out = ENV["OUT"] || File.join(Rails.root, Apipie.configuration.doc_path, 'apidoc')
|
48
48
|
([nil] + Apipie.configuration.languages).each do |lang|
|
49
49
|
doc = Apipie.to_json(args[:version], nil, nil, lang)
|
50
50
|
generate_json_page(out, doc, lang)
|
@@ -55,7 +55,7 @@ namespace :apipie do
|
|
55
55
|
desc "Generate static swagger json"
|
56
56
|
task :static_swagger_json, [:version, :swagger_content_type_input, :filename_suffix] => :environment do |t, args|
|
57
57
|
with_loaded_documentation do
|
58
|
-
out = ENV["OUT"] || File.join(
|
58
|
+
out = ENV["OUT"] || File.join(Rails.root, Apipie.configuration.doc_path, 'apidoc')
|
59
59
|
generate_swagger_using_args(args, out)
|
60
60
|
end
|
61
61
|
end
|
@@ -68,7 +68,7 @@ namespace :apipie do
|
|
68
68
|
desc "Did swagger output change since the last execution of this task?"
|
69
69
|
task :did_swagger_change, [:version, :swagger_content_type_input, :filename_suffix] => :environment do |t, args|
|
70
70
|
with_loaded_documentation do
|
71
|
-
out = ENV["OUT_REF"] || File.join(
|
71
|
+
out = ENV["OUT_REF"] || File.join(Rails.root, Apipie.configuration.doc_path, 'apidoc_ref')
|
72
72
|
paths = generate_swagger_using_args(args, out)
|
73
73
|
paths.each {|path|
|
74
74
|
existing_files_in_dir = Pathname(out).children(true)
|
@@ -123,17 +123,17 @@ namespace :apipie do
|
|
123
123
|
# Default output dir ('public/apipie_cache') can be changed with OUT=/some/dir
|
124
124
|
desc "Generate cache to avoid production dependencies on markup languages"
|
125
125
|
task :cache => :environment do
|
126
|
-
puts "#{Time.now} | Started"
|
126
|
+
puts "#{Time.zone.now} | Started"
|
127
127
|
cache_part = ENV['cache_part']
|
128
128
|
generate_index = (cache_part == 'resources' ? false : true)
|
129
129
|
generate_resources = (cache_part == 'index' ? false : true)
|
130
130
|
with_loaded_documentation do
|
131
|
-
puts "#{Time.now} | Documents loaded..."
|
131
|
+
puts "#{Time.zone.now} | Documents loaded..."
|
132
132
|
([nil] + Apipie.configuration.languages).each do |lang|
|
133
133
|
I18n.locale = lang || Apipie.configuration.default_locale
|
134
|
-
puts "#{Time.now} | Processing docs for #{lang}"
|
134
|
+
puts "#{Time.zone.now} | Processing docs for #{lang}"
|
135
135
|
cache_dir = ENV["OUT"] || Apipie.configuration.cache_dir
|
136
|
-
subdir = Apipie.configuration.doc_base_url.sub(
|
136
|
+
subdir = Apipie.configuration.doc_base_url.sub(%r{\A/},"")
|
137
137
|
subdir_levels = subdir.split('/').length
|
138
138
|
subdir_traversal_prefix = '../' * subdir_levels
|
139
139
|
file_base = File.join(cache_dir, Apipie.configuration.doc_base_url)
|
@@ -159,7 +159,7 @@ namespace :apipie do
|
|
159
159
|
end
|
160
160
|
end
|
161
161
|
end
|
162
|
-
puts "#{Time.now} | Finished"
|
162
|
+
puts "#{Time.zone.now} | Finished"
|
163
163
|
end
|
164
164
|
|
165
165
|
# Attempt to use the Rails application views, otherwise default to built in views
|
@@ -195,10 +195,15 @@ namespace :apipie do
|
|
195
195
|
end
|
196
196
|
|
197
197
|
def generate_swagger_using_args(args, out)
|
198
|
-
args.with_defaults(
|
199
|
-
|
200
|
-
|
201
|
-
|
198
|
+
args.with_defaults(
|
199
|
+
version: Apipie.configuration.default_version,
|
200
|
+
swagger_content_type_input: Apipie.configuration.generator.swagger.content_type_input,
|
201
|
+
filename_suffix: nil
|
202
|
+
)
|
203
|
+
|
204
|
+
Apipie.configuration.generator.swagger.content_type_input =
|
205
|
+
args[:swagger_content_type_input].to_sym
|
206
|
+
|
202
207
|
count = 0
|
203
208
|
|
204
209
|
sfx = args[:filename_suffix] || "_#{args[:swagger_content_type_input]}"
|
@@ -221,7 +226,7 @@ namespace :apipie do
|
|
221
226
|
File.open("#{file_base}/#{filename}", 'w') { |file| file.write(JSON.pretty_generate(doc)) }
|
222
227
|
end
|
223
228
|
|
224
|
-
def generate_swagger_json_page(file_base, doc, sfx="", lang = nil)
|
229
|
+
def generate_swagger_json_page(file_base, doc, sfx = "", lang = nil)
|
225
230
|
FileUtils.mkdir_p(file_base) unless File.exist?(file_base)
|
226
231
|
|
227
232
|
path = Pathname.new("#{file_base}/schema_swagger#{sfx}#{lang_ext(lang)}.json")
|
@@ -254,11 +259,11 @@ namespace :apipie do
|
|
254
259
|
end
|
255
260
|
|
256
261
|
def generate_resource_pages(version, file_base, doc, include_json = false, lang = nil)
|
257
|
-
doc[:docs][:resources].each do |
|
258
|
-
resource_file_base = File.join(file_base,
|
262
|
+
doc[:docs][:resources].each do |resource_id, _|
|
263
|
+
resource_file_base = File.join(file_base, resource_id.to_s)
|
259
264
|
FileUtils.mkdir_p(File.dirname(resource_file_base)) unless File.exist?(File.dirname(resource_file_base))
|
260
265
|
|
261
|
-
doc = Apipie.to_json(version,
|
266
|
+
doc = Apipie.to_json(version, resource_id, nil, lang)
|
262
267
|
doc[:docs][:link_extension] = (lang ? ".#{lang}.html" : ".html")
|
263
268
|
render_page("#{resource_file_base}#{lang_ext(lang)}.html", "resource", {:doc => doc[:docs],
|
264
269
|
:resource => doc[:docs][:resources].first, :language => lang, :languages => Apipie.configuration.languages})
|
@@ -267,12 +272,12 @@ namespace :apipie do
|
|
267
272
|
end
|
268
273
|
|
269
274
|
def generate_method_pages(version, file_base, doc, include_json = false, lang = nil)
|
270
|
-
doc[:docs][:resources].each do |
|
275
|
+
doc[:docs][:resources].each do |resource_id, resource_params|
|
271
276
|
resource_params[:methods].each do |method|
|
272
|
-
method_file_base = File.join(file_base,
|
277
|
+
method_file_base = File.join(file_base, resource_id.to_s, method[:name].to_s)
|
273
278
|
FileUtils.mkdir_p(File.dirname(method_file_base)) unless File.exist?(File.dirname(method_file_base))
|
274
279
|
|
275
|
-
doc = Apipie.to_json(version,
|
280
|
+
doc = Apipie.to_json(version, resource_id, method[:name], lang)
|
276
281
|
doc[:docs][:link_extension] = (lang ? ".#{lang}.html" : ".html")
|
277
282
|
render_page("#{method_file_base}#{lang_ext(lang)}.html", "method", {:doc => doc[:docs],
|
278
283
|
:resource => doc[:docs][:resources].first,
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Api::V2::Nested::ResourcesController do
|
4
|
-
describe
|
5
|
-
subject { Apipie.
|
4
|
+
describe '.get_resource_id' do
|
5
|
+
subject { Apipie.get_resource_id(Api::V2::Nested::ResourcesController) }
|
6
6
|
|
7
7
|
it "should have resource_id set" do
|
8
8
|
expect(subject).to eq("resource")
|
@@ -5,10 +5,6 @@ require 'apipie/rspec/response_validation_helper'
|
|
5
5
|
require "json-schema"
|
6
6
|
|
7
7
|
RSpec.describe PetsController, :type => :controller do
|
8
|
-
before :each do
|
9
|
-
Apipie.configuration.swagger_allow_additional_properties_in_response = false
|
10
|
-
end
|
11
|
-
|
12
8
|
it "does not raise error when rendered output matches the described response" do
|
13
9
|
response = get :return_and_validate_expected_response, format: :json
|
14
10
|
expect(response).to match_declared_responses
|
@@ -39,7 +35,7 @@ RSpec.describe PetsController, :type => :controller do
|
|
39
35
|
expect(response).not_to match_declared_responses
|
40
36
|
end
|
41
37
|
|
42
|
-
it "raises error when a response has an extra property and '
|
38
|
+
it "raises error when a response has an extra property and 'swagger.allow_additional_properties_in_response' is false" do
|
43
39
|
response = get :return_and_validate_extra_property, format: :json
|
44
40
|
expect(response).not_to match_declared_responses
|
45
41
|
end
|
@@ -50,26 +46,28 @@ RSpec.describe PetsController, :type => :controller do
|
|
50
46
|
expect(response).not_to match_declared_responses
|
51
47
|
end
|
52
48
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
49
|
+
context "when allow_additional_properties_in_response is true'" do
|
50
|
+
before do
|
51
|
+
Apipie.configuration.generator.swagger.allow_additional_properties_in_response = true
|
52
|
+
end
|
53
|
+
|
54
|
+
it "does not raise error when a response has an extra property" do
|
55
|
+
response = get :return_and_validate_extra_property, format: :json
|
56
|
+
expect(response).to match_declared_responses
|
57
|
+
end
|
57
58
|
end
|
58
59
|
|
59
60
|
it "does not raise error when a response has an extra field and 'additional_properties' is specified in the response" do
|
60
|
-
Apipie.configuration.swagger_allow_additional_properties_in_response = false
|
61
61
|
response = get :return_and_validate_allowed_extra_property, format: :json
|
62
62
|
expect(response).to match_declared_responses
|
63
63
|
end
|
64
64
|
|
65
65
|
it "raises error when a response sub-object has an extra field and 'additional_properties' is not specified on it, but specified on the top level of the response" do
|
66
|
-
Apipie.configuration.swagger_allow_additional_properties_in_response = false
|
67
66
|
response = get :sub_object_invalid_extra_property, format: :json
|
68
67
|
expect(response).not_to match_declared_responses
|
69
68
|
end
|
70
69
|
|
71
70
|
it "does not raise error when a response sub-object has an extra field and 'additional_properties' is specified on it" do
|
72
|
-
Apipie.configuration.swagger_allow_additional_properties_in_response = false
|
73
71
|
response = get :sub_object_allowed_extra_property, format: :json
|
74
72
|
expect(response).to match_declared_responses
|
75
73
|
end
|
@@ -86,7 +84,6 @@ RSpec.describe PetsController, :type => :controller do
|
|
86
84
|
|
87
85
|
end
|
88
86
|
|
89
|
-
|
90
87
|
describe "with array field" do
|
91
88
|
it "no error for valid response" do
|
92
89
|
response = get :returns_response_with_valid_array, format: :json
|
@@ -98,7 +95,4 @@ RSpec.describe PetsController, :type => :controller do
|
|
98
95
|
expect(response).not_to match_declared_responses
|
99
96
|
end
|
100
97
|
end
|
101
|
-
|
102
|
-
|
103
|
-
|
104
98
|
end
|
@@ -412,7 +412,7 @@ describe UsersController do
|
|
412
412
|
expect(b.resource._id).to eq('users')
|
413
413
|
|
414
414
|
expect(b.apis.count).to eq(1)
|
415
|
-
expect(b.formats).to eq([
|
415
|
+
expect(b.formats).to eq(%w[json jsonp])
|
416
416
|
api = b.apis.first
|
417
417
|
expect(api.short_description).to eq("Show user profile")
|
418
418
|
expect(api.path).to eq("/users/:id")
|
@@ -708,7 +708,7 @@ EOS2
|
|
708
708
|
param = a.params[:array_param]
|
709
709
|
expect(param.desc).to eq("\n<p>array validator</p>\n")
|
710
710
|
expect(param.validator.class).to be(Apipie::Validator::EnumValidator)
|
711
|
-
expect(param.validator.instance_variable_get("@array")).to eq([
|
711
|
+
expect(param.validator.instance_variable_get("@array")).to eq(%w[100 one two 1 2])
|
712
712
|
|
713
713
|
param = a.params[:proc_param]
|
714
714
|
expect(param.desc).to eq("\n<p>proc validator</p>\n")
|
@@ -24,7 +24,7 @@ class PetsController < ApplicationController
|
|
24
24
|
api :GET, "/pets/:id/as_properties", "Get a pet record"
|
25
25
|
returns :code => 200 do
|
26
26
|
property :pet_name, String, :desc => "Name of pet", :required => false
|
27
|
-
property :animal_type, [
|
27
|
+
property :animal_type, %w[dog cat iguana kangaroo], :desc => "Type of pet" # required by default, because this is a 'property'
|
28
28
|
end
|
29
29
|
returns :code => 404 do
|
30
30
|
property :another_error_message, String, :desc => "Overriding the response description from the Pets resource"
|
@@ -40,7 +40,7 @@ class PetsController < ApplicationController
|
|
40
40
|
#-----------------------------------------------------------
|
41
41
|
def_param_group :pet do
|
42
42
|
property :pet_name, String, :desc => "Name of pet", :required => false
|
43
|
-
property :animal_type, [
|
43
|
+
property :animal_type, %w[dog cat iguana kangaroo], :desc => "Type of pet" # required by default, because this is a 'property'
|
44
44
|
end
|
45
45
|
|
46
46
|
api :GET, "/pets/:id/as_param_group_of_properties", "Get a pet record"
|
@@ -70,7 +70,7 @@ class PetsController < ApplicationController
|
|
70
70
|
param :pet_id, Integer, :desc => "id of pet", :required => true
|
71
71
|
param :pet_name, String, :desc => "Name of pet", :required => false, :only_in => :response
|
72
72
|
param :partial_match_allowed, [true, false], :desc => "Partial match allowed?", :required => false, :only_in => :request
|
73
|
-
property :animal_type, [
|
73
|
+
property :animal_type, %w[dog cat iguana kangaroo], :desc => "Type of pet" # this is implicitly :only_in => :response
|
74
74
|
end
|
75
75
|
|
76
76
|
api :GET, "/pets/pet_by_id", "Get a pet record with the pet id in the body of the request"
|
@@ -142,7 +142,7 @@ class PetsController < ApplicationController
|
|
142
142
|
end
|
143
143
|
returns :code => 204 do
|
144
144
|
property :int_array, :array_of => Integer
|
145
|
-
property :enum_array, :array_of => [
|
145
|
+
property :enum_array, :array_of => %w[v1 v2 v3]
|
146
146
|
end
|
147
147
|
returns :code => :unprocessable_entity, :desc => "Fleas were discovered on the pet" do
|
148
148
|
param_group :pet
|
@@ -14,7 +14,7 @@ class Pet
|
|
14
14
|
def self.describe_own_properties
|
15
15
|
[
|
16
16
|
Apipie::prop(:pet_name, 'string', {:description => 'Name of pet', :required => false}),
|
17
|
-
Apipie::prop(:animal_type, 'string', {:description => 'Type of pet', :values => [
|
17
|
+
Apipie::prop(:animal_type, 'string', {:description => 'Type of pet', :values => %w[dog cat iguana kangaroo]}),
|
18
18
|
Apipie::additional_properties(false)
|
19
19
|
]
|
20
20
|
end
|
@@ -27,7 +27,7 @@ class PetWithMeasurements
|
|
27
27
|
def self.describe_own_properties
|
28
28
|
[
|
29
29
|
Apipie::prop(:pet_name, 'string', {:description => 'Name of pet', :required => false}),
|
30
|
-
Apipie::prop('animal_type', 'string', {:description => 'Type of pet', :values => [
|
30
|
+
Apipie::prop('animal_type', 'string', {:description => 'Type of pet', :values => %w[dog cat iguana kangaroo]}),
|
31
31
|
Apipie::prop(:pet_measurements, 'object', {}, [
|
32
32
|
Apipie::prop(:weight, 'number', {:description => "Weight in pounds" }),
|
33
33
|
Apipie::prop(:height, 'number', {:description => "Height in inches" }),
|
@@ -31,7 +31,7 @@ class TwitterExampleController < ApplicationController
|
|
31
31
|
|
32
32
|
api :GET, '/twitter_example/profile_image/:screen_name', 'Access the profile image in various sizes for the user with the indicated screen_name.'
|
33
33
|
param :screen_name, String, :required => true, :desc => 'The screen name of the user for whom to return results for. Helpful for disambiguating when a valid screen name is also a user ID.'
|
34
|
-
param :size, [
|
34
|
+
param :size, %w[bigger normal mini original], :desc => <<-EOS
|
35
35
|
Specifies the size of image to fetch. Not specifying a size will give the default, normal size of 48px by 48px. Valid options include:
|
36
36
|
|
37
37
|
* bigger - 73px by 73px
|
@@ -166,7 +166,7 @@ class TwitterExampleController < ApplicationController
|
|
166
166
|
param :user_id, Integer, :desc => 'The ID of the user for whom to return results for. Helpful for disambiguating when a valid user ID is also a valid screen name.'
|
167
167
|
param :screen_name, String, :desc => 'The screen name of the user for whom to return results for. Helpful for disambiguating when a valid screen name is also a user ID.'
|
168
168
|
param :include_entities, String
|
169
|
-
param :skip_status, [
|
169
|
+
param :skip_status, %w[t true 1],
|
170
170
|
:description => 'When set to either true, t or 1 statuses will not be included in the returned user objects.'
|
171
171
|
|
172
172
|
description "Look at examples."
|
@@ -170,14 +170,14 @@ class UsersController < ApplicationController
|
|
170
170
|
eos
|
171
171
|
api :GET, "/users/:id", "Show user profile"
|
172
172
|
show false
|
173
|
-
formats [
|
173
|
+
formats %w[json jsonp]
|
174
174
|
error 401, "Unauthorized"
|
175
175
|
error :code => 404, :description => "Not Found"
|
176
176
|
param :id, Integer, :desc => "user id", :required => true
|
177
177
|
param :session, String, :desc => "user is logged in", :required => true, :missing_message => lambda { "session_parameter_is_required" }
|
178
178
|
param :regexp_param, /^[0-9]* years/, :desc => "regexp param"
|
179
179
|
param :regexp2, /\b[A-Z0-9._%+-=]+@[A-Z0-9.-]+.[A-Z]{2,}\b/i, :desc => "email regexp"
|
180
|
-
param :array_param, [
|
180
|
+
param :array_param, %w[100 one two 1 2], :desc => "array validator"
|
181
181
|
param :boolean_param, [true, false], :desc => "array validator with boolean"
|
182
182
|
param :proc_param, lambda { |val|
|
183
183
|
val == "param value" ? true : "The only good value is 'param value'."
|
@@ -211,7 +211,7 @@ class UsersController < ApplicationController
|
|
211
211
|
def_param_group :user do
|
212
212
|
param :user, Hash, :desc => "User info", :required => true, :action_aware => true do
|
213
213
|
param_group :credentials
|
214
|
-
param :membership, [
|
214
|
+
param :membership, %w[standard premium], :desc => "User membership", :allow_nil => false
|
215
215
|
end
|
216
216
|
end
|
217
217
|
|
@@ -269,13 +269,13 @@ class UsersController < ApplicationController
|
|
269
269
|
end
|
270
270
|
|
271
271
|
api :GET, '/users/by_department', 'show users from a specific department'
|
272
|
-
param :department, [
|
272
|
+
param :department, %w[finance operations sales marketing HR], required: false, default_value: "sales"
|
273
273
|
def get_by_department
|
274
274
|
render :plain => 'nothing to see here'
|
275
275
|
end
|
276
276
|
|
277
277
|
api :GET, '/users/in_departments', 'show users from specific departments'
|
278
|
-
param :departments, Array, in: [
|
278
|
+
param :departments, Array, in: %w[finance operations sales marketing HR], default_value: ['sales']
|
279
279
|
def get_in_departments
|
280
280
|
render :plain => 'nothing to see here'
|
281
281
|
end
|
data/spec/dummy/config.ru
CHANGED
@@ -209,6 +209,7 @@ describe Apipie::ApipiesController, type: :controller do
|
|
209
209
|
get :index
|
210
210
|
expect(test).to eq(true)
|
211
211
|
end
|
212
|
+
|
212
213
|
it "remove all resources" do
|
213
214
|
Apipie.configuration.authorize = Proc.new do |&args|
|
214
215
|
false
|
@@ -216,6 +217,7 @@ describe Apipie::ApipiesController, type: :controller do
|
|
216
217
|
get :index
|
217
218
|
expect(assigns(:doc)[:resources]).to eq({})
|
218
219
|
end
|
220
|
+
|
219
221
|
it "remove all methods" do
|
220
222
|
Apipie.configuration.authorize = Proc.new do |controller, method, doc|
|
221
223
|
!method
|
@@ -225,6 +227,7 @@ describe Apipie::ApipiesController, type: :controller do
|
|
225
227
|
expect(assigns(:doc)[:resources]["twitter_example"][:methods]).to eq([])
|
226
228
|
expect(assigns(:doc)[:resources]["users"][:methods]).to eq([])
|
227
229
|
end
|
230
|
+
|
228
231
|
it "remove specific method" do
|
229
232
|
Apipie.configuration.authorize = nil
|
230
233
|
get :index
|
@@ -241,6 +244,7 @@ describe Apipie::ApipiesController, type: :controller do
|
|
241
244
|
expect(assigns(:doc)[:resources]["users"][:methods].size).to eq(users_methods - 1)
|
242
245
|
expect(assigns(:doc)[:resources]["twitter_example"][:methods].size).to eq(twitter_example_methods)
|
243
246
|
end
|
247
|
+
|
244
248
|
it "does not allow access to swagger when authorization is set" do
|
245
249
|
get :index, :params => { :format => "json", :type => "swagger"}
|
246
250
|
|
@@ -16,37 +16,47 @@ describe Apipie::Application do
|
|
16
16
|
|
17
17
|
end
|
18
18
|
|
19
|
-
|
20
|
-
|
19
|
+
shared_examples 'resource id' do
|
20
|
+
let(:resource_class) { Api::V2::Nested::ArchitecturesController }
|
21
|
+
let(:base_url) { '/some-api' }
|
22
|
+
|
23
|
+
before { allow(described_class).to receive(:get_base_url).and_return(base_url) }
|
21
24
|
|
22
25
|
context "with namespaced_resources enabled" do
|
23
26
|
before { Apipie.configuration.namespaced_resources = true }
|
24
|
-
|
25
|
-
|
26
|
-
it "should not overwrite the parent resource" do
|
27
|
-
is_expected.not_to eq(Apipie.get_resource_name(Api::V2::ArchitecturesController))
|
28
|
-
end
|
27
|
+
after { Apipie.configuration.namespaced_resources = false }
|
29
28
|
|
29
|
+
it "returns the namespaces" do
|
30
|
+
is_expected.to eq('api-v2-nested-architectures')
|
30
31
|
end
|
31
32
|
|
32
33
|
context "with an undefined base url" do
|
33
|
-
|
34
|
+
let(:base_url) { nil }
|
34
35
|
|
35
36
|
it "should not raise an error" do
|
36
|
-
expect {
|
37
|
-
not_to raise_error
|
37
|
+
expect { method_call }.not_to raise_error
|
38
38
|
end
|
39
39
|
end
|
40
|
-
|
41
|
-
after { Apipie.configuration.namespaced_resources = false }
|
42
40
|
end
|
43
41
|
|
44
|
-
context "with namespaced_resources
|
42
|
+
context "with namespaced_resources disabled" do
|
45
43
|
before { Apipie.configuration.namespaced_resources = false }
|
46
44
|
|
47
|
-
it "
|
48
|
-
is_expected.to eq(
|
45
|
+
it "returns the controller name" do
|
46
|
+
is_expected.to eq('architectures')
|
49
47
|
end
|
50
48
|
end
|
51
49
|
end
|
50
|
+
|
51
|
+
describe '.get_resource_id' do
|
52
|
+
subject(:method_call) { Apipie.get_resource_id(resource_class) }
|
53
|
+
|
54
|
+
it_behaves_like 'resource id'
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '.get_resource_name' do
|
58
|
+
subject(:method_call) { Apipie.get_resource_name(resource_class) }
|
59
|
+
|
60
|
+
it_behaves_like 'resource id'
|
61
|
+
end
|
52
62
|
end
|
@@ -20,4 +20,19 @@ describe 'Apipie::Configuration' do
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
23
|
+
|
24
|
+
describe 'generator configuration' do
|
25
|
+
let(:generator_config) { configuration.generator }
|
26
|
+
|
27
|
+
describe '#swagger' do
|
28
|
+
subject(:setter) { generator_config.swagger.include_warning_tags = true }
|
29
|
+
|
30
|
+
it 'assigns the correct value' do
|
31
|
+
expect { setter }
|
32
|
+
.to change(configuration.generator.swagger, :include_warning_tags?)
|
33
|
+
.from(false)
|
34
|
+
.to(true)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
23
38
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Apipie::Generator::Swagger::Config do
|
4
|
+
let(:config) { described_class.clone.instance }
|
5
|
+
|
6
|
+
before { Singleton.__init__(described_class) }
|
7
|
+
|
8
|
+
describe 'deprecation warnings' do
|
9
|
+
context 'when a deprecated method is call' do
|
10
|
+
subject(:deprecated_method_call) { config.swagger_include_warning_tags? }
|
11
|
+
|
12
|
+
it 'returns a deprecations warning' do
|
13
|
+
expect { deprecated_method_call }
|
14
|
+
.to output(/DEPRECATION WARNING: config.swagger_include_warning_tags is deprecated/)
|
15
|
+
.to_stderr
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -4,18 +4,23 @@ describe Apipie::Generator::Swagger::Context do
|
|
4
4
|
let(:allow_null) { true }
|
5
5
|
let(:in_schema) { true }
|
6
6
|
let(:http_method) { 'get' }
|
7
|
+
let(:prefix) { nil }
|
7
8
|
|
8
|
-
|
9
|
+
let(:context_instance) do
|
9
10
|
described_class.new(
|
10
11
|
allow_null: allow_null,
|
11
12
|
http_method: http_method,
|
12
13
|
in_schema: in_schema,
|
13
|
-
controller_method: 'show'
|
14
|
+
controller_method: 'show',
|
15
|
+
prefix: prefix
|
14
16
|
)
|
15
17
|
end
|
16
18
|
|
17
19
|
describe '#in_schema?' do
|
20
|
+
subject { context_instance }
|
21
|
+
|
18
22
|
it { is_expected.to be_in_schema }
|
23
|
+
|
19
24
|
context 'when in_schema is false' do
|
20
25
|
let(:in_schema) { false }
|
21
26
|
|
@@ -24,6 +29,8 @@ describe Apipie::Generator::Swagger::Context do
|
|
24
29
|
end
|
25
30
|
|
26
31
|
describe '#allow_null?' do
|
32
|
+
subject { context_instance }
|
33
|
+
|
27
34
|
it { is_expected.to be_allow_null }
|
28
35
|
|
29
36
|
context 'when allow_null is false' do
|
@@ -32,4 +39,18 @@ describe Apipie::Generator::Swagger::Context do
|
|
32
39
|
it { is_expected.not_to be_allow_null }
|
33
40
|
end
|
34
41
|
end
|
42
|
+
|
43
|
+
describe '#add_to_prefix!' do
|
44
|
+
before { context_instance.add_to_prefix!('some-prefix') }
|
45
|
+
|
46
|
+
subject { context_instance.prefix }
|
47
|
+
|
48
|
+
it { is_expected.to eq('some-prefix') }
|
49
|
+
|
50
|
+
context 'when context has already a prefix' do
|
51
|
+
let(:prefix) { 'existing-prefix' }
|
52
|
+
|
53
|
+
it { is_expected.to eq('existing-prefix[some-prefix]') }
|
54
|
+
end
|
55
|
+
end
|
35
56
|
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Apipie::Generator::Swagger::MethodDescription::ApiSchemaService do
|
4
|
+
let(:path) { '/api' }
|
5
|
+
let(:http_method) { 'get' }
|
6
|
+
let(:resource_id) { 'users' }
|
7
|
+
let(:method_description_description) { nil }
|
8
|
+
let(:tags) { [] }
|
9
|
+
|
10
|
+
let(:dsl_data) do
|
11
|
+
ActionController::Base
|
12
|
+
.send(:_apipie_dsl_data_init)
|
13
|
+
.merge(
|
14
|
+
{
|
15
|
+
description: method_description_description,
|
16
|
+
api_args: [[http_method, path, 'Some api description', { deprecated: true }]],
|
17
|
+
tag_list: tags
|
18
|
+
}
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
let(:resource_desc) do
|
23
|
+
Apipie::ResourceDescription.new(UsersController, resource_id)
|
24
|
+
end
|
25
|
+
|
26
|
+
let(:method_description) do
|
27
|
+
Apipie::Generator::Swagger::MethodDescription::Decorator.new(
|
28
|
+
Apipie::MethodDescription.new(:show, resource_desc, dsl_data)
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
let(:service) { described_class.new(method_description) }
|
33
|
+
|
34
|
+
describe '#call' do
|
35
|
+
subject(:schema) { service.call }
|
36
|
+
|
37
|
+
it 'returns the path' do
|
38
|
+
expect(schema).to include(path)
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'returns the http method' do
|
42
|
+
expect(schema[path]).to include(http_method)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'returns the correct attributes' do
|
46
|
+
expect(schema[path][http_method].keys).to include(
|
47
|
+
:tags,
|
48
|
+
:consumes,
|
49
|
+
:operationId,
|
50
|
+
:parameters,
|
51
|
+
:responses
|
52
|
+
)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe 'tags' do
|
57
|
+
subject { service.call[path][http_method][:tags] }
|
58
|
+
|
59
|
+
it { is_expected.to eq([resource_id]) }
|
60
|
+
|
61
|
+
context 'when tags are available' do
|
62
|
+
let(:tags) { ['Tag 1', 'Tag 2'] }
|
63
|
+
|
64
|
+
it { is_expected.to include(*tags) }
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'when Apipie.configuration.generator.swagger.include_warning_tags is enabled' do
|
68
|
+
before { Apipie.configuration.generator.swagger.include_warning_tags = true }
|
69
|
+
|
70
|
+
context 'when warnings are issued' do
|
71
|
+
before do
|
72
|
+
Apipie::Generator::Swagger::Warning.for_code(
|
73
|
+
Apipie::Generator::Swagger::Warning::MISSING_METHOD_SUMMARY_CODE,
|
74
|
+
'some_method'
|
75
|
+
).warn_through_writer
|
76
|
+
end
|
77
|
+
|
78
|
+
it { is_expected.to include('warnings issued') }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe 'consumes' do
|
84
|
+
subject { service.call[path]['get'][:consumes] }
|
85
|
+
|
86
|
+
it { is_expected.to eq(['application/x-www-form-urlencoded', 'multipart/form-data']) }
|
87
|
+
|
88
|
+
context 'when content type input is json' do
|
89
|
+
before { Apipie.configuration.generator.swagger.content_type_input = :json }
|
90
|
+
|
91
|
+
it { is_expected.to eq(['application/json']) }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe 'description' do
|
96
|
+
subject { service.call[path]['get'][:description] }
|
97
|
+
|
98
|
+
it { is_expected.to be_blank }
|
99
|
+
|
100
|
+
context 'when description for method description exists' do
|
101
|
+
let(:method_description_description) { 'Some description' }
|
102
|
+
|
103
|
+
it { is_expected.to eq(method_description_description) }
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|