jsonapi-swagger 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ea93978c9a08288cd98899e5d3503a270be4093954bb073689f0c026771dc7ad
4
+ data.tar.gz: 0a1d89cb33b692d5fd460b03d5a7983f9b24bbdf92a6563c1cd165eb2d47e825
5
+ SHA512:
6
+ metadata.gz: ebe4803bee8ad8f5f0b52797c9ebdad9f6a425d3b308c58cbcc119fe43da9d4ff1732e9e4c195db34f0c3eb9df83ee1d9349650132ecfe079bcd3cd4305283ad
7
+ data.tar.gz: d845a4f4e6147dbe2c74e89802177834a67f9f1dd9d06e4c827659b639de98277a6d5757ad95b27ac43712bb89f64ea6c3c13b0a9bca29746fa20122ff0a45a1
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # JSONAPI Swagger
2
+
3
+ Create a JSONAPI Swagger.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'jsonapi-swagger'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install jsonapi-swagger
20
+
21
+ ## Usage
22
+
23
+ ```sh
24
+ rails generate jsonapi:swagger User # UserResponse < JSONAPI::Resource
25
+ ```
26
+
27
+ ## Contributing
28
+
29
+ Bug reports and pull requests are welcome on GitHub at https://github.com/superiorlu/jsonapi-swagger.
File without changes
@@ -0,0 +1,68 @@
1
+ module Jsonapi
2
+ class SwaggerGenerator < Rails::Generators::NamedBase
3
+ desc 'Create a JSONAPI Swagger.'
4
+ source_root File.expand_path('templates', __dir__)
5
+
6
+ def create_swagger_file
7
+ swagger_file = File.join(
8
+ 'spec/requests',
9
+ class_path,
10
+ spec_file_name
11
+ )
12
+ template 'swagger.rb.erb', swagger_file
13
+ end
14
+
15
+ private
16
+
17
+ def spec_file_name
18
+ "#{file_name.downcase.pluralize}_spec.rb"
19
+ end
20
+
21
+ def resouces_name
22
+ model_class_name.pluralize
23
+ end
24
+
25
+ def route_resouces
26
+ resouces_name.downcase.gsub('::', '/')
27
+ end
28
+
29
+ def model_class_name
30
+ (class_path + [file_name]).map!(&:camelize).join("::")
31
+ end
32
+
33
+ def model_klass
34
+ model_class_name.safe_constantize
35
+ end
36
+
37
+ def resource_klass
38
+ "#{model_class_name}Resource".safe_constantize
39
+ end
40
+
41
+ def attributes
42
+ resource_klass._attributes.except(:id)
43
+ end
44
+
45
+ def relationships
46
+ resource_klass._relationships
47
+ end
48
+
49
+ def columns_with_comment
50
+ @columns_with_comment ||= {}.tap do |clos|
51
+ model_klass.columns.each do |col|
52
+ clos[col.name.to_sym] = { type: swagger_type(col.type), comment: safe_encode(col.comment) }
53
+ end
54
+ end
55
+ end
56
+
57
+ def swagger_type(type)
58
+ case type
59
+ when :bigint, :integer then 'integer'
60
+ else 'string'
61
+ end
62
+ end
63
+
64
+ def safe_encode(comment)
65
+ comment&.force_encoding('ASCII-8BIT')
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,150 @@
1
+ require 'swagger_helper'
2
+ RSpec.describe '<%= resouces_name %>', type: :request do
3
+ <% if resource_klass.immutable -%>
4
+ path '/<%= route_resouces %>' do
5
+ get '<%= route_resouces %>' do
6
+ tags '<%= route_resouces %>'
7
+ produces 'application/vnd.api+json'
8
+ parameter name: :'page[number]', in: :query, type: :string, description: '页码', required: false
9
+ parameter name: :include, in: :query, type: :string, description: '包含关联数据', required: false
10
+ <% relationships.keys.each do |relation| -%>
11
+ parameter name: :'fields[<%= relation %>]', in: :query, type: :string, description: '包含字段', required: false
12
+ <% end -%>
13
+ response '200', '获取列表' do
14
+ schema type: :object,
15
+ properties: {
16
+ data: {
17
+ type: :array,
18
+ items: {
19
+ type: :object,
20
+ properties: {
21
+ id: { type: :integer, description: 'ID'},
22
+ links: {
23
+ type: :object,
24
+ properties: {
25
+ self: { type: :string, description: '详情链接'},
26
+ },
27
+ description: '详情链接'
28
+ },
29
+ attributes: {
30
+ type: :object,
31
+ properties: {
32
+ <% attributes.keys.each do |attr| -%>
33
+ <%= attr %>: { type: :<%= columns_with_comment[attr][:type] %>, description: '<%= columns_with_comment[attr][:comment] %>'},
34
+ <% end -%>
35
+ },
36
+ description: '属性'
37
+ },
38
+ relationships: {
39
+ type: :object,
40
+ properties: {
41
+ <% relationships.each do |relation_name, relation| -%>
42
+ <% relation_name_camelize = relation_name.to_s.camelize -%>
43
+ <%= relation_name %>: {
44
+ type: :object,
45
+ properties: {
46
+ links: {
47
+ type: :object,
48
+ properties: {
49
+ self: { type: :string, description: '关联<%= relation_name_camelize %>列表链接' },
50
+ related: { type: :string, description: '相关<%= relation_name_camelize %>链接' },
51
+ },
52
+ description: '相关的<%= relation_name_camelize %>链接'
53
+ },
54
+ },
55
+ description: '相关<%= relation_name_camelize %>'
56
+ },
57
+ <% end -%>
58
+ },
59
+ description: '关联数据'
60
+ }
61
+ },
62
+ },
63
+ description: '数据'
64
+ },
65
+ meta: {
66
+ type: :object,
67
+ properties: {
68
+ record_count: { type: :integer, description: '总记录数'},
69
+ page_count: { type: :integer, description: '页数'},
70
+ },
71
+ description: '分页记录数'
72
+ },
73
+ links: { type: :array, items: { type: :string }, description: '分页链接' },
74
+ },
75
+ required: [:data]
76
+ run_test!
77
+ end
78
+ end
79
+ end
80
+
81
+ path '/<%= route_resouces %>/{id}' do
82
+ get '<%= route_resouces %>详情' do
83
+ tags '<%= route_resouces %>'
84
+ produces 'application/vnd.api+json'
85
+ parameter name: :id, in: :path, type: :integer, description: 'ID', required: true
86
+
87
+ response '200', '获取详情' do
88
+ schema type: :object,
89
+ properties: {
90
+ data: {
91
+ type: :array,
92
+ items: {
93
+ type: :object,
94
+ properties: {
95
+ id: { type: :integer, description: 'ID'},
96
+ links: {
97
+ type: :object,
98
+ properties: {
99
+ self: { type: :string, description: '详情链接'},
100
+ },
101
+ description: '详情链接'
102
+ },
103
+ attributes: {
104
+ type: :object,
105
+ properties: {
106
+ <% attributes.keys.each do |attr| -%>
107
+ <%= attr %>: { type: :<%= columns_with_comment[attr][:type] %>, description: '<%= columns_with_comment[attr][:comment] %>'},
108
+ <% end -%>
109
+ },
110
+ description: '属性'
111
+ },
112
+ relationships: {
113
+ type: :object,
114
+ properties: {
115
+ <% relationships.each do |relation_name, relation| -%>
116
+ <% relation_name_camelize = relation_name.to_s.camelize -%>
117
+ <%= relation_name %>: {
118
+ type: :object,
119
+ properties: {
120
+ links: {
121
+ type: :object,
122
+ properties: {
123
+ self: { type: :string, description: '关联<%= relation_name_camelize %>列表链接' },
124
+ related: { type: :string, description: '相关<%= relation_name_camelize %>链接' },
125
+ },
126
+ description: '相关的<%= relation_name_camelize %>链接'
127
+ },
128
+ },
129
+ description: '相关<%= relation_name_camelize %>'
130
+ },
131
+ <% end -%>
132
+
133
+
134
+
135
+ },
136
+ description: '关联数据'
137
+ }
138
+ },
139
+ },
140
+ description: '数据'
141
+ },
142
+ },
143
+ required: [:data]
144
+ run_test!
145
+ end
146
+ end
147
+ end
148
+ <% else -%>
149
+ <% end -%>
150
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jsonapi
4
+ module Swagger
5
+ VERSION = '0.1.0'
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'jsonapi/swagger/version'
4
+
5
+ module Jsonapi
6
+ module Swagger
7
+ class Error < StandardError; end
8
+ # Your code goes here...
9
+ end
10
+ end
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jsonapi-swagger
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - YingRui Lu
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-04-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.67'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.67'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rswag
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.0'
69
+ description:
70
+ email:
71
+ - yingruilu518@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - README.md
77
+ - lib/generators/jsonapi/swagger/USAGE
78
+ - lib/generators/jsonapi/swagger/swagger_generator.rb
79
+ - lib/generators/jsonapi/swagger/templates/swagger.rb.erb
80
+ - lib/jsonapi/swagger.rb
81
+ - lib/jsonapi/swagger/version.rb
82
+ homepage: https://github.com/superiorlu/jsonapi-swagger
83
+ licenses:
84
+ - MIT
85
+ metadata:
86
+ allowed_push_host: https://rubygems.org
87
+ post_install_message:
88
+ rdoc_options: []
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ requirements: []
102
+ rubygems_version: 3.0.1
103
+ signing_key:
104
+ specification_version: 4
105
+ summary: JSON API Swagger Doc Generator
106
+ test_files: []