args_parser 0.0.5 → 0.0.6

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