api_guides 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module ApiGuides
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,10 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module ApiGuides
4
+ module ViewHelper
5
+ # AKA permalink
6
+ def anchorize(text)
7
+ text.gsub(/[^\w-]/, ' ').gsub(/\s+/, '-').downcase
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module ApiGuides
4
+ module Views
5
+ class Document
6
+ include ViewHelper
7
+
8
+ def initialize(document)
9
+ @document = document
10
+ end
11
+
12
+ def id
13
+ anchorize "d-#{@document.title}"
14
+ end
15
+
16
+ def title
17
+ @document.title
18
+ end
19
+
20
+ def sections
21
+ @document.sections.map { |s| Section.new(s) }
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module ApiGuides
4
+ module Views
5
+ class Example
6
+ include MarkdownHelper
7
+
8
+ def initialize(example)
9
+ @example = example
10
+ end
11
+
12
+ def content
13
+ markdown @example.content
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,10 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module ApiGuides
4
+ # Represents a HTML page that can be generated using Mustache.
5
+ class Page < ::Mustache
6
+ self.template_file = "#{File.expand_path('../../', __FILE__)}/templates/page.mustache"
7
+
8
+ attr_accessor :title, :logo, :documents
9
+ end
10
+ end
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module ApiGuides
4
+ module Views
5
+ class Reference
6
+ include MarkdownHelper
7
+ include ViewHelper
8
+
9
+ def initialize(reference)
10
+ @reference = reference
11
+ end
12
+
13
+ def id
14
+ anchorize "r-#{@reference.title}"
15
+ end
16
+
17
+ def title
18
+ @reference.title
19
+ end
20
+
21
+ def content
22
+ markdown @reference.content
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,38 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module ApiGuides
4
+ module Views
5
+ class Section
6
+ include MarkdownHelper
7
+ include ViewHelper
8
+
9
+ def initialize(section)
10
+ @section = section
11
+ end
12
+
13
+ def id
14
+ anchorize "s-#{@section.title}"
15
+ end
16
+
17
+ def title
18
+ @section.title
19
+ end
20
+
21
+ def docs
22
+ markdown @section.docs if @section.docs
23
+ end
24
+
25
+ def reference
26
+ if @section.reference
27
+ Reference.new @section.reference
28
+ else
29
+ nil
30
+ end
31
+ end
32
+
33
+ def examples
34
+ (@section.examples || []).map {|ex| Example.new ex }
35
+ end
36
+ end
37
+ end
38
+ end
data/readme.md ADDED
@@ -0,0 +1,343 @@
1
+ # API Guides
2
+
3
+ **Example (and primary use case)**:
4
+ [http://developer.radiumcrm.com](http://developer.radiumcrm.com)
5
+
6
+ `ApiGuides` is a simple static generator based off Docco. It is
7
+ specifically designed to handle writing documentation for HTTP APIs,
8
+ however it should be flexible enough to work in many other situations as
9
+ well. The generator will create HTML, CSS, an optional logo image inside
10
+ a directory. You can deploy the site using any web server or Heroku if
11
+ you like.
12
+
13
+ You should use this generator if you need want to create documenation
14
+ with these things in mind:
15
+
16
+ 1. You want to write in Markdown.
17
+ 2. You want syntax highlighting for a variety of langauges.
18
+ 3. You want an automatic table of contents
19
+ 4. You want an index of all the technical information
20
+ 5. You want to provide examples of using your code in one or more
21
+ different languages or frameworks.
22
+ 6. You want to structure your documentation between different code
23
+ repos or separate files.
24
+ 7. You want to link to specific sections of documentation from within
25
+ other sections of documentation.
26
+ 8. You have **alot** of documentation to write. This generator all works
27
+ well with small about of documentation as well.
28
+ 9. You want something that looks pretty, is easy to read, and don't want
29
+ to make any CSS decisions or worry presentational issues.
30
+
31
+ If you think most of those things sound good then read on.
32
+
33
+ ## Structuring Documentation
34
+
35
+ Raw documenation is kept in XML files with content written in Markdown.
36
+ I've choosen XML because it is great at storing and organizing large
37
+ amounts of text. Don't worry, you won't have to mess with XML that much.
38
+
39
+ You can (and should) structure your documenation in separate files. You
40
+ can think of each file has a chapter in your documentation. You may have
41
+ one file that generally describes your program and a file for each
42
+ feature.
43
+
44
+ A document is composed of sections. A section is composed of textual
45
+ content written in markdown, a reference written in markdown, and zero,
46
+ one, or more examples written in markdown. Here is an example document.
47
+
48
+ ```xml
49
+ <document>
50
+ <title>introduction</title>
51
+ <position>1</position>
52
+ <section title="about">
53
+ <docs>
54
+ <![cdata[
55
+ # write your markdown here
56
+ ]>
57
+ </docs>
58
+ <reference title="about">
59
+ <![cdata[
60
+ # write some stuff describing your "about" interface
61
+ ]]>
62
+ </reference>
63
+ <examples>
64
+ <example language="ruby">
65
+ <![cdata[
66
+ # write some markdown for your ruby example
67
+ ]]>
68
+ </example>
69
+ <example language="python">
70
+ <![cdata[
71
+ # write some markdown for your python example
72
+ ]]>
73
+ </example>
74
+ </examples>
75
+ </section>
76
+ </document>
77
+ ```
78
+
79
+ There is a lot to take in from that example so let's break it down!
80
+
81
+ ### The document Element
82
+
83
+ Is the root element and must contain a `title`, `position` and one or
84
+ more `sections`. A `<document>` signifys a new chapter of your
85
+ documentation. The `title` will be placed in a `h1` and subsequent
86
+ section titles will be placed in `<h2>`s. The `<position>` element
87
+ determines the order.
88
+
89
+ ### The section Element
90
+
91
+ Sections are a way to group textual documentation, examples, and
92
+ technical documentation. You can give a `<section>` a `title` attribute.
93
+ This will create a TOC entry under the parent `<document>`'s `<title>`.
94
+ You can omit `title` if you do not want a header or TOC entry generated.
95
+ You usually skip this for the first section since most of the time you
96
+ don't want a header right under another without any text in between. You
97
+ may include `<examples>` or `<reference>` if you wish, but you should
98
+ always include `<docs>`. The examples and reference material will always
99
+ be shown with the associated docs. You can omit `<docs>` but that
100
+ doesn't make any sense! Who's going to figure out what they're doing
101
+ without the docs.
102
+
103
+ ### The reference Element
104
+
105
+ The Reference element contains technical documentation for the
106
+ associated docs. It may be a method signature or whatever you can think
107
+ of. The reference will always be shown with the associated docs and with
108
+ any examples. You may also give the `<reference>` a `title` attribute.
109
+ `<references>` with a `title` attribute will be included in the index.
110
+ You may omit the `title` if you do not want this to be indexed. You
111
+ should always include a reference!
112
+
113
+ ### The example Element
114
+
115
+ Examples contain code for the language or framework specified in the
116
+ `language` attribute. An example will always be shown with the reference
117
+ and associated docs. You can `omit` the language if you want. If you do,
118
+ the example will be shown for **all** different languages.
119
+ You can write whatever you want for the content. It
120
+ can be text, lists, as well as code. The generator makes no assumption
121
+ about what will be in the example, just that it will be markdown. A
122
+ different version of the documentation will be generated for each
123
+ language specified in your documents.
124
+
125
+ ### General Output
126
+
127
+ Your docs will always be show on the left. If a reference is present, it
128
+ will be shown exactly opposite of the docs. If examples are present,
129
+ they will be shown below the reference.
130
+
131
+ ### Generating the Table of Contents
132
+
133
+ A TOC will be generated according to `<title>` elements inside the
134
+ `<document>` and `title` attributes on the `<section>` element. Here are
135
+ some example XML documents and generated table of contents.
136
+
137
+ ```xml
138
+ <document>
139
+ <title>Introduction</title>
140
+ <position>1</position>
141
+ <section>
142
+ <docs>Foo</docs>
143
+ </section>
144
+ <section title="Overview">
145
+ <docs>Bar</docs>
146
+ </section>
147
+ <section title="Response Codes">
148
+ <docs>Bar</docs>
149
+ </section>
150
+ </document>
151
+ ```
152
+
153
+ ```xml
154
+ <document>
155
+ <title>Response Codes</title>
156
+ <position>2</position>
157
+ <section title="Success">
158
+ <docs>Foo</docs>
159
+ </section>
160
+ <section title="Redirection">
161
+ <docs>Bar</docs>
162
+ </section>
163
+ <section title="Failure">
164
+ <docs>Bar</docs>
165
+ </section>
166
+ </document>
167
+ ```
168
+
169
+ 1. Introduction
170
+ 1. Overview
171
+ 2. Reponse Codes
172
+ 2. Rreponse Codes
173
+ 1. Success
174
+ 2. Redirection
175
+ 3. Failure
176
+
177
+ ## Markdown
178
+
179
+ I love Markdown. It's mucher easy to read and write than textile.
180
+ [Redcarpet](https://github.com/tanoku/redcarpet) is used for parsing. It includes some more features like
181
+ fenced code blocks with language specification (yay!), tables, and a few
182
+ other tricks. You can read their documentation for the complete list of
183
+ available features. You may also include HTML inside the markdown,
184
+ however, you cannot use markdown inside the HTML. Common use case for
185
+ HTML is `<dl>`. Definition lists are part of PHP markdown extra and not
186
+ supported by Redcarpet.
187
+
188
+ [Pygments](http://pygments.org/) is used for syntax highlighting. The generator uses the
189
+ pygments webservice so you don't have to worry about installing anything
190
+ python related on your machine. It supports a very large variety of
191
+ different languages and the generator includes a theme to make all of
192
+ them look nice and pretty.
193
+
194
+ ## Linking
195
+
196
+ You can also link to sections, documents, or references through out your
197
+ documentation. Each element will be given an ID which you can use to
198
+ create an anchor link for. They are prefaced with `d`, `s` or `r`
199
+ depending on what they are. This is to prevent duplication. The titles
200
+ are are dasherized aka permalinks. Here are some examples:
201
+
202
+ 1. `<section title="Introduction and about">` -->
203
+ "s-introduction-and-about"
204
+ 2. `<reference title="Logging In">` --> "r-logging-in"
205
+ 3. `<title>Messages: SMS, Email, & IM</title>` -->
206
+ "d-messages-sms-email-im"
207
+
208
+ ## Installation and Use
209
+
210
+ Firs thing you'll need to do is install ruby. I'm assuming you already
211
+ have this installed or know how to install for your operating system.
212
+ After that, you can simply install the gem.
213
+
214
+ ```
215
+ gem install api_guides
216
+ ```
217
+
218
+ The easiest way to generate the docs is from a rake task. Here is an
219
+ example. Assume your directory sturcture is like this:
220
+
221
+ ```
222
+ |- source/
223
+ ---------| guide1.xml
224
+ ---------| guide2.xml
225
+ ---------| guide3.xml
226
+ |- site/
227
+ |- Rakefile
228
+ ```
229
+
230
+ Here is an example Rakefile:
231
+
232
+ ```ruby
233
+ require 'bundler'
234
+ require 'api_guides'
235
+
236
+ task :generate do
237
+ ApiGuides::Generator.new({
238
+ :source_path => "#{File.dirname(__FILE__)}/source",
239
+ :site_path => "#{File.dirname(__FILE__)}/site",
240
+ :title => 'Cool API',
241
+ :logo => "#{File.dirname(__FILE__)}/logo.png",
242
+ :default => "ruby"
243
+ }).generate
244
+ end
245
+
246
+ task :default => :generate
247
+ ```
248
+
249
+ When ever you update your guides just run:
250
+
251
+ ```bash
252
+ $ bundle exec rake
253
+ ```
254
+
255
+ This will stick all the generated files into `site/`.
256
+ **Note**: Always deal with absolute paths for certanity.
257
+ **WARNING**: The contents of `site_path` will be deleted before
258
+ generation occurs. Don't put anything in there if you want to keep it.
259
+
260
+ ### Options
261
+
262
+ The `ApiGuides::Generator` constructor takes a few options. Here are the
263
+ details.
264
+
265
+ * `:source_path`: Abosolute path to the directory containing all the XML
266
+ documents.
267
+ * `:site_path`: Absolute path for the generated files
268
+ * `:title`: It goes in the navbar and the `<title>` in the finished HTML
269
+ * `:default`: Required if there are more than one lanauges. This sets
270
+ the examples on the index page.
271
+ * `:logo`: _Optional_. Absolute path to an image to put in the navbar.
272
+
273
+ ## Deploying
274
+
275
+ Since the generating documentation is just static HTML, CSS, and images
276
+ we can deploy to any web server very easily. This section shows you how
277
+ to write a simple [Rack](http://rack.rubyforge.org/) server so you can deploy it to Heroku.
278
+
279
+ First, create `config.ru` file in your directory. Here are the contents:
280
+
281
+ ```ruby
282
+ require 'rack-rewrite'
283
+
284
+ use Rack::Rewrite do
285
+ rewrite '/', '/index.html'
286
+ end
287
+
288
+ root = "#{Dir.pwd}/site"
289
+ run Rack::Directory.new("#{root}")
290
+ ```
291
+
292
+ Make sure you update the `root =` line with whatever directory holds all
293
+ the files.
294
+
295
+ You can test it locally by running these commands:
296
+
297
+ ```bash
298
+ $ gem install rack rack-rewrite
299
+ $ rackup -p 3000
300
+ ```
301
+ Now open `http://localhost:3000` and you should see your documentation.
302
+
303
+ Now, create a `Procfile` so heroku knows how to start your application:
304
+
305
+ ```yml
306
+ web: bundle exec rackup -p $PORT
307
+ ```
308
+
309
+ Now you're ready to deploy your documentation!
310
+
311
+ ```bash
312
+ $ bundle exec rake # to generate the documentation if you haven't yet
313
+ $ git init
314
+ $ git add -A
315
+ $ git commit -m 'Update documentation'
316
+ $ heroku create --stack cedar
317
+ $ git push heroku master
318
+ $ heroku open
319
+ ```
320
+
321
+ ## Credits
322
+
323
+ * [Docco](http://jashkenas.github.com/docco/) - For creating the original style. CSS taken from source
324
+ with some modifications.
325
+ * [Stripe](https://stripe.com/docs/api) - For inspiring more complex documentation and layout.
326
+ Although, I think this came out better!
327
+ * [Rocco](https://github.com/rtomayko/rocco) - For demonstrating how to use Mustache
328
+ * [Twitter Boostrap](http://twitter.github.com/bootstrap) - For the navbar. I only took what I needed and
329
+ repackaged them into the `#topbar` selector.
330
+
331
+ ## Hacking
332
+
333
+ Feel free to hack on the code in your own fork. Send me a pull request
334
+ if you do cool stuff.
335
+
336
+ ## Documentation
337
+
338
+ Documentation is written for Rocco. You can read the annotated source
339
+ [here](http://threadedlabs.github.com/api_guides).
340
+
341
+ ## License
342
+
343
+ MIT.