args_parser 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest.txt CHANGED
@@ -5,12 +5,17 @@ Manifest.txt
5
5
  README.rdoc
6
6
  Rakefile
7
7
  lib/args_parser.rb
8
+ lib/args_parser/config.rb
8
9
  lib/args_parser/parser.rb
9
10
  lib/args_parser/filter.rb
11
+ lib/args_parser/styles/default.rb
12
+ lib/args_parser/styles/equal.rb
10
13
  lib/args_parser/validator.rb
11
14
  samples/download_webpage.rb
15
+ samples/twitter_timeline.rb
12
16
  script/console
13
17
  script/destroy
14
18
  script/generate
15
19
  test/test_args_parser.rb
20
+ test/test_args_parser_style_equal.rb
16
21
  test/test_helper.rb
data/README.rdoc CHANGED
@@ -43,6 +43,17 @@ parse ARGV
43
43
  puts "saved! => #{parser[:output]}"
44
44
 
45
45
 
46
+ equal style
47
+
48
+ % ruby samples/twitter_timeline.rb --user=shokai --fav --rt
49
+
50
+ parse equal style ARGV
51
+
52
+ parser = ArgsParser.parse ARGV, :style => :equal do
53
+
54
+ see more [samples](https://github.com/shokai/args_parser/tree/master/samples)
55
+
56
+
46
57
  == REQUIREMENTS:
47
58
 
48
59
  * Ruby 1.8.7+
@@ -0,0 +1,9 @@
1
+ module ArgsParser
2
+ class Config
3
+ def self.default
4
+ {
5
+ :style => :default
6
+ }
7
+ end
8
+ end
9
+ end
@@ -1,7 +1,10 @@
1
1
 
2
2
  module ArgsParser
3
- def self.parse(argv=[], &block)
4
- parser = Parser.new(&block)
3
+ def self.parse(argv=[], config={}, &block)
4
+ Config.default.each do |k,v|
5
+ config[k] = v unless config[k]
6
+ end
7
+ parser = Parser.new(config, &block)
5
8
  parser.parse argv
6
9
  parser
7
10
  end
@@ -28,7 +31,8 @@ module ArgsParser
28
31
  end
29
32
 
30
33
  public
31
- def initialize(&block)
34
+ def initialize(config, &block)
35
+ @config = config
32
36
  unless block_given?
33
37
  raise ArgumentError, 'initialize block was not given'
34
38
  end
@@ -68,35 +72,16 @@ module ArgsParser
68
72
  end
69
73
 
70
74
  def parse(argv)
71
- k = nil
72
- argv.each_with_index do |arg, index|
73
- unless k
74
- if arg =~ /^-+[^-\s]+$/
75
- k = arg.scan(/^-+([^-\s]+)$/)[0][0].strip.to_sym
76
- k = aliases[k] if aliases[k]
77
- elsif index == 0
78
- @first = arg
79
- end
80
- else
81
- if arg =~ /^-+[^-\s]+$/
82
- params[k][:value] = true
83
- k = arg.scan(/^-+([^-\s]+)$/)[0][0].strip.to_sym
84
- k = aliases[k] if aliases[k]
85
- else
86
- arg = @filter.filter k, arg
87
- msg = @validator.validate k, arg
88
- if msg
89
- STDERR.puts "Error: #{msg} (--#{k} #{arg})"
90
- exit 1
91
- end
92
- params[k][:value] = arg
93
- k = nil
94
- end
75
+ method("parse_style_#{@config[:style]}".to_sym).call(argv)
76
+ params.each do |name, param|
77
+ next if [nil, true].include? param[:value]
78
+ param[:value] = @filter.filter name, param[:value]
79
+ msg = @validator.validate name, param[:value]
80
+ if msg
81
+ STDERR.puts "Error: #{msg} (--#{name} #{param[:value]})"
82
+ exit 1
95
83
  end
96
84
  end
97
- if k
98
- params[k][:value] = true
99
- end
100
85
  end
101
86
 
102
87
  def [](key)
@@ -0,0 +1,32 @@
1
+
2
+ module ArgsParser
3
+ class Parser
4
+
5
+ def parse_style_default(argv)
6
+ k = nil
7
+ argv.each_with_index do |arg, index|
8
+ unless k
9
+ if arg =~ /^-+[^-\s]+$/
10
+ k = arg.scan(/^-+([^-\s]+)$/)[0][0].strip.to_sym
11
+ k = aliases[k] if aliases[k]
12
+ elsif index == 0
13
+ @first = arg
14
+ end
15
+ else
16
+ if arg =~ /^-+[^-\s]+$/
17
+ params[k][:value] = true
18
+ k = arg.scan(/^-+([^-\s]+)$/)[0][0].strip.to_sym
19
+ k = aliases[k] if aliases[k]
20
+ else
21
+ params[k][:value] = arg
22
+ k = nil
23
+ end
24
+ end
25
+ end
26
+ if k
27
+ params[k][:value] = true
28
+ end
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,23 @@
1
+
2
+ module ArgsParser
3
+ class Parser
4
+
5
+ def parse_style_equal(argv)
6
+ argv.each_with_index do |arg, i|
7
+ if arg =~ /^-+[^-=\s]+$/
8
+ k,v = [arg.scan(/^-+([^-=\s]+)$/)[0][0], true]
9
+ elsif arg =~ /^-+[^-=\s]+=[^=\s]+$/
10
+ k,v = arg.scan(/^-+([^-=\s]+)=([^=\s]+)$/)[0]
11
+ elsif i == 0
12
+ @first = arg
13
+ end
14
+ if k and v
15
+ k = k.strip.to_sym
16
+ k = aliases[k] if aliases[k]
17
+ params[k][:value] = v
18
+ end
19
+ end
20
+ end
21
+
22
+ end
23
+ end
data/lib/args_parser.rb CHANGED
@@ -2,9 +2,12 @@ $:.unshift(File.dirname(__FILE__)) unless
2
2
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
3
 
4
4
  require 'args_parser/parser'
5
+ require 'args_parser/styles/default'
6
+ require 'args_parser/styles/equal'
5
7
  require 'args_parser/filter'
6
8
  require 'args_parser/validator'
9
+ require 'args_parser/config'
7
10
 
8
11
  module ArgsParser
9
- VERSION = '0.0.5'
12
+ VERSION = '0.0.6'
10
13
  end
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
+ ## sample app
3
+
2
4
  $:.unshift File.expand_path '../lib', File.dirname(__FILE__)
3
5
  require 'rubygems'
4
6
  require 'args_parser'
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env ruby
2
+ ## equal style sample app
3
+ ## % gem install twitter --version=3.7.0
4
+
5
+ $:.unshift File.expand_path '../lib', File.dirname(__FILE__)
6
+ require 'rubygems'
7
+ require 'args_parser'
8
+ gem 'twitter', '< 4.0.0', '>= 3.7.0'
9
+ require 'twitter'
10
+
11
+ parser = ArgsParser.parse ARGV, :style => :equal do
12
+ arg :user, 'user', :alias => :u
13
+ arg :favorite, 'show favorites', :alias => :fav
14
+ arg :retweet, 'show retweets', :alias => :rt
15
+ arg :help, 'show help', :alias => :h
16
+
17
+ filter :user do |v|
18
+ v.strip
19
+ end
20
+
21
+ validate :user, "invalid twitter screen_name" do |v|
22
+ v =~ /^[a-zA-Z0-9_]+$/
23
+ end
24
+ end
25
+
26
+ if parser.has_option? :help or !parser.has_param? :user
27
+ STDERR.puts "Twitter Timeline\n=="
28
+ STDERR.puts parser.help
29
+ STDERR.puts "e.g. ruby #{$0} --user=ymrl"
30
+ STDERR.puts "e.g. ruby #{$0} --user=ymrl --fav"
31
+ STDERR.puts "e.g. ruby #{$0} --user=ymrl --fav --rt"
32
+ exit 1
33
+ end
34
+
35
+ p parser
36
+
37
+ Twitter::configure do
38
+ end
39
+
40
+ data = []
41
+ Twitter::user_timeline(parser[:user]).each do |i|
42
+ data.push(:id => i.id,
43
+ :name => i.user.screen_name,
44
+ :text => i.text,
45
+ :date => i.created_at)
46
+ end
47
+
48
+ if parser.has_option? :favorite
49
+ Twitter::favorites(parser[:user]).each do |i|
50
+ data.push(:id => i.id,
51
+ :name => i.user.screen_name,
52
+ :text => i.text,
53
+ :date => i.created_at)
54
+ end
55
+ end
56
+
57
+ if parser.has_option? :retweet
58
+ Twitter::retweeted_by_user(parser[:user]).each do |i|
59
+ data.push(:id => i.id,
60
+ :name => i.user.screen_name,
61
+ :text => i.text,
62
+ :date => i.created_at)
63
+ end
64
+ end
65
+
66
+ data.uniq{|i|
67
+ i[:id]
68
+ }.sort{|a,b|
69
+ a[:date] <=> b[:date]
70
+ }.each{|i|
71
+ puts "@#{i[:name]}\t#{i[:text]}"
72
+ }
@@ -0,0 +1,84 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestArgsParserStyleEqual < Test::Unit::TestCase
4
+ def setup
5
+ @argv = 'test --input=http://shokai.org --a --o=./out -h --depth=030 --pi=3.14 --n=ShoKaI'.split(/\s+/)
6
+ @parser = ArgsParser.parse @argv, :style => :equal do
7
+ arg :input, 'input', :alias => :i
8
+ arg :output, 'output dir', :alias => :o
9
+ arg :name, 'user name', :alias => :n
10
+ arg :help, 'show help', :alias => :h
11
+
12
+ filter :name do |v|
13
+ v.downcase
14
+ end
15
+
16
+ validate :input, "input must be valid URL" do |v|
17
+ v =~ /^https?:\/\/.+/
18
+ end
19
+ end
20
+ end
21
+
22
+ def test_first
23
+ assert @parser.first == 'test'
24
+ end
25
+
26
+ def test_arg
27
+ assert @parser[:input] == 'http://shokai.org'
28
+ end
29
+
30
+ def test_alias
31
+ assert @parser[:output] == './out'
32
+ end
33
+
34
+ def test_cast_integer
35
+ assert @parser[:depth] == 30
36
+ assert @parser[:depth].class == Fixnum
37
+ end
38
+
39
+ def test_cast_float
40
+ assert @parser[:pi] == 3.14
41
+ assert @parser[:pi].class == Float
42
+ end
43
+
44
+ def test_filter
45
+ assert @parser[:name] == 'shokai'
46
+ end
47
+
48
+ def test_missing_arg
49
+ assert @parser[:b] != true
50
+ end
51
+
52
+ def test_switch
53
+ assert @parser[:help] == true
54
+ end
55
+
56
+ def test_has_param?
57
+ assert @parser.has_param? :input
58
+ assert @parser.has_param? :output
59
+ assert @parser.has_param? :depth
60
+ assert @parser.has_param? :pi
61
+ assert @parser.has_param? :name
62
+ end
63
+
64
+ def test_has_params?
65
+ assert @parser.has_param? :input, :output, :depth, :pi, :name
66
+ end
67
+
68
+ def test_has_not_param?
69
+ assert !@parser.has_param?(:a)
70
+ end
71
+
72
+ def test_has_option?
73
+ assert @parser.has_option? :help
74
+ assert @parser.has_option? :a
75
+ end
76
+
77
+ def test_has_options?
78
+ assert @parser.has_option? :help, :a
79
+ end
80
+
81
+ def test_has_not_option?
82
+ assert !@parser.has_option?(:b)
83
+ end
84
+ end
metadata CHANGED
@@ -1,107 +1,126 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: args_parser
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.6
4
5
  prerelease:
5
- version: 0.0.5
6
6
  platform: ruby
7
- authors:
8
- - Sho Hashimoto
7
+ authors:
8
+ - Sho Hashimoto
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2012-09-24 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: rdoc
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
19
- none: false
20
- requirements:
21
- - - ~>
22
- - !ruby/object:Gem::Version
23
- version: "3.10"
24
- type: :development
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
27
- name: newgem
28
- prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
30
- none: false
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: 1.5.3
35
- type: :development
36
- version_requirements: *id002
37
- - !ruby/object:Gem::Dependency
38
- name: hoe
39
- prerelease: false
40
- requirement: &id003 !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ~>
44
- - !ruby/object:Gem::Version
45
- version: "3.1"
46
- type: :development
47
- version_requirements: *id003
12
+ date: 2012-09-26 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rdoc
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '3.10'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '3.10'
30
+ - !ruby/object:Gem::Dependency
31
+ name: newgem
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 1.5.3
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 1.5.3
46
+ - !ruby/object:Gem::Dependency
47
+ name: hoe
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '3.1'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '3.1'
48
62
  description: ARGV parser - Parse args from command line.
49
- email:
50
- - hashimoto@shokai.org
63
+ email:
64
+ - hashimoto@shokai.org
51
65
  executables: []
52
-
53
66
  extensions: []
54
-
55
- extra_rdoc_files:
56
- - History.txt
57
- - Manifest.txt
58
- - README.rdoc
59
- files:
60
- - Gemfile
61
- - Gemfile.lock
62
- - History.txt
63
- - Manifest.txt
64
- - README.rdoc
65
- - Rakefile
66
- - lib/args_parser.rb
67
- - lib/args_parser/parser.rb
68
- - lib/args_parser/filter.rb
69
- - lib/args_parser/validator.rb
70
- - samples/download_webpage.rb
71
- - script/console
72
- - script/destroy
73
- - script/generate
74
- - test/test_args_parser.rb
75
- - test/test_helper.rb
76
- - .gemtest
67
+ extra_rdoc_files:
68
+ - History.txt
69
+ - Manifest.txt
70
+ - README.rdoc
71
+ files:
72
+ - Gemfile
73
+ - Gemfile.lock
74
+ - History.txt
75
+ - Manifest.txt
76
+ - README.rdoc
77
+ - Rakefile
78
+ - lib/args_parser.rb
79
+ - lib/args_parser/config.rb
80
+ - lib/args_parser/parser.rb
81
+ - lib/args_parser/filter.rb
82
+ - lib/args_parser/styles/default.rb
83
+ - lib/args_parser/styles/equal.rb
84
+ - lib/args_parser/validator.rb
85
+ - samples/download_webpage.rb
86
+ - samples/twitter_timeline.rb
87
+ - script/console
88
+ - script/destroy
89
+ - script/generate
90
+ - test/test_args_parser.rb
91
+ - test/test_args_parser_style_equal.rb
92
+ - test/test_helper.rb
93
+ - .gemtest
77
94
  homepage: http://github.com/shokai/args_parser
78
95
  licenses: []
79
-
80
96
  post_install_message:
81
- rdoc_options:
82
- - --main
83
- - README.rdoc
84
- require_paths:
85
- - lib
86
- required_ruby_version: !ruby/object:Gem::Requirement
97
+ rdoc_options:
98
+ - --main
99
+ - README.rdoc
100
+ require_paths:
101
+ - lib
102
+ required_ruby_version: !ruby/object:Gem::Requirement
87
103
  none: false
88
- requirements:
89
- - - ">="
90
- - !ruby/object:Gem::Version
91
- version: "0"
92
- required_rubygems_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ! '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ segments:
109
+ - 0
110
+ hash: 3014351784407155723
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
112
  none: false
94
- requirements:
95
- - - ">="
96
- - !ruby/object:Gem::Version
97
- version: "0"
113
+ requirements:
114
+ - - ! '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
98
117
  requirements: []
99
-
100
118
  rubyforge_project: args_parser
101
- rubygems_version: 1.8.15
119
+ rubygems_version: 1.8.24
102
120
  signing_key:
103
121
  specification_version: 3
104
122
  summary: ARGV parser - Parse args from command line.
105
- test_files:
106
- - test/test_args_parser.rb
107
- - test/test_helper.rb
123
+ test_files:
124
+ - test/test_args_parser.rb
125
+ - test/test_args_parser_style_equal.rb
126
+ - test/test_helper.rb