Skip to content

Commit 9aaa2be

Browse files
committed
Merge pull request #336 from LeFnord/swagger-2.0
upgrades to grape 0.14.x; grape-entity 0.5.x
2 parents 6ee5b56 + b3ce344 commit 9aaa2be

19 files changed

+353
-135
lines changed

.rubocop.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ AllCops:
33
- vendor/**/*
44
- spec/**/*
55
- swagger_spec1.2/**/*
6+
- example/**/*
67

78
inherit_from: .rubocop_todo.yml

.rubocop_todo.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ Metrics/AbcSize:
1313
# Offense count: 1
1414
# Configuration parameters: CountComments.
1515
Metrics/ClassLength:
16-
Max: 142
16+
Max: 333
1717

1818
# Offense count: 6
1919
Metrics/CyclomaticComplexity:

.travis.yml

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,17 @@ language: ruby
33
sudo: false
44

55
rvm:
6-
- 2.2.2
7-
- 2.1.1
8-
- 2.0.0
9-
- rbx-2.2.10
6+
- 2.3.0
7+
- 2.2.3
8+
- 2.1.7
9+
- rbx-2
1010
- jruby-19mode
1111

12+
matrix:
13+
allow_failures:
14+
- rvm: rbx-2
1215
env:
13-
- GRAPE_VERSION=0.8.0
14-
- GRAPE_VERSION=0.9.0
15-
- GRAPE_VERSION=0.10.0
16-
- GRAPE_VERSION=0.10.1
17-
- GRAPE_VERSION=0.11.0
1816
- GRAPE_VERSION=0.12.0
1917
- GRAPE_VERSION=0.13.0
18+
- GRAPE_VERSION=0.14.0
2019
- GRAPE_VERSION=HEAD

CHANGELOG.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
1+
2+
n.n.n / 2016-02-05
3+
==================
4+
15
### 0.10.3 (Next)
26

3-
* Your contribution here.
7+
[#336](https://github.com/ruby-grape/grape-swagger/pull/336) changes of swagger-2.0 fork, to support it
8+
9+
* updates gems, corrects parameter, which is in array, make rubocop happy
10+
* runs under 2.3
11+
* documents produces of an end-point
12+
* Update api_swagger_v2_format-content_type_spec.rb
13+
* upgrades to grape 0.14.x; grape-entity 0.5.x
414

515
### 0.10.2 (August 19, 2015)
616

Gemfile

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ source 'http://rubygems.org'
22

33
gemspec
44

5-
# case version = ENV['GRAPE_VERSION'] || '~> 0.14.1'
6-
# when 'HEAD'
7-
gem 'grape', github: 'ruby-grape/grape'
8-
# else
9-
# gem 'grape', version
10-
# end
5+
case version = ENV['GRAPE_VERSION'] || '~> 0.14.0'
6+
when 'HEAD'
7+
gem 'grape', github: 'ruby-grape/grape'
8+
else
9+
gem 'grape', version
10+
end

grape-swagger.gemspec

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
1212
s.license = 'MIT'
1313

1414
s.add_runtime_dependency 'grape'
15-
s.add_runtime_dependency 'grape-entity', '0.4.8'
15+
s.add_runtime_dependency 'grape-entity'
1616
s.add_runtime_dependency 'awesome_print'
1717

1818
s.add_development_dependency 'rake'
@@ -22,12 +22,12 @@ Gem::Specification.new do |s|
2222
s.add_development_dependency 'bundler'
2323
s.add_development_dependency 'rack-test'
2424
s.add_development_dependency 'rack-cors'
25-
s.add_development_dependency 'rubocop', '0.33.0'
26-
s.add_development_dependency 'kramdown', '~> 1.4.1'
27-
s.add_development_dependency 'redcarpet', '~> 3.1.2' unless RUBY_PLATFORM.eql? 'java'
28-
s.add_development_dependency 'rouge', '~> 1.6.1'
29-
s.add_development_dependency 'pry'
30-
s.add_development_dependency 'pry-byebug'
25+
s.add_development_dependency 'rubocop'
26+
s.add_development_dependency 'kramdown'
27+
s.add_development_dependency 'redcarpet' unless RUBY_PLATFORM.eql? 'java'
28+
s.add_development_dependency 'rouge' unless RUBY_PLATFORM.eql? 'java'
29+
s.add_development_dependency 'pry' unless RUBY_PLATFORM.eql? 'java'
30+
s.add_development_dependency 'pry-byebug' unless RUBY_PLATFORM.eql? 'java'
3131

3232
s.files = `git ls-files`.split("\n")
3333
s.test_files = `git ls-files -- {test,spec}/*`.split("\n")

lib/grape-swagger.rb

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
require 'grape-swagger/version'
33
require 'grape-swagger/endpoint'
44
require 'grape-swagger/errors'
5+
require 'grape-swagger/doc_methods/produces'
56
require 'grape-swagger/doc_methods'
67
require 'grape-swagger/markdown/kramdown_adapter'
78
require 'grape-swagger/markdown/redcarpet_adapter'
@@ -88,11 +89,11 @@ def combine_namespace_routes(namespaces)
8889

8990
if namespace.options.key?(:swagger) && namespace.options[:swagger][:nested] == false
9091
# Namespace shall appear as standalone resource, use specified name or use normalized path as name
91-
if namespace.options[:swagger].key?(:name)
92-
identifier = namespace.options[:swagger][:name].tr(' ', '-')
93-
else
94-
identifier = name.tr('_', '-').gsub(/\//, '_')
95-
end
92+
identifier = if namespace.options[:swagger].key?(:name)
93+
name.tr(' ', '-')
94+
else
95+
name.tr('_', '-').gsub(/\//, '_')
96+
end
9697
@target_class.combined_namespace_identifiers[identifier] = name
9798
@target_class.combined_namespace_routes[identifier] = namespace_routes
9899

@@ -104,8 +105,8 @@ def combine_namespace_routes(namespaces)
104105
# default case when not explicitly specified or nested == true
105106
standalone_namespaces = namespaces.reject do |_, ns|
106107
!ns.options.key?(:swagger) ||
107-
!ns.options[:swagger].key?(:nested) ||
108-
ns.options[:swagger][:nested] != false
108+
!ns.options[:swagger].key?(:nested) ||
109+
ns.options[:swagger][:nested] != false
109110
end
110111

111112
parent_standalone_namespaces = standalone_namespaces.reject { |ns_name, _| !name.start_with?(ns_name) }
@@ -142,8 +143,7 @@ def route_path_start_with?(route, name)
142143
route_prefix = route.route_prefix ? "/#{route.route_prefix}/#{name}" : "/#{name}"
143144
route_versioned_prefix = route.route_prefix ? "/#{route.route_prefix}/:version/#{name}" : "/:version/#{name}"
144145

145-
route.route_path.start_with?(route_prefix) ||
146-
route.route_path.start_with?(route_versioned_prefix)
146+
route.route_path.start_with?(route_prefix, route_versioned_prefix)
147147
end
148148

149149
def standalone_sub_namespaces(name, namespaces)

lib/grape-swagger/doc_methods.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def defaults
8787
base_path: nil,
8888
markdown: false,
8989
hide_documentation_path: true,
90-
format: nil,
90+
format: :json,
9191
models: [],
9292
info: {},
9393
scheme: %w( https http ),
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module GrapeSwagger
2+
module DocMethods
3+
class Produces
4+
class << self
5+
def call(*args)
6+
return ['application/json'] unless args.flatten.present?
7+
args.flatten.map { |x| Grape::ContentTypes::CONTENT_TYPES[x] || x }.uniq
8+
end
9+
end
10+
end
11+
end
12+
end

lib/grape-swagger/endpoint.rb

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class Endpoint
1111
'byte' => %w(string byte),
1212
'date' => %w(string date),
1313
'dateTime' => %w(string date-time)
14-
}
14+
}.freeze
1515

1616
def content_types_for(target_class)
1717
content_types = (target_class.content_types || {}).values
@@ -103,7 +103,7 @@ def path_item(routes, options)
103103
path.gsub!(/:(\w+)/, '{\1}')
104104

105105
# set item from path, this could be used for the definitions object
106-
@item = path.gsub(/\/\{(.+?)\}/, '').split('/').last.singularize.underscore.camelize || 'Item'
106+
@item = path.gsub(%r{/{(.+?)}}, '').split('/').last.singularize.underscore.camelize || 'Item'
107107
@entity = route.route_entity || route.route_success
108108

109109
# ... replacing version params through submitted version
@@ -129,8 +129,7 @@ def method_object(route, options)
129129
methods[:description] = description_object(route, options[:markdown])
130130
methods[:headers] = route.route_headers if route.route_headers
131131

132-
mime_types = options[:format] ? Grape::ContentTypes::CONTENT_TYPES[options[:format]] : Grape::ContentTypes::CONTENT_TYPES[:json]
133-
methods[:produces] = [mime_types]
132+
methods[:produces] = produces_object(route, options)
134133

135134
methods[:parameters] = params_object(route)
136135
methods[:responses] = response_object(route)
@@ -150,6 +149,17 @@ def description_object(route, markdown)
150149
description
151150
end
152151

152+
def produces_object(route, options)
153+
mime_types = GrapeSwagger::DocMethods::Produces.call(options[:format])
154+
155+
route_mime_types = [:route_formats, :route_content_types, :route_produces].map do |producer|
156+
possible = route.send(producer)
157+
GrapeSwagger::DocMethods::Produces.call(possible) if possible.present?
158+
end.flatten.compact.uniq
159+
160+
route_mime_types.present? ? route_mime_types : mime_types
161+
end
162+
153163
def response_object(route)
154164
default_code = default_staus_codes[route.route_method.downcase.to_sym]
155165
default_code[:model] = @entity if @entity
@@ -165,16 +175,15 @@ def response_object(route)
165175
response_model = @item
166176
response_model = expose_params_from_model(value[:model]) if value[:model]
167177

178+
next unless !response_model.start_with?('Swagger_doc') &&
179+
((@definitions[response_model] && value[:code].to_s.start_with?('2')) || value[:model])
180+
168181
# TODO: proof that the definition exist, if model isn't specified
169-
if !response_model.start_with?('Swagger_doc') &&
170-
((!!@definitions[response_model] && value[:code].to_s.start_with?('2')) ||
171-
value[:model])
172-
if route.route_is_array
173-
memo[value[:code]][:schema] = { 'type' => 'array', 'items' => { '$ref' => "#/definitions/#{response_model}" } }
174-
else
175-
memo[value[:code]][:schema] = { '$ref' => "#/definitions/#{response_model}" }
176-
end
177-
end
182+
memo[value[:code]][:schema] = if route.route_is_array
183+
{ 'type' => 'array', 'items' => { '$ref' => "#/definitions/#{response_model}" } }
184+
else
185+
{ '$ref' => "#/definitions/#{response_model}" }
186+
end
178187
end
179188
end
180189

@@ -190,7 +199,7 @@ def default_staus_codes
190199

191200
def params_object(route)
192201
partition_params(route).map do |param, value|
193-
parse_params(param, value, route.route_path, route.route_method)
202+
parse_params(param, { required: false }.merge(value), route.route_path, route.route_method)
194203
end
195204
end
196205

@@ -230,7 +239,7 @@ def parse_request_params(parameters, required, route_paramter)
230239
end
231240

232241
def parse_response_params(params)
233-
return if params.empty?
242+
return if params.nil?
234243

235244
params.each_with_object({}) do |x, memo|
236245
x[0] = x.last[:as] if x.last[:as]
@@ -247,8 +256,15 @@ def parse_response_params(params)
247256
def expose_params_from_model(model)
248257
model_name = model.name.demodulize.camelize
249258

250-
# has to be adept, to be ready for grape-entity >0.5.0
251-
parameters = model.exposures ? model.exposures : model.documentation
259+
# DONE: has to be adept, to be ready for grape-entity >0.5.0
260+
# TODO: this should only be a temporary hack ;)
261+
if GrapeEntity::VERSION =~ /0\.4\.\d/
262+
parameters = model.exposures ? model.exposures : model.documentation
263+
elsif GrapeEntity::VERSION =~ /0\.5\.\d/
264+
parameters = model.root_exposures.each_with_object({}) do |value, memo|
265+
memo[value.attribute] = value.send(:options)
266+
end
267+
end
252268
properties = parse_response_params(parameters)
253269

254270
@definitions[model_name] = { type: 'object', properties: properties }
@@ -272,7 +288,7 @@ def hidden?(route)
272288
end
273289

274290
def parse_params(param, value, path, method)
275-
items = {}
291+
@array_items = {}
276292

277293
additional_documentation = value.is_a?(Hash) ? value[:documentation] : nil
278294
data_type = data_type(value)
@@ -282,7 +298,7 @@ def parse_params(param, value, path, method)
282298
end
283299

284300
description = value.is_a?(Hash) ? value[:desc] || value[:description] : nil
285-
required = value.is_a?(Hash) ? !!value[:required] : false
301+
required = value.is_a?(Hash) ? value[:required] : false
286302
default_value = value.is_a?(Hash) ? value[:default] : nil
287303
example = value.is_a?(Hash) ? value[:example] : nil
288304
is_array = value.is_a?(Hash) ? (value[:is_array] || false) : false
@@ -291,6 +307,7 @@ def parse_params(param, value, path, method)
291307
enum_or_range_values = parse_enum_or_range_values(values)
292308

293309
value_type = { value: value, data_type: data_type, path: path }
310+
294311
parsed_params = {
295312
in: param_type(value_type, param, method, is_array),
296313
name: name,
@@ -304,12 +321,10 @@ def parse_params(param, value, path, method)
304321
parsed_params[:type], parsed_params[:format] = PRIMITIVE_MAPPINGS[data_type]
305322
end
306323

307-
parsed_params[:items] = items if items.present?
324+
parsed_params[:items] = @array_items if @array_items.present?
308325

309326
parsed_params[:defaultValue] = example if example
310-
if default_value && example.blank?
311-
parsed_params[:defaultValue] = default_value
312-
end
327+
parsed_params[:defaultValue] = default_value if default_value && example.blank?
313328

314329
parsed_params.merge!(enum_or_range_values) if enum_or_range_values
315330
parsed_params
@@ -353,8 +368,9 @@ def param_type(value_type, param, method, is_array)
353368
value_type[:value][:documentation].key?(:param_type)
354369

355370
if is_array
356-
items = { '$ref' => value_type[:data_type] }
357-
data_type = 'array'
371+
@array_items = { 'type' => value_type[:data_type] }
372+
373+
'array'
358374
end
359375
else
360376
case

lib/grape-swagger/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module GrapeSwagger
2-
VERSION = '0.10.3'
2+
VERSION = '0.11.0'.freeze
33
end

0 commit comments

Comments
 (0)