rails_api_documentation 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +9 -8
- data/app/assets/javascripts/table.js.coffee +10 -1
- data/app/assets/stylesheets/rails_api_doc/default.sass +39 -16
- data/app/assets/stylesheets/rails_api_doc/table.sass +21 -4
- data/app/controllers/rails_api_doc/api_docs_controller.rb +17 -20
- data/app/helpers/rails_api_doc/application_helper.rb +11 -0
- data/app/models/rails_api_doc/api_datum.rb +17 -0
- data/app/views/layouts/rails_api_doc/application.slim +2 -5
- data/app/views/rails_api_doc/api_docs/_request_api_table.slim +1 -1
- data/app/views/rails_api_doc/api_docs/_response_api_table.slim +4 -3
- data/app/views/rails_api_doc/api_docs/{index.slim → show.slim} +0 -0
- data/app/views/shared/_param_inputs.slim +2 -3
- data/app/views/shared/_table.slim +8 -6
- data/app/views/shared/_title.slim +8 -0
- data/config/routes.rb +1 -1
- data/lib/generators/rails_api_doc/templates/api_datum_migration.rb +4 -1
- data/lib/rails_api_doc.rb +16 -1
- data/lib/rails_api_doc/controller/headers.rb +59 -0
- data/lib/rails_api_doc/controller/param.rb +113 -0
- data/lib/rails_api_doc/controller/repo.rb +35 -0
- data/lib/rails_api_doc/controller/request/dsl.rb +1 -3
- data/lib/rails_api_doc/controller/request/factory.rb +29 -0
- data/lib/rails_api_doc/controller/request/headers.rb +11 -42
- data/lib/rails_api_doc/controller/request/param.rb +26 -33
- data/lib/rails_api_doc/controller/request/repository.rb +5 -26
- data/lib/rails_api_doc/controller/response/factory.rb +20 -2
- data/lib/rails_api_doc/controller/response/headers.rb +10 -21
- data/lib/rails_api_doc/controller/response/param.rb +38 -1
- data/lib/rails_api_doc/controller/response/rabl.rb +8 -19
- data/lib/rails_api_doc/controller/response/rabl_compiler.rb +7 -9
- data/lib/rails_api_doc/controller/response/repository.rb +38 -0
- data/lib/rails_api_doc/model/attribute_merger.rb +130 -0
- data/lib/rails_api_doc/model/attribute_parser.rb +23 -5
- data/lib/rails_api_doc/version.rb +1 -1
- metadata +10 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e94dad7cd2df856b0fa66bc552ba1b21719e2397
|
4
|
+
data.tar.gz: 00ee1ae3831826caea27f72422986ac45a49cb0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c80f87121f85a5f2757513b5612ac1baa3a2107e2d942b072450a0efa771118bab83cda7e768a13ab4be45ea84b7e4410aca0ada94ec489f91655c38c10a99c5
|
7
|
+
data.tar.gz: ac7a8147091a77af5f71f33ed8ba963db16ebfc69b4e153c3f5a70439827d4674304f4e2f0eac79201e0084f7384d815c95432c935599e81f9eddbafa0680be2
|
data/README.md
CHANGED
@@ -44,15 +44,16 @@ To display api documentation on route '/api_doc' you need to:
|
|
44
44
|
has_scope :article_id, :name
|
45
45
|
|
46
46
|
# Define parameters with type and nested options
|
47
|
-
|
48
|
-
parameter :
|
49
|
-
parameter :
|
50
|
-
|
51
|
-
parameter :
|
47
|
+
# Article and Datum are usual ActiveRecord models
|
48
|
+
parameter :age, type: :integer
|
49
|
+
parameter :name, type: :string, required: true
|
50
|
+
parameter :articles_attributes, type: :ary_object, model: 'Article' do
|
51
|
+
parameter :title, type: :string
|
52
|
+
parameter :body, type: :string, required: true
|
52
53
|
parameter :rating, type: :enum, enum: [1, 2, 3]
|
53
|
-
parameter :
|
54
|
-
parameter :creation_date, type:
|
55
|
-
parameter :comment, type:
|
54
|
+
parameter :data_attributes, type: :object, model: 'Datum' do
|
55
|
+
parameter :creation_date, type: :datetime
|
56
|
+
parameter :comment, type: :string
|
56
57
|
end
|
57
58
|
end
|
58
59
|
parameter :test, type: String, required: true
|
@@ -17,12 +17,21 @@ $ ->
|
|
17
17
|
$('.flex-table input, .flex-table select').on 'click', (e) ->
|
18
18
|
e.stopPropagation()
|
19
19
|
|
20
|
-
$('.ico').on 'click', (e) ->
|
20
|
+
$('span.ico').on 'click', (e) ->
|
21
21
|
self = $(this)
|
22
22
|
e.preventDefault()
|
23
23
|
e.stopPropagation()
|
24
24
|
self.closest('.row').toggleClass('is-active')
|
25
25
|
|
26
|
+
$('.destroy').on 'click', (e) ->
|
27
|
+
self = $(this)
|
28
|
+
|
29
|
+
self.closest('.flex-line').toggleClass('destroyed')
|
30
|
+
|
31
|
+
$('form.flex-line').on 'submit', () ->
|
32
|
+
$(this).addClass('updated')
|
33
|
+
$(this).removeClass('is-active')
|
34
|
+
|
26
35
|
# _header_height = $('.aside').offset().top
|
27
36
|
|
28
37
|
_window = $(window)
|
@@ -2,30 +2,53 @@
|
|
2
2
|
@import url(http://fonts.googleapis.com/css?family=Open+Sans:300,400,700)
|
3
3
|
|
4
4
|
body
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
|
6
|
+
font-family: 'Open Sans', sans-serif
|
7
|
+
font-weight: 300
|
8
|
+
line-height: 1.42em
|
9
|
+
color: #A7A1AE
|
10
|
+
background-color: #1F2739
|
10
11
|
|
11
12
|
h1.header
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
|
14
|
+
font-size: 3em
|
15
|
+
font-weight: 300
|
16
|
+
line-height: 1em
|
17
|
+
text-align: center
|
18
|
+
color: #4DC3FA
|
19
|
+
|
20
|
+
.request-action-title
|
21
|
+
|
22
|
+
font-weight: 300
|
23
|
+
line-height: 1em
|
24
|
+
text-align: center
|
25
|
+
color: #4DC3FA
|
26
|
+
|
27
|
+
span
|
28
|
+
font-size: 0.85em
|
29
|
+
|
30
|
+
.blue
|
31
|
+
|
16
32
|
color: #4DC3FA
|
17
33
|
|
34
|
+
|
35
|
+
|
18
36
|
.blue
|
19
|
-
|
37
|
+
|
38
|
+
color: #185875
|
20
39
|
|
21
40
|
.yellow
|
22
|
-
|
41
|
+
|
42
|
+
color: #FFF842
|
23
43
|
|
24
44
|
.content
|
25
|
-
display: flex
|
26
45
|
|
27
|
-
|
28
|
-
|
46
|
+
display: flex
|
47
|
+
|
48
|
+
nav
|
49
|
+
|
50
|
+
flex: 1
|
51
|
+
|
52
|
+
.tables
|
29
53
|
|
30
|
-
|
31
|
-
flex: 5
|
54
|
+
flex: 5
|
@@ -52,10 +52,18 @@
|
|
52
52
|
padding: 1% 2%
|
53
53
|
position: absolute
|
54
54
|
left: 2%
|
55
|
+
border-radius: 100%
|
56
|
+
|
57
|
+
&.destroy
|
58
|
+
left: 10%
|
59
|
+
|
60
|
+
color: #FB667A
|
61
|
+
|
62
|
+
text-decoration: none
|
55
63
|
|
56
64
|
&:hover
|
57
|
-
background-color:
|
58
|
-
color:
|
65
|
+
background-color: black//#FFF842
|
66
|
+
color: white
|
59
67
|
|
60
68
|
transition-delay: 0s
|
61
69
|
transition-duration: 0.4s
|
@@ -74,6 +82,15 @@
|
|
74
82
|
|
75
83
|
background: lightgreen
|
76
84
|
|
85
|
+
&.created
|
86
|
+
border: 2px solid #1E90FF
|
87
|
+
|
88
|
+
&.destroyed
|
89
|
+
border: 2px solid #DC143C
|
90
|
+
|
91
|
+
&.updated
|
92
|
+
border: 2px solid #00FF00
|
93
|
+
|
77
94
|
&.row
|
78
95
|
display: flex
|
79
96
|
|
@@ -128,8 +145,8 @@
|
|
128
145
|
div.flex-item
|
129
146
|
|
130
147
|
&:hover
|
131
|
-
background-color: #FFF842
|
132
|
-
color:
|
148
|
+
background-color: #4DC3FA //#FFF842
|
149
|
+
color: white
|
133
150
|
|
134
151
|
transition-delay: 0s
|
135
152
|
transition-duration: 0.4s
|
@@ -3,50 +3,47 @@
|
|
3
3
|
# :nodoc:
|
4
4
|
class RailsApiDoc::ApiDocsController < RailsApiDoc::ApplicationController
|
5
5
|
|
6
|
-
|
7
|
-
end
|
8
|
-
|
9
|
-
def index
|
6
|
+
def show
|
10
7
|
# preload controllers for parameters to apply
|
11
8
|
Dir.glob("#{Rails.root}/app/controllers/**/*.rb").each { |file| require_dependency file }
|
12
9
|
|
13
|
-
@
|
10
|
+
@registered_controllers = RailsApiDoc::Controller::Request::Factory.registered_controllers
|
14
11
|
|
15
|
-
@
|
12
|
+
@request_repository = RailsApiDoc::Controller::Request::Factory.repo
|
16
13
|
|
17
14
|
@response_repository = RailsApiDoc::Controller::Response::Factory.repo
|
18
15
|
end
|
19
16
|
|
20
17
|
def create
|
21
|
-
attributes = RailsApiDoc::
|
18
|
+
attributes = RailsApiDoc::Model::AttributeParser.parse_attributes(params)
|
22
19
|
|
23
|
-
RailsApiDoc::ApiDatum.create!(attributes)
|
20
|
+
@res = RailsApiDoc::ApiDatum.create!(attributes)
|
21
|
+
|
22
|
+
redirect_to api_doc_path
|
24
23
|
end
|
25
24
|
|
26
25
|
def destroy
|
27
|
-
attributes = RailsApiDoc::Controller::AttributeParser.parse_attributes(permitted_params)
|
28
|
-
|
29
26
|
if params[:id]
|
30
|
-
RailsApiDoc::ApiDatum.find(params[:id]).
|
27
|
+
@res = RailsApiDoc::ApiDatum.find(params[:id]).destroy!
|
31
28
|
else
|
32
|
-
RailsApiDoc::
|
29
|
+
attributes = RailsApiDoc::Model::AttributeParser.parse_attributes(params)
|
30
|
+
|
31
|
+
@res = RailsApiDoc::ApiDatum.create!(attributes)
|
33
32
|
end
|
33
|
+
|
34
|
+
redirect_to api_doc_path
|
34
35
|
end
|
35
36
|
|
36
37
|
def update
|
37
|
-
attributes = RailsApiDoc::
|
38
|
+
attributes = RailsApiDoc::Model::AttributeParser.parse_attributes(params)
|
38
39
|
|
39
40
|
if params[:id]
|
40
|
-
RailsApiDoc::ApiDatum.find(params[:id]).update!(attributes)
|
41
|
+
@res = RailsApiDoc::ApiDatum.find(params[:id]).update!(attributes)
|
41
42
|
else
|
42
|
-
RailsApiDoc::ApiDatum.create!(attributes)
|
43
|
+
@res = RailsApiDoc::ApiDatum.create!(attributes)
|
43
44
|
end
|
44
|
-
end
|
45
|
-
|
46
|
-
private
|
47
45
|
|
48
|
-
|
49
|
-
params.permit(:name, :type, :special, :desc)
|
46
|
+
redirect_to api_doc_path
|
50
47
|
end
|
51
48
|
|
52
49
|
end
|
@@ -1,4 +1,15 @@
|
|
1
1
|
module RailsApiDoc
|
2
2
|
module ApplicationHelper
|
3
|
+
|
4
|
+
def construct_destroy_param(row_values, init_params, nesting)
|
5
|
+
[
|
6
|
+
init_params,
|
7
|
+
row_values.store,
|
8
|
+
nesting: nesting,
|
9
|
+
id: row_values.param&.id,
|
10
|
+
name: row_values.name
|
11
|
+
].reduce(&:merge)
|
12
|
+
end
|
13
|
+
|
3
14
|
end
|
4
15
|
end
|
@@ -3,6 +3,23 @@
|
|
3
3
|
# :nodoc:
|
4
4
|
class RailsApiDoc::ApiDatum < ActiveRecord::Base
|
5
5
|
|
6
|
+
#
|
7
|
+
# integer :api_type - request | response
|
8
|
+
#
|
9
|
+
# string :api_action - create | show | edit | ...
|
10
|
+
# string :action_type - destroy | update | create
|
11
|
+
# string :type - param data type
|
12
|
+
# string :name - param name
|
13
|
+
# string :special - special param data
|
14
|
+
# string :desc - description
|
15
|
+
#
|
16
|
+
# text :nesting - model nesting to display
|
17
|
+
#
|
18
|
+
|
19
|
+
self.inheritance_column = ''
|
20
|
+
|
6
21
|
serialize :nesting, Array
|
7
22
|
|
23
|
+
enum api_type: [:request, :response]
|
24
|
+
|
8
25
|
end
|
@@ -12,10 +12,7 @@ html lang="en"
|
|
12
12
|
body.wrap
|
13
13
|
|
14
14
|
h1.header
|
15
|
-
|
16
|
-
|
17
|
-
span.blue >
|
18
|
-
span
|
19
|
-
a.yellow[style="text-decoration: none" href="http://github.com/vshaveyko/rails_api_doc"] Api Documentation
|
15
|
+
|
16
|
+
= render 'shared/title', locals: { link: "http://github.com/vshaveyko/rails_api_doc", blue_title: "Rails", yellow_title: "Api Documentation" }
|
20
17
|
|
21
18
|
== yield
|
@@ -2,4 +2,4 @@
|
|
2
2
|
|
3
3
|
div[id="#{ctrl}.request" style="--row-count: #{request_headers.length}"]
|
4
4
|
|
5
|
-
= render 'shared/table', model: ctrl, rows: repo[ctrl], headers: request_headers, nesting: [],
|
5
|
+
= render 'shared/table', model: ctrl, rows: repo[ctrl], headers: request_headers, nesting: [], params: { api_type: :request }
|
@@ -2,14 +2,15 @@
|
|
2
2
|
|
3
3
|
div.response-table[id="#{ctrl}.response" style="--row-count: #{response_headers.length}"]
|
4
4
|
|
5
|
-
- repo
|
5
|
+
- repo[ctrl][:actions].each do |action|
|
6
6
|
// TODO: Nest table in this div for easier jq toggling
|
7
7
|
// add borders to this div
|
8
8
|
|
9
9
|
- if route = repo.action_route(ctrl, action)
|
10
10
|
|
11
|
-
div.request-action-title
|
11
|
+
div.request-action-title
|
12
|
+
= render 'shared/title', locals: { blue_title: route[:method], yellow_title: route[:url]}
|
12
13
|
|
13
14
|
- if rows = repo.load_template(ctrl, action)
|
14
15
|
|
15
|
-
= render 'shared/table', model: ctrl, rows: rows, headers: response_headers, nesting: [],
|
16
|
+
= render 'shared/table', model: ctrl, rows: rows, headers: response_headers, nesting: [], params: { api_action: action, api_type: :response }
|
File without changes
|
@@ -1,8 +1,7 @@
|
|
1
|
-
- value = try(:value)
|
2
1
|
- placeholder = settings[:placeholder] || ''
|
3
2
|
|
4
3
|
- case settings[:fill_type]
|
5
4
|
- when :input
|
6
|
-
= text_field_tag settings[:param],
|
5
|
+
= text_field_tag settings[:param], val, placeholder: placeholder
|
7
6
|
- when :select
|
8
|
-
= select_tag settings[:param], options_for_select(settings[:values],
|
7
|
+
= select_tag settings[:param], options_for_select(settings[:values], val), include_blank: true
|
@@ -3,22 +3,22 @@
|
|
3
3
|
div.flex-table
|
4
4
|
|
5
5
|
/ header row
|
6
|
-
= form_tag(api_doc_url(nesting: nesting
|
6
|
+
= form_tag(api_doc_url(params.merge(nesting: nesting)), class: 'flex-line row') do
|
7
7
|
|
8
8
|
- headers.each.with_index do |(header, settings), index|
|
9
9
|
h1.flex-item
|
10
10
|
- if index.zero?
|
11
|
-
span.
|
11
|
+
span.ico +
|
12
12
|
span.exit.ico ❌
|
13
13
|
= submit_tag '✓'
|
14
14
|
|
15
|
-
= render 'shared/param_inputs', settings: settings
|
15
|
+
= render 'shared/param_inputs', settings: settings, val: ''
|
16
16
|
|
17
17
|
span.title = header
|
18
18
|
|
19
19
|
- rows.each do |row_name, row_values|
|
20
20
|
|
21
|
-
= form_tag(api_doc_url(nesting: nesting,
|
21
|
+
= form_tag(api_doc_url(params.merge(nesting: nesting, id: row_values.param&.id)), method: :put, class: "flex-line row #{'destroyed' if row_values.destroyed?} #{'updated' if row_values.updated?} #{'created' if row_values.created?}") do
|
22
22
|
|
23
23
|
- headers.each_value.with_index do |(header_settings), index|
|
24
24
|
|
@@ -28,13 +28,15 @@ div.flex-table
|
|
28
28
|
|
29
29
|
- if index.zero?
|
30
30
|
span.ico ✏
|
31
|
+
/ = submit_tag ,name: 'destroy', class: 'ico destroy'
|
32
|
+
= link_to '❌' , api_doc_url(construct_destroy_param(row_values, params, nesting)), method: :delete, class: 'destroy ico'
|
31
33
|
span.exit.ico ❌
|
32
34
|
= submit_tag '✔'
|
33
35
|
|
34
|
-
= render 'shared/param_inputs', settings: header_settings,
|
36
|
+
= render 'shared/param_inputs', settings: header_settings, val: param_value
|
35
37
|
|
36
38
|
span.title = param_value
|
37
39
|
|
38
40
|
- if row_values.nested?
|
39
41
|
|
40
|
-
= render 'shared/table', nesting: nesting, model: row_values[:model] || row_name, rows: row_values.nested, headers: headers,
|
42
|
+
= render 'shared/table', nesting: nesting, model: row_values[:model] || row_name, rows: row_values.nested, headers: headers, params: params
|
data/config/routes.rb
CHANGED
@@ -2,7 +2,10 @@ class GenerateRailsApiDocumentationAttributesTable < ActiveRecord::Migration[5.0
|
|
2
2
|
|
3
3
|
def change
|
4
4
|
create_table :rails_api_doc_api_data do |t|
|
5
|
-
t.
|
5
|
+
t.integer :api_type
|
6
|
+
|
7
|
+
t.string :action_type
|
8
|
+
t.string :api_action
|
6
9
|
t.string :type
|
7
10
|
t.string :name
|
8
11
|
t.string :special
|
data/lib/rails_api_doc.rb
CHANGED
@@ -1,21 +1,33 @@
|
|
1
1
|
# author: Vadim Shaveiko <@vshaveyko>
|
2
2
|
# frozen_string_literal: true
|
3
|
-
|
4
3
|
module RailsApiDoc
|
4
|
+
NESTED_TYPES = [:ary_object, :object, :model].freeze
|
5
|
+
|
6
|
+
STRAIGHT_TYPES = [:bool, :string, :integer, :array, :datetime, :enum].freeze
|
7
|
+
|
8
|
+
ACCEPTED_TYPES = (NESTED_TYPES + STRAIGHT_TYPES).freeze
|
5
9
|
|
6
10
|
module Controller
|
11
|
+
_dir = 'rails_api_doc/controller/'
|
12
|
+
|
13
|
+
autoload :Repo, _dir + 'repo'
|
14
|
+
autoload :Param, _dir + 'param'
|
15
|
+
autoload :Headers, _dir + 'headers'
|
16
|
+
|
7
17
|
module Response
|
8
18
|
_dir = 'rails_api_doc/controller/response/'
|
9
19
|
|
10
20
|
autoload :Factory, _dir + 'factory'
|
11
21
|
autoload :Headers, _dir + 'headers'
|
12
22
|
autoload :Param, _dir + 'param'
|
23
|
+
autoload :Repository, _dir + 'repository'
|
13
24
|
end
|
14
25
|
|
15
26
|
module Request
|
16
27
|
_dir = 'rails_api_doc/controller/request/'
|
17
28
|
|
18
29
|
autoload :DSL, _dir + 'dsl'
|
30
|
+
autoload :Factory, _dir + 'factory'
|
19
31
|
autoload :Param, _dir + 'param'
|
20
32
|
autoload :Headers, _dir + 'headers'
|
21
33
|
autoload :Repository, _dir + 'repository'
|
@@ -32,17 +44,20 @@ module RailsApiDoc
|
|
32
44
|
module Model
|
33
45
|
_dir = 'rails_api_doc/model/'
|
34
46
|
|
47
|
+
autoload :AttributeMerger, _dir + 'attribute_merger'
|
35
48
|
autoload :AttributeParser, _dir + 'attribute_parser'
|
36
49
|
end
|
37
50
|
|
38
51
|
require 'rails_api_doc/config'
|
39
52
|
class Config
|
53
|
+
|
40
54
|
_dir = 'rails_api_doc/config/'
|
41
55
|
|
42
56
|
autoload :Validator, _dir + 'validator'
|
43
57
|
autoload :ValidateEnum, _dir + 'validate_enum'
|
44
58
|
autoload :ValidateType, _dir + 'validate_type'
|
45
59
|
autoload :ValidateAryObject, _dir + 'validate_ary_object'
|
60
|
+
|
46
61
|
end
|
47
62
|
|
48
63
|
module Exception
|