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 +1 -0
- data/CHANGES.md +8 -0
- data/Rakefile +7 -0
- data/bin/methadone +1 -1
- data/lib/methadone.rb +1 -0
- data/lib/methadone/argv_parser.rb +50 -0
- data/lib/methadone/execution_strategy/base.rb +7 -4
- data/lib/methadone/execution_strategy/jvm.rb +6 -1
- data/lib/methadone/execution_strategy/open_3.rb +4 -1
- data/lib/methadone/execution_strategy/open_4.rb +5 -1
- data/lib/methadone/main.rb +14 -5
- data/lib/methadone/sh.rb +6 -3
- data/lib/methadone/version.rb +2 -2
- data/test/execution_strategy/test_open_3.rb +23 -0
- data/test/execution_strategy/test_open_4.rb +29 -0
- data/test/test_main.rb +74 -3
- metadata +42 -43
data/.travis.yml
CHANGED
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', '
|
63
|
+
" #{gem_variable}.add_dependency('methadone', '~>#{Methadone::VERSION}')",
|
64
64
|
], :before => /^end\s*$/
|
65
65
|
end
|
66
66
|
|
data/lib/methadone.rb
CHANGED
@@ -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
|
-
#
|
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 =
|
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 =
|
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 =
|
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
|
data/lib/methadone/main.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
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
|
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
|
-
|
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
|
data/lib/methadone/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module Methadone
|
2
|
-
VERSION = "1.
|
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 "
|
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
|
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.
|
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:
|
4
|
+
hash: 31
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 1.
|
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-
|
19
|
-
default_executable:
|
18
|
+
date: 2012-05-22 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
|
-
|
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
|
-
|
32
|
+
name: bundler
|
33
|
+
requirement: *id001
|
35
34
|
- !ruby/object:Gem::Dependency
|
36
|
-
|
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
|
-
|
47
|
+
name: rspec-expectations
|
48
|
+
requirement: *id002
|
50
49
|
- !ruby/object:Gem::Dependency
|
51
|
-
|
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
|
-
|
61
|
+
name: rake
|
62
|
+
requirement: *id003
|
64
63
|
- !ruby/object:Gem::Dependency
|
65
|
-
|
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
|
-
|
76
|
+
name: rdoc
|
77
|
+
requirement: *id004
|
79
78
|
- !ruby/object:Gem::Dependency
|
80
|
-
|
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
|
-
|
92
|
+
name: cucumber
|
93
|
+
requirement: *id005
|
95
94
|
- !ruby/object:Gem::Dependency
|
96
|
-
|
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
|
-
|
106
|
+
name: aruba
|
107
|
+
requirement: *id006
|
109
108
|
- !ruby/object:Gem::Dependency
|
110
|
-
|
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
|
-
|
121
|
+
name: simplecov
|
122
|
+
requirement: *id007
|
124
123
|
- !ruby/object:Gem::Dependency
|
125
|
-
|
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
|
-
|
136
|
+
name: clean_test
|
137
|
+
requirement: *id008
|
139
138
|
- !ruby/object:Gem::Dependency
|
140
|
-
|
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
|
-
|
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.
|
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
|