apipie-rails 0.8.2 → 0.9.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-challenger.yml +28 -0
- data/.rubocop.yml +37 -0
- data/.rubocop_todo.yml +2001 -0
- data/CHANGELOG.md +14 -0
- data/README.rst +2 -2
- data/Rakefile +0 -5
- data/apipie-rails.gemspec +10 -7
- data/lib/apipie/dsl_definition.rb +3 -3
- data/lib/apipie/extractor/writer.rb +2 -2
- data/lib/apipie/generator/generator.rb +2 -0
- data/lib/apipie/generator/swagger/swagger.rb +2 -0
- data/lib/apipie/generator/swagger/type.rb +16 -0
- data/lib/apipie/generator/swagger/type_extractor.rb +70 -0
- data/lib/apipie/generator/swagger/warning.rb +77 -0
- data/lib/apipie/generator/swagger/warning_writer.rb +48 -0
- data/lib/apipie/method_description/api.rb +12 -0
- data/lib/apipie/method_description/apis_service.rb +82 -0
- data/lib/apipie/method_description.rb +1 -46
- data/lib/apipie/swagger_generator.rb +76 -81
- data/lib/apipie/validator.rb +4 -0
- data/lib/apipie/version.rb +1 -1
- data/lib/apipie-rails.rb +9 -1
- data/lib/generators/apipie/install/install_generator.rb +1 -1
- data/lib/generators/apipie/views_generator.rb +1 -1
- data/lib/tasks/apipie.rake +2 -2
- data/spec/dummy/Rakefile +1 -1
- data/spec/dummy/components/test_engine/test_engine.gemspec +1 -1
- data/spec/dummy/config/application.rb +1 -1
- data/spec/dummy/config/boot.rb +2 -2
- data/spec/dummy/config/environment.rb +1 -1
- data/spec/dummy/config/routes.rb +1 -0
- data/spec/dummy/config.ru +1 -1
- data/spec/dummy/script/rails +2 -2
- data/spec/lib/application_spec.rb +1 -1
- data/spec/lib/extractor/writer_spec.rb +7 -5
- data/spec/lib/generator/swagger/type_extractor_spec.rb +61 -0
- data/spec/lib/generator/swagger/warning_spec.rb +51 -0
- data/spec/lib/generator/swagger/warning_writer_spec.rb +59 -0
- data/spec/lib/method_description/apis_service_spec.rb +60 -0
- data/spec/lib/rake_spec.rb +1 -1
- data/spec/lib/swagger/rake_swagger_spec.rb +4 -4
- data/spec/spec_helper.rb +4 -4
- metadata +39 -38
@@ -128,33 +128,75 @@ module Apipie
|
|
128
128
|
method.resource.controller.name + "#" + method.method
|
129
129
|
end
|
130
130
|
|
131
|
+
def warn_missing_method_summary
|
132
|
+
warn(Apipie::Generator::Swagger::Warning::MISSING_METHOD_SUMMARY_CODE)
|
133
|
+
end
|
131
134
|
|
132
|
-
def
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
def warn_param_ignored_in_form_data(param_name) warn 106,"ignoring param :#{param_name} -- cannot include Hash without fields in a formData specification"; end
|
139
|
-
def warn_path_parameter_not_described(name,path) warn 107,"the parameter :#{name} appears in the path #{path} but is not described"; end
|
140
|
-
def warn_inferring_boolean(name) warn 108,"the parameter [#{name}] is Enum with [true,false] values. Inferring 'boolean'"; end
|
141
|
-
|
142
|
-
def warn(warning_num, msg)
|
143
|
-
suppress = Apipie.configuration.swagger_suppress_warnings
|
144
|
-
return if suppress == true
|
145
|
-
return if suppress.is_a?(Array) && suppress.include?(warning_num)
|
135
|
+
def warn_added_missing_slash(path)
|
136
|
+
warn(
|
137
|
+
Apipie::Generator::Swagger::Warning::ADDED_MISSING_SLASH_CODE,
|
138
|
+
{ path: path }
|
139
|
+
)
|
140
|
+
end
|
146
141
|
|
147
|
-
|
148
|
-
|
142
|
+
def warn_no_return_codes_specified
|
143
|
+
warn(Apipie::Generator::Swagger::Warning::NO_RETURN_CODES_SPECIFIED_CODE)
|
144
|
+
end
|
149
145
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
146
|
+
def warn_hash_without_internal_typespec(param_name)
|
147
|
+
warn(
|
148
|
+
Apipie::Generator::Swagger::Warning::HASH_WITHOUT_INTERNAL_TYPESPEC_CODE,
|
149
|
+
{ parameter: param_name }
|
150
|
+
)
|
151
|
+
end
|
152
|
+
|
153
|
+
def warn_optional_param_in_path(param_name)
|
154
|
+
warn(
|
155
|
+
Apipie::Generator::Swagger::Warning::OPTIONAL_PARAM_IN_PATH_CODE,
|
156
|
+
{ parameter: param_name }
|
157
|
+
)
|
158
|
+
end
|
159
|
+
|
160
|
+
def warn_optional_without_default_value(param_name)
|
161
|
+
warn(
|
162
|
+
Apipie::Generator::Swagger::Warning::OPTIONAL_WITHOUT_DEFAULT_VALUE_CODE,
|
163
|
+
{ parameter: param_name }
|
164
|
+
)
|
165
|
+
end
|
166
|
+
|
167
|
+
def warn_param_ignored_in_form_data(param_name)
|
168
|
+
warn(
|
169
|
+
Apipie::Generator::Swagger::Warning::PARAM_IGNORED_IN_FORM_DATA_CODE,
|
170
|
+
{ parameter: param_name }
|
171
|
+
)
|
172
|
+
end
|
173
|
+
|
174
|
+
def warn_path_parameter_not_described(name, path)
|
175
|
+
warn(
|
176
|
+
Apipie::Generator::Swagger::Warning::PATH_PARAM_NOT_DESCRIBED_CODE,
|
177
|
+
{ name: name, path: path }
|
178
|
+
)
|
179
|
+
end
|
154
180
|
|
155
|
-
|
156
|
-
|
157
|
-
|
181
|
+
def warn_inferring_boolean(name)
|
182
|
+
warn(
|
183
|
+
Apipie::Generator::Swagger::Warning::INFERRING_BOOLEAN_CODE,
|
184
|
+
{ name: name }
|
185
|
+
)
|
186
|
+
end
|
187
|
+
|
188
|
+
# @param [Integer] warning_code
|
189
|
+
# @param [Hash] message_attributes
|
190
|
+
def warn(warning_code, message_attributes = {})
|
191
|
+
Apipie::Generator::Swagger::Warning.for_code(
|
192
|
+
warning_code,
|
193
|
+
ruby_name_for_method(@current_method),
|
194
|
+
message_attributes
|
195
|
+
).warn_through_writer
|
196
|
+
|
197
|
+
@warnings_issued = Apipie::Generator::Swagger::WarningWriter.
|
198
|
+
instance.
|
199
|
+
issued_warnings?
|
158
200
|
end
|
159
201
|
|
160
202
|
def info(msg)
|
@@ -276,68 +318,21 @@ module Apipie
|
|
276
318
|
http_method.downcase + path.gsub(/\//,'_').gsub(/:(\w+)/, '\1').gsub(/_$/,'')
|
277
319
|
end
|
278
320
|
|
279
|
-
class SwaggerTypeWithFormat
|
280
|
-
attr_reader :str_format
|
281
|
-
def initialize(type, str_format)
|
282
|
-
@type = type
|
283
|
-
@str_format = str_format
|
284
|
-
end
|
285
|
-
|
286
|
-
def to_s
|
287
|
-
@type
|
288
|
-
end
|
289
|
-
|
290
|
-
def ==(other)
|
291
|
-
other.to_s == self.to_s
|
292
|
-
end
|
293
|
-
end
|
294
|
-
|
295
|
-
def lookup
|
296
|
-
@lookup ||= {
|
297
|
-
numeric: "number",
|
298
|
-
hash: "object",
|
299
|
-
array: "array",
|
300
|
-
|
301
|
-
# see https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types
|
302
|
-
integer: SwaggerTypeWithFormat.new("integer", "int32"),
|
303
|
-
long: SwaggerTypeWithFormat.new("integer", "int64"),
|
304
|
-
number: SwaggerTypeWithFormat.new("number", nil), # here just for completeness
|
305
|
-
float: SwaggerTypeWithFormat.new("number", "float"),
|
306
|
-
double: SwaggerTypeWithFormat.new("number", "double"),
|
307
|
-
string: SwaggerTypeWithFormat.new("string", nil), # here just for completeness
|
308
|
-
byte: SwaggerTypeWithFormat.new("string", "byte"),
|
309
|
-
binary: SwaggerTypeWithFormat.new("string", "binary"),
|
310
|
-
boolean: SwaggerTypeWithFormat.new("boolean", nil), # here just for completeness
|
311
|
-
date: SwaggerTypeWithFormat.new("string", "date"),
|
312
|
-
dateTime: SwaggerTypeWithFormat.new("string", "date-time"),
|
313
|
-
password: SwaggerTypeWithFormat.new("string", "password"),
|
314
|
-
}
|
315
|
-
end
|
316
|
-
|
317
|
-
|
318
321
|
def swagger_param_type(param_desc)
|
319
|
-
if param_desc.
|
320
|
-
raise
|
321
|
-
end
|
322
|
-
|
323
|
-
v = param_desc.validator
|
324
|
-
if v.nil?
|
325
|
-
return "string"
|
322
|
+
if param_desc.blank?
|
323
|
+
raise ArgumentError, 'param_desc is required'
|
326
324
|
end
|
327
325
|
|
328
|
-
|
329
|
-
if v.values - [true, false] == [] && [true, false] - v.values == []
|
330
|
-
warn_inferring_boolean(param_desc.name)
|
331
|
-
return "boolean"
|
332
|
-
else
|
333
|
-
return "enum"
|
334
|
-
end
|
335
|
-
elsif v.class == Apipie::Validator::HashValidator
|
336
|
-
# pp v
|
337
|
-
end
|
326
|
+
method_id = ruby_name_for_method(@current_method)
|
338
327
|
|
328
|
+
warning = Apipie::Generator::Swagger::Warning.for_code(
|
329
|
+
Apipie::Generator::Swagger::Warning::INFERRING_BOOLEAN_CODE,
|
330
|
+
method_id,
|
331
|
+
{ parameter: param_desc.name }
|
332
|
+
)
|
339
333
|
|
340
|
-
|
334
|
+
Apipie::Generator::Swagger::TypeExtractor.new(param_desc.validator).
|
335
|
+
extract_with_warnings({ boolean: warning })
|
341
336
|
end
|
342
337
|
|
343
338
|
|
@@ -473,7 +468,7 @@ module Apipie
|
|
473
468
|
|
474
469
|
swg_param_type = swagger_param_type(param_desc)
|
475
470
|
swagger_def[:type] = swg_param_type.to_s
|
476
|
-
if (swg_param_type.is_a?
|
471
|
+
if (swg_param_type.is_a? Apipie::Generator::Swagger::Type) && !swg_param_type.str_format.nil?
|
477
472
|
swagger_def[:format] = swg_param_type.str_format
|
478
473
|
end
|
479
474
|
|
data/lib/apipie/validator.rb
CHANGED
data/lib/apipie/version.rb
CHANGED
data/lib/apipie-rails.rb
CHANGED
@@ -2,7 +2,7 @@ require 'i18n'
|
|
2
2
|
require 'json'
|
3
3
|
require 'active_support/hash_with_indifferent_access'
|
4
4
|
|
5
|
-
require 'apipie/core_ext/route
|
5
|
+
require 'apipie/core_ext/route'
|
6
6
|
|
7
7
|
require "apipie/routing"
|
8
8
|
require "apipie/markup"
|
@@ -12,6 +12,8 @@ require "apipie/configuration"
|
|
12
12
|
require "apipie/method_description"
|
13
13
|
require "apipie/resource_description"
|
14
14
|
require "apipie/param_description"
|
15
|
+
require "apipie/method_description/api"
|
16
|
+
require "apipie/method_description/apis_service"
|
15
17
|
require "apipie/errors"
|
16
18
|
require "apipie/error_description"
|
17
19
|
require "apipie/response_description"
|
@@ -23,3 +25,9 @@ require "apipie/railtie"
|
|
23
25
|
require 'apipie/extractor'
|
24
26
|
require "apipie/version"
|
25
27
|
require "apipie/swagger_generator"
|
28
|
+
require "apipie/generator/generator"
|
29
|
+
require "apipie/generator/swagger/swagger"
|
30
|
+
require "apipie/generator/swagger/warning"
|
31
|
+
require "apipie/generator/swagger/warning_writer"
|
32
|
+
require "apipie/generator/swagger/type"
|
33
|
+
require "apipie/generator/swagger/type_extractor"
|
data/lib/tasks/apipie.rake
CHANGED
@@ -166,10 +166,10 @@ namespace :apipie do
|
|
166
166
|
def renderer
|
167
167
|
return @apipie_renderer if @apipie_renderer
|
168
168
|
|
169
|
-
base_paths = [File.expand_path(
|
169
|
+
base_paths = [File.expand_path('../../app/views/apipie/apipies', __dir__)]
|
170
170
|
base_paths.unshift("#{Rails.root}/app/views/apipie/apipies") if File.directory?("#{Rails.root}/app/views/apipie/apipies")
|
171
171
|
|
172
|
-
layouts_paths = [File.expand_path(
|
172
|
+
layouts_paths = [File.expand_path('../../app/views/layouts', __dir__)]
|
173
173
|
layouts_paths.unshift("#{Rails.root}/app/views/layouts") if File.directory?("#{Rails.root}/app/views/layouts/apipie")
|
174
174
|
|
175
175
|
if ActionView::Base.respond_to?(:with_empty_template_cache) && ActionView::Base.respond_to?(:with_view_paths)
|
data/spec/dummy/Rakefile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
2
2
|
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
3
3
|
|
4
|
-
require File.expand_path('
|
4
|
+
require File.expand_path('config/application', __dir__)
|
5
5
|
require 'rake'
|
6
6
|
|
7
7
|
Dummy::Application.load_tasks
|
data/spec/dummy/config/boot.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
gemfile = File.expand_path('
|
2
|
+
gemfile = File.expand_path('../../../Gemfile', __dir__)
|
3
3
|
|
4
4
|
if File.exist?(gemfile)
|
5
5
|
ENV['BUNDLE_GEMFILE'] = gemfile
|
@@ -7,4 +7,4 @@ if File.exist?(gemfile)
|
|
7
7
|
Bundler.setup
|
8
8
|
end
|
9
9
|
|
10
|
-
$:.unshift File.expand_path('
|
10
|
+
$:.unshift File.expand_path('../../../lib', __dir__)
|
data/spec/dummy/config/routes.rb
CHANGED
data/spec/dummy/config.ru
CHANGED
data/spec/dummy/script/rails
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
3
3
|
|
4
|
-
APP_PATH = File.expand_path('
|
5
|
-
require File.expand_path('
|
4
|
+
APP_PATH = File.expand_path('../config/application', __dir__)
|
5
|
+
require File.expand_path('../config/boot', __dir__)
|
6
6
|
require 'rails/commands'
|
@@ -27,7 +27,7 @@ describe Apipie::Application do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
context "with an undefined base url" do
|
30
|
-
before {allow(Apipie.app).to receive(:get_base_url)
|
30
|
+
before {allow(Apipie.app).to receive(:get_base_url).and_return(nil)}
|
31
31
|
|
32
32
|
it "should not raise an error" do
|
33
33
|
expect { Apipie.get_resource_name(Api::V2::ArchitecturesController) }.
|
@@ -6,7 +6,8 @@ describe Apipie::Extractor::Writer do
|
|
6
6
|
let(:writer_class) { Apipie::Extractor::Writer }
|
7
7
|
let(:writer) { writer_class.new(collector) }
|
8
8
|
let(:test_examples_file) { File.join(Rails.root, "doc", "apipie_examples_test.json") }
|
9
|
-
let(:records) {
|
9
|
+
let(:records) {
|
10
|
+
{
|
10
11
|
"concern_resources#show" =>
|
11
12
|
[{
|
12
13
|
:controller=>ConcernsController,
|
@@ -31,7 +32,8 @@ describe Apipie::Extractor::Writer do
|
|
31
32
|
}]
|
32
33
|
}
|
33
34
|
}
|
34
|
-
let(:loaded_records) {
|
35
|
+
let(:loaded_records) {
|
36
|
+
{
|
35
37
|
"concern_resources#show" =>
|
36
38
|
[{
|
37
39
|
"verb"=>:GET,
|
@@ -57,16 +59,16 @@ describe Apipie::Extractor::Writer do
|
|
57
59
|
}
|
58
60
|
}
|
59
61
|
|
60
|
-
context 'with doc_path
|
62
|
+
context 'with doc_path overridden in configuration' do
|
61
63
|
around(:each) do |example|
|
62
64
|
standard_path = Apipie.configuration.doc_path
|
63
|
-
Apipie.configuration.doc_path = 'user_specified_doc_path'
|
65
|
+
Apipie.configuration.doc_path = 'tmp/user_specified_doc_path'
|
64
66
|
example.run
|
65
67
|
Apipie.configuration.doc_path = standard_path
|
66
68
|
end
|
67
69
|
|
68
70
|
it 'should use the doc_path specified in configuration' do
|
69
|
-
expect(writer_class.examples_file).to eql(File.join(Rails.root, 'user_specified_doc_path', 'apipie_examples.json'))
|
71
|
+
expect(writer_class.examples_file).to eql(File.join(Rails.root, 'tmp', 'user_specified_doc_path', 'apipie_examples.json'))
|
70
72
|
end
|
71
73
|
end
|
72
74
|
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Apipie::Generator::Swagger::TypeExtractor do
|
4
|
+
let(:validator) {}
|
5
|
+
let(:extractor) { described_class.new(validator) }
|
6
|
+
|
7
|
+
describe '#extarct_with_warnings' do
|
8
|
+
let(:warnings) { {} }
|
9
|
+
|
10
|
+
before { Apipie.configuration.swagger_suppress_warnings = false }
|
11
|
+
|
12
|
+
subject { extractor.extract_with_warnings(warnings) }
|
13
|
+
|
14
|
+
it { is_expected.to eq(Apipie::Generator::Swagger::TypeExtractor::TYPES[:string]) }
|
15
|
+
|
16
|
+
context "when enum validator is used" do
|
17
|
+
let(:enum_values) { ["Name"] }
|
18
|
+
|
19
|
+
context "of type Apipie::Validator::EnumValidator" do
|
20
|
+
let(:validator) { Apipie::Validator::EnumValidator.new(nil, enum_values) }
|
21
|
+
|
22
|
+
it { is_expected.to eq("enum") }
|
23
|
+
end
|
24
|
+
|
25
|
+
context "that responds to is_enum?" do
|
26
|
+
let(:validator) do
|
27
|
+
Apipie::ResponseDescriptionAdapter::PropDesc::Validator.new('some-type', enum_values)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'returns an enum type' do
|
31
|
+
expect(subject).to eq(Apipie::Generator::Swagger::TypeExtractor::TYPES[:enum])
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'and has `true`, `false` as values' do
|
35
|
+
let(:param_description_name) { :visible }
|
36
|
+
let(:enum_values) { [true, false] }
|
37
|
+
|
38
|
+
it 'returns a boolean type' do
|
39
|
+
expect(subject).to eq(Apipie::Generator::Swagger::TypeExtractor::TYPES[:boolean])
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'and a boolean warning is passed' do
|
43
|
+
let(:boolean_warning) do
|
44
|
+
Apipie::Generator::Swagger::Warning.for_code(
|
45
|
+
Apipie::Generator::Swagger::Warning::INFERRING_BOOLEAN_CODE,
|
46
|
+
'SampleController#action',
|
47
|
+
{ parameter: 'some-param' }
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
let(:warnings) { { boolean: boolean_warning } }
|
52
|
+
|
53
|
+
it 'outputs the warning' do
|
54
|
+
expect { subject }.to output(boolean_warning.warning_message).to_stderr
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Apipie::Generator::Swagger::Warning do
|
4
|
+
let(:code) { Apipie::Generator::Swagger::Warning::MISSING_METHOD_SUMMARY_CODE }
|
5
|
+
let(:method_id) { 'Examples#index' }
|
6
|
+
let(:info_message) { 'Something went wrong' }
|
7
|
+
|
8
|
+
let(:warning) { described_class.new(code, info_message, method_id) }
|
9
|
+
|
10
|
+
describe '#id' do
|
11
|
+
subject { warning.id }
|
12
|
+
|
13
|
+
it { is_expected.to eq("#{method_id}#{code}#{info_message}") }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#warning_message' do
|
17
|
+
subject { warning.warning_message }
|
18
|
+
|
19
|
+
it { is_expected.to eq("WARNING (#{code}): [#{method_id}] -- #{info_message}") }
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#warn' do
|
23
|
+
subject { warning.warn }
|
24
|
+
|
25
|
+
it 'outputs the warning' do
|
26
|
+
expect { subject }.to output(warning.warning_message).to_stderr
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#warn_through_writer' do
|
31
|
+
subject { warning.warn }
|
32
|
+
|
33
|
+
it 'outputs the warning' do
|
34
|
+
expect { subject }.to output(warning.warning_message).to_stderr
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '.for_code' do
|
39
|
+
subject { described_class.for_code(code, method_id) }
|
40
|
+
|
41
|
+
it { is_expected.to be_an_instance_of(described_class)}
|
42
|
+
|
43
|
+
context 'when code is invalid' do
|
44
|
+
let(:code) { 12345 }
|
45
|
+
|
46
|
+
it 'raises an argument error' do
|
47
|
+
expect { subject }.to raise_error(ArgumentError)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Apipie::Generator::Swagger::WarningWriter do
|
4
|
+
let(:writer) { described_class.clone.instance }
|
5
|
+
|
6
|
+
let(:warning) do
|
7
|
+
Apipie::Generator::Swagger::Warning.for_code(
|
8
|
+
Apipie::Generator::Swagger::Warning::INFERRING_BOOLEAN_CODE,
|
9
|
+
'SampleController#action',
|
10
|
+
{ parameter: 'some-param' }
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
before do
|
15
|
+
Apipie.configuration.swagger_suppress_warnings = false
|
16
|
+
Singleton.__init__(described_class)
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#warn' do
|
20
|
+
subject { writer.warn(warning) }
|
21
|
+
|
22
|
+
it 'outputs the warning' do
|
23
|
+
expect { subject }.to output(warning.warning_message).to_stderr
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'when Apipie.configuration.swagger_suppress_warnings is true' do
|
27
|
+
before { Apipie.configuration.swagger_suppress_warnings = true }
|
28
|
+
|
29
|
+
it { is_expected.to be_falsey }
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when Apipie.configuration.swagger_suppress_warnings includes warning code' do
|
33
|
+
before do
|
34
|
+
Apipie.configuration.swagger_suppress_warnings =
|
35
|
+
Array(Apipie::Generator::Swagger::Warning::INFERRING_BOOLEAN_CODE)
|
36
|
+
end
|
37
|
+
|
38
|
+
it { is_expected.to be_falsey }
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'when a warning already been logged' do
|
42
|
+
before { writer.warn(warning) }
|
43
|
+
|
44
|
+
it { is_expected.to be_falsey }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '#issued_warnings?' do
|
49
|
+
subject { writer.issued_warnings? }
|
50
|
+
|
51
|
+
it { is_expected.to be_falsey }
|
52
|
+
|
53
|
+
context 'when a warning already been logged' do
|
54
|
+
before { writer.warn(warning) }
|
55
|
+
|
56
|
+
it { is_expected.to be_truthy }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Apipie::MethodDescription::ApisService do
|
4
|
+
let(:resource) {}
|
5
|
+
let(:controller_action) {}
|
6
|
+
let(:api_args) { [] }
|
7
|
+
let(:dsl) { { api_args: api_args } }
|
8
|
+
let(:service) { described_class.new(resource, controller_action, dsl) }
|
9
|
+
|
10
|
+
describe '#call' do
|
11
|
+
subject { service.call }
|
12
|
+
|
13
|
+
it { is_expected.to eq(api_args) }
|
14
|
+
|
15
|
+
context 'when api_from_routes is given' do
|
16
|
+
let(:controller) { UsersController }
|
17
|
+
let(:controller_action) { :show }
|
18
|
+
let(:resource) { Apipie::ResourceDescription.new(controller, 'dummy') }
|
19
|
+
let(:short_description) { 'Short description' }
|
20
|
+
|
21
|
+
let(:dsl) do
|
22
|
+
super().merge({
|
23
|
+
api_from_routes: {
|
24
|
+
desc: short_description,
|
25
|
+
options: {}
|
26
|
+
}
|
27
|
+
})
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'returns an array of Apipie::MethodDescription::Api' do
|
31
|
+
expect(subject).to all(be_an_instance_of(Apipie::MethodDescription::Api))
|
32
|
+
expect(subject.count).to eq(1)
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'Apipie::MethodDescription::Api' do
|
36
|
+
subject { service.call.first }
|
37
|
+
|
38
|
+
it 'has the correct values' do
|
39
|
+
expect(subject.short_description).to eq(short_description)
|
40
|
+
expect(subject.path).to eq('/api/users/:id')
|
41
|
+
expect(subject.from_routes).to eq(true)
|
42
|
+
expect(subject.options).to eq({ from_routes: true })
|
43
|
+
end
|
44
|
+
|
45
|
+
context "when it's from concern" do
|
46
|
+
let(:controller) { ConcernsController }
|
47
|
+
let(:controller_action) { :custom }
|
48
|
+
let(:dsl) { super().merge(from_concern: true ) }
|
49
|
+
|
50
|
+
it 'has the correct values' do
|
51
|
+
expect(subject.short_description).to eq(short_description)
|
52
|
+
expect(subject.path).to eq('/api/concern_resources/custom')
|
53
|
+
expect(subject.from_routes).to eq(true)
|
54
|
+
expect(subject.options).to eq({ from_routes: true })
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/spec/lib/rake_spec.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require "json-schema"
|
3
3
|
|
4
|
-
require File.expand_path(
|
5
|
-
require File.expand_path(
|
6
|
-
require File.expand_path(
|
4
|
+
require File.expand_path('../../dummy/app/controllers/twitter_example_controller.rb', __dir__)
|
5
|
+
require File.expand_path('../../dummy/app/controllers/users_controller.rb', __dir__)
|
6
|
+
require File.expand_path('../../dummy/app/controllers/pets_controller.rb', __dir__)
|
7
7
|
|
8
8
|
describe 'rake tasks' do
|
9
9
|
include_context "rake"
|
10
10
|
|
11
|
-
let(:doc_path) {
|
11
|
+
let(:doc_path) { 'tmp/user_specified_doc_path' }
|
12
12
|
|
13
13
|
before do
|
14
14
|
Apipie.configuration.doc_path = doc_path
|