yard-rest-plugin 0.1.5 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -1,27 +1,27 @@
1
- Yardoc RESTful Web Service Plugin
2
- =================================
1
+ # Yardoc RESTful Web Service Plugin
2
+
3
3
  by VisFleet
4
4
 
5
5
  A plugin for [Yardoc](http://yardoc.org/) that generates documentation for RESTful web services.
6
6
 
7
- Install
8
- -------
7
+ ## Install
9
8
  sudo gem install yard-rest-plugin
10
9
 
11
10
  It also requires the Jeweler gem if you plan to use the rake build tasks.
12
11
 
13
- Generating Docs
14
- ---------------
12
+ ## Generating Docs
13
+
15
14
  When using yardoc you ask it to use the "rest" template (the -t option). For example:
16
15
 
17
16
  yardoc '*.rb' -t rest --title "Our App's API"
18
17
 
19
- Writing Comments
20
- ----------------
18
+ ## Writing Comments
19
+
21
20
  In addition to starting your comment with the normal RDoc description. The following tags are provided:
22
21
 
23
- - @url url. Specifies the URL that the service is accessed from. This tag is compulsory, only classes and methods
24
- that include this in their comments are included
22
+ - @url url. Specifies the URL that the service is accessed from. This tag is compulsory, only **classes** and **methods** that include this in their comments are included.
23
+
24
+ - @topic topic. Specifies the topic to categorise a **class** (not a method) under.
25
25
 
26
26
  - @argument [type] name description. Specifies an argument that is passed to the service. You can specify as
27
27
  many of these as required
@@ -30,7 +30,13 @@ In addition to starting your comment with the normal RDoc description. The follo
30
30
 
31
31
  - @response_field name description. Further specifies the fields that are returned within the response
32
32
 
33
- For example:
33
+ ## Ignored Documentation
34
+
35
+ This plugin only documents **classes** and **methods** with **@url** tags. It does not support module documentation.
36
+
37
+ The rationale here is that you are documenting external services (as represented by controllers and methods), and not internal code.
38
+
39
+ ## Example:
34
40
 
35
41
  ##
36
42
  # Retuns all samples, as XML, for the current user that match the given parameters.
@@ -68,8 +74,8 @@ For example:
68
74
  def index
69
75
  end
70
76
 
71
- Development
72
- -----------
77
+ ## Development
78
+
73
79
  You can run the template locally over the included sample code by using the following rake tasks:
74
80
 
75
81
  rake ex:clean
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.2.0
@@ -1,6 +1,7 @@
1
1
  ##
2
2
  # The Sample sevices let you list, create, update, and delete Samples from our application.
3
3
  # @url /sample
4
+ # @topic Sample
4
5
  #
5
6
  class SampleController
6
7
 
Binary file
Binary file
@@ -1,8 +1,24 @@
1
1
  <div class="service">
2
2
  <h1><span class="minor_heading">Resource: </span><%= object.tag("url").text %></h1>
3
- <% unless object.tag("topic").nil? %>
4
- <!-- fixme: needs style -->
5
- <h1><span class="minor_heading">Topic: </span><%= object.tag("topic").text %></h1>
3
+ <% unless object.tags("topic").empty? %>
4
+ <h3>Topics:</h3>
5
+ <ul class="box">
6
+ <% object.tags("topic").each do |topic| %>
7
+ <li><%= topic.text %></li>
8
+ <% end %>
9
+ </ul>
6
10
  <% end %>
7
11
  <%= yieldall %>
8
12
  </div>
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
@@ -222,4 +222,14 @@ h1 .note.title {
222
222
  text-transform: capitalize;
223
223
  }
224
224
 
225
+ ul.box {
226
+ font-size: 1em;
227
+ height: 1em;
228
+ }
225
229
 
230
+ ul.box li {
231
+ float: left;
232
+ display: block;
233
+ text-align: left;
234
+ padding-right: 10px;
235
+ }
@@ -0,0 +1,8 @@
1
+ <li><a href="<%= url_for('_index.html') %>">Index</a></li>
2
+ <% n = 1 %>
3
+ <% @items.sort_by {|s| s.name.to_s }.each do |resource| %>
4
+ <% unless resource.tags("url").first.nil? %>
5
+ <li class="r<%= n %>"><%= linkify(resource, resource.tags("url").first.text) %></li>
6
+ <% end %>
7
+ <% n = n == 2 ? 1 : 2 %>
8
+ <% end %>
@@ -0,0 +1,12 @@
1
+ <li><a href="<%= url_for('_index.html') %>">Index</a></li>
2
+ <% n = 1 %>
3
+ <% @topics.sort_by {|s,o| s }.each do |topic,objects| %>
4
+ <li class="r<%= n %>"><%= topic%></li>
5
+ <% unless objects.empty? %>
6
+ <% objects.each do |object| %>
7
+ <li class="r<%= n %>"><%= linkify(object, object.tag("url").text) %></li>
8
+ <% end%>
9
+ <% end %>
10
+ <% n = n == 2 ? 1 : 2 %>
11
+ <% end %>
12
+
@@ -4,10 +4,13 @@ function fixBoxInfoHeights() {
4
4
  $(this).prev().height($(this).height());
5
5
  });
6
6
  }
7
-
8
7
  function searchFrameLinks() {
9
- $('#service_list_link').click(function() {
10
- toggleSearchFrame(this, relpath + 'service_list.html');
8
+ $('#topic_list_link').click(function() {
9
+ toggleSearchFrame(this, relpath + 'topic_list.html');
10
+ });
11
+
12
+ $('#resource_list_link').click(function() {
13
+ toggleSearchFrame(this, relpath + 'resource_list.html');
11
14
  });
12
15
 
13
16
  $('#file_list_link').click(function() {
@@ -7,6 +7,11 @@ function fullListSearch() {
7
7
  var link = $(this).children('a:last');
8
8
  link.text(link.text());
9
9
  });
10
+ if (clicked) {
11
+ clicked.parents('ul').each(function() {
12
+ $(this).removeClass('collapsed').prev().removeClass('collapsed');
13
+ });
14
+ }
10
15
  highlight();
11
16
  }
12
17
  else {
@@ -40,6 +45,50 @@ function fullListSearch() {
40
45
  $('#full_list').after("<div id='noresults'>No results were found.</div>")
41
46
  }
42
47
 
48
+ clicked = null;
49
+ function linkList() {
50
+ $('#full_list li, #full_list li a:last').click(function(evt) {
51
+ if ($(this).hasClass('toggle')) return true;
52
+ if (this.tagName.toLowerCase() == "li") {
53
+ var toggle = $(this).children('a.toggle');
54
+ if (toggle.size() > 0 && evt.pageX < toggle.offset().left) {
55
+ toggle.click();
56
+ return false;
57
+ }
58
+ }
59
+ if (clicked) clicked.removeClass('clicked');
60
+ var win = window.parent;
61
+ if (window.top.frames.main) {
62
+ win = window.top.frames.main;
63
+ var title = $('html head title', win.document).text();
64
+ $('html head title', window.parent.document).text(title);
65
+ }
66
+ if (this.tagName.toLowerCase() == "a") {
67
+ clicked = $(this).parent('li').addClass('clicked');
68
+ win.location = this.href;
69
+ }
70
+ else {
71
+ clicked = $(this).addClass('clicked');
72
+ win.location = $(this).find('a:last').attr('href');
73
+ }
74
+ return false;
75
+ });
76
+ }
77
+
78
+ function collapse() {
79
+ if (!$('#full_list').hasClass('class')) return;
80
+ $('#full_list.class a.toggle').click(function() {
81
+ $(this).parent().toggleClass('collapsed').next().toggleClass('collapsed');
82
+ highlight();
83
+ return false;
84
+ });
85
+ $('#full_list.class ul').each(function() {
86
+ $(this).addClass('collapsed').prev().addClass('collapsed');
87
+ });
88
+ $('#full_list.class').children().removeClass('collapsed');
89
+ highlight();
90
+ }
91
+
43
92
  function highlight(no_padding) {
44
93
  var n = 1;
45
94
  $('#full_list li:visible').each(function() {
@@ -52,4 +101,17 @@ function highlight(no_padding) {
52
101
  });
53
102
  }
54
103
 
104
+ function escapeShortcut() {
105
+ $(document).keydown(function(evt) {
106
+ if (evt.which == 27) {
107
+ $('#search_frame', window.top.document).slideUp(100);
108
+ $('#search a', window.top.document).removeClass('active inactive')
109
+ $(window.top).focus();
110
+ }
111
+ });
112
+ }
113
+
114
+ $(escapeShortcut);
55
115
  $(fullListSearch);
116
+ $(linkList);
117
+ $(collapse);
@@ -1,10 +1,8 @@
1
1
  include Helpers::ModuleHelper
2
-
2
+ include Helpers::FilterHelper
3
3
 
4
4
  def init
5
- pp "--1--", options[:objects]
6
5
  options[:objects] = objects = run_verifier(options[:objects])
7
- pp "--2--", options[:objects]
8
6
  options[:files] = ([options[:readme]] + options[:files]).compact.map {|t| t.to_s }
9
7
  options[:readme] = options[:files].first
10
8
  options[:title] ||= "Documentation by YARD #{YARD::VERSION}"
@@ -69,15 +67,30 @@ def generate_assets
69
67
  end
70
68
 
71
69
  @object = Registry.root
72
- generate_service_list
70
+ generate_resource_list
71
+ generate_topic_list
73
72
  generate_file_list
74
73
  end
75
74
 
76
- def generate_service_list
75
+ def generate_topic_list
76
+ topic_objects = options[:objects].reject {|o| o.root? || !is_class?(o) || o.tags('url').empty? || o.tags('topic').empty? }
77
+ @topics = {}
78
+
79
+ topic_objects.each do |object|
80
+ object.tags('topic').each { |topic| (@topics[topic.text] ||= []) << object }
81
+ end
82
+
83
+
84
+ @list_title = "Topic List"
85
+ @list_type = "topic"
86
+ asset('topic_list.html', erb(:full_list))
87
+ end
88
+
89
+ def generate_resource_list
77
90
  @items = options[:objects]
78
- @list_title = "Service List"
79
- @list_type = "service"
80
- asset('service_list.html', erb(:full_list))
91
+ @list_title = "Resource List"
92
+ @list_type = "resource"
93
+ asset('resource_list.html', erb(:full_list))
81
94
  end
82
95
 
83
96
  def generate_file_list
@@ -18,18 +18,18 @@
18
18
  <table>
19
19
  <tr>
20
20
  <td valign='top' width="33%">
21
- <% @objects_by_letter.sort_by {|l,o| l.to_s }.each do |letter, objects| %>
21
+ <% @topics.sort_by {|t,o| t.to_s }.each do |topic, objects| %>
22
22
  <% if (i += 1) % 8 == 0 %>
23
23
  </td><td valign='top' width="33%">
24
24
  <% i = 0 %>
25
25
  <% end %>
26
- <ul id="alpha_<%= letter %>" class="alpha">
27
- <li class="letter"><%= letter %></li>
26
+ <ul id="alpha_<%= topic %>" class="alpha">
27
+ <li class="letter"><%= topic %></li>
28
28
  <ul>
29
29
  <% objects.each do |obj| %>
30
- <% unless obj.tags("topic").first.nil? %>
30
+ <% unless obj.tags("url").first.nil? %>
31
31
  <li>
32
- <%= linkify(obj, obj.tags("topic").first.text) %>
32
+ <%= linkify(obj, obj.tags("url").first.text) %>
33
33
  </li>
34
34
  <% end %>
35
35
  <% end %>
@@ -40,4 +40,16 @@
40
40
  </tr>
41
41
  </table>
42
42
 
43
+
44
+ <h2>Resources A-Z</h2>
45
+ <ul>
46
+ <% @objects.each do |object| %>
47
+ <% unless object.tags("url").first.nil? %>
48
+ <li>
49
+ <%= linkify(object, object.tags("url").first.text) %>
50
+ </li>
51
+ <% end %>
52
+ <% end %>
53
+ </ul>
54
+
43
55
  </div>
@@ -1,4 +1,5 @@
1
1
  <div id="search">
2
- <a id="service_list_link" href="#">Service List</a>
3
- <a id ="file_list_link" href="#">File List</a>
2
+ <a id="topic_list_link" href="#">Topic List</a>
3
+ <a id="resource_list_link" href="#">Resource List</a>
4
+ <a id="file_list_link" href="#">File List</a>
4
5
  </div>
@@ -1,3 +1,5 @@
1
+ include Helpers::FilterHelper
2
+
1
3
  def init
2
4
  @breadcrumb = []
3
5
 
@@ -25,9 +27,17 @@ def contents
25
27
  end
26
28
 
27
29
  def index
28
- @objects_by_letter = {}
29
- objects = @objects.reject {|o| o.root? || o.tags('topic').empty? }.sort_by {|o| o.tags('topic').first.text }
30
- objects.each {|o| (@objects_by_letter[o.tags('topic').first.text[0,1].upcase] ||= []) << o }
30
+
31
+ legitimate_objects = @objects.reject {|o| o.root? || !is_class?(o) || o.tags('url').empty?}
32
+ topic_objects = legitimate_objects.reject{|o| o.tags('topic').empty? }
33
+ @topics = {}
34
+
35
+ topic_objects.each do |object|
36
+ object.tags('topic').each { |topic| (@topics[topic.text] ||= []) << object }
37
+ end
38
+
39
+ @resources = legitimate_objects.sort_by {|o| o.tags('url').first.text }
40
+
31
41
  erb(:index)
32
42
  end
33
43
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{yard-rest-plugin}
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 = ["Aisha Fenton"]
@@ -24,6 +24,7 @@ Gem::Specification.new do |s|
24
24
  "lib/yard-rest-plugin.rb",
25
25
  "lib/yard-rest-plugin/base_helper.rb",
26
26
  "pkg/yard-rest-plugin-0.1.5.gem",
27
+ "pkg/yard-rest-plugin-0.2.0.gem",
27
28
  "templates/rest/.DS_Store",
28
29
  "templates/rest/class/html/header.erb",
29
30
  "templates/rest/class/html/method_details_list.erb",
@@ -37,7 +38,8 @@ Gem::Specification.new do |s|
37
38
  "templates/rest/fulldoc/html/css/style.css",
38
39
  "templates/rest/fulldoc/html/full_list.erb",
39
40
  "templates/rest/fulldoc/html/full_list_files.erb",
40
- "templates/rest/fulldoc/html/full_list_service.erb",
41
+ "templates/rest/fulldoc/html/full_list_resource.erb",
42
+ "templates/rest/fulldoc/html/full_list_topic.erb",
41
43
  "templates/rest/fulldoc/html/js/app.js",
42
44
  "templates/rest/fulldoc/html/js/full_list.js",
43
45
  "templates/rest/fulldoc/html/js/jquery.js",
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
8
- - 5
9
- version: 0.1.5
7
+ - 2
8
+ - 0
9
+ version: 0.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Aisha Fenton
@@ -47,6 +47,7 @@ files:
47
47
  - lib/yard-rest-plugin.rb
48
48
  - lib/yard-rest-plugin/base_helper.rb
49
49
  - pkg/yard-rest-plugin-0.1.5.gem
50
+ - pkg/yard-rest-plugin-0.2.0.gem
50
51
  - templates/rest/.DS_Store
51
52
  - templates/rest/class/html/header.erb
52
53
  - templates/rest/class/html/method_details_list.erb
@@ -60,7 +61,8 @@ files:
60
61
  - templates/rest/fulldoc/html/css/style.css
61
62
  - templates/rest/fulldoc/html/full_list.erb
62
63
  - templates/rest/fulldoc/html/full_list_files.erb
63
- - templates/rest/fulldoc/html/full_list_service.erb
64
+ - templates/rest/fulldoc/html/full_list_resource.erb
65
+ - templates/rest/fulldoc/html/full_list_topic.erb
64
66
  - templates/rest/fulldoc/html/js/app.js
65
67
  - templates/rest/fulldoc/html/js/full_list.js
66
68
  - templates/rest/fulldoc/html/js/jquery.js
@@ -1,8 +0,0 @@
1
- <li><a href="<%= url_for('_index.html') %>">/</a></li>
2
- <% n = 1 %>
3
- <% @items.sort_by {|s| s.name.to_s }.each do |service| %>
4
- <% unless service.tags("topic").first.nil? %>
5
- <li class="r<%= n %>"><%= linkify(service, service.tags("topic").first.text) %></li>
6
- <% end %>
7
- <% n = n == 2 ? 1 : 2 %>
8
- <% end %>