mirror of
https://github.com/ditkrg/jsonapi-swagger.git
synced 2026-01-22 13:56:54 +00:00
init
This commit is contained in:
commit
c2666cec53
9
.gitignore
vendored
Normal file
9
.gitignore
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
/.bundle/
|
||||
/.yardoc
|
||||
/_yardoc/
|
||||
/coverage/
|
||||
/doc/
|
||||
/pkg/
|
||||
/spec/reports/
|
||||
/tmp/
|
||||
Gemfile.lock
|
||||
6
Gemfile
Normal file
6
Gemfile
Normal file
@ -0,0 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
source 'https://rubygems.org'
|
||||
|
||||
# Specify your gem's dependencies in jsonapi-swagger.gemspec
|
||||
gemspec
|
||||
29
README.md
Normal file
29
README.md
Normal file
@ -0,0 +1,29 @@
|
||||
# JSONAPI Swagger
|
||||
|
||||
Create a JSONAPI Swagger.
|
||||
|
||||
## Installation
|
||||
|
||||
Add this line to your application's Gemfile:
|
||||
|
||||
```ruby
|
||||
gem 'jsonapi-swagger'
|
||||
```
|
||||
|
||||
And then execute:
|
||||
|
||||
$ bundle
|
||||
|
||||
Or install it yourself as:
|
||||
|
||||
$ gem install jsonapi-swagger
|
||||
|
||||
## Usage
|
||||
|
||||
```sh
|
||||
rails generate jsonapi:swagger User # UserResponse < JSONAPI::Resource
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
Bug reports and pull requests are welcome on GitHub at https://github.com/superiorlu/jsonapi-swagger.
|
||||
4
Rakefile
Normal file
4
Rakefile
Normal file
@ -0,0 +1,4 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'bundler/gem_tasks'
|
||||
task default: :spec
|
||||
15
bin/console
Executable file
15
bin/console
Executable file
@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env ruby
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'bundler/setup'
|
||||
require 'jsonapi/swagger'
|
||||
|
||||
# You can add fixtures and/or initialization code here to make experimenting
|
||||
# with your gem easier. You can also use a different console, if you like.
|
||||
|
||||
# (If you use this, don't forget to add pry to your Gemfile!)
|
||||
# require "pry"
|
||||
# Pry.start
|
||||
|
||||
require 'irb'
|
||||
IRB.start(__FILE__)
|
||||
8
bin/setup
Executable file
8
bin/setup
Executable file
@ -0,0 +1,8 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
IFS=$'\n\t'
|
||||
set -vx
|
||||
|
||||
bundle install
|
||||
|
||||
# Do any other automated setup that you need to do here
|
||||
37
jsonapi-swagger.gemspec
Normal file
37
jsonapi-swagger.gemspec
Normal file
@ -0,0 +1,37 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
lib = File.expand_path('lib', __dir__)
|
||||
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
||||
require 'jsonapi/swagger/version'
|
||||
|
||||
Gem::Specification.new do |spec|
|
||||
spec.name = 'jsonapi-swagger'
|
||||
spec.version = Jsonapi::Swagger::VERSION
|
||||
spec.authors = ['YingRui Lu']
|
||||
spec.email = ['yingruilu518@gmail.com']
|
||||
|
||||
spec.summary = 'JSON API Swagger Doc Generator'
|
||||
spec.homepage = 'https://github.com/superiorlu/jsonapi-swagger'
|
||||
|
||||
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
||||
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
||||
if spec.respond_to?(:metadata)
|
||||
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
||||
else
|
||||
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
||||
'public gem pushes.'
|
||||
end
|
||||
|
||||
# Specify which files should be added to the gem when it is released.
|
||||
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
||||
spec.files = Dir['lib/**/*', 'LICENSE.md', 'README.md']
|
||||
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
||||
spec.require_paths = ['lib']
|
||||
spec.licenses = ['MIT']
|
||||
|
||||
spec.add_development_dependency 'bundler', '~> 2.0'
|
||||
spec.add_development_dependency 'rake', '~> 10.0'
|
||||
spec.add_development_dependency 'rubocop', '~> 0.67'
|
||||
|
||||
spec.add_dependency 'rswag', '~>2.0'
|
||||
end
|
||||
0
lib/generators/jsonapi/swagger/USAGE
Normal file
0
lib/generators/jsonapi/swagger/USAGE
Normal file
48
lib/generators/jsonapi/swagger/swagger_generator.rb
Normal file
48
lib/generators/jsonapi/swagger/swagger_generator.rb
Normal file
@ -0,0 +1,48 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Jsonapi
|
||||
class SwaggerGenerator < ::Rails::Generators::NamedBase
|
||||
source_root File.expand_path('templates', __dir__)
|
||||
|
||||
def copy_serializable_file
|
||||
template 'swagger.rb.erb',
|
||||
File.join('spec/requests', class_path,
|
||||
"#{spec_file_name}.rb")
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def spec_file_name
|
||||
"#{file_name}_spec.rb"
|
||||
end
|
||||
|
||||
def serializable_class_name
|
||||
(class_path + [serializable_file_name]).map!(&:camelize).join('::')
|
||||
end
|
||||
|
||||
def model_klass
|
||||
# TODO(beauby): Ensure the model class exists.
|
||||
class_name.safe_constantize
|
||||
end
|
||||
|
||||
def type
|
||||
model_klass.model_name.plural
|
||||
end
|
||||
|
||||
def attr_names
|
||||
attrs = model_klass.new.attribute_names - ['id']
|
||||
fk_attrs = model_klass.reflect_on_all_associations(:belongs_to)
|
||||
.map(&:foreign_key)
|
||||
attrs - fk_attrs
|
||||
end
|
||||
|
||||
def has_one_rel_names
|
||||
model_klass.reflect_on_all_associations(:has_one).map(&:name) +
|
||||
model_klass.reflect_on_all_associations(:belongs_to).map(&:name)
|
||||
end
|
||||
|
||||
def has_many_rel_names
|
||||
model_klass.reflect_on_all_associations(:has_many).map(&:name)
|
||||
end
|
||||
end
|
||||
end
|
||||
150
lib/generators/jsonapi/swagger/templates/swagger.rb.erb
Normal file
150
lib/generators/jsonapi/swagger/templates/swagger.rb.erb
Normal file
@ -0,0 +1,150 @@
|
||||
require 'swagger_helper'
|
||||
RSpec.describe '<%= resouces_name %>', type: :request do
|
||||
<% if resource_klass.immutable -%>
|
||||
path '/<%= route_resouces %>' do
|
||||
get '<%= route_resouces %>' do
|
||||
tags '<%= route_resouces %>'
|
||||
produces 'application/vnd.api+json'
|
||||
parameter name: :'page[number]', in: :query, type: :string, description: '页码', required: false
|
||||
parameter name: :include, in: :query, type: :string, description: '包含关联数据', required: false
|
||||
<% relationships.keys.each do |relation| -%>
|
||||
parameter name: :'fields[<%= relation %>]', in: :query, type: :string, description: '包含字段', required: false
|
||||
<% end -%>
|
||||
response '200', '获取列表' do
|
||||
schema type: :object,
|
||||
properties: {
|
||||
data: {
|
||||
type: :array,
|
||||
items: {
|
||||
type: :object,
|
||||
properties: {
|
||||
id: { type: :integer, description: 'ID'},
|
||||
links: {
|
||||
type: :object,
|
||||
properties: {
|
||||
self: { type: :string, description: '详情链接'},
|
||||
},
|
||||
description: '详情链接'
|
||||
},
|
||||
attributes: {
|
||||
type: :object,
|
||||
properties: {
|
||||
<% attributes.keys.each do |attr| -%>
|
||||
<%= attr %>: { type: :<%= columns_with_comment[attr][:type] %>, description: '<%= columns_with_comment[attr][:comment] %>'},
|
||||
<% end -%>
|
||||
},
|
||||
description: '属性'
|
||||
},
|
||||
relationships: {
|
||||
type: :object,
|
||||
properties: {
|
||||
<% relationships.each do |relation_name, relation| -%>
|
||||
<% relation_name_camelize = relation_name.to_s.camelize -%>
|
||||
<%= relation_name %>: {
|
||||
type: :object,
|
||||
properties: {
|
||||
links: {
|
||||
type: :object,
|
||||
properties: {
|
||||
self: { type: :string, description: '关联<%= relation_name_camelize %>列表链接' },
|
||||
related: { type: :string, description: '相关<%= relation_name_camelize %>链接' },
|
||||
},
|
||||
description: '相关的<%= relation_name_camelize %>链接'
|
||||
},
|
||||
},
|
||||
description: '相关<%= relation_name_camelize %>'
|
||||
},
|
||||
<% end -%>
|
||||
},
|
||||
description: '关联数据'
|
||||
}
|
||||
},
|
||||
},
|
||||
description: '数据'
|
||||
},
|
||||
meta: {
|
||||
type: :object,
|
||||
properties: {
|
||||
record_count: { type: :integer, description: '总记录数'},
|
||||
page_count: { type: :integer, description: '页数'},
|
||||
},
|
||||
description: '分页记录数'
|
||||
},
|
||||
links: { type: :array, items: { type: :string }, description: '分页链接' },
|
||||
},
|
||||
required: [:data]
|
||||
run_test!
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
path '/<%= route_resouces %>/{id}' do
|
||||
get '<%= route_resouces %>详情' do
|
||||
tags '<%= route_resouces %>'
|
||||
produces 'application/vnd.api+json'
|
||||
parameter name: :id, in: :path, type: :integer, description: 'ID', required: true
|
||||
|
||||
response '200', '获取详情' do
|
||||
schema type: :object,
|
||||
properties: {
|
||||
data: {
|
||||
type: :array,
|
||||
items: {
|
||||
type: :object,
|
||||
properties: {
|
||||
id: { type: :integer, description: 'ID'},
|
||||
links: {
|
||||
type: :object,
|
||||
properties: {
|
||||
self: { type: :string, description: '详情链接'},
|
||||
},
|
||||
description: '详情链接'
|
||||
},
|
||||
attributes: {
|
||||
type: :object,
|
||||
properties: {
|
||||
<% attributes.keys.each do |attr| -%>
|
||||
<%= attr %>: { type: :<%= columns_with_comment[attr][:type] %>, description: '<%= columns_with_comment[attr][:comment] %>'},
|
||||
<% end -%>
|
||||
},
|
||||
description: '属性'
|
||||
},
|
||||
relationships: {
|
||||
type: :object,
|
||||
properties: {
|
||||
<% relationships.each do |relation_name, relation| -%>
|
||||
<% relation_name_camelize = relation_name.to_s.camelize -%>
|
||||
<%= relation_name %>: {
|
||||
type: :object,
|
||||
properties: {
|
||||
links: {
|
||||
type: :object,
|
||||
properties: {
|
||||
self: { type: :string, description: '关联<%= relation_name_camelize %>列表链接' },
|
||||
related: { type: :string, description: '相关<%= relation_name_camelize %>链接' },
|
||||
},
|
||||
description: '相关的<%= relation_name_camelize %>链接'
|
||||
},
|
||||
},
|
||||
description: '相关<%= relation_name_camelize %>'
|
||||
},
|
||||
<% end -%>
|
||||
|
||||
|
||||
|
||||
},
|
||||
description: '关联数据'
|
||||
}
|
||||
},
|
||||
},
|
||||
description: '数据'
|
||||
},
|
||||
},
|
||||
required: [:data]
|
||||
run_test!
|
||||
end
|
||||
end
|
||||
end
|
||||
<% else -%>
|
||||
<% end -%>
|
||||
end
|
||||
10
lib/jsonapi/swagger.rb
Normal file
10
lib/jsonapi/swagger.rb
Normal file
@ -0,0 +1,10 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'jsonapi/swagger/version'
|
||||
|
||||
module Jsonapi
|
||||
module Swagger
|
||||
class Error < StandardError; end
|
||||
# Your code goes here...
|
||||
end
|
||||
end
|
||||
7
lib/jsonapi/swagger/version.rb
Normal file
7
lib/jsonapi/swagger/version.rb
Normal file
@ -0,0 +1,7 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Jsonapi
|
||||
module Swagger
|
||||
VERSION = '0.1.0'
|
||||
end
|
||||
end
|
||||
Loading…
Reference in New Issue
Block a user