slop 1.2.1 → 1.3.0

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/.yardopts CHANGED
@@ -1,5 +1,5 @@
1
1
  --hide-void-return
2
2
  -m markdown
3
- --title "slop"
3
+ --title "Slop - Option gathering made easy"
4
4
  lib/**/*.rb
5
5
  --no-private
data/README.md CHANGED
@@ -98,6 +98,31 @@ Shortcut:
98
98
  ...
99
99
  end
100
100
 
101
+ Parsing
102
+ -------
103
+
104
+ Slop's pretty good at parsing, let's take a look at what it'll extract for you
105
+
106
+ Slop.parse do
107
+ on 's', 'server', true
108
+ on 'p', 'port', true, :as => :integer
109
+ on 'username', true, :matches => /[^a-zA-Z]+$/
110
+ on 'password', true
111
+ end
112
+
113
+ Now throw some options at it:
114
+
115
+ -s ftp://foobar.com -p1234 --username=FooBar --password 'hello there'
116
+
117
+ Here's what we'll get back
118
+
119
+ {
120
+ :server=>"ftp://foobar.com",
121
+ :port=>1234,
122
+ :username=>"FooBar",
123
+ :password=>"hello there"
124
+ }
125
+
101
126
  Callbacks
102
127
  ---------
103
128
 
@@ -217,7 +242,7 @@ You can also change both the split delimiter and limit
217
242
  Strict Mode
218
243
  -----------
219
244
 
220
- Passing `strict => true` to `Slop.parse` causes it to raise a `Slop::InvalidOptionError`
245
+ Passing `strict => true` to `Slop.parse` causes it to raise a `Slop::InvalidOptionError`
221
246
  when an invalid option is found (`false` by default):
222
247
 
223
248
  Slop.new(:strict => true).parse(%w/--foo/)
@@ -230,12 +255,13 @@ and it handles multiple invalid options with a sprinkling of pluralization:
230
255
 
231
256
  Significantly, however, Slop will still parse the valid options:
232
257
 
233
- begin
234
- slop = Slop.new(:strict => true, :help => true) do
235
- banner "Usage:\n\t./awesome_sauce [options]\n\nOptions:"
236
- on :n, :name, 'Your name'
237
- end
238
- slop.parse(%w/--foo --bar -z/)
258
+ slop = Slop.new(:strict => true, :help => true) do
259
+ banner "Usage:\n\t./awesome_sauce [options]\n\nOptions:"
260
+ on :n, :name, 'Your name'
261
+ end
262
+
263
+ begin
264
+ slop.parse(%w/--foo --bar -z/)
239
265
  rescue Slop::InvalidOptionError => e
240
266
  puts "\n#{e.message}\n\n"
241
267
  puts slop
@@ -11,8 +11,6 @@ class Slop
11
11
  # Parses the items from a CLI format into a friendly object.
12
12
  #
13
13
  # @param [Array] items Items to parse into options.
14
- # @yield Specify available CLI arguments using Slop# methods such as Slop#banner and Slop#option
15
- # @return [Slop] Returns an instance of Slop.
16
14
  # @example Specifying three options to parse:
17
15
  # opts = Slops.parse do
18
16
  # on :v, :verbose, 'Enable verbose mode'
@@ -21,15 +19,13 @@ class Slop
21
19
  # end
22
20
  # -------
23
21
  # program.rb --verbose -n 'Emily' -a 25
24
- # @see Slop#banner
25
- # @see Slop#option
22
+ # @return [Slop] Returns an instance of Slop.
26
23
  def self.parse(items=ARGV, options={}, &block)
27
24
  initialize_and_parse(items, false, options, &block)
28
25
  end
29
26
 
30
27
  # Identical to {Slop.parse}, but removes parsed options from the original Array.
31
28
  #
32
- # @yield Specify available CLI arguments using Slop# methods such as Slop#banner and Slop#option
33
29
  # @return [Slop] Returns an instance of Slop.
34
30
  def self.parse!(items=ARGV, options={}, &block)
35
31
  initialize_and_parse(items, true, options, &block)
@@ -67,12 +63,11 @@ class Slop
67
63
  # Set or return banner text.
68
64
  #
69
65
  # @param [String] text Displayed banner text.
70
- # @return [String] Returns current banner.
71
66
  # @example
72
67
  # opts = Slop.parse do
73
68
  # banner "Usage - ruby foo.rb [arguments]"
74
69
  # end
75
- # @see Slop#to_s
70
+ # @return [String] Returns current banner.
76
71
  def banner(text=nil)
77
72
  @banner = text if text
78
73
  @banner
@@ -101,14 +96,12 @@ class Slop
101
96
  # Return the value of an option via the subscript operator.
102
97
  #
103
98
  # @param [Symbol] key Option symbol.
104
- # @return [Object] Returns the object associated with that option.
105
99
  # @example
106
- # opts[:name]
107
- # #=> "Emily"
108
- # @see Slop#method_missing
100
+ # opts[:name] #=> "Emily"
101
+ # @return [Object] Returns the value associated with that option.
109
102
  def [](key)
110
103
  option = @options[key]
111
- option ? option.argument_value : nil
104
+ option.argument_value if option
112
105
  end
113
106
 
114
107
  # Specify an option with a short or long version, description and type.
@@ -122,14 +115,15 @@ class Slop
122
115
  # @example
123
116
  # opts = Slop.parse do
124
117
  # on :n, :name, 'Your username', true # Required argument
125
- # on :a, :age, 'Your age (optional)', :optional => true # Optional argument
126
- # on :g, :gender, 'Your gender', :optional => false # Required argument
127
- # on :V, :verbose, 'Run in verbose mode', :default => true # Runs verbose mode by default
128
- # on :P, :people, 'Your friends', true, :as => Array # Required, list of people.
118
+ # on :a, :age, 'Your age (optional)', :optional => true
119
+ # on :g, :gender, 'Your gender', :optional => false
120
+ # on :V, :verbose, 'Run in verbose mode', :default => true
121
+ # on :P, :people, 'Your friends', true, :as => Array
129
122
  # on :h, :help, 'Print this help screen' do
130
123
  # puts help
131
- # end # Runs a block
124
+ # end
132
125
  # end
126
+ # @return [Slop::Option]
133
127
  def option(*args, &block)
134
128
  options = args.pop if args.last.is_a?(Hash)
135
129
  options ||= {}
@@ -145,14 +139,12 @@ class Slop
145
139
 
146
140
  # Returns the parsed list into a option/value hash.
147
141
  #
148
- # @return [Hash] Returns a hash with each specified option as a symbolic key with an associated value.
149
142
  # @example
150
- # opts.to_hash
151
- # #=> { 'name' => 'Emily' }
143
+ # opts.to_hash #=> { 'name' => 'Emily' }
152
144
  #
153
145
  # # symbols!
154
- # opts.to_hash(true)
155
- # #=> { :name => 'Emily' }
146
+ # opts.to_hash(true) #=> { :name => 'Emily' }
147
+ # @return [Hash]
156
148
  def to_hash(symbols=nil)
157
149
  @options.to_hash(symbols)
158
150
  end
@@ -160,29 +152,25 @@ class Slop
160
152
 
161
153
  # Allows you to check whether an option was specified in the parsed list.
162
154
  #
163
- # @return [Boolean] Whether the desired option was specified.
164
155
  # @example
165
156
  # #== ruby foo.rb -v
166
- # opts.verbose?
167
- # #=> true
168
- # opts.name?
169
- # #=> false
170
- # @see Slop#[]
157
+ # opts.verbose? #=> true
158
+ # opts.name? #=> false
159
+ # @return [Boolean] Whether the desired option was specified.
171
160
  def method_missing(meth, *args, &block)
172
- meth.to_s[/\?$/] ? !!self[meth.to_s.chomp('?')] : super
161
+ super unless meth.to_s =~ /\?\z/
162
+ !!self[meth.to_s.chomp '?']
173
163
  end
174
164
 
175
165
  # Returns the banner followed by available options listed on the next line.
176
166
  #
177
- # @return [String] Help text.
178
167
  # @example
179
168
  # opts = Slop.parse do
180
169
  # banner "Usage - ruby foo.rb [arguments]"
181
170
  # on :v, :verbose, "Enable verbose mode"
182
171
  # end
183
- # opts.to_s
184
- # #=> "Usage - ruby foo.rb [options]\n -v, --verbose Enable verbose mode"
185
- # @see Slop#banner
172
+ # puts opts
173
+ # @return [String] Help text.
186
174
  def to_s
187
175
  banner = "#{@banner}\n" if @banner
188
176
  (banner || '') + options.to_help
@@ -210,18 +198,22 @@ private
210
198
  flag = item.sub(/^--?/, '')
211
199
  option = @options[flag]
212
200
 
213
- if !option && item =~ /^-[^-]/
214
- flag, argument = flag.split('', 2)
215
- option = @options[flag]
216
- elsif !option && item =~ /--no-(.+)$/
217
- if option = @options[$1]
218
- option.force_argument_value false
219
- next
201
+ unless option
202
+ case item
203
+ when /\A-[^-]/
204
+ flag, argument = flag.split('', 2)
205
+ option = @options[flag]
206
+ when /\A--([^=]+)=(.+)\z/
207
+ option = @options[$1]
208
+ argument = $2
209
+ when /\A--no-(.+)\z/
210
+ option.force_argument_value(false) if option = @options[$1]
220
211
  end
221
212
  end
222
213
 
223
214
  if option
224
215
  trash << item
216
+ next if option.forced?
225
217
  option.argument_value = true
226
218
 
227
219
  if option.expects_argument? || option.accepts_optional_argument?
@@ -267,13 +259,13 @@ private
267
259
  end
268
260
 
269
261
  def check_invalid_option(item, flag)
270
- @invalid_options << flag if item[/^--?/] && @strict
262
+ @invalid_options << flag if item[/\A--?/] && @strict
271
263
  end
272
264
 
273
265
  def clean_options(args)
274
266
  options = []
275
267
 
276
- short = args.first.to_s.sub(/^--?/, '')
268
+ short = args.first.to_s.sub(/\A--?/, '')
277
269
  if short.size == 1
278
270
  options.push short
279
271
  args.shift
@@ -284,7 +276,7 @@ private
284
276
  long = args.first
285
277
  boolean = long.is_a?(TrueClass) || long.is_a?(FalseClass)
286
278
  if !boolean && long.to_s =~ /\A(--?)?[a-zA-Z0-9_-]+\z/
287
- options.push args.shift.to_s.sub(/^--?/, '')
279
+ options.push args.shift.to_s.sub(/\A--?/, '')
288
280
  else
289
281
  options.push nil
290
282
  end
@@ -302,5 +294,4 @@ private
302
294
  message << ' -- ' << @invalid_options.map { |o| "'#{o}'" }.join(', ')
303
295
  raise InvalidOptionError, message
304
296
  end
305
-
306
297
  end
@@ -17,7 +17,7 @@ class Slop
17
17
  # @return [Option] the option assoiated with this flag
18
18
  def [](flag)
19
19
  item = flag.to_s
20
- if item =~ /^\d+$/
20
+ if item =~ /\A\d+\z/
21
21
  slice item.to_i
22
22
  else
23
23
  find do |option|
@@ -28,7 +28,7 @@ class Slop
28
28
 
29
29
  # @return [String]
30
30
  def to_help
31
- heads = select {|x| !x.tail }
31
+ heads = reject {|x| x.tail }
32
32
  tails = select {|x| x.tail }
33
33
  (heads + tails).map(&:to_s).join("\n")
34
34
  end
@@ -76,11 +76,15 @@ class Slop
76
76
  @long_flag = long
77
77
  @description = description
78
78
  @options = options
79
+
79
80
  @expects_argument = argument
80
81
  @expects_argument = true if options[:optional] == false
82
+
81
83
  @tail = options[:tail]
82
84
  @match = options[:match]
85
+
83
86
  @forced = false
87
+ @argument_value = nil
84
88
 
85
89
  @delimiter = options[:delimiter] || ','
86
90
  @limit = options[:limit] || 0
@@ -91,7 +95,6 @@ class Slop
91
95
 
92
96
  @callback = blk if block_given?
93
97
  @callback ||= options[:callback]
94
- @argument_value = nil
95
98
  end
96
99
 
97
100
  # @return [Boolean] true if this option expects an argument
@@ -109,16 +112,11 @@ class Slop
109
112
  @long_flag || @short_flag
110
113
  end
111
114
 
112
- # @return [Object]
113
- def default
114
- @options[:default]
115
- end
116
-
117
115
  # @return [Object] the argument value after it's been case
118
116
  # according to the `:as` option
119
117
  def argument_value
120
118
  return @argument_value if @forced
121
- value = @argument_value || default
119
+ value = @argument_value || @options[:default]
122
120
 
123
121
  case @options[:as].to_s.downcase
124
122
  when 'array'
@@ -141,6 +139,10 @@ class Slop
141
139
  @forced = true
142
140
  end
143
141
 
142
+ def forced?
143
+ @forced
144
+ end
145
+
144
146
  def to_s
145
147
  out = " "
146
148
  out += @short_flag ? "-#{@short_flag}, " : ' ' * 4
@@ -1,3 +1,3 @@
1
1
  class Slop
2
- VERSION = '1.2.1'
2
+ VERSION = '1.3.0'
3
3
  end
@@ -101,6 +101,12 @@ class SlopTest < TestCase
101
101
  assert_empty items
102
102
  end
103
103
 
104
+ test '#parse! removes parsed items prefixed with --no-' do
105
+ items = %w/--no-foo/
106
+ Slop.new { |opt| opt.on :foo }.parse!(items)
107
+ assert_empty items
108
+ end
109
+
104
110
  test 'the shit out of clean_options' do
105
111
  assert_equal(
106
112
  ['s', 'short', 'short option', false],
@@ -245,4 +251,13 @@ class SlopTest < TestCase
245
251
  refute slop[:verbose]
246
252
  refute slop[:debug]
247
253
  end
254
+
255
+ test 'option=value' do
256
+ slop = Slop.new
257
+ slop.opt :n, :name, true
258
+ slop.parse %w/--name=lee/
259
+
260
+ assert_equal 'lee', slop[:name]
261
+ assert slop.name?
262
+ end
248
263
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: slop
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.2.1
5
+ version: 1.3.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Lee Jarvis
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-03-24 00:00:00 +00:00
13
+ date: 2011-03-28 00:00:00 +01:00
14
14
  default_executable:
15
15
  dependencies: []
16
16