rain-doc 0.0.3 → 0.0.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0d3e2da94026e3479875b443e8557932639117a5
4
- data.tar.gz: 15a5d5ec27b9134d6f907dcc164f26c61727fe89
3
+ metadata.gz: 2ac2daf49d1502a2f8042be98b8bcf2f0a8c285f
4
+ data.tar.gz: 55fa316386cf105a6c5fe59b0deac896e0e27156
5
5
  SHA512:
6
- metadata.gz: 43155c813198015ec8c7fc36b9539d460a79c9e136bf7aee7e7a66f5025b1f3e695c20cf3c8242c01c6940980cf57bade86ee7002ba06b80ee29cdddd0f9c13f
7
- data.tar.gz: 14b6f9aca5e9f470eb67dc4e7f40cba480eb886a44473085c893a76ea9f5fb40143121a82193e6fc0d1dbce997b63882147183fb30d97ae0b6ea77d2ab30a36d
6
+ metadata.gz: 45a73cb660db67b8a21a012dbf1c05e32d70d853ddbdf4ec805e9c4600e0ccce561e309605c9cbabb55b74f37e86e19bdf81b5dd97a44258c5f789d75de72994
7
+ data.tar.gz: 90634848c3256aa1261a72e234f7df6216d0c4bafa9a77b8618b04be8f2bcc9104d9e20f8f8c2f3e0ca6d09c5b82c9ad8ea37e33347e081b0e48803699b093df
data/lib/doc.rb CHANGED
@@ -18,10 +18,11 @@ module Rain
18
18
  @@open_param_type = nil
19
19
  @@open_param_default = nil
20
20
  @@log_lines = false
21
+ @@parse_signatures = false
21
22
 
22
23
  # sets up the doc using the file name and contents
23
24
  # as a basis.
24
- def initialize(file_name, file_contents, log_lines = false)
25
+ def initialize(file_name, file_contents, log_lines = false, parse_signatures = false)
25
26
 
26
27
  # set up basic options and defaults
27
28
  self.file_name = file_name
@@ -30,6 +31,7 @@ module Rain
30
31
  self.parts = []
31
32
  self.lines = 0
32
33
  @@log_lines = log_lines
34
+ @@parse_signatures = parse_signatures
33
35
 
34
36
  # set the doc type based on extension
35
37
  case self.file_ext
@@ -69,7 +71,7 @@ module Rain
69
71
  self.file_contents.each_line do |line|
70
72
 
71
73
  # parse the current line
72
- result = self.parser.parse(line)
74
+ result = self.parser.parse(line, @@parse_signatures)
73
75
 
74
76
  # if there is no documentation for the result,
75
77
  # create a new part and then set the current part to nil.
@@ -95,6 +97,8 @@ module Rain
95
97
  self.current_part.set_route(result[:route])
96
98
  when :method
97
99
  self.current_part.set_method(result[:method])
100
+ when :signature
101
+ self.current_part.set_signature(result[:text])
98
102
  when :response
99
103
 
100
104
  # open the current response tag using the code as a key
@@ -133,9 +137,9 @@ module Rain
133
137
  # add the part and create a new one
134
138
  self.new_part
135
139
 
136
- # remove any empty parts (for ruby docs)
140
+ # remove any empty parts or parts without method signatures (for ruby docs)
137
141
  if self.type == :RUBY
138
- self.parts = self.parts.select{ |part| part.route != "//" }
142
+ self.parts = self.parts.select{ |part| part.route != "//" || !part.signature.nil? }
139
143
  end
140
144
  end
141
145
 
@@ -1,6 +1,9 @@
1
1
  module Rain
2
+
3
+ # the doc part is a model to store information about
2
4
  class DocPart
3
- attr_accessor :http_method, :responses, :route, :doc, :params, :headers
5
+
6
+ attr_accessor :http_method, :responses, :route, :doc, :params, :headers, :signature
4
7
 
5
8
  def initialize
6
9
  self.responses = []
@@ -124,6 +127,16 @@ module Rain
124
127
  return header[:text]
125
128
  end
126
129
 
130
+ # sets a method signature
131
+ def set_signature(sig)
132
+ self.signature = sig
133
+ end
134
+
135
+ # gets the method signature
136
+ def get_signature
137
+ self.signature
138
+ end
139
+
127
140
  def to_hash
128
141
  return {
129
142
  route: self.route,
@@ -131,7 +144,8 @@ module Rain
131
144
  headers: self.headers,
132
145
  doc: self.doc,
133
146
  responses: self.responses,
134
- http_method: self.http_method
147
+ http_method: self.http_method,
148
+ signature: self.signature
135
149
  }
136
150
  end
137
151
  end
@@ -16,9 +16,18 @@ module Rain
16
16
  # parses the current line, determining which tag
17
17
  # the line contains and returning the result
18
18
  # accordingly in a hash with the tag type
19
- def parse(line)
19
+ def parse(line, parse_signatures = false)
20
+
20
21
  # return nil if there is no # on the line for ruby.
21
- return nil if self.type == :RUBY && !line.strip().start_with?('#')
22
+ basic_stripped = line.strip().sub(' do', '')
23
+ return nil if self.type == :RUBY && basic_stripped == ''
24
+
25
+ # see if a signature part can be extracted if a signature is enabled
26
+ if parse_signatures
27
+ return nil if self.type == :RUBY && !basic_stripped.start_with?('#') && !(basic_stripped =~ /class|def|get|put|post|delete/)
28
+ else
29
+ return nil if self.type == :RUBY && !basic_stripped.start_with?('#')
30
+ end
22
31
 
23
32
  # strip blanks and # from the current line
24
33
  line = strip_current_line(line)
@@ -77,6 +86,16 @@ module Rain
77
86
  }
78
87
  end
79
88
 
89
+ # return method signature if found
90
+ if parse_signatures
91
+ if line.start_with?('def ', 'class ', 'get "', "get '", 'put "', "put '", 'post "', "post '", 'delete "', "delete '")
92
+ return {
93
+ tag: :signature,
94
+ text: line
95
+ }
96
+ end
97
+ end
98
+
80
99
  # return simple doc line if no tags fit
81
100
  return {
82
101
  tag: :doc,
@@ -7,14 +7,15 @@ class Rain::CLI < Thor
7
7
  @@docs = []
8
8
 
9
9
  desc "generate [file/sources/**]", "Generates the rain documentation"
10
- method_option :log_parse, aliases: "--lp", desc: "Show the output of each line parse"
10
+ method_option :log_parse, aliases: "--lp", desc: "Show the output of each line parse."
11
+ method_option :parse_signatures, aliases: "--s", desc: "Parse method and class documentation too. Defaults to false."
11
12
  def generate(*sources)
12
13
  print "Rain is parsing files in the directories #{sources} \n"
13
14
 
14
15
  # loop through all of the file sources and generate docs
15
16
  sources.each do |source|
16
17
  print "Parsing #{source} \n"
17
- @doc = Rain::Doc.new(source, File.read(Dir.pwd + "/#{source}"), options[:log_parse])
18
+ @doc = Rain::Doc.new(source, File.read(Dir.pwd + "/#{source}"), options[:log_parse].nil? ? false : true, options[:parse_signatures].nil? ? false : true)
18
19
  @doc.parse
19
20
 
20
21
  @@docs << @doc
@@ -41,6 +42,8 @@ class Rain::CLI < Thor
41
42
  end
42
43
 
43
44
  no_commands do
45
+
46
+ # Builds the HTML for each doc in the @@docs array.
44
47
  def build_html
45
48
 
46
49
  # delete the old output files and create the dir
@@ -57,6 +60,7 @@ class Rain::CLI < Thor
57
60
  # load the templates
58
61
  layout_template = File.read('./templates/layout.erb')
59
62
  doc_template = File.read('./templates/doc.erb')
63
+ nav_template = File.read('./templates/nav.erb')
60
64
 
61
65
  else
62
66
 
@@ -67,6 +71,51 @@ class Rain::CLI < Thor
67
71
  # load the templates
68
72
  layout_template = File.read(spec.gem_dir + '/templates/layout.erb')
69
73
  doc_template = File.read(spec.gem_dir + '/templates/doc.erb')
74
+ nav_template = File.read(spec.gem_dir + '/templates/nav.erb')
75
+ end
76
+
77
+ # loop through all of the docs and generate navigation from the docs and their parts
78
+ nav_parts = []
79
+ @@docs.each do |doc|
80
+
81
+ # get the html file name (same used for output) from the doc openstruct
82
+ doc_os = OpenStruct.new(doc.to_hash)
83
+ html_file_name = File.basename(doc_os.file_name, doc_os.file_ext) + '.html'
84
+
85
+ # set up the nav hash for the doc
86
+ nav = {
87
+ navdoc: {
88
+ title: doc_os.title,
89
+ url: "#{html_file_name}",
90
+ parts: []
91
+ }
92
+ }
93
+
94
+ # markdown docs do not have parts as the whole page counts as a "doc"
95
+ if doc_os.type != "MARKDOWN"
96
+
97
+ # loop through all of the parts and depending on whether
98
+ # it is for a signature or a route, construct the #anchor
99
+ # url differnetly
100
+ doc_os.parts.each do |part|
101
+ if !part[:signature].nil?
102
+ nav[:navdoc][:parts] << {
103
+ title: part[:signature],
104
+ url: "#{html_file_name}##{part[:signature].gsub(' ', '-').gsub(',', '').gsub('(', '-').gsub(')', '-')[0..12]}"
105
+ }
106
+ else
107
+ nav[:navdoc][:parts] << {
108
+ title: part[:route],
109
+ url: "#{html_file_name}##{part[:route].gsub('/', '-').gsub(':', '')}"
110
+ }
111
+ end
112
+ end
113
+ end
114
+
115
+ # render the nav and append it to the array of nav parts
116
+ nav_os = OpenStruct.new(nav)
117
+ nav_rendered = ERB.new(nav_template).result(nav_os.instance_eval {binding})
118
+ nav_parts << nav_rendered
70
119
  end
71
120
 
72
121
  # load the doc properties and parts into the doc template
@@ -74,11 +123,10 @@ class Rain::CLI < Thor
74
123
 
75
124
  # create an openstruct from the current doc and render into the template
76
125
  doc_os = OpenStruct.new(doc.to_hash)
77
-
78
126
  doc_rendered = ERB.new(doc_template).result(doc_os.instance_eval {binding})
79
127
 
80
- # create a struct with the rendered doc output then render into the layout
81
- layout_os = OpenStruct.new({ doc_output: doc_rendered, title: doc_os.title })
128
+ # create a struct with the rendered doc output then render into the layout with nav
129
+ layout_os = OpenStruct.new({ doc_output: doc_rendered, title: doc_os.title, nav_parts: nav_parts })
82
130
  html = ERB.new(layout_template).result(layout_os.instance_eval {binding})
83
131
 
84
132
  # write the html to a file
@@ -86,7 +134,17 @@ class Rain::CLI < Thor
86
134
  end
87
135
  end
88
136
 
137
+ # Creates the html file for the specified doc
138
+ # with the HTML rendered from the ERB template
139
+ #
140
+ # {param doc hash}
141
+ # A hash representation of the Rain::Doc class, containing a single document and its parts.
142
+ # {/param}
143
+ # {param html string}
144
+ # The HTML rendered from the ERB layout and doc template.
145
+ # {/param}
89
146
  def output_html(doc, html)
147
+
90
148
  # replace file_name extenstions with .html
91
149
  file_name = File.basename(doc.file_name, doc.file_ext) + '.html'
92
150
 
@@ -3,13 +3,15 @@
3
3
 
4
4
  <!-- HTTP method and route (if both specified) -->
5
5
  <% if !part[:route].nil? && !part[:http_method].nil? %>
6
- <p><strong><%= part[:http_method] %></strong> <%= part[:route] %></p>
6
+ <p id="<%= part[:route].gsub('/', '-').gsub(':', '') %>"><strong><%= part[:http_method] %></strong> <%= part[:route] %></p>
7
+ <% elsif !part[:signature].nil? %>
8
+ <p id="<%= part[:signature].gsub(' ', '-').gsub(',', '').gsub('(', '-').gsub(')', '-')[0..12] %>"><strong><%= part[:signature] %></strong></p>
7
9
  <% end %>
8
10
 
9
11
  <!-- display all of the docs together for the part -->
10
- <% part[:doc].each do |doc| %>
11
- <p><%= doc %></p>
12
- <% end %>
12
+ <p><% part[:doc].each do |doc| %>
13
+ <%= doc %>
14
+ <% end %></p>
13
15
 
14
16
  <!-- show all of the params in a table -->
15
17
  <% if part[:params].length > 0 %>
@@ -6,9 +6,17 @@
6
6
  </head>
7
7
  <body>
8
8
  <div class="container">
9
- <div class="twelve columns" style="padding: 20px 0">
10
- <h2><%= title %></h2>
11
- <%= doc_output %>
9
+ <div class="row">
10
+ <div class="three columns" style="padding: 20px 0">
11
+ <h5>Navigation</h5>
12
+ <% nav_parts.each do |part| %>
13
+ <%= part %>
14
+ <% end %>
15
+ </div>
16
+ <div class="nine columns" style="padding: 20px 0">
17
+ <h2><%= title %></h2>
18
+ <%= doc_output %>
19
+ </div>
12
20
  </div>
13
21
  </div>
14
22
  </body>
@@ -0,0 +1,7 @@
1
+ <ul>
2
+ <li><a href="<%= navdoc[:url] %>"><%= navdoc[:title] %></a>
3
+ <ul><% navdoc[:parts].each do |part| %>
4
+ <li><a href="<%= part[:url] %>"><%= part[:title] %></a></li>
5
+ <% end %></ul>
6
+ </li>
7
+ </ul>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rain-doc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Brennan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-17 00:00:00.000000000 Z
11
+ date: 2014-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -75,6 +75,7 @@ files:
75
75
  - templates/css/skeleton.css
76
76
  - templates/doc.erb
77
77
  - templates/layout.erb
78
+ - templates/nav.erb
78
79
  homepage: http://martin-brennan.github.io/rain/
79
80
  licenses:
80
81
  - MIT