config_parser 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/History CHANGED
@@ -1,3 +1,9 @@
1
+ == 0.3.0 / 2010-10-02
2
+
3
+ * Cleanup of some variable and option names
4
+ * Removed limits on lists
5
+ * Updated to bundler 1.0
6
+
1
7
  == 0.2.0 / 2010-08-01
2
8
 
3
9
  Release candidate with cleaner implementation and accurate documentation.
data/lib/config_parser.rb CHANGED
@@ -64,12 +64,12 @@ class ConfigParser
64
64
 
65
65
  # Registers the option with self by adding it to the registry and mapping
66
66
  # the option flags into options. Raises an error for conflicting flags.
67
- # Returns self.
67
+ # Returns option.
68
68
  #
69
69
  # If override is specified, options with conflicting flags are removed and
70
70
  # no error is raised. Note that this may remove multiple options.
71
71
  def register(option, override=false)
72
- return if option.nil?
72
+ return nil if option.nil?
73
73
 
74
74
  if override
75
75
  existing = option.flags.collect {|flag| @options.delete(flag) }
@@ -90,14 +90,41 @@ class ConfigParser
90
90
  @options[flag] = option
91
91
  end
92
92
 
93
- self
93
+ option
94
94
  end
95
95
 
96
96
  # Unregisters the option by removing it from the registry and options.
97
- # Returns self.
97
+ # Returns option.
98
98
  def unregister(option)
99
99
  @registry.delete(option)
100
100
  @options.delete_if {|key, value| option == value }
101
+ option
102
+ end
103
+
104
+ # Sorts options in the registry as specified by the block. Groups of
105
+ # options as delimited by separators are sorted independently. If no
106
+ # block is given, options are sorted by their long and short keys.
107
+ def sort_opts!(&block)
108
+ block ||= lambda {|option| option.long || option.short }
109
+
110
+ splits = []
111
+ current = []
112
+
113
+ options = self.options.values.uniq
114
+ registry.each do |option|
115
+ if options.include?(option)
116
+ current << option
117
+ else
118
+ splits << current
119
+ splits << option
120
+ current = []
121
+ end
122
+ end
123
+
124
+ splits << current
125
+ @registry = splits.collect {|split| split.kind_of?(Array) ? split.sort_by(&block) : split }
126
+ @registry.flatten!
127
+
101
128
  self
102
129
  end
103
130
 
@@ -142,23 +169,19 @@ class ConfigParser
142
169
  # If this is too ambiguous (and at times it is), provide a trailing hash
143
170
  # defining all or part of the option:
144
171
  #
145
- # psr.on('-k', 'description', :long => '--key', :type => :list) do |args|
172
+ # psr.on('-k', 'description', :long => '--key', :option_type => :list) do |args|
146
173
  # # ...
147
174
  # end
148
175
  #
149
176
  # The trailing hash wins if there is any overlap in the parsed attributes
150
177
  # and those provided by the hash.
151
178
  def on(*args, &block)
152
- option = new_option(args, &block)
153
- register option
154
- option
179
+ register new_option(args, &block)
155
180
  end
156
181
 
157
182
  # Same as on, but overrides options with overlapping flags.
158
183
  def on!(*args, &block)
159
- option = new_option(args, &block)
160
- register option, true
161
- option
184
+ register new_option(args, &block), true
162
185
  end
163
186
 
164
187
  # An alternate syntax for on, where the key and default attributes are set
@@ -179,15 +202,15 @@ class ConfigParser
179
202
  end
180
203
 
181
204
  # Removes options by key. Any options with the specified key are removed.
182
- # Returns self.
205
+ # Returns the removed options.
183
206
  def rm(key)
184
- options.values.each do |option|
207
+ options.values.collect do |option|
185
208
  if option.key == key
186
209
  unregister(option)
210
+ else
211
+ nil
187
212
  end
188
- end
189
-
190
- self
213
+ end.compact
191
214
  end
192
215
 
193
216
  # Parses options from argv in a non-destructive manner. Parsing stops if an
@@ -268,7 +291,7 @@ class ConfigParser
268
291
  protected
269
292
 
270
293
  def option_class(attrs) # :nodoc:
271
- type = attrs[:type] || guess_type(attrs)
294
+ type = attrs[:option_type] || guess_option_type(attrs)
272
295
 
273
296
  case type
274
297
  when :option then Option
@@ -130,6 +130,11 @@ class ConfigParser
130
130
  end
131
131
  end
132
132
 
133
+ # Returns an inspect string.
134
+ def inspect
135
+ "#<#{self.class}:#{object_id} key=#{key.inspect} default=#{default.inspect} long=#{long.inspect} short=#{short.inspect}>"
136
+ end
137
+
133
138
  private
134
139
 
135
140
  def header_str # :nodoc:
@@ -9,9 +9,6 @@ class ConfigParser
9
9
  # The default split character for multiple values
10
10
  DELIMITER = ','
11
11
 
12
- # The maximum number of values that may be specified; nil for unlimited.
13
- attr_reader :limit
14
-
15
12
  # The delimiter on which to split single values into multiple values; use
16
13
  # nil to prevent splitting.
17
14
  attr_reader :delimiter
@@ -20,7 +17,6 @@ class ConfigParser
20
17
  super
21
18
 
22
19
  @delimiter = attrs.has_key?(:delimiter) ? attrs[:delimiter] : DELIMITER
23
- @limit = attrs[:limit]
24
20
  @default = split(@default)
25
21
  end
26
22
 
@@ -37,10 +33,6 @@ class ConfigParser
37
33
  nest_config = nest(config)
38
34
  array = (nest_config[key] ||= [])
39
35
  array.concat(values)
40
-
41
- if limit && array.length > limit
42
- raise "too many assignments for #{key.inspect}"
43
- end
44
36
  end
45
37
 
46
38
  config
@@ -10,7 +10,7 @@ class ConfigParser
10
10
  attr_reader :prefix
11
11
 
12
12
  # The negative long flag, determined from long and prefix.
13
- attr_reader :nolong
13
+ attr_reader :negative_long
14
14
 
15
15
  def initialize(attrs={})
16
16
  attrs[:default] = true unless attrs.has_key?(:default)
@@ -18,12 +18,12 @@ class ConfigParser
18
18
 
19
19
  raise ArgumentError, "no long specified" unless long
20
20
  @prefix = attrs[:prefix] || 'no'
21
- @nolong = prefix_long(long, "#{prefix}-")
21
+ @negative_long = prefix_long(long, "#{prefix}-")
22
22
  end
23
23
 
24
- # Returns an array of flags mapping to self (ie [long, nolong, short]).
24
+ # Returns an array of flags mapping to self (ie [long, negative_long, short]).
25
25
  def flags
26
- [long, nolong, short].compact
26
+ [long, negative_long, short].compact
27
27
  end
28
28
 
29
29
  # Assigns default into config for positive flags and !default for negative
@@ -32,7 +32,7 @@ class ConfigParser
32
32
  def parse(flag, value=nil, argv=[], config={})
33
33
  raise "value specified for #{flag}: #{value.inspect}" if value
34
34
 
35
- value = (flag == nolong ? !default : default)
35
+ value = (flag == negative_long ? !default : default)
36
36
  assign(config, process(value))
37
37
  end
38
38
 
@@ -23,7 +23,7 @@ class ConfigParser
23
23
  # match:
24
24
  #
25
25
  # $1:: the nesting prefix ('nest')
26
- # $2:: the nolong prefix ('no')
26
+ # $2:: the negative long prefix ('no')
27
27
  # $3:: the long flag name ('opt')
28
28
  #
29
29
  SWITCH = /\A--(.*?)\[(.*?)-\](.+)\z/
@@ -112,14 +112,14 @@ class ConfigParser
112
112
  # -s :short => '-s'
113
113
  # --long :long => '--long'
114
114
  # --long ARG :long => '--long', :arg_name => 'ARG'
115
- # --[no-]long :long => '--long', :prefix => 'no', :type => :switch
115
+ # --[no-]long :long => '--long', :prefix => 'no', :option_type => :switch
116
116
  # --nest:long :long => '--nest:long', :nest_keys => ['nest']
117
117
  # 'some string' :desc => 'some string'
118
118
  #
119
119
  # Usually you overlay these patterns, for example:
120
120
  #
121
121
  # -s ARG :short => '-s', :arg_name => 'ARG'
122
- # --nest:[no-]long :long => '--nest:long', :nest_keys => ['nest'], :prefix => 'no', :type => :switch
122
+ # --nest:[no-]long :long => '--nest:long', :nest_keys => ['nest'], :prefix => 'no', :option_type => :switch
123
123
  #
124
124
  # The goal of this method is to get things right most of the time, not to
125
125
  # be clean, simple, or robust. Some errors in declarations (like an
@@ -170,26 +170,26 @@ class ConfigParser
170
170
  #
171
171
  # if... then...
172
172
  # prefix => :switch
173
- # arg_name => guess_type_by_arg_name || guess_type_by_value
174
- # default => (guess_type_by_value)
173
+ # arg_name => guess_option_type_by_arg_name || guess_option_type_by_value
174
+ # default => (guess_option_type_by_value)
175
175
  # all else => :flag
176
176
  #
177
177
  # A guess is just a guess; for certainty specify the type manually.
178
- def guess_type(attrs)
178
+ def guess_option_type(attrs)
179
179
  case
180
180
  when attrs.has_key?(:prefix)
181
181
  :switch
182
182
  when attrs.has_key?(:arg_name)
183
- guess_type_by_arg_name(attrs[:arg_name]) || guess_type_by_value(attrs[:default])
183
+ guess_option_type_by_arg_name(attrs[:arg_name]) || guess_option_type_by_value(attrs[:default])
184
184
  when attrs.has_key?(:default)
185
- guess_type_by_value(attrs[:default])
185
+ guess_option_type_by_value(attrs[:default])
186
186
  else
187
187
  :flag
188
188
  end
189
189
  end
190
190
 
191
191
  # Guesses :list if the arg_name has a comma, or nil.
192
- def guess_type_by_arg_name(arg_name)
192
+ def guess_option_type_by_arg_name(arg_name)
193
193
  arg_name.to_s.include?(',') ? :list : nil
194
194
  end
195
195
 
@@ -202,7 +202,7 @@ class ConfigParser
202
202
  # all else => :option
203
203
  #
204
204
  # A guess is just a guess; for certainty specify the type manually.
205
- def guess_type_by_value(value)
205
+ def guess_option_type_by_value(value)
206
206
  case value
207
207
  when true then :switch
208
208
  when false then :flag
@@ -1,7 +1,7 @@
1
1
  class ConfigParser
2
2
  MAJOR = 0
3
- MINOR = 2
4
- TINY = 0
3
+ MINOR = 3
4
+ TINY = 0
5
5
 
6
- VERSION="#{MAJOR}.#{MINOR}.#{TINY}"
6
+ VERSION = "#{MAJOR}.#{MINOR}.#{TINY}"
7
7
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: config_parser
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 19
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
- - 2
8
+ - 3
8
9
  - 0
9
- version: 0.2.0
10
+ version: 0.3.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - Simon Chiang
@@ -14,16 +15,18 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-08-01 00:00:00 -06:00
18
+ date: 2010-10-02 00:00:00 -06:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: lazydoc
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ~>
26
28
  - !ruby/object:Gem::Version
29
+ hash: 15
27
30
  segments:
28
31
  - 1
29
32
  - 0
@@ -66,23 +69,27 @@ rdoc_options:
66
69
  require_paths:
67
70
  - lib
68
71
  required_ruby_version: !ruby/object:Gem::Requirement
72
+ none: false
69
73
  requirements:
70
74
  - - ">="
71
75
  - !ruby/object:Gem::Version
76
+ hash: 3
72
77
  segments:
73
78
  - 0
74
79
  version: "0"
75
80
  required_rubygems_version: !ruby/object:Gem::Requirement
81
+ none: false
76
82
  requirements:
77
83
  - - ">="
78
84
  - !ruby/object:Gem::Version
85
+ hash: 3
79
86
  segments:
80
87
  - 0
81
88
  version: "0"
82
89
  requirements: []
83
90
 
84
91
  rubyforge_project: ""
85
- rubygems_version: 1.3.6
92
+ rubygems_version: 1.3.7
86
93
  signing_key:
87
94
  specification_version: 3
88
95
  summary: Parse command-line options into a configuration hash