brainstem 1.0.0.pre.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/Gemfile.lock +1 -1
- data/README.md +383 -32
- data/bin/brainstem +6 -0
- data/brainstem.gemspec +2 -0
- data/docs/api_doc_generator.markdown +175 -0
- data/docs/brainstem_executable.markdown +32 -0
- data/docs/docgen.png +0 -0
- data/docs/docgen_ascii.txt +63 -0
- data/docs/executable.png +0 -0
- data/docs/executable_ascii.txt +10 -0
- data/lib/brainstem/api_docs.rb +146 -0
- data/lib/brainstem/api_docs/abstract_collection.rb +116 -0
- data/lib/brainstem/api_docs/atlas.rb +158 -0
- data/lib/brainstem/api_docs/builder.rb +167 -0
- data/lib/brainstem/api_docs/controller.rb +122 -0
- data/lib/brainstem/api_docs/controller_collection.rb +40 -0
- data/lib/brainstem/api_docs/endpoint.rb +234 -0
- data/lib/brainstem/api_docs/endpoint_collection.rb +58 -0
- data/lib/brainstem/api_docs/exceptions.rb +8 -0
- data/lib/brainstem/api_docs/formatters/abstract_formatter.rb +64 -0
- data/lib/brainstem/api_docs/formatters/markdown/controller_formatter.rb +76 -0
- data/lib/brainstem/api_docs/formatters/markdown/endpoint_collection_formatter.rb +73 -0
- data/lib/brainstem/api_docs/formatters/markdown/endpoint_formatter.rb +169 -0
- data/lib/brainstem/api_docs/formatters/markdown/helper.rb +76 -0
- data/lib/brainstem/api_docs/formatters/markdown/presenter_formatter.rb +200 -0
- data/lib/brainstem/api_docs/introspectors/abstract_introspector.rb +100 -0
- data/lib/brainstem/api_docs/introspectors/rails_introspector.rb +232 -0
- data/lib/brainstem/api_docs/presenter.rb +225 -0
- data/lib/brainstem/api_docs/presenter_collection.rb +97 -0
- data/lib/brainstem/api_docs/resolver.rb +73 -0
- data/lib/brainstem/api_docs/sinks/abstract_sink.rb +37 -0
- data/lib/brainstem/api_docs/sinks/controller_presenter_multifile_sink.rb +93 -0
- data/lib/brainstem/api_docs/sinks/stdout_sink.rb +44 -0
- data/lib/brainstem/cli.rb +146 -0
- data/lib/brainstem/cli/abstract_command.rb +97 -0
- data/lib/brainstem/cli/generate_api_docs_command.rb +169 -0
- data/lib/brainstem/concerns/controller_dsl.rb +300 -0
- data/lib/brainstem/concerns/controller_param_management.rb +30 -9
- data/lib/brainstem/concerns/formattable.rb +38 -0
- data/lib/brainstem/concerns/inheritable_configuration.rb +3 -2
- data/lib/brainstem/concerns/optional.rb +43 -0
- data/lib/brainstem/concerns/presenter_dsl.rb +76 -15
- data/lib/brainstem/controller_methods.rb +6 -3
- data/lib/brainstem/dsl/association.rb +6 -3
- data/lib/brainstem/dsl/associations_block.rb +6 -3
- data/lib/brainstem/dsl/base_block.rb +2 -4
- data/lib/brainstem/dsl/conditional.rb +7 -3
- data/lib/brainstem/dsl/conditionals_block.rb +4 -4
- data/lib/brainstem/dsl/configuration.rb +184 -8
- data/lib/brainstem/dsl/field.rb +6 -3
- data/lib/brainstem/dsl/fields_block.rb +2 -3
- data/lib/brainstem/help_text.txt +8 -0
- data/lib/brainstem/presenter.rb +27 -6
- data/lib/brainstem/presenter_validator.rb +5 -2
- data/lib/brainstem/time_classes.rb +1 -1
- data/lib/brainstem/version.rb +1 -1
- data/spec/brainstem/api_docs/abstract_collection_spec.rb +156 -0
- data/spec/brainstem/api_docs/atlas_spec.rb +353 -0
- data/spec/brainstem/api_docs/builder_spec.rb +100 -0
- data/spec/brainstem/api_docs/controller_collection_spec.rb +92 -0
- data/spec/brainstem/api_docs/controller_spec.rb +225 -0
- data/spec/brainstem/api_docs/endpoint_collection_spec.rb +144 -0
- data/spec/brainstem/api_docs/endpoint_spec.rb +346 -0
- data/spec/brainstem/api_docs/formatters/abstract_formatter_spec.rb +30 -0
- data/spec/brainstem/api_docs/formatters/markdown/controller_formatter_spec.rb +126 -0
- data/spec/brainstem/api_docs/formatters/markdown/endpoint_collection_formatter_spec.rb +85 -0
- data/spec/brainstem/api_docs/formatters/markdown/endpoint_formatter_spec.rb +261 -0
- data/spec/brainstem/api_docs/formatters/markdown/helper_spec.rb +100 -0
- data/spec/brainstem/api_docs/formatters/markdown/presenter_formatter_spec.rb +485 -0
- data/spec/brainstem/api_docs/introspectors/abstract_introspector_spec.rb +192 -0
- data/spec/brainstem/api_docs/introspectors/rails_introspector_spec.rb +170 -0
- data/spec/brainstem/api_docs/presenter_collection_spec.rb +84 -0
- data/spec/brainstem/api_docs/presenter_spec.rb +519 -0
- data/spec/brainstem/api_docs/resolver_spec.rb +72 -0
- data/spec/brainstem/api_docs/sinks/abstract_sink_spec.rb +16 -0
- data/spec/brainstem/api_docs/sinks/controller_presenter_multifile_sink_spec.rb +56 -0
- data/spec/brainstem/api_docs/sinks/stdout_sink_spec.rb +22 -0
- data/spec/brainstem/api_docs_spec.rb +58 -0
- data/spec/brainstem/cli/abstract_command_spec.rb +91 -0
- data/spec/brainstem/cli/generate_api_docs_command_spec.rb +125 -0
- data/spec/brainstem/cli_spec.rb +67 -0
- data/spec/brainstem/concerns/controller_dsl_spec.rb +471 -0
- data/spec/brainstem/concerns/controller_param_management_spec.rb +36 -16
- data/spec/brainstem/concerns/formattable_spec.rb +30 -0
- data/spec/brainstem/concerns/inheritable_configuration_spec.rb +104 -4
- data/spec/brainstem/concerns/optional_spec.rb +48 -0
- data/spec/brainstem/concerns/presenter_dsl_spec.rb +202 -31
- data/spec/brainstem/dsl/association_spec.rb +18 -2
- data/spec/brainstem/dsl/conditional_spec.rb +25 -2
- data/spec/brainstem/dsl/configuration_spec.rb +1 -1
- data/spec/brainstem/dsl/field_spec.rb +18 -2
- data/spec/brainstem/presenter_collection_spec.rb +10 -2
- data/spec/brainstem/presenter_spec.rb +32 -0
- data/spec/brainstem/presenter_validator_spec.rb +12 -7
- data/spec/dummy/rails.rb +49 -0
- data/spec/shared/atlas_taker.rb +18 -0
- data/spec/shared/formattable.rb +14 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/spec_helpers/db.rb +1 -1
- data/spec/spec_helpers/presenters.rb +20 -14
- metadata +106 -6
data/bin/brainstem
ADDED
data/brainstem.gemspec
CHANGED
@@ -0,0 +1,175 @@
|
|
1
|
+
# API Doc Generator: Developer's Guide
|
2
|
+
|
3
|
+
This documentation explains the intricacies of Brainstem's built-in API
|
4
|
+
documentation generation capabilities. For brevity, we refer to this
|
5
|
+
particular application as 'docgen'.
|
6
|
+
|
7
|
+
## Execution
|
8
|
+
|
9
|
+
`bundle exec brainstem generate [ARGS]`
|
10
|
+
|
11
|
+
## Customizing Output
|
12
|
+
|
13
|
+
#### Making Small Customizations to the Existing Formatters
|
14
|
+
|
15
|
+
It is easy to make small customizations to the formatters simply by subclassing
|
16
|
+
them, customizing behaviour as you'd like, and then registering over top of an
|
17
|
+
existing formatter.
|
18
|
+
|
19
|
+
For instance, if you wanted to add a horizontal rule after an endpoint's title:
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
# config/initializers/brainstem.rb
|
23
|
+
require 'brainstem/api_docs/formatters/markdown/endpoint_formatter'
|
24
|
+
|
25
|
+
class MyEndpointFormatter < Brainstem::ApiDocs::Formatters::Markdown::EndpointFormatter
|
26
|
+
def format_title!
|
27
|
+
super
|
28
|
+
output << md_hr
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
Brainstem::ApiDocs::FORMATTERS[:endpoint][:markdown] = MyFormatter.method(:call)
|
33
|
+
```
|
34
|
+
|
35
|
+
You can refer to [all the formatters](../lib/brainstem/api_docs/formatters) to
|
36
|
+
see what is possible.
|
37
|
+
|
38
|
+
#### Adding Custom Formats
|
39
|
+
|
40
|
+
Do exactly as above, but instead of declaring it as an existing formatter,
|
41
|
+
declare the formatter as one of your own choosing:
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
Brainstem::ApiDocs::FORMATTERS[:endpoint][:my_format] = MyFormatter.method(:call)
|
45
|
+
```
|
46
|
+
|
47
|
+
Instead of choosing to inherit from an existing format, you can choose also to
|
48
|
+
inherit from `Brainstem::ApiDocs::Formatters::AbstractFormatter` as well.
|
49
|
+
|
50
|
+
Note that formatters at this time make concrete references to their own format,
|
51
|
+
so if you decide to inherit from existing formatters, you will have to make
|
52
|
+
sure these references are changed appropriately.
|
53
|
+
|
54
|
+
#### Accessing sibling data from formatters
|
55
|
+
|
56
|
+
A formatter formats a wrapping object which serves as a viewmodel to an actual
|
57
|
+
entity in your application, such as an `ActionController::Base` or a
|
58
|
+
`Brainstem::Presenter`. There are also additional wrapping objects which hold
|
59
|
+
collections of these singular wrappers.
|
60
|
+
|
61
|
+
These wrappers include the following:
|
62
|
+
|
63
|
+
- `Brainstem::ApiDocs::Presenter`
|
64
|
+
- `Brainstem::ApiDocs::Endpoint`
|
65
|
+
- `Brainstem::ApiDocs::Controller`
|
66
|
+
- `Brainstem::ApiDocs::PresenterCollection`
|
67
|
+
- `Brainstem::ApiDocs::EndpointCollection`
|
68
|
+
- `Brainstem::ApiDocs::Controller`
|
69
|
+
|
70
|
+
In some situations, you may want to include documentation for adjacent or or
|
71
|
+
similar but unrelated wrapper object. Each of these wrapping objects has a
|
72
|
+
method called `find_by_class`, which can return these adjacent objects.
|
73
|
+
|
74
|
+
At the moment, finding the following is supported:
|
75
|
+
|
76
|
+
- `Presenter`:
|
77
|
+
- find by `target_class`, e.g.
|
78
|
+
- `presenter = find_by_class(association.target_class)`
|
79
|
+
- `presenter = find_by_class(User)`
|
80
|
+
|
81
|
+
The object responsible for the lookup functionality is the
|
82
|
+
`Brainstem::ApiDocs::Resolver`, which can be reopened if necessary to provide
|
83
|
+
further lookups.
|
84
|
+
|
85
|
+
#### Adding Additional Configurable Options
|
86
|
+
|
87
|
+
The `Brainstem::ApiDocs` module serves double-duty as the receptacle for
|
88
|
+
configuration information, and is used throughout the docgen application in
|
89
|
+
order to provide alternatives to defaults.
|
90
|
+
|
91
|
+
This can be very handy in any of your customizations, and it is relatively easy
|
92
|
+
to add, so long as your configuration is used after the host application is
|
93
|
+
booted up (see [Phases](#phases)). Simply re-open the module in your
|
94
|
+
initializer, add your desired `config_accessor`, and refer to the constant in
|
95
|
+
your formatters:
|
96
|
+
|
97
|
+
```ruby
|
98
|
+
# config/initializers/brainstem.rb
|
99
|
+
|
100
|
+
module Brainstem
|
101
|
+
module ApiDocs
|
102
|
+
config_accessor(:my_config_option) { false }
|
103
|
+
end
|
104
|
+
end
|
105
|
+
```
|
106
|
+
|
107
|
+
```ruby
|
108
|
+
# my_formatter.rb
|
109
|
+
|
110
|
+
Brainstem::ApiDocs.my_config_option
|
111
|
+
```
|
112
|
+
|
113
|
+
## Architectural Overview
|
114
|
+
|
115
|
+
### Primary Phases
|
116
|
+
|
117
|
+
1. ApiDocs namespace and required classes are loaded.
|
118
|
+
2. Host application is loaded and required information is extracted
|
119
|
+
(introspection).
|
120
|
+
3. Information is repackaged into wrapping objects (atlas creation).
|
121
|
+
4. Sink interrogates atlas for specific formatted wrappers (serialization) and
|
122
|
+
persists serialized data to disk (persistence).
|
123
|
+
|
124
|
+
|
125
|
+
### Detailed Overview
|
126
|
+
|
127
|
+
![DocGen overview](./docgen.png)
|
128
|
+
|
129
|
+
|
130
|
+
1. `Brainstem::CLI::GenerateApiDocsCommand` instantiates a builder and a sink,
|
131
|
+
and hands the output of the builder to the sink, which serializes and stores
|
132
|
+
the input somewhere. It also merges the options given to it on the command
|
133
|
+
line with the default options defined in `Brainstem::ApiDocs`.
|
134
|
+
2. `Brainstem::ApiDocs::Builder` is responsible for retrieving information from
|
135
|
+
the host application to be exposed to a sink through a
|
136
|
+
`Brainstem::ApiDocs::Introspectors::AbstractIntrospector` subclass. It wraps
|
137
|
+
this information in more friendly and documentable ways, producing a series
|
138
|
+
of collections that can be iterated or reduced from which to produce
|
139
|
+
documentation. It exposes this data through its `atlas` method, which is an
|
140
|
+
instance of `Brainstem::ApiDocs::Atlas`.
|
141
|
+
3. `Brainstem::ApiDocs::Introspectors::AbstractIntrospector` defines an
|
142
|
+
interface for objects to return data from the host application. Provided
|
143
|
+
with Brainstem is an implementation of
|
144
|
+
`Brainstem::ApiDocs::Introspectors::RailsIntrospector`, which can be used to
|
145
|
+
extract the required information from a Rails 4 application.
|
146
|
+
4. `Brainstem::ApiDocs::Atlas` is an object which receives the data from an
|
147
|
+
introspector and transforms it into a series of collections useful for
|
148
|
+
producing documentation. It does so by wrapping domain entities and providing
|
149
|
+
intelligent interfaces on these collections by which to mutate them. It wraps:
|
150
|
+
- Routes into `Brainstem::ApiDocs::Endpoint` objects, and these into a
|
151
|
+
`Brainstem::ApiDocs::EndpointCollection`;
|
152
|
+
- Controllers into `Brainstem::ApiDocs::Controller` objects, and these into
|
153
|
+
a `Brainstem::ApiDocs::ControllerCollection`;
|
154
|
+
- Presenters into `Brainstem::ApiDocs::Presenter` objects, and these into a
|
155
|
+
`Brainstem::ApiDocs::PresenterCollection`.
|
156
|
+
5. Each of these collection and entity objects includes
|
157
|
+
`Brainstem::Concerns::Formattable`, which enables them to be formatted by
|
158
|
+
passing them `formatted_as(format, options)`. Formatters inherit from
|
159
|
+
`Brainstem::ApiDocs::Formatters::AbstractFormatter`, are loaded by
|
160
|
+
`Cerebellum::ApiDocs`, and are stored by self-assigned type. Some or all of
|
161
|
+
these formatters may be provided for this type, depending on the desired
|
162
|
+
behaviour. Brainstem includes an implementation of a `Markdown` formatter,
|
163
|
+
stored under the type `:markdown`, and has a
|
164
|
+
`Brainstem::ApiDocs::Formatters::Markdown::EndpointCollectionFormatter` as
|
165
|
+
well as an `Endpoint-`, `Controller-`, and `PresenterFormatter`. Note that
|
166
|
+
there is not a `ControllerCollectionFormatter`, nor a
|
167
|
+
`PresenterCollectionFormatter` included: this is because the Sink shares
|
168
|
+
partial responsibility for collection formatting, and in the case of the
|
169
|
+
`Brainstem::ApiDocs::Sinks::ControllerPresenterMultifileSink`, outputs each
|
170
|
+
controller and presenter as its own file, rather than as a concatenated
|
171
|
+
collection.
|
172
|
+
6. This sink, having received an instance of the `Atlas`, is responsible for
|
173
|
+
serializing—primarily invoking formatting—and then outputting
|
174
|
+
the result somewhere, whether to `$stdout`, a file or files on disk, or a
|
175
|
+
remote location.
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# Brainstem Command-line Utility
|
2
|
+
|
3
|
+
## Usage
|
4
|
+
|
5
|
+
Usage: `brainstem SUBCOMMAND options`
|
6
|
+
|
7
|
+
e.g. `brainstem generate --markdown`
|
8
|
+
|
9
|
+
Get help by running `brainstem help generate`, or `brainstem generate --help`.
|
10
|
+
|
11
|
+
|
12
|
+
## Brainstem Developer Overview
|
13
|
+
|
14
|
+
![Brainstem Executable Diagram](./executable.png)
|
15
|
+
|
16
|
+
1. The `brainstem` executable instantiates and invokes `Brainstem::Cli`.
|
17
|
+
2. `Brainstem::Cli` holds a map of acceptable subcommands and the objects that
|
18
|
+
contain their logic. It also knows how to extract options and invoke
|
19
|
+
execution of these objects, so long as they provide the interface specified
|
20
|
+
in `Brainstem::CLI::AbstractCommand`.
|
21
|
+
3. `Brainstem::CLI::AbstractCommand` is an interface whose descendants define
|
22
|
+
an entry point into the application logic. They should expose an option
|
23
|
+
parser through their `option_parser` method, one which mutates the `options`
|
24
|
+
instance method. The parser is evaluated before the instance of the command
|
25
|
+
is `call`ed.
|
26
|
+
|
27
|
+
#### Specific Commands
|
28
|
+
|
29
|
+
- `Brainstem::CLI::GenerateApiDocsCommand` contains the application logic to
|
30
|
+
generate the API docs annotated by Brainstem. See the [Api Doc Generator
|
31
|
+
documentation](./api_doc_generator.markdown) for more info.
|
32
|
+
|
data/docs/docgen.png
ADDED
Binary file
|
@@ -0,0 +1,63 @@
|
|
1
|
+
Load the following rows into asciiflow.com to edit:
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
+----------------------------------------+ +-----------------------------+ +---------------------------------------------------------+
|
6
|
+
| Brainstem::CLI::GenerateApiDocsCommand +------+-----> Brainstem::ApiDocs::Builder +-------+----> Brainstem::ApiDocs::Introspectors::AbstractIntrospector <-----+
|
7
|
+
+----------------------------------------+ | +-----------------------------+ | +---------------------------------------------------------+ | U
|
8
|
+
| | | | S
|
9
|
+
| | | +------------------------------------------------------+ | E
|
10
|
+
| | +----> Brainstem::ApiDocs::Introspectors::RailsIntrospector <---+ S
|
11
|
+
| | +------------------------------------------------------+ |
|
12
|
+
| | |
|
13
|
+
| | +------------------------------------+
|
14
|
+
| | |
|
15
|
+
| | +--------------------------++ +----------------------------------------+
|
16
|
+
| +----> Brainstem::ApiDocs::Atlas +------------> Brainstem::ApiDocs::AbstractCollection |
|
17
|
+
| | +------------------------^--+ +----------------------------------------+
|
18
|
+
| | | |
|
19
|
+
| | | | +----------------------------------------+ +------------------------------+
|
20
|
+
| | | +----> Brainstem::ApiDocs::EndpointCollection +---+---------> Brainstem::ApiDocs::Endpoint +---+
|
21
|
+
| | | | +----------------------------------------+ | +------------------------------+ |
|
22
|
+
| | | | | |
|
23
|
+
| | | | +------------------------------------------+ | +--------------------------------+ |
|
24
|
+
| | | +----> Brainstem::ApiDocs::ControllerCollection +-----------> Brainstem::ApiDocs::Controller +---+
|
25
|
+
| | | | +------------------------------------------+ | +--------------------------------+ | |
|
26
|
+
| | | | | | |
|
27
|
+
| | | | +-----------------------------------------+ | +-------------------------------+ | |
|
28
|
+
| | | +----> Brainstem::ApiDocs::PresenterCollection +------------> Brainstem::ApiDocs::Presenter +------+
|
29
|
+
| | | +-----------------------------------------+ | +-------------------------------+ | | |
|
30
|
+
| | | | | | |
|
31
|
+
| | +-------------------------------------------+ | | | |
|
32
|
+
| | | U | | | |
|
33
|
+
| | +-----------------------------------------+ | S | | | | U
|
34
|
+
| +----> Brainstem::ApiDocs::Sinks::AbstractSink +--------------------------> E | | | | S
|
35
|
+
| +-----------------------------------------+ | S | | | | E
|
36
|
+
| | | | | | | S
|
37
|
+
| | +-------------------------------------------------------------+ | | | | |
|
38
|
+
| +----> Brainstem::ApiDocs::Sinks::ControllerPresenterMultifileSink +-+ | | | |
|
39
|
+
| +-------------------------------------------------------------+ | | | |
|
40
|
+
| | | | |
|
41
|
+
| | | | |
|
42
|
+
| | | | |
|
43
|
+
| | | | |
|
44
|
+
| | | | |
|
45
|
+
| +--------------------+ +---------------------------------------------------+ | | | |
|
46
|
+
+-----> Brainstem::ApiDocs +---------------------> Brainstem::ApiDocs::Formatters::AbstractFormatter | | | | |
|
47
|
+
+--------------------+ +---------------------------------------------------+ | | | |
|
48
|
+
| | | | |
|
49
|
+
| +-----------------------------------------------------------------------+ | | | |
|
50
|
+
+----> Brainstem::ApiDocs::Formatters::Markdown::EndpointCollectionFormatter <-------------+ | | |
|
51
|
+
| +-----------------------------------------------------------------------+ | | |
|
52
|
+
| | | |
|
53
|
+
| +-------------------------------------------------------------+ | | |
|
54
|
+
+----> Brainstem::ApiDocs::Formatters::Markdown::EndpointFormatter <--------------------------------------------------------------------+ | |
|
55
|
+
| +-------------------------------------------------------------+ | |
|
56
|
+
| | |
|
57
|
+
| +---------------------------------------------------------------+ | |
|
58
|
+
+----> Brainstem::ApiDocs::Formatters::Markdown::ControllerFormatter <--------------------------------------------------------------------+ |
|
59
|
+
| +---------------------------------------------------------------+ |
|
60
|
+
| |
|
61
|
+
| +--------------------------------------------------------------+ |
|
62
|
+
+----> Brainstem::ApiDocs::Formatters::Markdown::PresenterFormatter <-----------------------------------------------------------------------+
|
63
|
+
+--------------------------------------------------------------+
|
data/docs/executable.png
ADDED
Binary file
|
@@ -0,0 +1,10 @@
|
|
1
|
+
Load the following rows into asciiflow.com to edit:
|
2
|
+
|
3
|
+
|
4
|
+
+------------------------+ +----------------+ +---------------------------------+
|
5
|
+
| brainstem (executable) +-------> Brainstem::Cli +----------> Brainstem::CLI::AbstractCommand |
|
6
|
+
+------------------------+ +----------------+ ++--------------------------------+
|
7
|
+
|
|
8
|
+
| +----------------------------------------+
|
9
|
+
+--> Brainstem::CLI::GenerateApiDocsCommand |
|
10
|
+
+----------------------------------------+
|
@@ -0,0 +1,146 @@
|
|
1
|
+
require 'active_support/configurable'
|
2
|
+
|
3
|
+
module Brainstem
|
4
|
+
module ApiDocs
|
5
|
+
include ActiveSupport::Configurable
|
6
|
+
|
7
|
+
config_accessor(:write_path) do
|
8
|
+
File.expand_path("./brainstem_docs")
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
#
|
13
|
+
# Defines the naming pattern of each controller documentation file.
|
14
|
+
#
|
15
|
+
# The following tokens will be substituted:
|
16
|
+
#
|
17
|
+
# - {{namespace}} : the namespace of the controller underscored,
|
18
|
+
# i.e. 'api/v1'
|
19
|
+
# - {{name}} : the underscored name of the controller without
|
20
|
+
# 'controller'
|
21
|
+
# - {{extension} : the specified file extension
|
22
|
+
#
|
23
|
+
# @see #output_extension
|
24
|
+
#
|
25
|
+
config_accessor(:controller_filename_pattern) do
|
26
|
+
File.join("endpoints", "{{name}}.{{extension}}")
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
#
|
31
|
+
# Defines the naming pattern of each presenter documentation file.
|
32
|
+
#
|
33
|
+
# The following tokens will be substituted:
|
34
|
+
#
|
35
|
+
# - {{name}} : the demodulized underscored name of the presenter
|
36
|
+
# - {{extension} : the specified file extension
|
37
|
+
#
|
38
|
+
# @see #output_extension
|
39
|
+
#
|
40
|
+
config_accessor(:presenter_filename_pattern) do
|
41
|
+
File.join("objects", "{{name}}.{{extension}}")
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
#
|
46
|
+
# Defines the naming pattern for the relative link to each controller documentation file.
|
47
|
+
#
|
48
|
+
# The following tokens will be substituted:
|
49
|
+
#
|
50
|
+
# - {{name}} : the underscored name of the controller without 'controller'
|
51
|
+
# - {{extension} : the specified file extension
|
52
|
+
#
|
53
|
+
# @see #output_extension
|
54
|
+
#
|
55
|
+
config_accessor(:controller_filename_link_pattern) do
|
56
|
+
controller_filename_pattern
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
#
|
61
|
+
# Defines the naming pattern for the relative link to each presenter documentation file.
|
62
|
+
#
|
63
|
+
# The following tokens will be substituted:
|
64
|
+
#
|
65
|
+
# - {{name}} : the demodulized underscored name of the presenter
|
66
|
+
# - {{extension} : the specified file extension
|
67
|
+
#
|
68
|
+
# @see #output_extension
|
69
|
+
#
|
70
|
+
config_accessor(:presenter_filename_link_pattern) do
|
71
|
+
presenter_filename_pattern
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
#
|
76
|
+
# Defines the extension that should be used for output files.
|
77
|
+
#
|
78
|
+
# Excludes the '.'.
|
79
|
+
#
|
80
|
+
config_accessor(:output_extension) { "markdown" }
|
81
|
+
|
82
|
+
|
83
|
+
#
|
84
|
+
# Defines the class that all presenters should inherit from / be drawn
|
85
|
+
# from.
|
86
|
+
#
|
87
|
+
# Is a string because most relevant classes are not loaded until much
|
88
|
+
# later.
|
89
|
+
#
|
90
|
+
# @see Brainstem::ApiDocs::RailsIntrospector#base_presenter_class=
|
91
|
+
#
|
92
|
+
config_accessor(:base_presenter_class) do
|
93
|
+
"::Brainstem::Presenter"
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
#
|
98
|
+
# Defines the class that all controllers should inherit from / be drawn
|
99
|
+
# from.
|
100
|
+
#
|
101
|
+
# Is a string because most relevant classes are not loaded until much
|
102
|
+
# later.
|
103
|
+
#
|
104
|
+
# @see Brainstem::ApiDocs::RailsIntrospector#base_presenter_class=
|
105
|
+
#
|
106
|
+
config_accessor(:base_controller_class) do
|
107
|
+
"::ApplicationController"
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
#
|
112
|
+
# If associations on a presenter have no description, i.e. no documentation,
|
113
|
+
# should they be documented anyway?
|
114
|
+
#
|
115
|
+
config_accessor(:document_empty_presenter_associations) { true }
|
116
|
+
|
117
|
+
|
118
|
+
#
|
119
|
+
# If filters on a presenter have no `:info` key, i.e. no documentation,
|
120
|
+
# should they be documented anyway?
|
121
|
+
#
|
122
|
+
config_accessor(:document_empty_presenter_filters) { true }
|
123
|
+
|
124
|
+
|
125
|
+
|
126
|
+
FORMATTERS = {
|
127
|
+
|
128
|
+
# Formatter for entire response
|
129
|
+
document: {},
|
130
|
+
|
131
|
+
# Formatters for collections
|
132
|
+
controller_collection: {},
|
133
|
+
endpoint_collection: {},
|
134
|
+
presenter_collection: {},
|
135
|
+
|
136
|
+
# Formatters for individual entities
|
137
|
+
controller: {},
|
138
|
+
endpoint: {},
|
139
|
+
presenter: {},
|
140
|
+
|
141
|
+
}
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
formatter_path = File.expand_path('../formatters/**/*.rb', __FILE__)
|
146
|
+
Dir.glob(formatter_path).each { |f| require f }
|