methadone 1.1.0 → 1.2.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.
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