gestopft 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ vendor/gems
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gemspec
@@ -9,25 +9,25 @@ Framework for CLI Application (like {App::CLI}[http://search.cpan.org/dist/App-C
9
9
 
10
10
  === Archive
11
11
 
12
- rake install
12
+ rake install
13
13
 
14
14
  === Gem
15
15
 
16
- gem install gestopft
16
+ gem install gestopft
17
17
 
18
18
 
19
19
  == Synopsis
20
20
 
21
- require "gestopft"
21
+ require "gestopft"
22
22
 
23
- class Echo < Gestopft::App
24
- option :verbose, "print debug messages."
23
+ class Echo < Gestopft::App
24
+ option :verbose, "print debug messages."
25
25
 
26
- def echo(message)
27
- puts "Echo#echo is invoked." if @options[:verbose]
28
- puts message
29
- end
30
- end
26
+ def echo(message)
27
+ puts "Echo#echo is invoked." if @options[:verbose]
28
+ puts message
29
+ end
30
+ end
31
31
 
32
32
 
33
33
  == Copyright
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -0,0 +1,18 @@
1
+ require File.expand_path('../lib/gestopft/version', __FILE__)
2
+
3
+ Gem::Specification.new do |g|
4
+ g.name = "gestopft"
5
+ g.version = Gestopft::VERSION
6
+ g.summary = "Framework for CLI Application"
7
+ g.executables = `git ls-files -- bin/*`.split("\n").map {|f| File.basename(f) }
8
+ g.files = `git ls-files`.split("\n")
9
+ g.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
10
+ g.authors = ["aereal"]
11
+ g.email = ["aereal@kerare.org"]
12
+ g.homepage = "https://github.com/aereal/gestopft"
13
+ g.require_path = ["lib"]
14
+ g.platform = Gem::Platform::RUBY
15
+
16
+ g.add_development_dependency 'rspec', ['~> 2.8.0']
17
+ g.add_development_dependency 'rake', ['~> 0.9.2']
18
+ end
@@ -1,16 +1,13 @@
1
- # -*- coding: utf-8 -*-
2
-
1
+ require "gestopft/version"
3
2
  require "gestopft/core_ext"
4
3
 
5
4
  module Gestopft
6
- VERSION = '0.0.1'
7
-
8
- module Constants
9
- class Error < ::StandardError; end
10
- class NotSatisfiedRequirements < Error; end
11
- end
5
+ module Constants
6
+ class Error < ::StandardError; end
7
+ class NotSatisfiedRequirements < Error; end
8
+ end
12
9
 
13
- autoload :App, 'gestopft/app'
14
- autoload :Option, 'gestopft/option'
10
+ autoload :App, 'gestopft/app'
11
+ autoload :Option, 'gestopft/option'
15
12
  end
16
13
 
@@ -1,102 +1,102 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  class Gestopft::App
4
- include Gestopft::Constants
4
+ include Gestopft::Constants
5
5
 
6
- def self.expectation
7
- @expectation ||= []
8
- end
6
+ def self.expectation
7
+ @expectation ||= []
8
+ end
9
9
 
10
- def self.option(name, *args)
11
- desc = args.find {|arg| arg.is_a? String }
12
- params = args.find {|arg| arg.is_a? Array }
13
- expectation << Gestopft::Option.new(name, {
14
- :desc => desc,
15
- :params => params
16
- })
17
- end
10
+ def self.option(name, *args)
11
+ desc = args.find {|arg| arg.is_a? String }
12
+ params = args.find {|arg| arg.is_a? Array }
13
+ expectation << Gestopft::Option.new(name, {
14
+ :desc => desc,
15
+ :params => params
16
+ })
17
+ end
18
18
 
19
- def self.run(argv=ARGV)
20
- (app = new(argv)).parse_arg.dispatch
21
- app
22
- end
19
+ def self.run(argv=ARGV)
20
+ (app = new(argv)).parse_arg.dispatch
21
+ app
22
+ end
23
23
 
24
- def self.commands
25
- public_instance_methods - Gestopft::App.public_instance_methods
26
- end
24
+ def self.commands
25
+ public_instance_methods - Gestopft::App.public_instance_methods
26
+ end
27
27
 
28
- attr_reader :options
28
+ attr_reader :options
29
29
 
30
- def initialize(argv)
31
- @argv = argv.option_args
32
- @expectation = self.class.expectation
33
- @options = {}
34
- @commands = self.class.commands.map {|cmd| method(cmd) }
35
- end
30
+ def initialize(argv)
31
+ @argv = argv.option_args
32
+ @expectation = self.class.expectation
33
+ @options = {}
34
+ @commands = self.class.commands.map {|cmd| method(cmd) }
35
+ end
36
36
 
37
- def parse_arg
38
- @expectation.each do |opt|
39
- if opt.require_args?
40
- if (
41
- pos = @argv.find_index(opt.option_name) and
42
- params = @argv[pos + 1, opt.arity] and
43
- params.none? {|param| param.option? } and
44
- params.size == opt.arity
45
- )
46
- @options[opt.name] = params
47
- else
48
- raise NotSatisfiedRequirements
49
- end
50
- else
51
- @options[opt.name] = opt.option_name
52
- end
53
- end
54
- self
55
- end
37
+ def parse_arg
38
+ @expectation.each do |opt|
39
+ if opt.require_args?
40
+ if (
41
+ pos = @argv.find_index(opt.option_name) and
42
+ params = @argv[pos + 1, opt.arity] and
43
+ params.none? {|param| param.option? } and
44
+ params.size == opt.arity
45
+ )
46
+ @options[opt.name] = params
47
+ else
48
+ raise NotSatisfiedRequirements
49
+ end
50
+ else
51
+ @options[opt.name] = opt.option_name
52
+ end
53
+ end
54
+ self
55
+ end
56
56
 
57
- def dispatch
58
- argv = @argv.reject {|arg| arg.option? }
59
- @commands.each do |cmd|
60
- if pos = argv.find_index(cmd.name.to_s)
61
- params = argv[pos + 1, cmd.arity.abs]
62
- return cmd.call(*params)
63
- end
64
- end
65
- send(:__default__)
66
- end
57
+ def dispatch
58
+ argv = @argv.reject {|arg| arg.option? }
59
+ @commands.each do |cmd|
60
+ if pos = argv.find_index(cmd.name.to_s)
61
+ params = argv[pos + 1, cmd.arity.abs]
62
+ return cmd.call(*params)
63
+ end
64
+ end
65
+ send(:__default__)
66
+ end
67
67
 
68
- def help_message
69
- msg = []
70
- msg << <<-BANNER.strip
68
+ def help_message
69
+ msg = []
70
+ msg << <<-BANNER.strip
71
71
  Usage:
72
- $ #{File.basename($0)} [options] #{"command [args, ...]" unless @commands.empty?}
73
- BANNER
72
+ $ #{File.basename($0)} [options] #{"command [args, ...]" unless @commands.empty?}
73
+ BANNER
74
74
 
75
- unless @expectation.empty?
76
- msg << "Options: "
77
- @expectation.each do |opt|
78
- line = ["\t", opt.option_name]
79
- line << opt.params.map {|param|
80
- param.to_s.upcase
81
- }.join(' ') unless opt.params.empty?
82
- line << opt.desc unless opt.desc.empty?
83
- msg << line.join(" ")
84
- end
85
- end
75
+ unless @expectation.empty?
76
+ msg << "Options: "
77
+ @expectation.each do |opt|
78
+ line = ["\t", opt.option_name]
79
+ line << opt.params.map {|param|
80
+ param.to_s.upcase
81
+ }.join(' ') unless opt.params.empty?
82
+ line << opt.desc unless opt.desc.empty?
83
+ msg << line.join(" ")
84
+ end
85
+ end
86
86
 
87
- unless @commands.empty?
88
- msg << <<-COMMANDS.strip
87
+ unless @commands.empty?
88
+ msg << <<-COMMANDS.strip
89
89
  Commands:
90
- #{@commands.map {|cmd| cmd.name }.join(' ')}
91
- COMMANDS
92
- end
90
+ #{@commands.map {|cmd| cmd.name }.join(' ')}
91
+ COMMANDS
92
+ end
93
93
 
94
- msg << ""
95
- msg.join("\n\n")
96
- end
94
+ msg << ""
95
+ msg.join("\n\n")
96
+ end
97
97
 
98
- def __default__
99
- STDOUT.puts help_message
100
- end
98
+ def __default__
99
+ STDOUT.puts help_message
100
+ end
101
101
  end
102
102
 
@@ -5,6 +5,6 @@ require "pathname"
5
5
  dir = Pathname.new(__FILE__).expand_path.parent + 'core_ext/'
6
6
 
7
7
  dir.each_child do |entry|
8
- require entry.to_s
8
+ require entry.to_s
9
9
  end
10
10
 
@@ -1,9 +1,9 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module ArrayExtension
4
- def option_args
5
- pos = index('--') ? slice(0...pos) : dup
6
- end
4
+ def option_args
5
+ pos = index('--') ? slice(0...pos) : dup
6
+ end
7
7
  end
8
8
 
9
9
  Array.send(:include, ArrayExtension)
@@ -1,13 +1,13 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module StringExtention
4
- def option?
5
- /^--[-a-zA-Z0-9]+$/ === self
6
- end
4
+ def option?
5
+ /^--[-a-zA-Z0-9]+$/ === self
6
+ end
7
7
 
8
- def to_option
9
- (slice(0..2) == '--' ? '' : '--') + strip.gsub('_', '-')
10
- end
8
+ def to_option
9
+ (slice(0..2) == '--' ? '' : '--') + strip.gsub('_', '-')
10
+ end
11
11
  end
12
12
 
13
13
  String.send(:include, StringExtention)
@@ -1,9 +1,9 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module SymbolExtension
4
- def to_option
5
- to_s.to_option
6
- end
4
+ def to_option
5
+ to_s.to_option
6
+ end
7
7
  end
8
8
 
9
9
  Symbol.send(:include, SymbolExtension)
@@ -1,25 +1,25 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  class Gestopft::Option
4
- attr_reader :name, :params, :description
5
- alias_method :desc, :description
4
+ attr_reader :name, :params, :description
5
+ alias_method :desc, :description
6
6
 
7
- def initialize(name, args={})
8
- @name = name
9
- @params = args[:params] || []
10
- @description = args[:desc] || args[:description] || ""
11
- end
7
+ def initialize(name, args={})
8
+ @name = name
9
+ @params = args[:params] || []
10
+ @description = args[:desc] || args[:description] || ""
11
+ end
12
12
 
13
- def option_name
14
- @name.to_option
15
- end
13
+ def option_name
14
+ @name.to_option
15
+ end
16
16
 
17
- def require_args?
18
- !@params.empty?
19
- end
17
+ def require_args?
18
+ !@params.empty?
19
+ end
20
20
 
21
- def arity
22
- @params.size
23
- end
21
+ def arity
22
+ @params.size
23
+ end
24
24
  end
25
25
 
@@ -0,0 +1,3 @@
1
+ module Gestopft
2
+ VERSION = '0.1.0'
3
+ end
@@ -6,64 +6,58 @@ require "gestopft"
6
6
  include Gestopft::Constants
7
7
 
8
8
  describe Gestopft::Option do
9
- subject do
10
- Gestopft::Option.new(:my_option, :desc => "my description")
11
- end
12
-
13
- it "#option_name is option string." do
14
- subject.option_name.should == '--my-option'
15
- end
16
-
17
- context "when given a description." do
18
- it "#desc[ription] is the description about the option." do
19
- subject.desc.should == "my description"
20
- subject.description.should == "my description"
21
- end
22
- end
23
-
24
- context "when does not given a description." do
25
- subject do
26
- Gestopft::Option.new(:my_option)
27
- end
28
-
29
- it "#desc[ription] is empty." do
30
- subject.desc.should be_empty
31
- subject.description.should be_empty
32
- end
33
- end
34
-
35
- context "which requires parameters." do
36
- subject do
37
- Gestopft::Option.new(:delay, :params => %w(minute))
38
- end
39
-
40
- it "#require_args? is true" do
41
- subject.require_args?.should be_true
42
- end
43
-
44
- it "#arity is the arity of option." do
45
- subject.arity.should == 1
46
- end
47
- end
48
-
49
- context "which requires no parameter." do
50
- subject do
51
- Gestopft::Option.new(:verbose)
52
- end
53
-
54
- it "#require_args? is false" do
55
- subject.require_args?.should be_false
56
- end
57
-
58
- it "#arity is 0." do
59
- subject.arity.should == 0
60
- end
61
- end
62
-
63
- context "generated automatically" do
64
- subject do
65
- Gestopft::Option.new(:m, :alias_for => :my_option)
66
- end
67
- end
9
+ subject do
10
+ Gestopft::Option.new(:my_option, :desc => "my description")
11
+ end
12
+
13
+ it "#option_name is option string." do
14
+ subject.option_name.should == '--my-option'
15
+ end
16
+
17
+ context "when given a description." do
18
+ it "#desc[ription] is the description about the option." do
19
+ subject.desc.should == "my description"
20
+ subject.description.should == "my description"
21
+ end
22
+ end
23
+
24
+ context "when does not given a description." do
25
+ subject do
26
+ Gestopft::Option.new(:my_option)
27
+ end
28
+
29
+ it "#desc[ription] is empty." do
30
+ subject.desc.should be_empty
31
+ subject.description.should be_empty
32
+ end
33
+ end
34
+
35
+ context "which requires parameters." do
36
+ subject do
37
+ Gestopft::Option.new(:delay, :params => %w(minute))
38
+ end
39
+
40
+ it "#require_args? is true" do
41
+ subject.require_args?.should be_true
42
+ end
43
+
44
+ it "#arity is the arity of option." do
45
+ subject.arity.should == 1
46
+ end
47
+ end
48
+
49
+ context "which requires no parameter." do
50
+ subject do
51
+ Gestopft::Option.new(:verbose)
52
+ end
53
+
54
+ it "#require_args? is false" do
55
+ subject.require_args?.should be_false
56
+ end
57
+
58
+ it "#arity is 0." do
59
+ subject.arity.should == 0
60
+ end
61
+ end
68
62
  end
69
63
 
@@ -6,93 +6,78 @@ require "gestopft"
6
6
  include Gestopft::Constants
7
7
 
8
8
  describe Gestopft::App do
9
- subject do
10
- Class.new(Gestopft::App)
11
- end
12
-
13
- context "given a option which requires no arguments." do
14
- before :all do
15
- subject.module_eval do
16
- option :with_no_args
17
- end
18
- end
19
-
20
- it "has a option which given." do
21
- subject.run(%w(--with-no-args)).options.
22
- should include(:with_no_args)
23
- end
24
-
25
- it "does not have a option which does not given." do
26
- subject.run(%w(--with-no-args)).options.
27
- should_not include(:does_not_given)
28
- end
29
-
30
- it "succeeds when given a option which requires no arguments." do
31
- expect { subject.run(%w(--with-no-args)) }.
32
- should_not raise_error(Error)
33
- end
34
-
35
- it "succeeds when not given a option which is required." do
36
- expect { subject.run([]) }.
37
- should_not raise_error(NotSatisfiedRequirements)
38
- end
39
- end
40
-
41
- context "a option which require a argument." do
42
- before :all do
43
- subject.module_eval do
44
- option :delay, [:minute]
45
- end
46
- end
47
-
48
- it "has a option which given with taken parameter." do
49
- subject.run(%w(--delay 5)).options.
50
- should include(:delay => ['5'])
51
- end
52
-
53
- it "does not have a option which given without any arguments." do
54
- expect { subject.run(%w(--delay)) }.
55
- should raise_error(NotSatisfiedRequirements)
56
- end
57
- end
58
-
59
- context "when defined sub-commands" do
60
- before do
61
- subject.module_eval do
62
- def update
63
- :update
64
- end
65
- end
66
- end
67
-
68
- it ".commands is a array of available commands." do
69
- subject.commands.should == [:update]
70
- end
71
-
72
- it "#dispatch return value which of sub-command's" do
73
- subject.new(%w(update)).dispatch.should == subject.new([]).update
74
- end
75
- end
76
-
77
- context "when not defined sub-commands" do
78
- it ".commands is empty array." do
79
- subject.commands.should be_empty
80
- end
81
- end
82
-
83
- context "when given some options" do
84
- before do
85
- subject.module_eval do
86
- option :verbose
87
- option :dry_run
88
- end
89
- end
90
-
91
- it "automatically generate short options" do
92
- subject.expectation.sort.map {|i|
93
- i.option_name
94
- }.should.include(%w(-v -d))
95
- end
96
- end
9
+ subject do
10
+ Class.new(Gestopft::App)
11
+ end
12
+
13
+ context "given a option which requires no arguments." do
14
+ before :all do
15
+ subject.module_eval do
16
+ option :with_no_args
17
+ end
18
+ end
19
+
20
+ it "has a option which given." do
21
+ subject.run(%w(--with-no-args)).options.
22
+ should include(:with_no_args)
23
+ end
24
+
25
+ it "does not have a option which does not given." do
26
+ subject.run(%w(--with-no-args)).options.
27
+ should_not include(:does_not_given)
28
+ end
29
+
30
+ it "succeeds when given a option which requires no arguments." do
31
+ expect { subject.run(%w(--with-no-args)) }.
32
+ should_not raise_error(Error)
33
+ end
34
+
35
+ it "succeeds when not given a option which is required." do
36
+ expect { subject.run([]) }.
37
+ should_not raise_error(NotSatisfiedRequirements)
38
+ end
39
+ end
40
+
41
+ context "a option which require a argument." do
42
+ before :all do
43
+ subject.module_eval do
44
+ option :delay, [:minute]
45
+ end
46
+ end
47
+
48
+ it "has a option which given with taken parameter." do
49
+ subject.run(%w(--delay 5)).options.
50
+ should include(:delay => ['5'])
51
+ end
52
+
53
+ it "does not have a option which given without any arguments." do
54
+ expect { subject.run(%w(--delay)) }.
55
+ should raise_error(NotSatisfiedRequirements)
56
+ end
57
+ end
58
+
59
+ context "when defined sub-commands" do
60
+ before do
61
+ subject.module_eval do
62
+ def update
63
+ :update
64
+ end
65
+ end
66
+ end
67
+
68
+ it ".commands is a array of available commands." do
69
+ subject.commands.should == [:update]
70
+ end
71
+
72
+ it "#dispatch return value which of sub-command's" do
73
+ subject.new(%w(update)).dispatch.should == subject.new([]).update
74
+ end
75
+ end
76
+
77
+ context "when not defined sub-commands" do
78
+ it ".commands is empty array." do
79
+ subject.commands.should be_empty
80
+ end
81
+ end
97
82
  end
98
83
 
metadata CHANGED
@@ -1,67 +1,92 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: gestopft
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
4
5
  prerelease:
5
- version: 0.0.4
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - aereal
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-04-22 00:00:00 +09:00
14
- default_executable:
15
- dependencies: []
16
-
12
+ date: 2012-03-08 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &70341397648800 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 2.8.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70341397648800
25
+ - !ruby/object:Gem::Dependency
26
+ name: rake
27
+ requirement: &70341397648280 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 0.9.2
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70341397648280
17
36
  description:
18
- email: trasty.loose@gmail.com
37
+ email:
38
+ - aereal@kerare.org
19
39
  executables: []
20
-
21
40
  extensions: []
22
-
23
41
  extra_rdoc_files: []
24
-
25
- files:
26
- - README.rdoc
42
+ files:
27
43
  - .autotest
44
+ - .gitignore
28
45
  - .rspec
46
+ - Gemfile
47
+ - README.rdoc
48
+ - Rakefile
49
+ - gestopft.gemspec
50
+ - lib/gestopft.rb
29
51
  - lib/gestopft/app.rb
52
+ - lib/gestopft/core_ext.rb
30
53
  - lib/gestopft/core_ext/array.rb
31
54
  - lib/gestopft/core_ext/string.rb
32
55
  - lib/gestopft/core_ext/symbol.rb
33
- - lib/gestopft/core_ext.rb
34
56
  - lib/gestopft/option.rb
35
- - lib/gestopft.rb
57
+ - lib/gestopft/version.rb
36
58
  - spec/gestopft/option_spec.rb
37
59
  - spec/gestopft_spec.rb
38
- has_rdoc: true
39
- homepage: http://github.com/aereal/gestopft
60
+ homepage: https://github.com/aereal/gestopft
40
61
  licenses: []
41
-
42
62
  post_install_message:
43
63
  rdoc_options: []
44
-
45
- require_paths:
46
- - lib
47
- required_ruby_version: !ruby/object:Gem::Requirement
64
+ require_paths:
65
+ - - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
48
67
  none: false
49
- requirements:
50
- - - ">="
51
- - !ruby/object:Gem::Version
52
- version: "0"
53
- required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ! '>='
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ segments:
73
+ - 0
74
+ hash: -2301597943964023044
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
76
  none: false
55
- requirements:
56
- - - ">="
57
- - !ruby/object:Gem::Version
58
- version: "0"
77
+ requirements:
78
+ - - ! '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ segments:
82
+ - 0
83
+ hash: -2301597943964023044
59
84
  requirements: []
60
-
61
85
  rubyforge_project:
62
- rubygems_version: 1.6.2
86
+ rubygems_version: 1.8.17
63
87
  signing_key:
64
88
  specification_version: 3
65
89
  summary: Framework for CLI Application
66
- test_files: []
67
-
90
+ test_files:
91
+ - spec/gestopft/option_spec.rb
92
+ - spec/gestopft_spec.rb