drydock 0.5.6 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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