grape-swagger 0.26.0 → 0.26.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +1 -0
  4. data/.rspec +0 -1
  5. data/.rubocop.yml +4 -0
  6. data/.travis.yml +26 -24
  7. data/CHANGELOG.md +14 -0
  8. data/Gemfile +3 -5
  9. data/README.md +9 -85
  10. data/UPGRADING.md +9 -0
  11. data/lib/grape-swagger.rb +20 -71
  12. data/lib/grape-swagger/doc_methods.rb +4 -6
  13. data/lib/grape-swagger/doc_methods/parse_params.rb +5 -9
  14. data/lib/grape-swagger/doc_methods/tag_name_description.rb +18 -5
  15. data/lib/grape-swagger/endpoint.rb +8 -10
  16. data/lib/grape-swagger/errors.rb +7 -6
  17. data/lib/grape-swagger/rake/oapi_tasks.rb +5 -1
  18. data/lib/grape-swagger/version.rb +1 -1
  19. data/spec/issues/532_allow_custom_format_spec.rb +36 -0
  20. data/spec/issues/537_enum_values_spec.rb +47 -0
  21. data/spec/issues/572_array_post_body_spec.rb +49 -0
  22. data/spec/lib/endpoint_spec.rb +42 -1
  23. data/spec/lib/extensions_spec.rb +42 -0
  24. data/spec/lib/oapi_tasks_spec.rb +13 -2
  25. data/spec/lib/operation_id_spec.rb +1 -5
  26. data/spec/lib/parse_params_spec.rb +58 -0
  27. data/spec/lib/tag_name_description_spec.rb +77 -0
  28. data/spec/lib/version_spec.rb +26 -0
  29. data/spec/spec_helper.rb +11 -0
  30. data/spec/swagger_v2/api_swagger_v2_detail_spec.rb +1 -77
  31. data/spec/swagger_v2/description_not_initialized.rb +1 -1
  32. data/spec/swagger_v2/guarded_endpoint_spec.rb +2 -2
  33. metadata +16 -9
  34. data/lib/grape-swagger/markdown/kramdown_adapter.rb +0 -37
  35. data/lib/grape-swagger/markdown/redcarpet_adapter.rb +0 -92
  36. data/spec/markdown/kramdown_adapter_spec.rb +0 -31
  37. data/spec/markdown/redcarpet_adapter_spec.rb +0 -66
@@ -7,11 +7,7 @@ describe GrapeSwagger::DocMethods::OperationId do
7
7
  specify { expect(subject).to respond_to :build }
8
8
 
9
9
  describe 'build' do
10
- if defined?(Grape::VERSION) && Gem::Version.new(::Grape::VERSION) < Gem::Version.new('0.16.0')
11
- let(:route) { Grape::Route.new(method: method) }
12
- else
13
- let(:route) { Grape::Router::Route.new(method, '/path', requirements: {}) }
14
- end
10
+ let(:route) { Grape::Router::Route.new(method, '/path', requirements: {}) }
15
11
 
16
12
  describe 'GET' do
17
13
  let(:method) { 'GET' }
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe GrapeSwagger::DocMethods::ParseParams do
4
+ subject { described_class }
5
+ let(:start_value) { -5 }
6
+ let(:end_value) { 5 }
7
+
8
+ describe '#parse_range_values' do
9
+ specify do
10
+ parsed_range = subject.send(:parse_range_values, start_value..end_value)
11
+ expect(parsed_range).to eql(minimum: start_value, maximum: end_value)
12
+ end
13
+ end
14
+
15
+ describe '#parse_enum_or_range_values' do
16
+ describe 'value as Range' do
17
+ describe 'first Integer' do
18
+ specify do
19
+ parsed_range = subject.send(:parse_enum_or_range_values, start_value..end_value)
20
+ expect(parsed_range).to eql(minimum: start_value, maximum: end_value)
21
+ end
22
+ end
23
+
24
+ describe 'first String' do
25
+ specify do
26
+ parsed_range = subject.send(:parse_enum_or_range_values, 'a'..'z')
27
+ expect(parsed_range).to be_nil
28
+ end
29
+ end
30
+ end
31
+
32
+ describe 'value as Proc' do
33
+ describe 'as Range' do
34
+ let(:values) { proc { start_value..end_value } }
35
+ specify do
36
+ parsed_range = subject.send(:parse_enum_or_range_values, values)
37
+ expect(parsed_range).to eql(minimum: start_value, maximum: end_value)
38
+ end
39
+ end
40
+
41
+ describe 'as Array' do
42
+ let(:values) { proc { %w(a b c) } }
43
+ specify do
44
+ parsed_range = subject.send(:parse_enum_or_range_values, values)
45
+ expect(parsed_range).to eql(enum: %w(a b c))
46
+ end
47
+ end
48
+ end
49
+
50
+ describe 'values as Array -> enums' do
51
+ let(:values) { %w(a b c) }
52
+ specify do
53
+ parsed_range = subject.send(:parse_enum_or_range_values, values)
54
+ expect(parsed_range).to eql(enum: %w(a b c))
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,77 @@
1
+ require 'spec_helper'
2
+
3
+ describe GrapeSwagger::DocMethods::TagNameDescription do
4
+ describe '#build_memo' do
5
+ let(:tag) { 'some_string' }
6
+ subject { described_class.send(:build_memo, tag) }
7
+
8
+ specify do
9
+ expect(subject.keys).to eql [:name, :description]
10
+ expect(subject).to eql(
11
+ name: tag,
12
+ description: "Operations about #{tag.pluralize}"
13
+ )
14
+ end
15
+ end
16
+
17
+ describe '#build' do
18
+ subject { described_class.build(paths) }
19
+ describe 'empty paths' do
20
+ let(:paths) { {} }
21
+ specify do
22
+ expect(subject).to eql([])
23
+ end
24
+ end
25
+
26
+ describe 'paths given' do
27
+ describe 'uniq as String' do
28
+ let(:paths) do
29
+ { key_1: { post: { tags: 'tags_given' } } }
30
+ end
31
+
32
+ specify do
33
+ expect(subject).to eql [{ name: 'tags_given', description: 'Operations about tags_givens' }]
34
+ end
35
+ end
36
+
37
+ describe 'uniq as Array' do
38
+ let(:paths) do
39
+ { key_1: { post: { tags: ['tags_given'] } } }
40
+ end
41
+
42
+ specify do
43
+ expect(subject).to eql [{ name: 'tags_given', description: 'Operations about tags_givens' }]
44
+ end
45
+ end
46
+
47
+ describe 'multiple' do
48
+ describe 'uniq key' do
49
+ let(:paths) do
50
+ {
51
+ key_1: { post: { tags: %w(tags_given another_tag_given) } }
52
+ }
53
+ end
54
+
55
+ specify do
56
+ expect(subject).to eql [
57
+ { name: 'tags_given', description: 'Operations about tags_givens' },
58
+ { name: 'another_tag_given', description: 'Operations about another_tag_givens' }
59
+ ]
60
+ end
61
+ end
62
+ describe 'under different keys' do
63
+ let(:paths) do
64
+ {
65
+ key_1: { post: { tags: ['tags_given'] } },
66
+ key_2: { post: { tags: ['tags_given'] } }
67
+ }
68
+ end
69
+
70
+ specify do
71
+ expect(subject).to eql [{ name: 'tags_given', description: 'Operations about tags_givens' }]
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe GrapeSwagger::DocMethods::Version do
4
+ let(:route) { OpenStruct.new(version: version) }
5
+ subject { described_class.get(route) }
6
+
7
+ describe 'grape 0.16.2 version' do
8
+ let(:version) { '[:v1, :v2]' }
9
+ it { is_expected.to be_a Array }
10
+ it { is_expected.to eql [:v1, :v2] }
11
+ end
12
+
13
+ describe 'newer grape versions' do
14
+ describe 'as String' do
15
+ let(:version) { 'v1' }
16
+ it { is_expected.to be_a String }
17
+ it { is_expected.to eql 'v1' }
18
+ end
19
+
20
+ describe 'as Array' do
21
+ let(:version) { [:v1, :v2] }
22
+ it { is_expected.to be_a Array }
23
+ it { is_expected.to eql [:v1, :v2] }
24
+ end
25
+ end
26
+ end
@@ -1,9 +1,20 @@
1
+ require 'simplecov'
2
+ require 'coveralls'
3
+
4
+ SimpleCov.start do
5
+ add_filter 'spec/'
6
+ add_filter 'example/'
7
+ end
8
+
9
+ Coveralls.wear!
10
+
1
11
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
12
 
3
13
  MODEL_PARSER = ENV.key?('MODEL_PARSER') ? ENV['MODEL_PARSER'].to_s.downcase.sub('grape-swagger-', '') : 'mock'
4
14
 
5
15
  require 'grape'
6
16
  require 'grape-swagger'
17
+
7
18
  Dir[File.join(Dir.getwd, 'spec/support/*.rb')].each { |f| require f }
8
19
  require "grape-swagger/#{MODEL_PARSER}" if MODEL_PARSER != 'mock'
9
20
  require File.join(Dir.getwd, "spec/support/model_parsers/#{MODEL_PARSER}_parser.rb")
@@ -46,7 +46,7 @@ describe 'details' do
46
46
  { 'declared_params' => declared(params) }
47
47
  end
48
48
 
49
- add_swagger_documentation
49
+ add_swagger_documentation markdown: 'foo'
50
50
  end
51
51
  end
52
52
  end
@@ -74,80 +74,4 @@ describe 'details' do
74
74
  expect(subject['paths']['/use_detail_block']['get']['description']).to eql 'detailed description of the route inside the `desc` block'
75
75
  end
76
76
  end
77
-
78
- describe 'details, convert markdown with kramdown' do
79
- include_context "#{MODEL_PARSER} swagger example"
80
-
81
- before :all do
82
- module TheApi
83
- class GfmDetailApi < Grape::API
84
- format :json
85
-
86
- desc 'This returns something',
87
- detail: details,
88
- entity: Entities::UseResponse,
89
- failure: [{ code: 400, model: Entities::ApiError }]
90
- get '/use_gfm_detail' do
91
- { 'declared_params' => declared(params) }
92
- end
93
-
94
- add_swagger_documentation markdown: GrapeSwagger::Markdown::KramdownAdapter.new
95
- end
96
- end
97
- end
98
-
99
- def app
100
- TheApi::GfmDetailApi
101
- end
102
-
103
- subject do
104
- get '/swagger_doc'
105
- JSON.parse(last_response.body)
106
- end
107
-
108
- specify do
109
- expect(subject['paths']['/use_gfm_detail']['get']).to include('description')
110
- expect(subject['paths']['/use_gfm_detail']['get']['description']).to eql(
111
- "<h1 id=\"burgers-in-heaven\">Burgers in Heaven</h1>\n\n<blockquote>\n <p>A burger doesn’t come for free</p>\n</blockquote>\n\n<p>If you want to reserve a burger in heaven, you have to do<br />\nsome crazy stuff on earth.</p>\n\n<pre><code>def do_good\nputs 'help people'\nend\n</code></pre>\n\n<ul>\n <li><em>Will go to Heaven:</em> Probably</li>\n <li><em>Will go to Hell:</em> Probably not</li>\n</ul>"
112
- )
113
- end
114
- end
115
-
116
- describe 'details, convert markdown with redcarpet', unless: RUBY_PLATFORM.eql?('java') do
117
- include_context "#{MODEL_PARSER} swagger example"
118
-
119
- before :all do
120
- module TheApi
121
- class GfmRcDetailApi < Grape::API
122
- format :json
123
-
124
- desc 'This returns something',
125
- detail: details,
126
- entity: Entities::UseResponse,
127
- failure: [{ code: 400, model: Entities::ApiError }]
128
- get '/use_gfm_rc_detail' do
129
- { 'declared_params' => declared(params) }
130
- end
131
-
132
- add_swagger_documentation markdown: GrapeSwagger::Markdown::RedcarpetAdapter.new
133
- end
134
- end
135
- end
136
-
137
- def app
138
- TheApi::GfmRcDetailApi
139
- end
140
-
141
- subject do
142
- get '/swagger_doc'
143
- JSON.parse(last_response.body)
144
- end
145
-
146
- specify do
147
- expect(subject['paths']['/use_gfm_rc_detail']['get']).to include('description')
148
- expect(subject['paths']['/use_gfm_rc_detail']['get']['description']).to eql(
149
- "<h1>Burgers in Heaven</h1>\n\n<blockquote>\n<p>A burger doesn&#39;t come for free</p>\n</blockquote>\n\n<p>If you want to reserve a burger in heaven, you have to do\nsome crazy stuff on earth.</p>\n<pre class=\"highlight plaintext\"><code>def do_good\nputs 'help people'\nend\n</code></pre>\n<ul>\n<li><em>Will go to Heaven:</em> Probably</li>\n<li><em>Will go to Hell:</em> Probably not</li>\n</ul>"
150
- )
151
- end
152
- end
153
77
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'details' do
4
- describe 'details, pass markdown with redcarpet even with nil description and detail', unless: RUBY_PLATFORM.eql?('java') do
4
+ describe 'has no description, if details or description are nil' do
5
5
  before :all do
6
6
  module TheApi
7
7
  class GfmRcDetailApi < Grape::API
@@ -36,8 +36,8 @@ class SampleAuth < Grape::Middleware::Base
36
36
  context.protected_endpoint = context.options[:route_options][:auth].present?
37
37
 
38
38
  return unless context.protected_endpoint?
39
- scopes = context.options[:route_options][:auth][:scopes].map(&:to_sym)
40
- authorize!(*scopes) unless scopes.include? :false
39
+ scopes = context.options[:route_options][:auth][:scopes]
40
+ authorize!(*scopes) unless scopes.include? false
41
41
  context.access_token = env['HTTP_AUTHORIZATION']
42
42
  end
43
43
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape-swagger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.26.0
4
+ version: 0.26.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Vandecasteele
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-09 00:00:00.000000000 Z
11
+ date: 2017-02-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grape
@@ -31,6 +31,7 @@ executables: []
31
31
  extensions: []
32
32
  extra_rdoc_files: []
33
33
  files:
34
+ - ".coveralls.yml"
34
35
  - ".document"
35
36
  - ".gitignore"
36
37
  - ".rspec"
@@ -71,18 +72,19 @@ files:
71
72
  - lib/grape-swagger/doc_methods/version.rb
72
73
  - lib/grape-swagger/endpoint.rb
73
74
  - lib/grape-swagger/errors.rb
74
- - lib/grape-swagger/markdown/kramdown_adapter.rb
75
- - lib/grape-swagger/markdown/redcarpet_adapter.rb
76
75
  - lib/grape-swagger/model_parsers.rb
77
76
  - lib/grape-swagger/rake/oapi_tasks.rb
78
77
  - lib/grape-swagger/version.rb
79
78
  - spec/issues/403_versions_spec.rb
80
79
  - spec/issues/427_entity_as_string_spec.rb
81
80
  - spec/issues/430_entity_definitions_spec.rb
81
+ - spec/issues/532_allow_custom_format_spec.rb
82
82
  - spec/issues/533_specify_status_code_spec.rb
83
+ - spec/issues/537_enum_values_spec.rb
83
84
  - spec/issues/539_array_post_body_spec.rb
84
85
  - spec/issues/542_array_of_type_in_post_body_spec.rb
85
86
  - spec/issues/553_align_array_put_post_params_spec.rb
87
+ - spec/issues/572_array_post_body_spec.rb
86
88
  - spec/lib/data_type_spec.rb
87
89
  - spec/lib/endpoint_spec.rb
88
90
  - spec/lib/extensions_spec.rb
@@ -91,10 +93,11 @@ files:
91
93
  - spec/lib/oapi_tasks_spec.rb
92
94
  - spec/lib/operation_id_spec.rb
93
95
  - spec/lib/optional_object_spec.rb
96
+ - spec/lib/parse_params_spec.rb
94
97
  - spec/lib/path_string_spec.rb
95
98
  - spec/lib/produces_consumes_spec.rb
96
- - spec/markdown/kramdown_adapter_spec.rb
97
- - spec/markdown/redcarpet_adapter_spec.rb
99
+ - spec/lib/tag_name_description_spec.rb
100
+ - spec/lib/version_spec.rb
98
101
  - spec/spec_helper.rb
99
102
  - spec/support/empty_model_parser.rb
100
103
  - spec/support/grape_version.rb
@@ -172,7 +175,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
172
175
  version: '0'
173
176
  requirements: []
174
177
  rubyforge_project:
175
- rubygems_version: 2.6.8
178
+ rubygems_version: 2.6.10
176
179
  signing_key:
177
180
  specification_version: 4
178
181
  summary: Add auto generated documentation to your Grape API that can be displayed
@@ -181,10 +184,13 @@ test_files:
181
184
  - spec/issues/403_versions_spec.rb
182
185
  - spec/issues/427_entity_as_string_spec.rb
183
186
  - spec/issues/430_entity_definitions_spec.rb
187
+ - spec/issues/532_allow_custom_format_spec.rb
184
188
  - spec/issues/533_specify_status_code_spec.rb
189
+ - spec/issues/537_enum_values_spec.rb
185
190
  - spec/issues/539_array_post_body_spec.rb
186
191
  - spec/issues/542_array_of_type_in_post_body_spec.rb
187
192
  - spec/issues/553_align_array_put_post_params_spec.rb
193
+ - spec/issues/572_array_post_body_spec.rb
188
194
  - spec/lib/data_type_spec.rb
189
195
  - spec/lib/endpoint_spec.rb
190
196
  - spec/lib/extensions_spec.rb
@@ -193,10 +199,11 @@ test_files:
193
199
  - spec/lib/oapi_tasks_spec.rb
194
200
  - spec/lib/operation_id_spec.rb
195
201
  - spec/lib/optional_object_spec.rb
202
+ - spec/lib/parse_params_spec.rb
196
203
  - spec/lib/path_string_spec.rb
197
204
  - spec/lib/produces_consumes_spec.rb
198
- - spec/markdown/kramdown_adapter_spec.rb
199
- - spec/markdown/redcarpet_adapter_spec.rb
205
+ - spec/lib/tag_name_description_spec.rb
206
+ - spec/lib/version_spec.rb
200
207
  - spec/spec_helper.rb
201
208
  - spec/support/empty_model_parser.rb
202
209
  - spec/support/grape_version.rb
@@ -1,37 +0,0 @@
1
- module GrapeSwagger
2
- class Markdown
3
- class KramdownAdapter
4
- attr_reader :options
5
-
6
- ###
7
- # Initializes the kramdown adapter with options.
8
- # See kramdown documentation what options can be passed.
9
- # Default it uses Github flavoured markup as input and won't use coderay as converter for syntax highlighting.
10
- # config: an hash of configuration options to be passed to the kramdown.
11
- # usage:
12
- # Add the kramdown gem to your gemfile or run:
13
- # $ (sudo) gem install kramdown
14
- #
15
- # Then pass a new instance of GrapeSwagger::Markdown::KramdownAdapter as markdown option.
16
- ###
17
- def initialize(config = {})
18
- require 'kramdown'
19
- defaults = {
20
- input: 'GFM',
21
- enable_coderay: false
22
- }
23
- @options = defaults.merge(config)
24
- rescue LoadError
25
- raise GrapeSwagger::Errors::MarkdownDependencyMissingError, 'kramdown'
26
- end
27
-
28
- ###
29
- # marks down the given text to html format.
30
- # text: The text to be formatted.
31
- ###
32
- def markdown(text)
33
- Kramdown::Document.new(text, @options).to_html
34
- end
35
- end
36
- end
37
- end
@@ -1,92 +0,0 @@
1
- module GrapeSwagger
2
- class Markdown
3
- class RedcarpetAdapter
4
- module RenderWithoutSyntaxHighlighter
5
- require 'cgi'
6
-
7
- def block_code(code, language)
8
- language ||= 'text'
9
- "<div class=\"code_highlight\">
10
- <pre><code class=\"highlight #{language}\">#{CGI.escapeHTML(code)}</code></pre>
11
- </div>"
12
- end
13
- end
14
-
15
- attr_reader :extension_options
16
-
17
- attr_reader :render_options
18
-
19
- ###
20
- # Initializes the redcarpet adapter with markup options.
21
- # See redcarpet documentation what options can be passed.
22
- # Default it uses fenced_code_blocks, autolinks and rouge as syntax highlighter.
23
- # To configure an highlighter add {highlighter: :value} to the extentions hash.
24
- # Currently supported highlighters:
25
- # :rouge
26
- #
27
- # extensions: an hash of configuration options to be passed to markdown.
28
- # render_options: an hash of configuration options to be passed to renderer.
29
- #
30
- # usage:
31
- # Add the redcarpet gem to your gemfile or run:
32
- # $ (sudo) gem install redcarpet
33
- # when you want to have rouge as syntax highlighter add rouge to the gemfile or run:
34
- # $ (sudo) gem install rouge
35
- #
36
- # GrapeSwagger::Markdown::RedcarpetAdapter.new({highlighter: :none},{no_links: true})
37
- # will use no syntax highlighter and won't render links.
38
- ###
39
- def initialize(options = {})
40
- require 'redcarpet'
41
- extentions_defaults = {
42
- fenced_code_blocks: true,
43
- autolink: true
44
- }
45
- render_defaults = { highlighter: :rouge }
46
- @extension_options = extentions_defaults.merge(options.fetch(:extensions, {}))
47
- @render_options = render_defaults.merge(options.fetch(:render_options, {}))
48
- @renderer = new_redcarpet_renderer(@render_options.delete(:highlighter)).new(@render_options)
49
- @markdown = Redcarpet::Markdown.new(@renderer, @extension_options)
50
- rescue LoadError
51
- raise GrapeSwagger::Errors::MarkdownDependencyMissingError, 'redcarpet'
52
- end
53
-
54
- ###
55
- # Marks down the given text to html format.
56
- ###
57
- def markdown(text)
58
- @markdown.render(text)
59
- end
60
-
61
- private
62
-
63
- ###
64
- # Creates a new redcarpet renderer based on the highlighter given.
65
- #
66
- # render_options: options passed to the renderer.
67
- #
68
- # usage:
69
- # new_redcarpet_renderer(:rouge) # uses rouge as highlighter.
70
- # new_redcarpet_renderer # no highlight plugin
71
- ###
72
- def new_redcarpet_renderer(syntax_highlighter = nil)
73
- case syntax_highlighter
74
- when :rouge
75
- begin
76
- Class.new(Redcarpet::Render::HTML) do
77
- require 'rouge'
78
- require 'rouge/plugins/redcarpet'
79
- include Rouge::Plugins::Redcarpet
80
- end
81
- rescue LoadError
82
- raise GrapeSwagger::Errors::MarkdownDependencyMissingError, 'rouge'
83
- end
84
- else
85
- Class.new(Redcarpet::Render::HTML) do
86
- include RenderWithoutSyntaxHighlighter
87
- end
88
- end
89
- end
90
- end
91
- end
92
- end