rswag-specs 2.0.6 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ea0b695d0762fd3d465ded216a3227852396ee711121bc75599695c1cf1a0f7b
4
- data.tar.gz: 4c297a6f19905c8be024616aa4ac480482097e3c9c4bb491a25fc1747d2bec9d
3
+ metadata.gz: d360f480ad502e00f5951e40882af98b2b1cc9f4d414c65e41495ca77494a3b0
4
+ data.tar.gz: 7492e978e971b80560cc1eba26b0b7426c6145745e6dea93be46a58ff200965f
5
5
  SHA512:
6
- metadata.gz: 887dea23d1f139a17c35f38398ade4aaa6b7de86d89cb1f917d675717d96c403e173e31080fa8370a00515dfb1c26bdba71a362c48d6a7d8e03d78d6680f71df
7
- data.tar.gz: 331518551742470b3e017daee643f54785f559bf9f8a5cb3edb4a705833dc1989a107223f5fc54ad2b2656ac1004468e34498986c0b564f63bbc67b123963250
6
+ metadata.gz: 352cd0dd07a2c39626f58388ffa1b069f30c538d666bab8206f7c027df7412a3fcaac79a9855e7c260b0c4a98ea0d5c58e12503cd665701a9ccfdeac6c9bf19c
7
+ data.tar.gz: bf66adcb9ff47d01fe283782f87bb4a6ec996e72eddd1850cb498f81b665aecf49393bb480fad81b1ee71f68cd03dc90307658b9b1b02c66be976dd547bba816
@@ -0,0 +1,9 @@
1
+ Description:
2
+ This creates an RSpec request spec to define Swagger documentation for a
3
+ controller. It will create a test for each of the controller's methods.
4
+
5
+ Example:
6
+ rails generate rspec:swagger V3::AccountsController
7
+
8
+ This will create:
9
+ spec/requests/v3/accounts_spec.rb
@@ -0,0 +1,22 @@
1
+ require 'rswag/route_parser'
2
+ require 'rails/generators'
3
+
4
+ module Rspec
5
+ class SwaggerGenerator < ::Rails::Generators::NamedBase
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ def setup
9
+ @routes = Rswag::RouteParser.new(controller_path).routes
10
+ end
11
+
12
+ def create_spec_file
13
+ template 'spec.rb', File.join('spec', 'requests', "#{controller_path}_spec.rb")
14
+ end
15
+
16
+ private
17
+
18
+ def controller_path
19
+ file_path.chomp('_controller')
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,30 @@
1
+ require 'swagger_helper'
2
+
3
+ RSpec.describe '<%= controller_path %>', type: :request do
4
+ <% @routes.each do | template, path_item | %>
5
+ path '<%= template %>' do
6
+ <% unless path_item[:params].empty? -%>
7
+ # You'll want to customize the parameter types...
8
+ <% path_item[:params].each do |param| -%>
9
+ parameter name: '<%= param %>', in: :path, type: :string, description: '<%= param %>'
10
+ <% end -%>
11
+ <% end -%>
12
+ <% path_item[:actions].each do | action, details | %>
13
+ <%= action %>('<%= details[:summary] %>') do
14
+ response(200, 'successful') do
15
+ <% unless path_item[:params].empty? -%>
16
+ <% path_item[:params].each do |param| -%>
17
+ let(:<%= param %>) { '123' }
18
+ <% end -%>
19
+ <% end -%>
20
+
21
+ after do |example|
22
+ example.metadata[:response][:examples] = { 'application/json' => JSON.parse(response.body, symbolize_names: true) }
23
+ end
24
+ run_test!
25
+ end
26
+ end
27
+ <% end -%>
28
+ end
29
+ <% end -%>
30
+ end
@@ -0,0 +1,58 @@
1
+ module Rswag
2
+ class RouteParser
3
+ attr_reader :controller
4
+
5
+ def initialize(controller)
6
+ @controller = controller
7
+ end
8
+
9
+ def routes
10
+ ::Rails.application.routes.routes.select do |route|
11
+ route.defaults[:controller] == controller
12
+ end.reduce({}) do |tree, route|
13
+ path = path_from(route)
14
+ verb = verb_from(route)
15
+ tree[path] ||= { params: params_from(route), actions: {} }
16
+ tree[path][:actions][verb] = { summary: summary_from(route) }
17
+ tree
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def path_from(route)
24
+ route.path.spec.to_s
25
+ .chomp('(.:format)') # Ignore any format suffix
26
+ .gsub(/:([^\/.?]+)/, '{\1}') # Convert :id to {id}
27
+ end
28
+
29
+ def verb_from(route)
30
+ verb = route.verb
31
+ if verb.kind_of? String
32
+ verb.downcase
33
+ else
34
+ verb.source.gsub(/[$^]/, '').downcase
35
+ end
36
+ end
37
+
38
+ def summary_from(route)
39
+ verb = route.requirements[:action]
40
+ noun = route.requirements[:controller].split('/').last.singularize
41
+
42
+ # Apply a few customizations to make things more readable
43
+ case verb
44
+ when 'index'
45
+ verb = 'list'
46
+ noun = noun.pluralize
47
+ when 'destroy'
48
+ verb = 'delete'
49
+ end
50
+
51
+ "#{verb} #{noun}"
52
+ end
53
+
54
+ def params_from(route)
55
+ route.segments - ['format']
56
+ end
57
+ end
58
+ end
@@ -7,7 +7,7 @@ module Rswag
7
7
  describe(template, metadata, &block)
8
8
  end
9
9
 
10
- [ :get, :post, :patch, :put, :delete, :head ].each do |verb|
10
+ [ :get, :post, :patch, :put, :delete, :head, :options, :trace ].each do |verb|
11
11
  define_method(verb) do |summary, &block|
12
12
  api_metadata = { operation: { verb: verb, summary: summary } }
13
13
  describe(verb, api_metadata, &block)
@@ -3,7 +3,7 @@ require 'json-schema'
3
3
  module Rswag
4
4
  module Specs
5
5
  class ExtendedSchema < JSON::Schema::Draft4
6
-
6
+
7
7
  def initialize
8
8
  super
9
9
  @attributes['type'] = ExtendedTypeAttribute
@@ -13,7 +13,7 @@ module Rswag
13
13
  end
14
14
 
15
15
  class ExtendedTypeAttribute < JSON::Schema::TypeV4Attribute
16
-
16
+
17
17
  def self.validate(current_schema, data, fragments, processor, validator, options={})
18
18
  return if data.nil? && current_schema.schema['x-nullable'] == true
19
19
  super
@@ -5,6 +5,10 @@ module Rswag
5
5
  rake_tasks do
6
6
  load File.expand_path('../../../tasks/rswag-specs_tasks.rake', __FILE__)
7
7
  end
8
+
9
+ generators do
10
+ require 'generators/rspec/swagger/swagger_generator.rb'
11
+ end
8
12
  end
9
13
  end
10
14
  end
@@ -54,7 +54,7 @@ module Rswag
54
54
  definitions[key]
55
55
  end
56
56
 
57
- def add_verb(request, metadata)
57
+ def add_verb(request, metadata)
58
58
  request[:verb] = metadata[:operation][:verb]
59
59
  end
60
60
 
@@ -104,7 +104,7 @@ module Rswag
104
104
  end
105
105
 
106
106
  # Content-Type header
107
- consumes = metadata[:operation][:consumes] || swagger_doc[:consumes]
107
+ consumes = metadata[:operation][:consumes] || swagger_doc[:consumes]
108
108
  if consumes
109
109
  content_type = example.respond_to?(:'Content-Type') ? example.send(:'Content-Type') : consumes.first
110
110
  tuples << [ 'Content-Type', content_type ]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rswag-specs
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.6
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richie Morris
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-03 00:00:00.000000000 Z
11
+ date: 2019-10-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -74,9 +74,13 @@ extra_rdoc_files: []
74
74
  files:
75
75
  - MIT-LICENSE
76
76
  - Rakefile
77
+ - lib/generators/rspec/USAGE
78
+ - lib/generators/rspec/swagger_generator.rb
79
+ - lib/generators/rspec/templates/spec.rb
77
80
  - lib/generators/rswag/specs/install/USAGE
78
81
  - lib/generators/rswag/specs/install/install_generator.rb
79
82
  - lib/generators/rswag/specs/install/templates/swagger_helper.rb
83
+ - lib/rswag/route_parser.rb
80
84
  - lib/rswag/specs.rb
81
85
  - lib/rswag/specs/configuration.rb
82
86
  - lib/rswag/specs/example_group_helpers.rb