21 Commits

Author SHA1 Message Date
Greg Myers
e130e41843 Update changelog 2019-10-18 23:25:18 +01:00
Greg Myers
5946b3c88b Merge pull request #250 from BookOfGreg/fix/swagger-generator
Point the railtie to the correct file
2019-10-18 23:22:29 +01:00
Greg Myers
c14f72a45e Point the railtie to the correct file
Fixes #248
2019-10-18 23:18:32 +01:00
Greg Myers
07c4c74d75 Update changelog 2019-10-17 00:02:09 +01:00
Greg Myers
b1e089af6a Merge pull request #204 from stefanosx/patch-1
Update README.md
2019-10-16 23:45:53 +01:00
Greg Myers
47eb1e49ee Merge pull request #245 from BookOfGreg/feature/spec_generator
Feature/spec generator
2019-10-16 23:30:08 +01:00
Greg Myers
4d29e09010 Add spec generator test 2019-10-16 23:19:24 +01:00
Greg Myers
189a7ef061 Move spec generator files, organize whitespace in generator output 2019-10-16 22:05:14 +01:00
Greg Myers
5ee880b769 Merge branch 'feature/request_spec_generator' 2019-10-16 21:12:51 +01:00
Greg Myers
778d250385 Split file join path 2019-10-16 21:12:36 +01:00
Greg Myers
dd2eaf2feb Merge pull request #75 from paulccarey/feature/request_spec_generator
adds request spec generator (shamelessly stollen from rspec-rails-swagger)
2019-10-16 21:11:20 +01:00
Greg Myers
77d00407a4 whitespace linting 2019-10-16 20:51:53 +01:00
Greg Myers
8b61984fb3 Merge branch 'master' into feature/request_spec_generator 2019-10-16 20:44:11 +01:00
Greg Myers
3542cd0857 Add a Sprockets 4 manifest
Fix #243
2019-10-14 22:17:12 +01:00
Greg Myers
b41d4e1276 Merge pull request #240 from hdpuk86/update-swagger-ui-to-3.18.2
update swagger ui to 3.18.2
2019-10-08 23:54:14 +01:00
Hayley
dc2ebd94bb update swagger ui to 3.18.2 2019-10-08 16:18:55 +01:00
Greg Myers
17d7e020e8 Merge pull request #237 from PMGH/master
Add options and trace verbs
2019-10-05 20:35:48 +01:00
Peter McCready
5c9154864e add options and trace verbs 2019-10-04 14:51:41 +01:00
Greg Myers
0246ff164f Update readme 2019-10-03 23:00:27 +01:00
stefanosx
49b5059273 Update README.md
You need to run the generation of rswag:api:install rswag:ui:install in separated lines to work
2019-03-06 12:59:24 +01:00
Paul Carey
c9bda862b6 adds request spec generator shamelessly stollen from rspec-rails-swagger 2017-07-06 10:45:54 +01:00
18 changed files with 200 additions and 23 deletions

View File

@@ -12,15 +12,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
### Security
## [2.1.1] - 2019-10-18
### Fixed
- Fix incorrect require reference for swagger_generator [#248](https://github.com/rswag/rswag/issues/248)
## [2.1.0] - 2019-10-17
### Added
- New Spec Generator [#75](https://github.com/rswag/rswag/pull/75)
- Support for Options and Trace verbs; You must use a framework that supports this, for Options Rails 6.1+ Rails 6 does not support Trace. [#237](https://github.com/rswag/rswag/pull/75)
### Changed
- Update swagger-ui to 3.18.2 [#240](https://github.com/rswag/rswag/pull/240)
## [2.0.6] - 2019-10-03
### Added
- Support for Rails 6 [#228](https://github.com/rswag/rswag/pull/228)
- Support for Windows paths [#176](https://github.com/rswag/rswag/pull/176)
### Changed
- Show response body when error code is not expected [#117](https://github.com/rswag/rswag/pull/177)
### Deprecated
### Removed
### Fixed
### Security
## [2.0.5] - 2018-07-10

View File

@@ -14,8 +14,8 @@ Once you have an API that can describe itself in Swagger, you've opened the trea
|Rswag Version|Swagger (OpenAPI) Spec.|swagger-ui|
|----------|----------|----------|
|[master](https://github.com/rswag/rswag/tree/master)|2.0|3.17.3|
|[2.0.5](https://github.com/rswag/rswag/tree/2.0.4)|2.0|3.17.3|
|[master](https://github.com/rswag/rswag/tree/master)|2.0|3.18.2|
|[2.0.6](https://github.com/rswag/rswag/tree/2.0.6)|2.0|3.17.3|
|[1.6.0](https://github.com/rswag/rswag/tree/1.6.0)|2.0|2.2.5|
## Getting Started ##
@@ -48,7 +48,8 @@ Once you have an API that can describe itself in Swagger, you've opened the trea
Or run the install generators for each package separately if you installed Rswag as separate gems, as indicated above:
```ruby
rails g rswag:api:install rswag:ui:install
rails g rswag:api:install
rails g rswag:ui:install
RAILS_ENV=test rails g rswag:specs:install
```

View File

@@ -0,0 +1,9 @@
Description:
This creates an RSpec request spec to define Swagger documentation for a
controller. It will create a test for each of the controller's methods.
Example:
rails generate rspec:swagger V3::AccountsController
This will create:
spec/requests/v3/accounts_spec.rb

View File

@@ -0,0 +1,22 @@
require 'rswag/route_parser'
require 'rails/generators'
module Rspec
class SwaggerGenerator < ::Rails::Generators::NamedBase
source_root File.expand_path('../templates', __FILE__)
def setup
@routes = Rswag::RouteParser.new(controller_path).routes
end
def create_spec_file
template 'spec.rb', File.join('spec', 'requests', "#{controller_path}_spec.rb")
end
private
def controller_path
file_path.chomp('_controller')
end
end
end

View File

@@ -0,0 +1,30 @@
require 'swagger_helper'
RSpec.describe '<%= controller_path %>', type: :request do
<% @routes.each do | template, path_item | %>
path '<%= template %>' do
<% unless path_item[:params].empty? -%>
# You'll want to customize the parameter types...
<% path_item[:params].each do |param| -%>
parameter name: '<%= param %>', in: :path, type: :string, description: '<%= param %>'
<% end -%>
<% end -%>
<% path_item[:actions].each do | action, details | %>
<%= action %>('<%= details[:summary] %>') do
response(200, 'successful') do
<% unless path_item[:params].empty? -%>
<% path_item[:params].each do |param| -%>
let(:<%= param %>) { '123' }
<% end -%>
<% end -%>
after do |example|
example.metadata[:response][:examples] = { 'application/json' => JSON.parse(response.body, symbolize_names: true) }
end
run_test!
end
end
<% end -%>
end
<% end -%>
end

View File

@@ -0,0 +1,58 @@
module Rswag
class RouteParser
attr_reader :controller
def initialize(controller)
@controller = controller
end
def routes
::Rails.application.routes.routes.select do |route|
route.defaults[:controller] == controller
end.reduce({}) do |tree, route|
path = path_from(route)
verb = verb_from(route)
tree[path] ||= { params: params_from(route), actions: {} }
tree[path][:actions][verb] = { summary: summary_from(route) }
tree
end
end
private
def path_from(route)
route.path.spec.to_s
.chomp('(.:format)') # Ignore any format suffix
.gsub(/:([^\/.?]+)/, '{\1}') # Convert :id to {id}
end
def verb_from(route)
verb = route.verb
if verb.kind_of? String
verb.downcase
else
verb.source.gsub(/[$^]/, '').downcase
end
end
def summary_from(route)
verb = route.requirements[:action]
noun = route.requirements[:controller].split('/').last.singularize
# Apply a few customizations to make things more readable
case verb
when 'index'
verb = 'list'
noun = noun.pluralize
when 'destroy'
verb = 'delete'
end
"#{verb} #{noun}"
end
def params_from(route)
route.segments - ['format']
end
end
end

View File

@@ -7,7 +7,7 @@ module Rswag
describe(template, metadata, &block)
end
[ :get, :post, :patch, :put, :delete, :head ].each do |verb|
[ :get, :post, :patch, :put, :delete, :head, :options, :trace ].each do |verb|
define_method(verb) do |summary, &block|
api_metadata = { operation: { verb: verb, summary: summary } }
describe(verb, api_metadata, &block)

View File

@@ -5,6 +5,10 @@ module Rswag
rake_tasks do
load File.expand_path('../../../tasks/rswag-specs_tasks.rake', __FILE__)
end
generators do
require 'generators/rspec/swagger_generator.rb'
end
end
end
end

View File

@@ -0,0 +1,44 @@
require 'generator_spec'
require 'generators/rspec/swagger_generator'
require 'tmpdir'
module Rspec
describe SwaggerGenerator do
include GeneratorSpec::TestCase
destination Dir.mktmpdir
before(:all) do
prepare_destination
fixtures_dir = File.expand_path('../fixtures', __FILE__)
FileUtils.cp_r("#{fixtures_dir}/spec", destination_root)
end
after(:all) do
end
it 'installs the swagger_helper for rspec' do
allow_any_instance_of(Rswag::RouteParser).to receive(:routes).and_return(fake_routes)
run_generator ['Posts::CommentsController']
assert_file('spec/requests/posts/comments_spec.rb') do |content|
assert_match(/parameter name: 'post_id', in: :path, type: :string/, content)
assert_match(/patch\('update_comments comment'\)/, content)
end
end
private
def fake_routes
{
"/posts/{post_id}/comments/{id}" => {
:params => ["post_id", "id"],
:actions => {
"get" => { :summary=>"show comment" },
"patch" => { :summary=>"update_comments comment" }
}
}
}
end
end
end

View File

@@ -24,7 +24,7 @@ module Rswag
end
end
describe '#get|post|patch|put|delete|head(verb, summary)' do
describe '#get|post|patch|put|delete|head|options|trace(verb, summary)' do
before { subject.post('Creates a blog') }
it "delegates to 'describe' with 'operation' metadata" do

View File

@@ -5,9 +5,9 @@
"requires": true,
"dependencies": {
"swagger-ui-dist": {
"version": "3.17.3",
"resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.17.3.tgz",
"integrity": "sha1-37lkCMzEZ3UVX3NpGQxdSyAW/lw="
"version": "3.18.2",
"resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.18.2.tgz",
"integrity": "sha512-pWAEiKkgWUJvjmLW9AojudnutJ+NTn5g6OdNLj1iIJWwCkoy40K3Upwa24DqFbmIE4vLX4XplND61hp2L+s5vg=="
}
}
}

View File

@@ -3,6 +3,6 @@
"version": "1.0.0",
"private": true,
"dependencies": {
"swagger-ui-dist": "3.17.3"
"swagger-ui-dist": "3.18.2"
}
}

View File

@@ -0,0 +1,2 @@
//= link_tree ../images
//= link_directory ../stylesheets .css

View File

View File

@@ -2,15 +2,15 @@
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# This file is the source Rails uses to define your schema when running `rails
# db:schema:load`. When creating a new database, `rails db:schema:load` tends to
# be faster and is potentially less error prone than running all of your
# migrations from scratch. Old migrations may fail to apply correctly if those
# migrations use external dependencies or application code.
# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2016_02_18_212104) do
ActiveRecord::Schema.define(version: 20160218212104) do
create_table "blogs", force: :cascade do |t|
t.string "title"