drydock 0.5.6 → 0.6.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 (6) hide show
  1. data/CHANGES.txt +14 -6
  2. data/README.rdoc +7 -5
  3. data/bin/example +159 -146
  4. data/drydock.gemspec +2 -2
  5. data/lib/drydock.rb +41 -29
  6. metadata +2 -2
data/CHANGES.txt CHANGED
@@ -3,7 +3,17 @@ DRYDOCK, CHANGES
3
3
  #### TODO ###############################
4
4
 
5
5
  * Support putting descriptions into resource file (or __END__)
6
- * Inline commands aliases. command :cmd1, :cmd2 do; ...; end
6
+
7
+
8
+ #### 0.6.0 (2009-04-22) #############################
9
+
10
+ * CHANGE: Cleaner default error message for UnknownCommand exceptions
11
+ * CHANGE: 'desc' is now 'about' (desc works, but it prints a notice)
12
+ * CHANGE: I now recommend implementing the Drydock DSL in a module.
13
+ bin/example was updated to reflect the change. This prevents Drydock
14
+ keywords from being included in the global namespace.
15
+ * ADDED: Inline commands aliases. command :cmd1, :cmd2 do; ...; end
16
+ * ADDED: Unknown commands can be directed to a trawler.
7
17
 
8
18
 
9
19
  #### 0.5.6 (2009-04-22) #############################
@@ -11,23 +21,19 @@ DRYDOCK, CHANGES
11
21
  * CHANGED: Interrupts now handled in rescue rather than a trap.
12
22
  * ADDED: Drydock::ArgError and Drydock::OptError are rescued at runtime by default
13
23
 
14
-
15
24
  #### 0.5.5 (2009-04-19) #############################
16
25
 
17
26
  * CHANGED: Improved help screen formatting.
18
27
 
19
-
20
28
  #### 0.5.4 (2009-04-15) #############################
21
29
 
22
30
  * ADDED: Better error handling with new Drydock::ArgError and Drydock::OptError
23
31
 
24
-
25
32
  #### 0.5.3 (2009-04-05) #############################
26
33
 
27
34
  * FIXED: Command actions were not being handled correctly. Added rdocs to
28
35
  clarify the code.
29
36
 
30
-
31
37
  #### 0.5.2 (2009-04-04) #############################
32
38
 
33
39
  * ADDED: before and after blocks now receive a primed reference to the
@@ -102,4 +108,6 @@ and sending to other methods manually.
102
108
  #### 0.2 (2008-12-27) ###############################
103
109
 
104
110
  * Initial release
105
- * Forked from bmizerany/frylock
111
+ * Forked from bmizerany/frylock
112
+
113
+
data/README.rdoc CHANGED
@@ -1,10 +1,8 @@
1
- = Drydock - v0.5
2
-
3
- Inspired by github-gem and bmizerany-frylock.
1
+ = Drydock - v0.6
4
2
 
5
3
  == Overview
6
4
 
7
- Drydock is a seaworthy DSL for command line apps. It's contained in a single .rb file so it's easy to copy directly into your project.
5
+ Drydock is a seaworthy DSL for really powerful command line applications. It's contained in a single .rb file so it's easy to copy directly into your project. See below for examples.
8
6
 
9
7
  == Install
10
8
 
@@ -38,7 +36,6 @@ See bin/example for more.
38
36
  puts "#{$0} show-commands"
39
37
  end
40
38
 
41
-
42
39
  usage "USAGE: #{$0} laugh [-f]"
43
40
  desc "The captain commands his crew to laugh"
44
41
  option :f, :faster, "A boolean value. Go even faster!"
@@ -75,6 +72,11 @@ See bin/example for more.
75
72
  * RDocs[http://drydock.rubyforge.org/]
76
73
  * Inspiration[http://www.youtube.com/watch?v=m_wFEB4Oxlo]
77
74
 
75
+ == Thanks
76
+
77
+ * Solutious Inc for putting up with my endless references to the sea! (http://solutious.com)
78
+ * Blake Mizerany for the inspiration via bmizerany-frylock[http://github.com/bmizerany/frylock]
79
+
78
80
  == Credits
79
81
 
80
82
  * Delano Mandelbaum (delano@solutious.com)
data/bin/example CHANGED
@@ -8,188 +8,201 @@
8
8
  #
9
9
  # If you're reading this via the Rdocs you won't see the code. See:
10
10
  #
11
- # http://github.com/delano/drydock/blob/drydock-0.5.0/bin/example
11
+ # http://github.com/delano/drydock/blob/master/bin/example
12
12
  #
13
13
  # For an example of a complex command-line application using
14
14
  # Drydock, see:
15
15
  #
16
- # http://github.com/solutious/rudy
16
+ # http://github.com/solutious/rudy/blob/master/bin/rudy
17
17
  #
18
18
 
19
19
  $:.unshift File.expand_path(File.join(File.dirname(__FILE__), '..')), 'lib'
20
20
 
21
21
  require 'drydock'
22
- extend Drydock # Tell Drydock you want its methods!
23
22
 
23
+ module Example
24
+ extend Drydock # Tell Drydock you want its methods!
25
+
26
+ default :welcome # The welcome command will be run if no command is given
27
+ capture :stderr # Drydock will capture STDERR and keep it in the hold.
28
+ # You can use this to suppress errors.
29
+
30
+ about "A friendly welcome to the Drydock"
31
+ command :welcome do
32
+ puts "Welcome to Drydock.", $/
33
+ puts "For available commands: #{$0} show-commands"
34
+ end
24
35
 
25
- default :welcome # The welcome command will be run if no command is given
26
- capture :stderr # Drydock will capture STDERR and keep it in the hold.
27
- # You can use this to suppress errors.
28
-
29
-
30
- desc "A friendly welcome to the Drydock"
31
- command :welcome do
32
- puts "Welcome to Drydock.", $/
33
- puts "For available commands: #{$0} show-commands"
34
- end
35
-
36
- usage "USAGE: #{$0} laugh [-f]"
37
- desc "The captain commands his crew to laugh"
38
- option :f, :faster, "A boolean value. Go even faster!"
39
- command :laugh do |obj|
40
- # +obj+ is an instance of Drydock::Command. The options you define are available
41
- # via obj.option.name
36
+ usage "USAGE: #{$0} laugh [-f]"
37
+ about "The captain commands his crew to laugh"
38
+ option :f, :faster, "A boolean value. Go even faster!"
39
+ command :laugh do |obj|
40
+ # +obj+ is an instance of Drydock::Command. The options you define are available
41
+ # via obj.option.name
42
42
 
43
- answer = !obj.option.faster ? "Sort of" : "Yes! I'm literally laughing as fast as possible."
43
+ answer = !obj.option.faster ? "Sort of" : "Yes! I'm literally laughing as fast as possible."
44
44
 
45
- puts "Captain Stubing: Are you laughing?"
46
- puts "Dr. Bricker: " << answer
47
- end
45
+ puts "Captain Stubing: Are you laughing?"
46
+ puts "Dr. Bricker: " << answer
47
+ end
48
48
 
49
- global_usage "USAGE: #{File.basename($0)} [global options] command [command options]"
50
- global :s, :seconds, "Display values in seconds"
51
- global :v, :verbose, "Verbosity level (i.e. -vvv is greater than -v)" do |v|
52
- # Use instance variables to maintain values between option blocks.
53
- # This will increment for every -v found (i.e. -vvv)
54
- @val ||= 0
55
- @val += 1
56
- end
49
+ global_usage "USAGE: #{File.basename($0)} [global options] command [command options]"
50
+ global :s, :seconds, "Display values in seconds"
51
+ global :v, :verbose, "Verbosity level (i.e. -vvv is greater than -v)" do |v|
52
+ # Use instance variables to maintain values between option blocks.
53
+ # This will increment for every -v found (i.e. -vvv)
54
+ @val ||= 0
55
+ @val += 1
56
+ end
57
57
 
58
- before do |obj|
59
- # You can execute a block before the requests command is executed. Instance
60
- # variables defined here will be available to all commands.
61
- # +obj+ is a reference to the command object, just like in command blocks.
62
- end
58
+ before do |obj|
59
+ # You can execute a block before the requests command is executed. Instance
60
+ # variables defined here will be available to all commands.
61
+ # +obj+ is a reference to the command object, just like in command blocks.
62
+ end
63
63
 
64
- after do |obj|
65
- # And this will be called after the command.
66
- end
64
+ after do |obj|
65
+ # And this will be called after the command.
66
+ end
67
67
 
68
- usage "#{$0} [-s] [-vv] date"
69
- desc "Display the current date"
70
- command :date do |obj|
71
- require 'time'
72
- now = Time.now
73
- puts "(Not verbose enough. Try adding a -v.)" if (obj.global.verbose || 0) == 1
74
- puts "More verbosely, the date is now: " if (obj.global.verbose || 0) >= 2
75
- puts (obj.global.seconds) ? now.to_i : now.to_s
76
- end
68
+ usage "#{$0} [-s] [-vv] date"
69
+ about "Display the current date"
70
+ command :date do |obj|
71
+ require 'time'
72
+ now = Time.now
73
+ puts "(Not verbose enough. Try adding a -v.)" if (obj.global.verbose || 0) == 1
74
+ puts "More verbosely, the date is now: " if (obj.global.verbose || 0) >= 2
75
+ puts (obj.global.seconds) ? now.to_i : now.to_s
76
+ end
77
77
 
78
78
 
79
- ignore :options
80
- desc "This command ignores options"
81
- command :rogue do |obj|
82
- # You can use ignore :options to tell Drydock to not process the
83
- # command-specific options.
84
- # Unnamed arguments are available from obj.argv
85
- if obj.argv.empty?
86
- puts "Had you supplied some arguments, I would have ignored them."
87
- else
88
- puts "Hi! You supplied some arguments but I ignored them."
89
- puts "They're all still here in this array: %s" % obj.argv.join(', ')
79
+ ignore :options
80
+ about "This command ignores options"
81
+ command :rogue do |obj|
82
+ # You can use ignore :options to tell Drydock to not process the
83
+ # command-specific options.
84
+ # Unnamed arguments are available from obj.argv
85
+ if obj.argv.empty?
86
+ puts "Had you supplied some arguments, I would have ignored them."
87
+ else
88
+ puts "Hi! You supplied some arguments but I ignored them."
89
+ puts "They're all still here in this array: %s" % obj.argv.join(', ')
90
+ end
90
91
  end
91
- end
92
92
 
93
- class JohnWestSmokedOysters < Drydock::Command
94
- # You can write your own command classes by inheriting from Drydock::Command
95
- # and referencing it in the command definition.
96
- def ahoy!; p "matey"; end
97
- end
93
+ class JohnWestSmokedOysters < Drydock::Command
94
+ # You can write your own command classes by inheriting from Drydock::Command
95
+ # and referencing it in the command definition.
96
+ def ahoy!; p "matey"; end
97
+ end
98
98
 
99
- desc "Do something with John West's Smoked Oysters"
100
- command :oysters => JohnWestSmokedOysters do |obj|
101
- p obj # => #<JohnWestSmokedOysters:0x42179c ... >
102
- end
99
+ about "Do something with John West's Smoked Oysters"
100
+ command :oysters => JohnWestSmokedOysters do |obj|
101
+ p obj # => #<JohnWestSmokedOysters:0x42179c ... >
102
+ end
103
103
 
104
- desc "My way of saying hello!"
105
- command :ahoy! => JohnWestSmokedOysters
106
- # If you don't provide a block, Drydock will call JohnWestSmokedOysters#ahoy!
104
+ about "My way of saying hello!"
105
+ command :ahoy! => JohnWestSmokedOysters
106
+ # If you don't provide a block, Drydock will call JohnWestSmokedOysters#ahoy!
107
107
 
108
108
 
109
- require 'yaml'
109
+ require 'yaml'
110
110
 
111
- usage 'ruby bin/example uri -c -d " " -t 15 http://solutious.com/'
112
- usage 'echo "http://solutious.com/" | ruby bin/example uri -c -d " " -t 15'
113
- desc "Check for broken URIs"
114
- option :c, :check, "Check response codes for each URI"
115
- option :d, :delim, String, "Output delimiter"
116
- option :t, :timeout, Float, "Timeout value for HTTP request" do |v|
117
- # You can provide an block to process the option value.
118
- # This block must return the final value.
119
- v = 10 if (v > 10)
120
- v
121
- end
122
- argv :uris
123
- command :uri do |obj|
124
- # This command processes the output of the stdin block (below this definition).
125
- # The output of that block is available as obj.stdin. If there is no stdin block
126
- # obj.stdin will be STDIN's IO object.
127
-
128
- require 'net/http'
129
- require 'uri'
130
- require 'timeout'
131
-
132
- uris = []
133
- uris += obj.stdin if obj.stdin
134
- uris += obj.argv.uris if obj.argv.uris
111
+ usage 'ruby bin/example uri -c -d " " -t 15 http://solutious.com/'
112
+ usage 'echo "http://solutious.com/" | ruby bin/example uri -c -d " " -t 15'
113
+ about "Check for broken URIs"
114
+ option :c, :check, "Check response codes for each URI"
115
+ option :d, :delim, String, "Output delimiter"
116
+ option :t, :timeout, Float, "Timeout value for HTTP request" do |v|
117
+ # You can provide an block to process the option value.
118
+ # This block must return the final value.
119
+ v = 10 if (v > 10)
120
+ v
121
+ end
122
+ argv :uris
135
123
 
136
- delim = obj.option.delim || ','
137
- timeout = obj.option.timeout || 5
138
- code = :notchecked # The default code when :check is false
124
+ command :uri do |obj|
125
+ # This command processes the output of the stdin block (below this definition).
126
+ # The output of that block is available as obj.stdin. If there is no stdin block
127
+ # obj.stdin will be STDIN's IO object.
128
+
129
+ require 'net/http'
130
+ require 'uri'
131
+ require 'timeout'
139
132
 
140
- if uris.empty?
141
- puts "Frylock: You didn't provide any URIs. "
142
- puts "Master Shake: Ya, see #{$0} #{obj.alias} -h"
143
- exit 0
144
- end
133
+ uris = []
134
+ uris += obj.stdin if obj.stdin
135
+ uris += obj.argv.uris if obj.argv.uris
145
136
 
146
- uris.each_with_index do |uri, index|
147
- code = response_code(uri, timeout) if (obj.option.check)
148
- puts [index+1, uri, code].join(delim)
149
- end
137
+ delim = obj.option.delim || ','
138
+ timeout = obj.option.timeout || 5
139
+ code = :notchecked # The default code when :check is false
150
140
 
151
- # NOTE: The alias used to evoke this command is available
152
- # via obj.alias
141
+ if uris.empty?
142
+ puts "Frylock: You didn't provide any URIs. "
143
+ puts "Master Shake: Ya, see #{$0} #{obj.alias} -h"
144
+ exit 0
145
+ end
153
146
 
154
- end
155
- alias_command :checkuri, :uri
156
-
157
-
147
+ uris.each_with_index do |uri, index|
148
+ code = response_code(uri, timeout) if (obj.option.check)
149
+ puts [index+1, uri, code].join(delim)
150
+ end
151
+
152
+ end
158
153
 
159
- stdin do |stdin, output|
160
- # Pre-process STDIN for all commands. This example returns an array of lines.
161
- # The command processuris uses this array.
154
+ about "Prints the alias used to access the command"
155
+ # We can define command aliases by providing a list of command
156
+ # names. The first name is still consider to be the main name.
157
+ command :printalias, :reveal do |obj|
158
+ puts "This is printalias!"
159
+ if (obj.alias == obj.cmd)
160
+ puts "You did not use an alias"
161
+ else
162
+ puts "You used the alias " << obj.alias
163
+ end
164
+ end
165
+
166
+ stdin do |stdin, output|
167
+ # Pre-process STDIN for all commands. This example returns an array of lines.
168
+ # The command processuris uses this array.
162
169
 
163
- # We only want piped data. If this is not included
164
- # execution will wait for input from the user.
165
- unless stdin.tty?
170
+ # We only want piped data. If this is not included
171
+ # execution will wait for input from the user.
172
+ unless stdin.tty?
166
173
 
167
- while !stdin.eof? do
168
- line = stdin.readline
169
- line.chomp!
170
- (output ||= []) << line
171
- end
174
+ while !stdin.eof? do
175
+ line = stdin.readline
176
+ line.chomp!
177
+ (output ||= []) << line
178
+ end
172
179
 
180
+ end
181
+ output
173
182
  end
174
- output
175
- end
176
183
 
177
-
178
-
179
- # response_code
180
- #
181
- # return the HTTP response code for the given URI
182
- # +uri+ A valid HTTP URI
183
- # +duration+ The timeout threshold (in seconds) for the request.
184
- def response_code(uri_str, duration=5) #:nodoc:
185
- response = :unavailable
186
- begin
187
- uri = (uri_str.kind_of? URI::HTTP) ? uri_str : URI.parse(uri_str)
188
- timeout(duration) do
189
- response = Net::HTTP.get_response(uri).code
190
- end
191
- rescue Exception => ex
184
+
185
+ # And one final feature for the intrepid swabbies like myself.
186
+ # Drydock can handle unknown commands by catching them with a
187
+ # trawler. It's like the captain of all aliases. Just specify
188
+ # the command name to direct all unknown commands to. Simple!
189
+ trawler :printalias
190
+
191
+
192
+ # Return the HTTP response code for the given URI. Used by
193
+ # uri command.
194
+ #
195
+ # +uri+ A valid HTTP URI
196
+ # +duration+ The timeout threshold (in seconds) for the request.
197
+ def response_code(uri_str, duration=5) #:nodoc:
198
+ response = :unavailable
199
+ begin
200
+ uri = (uri_str.kind_of? URI::HTTP) ? uri_str : URI.parse(uri_str)
201
+ timeout(duration) do
202
+ response = Net::HTTP.get_response(uri).code
203
+ end
204
+ rescue Exception => ex
205
+ end
206
+ response
192
207
  end
193
- response
194
208
  end
195
-
data/drydock.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  @spec = Gem::Specification.new do |s|
2
2
  s.name = %q{drydock}
3
- s.version = "0.5.6"
4
- s.date = %q{2009-04-22}
3
+ s.version = "0.6.0"
4
+ s.date = %q{2009-04-28}
5
5
  s.specification_version = 1 if s.respond_to? :specification_version=
6
6
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
7
7
 
data/lib/drydock.rb CHANGED
@@ -75,7 +75,7 @@ module Drydock
75
75
  # end
76
76
  #
77
77
  class Command
78
- VERSION = 0.5
78
+ VERSION = 0.6
79
79
  # The canonical name of the command (the one used in the command definition). If you
80
80
  # inherit from this class and add a method named +cmd+, you can leave omit the block
81
81
  # in the command definition. That method will be called instead. See bin/examples.
@@ -266,7 +266,6 @@ module Drydock
266
266
 
267
267
  cmd_names_sorted = cmds.keys.sort{ |a,b| a.to_s <=> b.to_s }
268
268
 
269
-
270
269
  if @global.quiet
271
270
  puts "Commands: "
272
271
  line = []
@@ -351,7 +350,7 @@ end
351
350
  module Drydock
352
351
  extend self
353
352
 
354
- VERSION = 0.5
353
+ VERSION = 0.6
355
354
 
356
355
  @@project = nil
357
356
 
@@ -374,9 +373,11 @@ module Drydock
374
373
  @@command_index_map = {}
375
374
  @@command_argv_names = [] # an array of names for values of argv
376
375
 
377
- @@capture = nil # contains one of :stdout, :stderr
376
+ @@capture = nil # contains one of :stdout, :stderr
378
377
  @@captured = nil
379
378
 
379
+ @@trawler = nil
380
+
380
381
  public
381
382
  # Enable or disable debug output.
382
383
  #
@@ -494,7 +495,6 @@ module Drydock
494
495
  get_current_option_parser.banner << "USAGE: #{msg}" << $/
495
496
  end
496
497
 
497
-
498
498
  # Tell the Drydock parser to ignore something.
499
499
  # Drydock will currently only listen to you if you tell it to "ignore :options",
500
500
  # otherwise it will ignore you!
@@ -581,7 +581,7 @@ module Drydock
581
581
  # end
582
582
  #
583
583
  def command(*cmds, &b)
584
- cmd = cmds.first # Should we accept aliases here?
584
+ cmd = cmds.shift # Should we accept aliases here?
585
585
 
586
586
  if cmd.is_a? Hash
587
587
  raise "#{cmd.values.first} is not a subclass of Drydock::Command" unless cmd.values.first.ancestors.member?(Drydock::Command)
@@ -612,6 +612,10 @@ module Drydock
612
612
  @@command_index_map[c.cmd] = @@command_index
613
613
  @@command_index += 1 # This will point to the next command
614
614
 
615
+ # Created aliases to the command using any additional command names
616
+ # i.e. command :something, :sumpin => Something
617
+ cmds.each { |aliaz| command_alias(cmd, aliaz); } unless cmds.empty?
618
+
615
619
  c # Return the Command object
616
620
  end
617
621
 
@@ -651,12 +655,32 @@ module Drydock
651
655
  @@commands.keys.collect { |cmd| decanonize(cmd); }
652
656
  end
653
657
 
658
+ # The trawler catches any and all unknown commands that pass through
659
+ # Drydock. It's like the captain of aliases.
660
+ # +cmd+ is the name of the command to direct unknowns to.
661
+ #
662
+ # trawler :command_name
663
+ #
664
+ def trawler(cmd)
665
+ @@trawler = cmd
666
+ end
667
+
668
+ # Has the trawler been set?
669
+ def trawler?
670
+ !@@trawler.nil? && !@@trawler.empty?
671
+ end
672
+
654
673
  # Provide a description for a command
655
- def desc(txt)
674
+ def about(txt)
656
675
  @@command_descriptions += [txt]
657
676
  return if get_current_option_parser.is_a?(Symbol)
658
677
  get_current_option_parser.on "ABOUT: #{txt}"
659
678
  end
679
+ # Deprecated. Use about.
680
+ def desc(txt)
681
+ STDERR.puts "'desc' is deprecated. Please use 'about' instead."
682
+ about(txt)
683
+ end
660
684
 
661
685
  # Returns true if automatic execution is enabled.
662
686
  def run?
@@ -683,12 +707,8 @@ module Drydock
683
707
  return if has_run?
684
708
  @@has_run = true
685
709
  raise NoCommandsDefined.new if commands.empty?
686
- global_options, cmd_name, command_options, argv = process_arguments(argv)
687
-
688
- cmd_name ||= default_command
689
-
690
- raise UnknownCommand.new(cmd_name) unless command?(cmd_name)
691
710
 
711
+ global_options, cmd_name, command_options, argv = process_arguments(argv)
692
712
  stdin = (defined? @@stdin_block) ? @@stdin_block.call(stdin, []) : stdin
693
713
 
694
714
  command_obj = get_command(cmd_name)
@@ -811,7 +831,12 @@ module Drydock
811
831
 
812
832
  global_options = @@global_opts_parser.getopts(argv)
813
833
  cmd_name = (argv.empty?) ? @@default_command : argv.shift
814
- raise UnknownCommand.new(cmd_name) unless command?(cmd_name)
834
+
835
+ unless command?(cmd_name)
836
+ raise UnknownCommand.new(cmd_name) unless trawler?
837
+ raise UnknownCommand.new(@@trawler) unless command?(@@trawler)
838
+ command_alias(@@trawler, cmd_name)
839
+ end
815
840
 
816
841
  cmd = get_command(cmd_name)
817
842
 
@@ -825,22 +850,6 @@ module Drydock
825
850
  command_options = command_parser.getopts(argv)
826
851
  end
827
852
 
828
- # TODO: Remove this chunk for method creation. We now use OpenStruct.
829
- # Add accessors to the Drydock::Command object
830
- # for the global and command specific options
831
- #[global_option_names, (command_option_names[get_command_index(cmd_name)] || [])].flatten.each do |n|
832
- # unless cmd.respond_to?(n)
833
- # cmd.class.send(:define_method, n) do
834
- # instance_variable_get("@#{n}")
835
- # end
836
- # end
837
- # unless cmd.respond_to?("#{n}=")
838
- # cmd.class.send(:define_method, "#{n}=") do |val|
839
- # instance_variable_set("@#{n}", val)
840
- # end
841
- # end
842
- #end
843
-
844
853
  [global_options, cmd_name, command_options, argv]
845
854
  end
846
855
 
@@ -895,6 +904,9 @@ at_exit {
895
904
  rescue Drydock::ArgError, Drydock::OptError=> ex
896
905
  STDERR.puts ex.message
897
906
  STDERR.puts ex.usage
907
+ rescue Drydock::UnknownCommand => ex
908
+ STDERR.puts ex.message
909
+ STDERR.puts ex.backtrace if Drydock.debug?
898
910
  rescue => ex
899
911
  STDERR.puts "ERROR (#{ex.class.to_s}): #{ex.message}"
900
912
  STDERR.puts ex.backtrace if Drydock.debug?
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: drydock
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.6
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Delano Mandelbaum
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-04-22 00:00:00 -04:00
12
+ date: 2009-04-28 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies: []
15
15