args_parser 0.0.4 → 0.0.5

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/History.txt CHANGED
@@ -1,3 +1,7 @@
1
+ === 0.0.5 2012-09-24
2
+
3
+ * add filter and validator
4
+
1
5
  === 0.0.4 2012-09-24
2
6
 
3
7
  * use bundler
data/Manifest.txt CHANGED
@@ -6,6 +6,8 @@ README.rdoc
6
6
  Rakefile
7
7
  lib/args_parser.rb
8
8
  lib/args_parser/parser.rb
9
+ lib/args_parser/filter.rb
10
+ lib/args_parser/validator.rb
9
11
  samples/download_webpage.rb
10
12
  script/console
11
13
  script/destroy
data/README.rdoc CHANGED
@@ -8,7 +8,7 @@ ARGV parser - Parse args from command line.
8
8
 
9
9
  == SYNOPSIS:
10
10
 
11
- % ruby sample.rb -url http://example.com -o out.html
11
+ % ruby samples/download_webpage.rb -url http://example.com -o out.html
12
12
 
13
13
  parse ARGV
14
14
 
@@ -20,6 +20,14 @@ parse ARGV
20
20
  arg :output, 'output file', :alias => :o, :default => 'out.html'
21
21
  arg :verbose, 'verbose mode'
22
22
  arg :help, 'show help', :alias => :h
23
+
24
+ filter :url do |v|
25
+ v.strip
26
+ end
27
+
28
+ validate :url, "invalid URL" do |v|
29
+ v =~ /^https?:\/\/.+$/
30
+ end
23
31
  end
24
32
 
25
33
  if parser.has_option? :help or !parser.has_param?(:url, :output)
data/lib/args_parser.rb CHANGED
@@ -2,7 +2,9 @@ $:.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/filter'
6
+ require 'args_parser/validator'
5
7
 
6
8
  module ArgsParser
7
- VERSION = '0.0.4'
9
+ VERSION = '0.0.5'
8
10
  end
@@ -0,0 +1,22 @@
1
+
2
+ module ArgsParser
3
+ class Filter
4
+ def filters
5
+ @filters ||= []
6
+ end
7
+
8
+ def add(name, filter)
9
+ name = name.to_sym if name
10
+ filters.push({:name => name, :filter => filter})
11
+ end
12
+
13
+ def filter(name, value)
14
+ filters.each do |f|
15
+ if !f[:name] or f[:name] == name
16
+ value = f[:filter].call(value)
17
+ end
18
+ end
19
+ value
20
+ end
21
+ end
22
+ end
@@ -1,7 +1,9 @@
1
1
 
2
2
  module ArgsParser
3
3
  def self.parse(argv=[], &block)
4
- Parser.new(argv, &block)
4
+ parser = Parser.new(&block)
5
+ parser.parse argv
6
+ parser
5
7
  end
6
8
 
7
9
  class Parser
@@ -26,12 +28,19 @@ module ArgsParser
26
28
  end
27
29
 
28
30
  public
29
- def initialize(argv=[], &block)
31
+ def initialize(&block)
30
32
  unless block_given?
31
33
  raise ArgumentError, 'initialize block was not given'
32
34
  end
35
+ @filter = Filter.new
36
+ @validator = Validator.new
33
37
  instance_eval(&block)
34
- parse argv
38
+ filter do |v|
39
+ (v.kind_of? String and v =~ /^\d+$/) ? v.to_i : v
40
+ end
41
+ filter do |v|
42
+ (v.kind_of? String and v =~ /^\d+\.\d+$/) ? v.to_f : v
43
+ end
35
44
  end
36
45
 
37
46
  def arg(name, description, opts={})
@@ -42,6 +51,18 @@ module ArgsParser
42
51
  aliases[opts[:alias]] = name if opts[:alias]
43
52
  end
44
53
 
54
+ def filter(name=nil, &block)
55
+ if block_given?
56
+ @filter.add name, block
57
+ end
58
+ end
59
+
60
+ def validate(name, message, &block)
61
+ if block_given?
62
+ @validator.add name, message, block
63
+ end
64
+ end
65
+
45
66
  def args
46
67
  params.keys
47
68
  end
@@ -62,8 +83,12 @@ module ArgsParser
62
83
  k = arg.scan(/^-+([^-\s]+)$/)[0][0].strip.to_sym
63
84
  k = aliases[k] if aliases[k]
64
85
  else
65
- arg = arg.to_i if arg =~ /^\d+$/
66
- arg = arg.to_f if arg =~ /^\d+\.\d+$/
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
67
92
  params[k][:value] = arg
68
93
  k = nil
69
94
  end
@@ -0,0 +1,22 @@
1
+
2
+ module ArgsParser
3
+ class Validator
4
+ def validators
5
+ @validators ||= []
6
+ end
7
+
8
+ def add(name, message, validator)
9
+ name = name.to_sym if name
10
+ validators.push({:name => name, :message => message, :validator => validator})
11
+ end
12
+
13
+ def validate(name, value)
14
+ validators.each do |f|
15
+ if !f[:name] or f[:name] == name
16
+ return f[:message] unless f[:validator].call(value)
17
+ end
18
+ end
19
+ nil
20
+ end
21
+ end
22
+ end
@@ -1,13 +1,21 @@
1
1
  #!/usr/bin/env ruby
2
+ $:.unshift File.expand_path '../lib', File.dirname(__FILE__)
2
3
  require 'rubygems'
3
4
  require 'args_parser'
4
- ## require File.dirname(__FILE__)+'/../lib/args_parser'
5
5
 
6
6
  parser = ArgsParser.parse ARGV do
7
7
  arg :url, 'URL', :alias => :u
8
8
  arg :output, 'output file', :alias => :o, :default => 'out.html'
9
9
  arg :verbose, 'verbose mode'
10
10
  arg :help, 'show help', :alias => :h
11
+
12
+ filter :url do |v|
13
+ v.strip
14
+ end
15
+
16
+ validate :url, "invalid URL" do |v|
17
+ v =~ /^https?:\/\/.+$/
18
+ end
11
19
  end
12
20
 
13
21
  if parser.has_option? :help or !parser.has_param?(:url, :output)
@@ -2,11 +2,20 @@ require File.dirname(__FILE__) + '/test_helper.rb'
2
2
 
3
3
  class TestArgsParser < Test::Unit::TestCase
4
4
  def setup
5
- @argv = 'test --input ~/tmp -a --o ./out -h --depth 030 --pi 3.14'.split(/\s+/)
5
+ @argv = 'test --input http://shokai.org -a --o ./out -h --depth 030 --pi 3.14 --n ShoKaI'.split(/\s+/)
6
6
  @parser = ArgsParser.parse @argv do
7
- arg :input, 'input dir', :alias => :i
7
+ arg :input, 'input', :alias => :i
8
8
  arg :output, 'output dir', :alias => :o
9
+ arg :name, 'user name', :alias => :n
9
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
10
19
  end
11
20
  end
12
21
 
@@ -15,7 +24,7 @@ class TestArgsParser < Test::Unit::TestCase
15
24
  end
16
25
 
17
26
  def test_arg
18
- assert @parser[:input] == '~/tmp'
27
+ assert @parser[:input] == 'http://shokai.org'
19
28
  end
20
29
 
21
30
  def test_alias
@@ -32,6 +41,10 @@ class TestArgsParser < Test::Unit::TestCase
32
41
  assert @parser[:pi].class == Float
33
42
  end
34
43
 
44
+ def test_filter
45
+ assert @parser[:name] == 'shokai'
46
+ end
47
+
35
48
  def test_missing_arg
36
49
  assert @parser[:b] != true
37
50
  end
@@ -45,10 +58,11 @@ class TestArgsParser < Test::Unit::TestCase
45
58
  assert @parser.has_param? :output
46
59
  assert @parser.has_param? :depth
47
60
  assert @parser.has_param? :pi
61
+ assert @parser.has_param? :name
48
62
  end
49
63
 
50
64
  def test_has_params?
51
- assert @parser.has_param? :input, :output, :depth, :pi
65
+ assert @parser.has_param? :input, :output, :depth, :pi, :name
52
66
  end
53
67
 
54
68
  def test_has_not_param?
metadata CHANGED
@@ -1,118 +1,107 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: args_parser
3
- version: !ruby/object:Gem::Version
4
- version: 0.0.4
3
+ version: !ruby/object:Gem::Version
5
4
  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
- date: 2012-09-24 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'
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
62
48
  description: ARGV parser - Parse args from command line.
63
- email:
64
- - hashimoto@shokai.org
49
+ email:
50
+ - hashimoto@shokai.org
65
51
  executables: []
52
+
66
53
  extensions: []
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/parser.rb
80
- - samples/download_webpage.rb
81
- - script/console
82
- - script/destroy
83
- - script/generate
84
- - test/test_args_parser.rb
85
- - test/test_helper.rb
86
- - .gemtest
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
87
77
  homepage: http://github.com/shokai/args_parser
88
78
  licenses: []
79
+
89
80
  post_install_message:
90
- rdoc_options:
91
- - --main
92
- - README.rdoc
93
- require_paths:
94
- - lib
95
- required_ruby_version: !ruby/object:Gem::Requirement
81
+ rdoc_options:
82
+ - --main
83
+ - README.rdoc
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
96
87
  none: false
97
- requirements:
98
- - - ! '>='
99
- - !ruby/object:Gem::Version
100
- version: '0'
101
- segments:
102
- - 0
103
- hash: -3362374231966488383
104
- required_rubygems_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: "0"
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
93
  none: false
106
- requirements:
107
- - - ! '>='
108
- - !ruby/object:Gem::Version
109
- version: '0'
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: "0"
110
98
  requirements: []
99
+
111
100
  rubyforge_project: args_parser
112
- rubygems_version: 1.8.24
101
+ rubygems_version: 1.8.15
113
102
  signing_key:
114
103
  specification_version: 3
115
104
  summary: ARGV parser - Parse args from command line.
116
- test_files:
117
- - test/test_args_parser.rb
118
- - test/test_helper.rb
105
+ test_files:
106
+ - test/test_args_parser.rb
107
+ - test/test_helper.rb