methadone 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -9,3 +9,4 @@ rvm:
9
9
  - ree
10
10
  - ruby-head
11
11
  - rbx
12
+ - jruby
data/CHANGES.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.2.0 - May 21, 2012, 11:05 PM
4
+
5
+ * Better handling of `open4` dependency when you don't install it and you don't use it.
6
+ * Quoted spaced strings in config files and env var weren't working. Now they are.
7
+ * Use the current version in generated gemspec
8
+ * Non-string arguments (such as Regexps for validation and classes for type conversion) were not working. Now they are.
9
+ * `sh` can now be used more safely by passing an array to avoid tokenization (thanks @gchpaco!)
10
+
3
11
  ## v1.1.0 - April 21, 2012, 6:00 PM
4
12
 
5
13
  * Can bootstrap apps using RSpec instead of Test::Unit (thanks @msgehard)
data/Rakefile CHANGED
@@ -26,6 +26,12 @@ RDoc::Task.new do |rd|
26
26
  rd.title = 'Methadone - Power Up your Command Line Apps'
27
27
  end
28
28
 
29
+ if RUBY_PLATFORM == 'java'
30
+ task :features do
31
+ puts "Aruba doesn't work on JRuby; cannot run features"
32
+ end
33
+ task 'features:wip' => :features
34
+ else
29
35
  CUKE_RESULTS = 'results.html'
30
36
  CLEAN << CUKE_RESULTS
31
37
  Cucumber::Rake::Task.new(:features) do |t|
@@ -41,6 +47,7 @@ Cucumber::Rake::Task.new('features:wip') do |t|
41
47
  t.cucumber_opts = "features --format html -o #{CUKE_RESULTS} --format pretty -x -s#{tag_opts}"
42
48
  t.fork = false
43
49
  end
50
+ end
44
51
 
45
52
  CLEAN << "coverage"
46
53
  CLOBBER << FileList['**/*.rbc']
data/bin/methadone CHANGED
@@ -60,7 +60,7 @@ main do |app_name|
60
60
  " #{gem_variable}.add_development_dependency('rdoc')",
61
61
  " #{gem_variable}.add_development_dependency('aruba')",
62
62
  " #{gem_variable}.add_development_dependency('rake','~> 0.9.2')",
63
- " #{gem_variable}.add_dependency('methadone', '~>1.0.0.rc4')",
63
+ " #{gem_variable}.add_dependency('methadone', '~>#{Methadone::VERSION}')",
64
64
  ], :before => /^end\s*$/
65
65
  end
66
66
 
data/lib/methadone.rb CHANGED
@@ -2,6 +2,7 @@ require 'methadone/version'
2
2
  require 'methadone/cli_logger'
3
3
  require 'methadone/cli_logging'
4
4
  require 'methadone/exit_now'
5
+ require 'methadone/argv_parser'
5
6
  require 'methadone/main'
6
7
  require 'methadone/error'
7
8
  require 'methadone/execution_strategy/base'
@@ -0,0 +1,50 @@
1
+ module Methadone #:nodoc:
2
+ # Assists with parsing strings in the same way that ARGV might.
3
+ # This is *not* used to parse the command-line, but used to
4
+ # parse config files/environment variables so they can be placed into ARGV and properly interpretted by
5
+ # OptionParser
6
+ module ARGVParser #:nodoc:
7
+
8
+ private
9
+
10
+ # Parses +string+, returning an array that can be placed into ARGV or given to OptionParser
11
+ def parse_string_for_argv(string) #:nodoc:
12
+ return [] if string.nil?
13
+
14
+ args = [] # return value we are building up
15
+ current = 0 # pointer to where we are in +string+
16
+ next_arg = '' # the next arg we are building up to ultimatley put into args
17
+ inside_quote = nil # quote character we are "inside" of
18
+ last_char = nil # the last character we saw
19
+
20
+ while current < string.length
21
+ char = string.chars.to_a[current]
22
+ case char
23
+ when /["']/
24
+ if inside_quote.nil? # eat the quote, but remember we are now "inside" one
25
+ inside_quote = char
26
+ elsif inside_quote == char # we closed the quote we were "inside"
27
+ inside_quote = nil
28
+ else # we got a different quote, so it goes in literally
29
+ next_arg << char
30
+ end
31
+ when /\s/
32
+ if last_char == "\\" # we have an escaped space, replace the escape char
33
+ next_arg[-1] = char
34
+ elsif inside_quote # we are inside a quote so keep the space
35
+ next_arg << char
36
+ else # new argument
37
+ args << next_arg
38
+ next_arg = ''
39
+ end
40
+ else
41
+ next_arg << char
42
+ end
43
+ current += 1
44
+ last_char = char
45
+ end
46
+ args << next_arg unless next_arg == ''
47
+ args
48
+ end
49
+ end
50
+ end
@@ -3,11 +3,14 @@ module Methadone
3
3
  # Base for any ExecutionStrategy implementation. Currently, this is nothing more than an interface
4
4
  # specification.
5
5
  class Base
6
- # Executes the command and returns the results back.
7
- # This should do no logging or other logic other than to execute the command
8
- # and return the required results.
6
+ # Executes the command and returns the results back. This
7
+ # should do no logging or other logic other than to execute the
8
+ # command and return the required results. If command is an
9
+ # array, use exec directly bypassing any tokenization, shell or
10
+ # otherwise; otherwise use the normal shell interpretation of
11
+ # the command string.
9
12
  #
10
- # command:: the command-line to run, as a String
13
+ # command:: the command-line to run, as an Array or a String
11
14
  #
12
15
  # Returns an array of size 3:
13
16
  # <tt>[0]</tt>:: The standard output of the command as a String, never nil
@@ -5,7 +5,12 @@ module Methadone
5
5
  # Methadone::ExecutionStrategy for the JVM that uses JVM classes to run the command and get its results.
6
6
  class JVM < Base
7
7
  def run_command(command)
8
- process = java.lang.Runtime.get_runtime.exec(command)
8
+ process = case command
9
+ when String then
10
+ java.lang.Runtime.get_runtime.exec(command)
11
+ else
12
+ java.lang.Runtime.get_runtime.exec(*command)
13
+ end
9
14
  process.get_output_stream.close
10
15
  stdout = input_stream_to_string(process.get_input_stream)
11
16
  stderr = input_stream_to_string(process.get_error_stream)
@@ -5,7 +5,10 @@ module Methadone
5
5
  # Implementation for modern Rubies that uses the built-in Open3 library
6
6
  class Open_3 < MRI
7
7
  def run_command(command)
8
- stdout,stderr,status = Open3.capture3(command)
8
+ stdout,stderr,status = case command
9
+ when String then Open3.capture3(command)
10
+ else Open3.capture3(*command)
11
+ end
9
12
  [stdout.chomp,stderr.chomp,status]
10
13
  end
11
14
  end
@@ -6,7 +6,11 @@ module Methadone
6
6
  # Open4 to get access to the standard output AND error.
7
7
  class Open_4 < MRI
8
8
  def run_command(command)
9
- pid, stdin_io, stdout_io, stderr_io = Open4::popen4(command)
9
+ pid, stdin_io, stdout_io, stderr_io =
10
+ case command
11
+ when String then Open4::popen4(command)
12
+ else Open4::popen4(*command)
13
+ end
10
14
  stdin_io.close
11
15
  stdout = stdout_io.read
12
16
  stderr = stderr_io.read
@@ -72,6 +72,8 @@ module Methadone
72
72
  #
73
73
  module Main
74
74
  include Methadone::ExitNow
75
+ include Methadone::ARGVParser
76
+
75
77
  def self.included(k)
76
78
  k.extend(self)
77
79
  end
@@ -318,7 +320,7 @@ module Methadone
318
320
 
319
321
  def set_defaults_from_env_var
320
322
  if @env_var
321
- String(ENV[@env_var]).split(/\s+/).each do |arg|
323
+ parse_string_for_argv(ENV[@env_var]).each do |arg|
322
324
  ::ARGV.unshift(arg)
323
325
  end
324
326
  end
@@ -329,7 +331,7 @@ module Methadone
329
331
  File.open(@rc_file) do |file|
330
332
  parsed = YAML::load(file)
331
333
  if parsed.kind_of? String
332
- String(parsed).split(/\s+/).each do |arg|
334
+ parse_string_for_argv(parsed).each do |arg|
333
335
  ::ARGV.unshift(arg)
334
336
  end
335
337
  elsif parsed.kind_of? Hash
@@ -344,6 +346,7 @@ module Methadone
344
346
  end
345
347
  end
346
348
 
349
+
347
350
  # Normalized all defaults to both string and symbol forms, so
348
351
  # the user can access them via either means just as they would for
349
352
  # non-defaulted options
@@ -450,7 +453,7 @@ module Methadone
450
453
  options << :one unless options.include?(:any) || options.include?(:many)
451
454
  @args << arg_name
452
455
  @arg_options[arg_name] = options
453
- options.select { |_| _.kind_of? ::String }.each do |doc|
456
+ options.select(&STRINGS_ONLY).each do |doc|
454
457
  @arg_documentation[arg_name] = doc + (options.include?(:optional) ? " (optional)" : "")
455
458
  end
456
459
  set_banner
@@ -507,7 +510,11 @@ module Methadone
507
510
  end
508
511
 
509
512
  def option_names_from(args)
510
- args.select { |_| _ =~ /^\-/ }.map { |_| _.gsub(/^\-+/,'').gsub(/\s.*$/,'') }
513
+ args.select(&STRINGS_ONLY).select { |_|
514
+ _ =~ /^\-/
515
+ }.map { |_|
516
+ _.gsub(/^\-+/,'').gsub(/\s.*$/,'')
517
+ }
511
518
  end
512
519
 
513
520
  def set_banner
@@ -537,7 +544,7 @@ module Methadone
537
544
  end
538
545
 
539
546
  def option_names(*opts_on_args,&block)
540
- opts_on_args.map { |arg|
547
+ opts_on_args.select(&STRINGS_ONLY).map { |arg|
541
548
  if arg =~ /^--\[no-\]([^-\s][^\s]*)/
542
549
  $1.to_sym
543
550
  elsif arg =~ /^--([^-\s][^\s]*)/
@@ -550,5 +557,7 @@ module Methadone
550
557
  }.reject(&:nil?)
551
558
  end
552
559
 
560
+ STRINGS_ONLY = lambda { |o| o.kind_of?(::String) }
561
+
553
562
  end
554
563
  end
data/lib/methadone/sh.rb CHANGED
@@ -5,8 +5,7 @@ elsif RUBY_VERSION =~ /^1.8/
5
5
  begin
6
6
  require 'open4'
7
7
  rescue LoadError
8
- STDERR.puts "!! For Ruby #{RUBY_VERSION}, the open4 library must be installed"
9
- raise
8
+ warn "For Ruby #{RUBY_VERSION}, the open4 library must be installed or SH won't work"
10
9
  end
11
10
  else
12
11
  require 'open3'
@@ -72,7 +71,11 @@ module Methadone
72
71
  # If not, its output as logged at INFO. In either case, its
73
72
  # error output is logged at WARN.
74
73
  #
75
- # command:: the command to run
74
+ # command:: the command to run as a String or Array of String. The String form is simplest, but
75
+ # is open to injection. If you need to execute a command that is assembled from some portion
76
+ # of user input, consider using an Array of String. This form prevents tokenization that occurs
77
+ # in the String form. The first element is the command to execute,
78
+ # and the remainder are the arguments. See Methadone::ExecutionStrategy::Base for more info.
76
79
  # options:: options to control the call. Currently responds to:
77
80
  # +:expected+:: an Int or Array of Int representing error codes, <b>in addition to 0</b>, that are
78
81
  # expected and therefore constitute success. Useful for commands that don't use
@@ -1,3 +1,3 @@
1
- module Methadone
2
- VERSION = "1.1.0"
1
+ module Methadone #:nodoc:
2
+ VERSION = "1.2.0" #:nodoc:
3
3
  end
@@ -29,6 +29,29 @@ module ExecutionStrategy
29
29
  }
30
30
  end
31
31
 
32
+ test_that "run_command handles array arguments properly" do
33
+ Given {
34
+ @command = [any_string, any_string, any_string]
35
+ @stdout = any_string
36
+ @stderr = any_string
37
+ @status = stub('Process::Status')
38
+ }
39
+ When the_test_runs
40
+ Then {
41
+ Open3.expects(:capture3).with(*@command).returns([@stdout,@stderr,@status])
42
+ }
43
+
44
+ Given new_open_3_strategy
45
+ When {
46
+ @results = @strategy.run_command(@command)
47
+ }
48
+ Then {
49
+ @results[0].should == @stdout
50
+ @results[1].should == @stderr
51
+ @results[2].should be @status
52
+ }
53
+ end
54
+
32
55
  test_that "exception_meaning_command_not_found returns Errno::ENOENT" do
33
56
  Given new_open_3_strategy
34
57
  When {
@@ -39,6 +39,35 @@ module ExecutionStrategy
39
39
  }
40
40
  end
41
41
 
42
+ test_that "run_command handles array arguments properly" do
43
+ Given {
44
+ @command = [any_string, any_string, any_string]
45
+ @stdin_io = mock("IO")
46
+ @stdout = any_string
47
+ @stdout_io = StringIO.new(@stdout)
48
+ @stderr = any_string
49
+ @stderr_io = StringIO.new(@stderr)
50
+ @pid = any_int :min => 2, :max => 65536
51
+ @status = stub('Process::Status')
52
+ }
53
+ When the_test_runs
54
+ Then {
55
+ Open4.expects(:popen4).with(*@command).returns([@pid,@stdin_io,@stdout_io,@stderr_io])
56
+ @stdin_io.expects(:close)
57
+ Process.expects(:waitpid2).with(@pid).returns([any_string,@status])
58
+ }
59
+
60
+ Given new_open_4_strategy
61
+ When {
62
+ @results = @strategy.run_command(@command)
63
+ }
64
+ Then {
65
+ @results[0].should == @stdout
66
+ @results[1].should == @stderr
67
+ @results[2].should be @status
68
+ }
69
+ end
70
+
42
71
  test_that "exception_meaning_command_not_found returns Errno::ENOENT" do
43
72
  Given new_open_4_strategy
44
73
  When {
data/test/test_main.rb CHANGED
@@ -289,6 +289,25 @@ class TestMain < BaseTest
289
289
  }
290
290
  end
291
291
 
292
+ test_that "passing non-strings wont' break automagic stuff" do
293
+ Given {
294
+ @foo = nil
295
+ @bar = nil
296
+ main do
297
+ @foo = options[:foo]
298
+ @bar = options[:bar]
299
+ end
300
+ on("--foo ARG",OptionParser::DecimalInteger)
301
+ on("--bar ARG",/^\d/)
302
+ set_argv %w(--foo 88 --bar 4)
303
+ }
304
+ When run_go_safely
305
+ Then {
306
+ assert_equal 88,@foo,@logged.string + $stdout.string
307
+ assert_equal '4',@bar,@logged.string + $stdout.string
308
+ }
309
+ end
310
+
292
311
  test_that "omitting the block to opts simply sets the value in the options hash and returns itself" do
293
312
  Given {
294
313
  @switch = nil
@@ -576,7 +595,40 @@ class TestMain < BaseTest
576
595
  }
577
596
  end
578
597
 
579
- test_that "we can get defaults from a config file if it's specified" do
598
+ test_that "environment args correctly handle spaces" do
599
+ Given app_to_use_environment
600
+ And {
601
+ @flag_value = any_string + ' ' + any_string
602
+ ENV['APP_OPTS'] = "--switch --flag='#{@flag_value}'"
603
+ }
604
+ When {
605
+ @code = lambda { go! }
606
+ }
607
+ Then {
608
+ assert_exits(0,'',&@code)
609
+ @switch.should == true
610
+ @flag.should == @flag_value
611
+ }
612
+ end
613
+
614
+ test_that "environment args correctly handle spaces via backslash stuff" do
615
+ Given app_to_use_environment
616
+ And {
617
+ cli_flag_value = any_string(:max => 4) + "\\ " + any_string(:max => 4)
618
+ @flag_value = cli_flag_value.gsub("\\ "," ")
619
+ ENV['APP_OPTS'] = "--switch --flag=#{cli_flag_value}"
620
+ }
621
+ When {
622
+ @code = lambda { go! }
623
+ }
624
+ Then {
625
+ assert_exits(0,'',&@code)
626
+ @switch.should == true
627
+ @flag.should == @flag_value
628
+ }
629
+ end
630
+
631
+ test_that "we can get defaults from a YAML config file if it's specified" do
580
632
  Given app_to_use_rc_file
581
633
  And {
582
634
  @flag_value = any_string
@@ -616,7 +668,7 @@ class TestMain < BaseTest
616
668
  }
617
669
  end
618
670
 
619
- test_that "we can use a different format for the rc file" do
671
+ test_that "we can use a simpler, text format for the rc file" do
620
672
  Given app_to_use_rc_file
621
673
  And {
622
674
  @flag_value = any_string
@@ -636,6 +688,25 @@ class TestMain < BaseTest
636
688
 
637
689
  end
638
690
 
691
+ test_that "the text format for the rc file attempts to respect quoted arguments" do
692
+ Given app_to_use_rc_file
693
+ And {
694
+ @flag_value = any_string(:max => 10) + " " + any_string(:max => 10)
695
+ rc_file = File.join(ENV['HOME'],'.my_app.rc')
696
+ File.open(rc_file,'w') do |file|
697
+ file.puts "--switch --flag='#{@flag_value}'"
698
+ end
699
+ }
700
+ When {
701
+ @code = lambda { go! }
702
+ }
703
+ Then {
704
+ assert_exits(0,&@code)
705
+ @switch.should == true
706
+ @flag.should == @flag_value
707
+ }
708
+ end
709
+
639
710
  test_that "with an ill-formed rc file, we get a reasonable error message" do
640
711
  Given app_to_use_rc_file
641
712
  And {
@@ -720,7 +791,7 @@ private
720
791
  block.call
721
792
  fail "Expected an exit of #{exit_code}, but we didn't even exit!"
722
793
  rescue SystemExit => ex
723
- ex.status.should == exit_code
794
+ assert_equal exit_code,ex.status,@logged.string
724
795
  end
725
796
 
726
797
  def set_argv(args)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: methadone
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 31
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
- - 1
8
+ - 2
9
9
  - 0
10
- version: 1.1.0
10
+ version: 1.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - davetron5000
@@ -15,13 +15,10 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-04-21 00:00:00 -04:00
19
- default_executable:
18
+ date: 2012-05-22 00:00:00 Z
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
- name: bundler
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
21
+ version_requirements: &id001 !ruby/object:Gem::Requirement
25
22
  none: false
26
23
  requirements:
27
24
  - - ">="
@@ -30,12 +27,12 @@ dependencies:
30
27
  segments:
31
28
  - 0
32
29
  version: "0"
30
+ prerelease: false
33
31
  type: :runtime
34
- version_requirements: *id001
32
+ name: bundler
33
+ requirement: *id001
35
34
  - !ruby/object:Gem::Dependency
36
- name: rspec-expectations
37
- prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
35
+ version_requirements: &id002 !ruby/object:Gem::Requirement
39
36
  none: false
40
37
  requirements:
41
38
  - - ~>
@@ -45,12 +42,12 @@ dependencies:
45
42
  - 2
46
43
  - 6
47
44
  version: "2.6"
45
+ prerelease: false
48
46
  type: :development
49
- version_requirements: *id002
47
+ name: rspec-expectations
48
+ requirement: *id002
50
49
  - !ruby/object:Gem::Dependency
51
- name: rake
52
- prerelease: false
53
- requirement: &id003 !ruby/object:Gem::Requirement
50
+ version_requirements: &id003 !ruby/object:Gem::Requirement
54
51
  none: false
55
52
  requirements:
56
53
  - - ">="
@@ -59,12 +56,12 @@ dependencies:
59
56
  segments:
60
57
  - 0
61
58
  version: "0"
59
+ prerelease: false
62
60
  type: :development
63
- version_requirements: *id003
61
+ name: rake
62
+ requirement: *id003
64
63
  - !ruby/object:Gem::Dependency
65
- name: rdoc
66
- prerelease: false
67
- requirement: &id004 !ruby/object:Gem::Requirement
64
+ version_requirements: &id004 !ruby/object:Gem::Requirement
68
65
  none: false
69
66
  requirements:
70
67
  - - ~>
@@ -74,12 +71,12 @@ dependencies:
74
71
  - 3
75
72
  - 9
76
73
  version: "3.9"
74
+ prerelease: false
77
75
  type: :development
78
- version_requirements: *id004
76
+ name: rdoc
77
+ requirement: *id004
79
78
  - !ruby/object:Gem::Dependency
80
- name: cucumber
81
- prerelease: false
82
- requirement: &id005 !ruby/object:Gem::Requirement
79
+ version_requirements: &id005 !ruby/object:Gem::Requirement
83
80
  none: false
84
81
  requirements:
85
82
  - - ~>
@@ -90,12 +87,12 @@ dependencies:
90
87
  - 1
91
88
  - 1
92
89
  version: 1.1.1
90
+ prerelease: false
93
91
  type: :development
94
- version_requirements: *id005
92
+ name: cucumber
93
+ requirement: *id005
95
94
  - !ruby/object:Gem::Dependency
96
- name: aruba
97
- prerelease: false
98
- requirement: &id006 !ruby/object:Gem::Requirement
95
+ version_requirements: &id006 !ruby/object:Gem::Requirement
99
96
  none: false
100
97
  requirements:
101
98
  - - ">="
@@ -104,12 +101,12 @@ dependencies:
104
101
  segments:
105
102
  - 0
106
103
  version: "0"
104
+ prerelease: false
107
105
  type: :development
108
- version_requirements: *id006
106
+ name: aruba
107
+ requirement: *id006
109
108
  - !ruby/object:Gem::Dependency
110
- name: simplecov
111
- prerelease: false
112
- requirement: &id007 !ruby/object:Gem::Requirement
109
+ version_requirements: &id007 !ruby/object:Gem::Requirement
113
110
  none: false
114
111
  requirements:
115
112
  - - ~>
@@ -119,12 +116,12 @@ dependencies:
119
116
  - 0
120
117
  - 5
121
118
  version: "0.5"
119
+ prerelease: false
122
120
  type: :development
123
- version_requirements: *id007
121
+ name: simplecov
122
+ requirement: *id007
124
123
  - !ruby/object:Gem::Dependency
125
- name: clean_test
126
- prerelease: false
127
- requirement: &id008 !ruby/object:Gem::Requirement
124
+ version_requirements: &id008 !ruby/object:Gem::Requirement
128
125
  none: false
129
126
  requirements:
130
127
  - - ~>
@@ -134,12 +131,12 @@ dependencies:
134
131
  - 0
135
132
  - 10
136
133
  version: "0.10"
134
+ prerelease: false
137
135
  type: :development
138
- version_requirements: *id008
136
+ name: clean_test
137
+ requirement: *id008
139
138
  - !ruby/object:Gem::Dependency
140
- name: mocha
141
- prerelease: false
142
- requirement: &id009 !ruby/object:Gem::Requirement
139
+ version_requirements: &id009 !ruby/object:Gem::Requirement
143
140
  none: false
144
141
  requirements:
145
142
  - - ">="
@@ -148,8 +145,10 @@ dependencies:
148
145
  segments:
149
146
  - 0
150
147
  version: "0"
148
+ prerelease: false
151
149
  type: :development
152
- version_requirements: *id009
150
+ name: mocha
151
+ requirement: *id009
153
152
  description: Methadone provides a lot of small but useful features for developing a command-line app, including an opinionated bootstrapping process, some helpful cucumber steps, and some classes to bridge logging and output into a simple, unified, interface
154
153
  email:
155
154
  - davetron5000 at gmail.com
@@ -180,6 +179,7 @@ files:
180
179
  - features/support/env.rb
181
180
  - features/version.feature
182
181
  - lib/methadone.rb
182
+ - lib/methadone/argv_parser.rb
183
183
  - lib/methadone/cli.rb
184
184
  - lib/methadone/cli_logger.rb
185
185
  - lib/methadone/cli_logging.rb
@@ -222,7 +222,6 @@ files:
222
222
  - test/test_exit_now.rb
223
223
  - test/test_main.rb
224
224
  - test/test_sh.rb
225
- has_rdoc: true
226
225
  homepage: http://github.com/davetron5000/methadone
227
226
  licenses: []
228
227
 
@@ -256,7 +255,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
256
255
  requirements: []
257
256
 
258
257
  rubyforge_project: methadone
259
- rubygems_version: 1.5.2
258
+ rubygems_version: 1.8.24
260
259
  signing_key:
261
260
  specification_version: 3
262
261
  summary: Kick the bash habit and start your command-line apps off right