yard-rest-plugin 0.1.5 → 0.2.0

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/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 %>