2022-05-09 11:45:50 -04:00
|
|
|
# Documentation Guide
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
This guide discusses recommendations for documenting
|
|
|
|
classes, modules, and methods
|
|
|
|
in the Ruby core and in the Ruby standard library.
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
## Generating documentation
|
|
|
|
|
2022-05-19 04:07:56 -04:00
|
|
|
Most Ruby documentation lives in the source files and is written in
|
|
|
|
[RDoc format](rdoc-ref:RDoc::Markup).
|
2022-05-09 11:45:50 -04:00
|
|
|
|
2022-05-19 04:07:56 -04:00
|
|
|
Some pages live under the `doc` folder and can be written in either
|
|
|
|
`.rdoc` or `.md` format, determined by the file extension.
|
2022-05-09 11:45:50 -04:00
|
|
|
|
2022-05-19 04:07:56 -04:00
|
|
|
To generate the output of documentation changes in HTML in the
|
|
|
|
`{build folder}/.ext/html` directory, run the following inside your
|
|
|
|
build directory:
|
2022-05-09 11:45:50 -04:00
|
|
|
|
2022-05-19 04:07:56 -04:00
|
|
|
```sh
|
2022-05-09 11:45:50 -04:00
|
|
|
make html
|
|
|
|
```
|
|
|
|
|
2022-05-19 04:07:56 -04:00
|
|
|
Then you can preview your changes by opening
|
|
|
|
`{build folder}/.ext/html/index.html` file in your browser.
|
2022-05-09 11:45:50 -04:00
|
|
|
|
|
|
|
|
|
|
|
## Goal
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
The goal of Ruby documentation is to impart the most important
|
|
|
|
and relevant in the shortest time.
|
|
|
|
The reader should be able to quickly understand the usefulness
|
|
|
|
of the subject code and how to use it.
|
|
|
|
|
|
|
|
Providing too little information is bad, but providing unimportant
|
|
|
|
information or unnecessary examples is not good either.
|
|
|
|
Use your judgment about what the user needs to know.
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
## General Guidelines
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
- Keep in mind that the reader may not be fluent in \English.
|
|
|
|
- Write short declarative or imperative sentences.
|
|
|
|
- Group sentences into (ideally short) paragraphs,
|
|
|
|
each covering a single topic.
|
2022-05-09 11:45:50 -04:00
|
|
|
- Organize material with [headers](rdoc-ref:RDoc::Markup@Headers).
|
2021-07-18 18:43:34 -04:00
|
|
|
- Refer to authoritative and relevant sources using
|
2022-05-09 11:45:50 -04:00
|
|
|
[links](rdoc-ref:RDoc::Markup@Links).
|
2021-07-18 18:43:34 -04:00
|
|
|
- Use simple verb tenses: simple present, simple past, simple future.
|
|
|
|
- Use simple sentence structure, not compound or complex structure.
|
|
|
|
- Avoid:
|
2022-05-09 11:45:50 -04:00
|
|
|
- Excessive comma-separated phrases;
|
|
|
|
consider a [list](rdoc-ref:RDoc::Markup@Simple+Lists).
|
|
|
|
- Idioms and culture-specific references.
|
|
|
|
- Overuse of headers.
|
|
|
|
- Using US-ASCII-incompatible characters in C source files;
|
|
|
|
see [Characters](#label-Characters) below.
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
### Characters
|
2022-03-11 11:46:47 -05:00
|
|
|
|
|
|
|
Use only US-ASCII-compatible characters in a C source file.
|
|
|
|
(If you use other characters, the Ruby CI will gently let you know.)
|
|
|
|
|
|
|
|
If want to put ASCII-incompatible characters into the documentation
|
|
|
|
for a C-coded class, module, or method, there are workarounds
|
2022-05-19 04:07:56 -04:00
|
|
|
involving new files `doc/*.rdoc`:
|
2022-03-11 11:46:47 -05:00
|
|
|
|
2022-05-19 04:07:56 -04:00
|
|
|
- For class `Foo` (defined in file `foo.c`),
|
|
|
|
create file `doc/foo.rdoc`, declare `class Foo; end`,
|
2022-03-11 11:46:47 -05:00
|
|
|
and place the class documentation above that declaration:
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
```ruby
|
2022-03-11 11:46:47 -05:00
|
|
|
# Documentation for class Foo goes here.
|
|
|
|
class Foo; end
|
2022-05-09 11:45:50 -04:00
|
|
|
```
|
2022-03-11 11:46:47 -05:00
|
|
|
|
2022-05-19 04:07:56 -04:00
|
|
|
- Similarly, for module `Bar` (defined in file `bar.c`,
|
|
|
|
create file `doc/bar.rdoc`, declare `module Bar; end`,
|
2022-03-11 11:46:47 -05:00
|
|
|
and place the module documentation above that declaration:
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
```ruby
|
2022-03-11 11:46:47 -05:00
|
|
|
# Documentation for module Bar goes here.
|
|
|
|
module Bar; end
|
2022-05-09 11:45:50 -04:00
|
|
|
```
|
2022-03-11 11:46:47 -05:00
|
|
|
|
2022-03-21 15:58:00 -04:00
|
|
|
- For a method, things are different.
|
|
|
|
Documenting a method as above disables the "click to toggle source" feature
|
2022-04-07 03:47:07 -04:00
|
|
|
in the rendered documentation.
|
2022-03-11 11:46:47 -05:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
Therefore it's best to use file inclusion:
|
2022-05-19 04:07:56 -04:00
|
|
|
|
|
|
|
- Retain the `call-seq` in the C code.
|
2022-05-09 11:45:50 -04:00
|
|
|
- Use file inclusion (`:include:`) to include text from an .rdoc file.
|
2022-03-11 11:46:47 -05:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
Example:
|
2022-03-11 11:46:47 -05:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
```c
|
2022-03-21 15:58:00 -04:00
|
|
|
/*
|
|
|
|
* call-seq:
|
|
|
|
* each_byte {|byte| ... } -> self
|
|
|
|
* each_byte -> enumerator
|
|
|
|
*
|
2022-05-19 04:07:56 -04:00
|
|
|
* :include: doc/string/each_byte.rdoc
|
2022-03-21 15:58:00 -04:00
|
|
|
*
|
|
|
|
*/
|
2022-05-09 11:45:50 -04:00
|
|
|
```
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
### \RDoc
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
Ruby is documented using RDoc.
|
|
|
|
For information on \RDoc syntax and features, see the
|
2022-05-09 11:45:50 -04:00
|
|
|
[RDoc Markup Reference](rdoc-ref:RDoc::Markup@RDoc+Markup+Reference).
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-19 04:07:56 -04:00
|
|
|
### Output from `irb`
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
For code examples, consider using interactive Ruby,
|
2022-05-09 11:45:50 -04:00
|
|
|
[irb](https://ruby-doc.org/stdlib/libdoc/irb/rdoc/IRB.html).
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
For a code example that includes `irb` output,
|
2022-05-19 04:07:56 -04:00
|
|
|
consider aligning `# => ...` in successive lines.
|
2021-07-18 18:43:34 -04:00
|
|
|
Alignment may sometimes aid readability:
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
```ruby
|
|
|
|
a = [1, 2, 3] #=> [1, 2, 3]
|
|
|
|
a.shuffle! #=> [2, 3, 1]
|
|
|
|
a #=> [2, 3, 1]
|
|
|
|
```
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
### Headers
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
Organize a long discussion with [headers](rdoc-ref:RDoc::Markup@Headers).
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
### Blank Lines
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
A blank line begins a new paragraph.
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
A [code block](rdoc-ref:RDoc::Markup@Paragraphs+and+Verbatim)
|
|
|
|
or [list](rdoc-ref:RDoc::Markup@Simple+Lists)
|
2021-07-18 18:43:34 -04:00
|
|
|
should be preceded by and followed by a blank line.
|
2022-05-09 11:45:50 -04:00
|
|
|
This is unnecessary for the HTML output, but helps in the `ri` output.
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
### Auto-Linking
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
In general, \RDoc's auto-linking should not be suppressed.
|
2022-05-19 04:07:56 -04:00
|
|
|
For example, we should write `Array`, not `\Array`.
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
We might consider whether to suppress when:
|
|
|
|
|
|
|
|
- The word in question does not refer to a Ruby entity
|
|
|
|
(e.g., some uses of _Class_ or _English_).
|
|
|
|
- The reference is to the current class document
|
2022-05-09 11:45:50 -04:00
|
|
|
(e.g., _Array_ in the documentation for class `Array`).
|
2021-07-18 18:43:34 -04:00
|
|
|
- The same reference is repeated many times
|
|
|
|
(e.g., _RDoc_ on this page).
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
## Documenting Classes and Modules
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
The general structure of the class or module documentation should be:
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
- Synopsis
|
|
|
|
- Common uses, with examples
|
|
|
|
- "What's Here" summary (optional)
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
### Synopsis
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
The synopsis is a short description of what the class or module does
|
|
|
|
and why the reader might want to use it.
|
|
|
|
Avoid details in the synopsis.
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
### Common Uses
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
Show common uses of the class or module.
|
|
|
|
Depending on the class or module, this section may vary greatly
|
|
|
|
in both length and complexity.
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
### What's Here Summary
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
The documentation for a class or module may include a "What's Here" section.
|
|
|
|
|
|
|
|
Guidelines:
|
|
|
|
|
2022-05-19 04:07:56 -04:00
|
|
|
- The section title is `What's Here`.
|
2021-07-18 18:43:34 -04:00
|
|
|
- Consider listing the parent class and any included modules; consider
|
2022-05-09 11:45:50 -04:00
|
|
|
[links](rdoc-ref:RDoc::Markup@Links)
|
2021-07-18 18:43:34 -04:00
|
|
|
to their "What's Here" sections if those exist.
|
2022-03-07 06:04:16 -05:00
|
|
|
- List methods as a bullet list:
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
- Begin each item with the method name, followed by a colon
|
|
|
|
and a short description.
|
|
|
|
- If the method has aliases, mention them in parentheses before the colon
|
|
|
|
(and do not list the aliases separately).
|
|
|
|
- Check the rendered documentation to determine whether \RDoc has recognized
|
|
|
|
the method and linked to it; if not, manually insert a
|
|
|
|
[link](rdoc-ref:RDoc::Markup@Links).
|
2022-03-07 06:04:16 -05:00
|
|
|
|
|
|
|
- If there are numerous entries, consider grouping them into subsections with headers.
|
2021-07-18 18:43:34 -04:00
|
|
|
- If there are more than a few such subsections,
|
|
|
|
consider adding a table of contents just below the main section title.
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
## Documenting Methods
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
### General Structure
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
The general structure of the method documentation should be:
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
- Calling sequence (for methods written in C).
|
|
|
|
- Synopsis (short description).
|
|
|
|
- Details and examples.
|
|
|
|
- Argument description (if necessary).
|
|
|
|
- Corner cases and exceptions.
|
|
|
|
- Aliases.
|
|
|
|
- Related methods (optional).
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
### Calling Sequence (for methods written in C)
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
For methods written in Ruby, \RDoc documents the calling sequence automatically.
|
|
|
|
|
|
|
|
For methods written in C, \RDoc cannot determine what arguments
|
|
|
|
the method accepts, so those need to be documented using \RDoc directive
|
2022-05-19 04:07:56 -04:00
|
|
|
[`:call-seq:`](rdoc-ref:RDoc::Markup@Method+arguments).
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
Example:
|
|
|
|
|
2022-05-19 04:07:56 -04:00
|
|
|
```c
|
2022-05-09 11:45:50 -04:00
|
|
|
* call-seq:
|
|
|
|
* array.count -> integer
|
|
|
|
* array.count(obj) -> integer
|
|
|
|
* array.count {|element| ... } -> integer
|
|
|
|
```
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-19 04:07:56 -04:00
|
|
|
When creating the `call-seq`, use the form
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
```
|
|
|
|
receiver_type.method_name(arguments) {|block_arguments|} -> return_type
|
|
|
|
```
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
Omit the parentheses for cases where the method does not accept arguments,
|
|
|
|
and omit the block for cases where a block is not accepted.
|
|
|
|
|
|
|
|
In the cases where method can return multiple different types, separate the
|
|
|
|
types with "or". If the method can return any type, use "object". If the
|
|
|
|
method returns the receiver, use "self".
|
|
|
|
|
2022-05-19 04:07:56 -04:00
|
|
|
In cases where the method accepts optional arguments, use a `call-seq` with
|
|
|
|
an optional argument if the method has the same behavior when an argument is
|
|
|
|
omitted as when the argument is passed with the default value. For example,
|
2021-07-18 18:43:34 -04:00
|
|
|
use:
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
```
|
|
|
|
obj.respond_to?(symbol, include_all=false) -> true or false
|
|
|
|
```
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
Instead of:
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
```
|
|
|
|
obj.respond_to?(symbol) -> true or false
|
|
|
|
obj.respond_to?(symbol, include_all) -> true or false
|
|
|
|
```
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-19 04:07:56 -04:00
|
|
|
However, as shown above for `Array#count`, use separate lines if the
|
2021-07-18 18:43:34 -04:00
|
|
|
behavior is different if the argument is omitted.
|
|
|
|
|
2022-05-19 04:07:56 -04:00
|
|
|
Omit aliases from the `call-seq`, but mention them near the end (see below).
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
|
2022-05-19 04:07:56 -04:00
|
|
|
A `call-seq` block should have `{|x| ... }`, not `{|x| block }` or `{|x| code }`.
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
A `call-seq` output should:
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
- Have `self`, not `receiver` or `array`.
|
|
|
|
- Begin with `new_` if and only if the output object is a new instance
|
|
|
|
of the receiver's class, to emphasize that the output object is not `self`.
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
### Synopsis
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
The synopsis comes next, and is a short description of what the
|
|
|
|
method does and why you would want to use it. Ideally, this
|
|
|
|
is a single sentence, but for more complex methods it may require
|
|
|
|
an entire paragraph.
|
|
|
|
|
2022-05-19 04:07:56 -04:00
|
|
|
For `Array#count`, the synopsis is:
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
```
|
|
|
|
Returns a count of specified elements.
|
|
|
|
```
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
This is great as it is short and descriptive. Avoid documenting
|
|
|
|
too much in the synopsis, stick to the most important information
|
|
|
|
for the benefit of the reader.
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
### Details and Examples
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
Most non-trivial methods benefit from examples, as well as details
|
|
|
|
beyond what is given in the synopsis. In the details and examples
|
|
|
|
section, you can document how the method handles different types
|
|
|
|
of arguments, and provides examples on proper usage. In this
|
|
|
|
section, focus on how to use the method properly, not on how the
|
|
|
|
method handles improper arguments or corner cases.
|
|
|
|
|
|
|
|
Not every behavior of a method requires an example. If the method
|
2022-05-09 11:45:50 -04:00
|
|
|
is documented to return `self`, you don't need to provide an example
|
2021-07-18 18:43:34 -04:00
|
|
|
showing the return value is the same as the receiver. If the method
|
2022-05-09 11:45:50 -04:00
|
|
|
is documented to return `nil`, you don't need to provide an example
|
|
|
|
showing that it returns `nil`. If the details mention that for a
|
2021-07-18 18:43:34 -04:00
|
|
|
certain argument type, an empty array is returned, you don't need
|
|
|
|
to provide an example for that.
|
|
|
|
|
|
|
|
Only add an example if it provides the user additional information,
|
|
|
|
do not add an example if it provides the same information given
|
|
|
|
in the synopsis or details. The purpose of examples is not to prove
|
|
|
|
what the details are stating.
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
### Argument Description (if necessary)
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
For methods that require arguments, if not obvious and not explicitly
|
|
|
|
mentioned in the details or implicitly shown in the examples, you can
|
|
|
|
provide details about the types of arguments supported. When discussing
|
|
|
|
the types of arguments, use simple language even if less-precise, such
|
|
|
|
as "level must be an integer", not "level must be an Integer-convertible
|
|
|
|
object". The vast majority of use will be with the expected type, not an
|
|
|
|
argument that is explicitly convertible to the expected type, and
|
|
|
|
documenting the difference is not important.
|
|
|
|
|
|
|
|
For methods that take blocks, it can be useful to document the type of
|
|
|
|
argument passed if it is not obvious, not explicitly mentioned in the
|
|
|
|
details, and not implicitly shown in the examples.
|
|
|
|
|
|
|
|
If there is more than one argument or block argument, use a
|
2022-05-09 11:45:50 -04:00
|
|
|
[labeled list](rdoc-ref:RDoc::Markup@Labeled+Lists).
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
### Corner Cases and Exceptions
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
For corner cases of methods, such as atypical usage, briefly mention
|
|
|
|
the behavior, but do not provide any examples.
|
|
|
|
|
|
|
|
Only document exceptions raised if they are not obvious. For example,
|
|
|
|
if you have stated earlier than an argument type must be an integer,
|
2022-05-19 04:07:56 -04:00
|
|
|
you do not need to document that a `TypeError` is raised if a non-integer
|
2021-07-18 18:43:34 -04:00
|
|
|
is passed. Do not provide examples of exceptions being raised unless
|
2022-05-19 04:07:56 -04:00
|
|
|
that is a common case, such as `Hash#fetch` raising a `KeyError`.
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
### Aliases
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
Mention aliases in the form
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
```c
|
|
|
|
// Array#find_index is an alias for Array#index.
|
|
|
|
```
|
2021-07-18 18:43:34 -04:00
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
### Related Methods (optional)
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
In some cases, it is useful to document which methods are related to
|
2022-05-09 11:45:50 -04:00
|
|
|
the current method. For example, documentation for `Hash#[]` might
|
|
|
|
mention `Hash#fetch` as a related method, and `Hash#merge` might mention
|
|
|
|
`Hash#merge!` as a related method. Consider which methods may be related
|
2021-07-18 18:43:34 -04:00
|
|
|
to the current method, and if you think the reader would benefit it,
|
|
|
|
at the end of the method documentation, add a line starting with
|
|
|
|
"Related: " (e.g. "Related: #fetch"). Don't list more than three
|
|
|
|
related methods. If you think more than three methods are related,
|
|
|
|
pick the three you think are most important and list those three.
|
|
|
|
|
2022-05-09 11:45:50 -04:00
|
|
|
### Methods Accepting Multiple Argument Types
|
2021-07-18 18:43:34 -04:00
|
|
|
|
|
|
|
For methods that accept multiple argument types, in some cases it can
|
|
|
|
be useful to document the different argument types separately. It's
|
|
|
|
best to use a separate paragraph for each case you are discussing.
|