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 +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
|