slop 1.6.1 → 1.7.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/CHANGES.md CHANGED
@@ -1,3 +1,10 @@
1
+ 1.7.0 (2011-06-06)
2
+ ------------------
3
+
4
+ * Feature: Autocreate (auto create options at parse time, making assumptions)
5
+ * Feature: When parsing options as arrays, push multiple arguments into a
6
+ single array
7
+
1
8
  1.6.1 (2011-06-01)
2
9
  ------------------
3
10
 
data/README.md CHANGED
@@ -193,26 +193,8 @@ You can of course also parse lists into options. Here's how:
193
193
  # ARGV is `--people lee,john,bill`
194
194
  opts[:people] #=> ['lee', 'john', 'bill']
195
195
 
196
- You can also change both the split delimiter and limit
197
-
198
- opts = Slop.parse do
199
- opt :people, true, :as => Array, :delimiter => ':', :limit => 2)
200
- end
201
-
202
- # ARGV is `--people lee:injekt:bob`
203
- opts[:people] #=> ["lee", "injekt:bob"]
204
-
205
- Ranges
206
- ------
207
-
208
- What would Slop be if it didn't know what ranges were?
209
-
210
- opts = Slop.parse do
211
- opt :r, :range, true, :as => Range
212
- end
213
-
214
- # ARGV is `--range 1..10` or 1-10, or 1,10 (yes Slop supports them all)
215
- opts[:range].to_a #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
196
+ Slop supports a few styles of list parsing. Check out
197
+ [this wiki page](https://github.com/injekt/slop/wiki/Lists) for more info.
216
198
 
217
199
  Smart
218
200
  -----
@@ -278,6 +260,14 @@ Here's how commands might look:
278
260
  * `run.rb -v #=> version 1`
279
261
  * `run.rb clean -v #=> Enabled verbose mode for clean`
280
262
 
263
+ Features
264
+ --------
265
+
266
+ Check out the following wiki pages for more features:
267
+
268
+ * [Ranges](https://github.com/injekt/slop/wiki/Ranges)
269
+ * [Auto Create](https://github.com/injekt/slop/wiki/Auto-Create)
270
+
281
271
  Woah woah, why you hating on OptionParser?
282
272
  ------------------------------------------
283
273
 
@@ -314,4 +304,4 @@ thing in Slop:
314
304
  on :a, :age, 'Your age', true, :as => :int
315
305
  end
316
306
 
317
- opts.to_hash(true) #=> { :name => 'lee', :age => 105 }
307
+ opts.to_hash(true) #=> { :name => 'lee', :age => 105 }
@@ -16,7 +16,7 @@ class Slop
16
16
  class InvalidOptionError < RuntimeError; end
17
17
 
18
18
  # @return [String] The current version string
19
- VERSION = '1.6.1'
19
+ VERSION = '1.7.0'
20
20
 
21
21
  # Parses the items from a CLI format into a friendly object.
22
22
  #
@@ -71,6 +71,8 @@ class Slop
71
71
  # @option opts [Boolean] :ignore_case (false) Ignore options case
72
72
  # @option opts [Proc, #call] :on_noopts Trigger an event when no options
73
73
  # are found
74
+ # @option opts [Boolean] :autocreate (false) Autocreate options depending
75
+ # on the Array passed to {parse}
74
76
  def initialize(*opts, &block)
75
77
  sloptions = opts.last.is_a?(Hash) ? opts.pop : {}
76
78
  sloptions[:banner] = opts.shift if opts[0].respond_to? :to_str
@@ -86,6 +88,7 @@ class Slop
86
88
  @strict = sloptions[:strict]
87
89
  @ignore_case = sloptions[:ignore_case]
88
90
  @multiple_switches = sloptions[:multiple_switches]
91
+ @autocreate = sloptions[:autocreate]
89
92
  @on_empty = sloptions[:on_empty]
90
93
  @on_noopts = sloptions[:on_noopts] || sloptions[:on_optionless]
91
94
  @sloptions = sloptions
@@ -327,6 +330,7 @@ class Slop
327
330
  items.each_with_index do |item, index|
328
331
  item = item.to_s
329
332
  flag = item.sub(/\A--?/, '')
333
+ autocreate(flag, index, items) if @autocreate
330
334
  option, argument = extract_option(item, flag)
331
335
  next if @multiple_switches
332
336
 
@@ -439,6 +443,13 @@ class Slop
439
443
  end
440
444
  end
441
445
 
446
+ def autocreate(flag, index, items)
447
+ return if present? flag
448
+ short, long = clean_options Array(flag)
449
+ arg = (items[index + 1] && items[index + 1] !~ /\A--?/)
450
+ @options << Option.new(self, short, long, nil, arg, {})
451
+ end
452
+
442
453
  def clean_options(args)
443
454
  options = []
444
455
 
@@ -22,12 +22,7 @@ class Slop
22
22
  attr_reader :help
23
23
 
24
24
  # @return [Boolean] true if this options argument value has been forced
25
- attr_reader :forced
26
-
27
- # @overload argument_value=(value)
28
- # Set this options argument value
29
- # @param [Object] value The value you'd like applied to this option
30
- attr_writer :argument_value
25
+ attr_accessor :forced
31
26
 
32
27
  # @return [Integer] The amount of times this option has been invoked
33
28
  attr_accessor :count
@@ -61,6 +56,7 @@ class Slop
61
56
  @delimiter = options.fetch(:delimiter, ',')
62
57
  @limit = options.fetch(:limit, 0)
63
58
  @help = options.fetch(:help, true)
59
+ @argument_type = options[:as].to_s.downcase
64
60
 
65
61
  @forced = false
66
62
  @argument_value = nil
@@ -87,6 +83,24 @@ class Slop
87
83
  @long_flag || @short_flag
88
84
  end
89
85
 
86
+ # Set this options argument value.
87
+ #
88
+ # If this options argument type is expected to be an Array, this
89
+ # method will split the value and concat elements into the original
90
+ # argument value
91
+ #
92
+ # @param [Object] value The value to set this options argument to
93
+ def argument_value=(value)
94
+ if @argument_type == 'array'
95
+ @argument_value ||= []
96
+ if value.respond_to?(:to_str)
97
+ @argument_value.concat value.split(@delimiter, @limit)
98
+ end
99
+ else
100
+ @argument_value = value
101
+ end
102
+ end
103
+
90
104
  # @return [Object] the argument value after it's been cast
91
105
  # according to the `:as` option
92
106
  def argument_value
@@ -94,8 +108,8 @@ class Slop
94
108
  value = @argument_value || @options[:default]
95
109
  return if value.nil?
96
110
 
97
- case @options[:as].to_s.downcase
98
- when 'array'; value.split @delimiter, @limit
111
+ case @argument_type
112
+ when 'array'; @argument_value
99
113
  when 'range'; value_to_range value
100
114
  when 'float'; value.to_s.to_f
101
115
  when 'string', 'str'; value.to_s
@@ -159,7 +173,7 @@ class Slop
159
173
  # @return [String]
160
174
  def inspect
161
175
  "#<Slop::Option short_flag=#{@short_flag.inspect} " +
162
- "long_flag=#{@long_flag.inspect} " +
176
+ "long_flag=#{@long_flag.inspect} argument=#{@argument.inspect} " +
163
177
  "description=#{@description.inspect}>"
164
178
  end
165
179
 
@@ -1,9 +1,6 @@
1
- $:.push File.expand_path('../lib', __FILE__)
2
- require 'slop'
3
-
4
1
  Gem::Specification.new do |s|
5
2
  s.name = 'slop'
6
- s.version = Slop::VERSION
3
+ s.version = '1.7.0'
7
4
  s.summary = 'Option gathering made easy'
8
5
  s.description = 'A simple DSL for gathering options and parsing the command line'
9
6
  s.author = 'Lee Jarvis'
@@ -6,11 +6,6 @@ end
6
6
  require 'minitest/autorun'
7
7
  require 'stringio'
8
8
 
9
- begin
10
- require 'turn'
11
- rescue LoadError
12
- end
13
-
14
9
  class TestCase < MiniTest::Unit::TestCase
15
10
  def self.test(name, &block)
16
11
  test_name = "test_#{name.gsub(/\s+/, '_')}".to_sym
@@ -384,4 +384,27 @@ class SlopTest < TestCase
384
384
  opts.parse %w/--NAME lee/
385
385
  assert_equal 'lee', opts[:name]
386
386
  end
387
+
388
+ test 'autocreating options' do
389
+ opts = Slop.new(:autocreate => true) do |o|
390
+ o.on '--lorem', true
391
+ end
392
+ opts.parse %w/--hello --foo bar -a --lorem ipsum/
393
+
394
+ assert opts.hello?
395
+ assert opts.foo?
396
+ assert_equal 'bar', opts[:foo]
397
+ assert opts.a?
398
+ assert_equal 'ipsum', opts[:lorem]
399
+ end
400
+
401
+ test 'multiple elements for array option' do
402
+ opts = Slop.new do
403
+ on :a, true, :as => Array
404
+ end
405
+ opts.parse %w/-a foo -a bar baz -a etc/
406
+
407
+ assert_equal %w/foo bar etc/, opts[:a]
408
+ end
409
+
387
410
  end
metadata CHANGED
@@ -1,13 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slop
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
5
4
  prerelease:
6
- segments:
7
- - 1
8
- - 6
9
- - 1
10
- version: 1.6.1
5
+ version: 1.7.0
11
6
  platform: ruby
12
7
  authors:
13
8
  - Lee Jarvis
@@ -15,8 +10,7 @@ autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
12
 
18
- date: 2011-06-01 00:00:00 +01:00
19
- default_executable:
13
+ date: 2011-06-06 00:00:00 Z
20
14
  dependencies: []
21
15
 
22
16
  description: A simple DSL for gathering options and parsing the command line
@@ -43,7 +37,6 @@ files:
43
37
  - test/helper.rb
44
38
  - test/option_test.rb
45
39
  - test/slop_test.rb
46
- has_rdoc: true
47
40
  homepage: http://github.com/injekt/slop
48
41
  licenses: []
49
42
 
@@ -57,23 +50,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
57
50
  requirements:
58
51
  - - ">="
59
52
  - !ruby/object:Gem::Version
60
- hash: 3
61
- segments:
62
- - 0
63
53
  version: "0"
64
54
  required_rubygems_version: !ruby/object:Gem::Requirement
65
55
  none: false
66
56
  requirements:
67
57
  - - ">="
68
58
  - !ruby/object:Gem::Version
69
- hash: 3
70
- segments:
71
- - 0
72
59
  version: "0"
73
60
  requirements: []
74
61
 
75
62
  rubyforge_project:
76
- rubygems_version: 1.6.0
63
+ rubygems_version: 1.8.2
77
64
  signing_key:
78
65
  specification_version: 3
79
66
  summary: Option gathering made easy