rapi_doc 0.1.2 → 0.2.1
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.
- data/Gemfile +3 -1
- data/Gemfile.lock +14 -2
- data/README.md +39 -18
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/doc_parser.rb +53 -0
- data/lib/method_doc.rb +16 -2
- data/lib/rapi_config.rb +3 -1
- data/lib/rapi_doc/tasks/rapi_doc_tasks.rake +33 -18
- data/lib/resource_doc.rb +28 -48
- data/spec/doc_parser_spec.rb +172 -0
- data/spec/method_doc_spec.rb +108 -0
- data/spec/spec_helper.rb +5 -0
- data/templates/_resource_method.html.erb +15 -6
- metadata +28 -14
- data/test/rapi_doc_test.rb +0 -8
- data/test/test_helper.rb +0 -3
data/Gemfile
CHANGED
@@ -3,10 +3,12 @@ source "http://rubygems.org"
|
|
3
3
|
# Example:
|
4
4
|
# gem "activesupport", ">= 2.3.5"
|
5
5
|
|
6
|
+
gem 'activesupport', '>= 2.1'
|
7
|
+
|
6
8
|
# Add dependencies to develop your gem here.
|
7
9
|
# Include everything needed to run rake, tests, features, etc.
|
8
10
|
group :development do
|
9
|
-
gem "
|
11
|
+
gem "rspec", "~> 2.7.0"
|
10
12
|
gem "bundler", "~> 1.0.0"
|
11
13
|
gem "jeweler", "~> 1.6.4"
|
12
14
|
gem "rcov", ">= 0"
|
data/Gemfile.lock
CHANGED
@@ -1,20 +1,32 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
+
activesupport (3.1.3)
|
5
|
+
multi_json (~> 1.0)
|
6
|
+
diff-lcs (1.1.3)
|
4
7
|
git (1.2.5)
|
5
8
|
jeweler (1.6.4)
|
6
9
|
bundler (~> 1.0)
|
7
10
|
git (>= 1.2.5)
|
8
11
|
rake
|
12
|
+
multi_json (1.0.4)
|
9
13
|
rake (0.9.2.2)
|
10
14
|
rcov (0.9.11)
|
11
|
-
|
15
|
+
rspec (2.7.0)
|
16
|
+
rspec-core (~> 2.7.0)
|
17
|
+
rspec-expectations (~> 2.7.0)
|
18
|
+
rspec-mocks (~> 2.7.0)
|
19
|
+
rspec-core (2.7.1)
|
20
|
+
rspec-expectations (2.7.0)
|
21
|
+
diff-lcs (~> 1.1.2)
|
22
|
+
rspec-mocks (2.7.0)
|
12
23
|
|
13
24
|
PLATFORMS
|
14
25
|
ruby
|
15
26
|
|
16
27
|
DEPENDENCIES
|
28
|
+
activesupport (>= 2.1)
|
17
29
|
bundler (~> 1.0.0)
|
18
30
|
jeweler (~> 1.6.4)
|
19
31
|
rcov
|
20
|
-
|
32
|
+
rspec (~> 2.7.0)
|
data/README.md
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
Rails API Doc Generator
|
2
2
|
=======================
|
3
3
|
|
4
|
-
RESTTful API generator
|
5
|
-
|
6
|
-
It generates a set of HTML views in the public directory. Parses the desired controllers and generates appropriate views.
|
4
|
+
RESTTful API documentation generator for Rails. It supports Rails 2.1 and greater. It generates a set of HTML views in the public directory. Parses the desired controllers and generates appropriate views.
|
7
5
|
|
8
6
|
Currently does not read routes.rb and requires manual entry of routes
|
9
7
|
|
@@ -19,11 +17,9 @@ Run `rake rapi_doc` to generate config and layout files. (TODO: Add a separate r
|
|
19
17
|
|
20
18
|
Modify config file by adding your controllers, e.g.:
|
21
19
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
controller_name: "users_controller.rb"
|
26
|
-
`
|
20
|
+
books:
|
21
|
+
location: "/books"
|
22
|
+
controller_name: "books_controller.rb"
|
27
23
|
|
28
24
|
Then invoke the generation by calling:
|
29
25
|
|
@@ -32,16 +28,41 @@ Then invoke the generation by calling:
|
|
32
28
|
Documentation Example
|
33
29
|
---------------------
|
34
30
|
|
35
|
-
=begin apidoc
|
36
|
-
url:: /
|
37
|
-
method:: GET
|
38
|
-
access:: FREE
|
39
|
-
return:: [JSON|XML] - list of
|
40
|
-
param:: page:int - the page, default is 1
|
41
|
-
param:: per_page:int - max items per page, default is 10
|
42
|
-
|
43
|
-
|
44
|
-
|
31
|
+
# =begin apidoc
|
32
|
+
# url:: /books
|
33
|
+
# method:: GET
|
34
|
+
# access:: FREE
|
35
|
+
# return:: [JSON|XML] - list of book objects
|
36
|
+
# param:: page:int - the page, default is 1
|
37
|
+
# param:: per_page:int - max items per page, default is 10
|
38
|
+
#
|
39
|
+
# output:: json
|
40
|
+
# [
|
41
|
+
# { "created_at":"2011-12-05T09:46:11Z",
|
42
|
+
# "description":"As with the last several books in the series, V Is for Vengeance was a long time in the making.",
|
43
|
+
# "id":1,
|
44
|
+
# "price":19,
|
45
|
+
# "title":"V is for Vengeance",
|
46
|
+
# "updated_at":"2011-12-05T09:46:11Z" },
|
47
|
+
# ]
|
48
|
+
# ::output-end::
|
49
|
+
#
|
50
|
+
# output:: xml
|
51
|
+
# <books type="array">
|
52
|
+
# <book>
|
53
|
+
# <id type="integer">1</id>
|
54
|
+
# <title>V is for Vengeance</title>
|
55
|
+
# <description>As with the last several books in the series, V Is for Vengeance was a long time in the making.</description>
|
56
|
+
# <price type="integer">19</price>
|
57
|
+
# <created-at type="datetime">2011-12-05T09:46:11Z</created-at>
|
58
|
+
# <updated-at type="datetime">2011-12-05T09:46:11Z</updated-at>
|
59
|
+
# </book>
|
60
|
+
# </books>
|
61
|
+
#::output-end::
|
62
|
+
#
|
63
|
+
# Get a list of all books in the system with pagination. Defaults to 10 per page
|
64
|
+
# =end
|
65
|
+
|
45
66
|
|
46
67
|
Layout
|
47
68
|
------
|
data/Rakefile
CHANGED
@@ -20,7 +20,7 @@ Jeweler::Tasks.new do |gem|
|
|
20
20
|
gem.summary = %Q{Rails API Doc Generator}
|
21
21
|
gem.description = %Q{Rails API Doc Generator}
|
22
22
|
gem.email = "hchoroomi@gmail.com"
|
23
|
-
gem.authors = ["Husein Choroomi"]
|
23
|
+
gem.authors = ["Husein Choroomi", "Adinda Praditya"]
|
24
24
|
# dependencies defined in Gemfile
|
25
25
|
end
|
26
26
|
Jeweler::RubygemsDotOrgTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1
|
1
|
+
0.2.1
|
data/lib/doc_parser.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
module RapiDoc
|
2
|
+
# This class holds the methods that parse the doc
|
3
|
+
class DocParser
|
4
|
+
attr_accessor :current_api_block, :current_scope, :line_no, :in_class
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@current_api_block = nil
|
8
|
+
@current_scope = :none
|
9
|
+
@line_no = 0
|
10
|
+
@in_class = false
|
11
|
+
end
|
12
|
+
|
13
|
+
def start
|
14
|
+
@current_scope = !in_class ? :class : :function
|
15
|
+
@current_api_block = MethodDoc.new(current_scope)
|
16
|
+
end
|
17
|
+
|
18
|
+
def reset_current_scope_and_api_block
|
19
|
+
@current_api_block = nil
|
20
|
+
@current_scope = :none
|
21
|
+
end
|
22
|
+
|
23
|
+
def parse(line)
|
24
|
+
case current_scope
|
25
|
+
when :response
|
26
|
+
@current_api_block.response += strip_line(line)
|
27
|
+
when :request
|
28
|
+
@current_api_block.request += strip_line(line)
|
29
|
+
when :output
|
30
|
+
@current_api_block.append_output strip_line(line)
|
31
|
+
when :class, :function
|
32
|
+
if result = /(\w+)\:\:\s*(.+)/.match(line)
|
33
|
+
if result[1] == "response" || result[1] == "request"
|
34
|
+
@current_scope = result[1].to_sym
|
35
|
+
elsif result[1] == "output"
|
36
|
+
@current_scope = result[1].to_sym
|
37
|
+
@current_api_block.add_output(result[1], result[2])
|
38
|
+
else
|
39
|
+
@current_api_block.add_variable(result[1], result[2])
|
40
|
+
end
|
41
|
+
else
|
42
|
+
# add line to block
|
43
|
+
@current_api_block.content << strip_line(line)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# strip the '#' on the line
|
49
|
+
def strip_line(line)
|
50
|
+
line[1..line.length]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/method_doc.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
module RapiDoc
|
2
2
|
# This class holds methods about a doc.
|
3
3
|
class MethodDoc
|
4
|
-
attr_accessor :scope, :content, :request, :response, :code
|
4
|
+
attr_accessor :scope, :content, :request, :response, :code, :outputs, :variables
|
5
5
|
|
6
6
|
def initialize(type)
|
7
7
|
@scope = type
|
8
8
|
@variables = []
|
9
|
+
@outputs = []
|
9
10
|
@content = ""
|
10
11
|
@code = ""
|
11
12
|
@request = ""
|
@@ -20,8 +21,21 @@ module RapiDoc
|
|
20
21
|
end
|
21
22
|
|
22
23
|
eval("@#{name}= \"#{value}\"")
|
24
|
+
self.class.class_eval { attr_accessor name.to_sym }
|
23
25
|
end
|
24
|
-
|
26
|
+
|
27
|
+
def add_output(name, value)
|
28
|
+
if name == 'output'
|
29
|
+
@outputs << eval("{#{value}: ''}")
|
30
|
+
return
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def append_output(value)
|
35
|
+
last_output_key = @outputs.last.keys[0]
|
36
|
+
@outputs.last[last_output_key] += ERB::Util.html_escape(value)
|
37
|
+
end
|
38
|
+
|
25
39
|
def get_binding
|
26
40
|
binding
|
27
41
|
end
|
data/lib/rapi_config.rb
CHANGED
@@ -1,26 +1,41 @@
|
|
1
1
|
include RapiDoc::RapiConfig
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
3
|
+
namespace :rapi_doc do
|
4
|
+
desc "Generate the config files"
|
5
|
+
task :setup do
|
6
|
+
if File.directory?(config_dir)
|
7
|
+
puts "#{BASE_DIR}/#{File.basename(config_dir)} exists"
|
8
|
+
else
|
9
|
+
FileUtils.mkdir(config_dir)
|
10
|
+
end
|
11
|
+
%w(config_file layout_file).each do |type_file|
|
12
|
+
target_file = send(type_file, :target)
|
13
|
+
template_file = send(type_file, :template)
|
14
|
+
if File.exist? target_file
|
15
|
+
puts "#{BASE_DIR}/#{File.basename(target_file)} exists"
|
16
|
+
else
|
17
|
+
FileUtils.cp template_file, config_dir
|
18
|
+
puts "Generated #{BASE_DIR}/#{File.basename(template_file)}" # TODO Add instructions for users to update the config file
|
19
|
+
end
|
12
20
|
end
|
13
21
|
end
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
22
|
+
desc "Generate the API Documentation"
|
23
|
+
task :generate do
|
24
|
+
begin
|
25
|
+
yml = YAML::load(File.open(config_file(:target)))
|
26
|
+
rescue
|
27
|
+
puts "It seems that you don't have the config files yet. Please run rake rapi_doc:setup"
|
20
28
|
end
|
21
29
|
|
22
|
-
#
|
23
|
-
|
30
|
+
# Generating documentations
|
31
|
+
if yml
|
32
|
+
resources = []
|
33
|
+
yml.keys.each do |key|
|
34
|
+
resources << RapiDoc::ResourceDoc.new(key, yml[key]["location"], yml[key]["controller_name"])
|
35
|
+
end
|
36
|
+
|
37
|
+
# generate the apidoc
|
38
|
+
RapiDoc::RAPIDoc.new(resources)
|
39
|
+
end
|
24
40
|
end
|
25
41
|
end
|
26
|
-
|
data/lib/resource_doc.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'method_doc'
|
2
|
+
require 'doc_parser'
|
2
3
|
|
3
4
|
module RapiDoc
|
4
5
|
# ResourceDoc holds the information a resource contains. It parses the class header and also the
|
@@ -23,6 +24,7 @@ module RapiDoc
|
|
23
24
|
|
24
25
|
# returns the location of the controller that is to be parsed
|
25
26
|
def controller_location
|
27
|
+
# @resource_location
|
26
28
|
"#{::Rails.root.to_s}/app/controllers/#{controller_name}"
|
27
29
|
end
|
28
30
|
|
@@ -32,63 +34,40 @@ module RapiDoc
|
|
32
34
|
|
33
35
|
# parse the controller
|
34
36
|
def parse_apidoc!
|
35
|
-
|
36
|
-
current_scope = :none
|
37
|
-
block_holder = []
|
38
|
-
lineno = 0
|
39
|
-
inclass = false
|
37
|
+
line_no = 0
|
40
38
|
|
39
|
+
parser = DocParser.new
|
41
40
|
File.open(controller_location).each do |line|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
if current_api_block.nil?
|
47
|
-
puts "#{controller_location}:#{
|
41
|
+
case
|
42
|
+
when line =~ /=begin apidoc/
|
43
|
+
parser.start
|
44
|
+
when line =~ /=end/
|
45
|
+
if parser.current_api_block.nil?
|
46
|
+
puts "#{controller_location}:#{line_no} - No starttag for '=end' found"
|
48
47
|
exit
|
49
|
-
elsif current_api_block.scope == :class
|
50
|
-
@class_block = current_api_block
|
51
|
-
elsif current_api_block.scope == :function
|
52
|
-
@function_blocks << current_api_block
|
53
|
-
end
|
54
|
-
current_api_block = nil
|
55
|
-
current_scope = :none
|
56
|
-
elsif line =~ /class/
|
57
|
-
inclass = true
|
58
|
-
elsif line =~ /::response-end::/
|
59
|
-
current_scope = :function
|
60
|
-
elsif line =~ /::request-end::/
|
61
|
-
current_scope = :function
|
62
|
-
elsif current_scope == :response
|
63
|
-
current_api_block.response += "#{line}"
|
64
|
-
elsif current_scope == :request
|
65
|
-
current_api_block.request += "#{line}"
|
66
|
-
elsif current_scope == :class || current_scope == :function # check if we are looking at a api block
|
67
|
-
# strip the # on the line
|
68
|
-
#line = line[1..line.length].lstrip.rstrip
|
69
|
-
# check if we are dealing with a variable
|
70
|
-
# something in the format: # varname:: sometext
|
71
|
-
if result = /(\w+)\:\:\s*(.+)/.match(line)
|
72
|
-
if result[1] == "response" || result[1] == "request"
|
73
|
-
puts "="*30
|
74
|
-
puts "found response"
|
75
|
-
puts "="*30; puts ""
|
76
|
-
puts line
|
77
|
-
current_scope = result[1].to_sym
|
78
|
-
else
|
79
|
-
current_api_block.add_variable(result[1], result[2])
|
80
|
-
end
|
81
48
|
else
|
82
|
-
|
83
|
-
|
49
|
+
case parser.current_scope
|
50
|
+
when :class
|
51
|
+
@class_block = parser.current_api_block
|
52
|
+
when :function
|
53
|
+
@function_blocks << parser.current_api_block
|
54
|
+
end
|
55
|
+
parser.reset_current_scope_and_api_block
|
84
56
|
end
|
57
|
+
when line =~ /class/
|
58
|
+
parser.in_class = true
|
59
|
+
when line =~ /::response-end::/, line =~ /::request-end::/, line =~ /::output-end::/
|
60
|
+
parser.current_scope = :function
|
61
|
+
else
|
62
|
+
parser.parse(line)
|
85
63
|
end
|
86
|
-
|
64
|
+
|
65
|
+
line_no += 1
|
87
66
|
end
|
88
|
-
|
67
|
+
|
89
68
|
puts "Generated #{name}.html"
|
90
69
|
end
|
91
|
-
|
70
|
+
|
92
71
|
def generate_view!(resources, temp_dir)
|
93
72
|
@resources = resources
|
94
73
|
@header_code = get_parsed_header unless @class_block.nil?
|
@@ -113,5 +92,6 @@ module RapiDoc
|
|
113
92
|
File.open(File.join(File.dirname(__FILE__), '..', 'templates', '_resource_method.html.erb')).each { |line| template << line }
|
114
93
|
return ERB.new(template).result(method_block.get_binding)
|
115
94
|
end
|
95
|
+
|
116
96
|
end
|
117
97
|
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RapiDoc::DocParser do
|
4
|
+
before do
|
5
|
+
@parser = RapiDoc::DocParser.new
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "#methods" do
|
9
|
+
describe "strip_line" do
|
10
|
+
it "should strip '#' correctly" do
|
11
|
+
line = '# random string'
|
12
|
+
@parser.strip_line(line).should eq(' random string')
|
13
|
+
end
|
14
|
+
it "should strip only one '#'" do
|
15
|
+
line = '## random string'
|
16
|
+
@parser.strip_line(line).should_not eq(' random string')
|
17
|
+
@parser.strip_line(line).should eq('# random string')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "start" do
|
22
|
+
it 'should by default generate MethodDoc with scope :class' do
|
23
|
+
method_doc = RapiDoc::MethodDoc.new(:class)
|
24
|
+
@parser.start
|
25
|
+
@parser.current_scope.should eq(method_doc.scope)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should generate MethodDoc object with scope :function if in class' do
|
29
|
+
method_doc = RapiDoc::MethodDoc.new(:function)
|
30
|
+
@parser.in_class = true
|
31
|
+
@parser.start
|
32
|
+
@parser.current_scope.should eq(method_doc.scope)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should generate MethodDoc object with scope :class if not in class' do
|
36
|
+
method_doc = RapiDoc::MethodDoc.new(:class)
|
37
|
+
@parser.in_class = false
|
38
|
+
@parser.start
|
39
|
+
@parser.current_scope.should eq(method_doc.scope)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "when it gets started" do
|
44
|
+
before do
|
45
|
+
@parser.start
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'reset_current_scope_and_api_block will set it to :none and nil respectively' do
|
49
|
+
@parser.reset_current_scope_and_api_block
|
50
|
+
@parser.current_api_block.should be(nil)
|
51
|
+
@parser.current_scope.should be(:none)
|
52
|
+
end
|
53
|
+
|
54
|
+
describe 'parse' do
|
55
|
+
before do
|
56
|
+
@api_block = @parser.current_api_block
|
57
|
+
@line = "#output:: xml"
|
58
|
+
end
|
59
|
+
|
60
|
+
describe 'with scope :response' do
|
61
|
+
before do
|
62
|
+
@parser.current_scope = :response
|
63
|
+
@api_block.response = "some responses"
|
64
|
+
@current_response = @api_block.response
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'should append the existing response on the current_api_block' do
|
68
|
+
@parser.parse(@line)
|
69
|
+
@api_block.response.should eq(@current_response + @parser.strip_line(@line))
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe 'with scope :request' do
|
74
|
+
before do
|
75
|
+
@parser.current_scope = :request
|
76
|
+
@api_block.request = "some requests"
|
77
|
+
@current_request = @api_block.request
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'should append the existing request on the current_api_block' do
|
81
|
+
@parser.parse(@line)
|
82
|
+
@api_block.request.should eq(@current_request + @parser.strip_line(@line))
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe 'with scope :output' do
|
87
|
+
before do
|
88
|
+
@parser.current_scope = :output
|
89
|
+
@current_content = 'some output content'
|
90
|
+
@api_block.outputs = [{ext: @current_content}]
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'should append the existing content of the last output type' do
|
94
|
+
@parser.parse(@line)
|
95
|
+
@api_block.outputs.last[:ext].should eq(@current_content + @parser.strip_line(@line))
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe 'with scope :class' do
|
100
|
+
describe 'when the line matches /(\w+)\:\:\s*(.+)/ regex' do
|
101
|
+
before do
|
102
|
+
@previous_scope = @parser.current_scope
|
103
|
+
@regex = /(\w+)\:\:\s*(.+)/
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'should update the current_scope' do
|
107
|
+
@parser.parse(@line)
|
108
|
+
@parser.current_scope.should_not eq(@previous_scope)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should update the current_scope if the captured string is one of 'response', 'request' or 'output'" do
|
112
|
+
%w(response request output).all? do |type|
|
113
|
+
line = "##{type}:: something"
|
114
|
+
@parser.parse(line)
|
115
|
+
# since we need to reset the scope back to :function, we need to
|
116
|
+
# save the spec result and then put it at the end for all? method
|
117
|
+
result = @parser.current_scope.should eq(type.to_sym)
|
118
|
+
@parser.current_scope = :function
|
119
|
+
result
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe "when the captured string is 'output'" do
|
124
|
+
it "should add a new output to the current api block" do
|
125
|
+
expect{
|
126
|
+
@parser.parse(@line)
|
127
|
+
}.to change {
|
128
|
+
@api_block.outputs.count
|
129
|
+
}.by(1)
|
130
|
+
end
|
131
|
+
|
132
|
+
it "the new output should be a hash with a key named the output type " do
|
133
|
+
@parser.parse(@line)
|
134
|
+
result = @regex.match(@line)
|
135
|
+
the_output = eval("{#{result[2]}: ''}")
|
136
|
+
@api_block.outputs.last.should eq(the_output)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
describe "when the captured string is other than any of 'response', 'request' or 'output'" do
|
141
|
+
it "should add a new instance variable to the current api block" do
|
142
|
+
@line = "#anystring:: any random content"
|
143
|
+
@parser.parse(@line)
|
144
|
+
@api_block.send('anystring').should eq('any random content')
|
145
|
+
end
|
146
|
+
|
147
|
+
describe "when the captured string is 'param'" do
|
148
|
+
before do
|
149
|
+
@line = "#param:: page:int - the page, default is 1"
|
150
|
+
end
|
151
|
+
|
152
|
+
it "should add a new variable to the current api block" do
|
153
|
+
expect {
|
154
|
+
@parser.parse(@line)
|
155
|
+
}.to change {
|
156
|
+
@api_block.variables.count
|
157
|
+
}.by(1)
|
158
|
+
end
|
159
|
+
|
160
|
+
it "the new variable's value should be included in current api block's variables attribute" do
|
161
|
+
@parser.parse(@line)
|
162
|
+
result = @regex.match(@line)
|
163
|
+
@api_block.variables.include?(result[2]).should be_true
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end # describe 'parse'
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RapiDoc::MethodDoc do
|
4
|
+
before do
|
5
|
+
@method_doc = RapiDoc::MethodDoc.new('a_type')
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "#methods" do
|
9
|
+
describe 'add_variable' do
|
10
|
+
before do
|
11
|
+
@name = 'any_name'
|
12
|
+
@value = 'a_value'
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should add a new attribute to the object with the same name" do
|
16
|
+
@method_doc.add_variable(@name, @value)
|
17
|
+
@method_doc.send(@name).should eq(@value)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "the value should not be added to 'variables' attribute when adding with named other than 'param' " do
|
21
|
+
expect {
|
22
|
+
@method_doc.add_variable(@name, @value)
|
23
|
+
}.to change {
|
24
|
+
@method_doc.variables.count
|
25
|
+
}.by(0)
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "adding with named 'param'" do
|
29
|
+
before do
|
30
|
+
@name = 'param'
|
31
|
+
end
|
32
|
+
|
33
|
+
it "the value should be added to 'variables' attribute" do
|
34
|
+
expect {
|
35
|
+
@method_doc.add_variable(@name, @value)
|
36
|
+
}.to change {
|
37
|
+
@method_doc.variables.count
|
38
|
+
}.by(1)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "the added value should be at the last entry of 'variables' attribute" do
|
42
|
+
@method_doc.add_variable(@name, @value)
|
43
|
+
@method_doc.variables.last.should eq(@value)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe 'add_output' do
|
49
|
+
before do
|
50
|
+
@name = 'any_name'
|
51
|
+
@value = 'a_value'
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should not be added to the 'outputs' attribute when adding with named other than 'output'" do
|
55
|
+
expect {
|
56
|
+
@method_doc.add_output(@name, @value)
|
57
|
+
}.to change {
|
58
|
+
@method_doc.outputs.count
|
59
|
+
}.by(0)
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "adding with named 'output'" do
|
63
|
+
before do
|
64
|
+
@name = 'output'
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should add an output item to the 'outputs' attribute" do
|
68
|
+
expect {
|
69
|
+
@method_doc.add_output(@name, @value)
|
70
|
+
}.to change {
|
71
|
+
@method_doc.outputs.count
|
72
|
+
}.by(1)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "the added item should be at the last entry of 'outputs' attribute" do
|
76
|
+
@method_doc.add_output(@name, @value)
|
77
|
+
new_hash = eval("{#{@value}: ''}")
|
78
|
+
@method_doc.outputs.last.should eq(new_hash)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "the new output item should be a hash with key named the 'value' parameter" do
|
82
|
+
@method_doc.add_output(@name, @value)
|
83
|
+
@method_doc.outputs.last.keys.include?(@value.to_sym).should be_true
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe 'append_output' do
|
89
|
+
before do
|
90
|
+
@current_format_content = "any string"
|
91
|
+
@last_hash = {format: @current_format_content}
|
92
|
+
@method_doc.outputs << @last_hash
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'should append the existing format content on the outputs' do
|
96
|
+
value = "some string"
|
97
|
+
@method_doc.append_output(value)
|
98
|
+
@method_doc.outputs.last[:format].should eq(@current_format_content + value)
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'the appended value should be html-escaped' do
|
102
|
+
value = "<a>tag</a>"
|
103
|
+
@method_doc.append_output(value)
|
104
|
+
@method_doc.outputs.last[:format].should eq(@current_format_content + ERB::Util.html_escape(value))
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -26,12 +26,21 @@
|
|
26
26
|
</ul>
|
27
27
|
<% end %>
|
28
28
|
|
29
|
-
<%
|
30
|
-
|
31
|
-
|
32
|
-
<%= @output %>
|
33
|
-
|
34
|
-
|
29
|
+
<% unless @outputs.empty? %>
|
30
|
+
<ul class="tabs">
|
31
|
+
<% @outputs.each do |output| %>
|
32
|
+
<li class="<%= (output == @outputs.first)? 'active' : '' %>"><a href="#<%= output.keys.first %>"><%= output.keys.first %></a></li>
|
33
|
+
<% end %>
|
34
|
+
</ul>
|
35
|
+
<div class="pill-content">
|
36
|
+
<% @outputs.each do |output| %>
|
37
|
+
<% output_format = output.keys.first %>
|
38
|
+
<div class="<%= (output == @outputs.first)? 'active' : '' %>" id="<%= output_format %>">
|
39
|
+
<pre class="prettyprint" ><%= output[output_format] %></pre>
|
40
|
+
</div>
|
41
|
+
<% end %>
|
42
|
+
</div>
|
43
|
+
<br />
|
35
44
|
<% end %>
|
36
45
|
|
37
46
|
<% unless @request.blank? %>
|
metadata
CHANGED
@@ -2,52 +2,64 @@
|
|
2
2
|
name: rapi_doc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1
|
5
|
+
version: 0.2.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Husein Choroomi
|
9
|
+
- Adinda Praditya
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
13
|
|
13
|
-
date: 2011-
|
14
|
+
date: 2011-12-09 00:00:00 Z
|
14
15
|
dependencies:
|
15
16
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
17
|
+
name: activesupport
|
17
18
|
requirement: &id001 !ruby/object:Gem::Requirement
|
18
19
|
none: false
|
19
20
|
requirements:
|
20
21
|
- - ">="
|
21
22
|
- !ruby/object:Gem::Version
|
22
|
-
version: "
|
23
|
-
type: :
|
23
|
+
version: "2.1"
|
24
|
+
type: :runtime
|
24
25
|
prerelease: false
|
25
26
|
version_requirements: *id001
|
26
27
|
- !ruby/object:Gem::Dependency
|
27
|
-
name:
|
28
|
+
name: rspec
|
28
29
|
requirement: &id002 !ruby/object:Gem::Requirement
|
29
30
|
none: false
|
30
31
|
requirements:
|
31
32
|
- - ~>
|
32
33
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
34
|
+
version: 2.7.0
|
34
35
|
type: :development
|
35
36
|
prerelease: false
|
36
37
|
version_requirements: *id002
|
37
38
|
- !ruby/object:Gem::Dependency
|
38
|
-
name:
|
39
|
+
name: bundler
|
39
40
|
requirement: &id003 !ruby/object:Gem::Requirement
|
40
41
|
none: false
|
41
42
|
requirements:
|
42
43
|
- - ~>
|
43
44
|
- !ruby/object:Gem::Version
|
44
|
-
version: 1.
|
45
|
+
version: 1.0.0
|
45
46
|
type: :development
|
46
47
|
prerelease: false
|
47
48
|
version_requirements: *id003
|
48
49
|
- !ruby/object:Gem::Dependency
|
49
|
-
name:
|
50
|
+
name: jeweler
|
50
51
|
requirement: &id004 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ~>
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: 1.6.4
|
57
|
+
type: :development
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: *id004
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: rcov
|
62
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
51
63
|
none: false
|
52
64
|
requirements:
|
53
65
|
- - ">="
|
@@ -55,7 +67,7 @@ dependencies:
|
|
55
67
|
version: "0"
|
56
68
|
type: :development
|
57
69
|
prerelease: false
|
58
|
-
version_requirements: *
|
70
|
+
version_requirements: *id005
|
59
71
|
description: Rails API Doc Generator
|
60
72
|
email: hchoroomi@gmail.com
|
61
73
|
executables: []
|
@@ -75,6 +87,7 @@ files:
|
|
75
87
|
- VERSION
|
76
88
|
- init.rb
|
77
89
|
- install.rb
|
90
|
+
- lib/doc_parser.rb
|
78
91
|
- lib/doc_util.rb
|
79
92
|
- lib/method_doc.rb
|
80
93
|
- lib/rapi_config.rb
|
@@ -82,12 +95,13 @@ files:
|
|
82
95
|
- lib/rapi_doc/railtie.rb
|
83
96
|
- lib/rapi_doc/tasks/rapi_doc_tasks.rake
|
84
97
|
- lib/resource_doc.rb
|
98
|
+
- spec/doc_parser_spec.rb
|
99
|
+
- spec/method_doc_spec.rb
|
100
|
+
- spec/spec_helper.rb
|
85
101
|
- templates/_resource_header.html.erb
|
86
102
|
- templates/_resource_method.html.erb
|
87
103
|
- templates/config.yml
|
88
104
|
- templates/layout.html.erb
|
89
|
-
- test/rapi_doc_test.rb
|
90
|
-
- test/test_helper.rb
|
91
105
|
- uninstall.rb
|
92
106
|
homepage: http://github.com/hchoroomi/rapi_doc
|
93
107
|
licenses:
|
@@ -102,7 +116,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
102
116
|
requirements:
|
103
117
|
- - ">="
|
104
118
|
- !ruby/object:Gem::Version
|
105
|
-
hash: -
|
119
|
+
hash: -2515806695583733167
|
106
120
|
segments:
|
107
121
|
- 0
|
108
122
|
version: "0"
|
data/test/rapi_doc_test.rb
DELETED
data/test/test_helper.rb
DELETED