detroit 0.3.0 → 0.4.0

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.
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>