kerplutz 0.1.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.
@@ -0,0 +1 @@
1
+ tmp/*
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm --create use 1.9.2@kerplutz
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "https://rubygems.org"
2
+ gemspec
@@ -0,0 +1,46 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ kerplutz (0.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ aruba (0.3.6)
10
+ childprocess (>= 0.1.7)
11
+ cucumber (>= 0.10.0)
12
+ rspec (>= 2.5.0)
13
+ builder (3.0.0)
14
+ childprocess (0.1.8)
15
+ ffi (~> 1.0.6)
16
+ cucumber (0.10.2)
17
+ builder (>= 2.1.2)
18
+ diff-lcs (>= 1.1.2)
19
+ gherkin (>= 2.3.5)
20
+ json (>= 1.4.6)
21
+ term-ansicolor (>= 1.0.5)
22
+ diff-lcs (1.1.2)
23
+ ffi (1.0.7)
24
+ rake (>= 0.8.7)
25
+ gherkin (2.3.7)
26
+ json (>= 1.4.6)
27
+ json (1.5.1)
28
+ rake (0.8.7)
29
+ rspec (2.5.0)
30
+ rspec-core (~> 2.5.0)
31
+ rspec-expectations (~> 2.5.0)
32
+ rspec-mocks (~> 2.5.0)
33
+ rspec-core (2.5.2)
34
+ rspec-expectations (2.5.0)
35
+ diff-lcs (~> 1.1.2)
36
+ rspec-mocks (2.5.0)
37
+ term-ansicolor (1.0.5)
38
+
39
+ PLATFORMS
40
+ ruby
41
+
42
+ DEPENDENCIES
43
+ aruba
44
+ cucumber
45
+ kerplutz!
46
+ rspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Mike Sassak
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,25 @@
1
+ # Kerplutz
2
+
3
+ Command-line option parsing that won't leave you feeling kerplutz.
4
+
5
+ ## OMG WHY DO WE NEED ANOTHER ONE OF THESE THINGS?
6
+
7
+ Geez I love you too, sunshine. I hesitated for a long while before
8
+ committing myself to writing Kerplutz. Eventually what pushed me into
9
+ action was the observation (hopefully correct) that OptionParser is
10
+ generally a pretty slick library, even if its interface is a bit wonky.
11
+ It seemed like a shame to let it go to waste, when getting from it what
12
+ I needed requires only a small amount of code.
13
+
14
+ ## Todo
15
+
16
+ * Read defaults from a config file
17
+ * Argument type-casts
18
+ * List arguments
19
+ * Cleanup OptionParser's puking when an option isn't recognized
20
+ * Be more shy with the parsed arguments collection via callbacks
21
+ * Multiline descriptions?
22
+
23
+ ## Copyright
24
+
25
+ Copyright (c) 2011 Mike Sassak. See LICENSE for details.
@@ -0,0 +1,10 @@
1
+ desc "Run Cukes and Specs"
2
+ task :default => ["spec", "cukes"]
3
+
4
+ task :cukes do
5
+ sh "cucumber"
6
+ end
7
+
8
+ task :spec do
9
+ sh "rspec spec"
10
+ end
@@ -0,0 +1 @@
1
+ default: --tags ~@todo
@@ -0,0 +1,110 @@
1
+ Feature: Kerplutz
2
+
3
+ Command-line option parser for executables with sub-commands
4
+ (like git or svn) that will not make developers feel kerplutz.
5
+
6
+ Background: Option parsing configuration
7
+ Given an executable named "my-bin" with:
8
+ """
9
+ require 'kerplutz'
10
+
11
+ kerplutz = Kerplutz.build "my-bin" do |base|
12
+ base.banner = "Usage: #{base.name} [OPTIONS] COMMAND [ARGS]"
13
+
14
+ base.switch :blinkenlights, "Enable or disable the blinkenlights", abbrev: :b
15
+ base.flag :frobnicate, "Frobnicate the furtwangler", optional: :target
16
+
17
+ base.action :my_action, "Execute my action" do
18
+ puts "This is my action!"
19
+ end
20
+
21
+ base.action :version, "Show the version", abbrev: :V do
22
+ puts "#{base.name} version 1.2.3"
23
+ end
24
+
25
+ base.command :start, "Start the reactor!" do |command|
26
+ command.banner = "Usage: #{base.name} #{command.name} [ARGS]"
27
+
28
+ command.switch :lightbulb, "Turn the lightbulb on or off"
29
+ command.flag :dry_run, "Look, but don't touch", abbrev: :d
30
+ end
31
+
32
+ base.command :open, "Open your mind, Quaid" do |command|
33
+ command.flag :kuato, "High-level summon", abbrev: :k, required: :host
34
+ command.switch :backtrace, "Print the full backtrace", abbrev: :b
35
+ end
36
+ end
37
+
38
+ kerplutz.parse(ARGV.dup)
39
+ """
40
+
41
+ Scenario: help
42
+ When I run `./my-bin help`
43
+ Then the output should contain exactly:
44
+ """
45
+ Usage: my-bin [OPTIONS] COMMAND [ARGS]
46
+
47
+ -b, --[no-]blinkenlights Enable or disable the blinkenlights
48
+ --frobnicate [TARGET] Frobnicate the furtwangler
49
+ --my-action Execute my action
50
+ -V, --version Show the version
51
+
52
+ Commands:
53
+ start Start the reactor!
54
+ open Open your mind, Quaid
55
+
56
+ Type 'my-bin help COMMAND' for help with a specific command.
57
+
58
+ """
59
+
60
+ Scenario: no arguments
61
+ When I run `./my-bin`
62
+ Then the output should contain:
63
+ """
64
+ Type 'my-bin help COMMAND' for help with a specific command.
65
+
66
+ """
67
+
68
+ Scenario: Known flag to executable
69
+ When I run `./my-bin --version`
70
+ Then the output should contain exactly:
71
+ """
72
+ my-bin version 1.2.3
73
+
74
+ """
75
+
76
+ Scenario: Only first action is executed
77
+ When I run `./my-bin --my-action --version`
78
+ Then the output should contain exactly:
79
+ """
80
+ This is my action!
81
+
82
+ """
83
+
84
+ Scenario: Get help about a command
85
+ When I run `./my-bin help start`
86
+ Then the output should contain exactly:
87
+ """
88
+ Usage: my-bin start [ARGS]
89
+
90
+ --[no-]lightbulb Turn the lightbulb on or off
91
+ -d, --dry-run Look, but don't touch
92
+
93
+ """
94
+
95
+ Scenario: Get help about a command with a default banner
96
+ When I run `./my-bin help open`
97
+ Then the output should contain exactly:
98
+ """
99
+ Usage: my-bin open [OPTIONS]
100
+
101
+ -k, --kuato HOST High-level summon
102
+ -b, --[no-]backtrace Print the full backtrace
103
+
104
+ """
105
+
106
+ @todo
107
+ Scenario: Invoke a flag with required argument without an argument
108
+
109
+ @todo
110
+ Scenario: Invoke an unknown option
@@ -0,0 +1,11 @@
1
+ Given /^an executable named "(.+)" with:$/ do |name, body|
2
+ contents = <<EOF
3
+ #!/usr/bin/env ruby
4
+ $:.unshift(File.expand_path(File.dirname(__FILE__) + '/../../lib'))
5
+
6
+ #{body}
7
+ EOF
8
+
9
+ write_file(name, contents)
10
+ File.open("tmp/aruba/#{name}") { |file| file.chmod(0755) }
11
+ end
@@ -0,0 +1,4 @@
1
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../../lib/')
2
+
3
+ require 'kerplutz'
4
+ require 'aruba/cucumber'
@@ -0,0 +1,20 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'kerplutz'
3
+ s.version = '0.1.0'
4
+ s.authors = ["Mike Sassak"]
5
+ s.description = "Command-line option parser with subcommands that won't leave you feeling Kerplutz"
6
+ s.summary = "kerplutz #{s.version}"
7
+ s.email = "msassak@gmail.com"
8
+ s.homepage = "https://github.com/msassak/kerplutz"
9
+
10
+ s.add_development_dependency 'cucumber'
11
+ s.add_development_dependency 'aruba'
12
+ s.add_development_dependency 'rspec'
13
+
14
+ s.rubygems_version = "1.3.7"
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {spec,features}/*`.split("\n")
17
+ s.extra_rdoc_files = ["LICENSE", "README.md"]
18
+ s.rdoc_options = ["--charset=UTF-8"]
19
+ s.require_path = "lib"
20
+ end
@@ -0,0 +1,12 @@
1
+ require 'kerplutz/executable'
2
+ require 'kerplutz/builder'
3
+
4
+ module Kerplutz
5
+ class << self
6
+ def build(name)
7
+ executable = Executable.new(name)
8
+ yield builder = Builder.new(executable)
9
+ builder.result
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,42 @@
1
+ require 'kerplutz/executable'
2
+ require 'kerplutz/options'
3
+
4
+ module Kerplutz
5
+ class Builder
6
+ attr_reader :base
7
+
8
+ def initialize(base)
9
+ @base = base
10
+ end
11
+
12
+ def name
13
+ base.name
14
+ end
15
+
16
+ def banner=(banner)
17
+ base.banner = banner
18
+ end
19
+
20
+ def flag(name, desc, opts={})
21
+ base.add_option(Flag.build(name, desc, opts))
22
+ end
23
+
24
+ def switch(name, desc, opts={})
25
+ base.add_option(Switch.build(name, desc, opts))
26
+ end
27
+
28
+ def action(name, desc, opts={}, &action)
29
+ base.add_option(Action.build(name, desc, opts, &action))
30
+ end
31
+
32
+ def command(name, desc)
33
+ command = Command.new(name, desc, base.arguments)
34
+ yield builder = Builder.new(command)
35
+ base.add_command(builder.result)
36
+ end
37
+
38
+ def result
39
+ base
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,56 @@
1
+ require 'optparse'
2
+ require 'forwardable'
3
+
4
+ module Kerplutz
5
+ class Command
6
+ attr_reader :name, :desc, :arguments, :parser
7
+
8
+ extend Forwardable; def_delegators :@parser, :banner, :help, :parse
9
+
10
+ def initialize(name, desc, arguments={})
11
+ @name = name
12
+ @desc = desc
13
+ @arguments = arguments
14
+ @parser = OptionParser.new(default_banner)
15
+ end
16
+
17
+ def display_name
18
+ @display_name ||= name.to_s.tr("_", "-")
19
+ end
20
+
21
+ def banner=(banner)
22
+ parser.banner = (banner.chomp << "\n\n")
23
+ end
24
+
25
+ def add_option(option, prefix_key=true)
26
+ if prefix_key
27
+ key = :"#{name}_#{option.name}"
28
+ else
29
+ key = option.name.to_sym
30
+ end
31
+
32
+ option.configure(parser) do |value|
33
+ arguments[key] = value
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ # TODO: Is this a better fit for Executable?
40
+ def default_banner
41
+ "Usage: #{command_name} [OPTIONS]\n\n"
42
+ end
43
+
44
+ def command_name
45
+ if program_name == display_name
46
+ program_name
47
+ else
48
+ "#{program_name} #{display_name}"
49
+ end
50
+ end
51
+
52
+ def program_name
53
+ @program_name ||= File.basename($PROGRAM_NAME)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,31 @@
1
+ module Kerplutz
2
+ class CommandMap
3
+ attr_reader :commands
4
+
5
+ def initialize
6
+ @commands = {}
7
+ end
8
+
9
+ def add(command)
10
+ commands[command.display_name] = command
11
+ end
12
+
13
+ def <<(command)
14
+ add(command) and return self
15
+ end
16
+
17
+ def [](display_name)
18
+ commands[display_name]
19
+ end
20
+
21
+ def ===(display_name)
22
+ commands.has_key?(display_name)
23
+ end
24
+
25
+ def summary(indent=2)
26
+ commands.inject("") do |acc, (display_name, command)|
27
+ acc << " " * indent << "#{display_name} #{command.desc}\n"
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,65 @@
1
+ require 'forwardable'
2
+
3
+ require 'kerplutz/command'
4
+ require 'kerplutz/command_map'
5
+
6
+ module Kerplutz
7
+ class Executable
8
+ attr_reader :top, :commands, :arguments
9
+
10
+ extend Forwardable; def_delegators :@top, :name, :banner, :banner=
11
+
12
+ def initialize(name, arguments={})
13
+ @arguments = arguments
14
+ @top = Command.new(name, '', @arguments)
15
+ @commands = CommandMap.new
16
+ end
17
+
18
+ def add_command(command)
19
+ commands << command
20
+ end
21
+
22
+ def add_option(option)
23
+ top.add_option(option, false)
24
+ end
25
+
26
+ def parse(args)
27
+ first, *rest = args
28
+ remainder = []
29
+
30
+ case first
31
+
32
+ when help
33
+ puts (rest.empty? ? banner : commands[rest.first].help)
34
+
35
+ when option
36
+ remainder = top.parse(args)
37
+
38
+ when commands
39
+ remainder = commands[first].parse(rest)
40
+
41
+ else
42
+ puts banner
43
+ end
44
+
45
+ [arguments, remainder]
46
+ end
47
+
48
+ def banner
49
+ help = ""
50
+ help << top.help << "\n"
51
+ help << " Commands:\n" << commands.summary << "\n"
52
+ help << "Type '#{name} help COMMAND' for help with a specific command.\n"
53
+ end
54
+
55
+ private
56
+
57
+ def help
58
+ /^(--help|help)$/
59
+ end
60
+
61
+ def option
62
+ /^(--|-)[\w-]+$/
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,111 @@
1
+ module Kerplutz
2
+ class Option
3
+ attr_reader :name, :desc
4
+ attr_accessor :abbrev
5
+
6
+ def self.build(name, desc, opts)
7
+ option = self.new(name, desc)
8
+ option.abbrev = opts[:abbrev]
9
+ option
10
+ end
11
+
12
+ def initialize(name, desc)
13
+ @name = name
14
+ @desc = desc
15
+ end
16
+
17
+ def display_name
18
+ name.to_s.tr("_", "-")
19
+ end
20
+
21
+ def option_sig
22
+ "--#{display_name}"
23
+ end
24
+
25
+ def abbrev_sig
26
+ return "-#{abbrev[0]}" if abbrev
27
+ end
28
+
29
+ def parser_args
30
+ [abbrev_sig, option_sig, desc].compact
31
+ end
32
+
33
+ def configure(parser, &blk)
34
+ raise "You'll need to implement this one yourself, bub."
35
+ end
36
+ end
37
+
38
+ class Flag < Option
39
+ attr_accessor :arg_name, :arg_required
40
+
41
+ def self.build(name, desc, opts)
42
+ flag = super(name, desc, opts)
43
+ flag.arg_name = opts[:required] || opts[:optional]
44
+ flag.arg_required = opts.has_key?(:required)
45
+ flag
46
+ end
47
+
48
+ def initialize(name, desc, arg_name=nil)
49
+ super(name, desc)
50
+ @arg_name = arg_name
51
+ end
52
+
53
+ def configure(parser, &blk)
54
+ parser.on(*parser_args) do |arg|
55
+ if NilClass === arg
56
+ blk.call(true)
57
+ else
58
+ blk.call(arg)
59
+ end
60
+ end
61
+ end
62
+
63
+ def option_sig
64
+ "#{super}#{formatted_arg_name}"
65
+ end
66
+
67
+ private
68
+
69
+ def formatted_arg_name
70
+ if arg_name and arg_required
71
+ " #{arg_name.to_s.upcase}"
72
+ elsif arg_name
73
+ " [#{arg_name.to_s.upcase}]"
74
+ end
75
+ end
76
+ end
77
+
78
+ class Switch < Option
79
+ def option_sig
80
+ "--[no-]#{display_name}"
81
+ end
82
+
83
+ def configure(parser, &blk)
84
+ parser.on(*parser_args) do |arg|
85
+ blk.call(arg)
86
+ end
87
+ end
88
+ end
89
+
90
+ class Action < Option
91
+ attr_accessor :action, :continue_after_exec
92
+
93
+ def self.build(name, desc, opts, &action)
94
+ new_action = super(name, desc, opts)
95
+ new_action.action = action
96
+ new_action
97
+ end
98
+
99
+ def initialize(name, desc, &action)
100
+ super(name, desc)
101
+ @action = action
102
+ end
103
+
104
+ def configure(parser, &blk)
105
+ parser.on(*parser_args) do
106
+ action.call
107
+ exit unless continue_after_exec
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ module Kerplutz
4
+ describe Command do
5
+ let(:option) { Flag.new(:name, "Description") }
6
+ let(:args) { Hash.new }
7
+ subject { Command.new("commandy", "", args) }
8
+
9
+ context "#add_option" do
10
+ it "passes the parser into the option for configuration" do
11
+ option.should_receive(:configure).with(subject.parser)
12
+ subject.add_option(option)
13
+ end
14
+ end
15
+
16
+ context "#parse" do
17
+ it "adds the parsed argument into the arguments hash" do
18
+ subject.add_option(option)
19
+ subject.parse("--name")
20
+ args.should have_key(:commandy_name)
21
+ args[:commandy_name].should eq(true)
22
+ end
23
+ end
24
+ end
25
+ end
26
+
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ module Kerplutz
4
+ describe Executable do
5
+ subject { Executable.new("test") }
6
+
7
+ describe "#parse" do
8
+ it "extracts the options from the arguments" do
9
+ subject.add_option(Switch.new(:foo, ''))
10
+ subject.parse(["--foo"]).should == [{ :foo => true }, []]
11
+ end
12
+ end
13
+
14
+ describe "#banner" do
15
+ it "has a sensible default" do
16
+ subject.banner.should =~ /^Usage: rspec test \[OPTIONS\]$/
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,118 @@
1
+ require 'spec_helper'
2
+
3
+ module Kerplutz
4
+ describe Option do
5
+ let(:parser) { OptionParser.new }
6
+ subject { Option.new(:foo, "Do foo") }
7
+
8
+ it "generates the parser arguments" do
9
+ subject.parser_args.should == ["--foo", "Do foo"]
10
+ end
11
+
12
+ context "with an abbreviation" do
13
+ it "generates the parser arguments" do
14
+ subject.abbrev = :f
15
+ subject.parser_args.should == ["-f", "--foo", "Do foo"]
16
+ subject.abbrev = :option_parser_does_weird_things_if_more_than_one_character
17
+ subject.parser_args.should == ["-o", "--foo", "Do foo"]
18
+ end
19
+ end
20
+ end
21
+
22
+ describe Flag do
23
+ let(:parser) { OptionParser.new }
24
+ let(:args) { Hash.new }
25
+
26
+ context "with no arguments" do
27
+ subject { Flag.new(:kuato, 'Summon Kuato') }
28
+
29
+ its(:option_sig) { should == "--kuato" }
30
+
31
+ it "configures the parser" do
32
+ subject.configure(parser) do |value|
33
+ value.should === true
34
+ end
35
+ parser.parse("--kuato")
36
+ end
37
+ end
38
+
39
+ context "with an optional argument" do
40
+ subject { Flag.new(:kuato, 'Summon Kuato', :host) }
41
+
42
+ its(:option_sig) { should == "--kuato [HOST]" }
43
+
44
+ it "configures the parser" do
45
+ subject.configure(parser) do |value|
46
+ value.should == "George"
47
+ end
48
+ parser.parse("--kuato", "George")
49
+
50
+ subject.configure(parser) do |value|
51
+ value.should === true
52
+ end
53
+ parser.parse("--kuato")
54
+ end
55
+ end
56
+
57
+ context "with a required argument" do
58
+ subject do
59
+ flag = Flag.new(:kuato, 'Summon Kuato', :host)
60
+ flag.arg_required = true
61
+ flag
62
+ end
63
+
64
+ its(:option_sig) { should == "--kuato HOST" }
65
+
66
+ it "configures the parser" do
67
+ subject.configure(parser) { |value| } # no-op
68
+ expect { parser.parse("--kuato") }.to raise_error(OptionParser::MissingArgument)
69
+
70
+ subject.configure(parser) do |value|
71
+ value.should == "George"
72
+ end
73
+ parser.parse("--kuato", "George")
74
+ end
75
+ end
76
+ end
77
+
78
+ describe Switch do
79
+ let(:parser) { OptionParser.new }
80
+ let(:args) { Hash.new }
81
+
82
+ subject { Switch.new(:verbose, "Be chatty") }
83
+
84
+ its(:option_sig) { should == "--[no-]verbose" }
85
+
86
+ it "configures the parser" do
87
+ subject.configure(parser) do |value|
88
+ value.should === true
89
+ end
90
+ parser.parse("--verbose")
91
+
92
+ subject.configure(parser) do |value|
93
+ value.should be_false
94
+ end
95
+ parser.parse("--no-verbose")
96
+ end
97
+ end
98
+
99
+ describe Action do
100
+ let(:parser) { OptionParser.new }
101
+ let(:args) { Hash.new }
102
+
103
+ subject do
104
+ action = Action.new(:start_reactor, "Start the reactor!") do
105
+ $action = "Hello there"
106
+ end
107
+ action.continue_after_exec = true
108
+ action
109
+ end
110
+
111
+ it "configures the parser" do
112
+ subject.configure(parser)
113
+ $action.should eq(nil)
114
+ parser.parse("--start-reactor")
115
+ $action.should eq("Hello there")
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,5 @@
1
+ require 'bundler'
2
+ Bundler.setup
3
+
4
+ require 'rspec'
5
+ require 'kerplutz'
metadata ADDED
@@ -0,0 +1,131 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kerplutz
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Mike Sassak
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-05-19 00:00:00 -05:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: cucumber
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ version: "0"
31
+ type: :development
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: aruba
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ version: "0"
44
+ type: :development
45
+ version_requirements: *id002
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ segments:
55
+ - 0
56
+ version: "0"
57
+ type: :development
58
+ version_requirements: *id003
59
+ description: Command-line option parser with subcommands that won't leave you feeling Kerplutz
60
+ email: msassak@gmail.com
61
+ executables: []
62
+
63
+ extensions: []
64
+
65
+ extra_rdoc_files:
66
+ - LICENSE
67
+ - README.md
68
+ files:
69
+ - .gitignore
70
+ - .rspec
71
+ - .rvmrc
72
+ - Gemfile
73
+ - Gemfile.lock
74
+ - LICENSE
75
+ - README.md
76
+ - Rakefile
77
+ - cucumber.yml
78
+ - features/kerplutz.feature
79
+ - features/step_definitions/kerplutz_steps.rb
80
+ - features/support/env.rb
81
+ - kerplutz.gemspec
82
+ - lib/kerplutz.rb
83
+ - lib/kerplutz/builder.rb
84
+ - lib/kerplutz/command.rb
85
+ - lib/kerplutz/command_map.rb
86
+ - lib/kerplutz/executable.rb
87
+ - lib/kerplutz/options.rb
88
+ - spec/kerplutz/command_spec.rb
89
+ - spec/kerplutz/executable_spec.rb
90
+ - spec/kerplutz/options_spec.rb
91
+ - spec/spec_helper.rb
92
+ has_rdoc: true
93
+ homepage: https://github.com/msassak/kerplutz
94
+ licenses: []
95
+
96
+ post_install_message:
97
+ rdoc_options:
98
+ - --charset=UTF-8
99
+ require_paths:
100
+ - lib
101
+ required_ruby_version: !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ segments:
107
+ - 0
108
+ version: "0"
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ none: false
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ segments:
115
+ - 0
116
+ version: "0"
117
+ requirements: []
118
+
119
+ rubyforge_project:
120
+ rubygems_version: 1.3.7
121
+ signing_key:
122
+ specification_version: 3
123
+ summary: kerplutz 0.1.0
124
+ test_files:
125
+ - features/kerplutz.feature
126
+ - features/step_definitions/kerplutz_steps.rb
127
+ - features/support/env.rb
128
+ - spec/kerplutz/command_spec.rb
129
+ - spec/kerplutz/executable_spec.rb
130
+ - spec/kerplutz/options_spec.rb
131
+ - spec/spec_helper.rb