rails_api_documentation 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -0
  3. data/app/assets/javascripts/table.js.coffee +8 -3
  4. data/app/assets/stylesheets/rails_api_doc/application.css +1 -0
  5. data/app/assets/stylesheets/rails_api_doc/default.sass +31 -0
  6. data/app/assets/stylesheets/rails_api_doc/side_menu.sass +12 -23
  7. data/app/assets/stylesheets/rails_api_doc/table.sass +104 -84
  8. data/app/controllers/rails_api_doc/api_docs_controller.rb +19 -18
  9. data/app/models/rails_api_doc/api_datum.rb +8 -0
  10. data/app/views/layouts/rails_api_doc/application.slim +10 -9
  11. data/app/views/rails_api_doc/api_docs/_request_api_table.slim +4 -3
  12. data/app/views/rails_api_doc/api_docs/_response_api_table.slim +13 -6
  13. data/app/views/rails_api_doc/api_docs/index.slim +15 -20
  14. data/app/views/shared/_param_inputs.slim +8 -0
  15. data/app/views/shared/_side_menu.slim +9 -0
  16. data/app/views/shared/_table.slim +37 -17
  17. data/lib/generators/rails_api_doc/install_generator.rb +23 -0
  18. data/lib/generators/rails_api_doc/templates/api_datum_migration.rb +15 -0
  19. data/lib/rails_api_doc/config/validate_ary_object.rb +1 -1
  20. data/lib/rails_api_doc/config/validate_enum.rb +1 -1
  21. data/lib/rails_api_doc/config/validate_type.rb +1 -1
  22. data/lib/rails_api_doc/config/validator.rb +0 -4
  23. data/lib/rails_api_doc/config.rb +0 -2
  24. data/lib/rails_api_doc/controller/request/dsl.rb +60 -0
  25. data/lib/rails_api_doc/controller/request/headers.rb +56 -0
  26. data/lib/rails_api_doc/controller/request/param.rb +81 -0
  27. data/lib/rails_api_doc/controller/{parameter → request}/repository.rb +3 -1
  28. data/lib/rails_api_doc/controller/{response_factory.rb → response/factory.rb} +2 -2
  29. data/lib/rails_api_doc/controller/response/headers.rb +30 -0
  30. data/lib/rails_api_doc/controller/response/param.rb +14 -0
  31. data/lib/rails_api_doc/controller/response/rabl.rb +3 -1
  32. data/lib/rails_api_doc/controller/response/rabl_compiler.rb +4 -13
  33. data/lib/rails_api_doc/controller/strong_params/dsl.rb +17 -0
  34. data/lib/rails_api_doc/controller/strong_params/permitted_params.rb +88 -0
  35. data/lib/rails_api_doc/engine.rb +0 -12
  36. data/lib/rails_api_doc/{controller → model}/attribute_parser.rb +1 -1
  37. data/lib/rails_api_doc/railtie.rb +5 -2
  38. data/lib/rails_api_doc/version.rb +1 -1
  39. data/lib/rails_api_doc.rb +48 -1
  40. metadata +18 -16
  41. data/app/views/rails_api_doc/api_docs/_edit_field.slim +0 -9
  42. data/app/views/rails_api_doc/api_docs/_side_menu.slim +0 -9
  43. data/app/views/rails_api_doc/api_docs/_title.slim +0 -4
  44. data/app/views/rails_api_doc/api_docs/edit.js.erb +0 -0
  45. data/app/views/rails_api_doc/api_docs/example.html.erb +0 -32
  46. data/app/views/rails_api_doc/api_docs/new.js.erb +0 -0
  47. data/app/views/shared/_response_table.slim +0 -30
  48. data/lib/rails_api_doc/controller/parameter/repository/param.rb +0 -68
  49. data/lib/rails_api_doc/controller/parameter.rb +0 -54
  50. data/lib/rails_api_doc/controller/strong_params.rb +0 -71
  51. data/lib/rails_api_doc/controller.rb +0 -6
@@ -1,9 +0,0 @@
1
- .row
2
- = form_tag(api_doc_path, method: 'post', remote: true, class: 'form-horizontal') do
3
- - ([:name] + headers).each do |field_name|
4
- div.field(class="col-md-#{col_num - 1}")
5
- / Add parameter name second argument
6
- = text_field_tag field_name, nil, placeholder: field_name, class: 'form-control'
7
-
8
- div.actions(class="col-md-#{col_num - 1}")
9
- = button_tag 'Add table parameter', class: 'btn btn-primary'
@@ -1,9 +0,0 @@
1
- nav.bs-docs-sidebar.hidden-print.hidden-sm.hidden-xs
2
- ul.side-menu.nav.bs-docs-sidenav
3
- - locals[:models].each do |model|
4
- li
5
- a[href=('#' + model.to_s)] = model.to_s
6
- span = '('
7
- a[href=('#' + model.to_s + '.request')] req,
8
- a[href=('#' + model.to_s + '.response')] resp
9
- span = ')'
@@ -1,4 +0,0 @@
1
- .bs-docs-section
2
- h1#grid.page-header
3
- a.anchorjs-link[href="#grid" aria-label="Anchor link for: grid" data-anchorjs-icon="" style="font-family: anchorjs-icons; font-style: normal; font-variant: normal; font-weight: normal; line-height: inherit; position: absolute; margin-left: -1em; padding-right: 0.5em;"]
4
- | Api documentation
File without changes
@@ -1,32 +0,0 @@
1
- <table class="table table-condensed">
2
- <thead class="thead-default">
3
- <tr>
4
- <th>#</th>
5
- <th>First Name</th>
6
- <th>Last Name</th>
7
- <th>Username</th>
8
- </tr>
9
- </thead>
10
- <tbody>
11
- <tr class="success">
12
- <th scope="row">1</th>
13
- <td>Mark</td>
14
- <td>Otto</td>
15
- <td>@mdo</td>
16
- </tr>
17
- <tr class="active">
18
- <th scope="row">2</th>
19
- <td>Jacob</td>
20
- <td>Thornton</td>
21
- <td>@fat</td>
22
- </tr>
23
- <tr>
24
- <th scope="row" class="warning">3</th>
25
- <td>Larry</td>
26
- <td>the Bird</td>
27
- <td>@twitter</td>
28
- </tr>
29
- </tbody>
30
- </table>
31
-
32
-
File without changes
@@ -1,30 +0,0 @@
1
- - nesting = locals[:nesting] || []
2
-
3
- div.flex-table
4
-
5
- = form_tag(api_doc_url(nesting: nesting), method: :put, remote: true, class: 'flex-line row') do
6
- / Угловой елемент
7
- div.flex-item
8
- // TODO: use icon with + to indicate adding
9
- span.add-ico = '( + )'
10
- = text_field_tag 'name', nil, placeholder: 'Enter param name'
11
- span Parameter
12
-
13
- div.flex-item Value
14
-
15
- = submit_tag 'Save', class: 'flex-item mod-submit'
16
-
17
- - locals[:rows].each do |row_name, node|
18
- = form_tag(api_doc_url(nesting: nesting), method: :put, remote: true, class: 'flex-line row') do
19
- div.flex-item
20
- span.edit-ico = '(edit)'
21
- = text_field_tag 'name', row_name, placeholder: 'Enter param name'
22
- span #{row_name}
23
- - if node.nested?
24
- div.flex-item.next-is-nested #{node.attr}(Nested)
25
- - else
26
- div.flex-item #{node.attr}
27
- = submit_tag 'Save', class: 'flex-item mod-submit'
28
-
29
- - if node.nested?
30
- = render 'shared/response_table', locals: { rows: node.nested, nesting: nesting + [row_name] }
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
- # author: Vadim Shaveiko <@vshaveyko>
3
- class RailsApiDoc::Controller::Parameter::Repository::Param
4
-
5
- NESTED_TYPES = [:ary_object, :object, :model, Object].freeze
6
-
7
- STRAIGHT_TYPES = [:bool, :string, :integer, :array, :datetime, :enum, String, Object, Integer, Array, DateTime].freeze
8
-
9
- ACCEPTED_TYPES = (NESTED_TYPES + STRAIGHT_TYPES).freeze
10
-
11
- # @type - type to check
12
- def self.accepted_nested_type?(type)
13
- type.in?(NESTED_TYPES)
14
- end
15
-
16
- def self.valid_type?(type)
17
- return if type.nil? || type.in?(ACCEPTED_TYPES)
18
- raise ArgumentError, "Wrong type: #{type}. " \
19
- "Correct types are: #{ACCEPTED_TYPES}."
20
- end
21
-
22
- def self.valid_enum?(type, enum)
23
- return false unless type == :enum
24
- return if enum.is_a?(Array)
25
- raise ArgumentError, 'Enum must be an array.'
26
- end
27
-
28
- def self.valid_nested?(type, block_given)
29
- return false unless accepted_nested_type?(type)
30
- return true if block_given
31
- raise ArgumentError, 'Empty object passed.'
32
- end
33
-
34
- def initialize(name, store)
35
- @name = name
36
- @store = store
37
- end
38
-
39
- def enum?
40
- @store[:type] == :enum && @store[:enum].present?
41
- end
42
-
43
- def ary_object?
44
- @store[:type] == :ary_object
45
- end
46
-
47
- def nested?
48
- self.class.accepted_nested_type?(@store[:type])
49
- end
50
-
51
- def nesting
52
- @store[:nested]
53
- end
54
-
55
- def required?
56
- @store[:required]
57
- end
58
-
59
- def method_missing(name, *args)
60
- return @store.public_send(name, *args) if respond_to_missing?(name)
61
- super
62
- end
63
-
64
- def respond_to_missing?(name, *)
65
- @store.respond_to?(name)
66
- end
67
-
68
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
- # author: Vadim Shaveiko <@vshaveyko>
3
- module RailsApiDoc::Controller::Parameter
4
-
5
- VALID_KEYS = [:type, :required, :enum, :model].freeze #:nodoc:
6
-
7
- # Use parameter in controller to defined REQUEST parameter.
8
- # Adds it to repository: RailsApiDoc::Controller::Parameter::Repository
9
- def parameter(name, options = {}, &block)
10
- raise ArgumentError, 'Parameter already defined.' if repo.key?(name)
11
-
12
- validate_options(options, block_given?)
13
-
14
- define_parameter(name, options, &block)
15
- end
16
-
17
- private
18
-
19
- def validate_options(options, block_given)
20
- options.assert_valid_keys(VALID_KEYS)
21
-
22
- Repository::Param.valid_type?(options[:type])
23
- end
24
-
25
- # default repo can be reassigned to deal with nested parameters
26
- # see nested_parameter
27
- def repo
28
- @repo || Repository[self]
29
- end
30
-
31
- # adjust parameter values depending on parameter type
32
- # 1. if nested - add nested values to parameter_data on :nested key
33
- # 2. if enum - transform all values to_s
34
- # bcs all incoming controller parameters will be strings and there can be errors
35
- def define_parameter(name, parameter_data, &block)
36
- if Repository::Param.valid_nested?(parameter_data[:type], block_given?)
37
- parameter_data = nested_parameter(parameter_data, &block)
38
- elsif Repository::Param.valid_enum?(parameter_data[:type], parameter_data[:enum])
39
- parameter_data[:enum].map!(:to_s)
40
- end
41
-
42
- repo[name] = Repository::Param.new(name, parameter_data)
43
- end
44
-
45
- def nested_parameter(parameter_data)
46
- _backup_repo = @repo
47
- @repo = {}
48
- yield
49
- parameter_data.merge(nested: @repo)
50
- ensure
51
- @repo = _backup_repo
52
- end
53
-
54
- end
@@ -1,71 +0,0 @@
1
- # author: Vadim Shaveiko <@vshaveyko>
2
- # frozen_string_literal: true
3
- module RailsApiDoc::Controller::StrongParams
4
-
5
- ParamIsRequired = Class.new(StandardError)
6
-
7
- def resource_params
8
- # accepted_params for permit
9
- params.permit(params_to_permit)
10
- end
11
-
12
- private
13
-
14
- def params_to_permit
15
- accepted_params = [{}]
16
-
17
- loop_params(params, permitted_params, accepted_params)
18
-
19
- accepted_params
20
- end
21
-
22
- # loop through current level of params and add to permit level if all requirements are met
23
- #
24
- # requirements are: 1) if required is set - param must be present and not empty => or error is raised
25
- # 2) if enum is set - param must equal predefined value => see Config::ValidateEnum
26
- # 3) if ary_object => see Config::ValidateAryObject
27
- # 3) if config.check_params_type is set - param must be of required type
28
- #
29
- # @accepted_params = [{}] - array with last member hash for nesting
30
- # @level_params - current nesting level params
31
- # @level_permitted_params - data for params permission
32
- def loop_params(params, level_permitted_params, accepted_params)
33
- level_permitted_params.each do |param_name, api_param_data|
34
- controller_param = params[param_name]
35
-
36
- check_required(param_name, controller_param, api_param_data)
37
- #
38
- # no value present && not required => go next
39
- next unless controller_param
40
-
41
- next unless RailsApiDoc::Config::Validator.valid_param?(controller_param, api_param_data)
42
-
43
- # if settings is array
44
- if api_param_data.ary_object?
45
- controller_param.each do |single_controller_param|
46
- _next_nesting_level(single_controller_param, param_data: api_param_data, current_accepted_params: accepted_params, param_name: param_name)
47
- end
48
- elsif api_param_data.nested?
49
- _next_nesting_level(controller_param, param_data: api_param_data, current_accepted_params: accepted_params, param_name: param_name)
50
- else
51
- accepted_params.unshift(param_name)
52
- end
53
- end
54
- end
55
-
56
- def _next_nesting_level(controller_param, param_data:, current_accepted_params:, param_name:)
57
- level_accepted_params = current_accepted_params.last[param_name] = [{}]
58
-
59
- loop_params(controller_param, param_data.nesting, level_accepted_params)
60
- end
61
-
62
- def permitted_params
63
- ::RailsApiDoc::Controller::Parameter::Repository[self.class]
64
- end
65
-
66
- def check_required(param_name, param_data, param_config)
67
- return unless param_config.required? && param_data.blank?
68
- raise RailsApiDoc::Exception::ParamRequired, param_name
69
- end
70
-
71
- end
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
- # author: Vadim Shaveiko <@vshaveyko>
3
- module RailsApiDoc
4
- module Controller
5
- end
6
- end