docapi 0.1.5 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,5 +1,4 @@
1
1
  *.sw?
2
2
  .DS_Store
3
3
  coverage
4
- rdoc
5
4
  pkg
data/Rakefile CHANGED
@@ -10,6 +10,7 @@ begin
10
10
  gem.email = "cyril.rohr@gmail.com"
11
11
  gem.homepage = "http://github.com/crohr/docapi"
12
12
  gem.authors = ["Cyril Rohr"]
13
+ gem.add_dependency "rdoc", ">= 2.0.0"
13
14
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
14
15
  end
15
16
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.2.0
data/bin/docapi CHANGED
@@ -34,13 +34,11 @@ option_parser.parse!
34
34
 
35
35
  @command = ARGV.shift
36
36
 
37
-
38
-
39
37
  case @command
40
38
  when 'generate'
41
- Docapi.new.generate(input = ARGV, output = @options.delete(:output), @options)
39
+ Docapi::CLI.new.generate(input = ARGV, output = @options.delete(:output), @options)
42
40
  when 'merge'
43
- Docapi.new.merge(input = ARGV.shift, output = @options.delete(:output), @options)
41
+ Docapi::CLI.new.merge(input = ARGV.shift, output = @options.delete(:output), @options)
44
42
  else
45
43
  $stderr.puts option_parser.help
46
44
  exit(-1)
data/docapi.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{docapi}
8
- s.version = "0.1.5"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Cyril Rohr"]
12
- s.date = %q{2009-12-04}
12
+ s.date = %q{2010-03-15}
13
13
  s.default_executable = %q{docapi}
14
14
  s.description = %q{RDoc template for generating API documentation.}
15
15
  s.email = %q{cyril.rohr@gmail.com}
@@ -48,6 +48,8 @@ Gem::Specification.new do |s|
48
48
  "files/stylesheets/documentation/highlighter/zenburn.css",
49
49
  "files/stylesheets/documentation/layout.css",
50
50
  "lib/docapi.rb",
51
+ "lib/rdoc/generator/docapi.rb",
52
+ "test/Rakefile",
51
53
  "test/code/reference_api.rb",
52
54
  "test/doc/1-README.md",
53
55
  "test/doc/2-documentation/documentation.html",
@@ -68,9 +70,12 @@ Gem::Specification.new do |s|
68
70
  s.specification_version = 3
69
71
 
70
72
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
73
+ s.add_runtime_dependency(%q<rdoc>, [">= 2.0.0"])
71
74
  else
75
+ s.add_dependency(%q<rdoc>, [">= 2.0.0"])
72
76
  end
73
77
  else
78
+ s.add_dependency(%q<rdoc>, [">= 2.0.0"])
74
79
  end
75
80
  end
76
81
 
@@ -112,7 +112,7 @@ p.page-title {
112
112
  padding-left: 5px;
113
113
  }
114
114
  table {
115
- font-size: 0.8em;
115
+ font-size: 0.9em;
116
116
  }
117
117
 
118
118
  /*#toc {
data/lib/docapi.rb CHANGED
@@ -1,150 +1,141 @@
1
- require 'pathname'
2
- require 'tempfile'
1
+ require 'yaml'
2
+ require 'haml'
3
3
  require 'maruku'
4
- require 'fileutils'
5
4
 
6
- class Docapi
7
-
8
- FILES_TO_INCLUDE = {
9
- :javascripts => ["./javascripts/documentation/highlight.pack.js", "./javascripts/documentation/jquery-1.3.2.min.js", "./javascripts/documentation/jquery.tableofcontents.min.js", "./javascripts/documentation/documentation.js"],
10
- :stylesheets => ["./stylesheets/documentation/layout.css", "./stylesheets/documentation/syntax.css", "./stylesheets/documentation/highlighter/default.css"]
11
- }
12
-
13
- def initialize
5
+ module Docapi
6
+ class CLI
7
+
8
+ TEMPLATE = <<TEMPLATE
9
+ - methods.each do |method|
10
+ .docapi-subsection
11
+ .docapi-title
12
+ %a{:name => method["name"].gsub(/\W/,' ').squeeze(' ').gsub(/\s/,'-')}= method["name"]
13
+ .docapi-content
14
+ = method["html_comment"].gsub(/<h2>(.*?)<\\/h2>/m, '<div class="docapi-subtitle">\\1</div>')
15
+ TEMPLATE
16
+
17
+ FILES_TO_INCLUDE = {
18
+ :javascripts => ["./javascripts/documentation/highlight.pack.js", "./javascripts/documentation/jquery-1.3.2.min.js", "./javascripts/documentation/jquery.tableofcontents.min.js", "./javascripts/documentation/documentation.js"],
19
+ :stylesheets => ["./stylesheets/documentation/layout.css", "./stylesheets/documentation/syntax.css", "./stylesheets/documentation/highlighter/default.css"]
20
+ }
14
21
 
15
- end
16
-
17
- def merge(input_path, output_path, options = {})
18
- input_dir = Pathname.new(input_path)
19
- raise ArgumentError, "Input directory does not exist" unless input_dir.directory?
20
- output_dir = Pathname.new(output_path || Pathname.getwd+"generated-doc")
21
- output_dir.mkpath
22
- output = File.open(output_dir+"index.html", "w+")
23
- output << header(:title => options[:title])
24
- output << convert_directory(input_dir)
25
- output << footer
26
- output.close
27
- # copy stylesheets and javascripts files
28
- FileUtils.cp_r(File.join(File.dirname(__FILE__), "..", "files", "."), output_dir)
29
- end
30
-
31
- def convert_directory(dir, level = 1)
32
- output = []
33
- dir.entries.each do |entry|
34
- next if entry.to_s =~ /^\./
35
- path = dir+entry
36
- title = File.basename(entry).gsub(/\d+-/, "").gsub(/\..+?$/, "")
37
- output << "<div class='docapi-section #{title.downcase}'>"
38
- if path.directory?
39
- output << "<h#{level}>#{title.capitalize}</h#{level}>"
40
- output << convert_directory(path, level+1)
41
- else
42
- output << convert_file(path)
43
- end
44
- output << '</div>'
22
+ def merge(input_path, output_path, options = {})
23
+ input_dir = Pathname.new(input_path)
24
+ raise ArgumentError, "Input directory does not exist" unless input_dir.directory?
25
+ output_dir = Pathname.new(output_path || Pathname.getwd+"generated-doc")
26
+ output_dir.mkpath
27
+ output = File.open(output_dir+"index.html", "w+")
28
+ output << header(:title => options[:title])
29
+ output << convert_directory(input_dir)
30
+ output << footer
31
+ output.close
32
+ # copy stylesheets and javascripts files
33
+ FileUtils.cp_r(File.join(File.dirname(__FILE__), "..", "files", "."), output_dir)
45
34
  end
46
- output.flatten
47
- end
48
-
49
- def convert_file(file)
50
- case file.extname
51
- when ".md"
52
- Maruku.new( File.read(file) ).to_html
53
- when ".rb"
54
- process_file_sections(file, 'ruby', [/^=begin (.*)$/, /^=end$/])
55
- when ".py"
56
- process_file_sections(file, 'python', [/^''' (.*)$/, /^'''$/])
57
- when ".sh"
58
- process_file_sections(file, 'bash', [/^<<ENDCOMMENT >\/dev\/null$/, /^ENDCOMMENT$/])
59
- when ".html"
60
- File.read(file)
35
+
36
+ def convert_directory(dir, level = 1)
37
+ output = []
38
+ dir.entries.each do |entry|
39
+ next if entry.to_s =~ /^\./ || entry.to_s == "created.rid"
40
+ path = dir+entry
41
+ title = File.basename(entry).gsub(/\d+-/, "").gsub(/\..+?$/, "")
42
+ output << "<div class='docapi-section #{title.downcase}'>"
43
+ if path.directory?
44
+ output << "<h#{level}>#{title.capitalize}</h#{level}>"
45
+ output << convert_directory(path, level+1)
46
+ else
47
+ output << convert_file(path)
48
+ end
49
+ output << '</div>'
50
+ end
51
+ output.flatten
61
52
  end
62
- end
63
-
64
-
65
- def process_file_sections(file, language, regexps)
66
- blocks = []
67
- output = ["<div class='docapi-subsection'><div class='docapi-title'>#{File.basename(file).gsub(/^\d+-/, "")}</div>"]
68
- File.open(file, "r").each do |line|
69
- if line =~ regexps.first
70
- output << write_block(blocks.pop)
71
- blocks << {:content => "", :language => ($1 || "markdown")}
72
- elsif line =~ regexps.last
73
- output << write_block(blocks.pop)
74
- else
75
- blocks << {:content => "", :language => language} if blocks.last.nil?
76
- blocks.last[:content] << line
53
+
54
+ def convert_file(file)
55
+ case file.extname
56
+ when ".md"
57
+ Maruku.new( File.read(file) ).to_html
58
+ when ".rb"
59
+ process_file_sections(file, 'ruby', [/^=begin (.*)$/, /^=end$/])
60
+ when ".py"
61
+ process_file_sections(file, 'python', [/^''' (.*)$/, /^'''$/])
62
+ when ".sh"
63
+ process_file_sections(file, 'bash', [/^<<ENDCOMMENT >\/dev\/null$/, /^ENDCOMMENT$/])
64
+ when ".html"
65
+ File.read(file)
77
66
  end
78
- end
79
- output << write_block(blocks.pop)
80
- output << '</div>'
81
- end
82
-
83
- def write_block(block)
84
- if block
85
- case block[:language]
86
- when "markdown", "text"
87
- Maruku.new( block[:content] ).to_html.gsub(/<pre class='(.+?)'><code>(.*?)<\/code><\/pre>/m, '<pre><code class="\1">\2</code></pre>')
88
- else
89
- '<pre><code class="'+block[:language]+'">'+block[:content]+'</code></pre>'
67
+ end
68
+
69
+
70
+ def process_file_sections(file, language, regexps)
71
+ blocks = []
72
+ output = ["<div class='docapi-subsection'><div class='docapi-title'>#{File.basename(file).gsub(/^\d+-/, "")}</div>"]
73
+ File.open(file, "r").each do |line|
74
+ if line =~ regexps.first
75
+ output << write_block(blocks.pop)
76
+ blocks << {:content => "", :language => ($1 || "markdown")}
77
+ elsif line =~ regexps.last
78
+ output << write_block(blocks.pop)
79
+ else
80
+ blocks << {:content => "", :language => language} if blocks.last.nil?
81
+ blocks.last[:content] << line
82
+ end
83
+ end
84
+ output << write_block(blocks.pop)
85
+ output << '</div>'
86
+ end
87
+
88
+ def write_block(block)
89
+ if block
90
+ case block[:language]
91
+ when "markdown", "text"
92
+ Maruku.new( block[:content] ).to_html.gsub(/<pre class='(.+?)'><code>(.*?)<\/code><\/pre>/m, '<pre><code class="\1">\2</code></pre>')
93
+ else
94
+ '<pre><code class="'+block[:language]+'">'+block[:content]+'</code></pre>'
95
+ end
90
96
  end
91
97
  end
92
- end
93
-
94
- def generate(input_paths, output_path, options = {})
95
- require 'rdoc'
96
- require 'rdoc/rdoc'
97
- rdoc_options = %w{-f html --one-file --charset=UTF-8 -U}
98
- rdoc_options.concat input_paths
99
- output_dir = Pathname.new(output_path || Pathname.getwd+"documentation")
100
- raise ArgumentError, "Output directory '#{output_dir}' does not exist" unless output_dir.directory?
101
- rdoc_output = Tempfile.new("rdoc_output.html")
102
- old_stdout = $stdout
103
- begin
104
- # redirect stdout to the file
105
- $stdout = rdoc_output
98
+
99
+ def generate(input_paths, output_path, options = {})
100
+ require 'rdoc/generator/docapi'
101
+ require 'tmpdir'
102
+ temporary_output_path = File.join(Dir.tmpdir, "docapi")
103
+ rdoc_options = %w{-f docapi --charset=UTF-8 -U --quiet -o}
104
+ rdoc_options << temporary_output_path
105
+ rdoc_options.concat input_paths
106
+ output_dir = Pathname.new(output_path || Pathname.getwd+"documentation")
107
+ raise ArgumentError, "Output directory '#{output_dir}' does not exist" unless output_dir.directory?
106
108
  RDoc::RDoc.new.document(rdoc_options)
107
- ensure
108
- $stdout = old_stdout
109
- end
110
- rdoc_output.rewind
111
- documentation = rdoc_output.read
112
- rdoc_output.close
113
- date = documentation[/<tr><td>Modified:<\/td><td>(.*?)<\/td><\/tr>/, 1]
114
- methods = documentation.split("<h4> method: ")
115
- methods.shift
116
- methods.map!{ |m|
117
- ["<div class='docapi-subsection'>", m.gsub(/<blockquote><pre>.*/m, "").gsub(/<a name="(.+?)">(.*?)<br \/>\s*?<\/a>/m, "<div class='docapi-title'><a name=\"\\1\">\\2<a></div>").gsub(/<h2>(.*?)<\/h2>/m, "<div class='docapi-subtitle'>\\1</div>").gsub(/<pre>(.*?)<\/pre>/m, "<pre><code>\\1</code></pre>"), "</div>"].join("")
118
- }
119
-
120
- File.open(File.join(output_dir.realpath, "documentation.html"), "w+") do |f|
121
- # sort methods by :call-seq: length ASC. A bit dirty but...
122
- methods.sort_by{|m| method = m[/<div class='docapi-title'><a name=".*?">(.+?)<a><\/div>/, 1].length rescue 0}.each{ |method| f << method }
109
+ documentation = YAML.load_file(File.join(temporary_output_path, "index.yaml"))
110
+ html = Haml::Engine.new(TEMPLATE, :ugly => true).render(Object.new, :methods => documentation["methods"], :options => options)
111
+ File.open(File.join(output_dir.realpath, "documentation.html"), "w+") do |f|
112
+ f << html.gsub(/<pre>(.*?)<\/pre>/im, '<pre><code>\1</code></pre>')
113
+ end
123
114
  end
124
- end
125
-
126
-
127
- def header(options = {})
128
- output = []
129
- output << "<html><head><title>#{options[:title] || "Documentation"}</title>"
130
- FILES_TO_INCLUDE[:javascripts].each do |file|
131
- output << '<script type="text/javascript" src="'+file+'"></script>'
115
+
116
+
117
+ def header(options = {})
118
+ output = []
119
+ output << "<html><head><title>#{options[:title] || "Documentation"}</title>"
120
+ FILES_TO_INCLUDE[:javascripts].each do |file|
121
+ output << '<script type="text/javascript" src="'+file+'"></script>'
122
+ end
123
+ FILES_TO_INCLUDE[:stylesheets].each do |file|
124
+ output << '<link media="screen" type="text/css" href="'+file+'" rel="stylesheet"/>'
125
+ end
126
+ output << %Q{
127
+ <!--[if IE]>
128
+ <style type="text/css" media="screen">
129
+ body {padding-right: 320px}
130
+ </style>
131
+ <![endif]-->}
132
+ output << "</head><body>"
132
133
  end
133
- FILES_TO_INCLUDE[:stylesheets].each do |file|
134
- output << '<link media="screen" type="text/css" href="'+file+'" rel="stylesheet"/>'
134
+ def footer
135
+ output = []
136
+ output << "<div id='generation-date'>Generated at: <span class='date'>#{Time.now.to_s}</span></div>"
137
+ output << "</body></html>"
135
138
  end
136
- output << %Q{
137
- <!--[if IE]>
138
- <style type="text/css" media="screen">
139
- body {padding-right: 320px}
140
- </style>
141
- <![endif]-->}
142
- output << "</head><body>"
143
- end
144
- def footer
145
- output = []
146
- output << "<div id='generation-date'>Generated at: <span class='date'>#{Time.now.to_s}</span></div>"
147
- output << "</body></html>"
139
+
148
140
  end
149
-
150
141
  end
@@ -0,0 +1,149 @@
1
+ require 'rubygems'
2
+ gem 'rdoc', '>= 2.0.0'
3
+
4
+ require 'rdoc/rdoc' unless defined?( RDoc ) && defined?( RDoc::RDoc )
5
+ require 'rdoc/markup/to_html'
6
+
7
+ require 'pathname'
8
+ # require 'tempfile'
9
+ # require 'maruku'
10
+ require 'fileutils'
11
+ require 'haml'
12
+
13
+
14
+ module RDoc
15
+ module Generator
16
+ class Docapi
17
+
18
+
19
+ def self.for(options)
20
+ new(options)
21
+ end
22
+
23
+ def initialize(options)
24
+ @options = options
25
+
26
+ # set up a hash to keep track of all the classes/modules we have processed
27
+ @already_processed = {}
28
+
29
+ # set up a hash to keep track of all of the objects to be output
30
+ @output = {
31
+ :files => [],
32
+ :classes => [],
33
+ :modules => [],
34
+ :attributes => [],
35
+ :methods => [],
36
+ :aliases => [],
37
+ :constants => [],
38
+ :requires => [],
39
+ :includes => []
40
+ }
41
+ end
42
+
43
+ # Rdoc passes in TopLevel objects from the code_objects.rb tree (all files)
44
+ def generate(files)
45
+ # Each object passed in is a file, process it
46
+ files.each { |file| process_file(file) }
47
+
48
+ h = ::RDoc::Markup::ToHtml.new
49
+
50
+ yaml = YAML.dump({
51
+ "methods" => @output[:methods].map{|method|
52
+ next if method.visibility == :private
53
+ {
54
+ "name" => method.call_seq || method.name,
55
+ "comment" => method.comment,
56
+ "html_comment" => method.comment.nil? ? "" : h.convert(method.comment.gsub(/^#+ ?/, ''))
57
+ }
58
+ }.compact
59
+ })
60
+
61
+ puts yaml unless @options.quiet
62
+ File.open("index.yaml", "w+") do |f|
63
+ f << yaml
64
+ end
65
+ end
66
+
67
+ private
68
+
69
+ # process a file from the code_object.rb tree
70
+ def process_file(file)
71
+ @output[:files].push(file)
72
+
73
+ puts "#{file.comment}"
74
+
75
+ # Process all of the objects that this file contains
76
+ file.method_list.each { |child| process_method(child) }
77
+ file.aliases.each { |child| process_alias(child) }
78
+ file.constants.each { |child| process_constant(child) }
79
+ file.requires.each { |child| process_require(child) }
80
+ file.includes.each { |child| process_include(child) }
81
+ file.attributes.each { |child| process_attribute(child) }
82
+
83
+ # Recursively process contained subclasses and modules
84
+ file.each_classmodule do |child|
85
+ process_class_or_module(child)
86
+ end
87
+ end
88
+
89
+ # Process classes and modiles
90
+ def process_class_or_module(obj)
91
+ obj.class == Module ? type = :modules : type = :classes
92
+
93
+ # One important note about the code_objects.rb structure. A class or module
94
+ # definition can be spread a cross many files in Ruby so code_objects.rb handles
95
+ # this by keeping only *one* reference to each class or module that has a definition
96
+ # at the root level of a file (ie. not contained in another class or module).
97
+ # This means that when we are processing files we may run into the same class/module
98
+ # twice. So we need to keep track of what classes/modules we have
99
+ # already seen and make sure we don't create two INSERT statements for the same
100
+ # object.
101
+ if(!@already_processed.has_key?(obj.full_name)) then
102
+ @output[type].push(obj)
103
+ @already_processed[obj.full_name] = true
104
+
105
+ # Process all of the objects that this class or module contains
106
+ obj.method_list.each { |child| process_method(child) }
107
+ obj.aliases.each { |child| process_alias(child) }
108
+ obj.constants.each { |child| process_constant(child) }
109
+ obj.requires.each { |child| process_require(child) }
110
+ obj.includes.each { |child| process_include(child) }
111
+ obj.attributes.each { |child| process_attribute(child) }
112
+ end
113
+
114
+ id = @already_processed[obj.full_name]
115
+ # Recursively process contained subclasses and modules
116
+ obj.each_classmodule do |child|
117
+ process_class_or_module(child)
118
+ end
119
+ end
120
+
121
+ def process_method(obj)
122
+ @output[:methods].push(obj)
123
+ end
124
+
125
+ def process_alias(obj)
126
+ @output[:aliases].push(obj)
127
+ end
128
+
129
+ def process_constant(obj)
130
+ @output[:constants].push(obj)
131
+ end
132
+
133
+ def process_attribute(obj)
134
+ @output[:attributes].push(obj)
135
+ end
136
+
137
+ def process_require(obj)
138
+ @output[:requires].push(obj)
139
+ end
140
+
141
+ def process_include(obj)
142
+ @output[:includes].push(obj)
143
+ end
144
+ end
145
+
146
+ end
147
+ end
148
+
149
+ RDoc::RDoc.add_generator RDoc::Generator::Docapi
data/test/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+
2
+ namespace :test do
3
+ desc "Attempts to generate the list of methods"
4
+ task :generate do
5
+ $LOAD_PATH.unshift File.dirname(__FILE__)+'/../lib'
6
+ require 'docapi'
7
+ require 'rdoc/generator/docapi'
8
+ Docapi::CLI.new.generate(["code/reference_api.rb"], "doc/2-documentation")
9
+ # RDoc::RDoc.new.document(["-f", "docapi", "-U", "-q", "-o", "doc/2-documentation", "code/reference_api.rb"])
10
+ end
11
+
12
+ desc "Attempts to merge"
13
+ task :merge => :generate do
14
+ $LOAD_PATH.unshift File.dirname(__FILE__)+'/../lib'
15
+ require 'docapi'
16
+ require 'rdoc/generator/docapi'
17
+ Docapi::CLI.new.merge("doc", "output", :title => "Reference API Documentation")
18
+ end
19
+ end
@@ -1,74 +1,13 @@
1
- <ol class="methods"><li>
2
-
3
- <div class="synopsis"><a name="M000003">GET /:grid5000-resource[.:format]<a></div>
4
-
5
-
6
-
7
-
8
- <p>
9
- Get a specific version of a Grid5000 resource.
10
- </p>
11
- <h2>URI parameters</h2>
12
- <table>
13
- <tr><td valign="top"><tt>grid5000-resource</tt>:</td><td>the URI of the grid5000 resource.
14
-
15
- </td></tr>
16
- </table>
17
- <h2>Query parameters</h2>
18
- <table>
19
- <tr><td valign="top"><tt>version</tt>:</td><td>the requested version. It can be a version id (40 characters), or a UNIX
20
- timestamp [default=empty (most recent version is used)].
21
-
22
- </td></tr>
23
- <tr><td valign="top"><tt>depth</tt>:</td><td>the number of nested sub-resources to resolve [default=1].
24
-
25
- </td></tr>
26
- <tr><td valign="top"><tt>resolve</tt>:</td><td>a list of comma separated sub-resources names to resolve (to be used with
27
- the <tt>depth</tt> parameter) [default=all].
28
-
29
- </td></tr>
30
- </table>
31
- <h2>Content-Types</h2>
32
- <table>
33
- <tr><td valign="top"><tt>application/json</tt>:</td><td>JSON
34
-
35
- </td></tr>
36
- <tr><td valign="top"><tt>application/xml</tt>:</td><td>XML
37
-
38
- </td></tr>
39
- <tr><td valign="top"><tt>application/zip</tt>:</td><td>the ZIP format will return a zip archive containing the set of directories
40
- and files corresponding to the required data, with all its sub-resources.
41
-
42
- </td></tr>
43
- </table>
44
- <h2>Status codes</h2>
45
- <table>
46
- <tr><td valign="top"><tt>200</tt>:</td><td>OK, the response contains the description of the resource as it was at the
47
- requested version.
48
-
49
- </td></tr>
50
- <tr><td valign="top"><tt>404</tt>:</td><td>the requested grid5000 resource cannot be found, or the requested version
51
- does not exist.
52
-
53
- </td></tr>
54
- <tr><td valign="top"><tt>406</tt>:</td><td>Returns 406 if the requested format is not available.
55
-
56
- </td></tr>
57
- </table>
58
-
59
-
60
-
61
- </li><li>
62
-
63
- <div class="synopsis"><a name="M000001">GET /:grid5000-resource/versions[.:format]<a></div>
64
-
65
-
66
-
67
-
1
+ <div class='docapi-subsection'>
2
+ <div class='docapi-title'>
3
+ <a name='GET-/:grid5000-resource/versions[.:format]'>GET /:grid5000-resource/versions[.:format]
4
+ </a>
5
+ </div>
6
+ <div class='docapi-content'>
68
7
  <p>
69
8
  Get the list of all versions of a particular resource.
70
9
  </p>
71
- <h2>URI parameters</h2>
10
+ <div class="docapi-subtitle">URI parameters</div>
72
11
  <table>
73
12
  <tr><td valign="top"><tt>grid5000-resource</tt>:</td><td>the URI of the grid5000 resource.
74
13
 
@@ -78,13 +17,13 @@ header in your HTTP request.
78
17
 
79
18
  </td></tr>
80
19
  </table>
81
- <h2>Query parameters</h2>
20
+ <div class="docapi-subtitle">Query parameters</div>
82
21
  <table>
83
22
  <tr><td valign="top"><tt>limit</tt>:</td><td>maximum number of versions to return.
84
23
 
85
24
  </td></tr>
86
25
  </table>
87
- <h2>Content-Types</h2>
26
+ <div class="docapi-subtitle">Content-Types</div>
88
27
  <table>
89
28
  <tr><td valign="top"><tt>application/json</tt>:</td><td>JSON
90
29
 
@@ -93,7 +32,7 @@ header in your HTTP request.
93
32
 
94
33
  </td></tr>
95
34
  </table>
96
- <h2>Status codes</h2>
35
+ <div class="docapi-subtitle">Status codes</div>
97
36
  <table>
98
37
  <tr><td valign="top"><tt>200</tt>:</td><td>OK, the response contains the list of the versions of the requested
99
38
  grid5000 resource.
@@ -106,7 +45,7 @@ grid5000 resource.
106
45
 
107
46
  </td></tr>
108
47
  </table>
109
- <h2>Usage</h2>
48
+ <div class="docapi-subtitle">Usage</div>
110
49
  <p>
111
50
  Get the 2 latest versions of the Rennes site:
112
51
  </p>
@@ -137,50 +76,107 @@ Get the 2 latest versions of the Rennes site:
137
76
  ]
138
77
  </code></pre>
139
78
 
79
+ </div>
80
+ </div>
81
+ <div class='docapi-subsection'>
82
+ <div class='docapi-title'>
83
+ <a name='GET-/:grid5000-resource/versions/:version[.:format]'>GET /:grid5000-resource/versions/:version[.:format]
84
+ </a>
85
+ </div>
86
+ <div class='docapi-content'>
87
+ <p>
88
+ Get info about a specific version.
89
+ </p>
90
+ <div class="docapi-subtitle">URI parameters</div>
91
+ <table>
92
+ <tr><td valign="top"><tt>grid5000-resource</tt>:</td><td>the URI of the grid5000 resource.
140
93
 
94
+ </td></tr>
95
+ <tr><td valign="top"><tt>version</tt>:</td><td>the version id (40 characters long) or a UNIX timestamp.
141
96
 
142
- </li><li>
97
+ </td></tr>
98
+ </table>
99
+ <div class="docapi-subtitle">Content-Types</div>
100
+ <table>
101
+ <tr><td valign="top"><tt>application/json</tt>:</td><td>JSON
143
102
 
144
- <div class="synopsis"><a name="M000002">GET /:grid5000-resource/versions/:version[.:format]<a></div>
103
+ </td></tr>
104
+ <tr><td valign="top"><tt>application/xml</tt>:</td><td>XML
145
105
 
106
+ </td></tr>
107
+ </table>
108
+ <div class="docapi-subtitle">Status codes</div>
109
+ <table>
110
+ <tr><td valign="top"><tt>200</tt>:</td><td>OK.
146
111
 
112
+ </td></tr>
113
+ <tr><td valign="top"><tt>404</tt>:</td><td>the requested grid5000 resource cannot be found, or the requested version
114
+ does not exist.
115
+
116
+ </td></tr>
117
+ <tr><td valign="top"><tt>406</tt>:</td><td>the requested format is not available.
147
118
 
119
+ </td></tr>
120
+ </table>
148
121
 
122
+ </div>
123
+ </div>
124
+ <div class='docapi-subsection'>
125
+ <div class='docapi-title'>
126
+ <a name='GET-/:grid5000-resource[.:format]'>GET /:grid5000-resource[.:format]
127
+ </a>
128
+ </div>
129
+ <div class='docapi-content'>
149
130
  <p>
150
- Get info about a specific version.
131
+ Get a specific version of a Grid5000 resource.
151
132
  </p>
152
- <h2>URI parameters</h2>
133
+ <div class="docapi-subtitle">URI parameters</div>
153
134
  <table>
154
135
  <tr><td valign="top"><tt>grid5000-resource</tt>:</td><td>the URI of the grid5000 resource.
155
136
 
156
137
  </td></tr>
157
- <tr><td valign="top"><tt>version</tt>:</td><td>the version id (40 characters long) or a UNIX timestamp.
138
+ </table>
139
+ <div class="docapi-subtitle">Query parameters</div>
140
+ <table>
141
+ <tr><td valign="top"><tt>version</tt>:</td><td>the requested version. It can be a version id (40 characters), or a UNIX
142
+ timestamp [default=empty (most recent version is used)].
143
+
144
+ </td></tr>
145
+ <tr><td valign="top"><tt>depth</tt>:</td><td>the number of nested sub-resources to resolve [default=1].
146
+
147
+ </td></tr>
148
+ <tr><td valign="top"><tt>resolve</tt>:</td><td>a list of comma separated sub-resources names to resolve (to be used with
149
+ the <tt>depth</tt> parameter) [default=all].
158
150
 
159
151
  </td></tr>
160
152
  </table>
161
- <h2>Content-Types</h2>
153
+ <div class="docapi-subtitle">Content-Types</div>
162
154
  <table>
163
155
  <tr><td valign="top"><tt>application/json</tt>:</td><td>JSON
164
156
 
165
157
  </td></tr>
166
158
  <tr><td valign="top"><tt>application/xml</tt>:</td><td>XML
167
159
 
160
+ </td></tr>
161
+ <tr><td valign="top"><tt>application/zip</tt>:</td><td>the ZIP format will return a zip archive containing the set of directories
162
+ and files corresponding to the required data, with all its sub-resources.
163
+
168
164
  </td></tr>
169
165
  </table>
170
- <h2>Status codes</h2>
166
+ <div class="docapi-subtitle">Status codes</div>
171
167
  <table>
172
- <tr><td valign="top"><tt>200</tt>:</td><td>OK.
168
+ <tr><td valign="top"><tt>200</tt>:</td><td>OK, the response contains the description of the resource as it was at the
169
+ requested version.
173
170
 
174
171
  </td></tr>
175
172
  <tr><td valign="top"><tt>404</tt>:</td><td>the requested grid5000 resource cannot be found, or the requested version
176
173
  does not exist.
177
174
 
178
175
  </td></tr>
179
- <tr><td valign="top"><tt>406</tt>:</td><td>the requested format is not available.
176
+ <tr><td valign="top"><tt>406</tt>:</td><td>Returns 406 if the requested format is not available.
180
177
 
181
178
  </td></tr>
182
179
  </table>
183
180
 
184
-
185
-
186
- </li></ol>
181
+ </div>
182
+ </div>
@@ -1,9 +1,11 @@
1
1
  =begin markdown
2
2
  Comment `code` is good.
3
3
  =end
4
- def x
4
+
5
+ def method
5
6
  return "whatever"
6
7
  end
8
+
7
9
  =begin markdown
8
10
  Comment
9
11
  =end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: docapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cyril Rohr
@@ -9,10 +9,19 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-12-04 00:00:00 +01:00
12
+ date: 2010-03-15 00:00:00 +01:00
13
13
  default_executable: docapi
14
- dependencies: []
15
-
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rdoc
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.0.0
24
+ version:
16
25
  description: RDoc template for generating API documentation.
17
26
  email: cyril.rohr@gmail.com
18
27
  executables:
@@ -52,6 +61,8 @@ files:
52
61
  - files/stylesheets/documentation/highlighter/zenburn.css
53
62
  - files/stylesheets/documentation/layout.css
54
63
  - lib/docapi.rb
64
+ - lib/rdoc/generator/docapi.rb
65
+ - test/Rakefile
55
66
  - test/code/reference_api.rb
56
67
  - test/doc/1-README.md
57
68
  - test/doc/2-documentation/documentation.html