detroit 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/.index +59 -0
  3. data/EXAMPLE.md +66 -64
  4. data/{HISTORY.rdoc → HISTORY.md} +32 -5
  5. data/{COPYING.rdoc → LICENSE.txt} +0 -0
  6. data/README.md +142 -0
  7. data/bin/detroit +1 -1
  8. data/lib/detroit.rb +112 -40
  9. data/lib/detroit.yml +44 -29
  10. data/lib/detroit/assembly.rb +49 -193
  11. data/lib/detroit/basic_tool.rb +200 -0
  12. data/lib/detroit/basic_utils.rb +66 -0
  13. data/lib/detroit/core_ext.rb +2 -136
  14. data/lib/detroit/{tool/core_ext → core_ext}/facets.rb +3 -0
  15. data/lib/detroit/{tool/core_ext → core_ext}/filetest.rb +0 -0
  16. data/lib/detroit/{tool/core_ext → core_ext}/shell_extensions.rb +0 -0
  17. data/lib/detroit/{tool/core_ext → core_ext}/to_actual_filename.rb +0 -0
  18. data/lib/detroit/{tool/core_ext → core_ext}/to_console.rb +1 -0
  19. data/lib/detroit/{tool/core_ext → core_ext}/to_list.rb +0 -0
  20. data/lib/detroit/{tool/core_ext → core_ext}/to_yamlfrag.rb +0 -0
  21. data/lib/detroit/{tool/core_ext → core_ext}/unfold_paragraphs.rb +0 -0
  22. data/lib/detroit/{tool/email_utils.rb → email_utils.rb} +3 -1
  23. data/lib/detroit/exec.rb +55 -0
  24. data/lib/detroit/project.rb +134 -0
  25. data/lib/detroit/ruby_utils.rb +29 -0
  26. data/lib/detroit/{tool/shell_utils.rb → shell_utils.rb} +10 -5
  27. data/lib/detroit/toolchain.rb +6 -0
  28. data/lib/detroit/toolchain/cli.rb +320 -0
  29. data/lib/detroit/toolchain/config.rb +223 -0
  30. data/lib/detroit/toolchain/runner.rb +678 -0
  31. data/lib/detroit/toolchain/script.rb +248 -0
  32. data/lib/detroit/toolchain/worker.rb +84 -0
  33. data/man/detroit.1 +116 -0
  34. data/man/detroit.1.html +171 -0
  35. data/man/detroit.1.ronn +99 -0
  36. metadata +90 -51
  37. data/.ruby +0 -44
  38. data/README.rdoc +0 -132
  39. data/lib/detroit/application.rb +0 -463
  40. data/lib/detroit/assembly_system.rb +0 -80
  41. data/lib/detroit/config.rb +0 -203
  42. data/lib/detroit/control.rb +0 -129
  43. data/lib/detroit/custom.rb +0 -102
  44. data/lib/detroit/dsl.rb +0 -55
  45. data/lib/detroit/service.rb +0 -78
  46. data/lib/detroit/standard_assembly.rb +0 -51
  47. data/lib/detroit/tool.rb +0 -295
  48. data/lib/detroit/tool/core_ext.rb +0 -3
  49. data/lib/detroit/tool/project_utils.rb +0 -41
@@ -0,0 +1,248 @@
1
+ module Detroit
2
+
3
+ module Toolchain
4
+
5
+ # Assembly::Script models an *Assembly file* with it's collection of
6
+ # tool configurations.
7
+ #
8
+ class Script
9
+
10
+ # Load Assembly file.
11
+ def self.load(input, project=nil)
12
+ new(:file=>input,:project=>project)
13
+ end
14
+
15
+ # Project instance.
16
+ attr :project
17
+
18
+ # Hash table of tool configuration.
19
+ attr :tools
20
+
21
+ private
22
+
23
+ #
24
+ def initialize(options={}, &block)
25
+ @project = options[:project]
26
+
27
+ @tools = {}
28
+
29
+ if options[:file]
30
+ initialize_file(options[:file])
31
+ end
32
+
33
+ if block
34
+ instance_eval(&block)
35
+ end
36
+ end
37
+
38
+ # Inititalize from assembly file.
39
+ #
40
+ def initialize_file(file)
41
+ @file = (String === file ? File.new(file) : file)
42
+
43
+ case File.extname(@file.path)
44
+ when '.rb'
45
+ instance_eval(@file.read, @file.path)
46
+ when '.yml', '.yaml'
47
+ @tools = YAML.load(erb(@file.read))
48
+ else
49
+ text = @file.read
50
+ if /^---/ =~ text
51
+ @tools = YAML.load(erb(text))
52
+ else
53
+ instance_eval(text, @file.path)
54
+ end
55
+ end
56
+ end
57
+
58
+ public
59
+
60
+ # Ecapsulate a set of tools within a specific track.
61
+ #
62
+ def track(name, &block)
63
+ @_track = name
64
+ instance_eval(&block)
65
+ @_track = nil
66
+ end
67
+
68
+ # Configure a tool.
69
+ #
70
+ def tool(name, settings={}, &block)
71
+ settings[:track] = @_track if @_track
72
+ if block
73
+ block_context = BlockContext.new(&block)
74
+ settings.update(block_context.settings)
75
+ end
76
+ @tools[name.to_s] = settings.rekey(&:to_s)
77
+ end
78
+
79
+ # Define a custom tool. A custom tool has no tool class.
80
+ # Instead, the configuration itself defines the procedure.
81
+ #
82
+ def custom(name, &block)
83
+ context = CustomContext.new(&block)
84
+ settings = context.settings
85
+ @tools[name.to_s] = settings.rekey(&:to_s)
86
+ end
87
+
88
+ # Access to project metadata.
89
+ #
90
+ # FIXME: Use factory method
91
+ def project
92
+ @project ||= Project.new
93
+ end
94
+
95
+ private
96
+
97
+ # Capitalized tool names called as methods
98
+ # can also define a tool.
99
+ def method_missing(sym, *args, &block)
100
+ tool_class = sym.to_s
101
+ case tool_class
102
+ when /^[A-Z]/
103
+ if Hash === args.last
104
+ args.last[:tool] = tool_class
105
+ else
106
+ args << {:tool=>tool_class}
107
+ end
108
+ case args.first
109
+ when String, Symbol
110
+ name = args.first
111
+ else
112
+ name = tool_class.to_s.downcase
113
+ end
114
+ tool(name, *args, &block)
115
+ else
116
+ super(sym, *args, &block)
117
+ end
118
+ end
119
+
120
+ # Process Routine document via ERB.
121
+ def erb(text)
122
+ context = ERBContext.new(project)
123
+ ERB.new(text).result(context.__binding__)
124
+ end
125
+
126
+ # ERBContext provides the clean context to process a Routine
127
+ # as an ERB template.
128
+ class ERBContext
129
+ #
130
+ def initialize(project)
131
+ @project = project
132
+ end
133
+
134
+ # Access to a clean binding.
135
+ def __binding__
136
+ binding
137
+ end
138
+
139
+ # Provide access to project data.
140
+ def project
141
+ @project
142
+ end
143
+
144
+ #
145
+ def method_missing(name, *args)
146
+ if project.respond_to?(name)
147
+ project.__send__(name, *args)
148
+ elsif project.metadata.respond_to?(name)
149
+ project.metadata.__send__(name, *args)
150
+ else
151
+ super(name, *args)
152
+ end
153
+ end
154
+ end
155
+
156
+ #
157
+ class BlockContext
158
+ #
159
+ attr :settings
160
+
161
+ #
162
+ def initialize(&b)
163
+ @settings = {}
164
+ b.arity == 1 ? b.call(self) : instance_eval(&b)
165
+ end
166
+
167
+ #
168
+ def set(name, value=nil, &block)
169
+ if block
170
+ block_context = BlockContext.new
171
+ block.call(block_context)
172
+ @settings[name.to_s] = block_context.settings
173
+ else
174
+ @settings[name.to_s] = value
175
+ end
176
+ end
177
+
178
+ #
179
+ def method_missing(symbol, value=nil, *args)
180
+ case name = symbol.to_s
181
+ when /=$/
182
+ @settings[name.chomp('=')] = value
183
+ else
184
+ return super(symbol, value, *args) unless args.empty?
185
+ if value
186
+ @settings[name.to_s] = value
187
+ else
188
+ @settings[name.to_s]
189
+ end
190
+ end
191
+ end
192
+ end
193
+
194
+ #
195
+ class CustomContext
196
+ #
197
+ attr :settings
198
+ #
199
+ def initialize(&b)
200
+ @settings = {}
201
+ b.arity == 0 ? instance_eval(&b) : b.call(self)
202
+ end
203
+ #
204
+ def method_missing(s,a=nil,*x,&b)
205
+ case s.to_s
206
+ when /=$/
207
+ @settings[s.to_s.chomp('=').to_sym] = b ? b : a
208
+ else
209
+ return @settings[s] unless a
210
+ @settings[s] = b ? b : a
211
+ end
212
+ end
213
+ def respond_to?(s)
214
+ @settings.key?(s.to_sym)
215
+ end
216
+ end
217
+
218
+ end
219
+
220
+ # NOTE: This is problematic, because an Assembly file should know from
221
+ # what file it was derived.
222
+
223
+ #
224
+ DOMAIN = "rubyworks.github.com/detroit,2011-05-27"
225
+
226
+ # TODO: If using Psych rather than Syck, then define a domain type.
227
+
228
+ #if defined?(Psych) #RUBY_VERSION >= '1.9'
229
+ # YAML::add_domain_type(DOMAIN, "assembly") do |type, hash|
230
+ # Assembly.load(hash)
231
+ # end
232
+ #else
233
+ YAML::add_builtin_type("assembly") do |type, value|
234
+ value
235
+ #case value
236
+ #when String
237
+ # Assembly.eval(value)
238
+ #when Hash
239
+ # Assembly.new(value)
240
+ #else
241
+ # raise "ERROR: Invalid Assembly"
242
+ #end
243
+ end
244
+ #end
245
+
246
+ end
247
+
248
+ end
@@ -0,0 +1,84 @@
1
+ module Detroit
2
+
3
+ module Toolchain
4
+
5
+ # TODO: Need to work on how to limit a service's groups per-assembly.
6
+
7
+ ##
8
+ # Service class wraps a Tool instance when it is made part of an assembly.
9
+ #
10
+ # TODO: Perhpas a better name would be `Link`, as in "chain link"?
11
+ #
12
+ class Worker
13
+
14
+ attr :key
15
+ attr :track
16
+ attr :priority
17
+ attr :active
18
+ attr :tool
19
+ #attr :options
20
+
21
+ # Set the priority. Priority determines the order which
22
+ # services on the same stop are run.
23
+ #
24
+ def priority=(integer)
25
+ @priority = integer.to_i
26
+ end
27
+
28
+ # Set the tracks a service will be available on.
29
+ #
30
+ def track=(list)
31
+ @track = list.to_list
32
+ end
33
+
34
+ #
35
+ def active=(boolean)
36
+ @active = !!boolean
37
+ end
38
+
39
+ # Create new wrapper.
40
+ #
41
+ def initialize(key, tool_class, options)
42
+ @key = key
43
+
44
+ ## set defaults
45
+ @track = nil
46
+ @priority = 0
47
+ @active = true
48
+
49
+ self.active = options.delete('active') if !options['active'].nil?
50
+ self.track = options.delete('track') if options.key?('track')
51
+ self.priority = options.delete('priority') if options.key?('priority')
52
+
53
+ @tool = tool_class.new(options)
54
+ end
55
+
56
+ # Does the tool handle the given assembly station?
57
+ #
58
+ # If `true` is returned than the station is handled by a method
59
+ # in the tool with the same name.
60
+ #
61
+ # If a symbol is returned then the station is handled, but via
62
+ # the method named by the returned symbol.
63
+ #
64
+ # @return [Boolean,Symbol]
65
+ def stop?(station, stop=nil)
66
+ @tool.assemble?(station.to_sym, :destination=>stop.to_sym)
67
+ end
68
+
69
+ # Run the service assembly station procedure.
70
+ #
71
+ def invoke(station, stop=nil)
72
+ @tool.assemble(station.to_sym, :destination=>stop.to_sym)
73
+ end
74
+
75
+ #
76
+ def inspect
77
+ "<#{self.class}:#{object_id} @key='#{key}'>"
78
+ end
79
+
80
+ end
81
+
82
+ end
83
+
84
+ end
@@ -0,0 +1,116 @@
1
+ .\" generated with Ronn/v0.7.3
2
+ .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
+ .
4
+ .TH "DETROIT" "1" "January 2014" "" "Detroit"
5
+ .
6
+ .SH "NAME"
7
+ \fBdetroit\fR \- a life\-cycle build tool
8
+ .
9
+ .SH "DESCRIPTION"
10
+ Detroit is a software production management aid\. Detroit utilizes a life\-cycle methodology to help developers prepare and release software in a clear, repeatable, linear fashion\. While programmed in and well suited to Ruby projects, Detroit can utilized for any build requirements\.
11
+ .
12
+ .SH "USAGE"
13
+ To utilize Detroit add a \fBToolchain\fR file to your project\'s root directory\. In this file add instantiation of tools, configured to your projects build requirements\. Toolchain files can be written in YAML or Ruby\.
14
+ .
15
+ .P
16
+ For example to generate RDoc\'s for a project, a tool might be defined:
17
+ .
18
+ .IP "" 4
19
+ .
20
+ .nf
21
+
22
+ rdoc:
23
+ tool: rdoc
24
+ files:
25
+ \- lib
26
+ \- \'[A\-Z]*\.*\'
27
+ main: README\.md
28
+ .
29
+ .fi
30
+ .
31
+ .IP "" 0
32
+ .
33
+ .P
34
+ See the online User Guide \fIhttp://wiki\.rubyworks\.github\.com/detroit\fR for more details on creating toolchain files\.
35
+ .
36
+ .P
37
+ Once a toolchain file is in place, the \fBdetroit\fR command line tool can be used to invoke the tools\. For example, to generate documentation:
38
+ .
39
+ .IP "" 4
40
+ .
41
+ .nf
42
+
43
+ $ detroit document
44
+ .
45
+ .fi
46
+ .
47
+ .IP "" 0
48
+ .
49
+ .P
50
+ This will run through all standard stations up to and including \fBdocument\fR\. Since the RDoc tool we configured above defines a document job, it would be run in due course\.
51
+ .
52
+ .SH "OPTIONS"
53
+ These are the available options for the \fBdetroit\fR command line tool\.
54
+ .
55
+ .IP "\(bu" 4
56
+ \fB\-m\fR, \fB\-\-multitask\fR Run work elements in parallel\.
57
+ .
58
+ .IP "\(bu" 4
59
+ \fB\-S\fR, \fB\-\-skip=SERVICE\fR Skip a service\.
60
+ .
61
+ .IP "\(bu" 4
62
+ \fB\-s\fR, \fB\-\-system=NAME\fR Select assembly system\. Default is \'standard\'\.
63
+ .
64
+ .IP "\(bu" 4
65
+ \fB\-t\fR, \fB\-\-toolchain=FILE\fR Use specific toolchain file(s)\.
66
+ .
67
+ .IP "\(bu" 4
68
+ \fB\-F\fR, \fB\-\-force\fR Force operations\.
69
+ .
70
+ .IP "\(bu" 4
71
+ \fB\-\-trace\fR Run in TRACE mode\.
72
+ .
73
+ .IP "\(bu" 4
74
+ \fB\-\-trial\fR Run in TRIAL mode (no disk writes)\.
75
+ .
76
+ .IP "\(bu" 4
77
+ \fB\-\-verbose\fR Provide extra output\.
78
+ .
79
+ .IP "\(bu" 4
80
+ \fB\-q\fR, \fB\-\-quiet\fR Run silently\.
81
+ .
82
+ .IP "\(bu" 4
83
+ \fB\-I=PATH\fR Add directory to $LOAD_PATH
84
+ .
85
+ .IP "\(bu" 4
86
+ \fB\-\-debug\fR Run with $DEBUG set to true\.
87
+ .
88
+ .IP "\(bu" 4
89
+ \fB\-\-warn\fR Run with $VERBOSE set to true\.
90
+ .
91
+ .IP "\(bu" 4
92
+ \fB\-\-help [TOOL]\fR Display this help message\.
93
+ .
94
+ .IP "\(bu" 4
95
+ \fB\-c\fR, \fB\-\-config=TOOL\fR Produce a configuration template\.
96
+ .
97
+ .IP "" 0
98
+ .
99
+ .SH "RESOURCES"
100
+ .
101
+ .IP "\(bu" 4
102
+ Homepage \fIhttp://rubyworks\.github\.com/detroit\fR
103
+ .
104
+ .IP "\(bu" 4
105
+ Development \fIhttp://github\.com/rubyworks/detroit\fR
106
+ .
107
+ .IP "\(bu" 4
108
+ Mailing List \fIhttp://googlegroups\.com/group/rubyworks\-mailinglist\fR
109
+ .
110
+ .IP "" 0
111
+ .
112
+ .SH "COPYRIGHT"
113
+ Copyright (c) 2011 Rubyworks
114
+ .
115
+ .P
116
+ Detroit is distributable in accordance with the terms of the GPL v3 license\.
@@ -0,0 +1,171 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv='content-type' value='text/html;charset=utf8'>
5
+ <meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
6
+ <title>detroit(1) - a life-cycle build tool</title>
7
+ <style type='text/css' media='all'>
8
+ /* style: man */
9
+ body#manpage {margin:0}
10
+ .mp {max-width:100ex;padding:0 9ex 1ex 4ex}
11
+ .mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
12
+ .mp h2 {margin:10px 0 0 0}
13
+ .mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
14
+ .mp h3 {margin:0 0 0 4ex}
15
+ .mp dt {margin:0;clear:left}
16
+ .mp dt.flush {float:left;width:8ex}
17
+ .mp dd {margin:0 0 0 9ex}
18
+ .mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
19
+ .mp pre {margin-bottom:20px}
20
+ .mp pre+h2,.mp pre+h3 {margin-top:22px}
21
+ .mp h2+pre,.mp h3+pre {margin-top:5px}
22
+ .mp img {display:block;margin:auto}
23
+ .mp h1.man-title {display:none}
24
+ .mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
25
+ .mp h2 {font-size:16px;line-height:1.25}
26
+ .mp h1 {font-size:20px;line-height:2}
27
+ .mp {text-align:justify;background:#fff}
28
+ .mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
29
+ .mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
30
+ .mp u {text-decoration:underline}
31
+ .mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
32
+ .mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
33
+ .mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
34
+ .mp b.man-ref {font-weight:normal;color:#434241}
35
+ .mp pre {padding:0 4ex}
36
+ .mp pre code {font-weight:normal;color:#434241}
37
+ .mp h2+pre,h3+pre {padding-left:0}
38
+ ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
39
+ ol.man-decor {width:100%}
40
+ ol.man-decor li.tl {text-align:left}
41
+ ol.man-decor li.tc {text-align:center;letter-spacing:4px}
42
+ ol.man-decor li.tr {text-align:right;float:right}
43
+ </style>
44
+ </head>
45
+ <!--
46
+ The following styles are deprecated and will be removed at some point:
47
+ div#man, div#man ol.man, div#man ol.head, div#man ol.man.
48
+
49
+ The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
50
+ .man-navigation should be used instead.
51
+ -->
52
+ <body id='manpage'>
53
+ <div class='mp' id='man'>
54
+
55
+ <div class='man-navigation' style='display:none'>
56
+ <a href="#NAME">NAME</a>
57
+ <a href="#DESCRIPTION">DESCRIPTION</a>
58
+ <a href="#USAGE">USAGE</a>
59
+ <a href="#OPTIONS">OPTIONS</a>
60
+ <a href="#RESOURCES">RESOURCES</a>
61
+ <a href="#COPYRIGHT">COPYRIGHT</a>
62
+ </div>
63
+
64
+ <ol class='man-decor man-head man head'>
65
+ <li class='tl'>detroit(1)</li>
66
+ <li class='tc'>Detroit</li>
67
+ <li class='tr'>detroit(1)</li>
68
+ </ol>
69
+
70
+ <h2 id="NAME">NAME</h2>
71
+ <p class="man-name">
72
+ <code>detroit</code> - <span class="man-whatis">a life-cycle build tool</span>
73
+ </p>
74
+
75
+ <h2 id="DESCRIPTION">DESCRIPTION</h2>
76
+
77
+ <p>Detroit is a software production management aid. Detroit utilizes a
78
+ life-cycle methodology to help developers prepare and release software
79
+ in a clear, repeatable, linear fashion. While programmed in and well
80
+ suited to Ruby projects, Detroit can utilized for any build requirements.</p>
81
+
82
+ <h2 id="USAGE">USAGE</h2>
83
+
84
+ <p>To utilize Detroit add a <code>Toolchain</code> file to your project's root directory.
85
+ In this file add instantiation of tools, configured to your projects build
86
+ requirements. Toolchain files can be written in YAML or Ruby.</p>
87
+
88
+ <p>For example to generate RDoc's for a project, a tool might be defined:</p>
89
+
90
+ <pre><code>rdoc:
91
+ tool: rdoc
92
+ files:
93
+ - lib
94
+ - '[A-Z]*.*'
95
+ main: README.md
96
+ </code></pre>
97
+
98
+ <p>See the online <a href="http://wiki.rubyworks.github.com/detroit">User Guide</a> for
99
+ more details on creating toolchain files.</p>
100
+
101
+ <p>Once a toolchain file is in place, the <code>detroit</code> command line tool can be used
102
+ to invoke the tools. For example, to generate documentation:</p>
103
+
104
+ <pre><code>$ detroit document
105
+ </code></pre>
106
+
107
+ <p>This will run through all standard stations up to and including <code>document</code>.
108
+ Since the RDoc tool we configured above defines a document job, it would be
109
+ run in due course.</p>
110
+
111
+ <h2 id="OPTIONS">OPTIONS</h2>
112
+
113
+ <p>These are the available options for the <code>detroit</code> command line tool.</p>
114
+
115
+ <ul>
116
+ <li><p><code>-m</code>, <code>--multitask</code>
117
+ Run work elements in parallel.</p></li>
118
+ <li><p><code>-S</code>, <code>--skip=SERVICE</code>
119
+ Skip a service.</p></li>
120
+ <li><p><code>-s</code>, <code>--system=NAME</code>
121
+ Select assembly system. Default is 'standard'.</p></li>
122
+ <li><p><code>-t</code>, <code>--toolchain=FILE</code>
123
+ Use specific toolchain file(s).</p></li>
124
+ <li><p><code>-F</code>, <code>--force</code>
125
+ Force operations.</p></li>
126
+ <li><p><code>--trace</code>
127
+ Run in TRACE mode.</p></li>
128
+ <li><p><code>--trial</code>
129
+ Run in TRIAL mode (no disk writes).</p></li>
130
+ <li><p><code>--verbose</code>
131
+ Provide extra output.</p></li>
132
+ <li><p><code>-q</code>, <code>--quiet</code>
133
+ Run silently.</p></li>
134
+ <li><p><code>-I=PATH</code>
135
+ Add directory to $LOAD_PATH</p></li>
136
+ <li><p><code>--debug</code>
137
+ Run with $DEBUG set to true.</p></li>
138
+ <li><p><code>--warn</code>
139
+ Run with $VERBOSE set to true.</p></li>
140
+ <li><p><code>--help [TOOL]</code>
141
+ Display this help message.</p></li>
142
+ <li><p><code>-c</code>, <code>--config=TOOL</code>
143
+ Produce a configuration template.</p></li>
144
+ </ul>
145
+
146
+
147
+ <h2 id="RESOURCES">RESOURCES</h2>
148
+
149
+ <ul>
150
+ <li><a href="http://rubyworks.github.com/detroit">Homepage</a></li>
151
+ <li><a href="http://github.com/rubyworks/detroit">Development</a></li>
152
+ <li><a href="http://googlegroups.com/group/rubyworks-mailinglist">Mailing List</a></li>
153
+ </ul>
154
+
155
+
156
+ <h2 id="COPYRIGHT">COPYRIGHT</h2>
157
+
158
+ <p>Copyright (c) 2011 Rubyworks</p>
159
+
160
+ <p>Detroit is distributable in accordance with the terms of the GPL v3 license.</p>
161
+
162
+
163
+ <ol class='man-decor man-foot man foot'>
164
+ <li class='tl'></li>
165
+ <li class='tc'>January 2014</li>
166
+ <li class='tr'>detroit(1)</li>
167
+ </ol>
168
+
169
+ </div>
170
+ </body>
171
+ </html>