rapidoc 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. data/.gitignore +21 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +20 -0
  4. data/README.rdoc +152 -0
  5. data/Rakefile +1 -0
  6. data/lib/rapidoc.rb +62 -0
  7. data/lib/rapidoc/action_doc.rb +86 -0
  8. data/lib/rapidoc/config.rb +127 -0
  9. data/lib/rapidoc/config/rapidoc.yml +4 -0
  10. data/lib/rapidoc/controller_extractor.rb +54 -0
  11. data/lib/rapidoc/http_response.rb +61 -0
  12. data/lib/rapidoc/param_errors.rb +43 -0
  13. data/lib/rapidoc/resource_doc.rb +66 -0
  14. data/lib/rapidoc/resources_extractor.rb +42 -0
  15. data/lib/rapidoc/routes_doc.rb +96 -0
  16. data/lib/rapidoc/templates/action.html.hbs +170 -0
  17. data/lib/rapidoc/templates/assets/css/bootstrap-responsive.min.css +9 -0
  18. data/lib/rapidoc/templates/assets/css/bootstrap.min.css +9 -0
  19. data/lib/rapidoc/templates/assets/css/rapidoc.css +43 -0
  20. data/lib/rapidoc/templates/assets/img/glyphicons-halflings.png +0 -0
  21. data/lib/rapidoc/templates/assets/js/bootstrap.min.js +6 -0
  22. data/lib/rapidoc/templates/assets/js/jquery-1.9.0.min.js +4 -0
  23. data/lib/rapidoc/templates/assets/js/json2.js +486 -0
  24. data/lib/rapidoc/templates/index.html.hbs +85 -0
  25. data/lib/rapidoc/templates_generator.rb +65 -0
  26. data/lib/rapidoc/version.rb +3 -0
  27. data/lib/rapidoc/yaml_parser.rb +49 -0
  28. data/lib/tasks/railtie.rb +7 -0
  29. data/lib/tasks/rapidoc.rake +18 -0
  30. data/rapidoc.gemspec +26 -0
  31. data/spec/dummy/.gitignore +15 -0
  32. data/spec/dummy/Gemfile +42 -0
  33. data/spec/dummy/README.rdoc +261 -0
  34. data/spec/dummy/Rakefile +7 -0
  35. data/spec/dummy/app/assets/images/rails.png +0 -0
  36. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  37. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  38. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  39. data/spec/dummy/app/controllers/users_controller.rb +114 -0
  40. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  41. data/spec/dummy/app/mailers/.gitkeep +0 -0
  42. data/spec/dummy/app/models/.gitkeep +0 -0
  43. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  44. data/spec/dummy/config.ru +4 -0
  45. data/spec/dummy/config/application.rb +62 -0
  46. data/spec/dummy/config/boot.rb +6 -0
  47. data/spec/dummy/config/database.yml +25 -0
  48. data/spec/dummy/config/environment.rb +5 -0
  49. data/spec/dummy/config/environments/development.rb +37 -0
  50. data/spec/dummy/config/environments/production.rb +67 -0
  51. data/spec/dummy/config/environments/test.rb +37 -0
  52. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  53. data/spec/dummy/config/initializers/inflections.rb +15 -0
  54. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  55. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  56. data/spec/dummy/config/initializers/session_store.rb +8 -0
  57. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  58. data/spec/dummy/config/locales/en.yml +5 -0
  59. data/spec/dummy/config/routes.rb +9 -0
  60. data/spec/dummy/db/seeds.rb +7 -0
  61. data/spec/dummy/lib/assets/.gitkeep +0 -0
  62. data/spec/dummy/lib/tasks/.gitkeep +0 -0
  63. data/spec/dummy/log/.gitkeep +0 -0
  64. data/spec/dummy/public/404.html +26 -0
  65. data/spec/dummy/public/422.html +26 -0
  66. data/spec/dummy/public/500.html +25 -0
  67. data/spec/dummy/public/favicon.ico +0 -0
  68. data/spec/dummy/public/index.html +241 -0
  69. data/spec/dummy/public/robots.txt +5 -0
  70. data/spec/dummy/salida/users_create_response.json +12 -0
  71. data/spec/dummy/script/rails +6 -0
  72. data/spec/dummy/test/fixtures/.gitkeep +0 -0
  73. data/spec/dummy/test/functional/.gitkeep +0 -0
  74. data/spec/dummy/test/integration/.gitkeep +0 -0
  75. data/spec/dummy/test/performance/browsing_test.rb +12 -0
  76. data/spec/dummy/test/test_helper.rb +13 -0
  77. data/spec/dummy/test/unit/.gitkeep +0 -0
  78. data/spec/dummy/vendor/assets/javascripts/.gitkeep +0 -0
  79. data/spec/dummy/vendor/assets/stylesheets/.gitkeep +0 -0
  80. data/spec/dummy/vendor/plugins/.gitkeep +0 -0
  81. data/spec/features/action_spec.rb +212 -0
  82. data/spec/features/index_spec.rb +64 -0
  83. data/spec/lib/action_doc_spec.rb +202 -0
  84. data/spec/lib/config_spec.rb +186 -0
  85. data/spec/lib/controller_extractor_spec.rb +77 -0
  86. data/spec/lib/http_response_spec.rb +63 -0
  87. data/spec/lib/param_errors_spec.rb +69 -0
  88. data/spec/lib/rake_spec.rb +25 -0
  89. data/spec/lib/rapidoc_spec.rb +39 -0
  90. data/spec/lib/resource_doc_spec.rb +131 -0
  91. data/spec/lib/resources_extractor_spec.rb +105 -0
  92. data/spec/lib/routes_doc_spec.rb +150 -0
  93. data/spec/lib/templates_generator_spec.rb +90 -0
  94. data/spec/lib/yard_parser_spec.rb +55 -0
  95. data/spec/spec_helper.rb +10 -0
  96. metadata +307 -0
@@ -0,0 +1,21 @@
1
+ *.swp
2
+ *.gem
3
+ *.rbc
4
+ .bundle
5
+ .config
6
+ .yardoc
7
+ .rvmrc
8
+ Gemfile.lock
9
+ InstalledFiles
10
+ _yardoc
11
+ coverage
12
+ doc/
13
+ lib/bundler/man
14
+ pkg
15
+ rdoc
16
+ spec/reports
17
+ test/tmp
18
+ test/version_tmp
19
+ tmp
20
+ spec/dummy/rapidoc
21
+ spec/dummy/config/rapidoc
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ns-api-doc.gemspec
4
+ gemspec
@@ -0,0 +1,20 @@
1
+ MIT License
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,152 @@
1
+ = Rapidoc
2
+
3
+ REST API documentation generator for rails projects ( 0.04 version ).
4
+
5
+ This gem let you generate API documentation of your rails project in html format.
6
+ It use routes information, _rapidoc_ _comments_ and json examples for generate
7
+ static html files.
8
+
9
+ This is how the web interface look like:
10
+
11
+ * Resources: example[http://www.v2imagen.com/RDv]
12
+ * Action-home: example[http://es.zimagez.com/zimage/capturadepantalla-170213-195254.php]
13
+
14
+ Rapidoc is based in restapi_doc gem: https://github.com/Alayho/restapi_doc
15
+
16
+ == Installation
17
+
18
+ Add this line to your application's Gemfile:
19
+
20
+ gem 'rapidoc', :git => 'https://github.com/drinor/rapidoc.git'
21
+
22
+ And then execute:
23
+
24
+ $ bundle
25
+
26
+ == Usage
27
+
28
+ For generate documentation run:
29
+
30
+ rake rapidoc:generate
31
+
32
+ For clean all generate files run:
33
+
34
+ rake rapidoc:clean
35
+
36
+ == Configuration
37
+
38
+ You can configure rapidoc in ``/config/rapidoc/rapidoc.yml`` file:
39
+
40
+ project_name: "Project Name"
41
+ company: "My company"
42
+ year: 2013
43
+ doc_route: "doc"
44
+ examples_route: "examples"
45
+
46
+ The first three parameters are used for show information about project.
47
+
48
+ The *doc_route* parameter let you specify where _rapidoc_ will generate all the
49
+ documentation:
50
+
51
+ path_project/name
52
+
53
+ The *examples_route* parameter let you specify where _rapidoc_ will search for
54
+ requests/responeses examples files:
55
+
56
+ path_project/name
57
+
58
+ For more details please visit the Wiki[https://github.com/drinor/rapidoc/wiki].
59
+
60
+ == Introducction
61
+
62
+ If you generate documentation without do anithing, you can get all resources list in a _index.html_ file.
63
+
64
+ For get resources documentation you need add a resource block to resource controller:
65
+
66
+ # =begin resource
67
+ # =end
68
+
69
+ For get action documentation you need add an action block to resource controller:
70
+
71
+ # =begin action
72
+ # =end
73
+
74
+ Documentation blocks use *yaml* format.
75
+
76
+ == Requests/Responses examples
77
+
78
+ Rapidoc let you define *json* files with requests/responses examples. You only need to add
79
+ your files to *examples_route* and _rapidoc_ load it automatically in an action tab.
80
+
81
+ Files should have the next name format:
82
+
83
+ <resource>_<action>_<type>.json
84
+
85
+ Parameters:
86
+
87
+ * *resource*: name of resource (plural)
88
+ * *action*: controller action (index, create, show...)
89
+ * *type*: request / response
90
+
91
+ Name example:
92
+
93
+ users_create_request.json
94
+
95
+ File example:
96
+
97
+ {
98
+ "usuario": {
99
+ "name": "Paul",
100
+ "age": 23,
101
+ "height": 1.7,
102
+ "favoriteBands": ["Band ABC", "Band XYZ"]
103
+ }
104
+ }
105
+
106
+ == Documentation examples
107
+
108
+ Resource documentation:
109
+
110
+ # users_controller.rb
111
+
112
+ # =begin resource
113
+ # description: Represents an user in the system.
114
+ # =end
115
+
116
+ Action documentation:
117
+
118
+ # =begin action
119
+ # method: GET
120
+ # action: index
121
+ # requires_authentication: no
122
+ # response_formats: json
123
+ # description: Return all users of the system.
124
+ #
125
+ # http_responses:
126
+ # - 200
127
+ # - 401
128
+ # - 403
129
+ #
130
+ # params:
131
+ # - name: page
132
+ # description: number of page in pagination
133
+ # required: false
134
+ # type: Integer
135
+ #
136
+ # - name: limit
137
+ # description: number of elements by page in pagination
138
+ #
139
+ # - name: name
140
+ # description: name filter
141
+ # =end
142
+ def index
143
+ ...
144
+ end
145
+
146
+ == Contributing
147
+
148
+ 1. Fork it
149
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
150
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
151
+ 4. Push to the branch (`git push origin my-new-feature`)
152
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,62 @@
1
+ require 'handlebars'
2
+ require "rapidoc/config"
3
+ require "rapidoc/version"
4
+ require "tasks/railtie.rb"
5
+ require "rapidoc/routes_doc"
6
+ require "rapidoc/resource_doc"
7
+ require "rapidoc/action_doc"
8
+ require "rapidoc/controller_extractor"
9
+ require "rapidoc/resources_extractor"
10
+ require "rapidoc/param_errors"
11
+ require "rapidoc/templates_generator"
12
+ require "rapidoc/yaml_parser"
13
+
14
+ module Rapidoc
15
+
16
+ include Config
17
+ include ResourcesExtractor
18
+ include TemplatesGenerator
19
+ include ParamErrors
20
+ include YamlParser
21
+
22
+ METHODS = [ "GET", "PUT", "DELETE", "POST" ]
23
+
24
+ def create_structure
25
+ # should be done in this order
26
+ FileUtils.mkdir target_dir unless File.directory? target_dir
27
+ FileUtils.mkdir actions_dir unless File.directory? actions_dir
28
+ FileUtils.cp_r GEM_CONFIG_DIR + "/.", config_dir unless File.directory? config_dir
29
+ FileUtils.cp_r GEM_ASSETS_DIR, target_dir
30
+ FileUtils.mkdir examples_dir unless File.directory? examples_dir
31
+ end
32
+
33
+ def remove_structure
34
+ remove_doc
35
+ remove_config
36
+ end
37
+
38
+ def remove_config
39
+ FileUtils.rm_r config_dir if File.directory? config_dir
40
+ end
41
+
42
+ def remove_doc
43
+ FileUtils.rm_r target_dir if File.directory? target_dir
44
+ end
45
+
46
+ def reset_structure
47
+ remove_structure
48
+ create_structure
49
+ end
50
+
51
+ def remove_examples
52
+ FileUtils.rm_r examples_dir if File.directory? examples_dir
53
+ end
54
+
55
+ def generate_doc
56
+ resources_doc = get_resources
57
+
58
+ generate_index_template( resources_doc )
59
+ generate_actions_templates( resources_doc )
60
+ end
61
+
62
+ end
@@ -0,0 +1,86 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rapidoc/http_response'
4
+ require 'json'
5
+
6
+ module Rapidoc
7
+
8
+ ##
9
+ # This class save information about action of resource.
10
+ #
11
+ class ActionDoc
12
+ attr_reader :resource, :urls, :action, :action_method, :description,
13
+ :response_formats, :authentication, :params, :file, :http_responses,
14
+ :errors, :example_res, :example_req
15
+
16
+ ##
17
+ # @param resource [String] resource name
18
+ # @param action_info [Hash] action info extracted from controller file
19
+ # @param urls [Array] all urls that call this method
20
+ #
21
+ def initialize( routes_info, controller_info, examples_route )
22
+ @resource = routes_info[:resource].to_s
23
+ @action = routes_info[:action].to_s
24
+ @action_method = routes_info[:method].to_s
25
+ @urls = routes_info[:urls]
26
+ @file = @resource + '_' + @action
27
+
28
+ add_controller_info( controller_info ) if controller_info
29
+ load_examples( examples_route ) if examples_route
30
+ load_params_errors if default_errors? @action and @params
31
+ end
32
+
33
+ def has_controller_info
34
+ @controller_info ? true : false
35
+ end
36
+
37
+ private
38
+
39
+ def add_controller_info( controller_info )
40
+ @description = controller_info["description"]
41
+ @response_formats = default_response_formats || controller_info["response_formats"]
42
+ @params = controller_info["params"]
43
+ @http_responses = get_http_responses controller_info["http_responses"]
44
+ @errors = controller_info["errors"] ? controller_info["errors"].dup : []
45
+ @authentication = get_authentication controller_info["authentication_required"]
46
+ @controller_info = true
47
+ end
48
+
49
+ def get_authentication( required_authentication )
50
+ if [ true, false ].include? required_authentication
51
+ required_authentication
52
+ else
53
+ default_authentication
54
+ end
55
+ end
56
+
57
+ def get_http_responses codes
58
+ codes.map{ |c| HttpResponse.new c } if codes
59
+ end
60
+
61
+ def load_examples( examples_route )
62
+ return unless File.directory? examples_route + "/"
63
+ load_request examples_route
64
+ load_response examples_route
65
+ end
66
+
67
+ def load_params_errors
68
+ @params.each do |param|
69
+ @errors << get_error_info( param["name"], "required" ) if param["required"]
70
+ @errors << get_error_info( param["name"], "inclusion" ) if param["inclusion"]
71
+ end
72
+ end
73
+
74
+ def load_request( examples_route )
75
+ file = examples_route + '/' + @resource + '_' + @action + '_request.json'
76
+ return unless File.exists?( file )
77
+ File.open( file ){ |f| @example_req = JSON.pretty_generate( JSON.parse(f.read) ) }
78
+ end
79
+
80
+ def load_response( examples_route )
81
+ file = examples_route + '/' + @resource + '_' + @action + '_response.json'
82
+ return unless File.exists?( file )
83
+ File.open( file ){ |f| @example_res = JSON.pretty_generate( JSON.parse(f.read) ) }
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,127 @@
1
+ # encoding: utf-8
2
+
3
+ module Rapidoc
4
+
5
+ ##
6
+ # This module has all config information about directories and config files.
7
+ #
8
+ module Config
9
+ GEM_CONFIG_DIR = File.join( File.dirname(__FILE__), 'config' )
10
+ GEM_ASSETS_DIR = File.join( File.dirname(__FILE__), 'templates/assets' )
11
+ GEM_EXAMPLES_DIR = File.join( File.dirname(__FILE__), 'config/examples')
12
+
13
+ @@config = nil
14
+
15
+ def gem_templates_dir( f = nil )
16
+ gem_templates_dir ||= File.join( File.dirname(__FILE__), 'templates' )
17
+ form_file_name gem_templates_dir, f
18
+ end
19
+
20
+ def config_dir( f = nil )
21
+ config_dir ||= File.join( ::Rails.root.to_s, 'config/rapidoc' )
22
+ form_file_name config_dir, f
23
+ end
24
+
25
+ def controller_dir(f = nil)
26
+ if @@config and @@config['controllers_route']
27
+ controller_dir = File.join( ::Rails.root.to_s, @@config['controllers_route'] )
28
+ else
29
+ controller_dir ||= File.join( ::Rails.root.to_s, 'app/controllers' )
30
+ end
31
+
32
+ form_file_name controller_dir, f
33
+ end
34
+
35
+ def config_file_path
36
+ config_dir 'rapidoc.yml'
37
+ end
38
+
39
+ def rapidoc_config
40
+ @@config
41
+ end
42
+
43
+ def load_config
44
+ if File.exists?( config_file_path )
45
+ @@config = YAML.load( File.read( config_file_path ) )
46
+ end
47
+ end
48
+
49
+ def resources_black_list
50
+ if @@config and @@config['resources_black_list']
51
+ @@config['resources_black_list'].gsub(' ', '').split(',').map(&:to_sym)
52
+ else
53
+ return []
54
+ end
55
+ end
56
+
57
+ def default_errors?( action )
58
+ @@config and @@config['default_errors'] == true and
59
+ [ 'create', 'update' ].include? action
60
+ end
61
+
62
+ def default_authentication
63
+ if @@config and [ true, false ].include? @@config['default_authentication']
64
+ @@config['default_authentication']
65
+ else
66
+ true
67
+ end
68
+ end
69
+
70
+ def default_errors
71
+ @@config and @@config['errors'] ? @@config['errors'] : nil
72
+ end
73
+
74
+ # return the directory where rapidoc generates the doc
75
+ def target_dir( f = nil )
76
+ if File.exists?( config_file_path )
77
+ form_file_name( target_dir_from_config, f )
78
+ else
79
+ form_file_name( File.join( ::Rails.root.to_s, 'rapidoc' ), f )
80
+ end
81
+ end
82
+
83
+ # returns the directory where rapidoc generates actions (html files)
84
+ def actions_dir( f = nil )
85
+ f ? target_dir( "actions/#{f}" ) : target_dir( "actions" )
86
+ end
87
+
88
+ # returns the directory where rapidoc searches for examples
89
+ def examples_dir( f = nil )
90
+ if File.exists?( config_file_path )
91
+ form_file_name( examples_dir_from_config_file, f )
92
+ else
93
+ form_file_name( config_dir( '/examples' ), f )
94
+ end
95
+ end
96
+
97
+ def default_response_formats
98
+ @@config['response_formats'] if @@config
99
+ end
100
+
101
+ private
102
+
103
+ def target_dir_from_config
104
+ if @@config and @@config.has_key?( "doc_route" )
105
+ File.join(::Rails.root.to_s, @@config['doc_route'] )
106
+ else
107
+ File.join(::Rails.root.to_s, 'rapidoc' )
108
+ end
109
+ end
110
+
111
+ def examples_dir_from_config_file
112
+ if @@config and @@config.has_key?("examples_route")
113
+ File.join( ::Rails.root.to_s, @@config["examples_route"] )
114
+ else
115
+ config_dir '/examples'
116
+ end
117
+ end
118
+
119
+ def form_file_name(dir, file)
120
+ case file
121
+ when NilClass then dir
122
+ when String then File.join(dir, file)
123
+ else raise ArgumentError, "Invalid argument #{file}"
124
+ end
125
+ end
126
+ end
127
+ end