yawpa 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,17 +1,5 @@
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
1
+ /.yardoc/
2
+ /coverage/
3
+ /doc/
4
+ /pkg/
5
+ /rdoc/
data/.rspec CHANGED
@@ -1 +1,2 @@
1
1
  --color
2
+ --require spec_helper
data/Gemfile.lock ADDED
@@ -0,0 +1,46 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ yawpa (1.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ diff-lcs (1.2.5)
10
+ docile (1.1.5)
11
+ json (1.8.1)
12
+ multi_json (1.10.1)
13
+ rake (10.3.2)
14
+ rdoc (4.1.1)
15
+ json (~> 1.4)
16
+ redcarpet (3.1.2)
17
+ rspec (3.0.0)
18
+ rspec-core (~> 3.0.0)
19
+ rspec-expectations (~> 3.0.0)
20
+ rspec-mocks (~> 3.0.0)
21
+ rspec-core (3.0.2)
22
+ rspec-support (~> 3.0.0)
23
+ rspec-expectations (3.0.2)
24
+ diff-lcs (>= 1.2.0, < 2.0)
25
+ rspec-support (~> 3.0.0)
26
+ rspec-mocks (3.0.2)
27
+ rspec-support (~> 3.0.0)
28
+ rspec-support (3.0.2)
29
+ simplecov (0.8.2)
30
+ docile (~> 1.1.0)
31
+ multi_json
32
+ simplecov-html (~> 0.8.0)
33
+ simplecov-html (0.8.0)
34
+ yard (0.8.7.4)
35
+
36
+ PLATFORMS
37
+ ruby
38
+
39
+ DEPENDENCIES
40
+ rake
41
+ rdoc
42
+ redcarpet
43
+ rspec
44
+ simplecov
45
+ yard
46
+ yawpa!
data/README.md CHANGED
@@ -2,64 +2,120 @@
2
2
 
3
3
  Yet Another Way to Parse Arguments is an argument-parsing library for Ruby.
4
4
 
5
+ [![Gem Version](https://badge.fury.io/rb/yawpa.png)](http://badge.fury.io/rb/yawpa)
6
+
5
7
  ## Features
6
8
 
7
9
  - POSIX or non-POSIX mode (supports subcommands using POSIX mode)
8
10
  - Options can require an arbitrary number of parameters
9
11
  - Options can be defined with a range specifying the allowed number of parameters
10
12
 
11
- ## Installation
12
-
13
- Add this line to your application's Gemfile:
14
-
15
- gem 'yawpa'
16
-
17
- And then execute:
18
-
19
- $ bundle
20
-
21
- Or install it yourself as:
22
-
23
- $ gem install yawpa
24
-
25
13
  ## Example 1
26
14
 
27
- require 'yawpa'
15
+ ```ruby
16
+ require "yawpa"
28
17
 
29
- options = {
30
- version: {},
31
- verbose: {short: 'v'},
32
- get: {nargs: 1},
33
- set: {nargs: 2},
34
- }
35
- opts, args = Yawpa.parse(ARGV, options)
36
- opts.each_pair do |opt, val|
37
- end
18
+ options = {
19
+ version: {},
20
+ verbose: {short: "v"},
21
+ get: {nargs: 1},
22
+ set: {nargs: 2},
23
+ }
24
+ opts, args = Yawpa.parse(ARGV, options)
25
+ opts.each_pair do |opt, val|
26
+ end
27
+ ```
38
28
 
39
29
  ## Example 2
40
30
 
41
- require 'yawpa'
42
-
43
- options = {
44
- version: {},
45
- help: {short: 'h'},
46
- }
47
- opts, args = Yawpa.parse(ARGV, options, posix_order: true)
48
- if opts[:version]
49
- puts "my app, version 1.2.3"
50
- end
51
- if args[0] == 'subcommand'
52
- subcommand_options = {
53
- 'server': {nargs: (1..2), short: 's'},
54
- 'dst': {nargs: 1, short: 'd'},
55
- }
56
- opts, args = Yawpa.parse(args, subcommand_options)
57
- end
58
-
59
- ## Contributing
60
-
61
- 1. Fork it
62
- 2. Create your feature branch (`git checkout -b my-new-feature`)
63
- 3. Commit your changes (`git commit -am 'Added some feature'`)
64
- 4. Push to the branch (`git push origin my-new-feature`)
65
- 5. Create new Pull Request
31
+ ```ruby
32
+ require "yawpa"
33
+
34
+ options = {
35
+ version: {},
36
+ help: {short: "h"},
37
+ }
38
+ opts, args = Yawpa.parse(ARGV, options, posix_order: true)
39
+ if opts[:version]
40
+ puts "my app, version 1.2.3"
41
+ end
42
+ if args[0] == "subcommand"
43
+ subcommand_options = {
44
+ "server": {nargs: (1..2), short: "s"},
45
+ "dst": {nargs: 1, short: "d"},
46
+ }
47
+ opts, args = Yawpa.parse(args, subcommand_options)
48
+ end
49
+ ```
50
+
51
+ ## Using Yawpa.parse()
52
+
53
+ ```ruby
54
+ opts, args = Yawpa.parse(params, options, flags = {})
55
+ ```
56
+
57
+ Parse input parameters looking for options according to rules given in flags
58
+
59
+ - `params` is the list of program parameters to parse.
60
+ - `options` is a hash containing the long option names as keys, and hashes
61
+ containing special flags for the options as values (example below).
62
+ Possible values:
63
+ - `nil`: No special flags for this option (equivalent to `{}`)
64
+ - `:boolean`: The option is a toggleable boolean option (equivalent to
65
+ `{boolean: true}`)
66
+ - `Hash`: Possible option flags:
67
+ - `:short`: specify a short option letter to associate with the long option
68
+ - `:nargs`: specify an exact number or range of possible numbers of
69
+ arguments to the option
70
+ - `:boolean`: if true, specify that the option is a toggleable boolean
71
+ option and allow a prefix of "no" to turn it off.
72
+ - `flags` is optional. It supports the following keys:
73
+ - `:posix_order`: Stop processing parameters when a non-option is seen.
74
+ Set this to `true` if you want to implement subcommands.
75
+
76
+ An ArgumentParsingException will be raised if an unknown option is observed
77
+ or insufficient arguments are present for an option.
78
+
79
+ ### Example `options`
80
+
81
+ ```ruby
82
+ {
83
+ version: nil,
84
+ verbose: {short: 'v'},
85
+ server: {nargs: (1..2)},
86
+ username: {nargs: 1},
87
+ password: {nargs: 1},
88
+ color: :boolean,
89
+ }
90
+ ```
91
+
92
+ The keys of the `options` hash can be either strings or symbols.
93
+
94
+ Possible option flags:
95
+
96
+ - `:short`: specify a short option letter to associate with the long option
97
+ - `:nargs`: specify an exact number or range of possible numbers of
98
+ arguments to the option
99
+ - `:boolean`: if true, specify that the option is a toggleable boolean
100
+ option and allow a prefix of "no" to turn it off.
101
+
102
+ ### Return values
103
+
104
+ The returned `opts` value will be a hash with the observed options as
105
+ keys and any option arguments as values.
106
+ The returned `args` will be an array of the unprocessed parameters (if
107
+ `:posix_order` was passed in `flags`, this array might contain further
108
+ options that were not processed after observing a non-option parameters).
109
+
110
+ ## Release Notes
111
+
112
+ ### v1.1.0
113
+
114
+ - Add `:boolean` option flag.
115
+ - Support `nil` or `:boolean` as shortcut option configuration values.
116
+ - Update documentation to YARD.
117
+ - Update specs to RSpec 3.
118
+
119
+ ### v1.0.0
120
+
121
+ - Initial Release
data/Rakefile.rb ADDED
@@ -0,0 +1,18 @@
1
+ require "bundler"
2
+ begin
3
+ Bundler.setup(:default, :development)
4
+ rescue Bundler::BundlerError => e
5
+ raise LoadError.new("Unable to setup Bundler; you might need to `bundle install`: #{e.message}")
6
+ end
7
+ require "bundler/gem_tasks"
8
+ require 'rspec/core/rake_task'
9
+ require "yard"
10
+
11
+ RSpec::Core::RakeTask.new('spec')
12
+
13
+ task :default => :spec
14
+
15
+ YARD::Rake::YardocTask.new do |yard|
16
+ yard.options = ["--title", "Yet Another Way to Parse Arguments"]
17
+ yard.files = ["lib/**/*.rb"]
18
+ end
data/lib/yawpa/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Yawpa
2
2
  # gem version
3
- VERSION = "1.0.0"
3
+ VERSION = "1.1.0"
4
4
  end
data/lib/yawpa.rb CHANGED
@@ -7,58 +7,71 @@ require "yawpa/version"
7
7
  # it just provides a simple functional interface for parsing options,
8
8
  # supporting subcommands and arbitrary numbers of arguments for each option.
9
9
  #
10
- # == Features
11
- #
10
+ # Features:
12
11
  # - POSIX or non-POSIX mode (supports subcommands using POSIX mode)
13
12
  # - Options can require an arbitrary number of parameters
14
- # - Options can be defined with a range specifying the allowed number of parameters
13
+ # - Options can be defined with a range specifying the allowed number of
14
+ # parameters
15
15
  module Yawpa
16
- # Exception class raised when an unknown option is observed
16
+ # Exception class raised when an unknown option is observed.
17
17
  class ArgumentParsingException < Exception; end
18
18
 
19
- module_function
20
- # :call-seq:
19
+ # Parse input parameters looking for options according to rules given in
20
+ # flags.
21
+ # Syntax:
21
22
  # opts, args = parse(params, options, flags = {})
22
23
  #
23
- # Parse input parameters looking for options according to rules given in flags
24
- #
25
- # - +params+ is the list of program parameters to parse.
26
- # - +options+ is a hash containing the long option names as keys, and hashes
27
- # containing special flags for the options as values (example below).
28
- # - +flags+ is optional. It supports the following keys:
29
- # - +:posix_order+: Stop processing parameters when a non-option is seen.
30
- # Set this to +true+ if you want to implement subcommands.
31
- #
32
24
  # An ArgumentParsingException will be raised if an unknown option is observed
33
25
  # or insufficient arguments are present for an option.
34
26
  #
35
- # == Example +options+
27
+ # Example +options+:
36
28
  #
37
29
  # {
38
- # version: {},
30
+ # version: nil,
39
31
  # verbose: {short: 'v'},
40
32
  # server: {nargs: (1..2)},
41
33
  # username: {nargs: 1},
42
34
  # password: {nargs: 1},
35
+ # color: :boolean,
43
36
  # }
44
37
  #
45
- # The keys of the +options+ hash can be either strings or symbols.
38
+ # The keys of the +options+ Hash can be either strings or symbols.
46
39
  #
47
- # Options that have no special flags should have an empty hash as the value.
48
40
  #
49
- # Possible option flags:
50
- # - +:short+: specify a short option letter to associate with the long option
51
- # - +:nargs+: specify an exact number or range of possible numbers of
52
- # arguments to the option
41
+ # @param params [Array]
42
+ # List of program parameters to parse.
43
+ # @param options [Hash]
44
+ # Hash containing the long option names as keys, and values containing
45
+ # special flags for the options as values (examples above).
46
+ # Possible values:
47
+ # +nil+:: No special flags for this option (equivalent to +{}+)
48
+ # +:boolean+::
49
+ # The option is a toggleable boolean option (equivalent to
50
+ # +{boolean: true}+)
51
+ # Hash::
52
+ # Possible option flags:
53
+ # - +:short+: specify a short option letter to associate with the long option
54
+ # - +:nargs+: specify an exact number or range of possible numbers of
55
+ # arguments to the option
56
+ # - +:boolean+: if true, specify that the option is a toggleable boolean
57
+ # option and allow a prefix of "no" to turn it off.
58
+ # @param flags [Hash]
59
+ # Optional flags dictating how {.parse} should do its job.
60
+ # @option flags [Boolean] :posix_order
61
+ # Stop processing parameters when a non-option argument is seen.
62
+ # Set this to +true+ if you want to implement subcommands.
53
63
  #
54
- # == Return values
55
- #
56
- # The returned +opts+ value will be a hash with the observed options as
57
- # keys and any option arguments as values.
58
- # The returned +args+ will be an array of the unprocessed parameters (if
59
- # +:posix_order+ was passed in +flags+, this array might contain further
60
- # options that were not processed after observing a non-option parameters.
61
- def parse(params, options, flags = {})
64
+ # @return [Array]
65
+ # Two-element array containing +opts+ and +args+ return values.
66
+ # +opts+::
67
+ # The returned +opts+ value will be a Hash with the observed
68
+ # options as keys and any option arguments as values.
69
+ # +args+::
70
+ # The returned +args+ will be an Array of the unprocessed
71
+ # parameters (if +:posix_order+ was passed in +flags+, this array might
72
+ # contain further options that were not processed after observing a
73
+ # non-option parameters).
74
+ def self.parse(params, options, flags = {})
62
75
  options = _massage_options(options)
63
76
  opts = {}
64
77
  args = []
@@ -67,12 +80,22 @@ module Yawpa
67
80
  param = params[i]
68
81
  if param =~ /^--([^=]+)(?:=(.+))?$/
69
82
  param_name, val = $1, $2
83
+ bool_val = true
70
84
  if options[param_name].nil?
71
- raise ArgumentParsingException.new("Unknown option '#{param_name}'")
85
+ if param_name =~ /^no(.*)$/
86
+ test_param_name = $1
87
+ if options[test_param_name]
88
+ param_name = test_param_name
89
+ bool_val = false
90
+ end
91
+ end
72
92
  end
73
93
  opt_config = options[param_name]
94
+ raise ArgumentParsingException.new("Unknown option '#{param_name}'") unless opt_config
74
95
  param_key = opt_config[:key]
75
- if opt_config[:nargs].last == 0
96
+ if opt_config[:boolean]
97
+ opts[param_key] = bool_val
98
+ elsif opt_config[:nargs].last == 0
76
99
  opts[param_key] = true
77
100
  else
78
101
  opts[param_key] = []
@@ -107,7 +130,7 @@ module Yawpa
107
130
 
108
131
  # Condense 1-element arrays of option values to just the element itself
109
132
  opts.each_key do |k|
110
- if opts[k].class == Array and opts[k].length == 1
133
+ if opts[k].is_a?(Array) and opts[k].length == 1
111
134
  opts[k] = opts[k].first
112
135
  end
113
136
  end
@@ -116,7 +139,7 @@ module Yawpa
116
139
  end
117
140
 
118
141
  # Internal helper method to gather arguments for an option
119
- def _gather(nargs, start_idx, params, initial, param_key, result) # :nodoc:
142
+ def self._gather(nargs, start_idx, params, initial, param_key, result)
120
143
  n_gathered = 0
121
144
  if initial and initial != ''
122
145
  result << initial
@@ -137,26 +160,32 @@ module Yawpa
137
160
  end
138
161
  num_indices_used
139
162
  end
163
+ private_class_method :_gather
140
164
 
141
165
  # Internal helper method to format the options in a consistent format
142
- def _massage_options(options) # :nodoc:
166
+ def self._massage_options(options)
143
167
  {}.tap do |newopts|
144
168
  options.each_pair do |k, v|
169
+ v = {} if v.nil?
170
+ v = {boolean: true} if v == :boolean
145
171
  newkey = k.to_s
146
172
  newopts[newkey] = {key: k}
147
173
  nargs = v[:nargs] || 0
148
- nargs = (nargs..nargs) if nargs.class == Fixnum
174
+ nargs = (nargs..nargs) if nargs.is_a?(Fixnum)
149
175
  newopts[newkey][:nargs] = nargs
150
176
  newopts[newkey][:short] = v[:short] || ''
177
+ newopts[newkey][:boolean] = v[:boolean]
151
178
  end
152
179
  end
153
180
  end
181
+ private_class_method :_massage_options
154
182
 
155
183
  # Internal helper method to find an option configuration by short name
156
- def _find_opt_config_by_short_name(options, short_name) # :nodoc:
184
+ def self._find_opt_config_by_short_name(options, short_name)
157
185
  options.each_pair do |k, v|
158
186
  return v if v[:short] == short_name
159
187
  end
160
188
  nil
161
189
  end
190
+ private_class_method :_find_opt_config_by_short_name
162
191
  end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,7 @@
1
- require 'bundler/setup'
2
- require 'yawpa'
1
+ require "simplecov"
3
2
 
4
- RSpec.configure do |config|
3
+ SimpleCov.start do
4
+ add_filter "/spec/"
5
5
  end
6
+
7
+ require "yawpa"
data/spec/yawpa_spec.rb CHANGED
@@ -1,13 +1,11 @@
1
- require 'spec_helper'
2
-
3
1
  describe Yawpa do
4
- describe 'parse' do
2
+ describe ".parse" do
5
3
  it "returns everything as arguments when no options present" do
6
4
  options = { }
7
5
  params = ['one', 'two', 'three', 'four']
8
6
  opts, args = Yawpa.parse(params, options)
9
- opts.should eq({})
10
- args.should eq(params)
7
+ expect(opts).to eq({})
8
+ expect(args).to eq(params)
11
9
  end
12
10
 
13
11
  it "raises an exception when an invalid option is passed" do
@@ -19,15 +17,15 @@ describe Yawpa do
19
17
  it "returns boolean options which are set" do
20
18
  options = {
21
19
  one: {},
22
- two: {},
20
+ two: nil,
23
21
  three: {},
24
22
  }
25
23
  params = ['--one', 'arg', '--two', 'arg2']
26
24
  opts, args = Yawpa.parse(params, options)
27
- opts.include?(:one).should be_true
28
- opts.include?(:two).should be_true
29
- opts.include?(:three).should be_false
30
- args.should eq(['arg', 'arg2'])
25
+ expect(opts.include?(:one)).to be_truthy
26
+ expect(opts.include?(:two)).to be_truthy
27
+ expect(opts.include?(:three)).to be_falsey
28
+ expect(args).to eq(['arg', 'arg2'])
31
29
  end
32
30
 
33
31
  it "returns an option's value when nargs = 1" do
@@ -36,8 +34,8 @@ describe Yawpa do
36
34
  }
37
35
  params = ['--opt', 'val', 'arg']
38
36
  opts, args = Yawpa.parse(params, options)
39
- opts[:opt].should eq('val')
40
- args.should eq(['arg'])
37
+ expect(opts[:opt]).to eq('val')
38
+ expect(args).to eq(['arg'])
41
39
  end
42
40
 
43
41
  it "returns an option's values when nargs = 2" do
@@ -46,8 +44,8 @@ describe Yawpa do
46
44
  }
47
45
  params = ['--opt', 'val1', 'val2']
48
46
  opts, args = Yawpa.parse(params, options)
49
- opts[:opt].should eq(['val1', 'val2'])
50
- args.should be_empty
47
+ expect(opts[:opt]).to eq(['val1', 'val2'])
48
+ expect(args).to be_empty
51
49
  end
52
50
 
53
51
  it "raises an exception when not enough arguments for an option are given" do
@@ -64,8 +62,8 @@ describe Yawpa do
64
62
  }
65
63
  params = ['--opt=thevalue', 'arg']
66
64
  opts, args = Yawpa.parse(params, options)
67
- opts[:opt].should eq('thevalue')
68
- args.should eq(['arg'])
65
+ expect(opts[:opt]).to eq('thevalue')
66
+ expect(args).to eq(['arg'])
69
67
  end
70
68
 
71
69
  it "uses --opt=val for the first option argument when nargs > 1" do
@@ -74,8 +72,8 @@ describe Yawpa do
74
72
  }
75
73
  params = ['--opt=val1', 'val2', 'arg']
76
74
  opts, args = Yawpa.parse(params, options)
77
- opts[:opt].should eq(['val1', 'val2'])
78
- args.should eq(['arg'])
75
+ expect(opts[:opt]).to eq(['val1', 'val2'])
76
+ expect(args).to eq(['arg'])
79
77
  end
80
78
 
81
79
  it "returns the last set value when an option is passed twice" do
@@ -84,8 +82,8 @@ describe Yawpa do
84
82
  }
85
83
  params = ['--opt', 'val1', 'arg1', '--opt', 'val2', 'arg2']
86
84
  opts, args = Yawpa.parse(params, options)
87
- opts[:opt].should eq('val2')
88
- args.should eq(['arg1', 'arg2'])
85
+ expect(opts[:opt]).to eq('val2')
86
+ expect(args).to eq(['arg1', 'arg2'])
89
87
  end
90
88
 
91
89
  it "accepts strings as keys for option configuration" do
@@ -94,8 +92,8 @@ describe Yawpa do
94
92
  }
95
93
  params = ['xxx', '--crazy-option', 'yyy', 'zzz']
96
94
  opts, args = Yawpa.parse(params, options)
97
- opts['crazy-option'].should eq('yyy')
98
- args.should eq(['xxx', 'zzz'])
95
+ expect(opts['crazy-option']).to eq('yyy')
96
+ expect(args).to eq(['xxx', 'zzz'])
99
97
  end
100
98
 
101
99
  it "accepts short options corresponding to a long option" do
@@ -104,8 +102,8 @@ describe Yawpa do
104
102
  }
105
103
  params = ['-o', 'qqq']
106
104
  opts, args = Yawpa.parse(params, options)
107
- opts[:option].should be_true
108
- args.should eq(['qqq'])
105
+ expect(opts[:option]).to be_truthy
106
+ expect(args).to eq(['qqq'])
109
107
  end
110
108
 
111
109
  it "returns option argument at next position for a short option" do
@@ -114,8 +112,8 @@ describe Yawpa do
114
112
  }
115
113
  params = ['-o', 'val', 'rrr']
116
114
  opts, args = Yawpa.parse(params, options)
117
- opts[:option].should eq('val')
118
- args.should eq(['rrr'])
115
+ expect(opts[:option]).to eq('val')
116
+ expect(args).to eq(['rrr'])
119
117
  end
120
118
 
121
119
  it "returns option argument immediately following short option" do
@@ -124,8 +122,8 @@ describe Yawpa do
124
122
  }
125
123
  params = ['-oval', 'rrr']
126
124
  opts, args = Yawpa.parse(params, options)
127
- opts[:option].should eq('val')
128
- args.should eq(['rrr'])
125
+ expect(opts[:option]).to eq('val')
126
+ expect(args).to eq(['rrr'])
129
127
  end
130
128
 
131
129
  it "handles globbed-together short options" do
@@ -137,11 +135,11 @@ describe Yawpa do
137
135
  }
138
136
  params = ['-abc', 'xyz']
139
137
  opts, args = Yawpa.parse(params, options)
140
- opts[:a].should be_true
141
- opts[:b].should be_true
142
- opts[:c].should be_true
143
- opts[:d].should be_nil
144
- args.should eq(['xyz'])
138
+ expect(opts[:a]).to be_truthy
139
+ expect(opts[:b]).to be_truthy
140
+ expect(opts[:c]).to be_truthy
141
+ expect(opts[:d]).to be_nil
142
+ expect(args).to eq(['xyz'])
145
143
  end
146
144
 
147
145
  it "handles globbed-together short options with values following" do
@@ -153,11 +151,11 @@ describe Yawpa do
153
151
  }
154
152
  params = ['-abcfoo', 'bar']
155
153
  opts, args = Yawpa.parse(params, options)
156
- opts[:a].should be_true
157
- opts[:b].should be_true
158
- opts[:c].should eq('foo')
159
- opts[:d].should be_nil
160
- args.should eq(['bar'])
154
+ expect(opts[:a]).to be_truthy
155
+ expect(opts[:b]).to be_truthy
156
+ expect(opts[:c]).to eq('foo')
157
+ expect(opts[:d]).to be_nil
158
+ expect(args).to eq(['bar'])
161
159
  end
162
160
 
163
161
  it "handles globbed-together short options with multiple values following" do
@@ -169,11 +167,11 @@ describe Yawpa do
169
167
  }
170
168
  params = ['-abcfoo', 'bar', 'baz']
171
169
  opts, args = Yawpa.parse(params, options)
172
- opts[:a].should be_true
173
- opts[:b].should be_true
174
- opts[:c].should eq(['foo', 'bar', 'baz'])
175
- opts[:d].should be_nil
176
- args.should be_empty
170
+ expect(opts[:a]).to be_truthy
171
+ expect(opts[:b]).to be_truthy
172
+ expect(opts[:c]).to eq(['foo', 'bar', 'baz'])
173
+ expect(opts[:d]).to be_nil
174
+ expect(args).to be_empty
177
175
  end
178
176
 
179
177
  it "raises an error on an unknown short option" do
@@ -198,20 +196,39 @@ describe Yawpa do
198
196
  }
199
197
  params = ['--option', 'VALUE', '-o', 'NEW_VALUE']
200
198
  opts, args = Yawpa.parse(params, options)
201
- opts[:option].should eq('NEW_VALUE')
202
- args.should be_empty
199
+ expect(opts[:option]).to eq('NEW_VALUE')
200
+ expect(args).to be_empty
203
201
  end
204
202
 
205
203
  it "ignores options after arguments in posix_order mode" do
206
204
  options = {
207
205
  one: {},
208
- two: {},
206
+ two: nil,
209
207
  }
210
208
  params = ['--one', 'arg', '--two']
211
209
  opts, args = Yawpa.parse(params, options, posix_order: true)
212
- opts[:one].should be_true
213
- opts[:two].should be_false
214
- args.should eq(['arg', '--two'])
210
+ expect(opts[:one]).to be_truthy
211
+ expect(opts[:two]).to be_falsey
212
+ expect(args).to eq(['arg', '--two'])
213
+ end
214
+
215
+ it "supports :boolean option flag" do
216
+ options = {
217
+ push: :boolean,
218
+ pull: {boolean: true},
219
+ }
220
+
221
+ opts, args = Yawpa.parse(%w[hi], options)
222
+ expect(opts).to eq({})
223
+ expect(args).to eq(%w[hi])
224
+
225
+ opts, args = Yawpa.parse(%w[--push one two], options)
226
+ expect(opts).to eq(push: true)
227
+ expect(args).to eq(%w[one two])
228
+
229
+ opts, args = Yawpa.parse(%w[arg --nopush --pull], options)
230
+ expect(opts).to eq(push: false, pull: true)
231
+ expect(args).to eq(%w[arg])
215
232
  end
216
233
  end
217
234
  end
data/yawpa.gemspec CHANGED
@@ -15,5 +15,10 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = Yawpa::VERSION
17
17
 
18
- gem.add_development_dependency 'rspec'
18
+ gem.add_development_dependency "rspec"
19
+ gem.add_development_dependency "simplecov"
20
+ gem.add_development_dependency "rake"
21
+ gem.add_development_dependency "rdoc"
22
+ gem.add_development_dependency "yard"
23
+ gem.add_development_dependency "redcarpet"
19
24
  end
metadata CHANGED
@@ -1,18 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yawpa
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Josh Holtrop
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-05-02 00:00:00.000000000 Z
12
+ date: 2014-06-25 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: rspec
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
19
  - - ! '>='
18
20
  - !ruby/object:Gem::Version
@@ -20,6 +22,87 @@ dependencies:
20
22
  type: :development
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: simplecov
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
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: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
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: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rdoc
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: yard
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: redcarpet
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
23
106
  requirements:
24
107
  - - ! '>='
25
108
  - !ruby/object:Gem::Version
@@ -35,9 +118,10 @@ files:
35
118
  - .gitignore
36
119
  - .rspec
37
120
  - Gemfile
121
+ - Gemfile.lock
38
122
  - LICENSE
39
123
  - README.md
40
- - Rakefile
124
+ - Rakefile.rb
41
125
  - lib/yawpa.rb
42
126
  - lib/yawpa/version.rb
43
127
  - spec/spec_helper.rb
@@ -45,27 +129,35 @@ files:
45
129
  - yawpa.gemspec
46
130
  homepage: ''
47
131
  licenses: []
48
- metadata: {}
49
132
  post_install_message:
50
133
  rdoc_options: []
51
134
  require_paths:
52
135
  - lib
53
136
  required_ruby_version: !ruby/object:Gem::Requirement
137
+ none: false
54
138
  requirements:
55
139
  - - ! '>='
56
140
  - !ruby/object:Gem::Version
57
141
  version: '0'
142
+ segments:
143
+ - 0
144
+ hash: 77772525
58
145
  required_rubygems_version: !ruby/object:Gem::Requirement
146
+ none: false
59
147
  requirements:
60
148
  - - ! '>='
61
149
  - !ruby/object:Gem::Version
62
150
  version: '0'
151
+ segments:
152
+ - 0
153
+ hash: 77772525
63
154
  requirements: []
64
155
  rubyforge_project:
65
- rubygems_version: 2.0.3
156
+ rubygems_version: 1.8.23.2
66
157
  signing_key:
67
- specification_version: 4
158
+ specification_version: 3
68
159
  summary: Yet Another Way to Parse Arguments
69
160
  test_files:
70
161
  - spec/spec_helper.rb
71
162
  - spec/yawpa_spec.rb
163
+ has_rdoc:
checksums.yaml DELETED
@@ -1,15 +0,0 @@
1
- ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NDQxOWYxMWMwMjA3NjU5NjlkOTQ4MTFkM2Y3OTZkNTI5MGVjNzJiZg==
5
- data.tar.gz: !binary |-
6
- YzQ1NGE3MDM1MjJkNjRiMjM0MTJjMDFiNmRmNmVhODJiZWNmMjVlMQ==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- MTdjNTBkMTM5NDY5MmNjMTYwY2VmNmU4NjRhMjM0MjVjYTM3YjM3MTY0OWY3
10
- MjY4M2U1NTI5ZTZlZmM3N2E2MDU2YmE3MTBiYzEyZWQxODA5NzEwOTA2YjM3
11
- ZDMwNzQzNmJhOTRhN2FlZGZjNDFiNDYyYWM0OTQ4NmNlMjZhNTk=
12
- data.tar.gz: !binary |-
13
- OWExNTUyNmE4ODM1YTFiNWMwNTg4YjdmMTU1MWJiOTM2ZmUxNmFiMjc3ZjI1
14
- YWQxMWU1ZTU2MjZjMTA0NTc2MmFjOWJkOWVhMjk4ZDdlMmQ3ZDk0ZDI2M2Vl
15
- MzI0NmQ5YmEyNTA3NGIxMjdhYjE4ZTYxZjIzYTgwMDI4YmUxY2I=
data/Rakefile DELETED
@@ -1,13 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require 'rspec/core/rake_task'
3
- require "rdoc/task"
4
-
5
- RSpec::Core::RakeTask.new('spec')
6
-
7
- task :default => :spec
8
-
9
- Rake::RDocTask.new(:rdoc) do |rdoc|
10
- rdoc.rdoc_dir = 'rdoc'
11
- rdoc.title = 'Yet Another Way to Parse Arguments'
12
- rdoc.rdoc_files.include('lib/**/*.rb')
13
- end