help_parser 1.0.2 → 1.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9580ecb3144e3be88b6961efc2e1edae53964c01
4
- data.tar.gz: 8924fbd437d234ab59ce1f1bc319be6f9287b93d
3
+ metadata.gz: 5b2c52b4521273e3423cf52dbb22b9f475fedade
4
+ data.tar.gz: 67c4807edaa755306f43b30ca85cf0400250a8d6
5
5
  SHA512:
6
- metadata.gz: d4f0bc72cefd932f76302436d2f898267169a7fc847af683d225333d8d2a7423e9919266b69e03e3168604b6683c4ee1fedbd930d90c837b914f6a601203dac3
7
- data.tar.gz: e0af58d61f6825f2e72615a3fafc352a3f8b7296b5cfa0f559e3ed5092eaaf8ac9fc2b9306146e292200e9fd77281d2dd0e6595f2d582635b23e9a3f3064e75b
6
+ metadata.gz: be5f3fde5967198c766bf2e6dfcdfd084476d6843ae43b0f76243753c8ddb7e498d509d10f2f0fba33d78c07f39bd43159d5a0a000b5347f3ad8794224873b34
7
+ data.tar.gz: a07a636b9c9f0c5b482fcd7a2442c01d680d601854f1822954071778945308df2f76e438c86ca53d102db203a378b6f01bc75363aca5b4095fa8fe70ea5ae5e0
@@ -1 +1,3 @@
1
1
  === 0.0.0 / 2013-12-04
2
+ === 1.0.2 / 2013-12-13 12:22:05 -0800
3
+ 773a9196081c53bd8c90252bdfae7db7 pkg/help_parser-1.0.2.gem
@@ -1,7 +1,6 @@
1
1
  History.txt
2
2
  Manifest.txt
3
3
  README.rdoc
4
- Rakefile
5
4
  TODO.txt
6
5
  examples/command_suite
7
6
  examples/implementation_error_duplicate_key
@@ -14,10 +13,13 @@ features/step_definitions/help_parser_steps.rb
14
13
  features/suite.feature
15
14
  help_parser.gemspec
16
15
  lib/help_parser.rb
16
+ lib/help_parser/errors.rb
17
+ lib/help_parser/functions.rb
18
+ lib/help_parser/help_exception.rb
17
19
  lib/help_parser/help_parser.rb
20
+ lib/help_parser/implementation_error.rb
21
+ lib/help_parser/usage_error.rb
22
+ lib/help_parser/usage_exception.rb
18
23
  lib/help_parser/version.rb
19
- tasks/gemspecker.rb
20
- tasks/manifester.rb
21
- tasks/syntaxer.rb
22
- tasks/unit_tests.rb
24
+ lib/help_parser/version_exception.rb
23
25
  test/help_parser.rb
data/TODO.txt CHANGED
@@ -0,0 +1,3 @@
1
+ == File List
2
+
3
+
@@ -1,14 +1,14 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'help_parser'
4
- s.version = '1.0.2'
4
+ s.version = '1.1.0'
5
5
 
6
6
  s.homepage = 'https://github.com/carlosjhr64/help_parser'
7
7
 
8
8
  s.author = 'CarlosJHR64'
9
9
  s.email = 'carlosjhr64@gmail.com'
10
10
 
11
- s.date = '2013-12-13'
11
+ s.date = '2013-12-16'
12
12
  s.licenses = ['MIT']
13
13
 
14
14
  s.description = <<DESCRIPTION
@@ -27,7 +27,6 @@ SUMMARY
27
27
  History.txt
28
28
  Manifest.txt
29
29
  README.rdoc
30
- Rakefile
31
30
  TODO.txt
32
31
  examples/command_suite
33
32
  examples/implementation_error_duplicate_key
@@ -40,13 +39,21 @@ features/step_definitions/help_parser_steps.rb
40
39
  features/suite.feature
41
40
  help_parser.gemspec
42
41
  lib/help_parser.rb
42
+ lib/help_parser/errors.rb
43
+ lib/help_parser/functions.rb
44
+ lib/help_parser/help_exception.rb
43
45
  lib/help_parser/help_parser.rb
46
+ lib/help_parser/implementation_error.rb
47
+ lib/help_parser/usage_error.rb
48
+ lib/help_parser/usage_exception.rb
44
49
  lib/help_parser/version.rb
45
- tasks/gemspecker.rb
46
- tasks/manifester.rb
47
- tasks/syntaxer.rb
48
- tasks/unit_tests.rb
50
+ lib/help_parser/version_exception.rb
49
51
  test/help_parser.rb
50
- )
52
+ )
53
+
54
+ s.add_development_dependency 'rainbow', '~> 1.1', '>= 1.1.4'
55
+ s.add_development_dependency 'test-unit', '~> 2.5', '>= 2.5.5'
56
+ s.requirements << 'requires json in development'
57
+ s.requirements << 'requires open3 in development'
51
58
 
52
59
  end
@@ -1,2 +1,9 @@
1
1
  require 'help_parser/version.rb'
2
+ require 'help_parser/usage_exception'
3
+ require 'help_parser/help_exception'
4
+ require 'help_parser/version_exception'
5
+ require 'help_parser/implementation_error'
6
+ require 'help_parser/usage_error'
7
+ require 'help_parser/errors'
8
+ require 'help_parser/functions'
2
9
  require 'help_parser/help_parser.rb'
@@ -0,0 +1,17 @@
1
+ module HELP_PARSER
2
+ # Used to *include* in a class.
3
+ module Errors
4
+ # HelpParser#usage_error will have make the HelpParser
5
+ # object raise a UsageError error with the given message.
6
+ def usage_error(msg)
7
+ raise UsageError, [msg, self]
8
+ end
9
+
10
+ # HelpParser#implementation_error will have make the
11
+ # HelpParser object raise a UsageError error with the
12
+ # given message.
13
+ def implementation_error(msg)
14
+ raise ImplementationError, [msg, self]
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,62 @@
1
+ module HELP_PARSER
2
+ # I'm wrapping class functions in a Function module.
3
+ # Used to *extend* a class.
4
+ module Functions
5
+
6
+ # HelpParser.to_value
7
+ def to_value(string)
8
+ case string
9
+ when /^-?\d+$/
10
+ return string.to_i
11
+ when /^-?\d+\.\d+$/
12
+ return string.to_f
13
+ when /,/
14
+ return string.split(',').map{|s| to_value(s)}
15
+ end
16
+ return string
17
+ end
18
+
19
+ # HelpParser.str2sym converts String keys to
20
+ # Symbol. Symbol keys can have '-', but it's cumbersome
21
+ # notation:
22
+ # :"a-b"
23
+ # So I translate it to underscore:
24
+ # :a_b
25
+ def str2sym(str)
26
+ str.gsub('-','_').to_sym
27
+ end
28
+
29
+ # HelpParser.parse parses the @argv for command line
30
+ # options, shifting them out, and passes on the key-value
31
+ # pairs to the block. The keys are translated to their
32
+ # short version if available, and the values are converted
33
+ # to their best interpreted form as per Funtion.to_value.
34
+ # Furthermore, no-key values are negated.
35
+ def parse(argv, obj, &block)
36
+ while argv[0] and argv[0][0]=='-'
37
+ option = argv.shift[1..-1]
38
+ if option[0]=='-'
39
+ loption, value = option[1..-1].split('=', 2)
40
+ if loption=~/no-(\w.*)$/
41
+ loption = $1
42
+ if value
43
+ raise UsageError, ["no-key should not have value: no-#{loption}=#{value}", obj]
44
+ end
45
+ value = false
46
+ end
47
+ if value.nil?
48
+ value = true
49
+ block.call loption, value
50
+ else
51
+ block.call loption, self.to_value(value)
52
+ end
53
+ else
54
+ # These are single character options...
55
+ option.each_char do |c|
56
+ block.call c, true
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,16 @@
1
+ module HELP_PARSER
2
+ # HelpException is a type of UsageException, where the
3
+ # user asks for help in the command line options. The
4
+ # raise in a class method is as follows:
5
+ # raise HelpException, self
6
+ # The object that raised the exception will be available
7
+ # as:
8
+ # $!.obj
9
+ # The message will be the help text:
10
+ # $!.message == $!.obj.help # => true
11
+ class HelpException < UsageException
12
+ def initialize(help_parser)
13
+ super([help_parser.help, help_parser])
14
+ end
15
+ end
16
+ end
@@ -1,285 +1,128 @@
1
1
  module HELP_PARSER
2
+ class HelpParser < Hash
3
+ include Errors
4
+ extend Functions
2
5
 
3
- # **UsageError** is an error when the user passed command
4
- # line options that are inconsistent with expectations.
5
- # The raise in a class method is as follows:
6
- # raise UsageError, [message, self]
7
- # The object that raised the error will be available as:
8
- # $!.obj
9
- class UsageError < StandardError
10
- attr_accessor :obj
11
- def initialize(array)
12
- self.obj = array.pop
13
- msg = array.pop
14
- super(msg)
6
+ def parse(&block)
7
+ HelpParser.parse(@argv, self, &block)
15
8
  end
16
- end
17
- # **ImplementationError** is an error due to a
18
- # inconsistent help text. The raise in a class method is
19
- # as follows:
20
- # raise ImplementationError, [message, self]
21
- # The object that raised the error will be available as:
22
- # $!.obj
23
- class ImplementationError < StandardError
24
- attr_accessor :obj
25
- def initialize(array)
26
- self.obj = array.pop
27
- msg = array.pop
28
- super(msg)
29
- end
30
- end
31
-
32
- # UsageException is an actual exception to normal flow.
33
- # For example, when a user asks for help or version
34
- # number in the command line options. The raise in a
35
- # class method is as follows:
36
- # raise UsageException, [message, self]
37
- # The object that raised the exception will be available
38
- # as:
39
- # $!.obj
40
- class UsageException < Exception
41
- attr_accessor :obj
42
- def initialize(array)
43
- self.obj = array.pop
44
- msg = array.pop
45
- super(msg)
46
- end
47
- end
48
-
49
- # HelpException is a type of UsageException, where the
50
- # user asks for help in the command line options. The
51
- # raise in a class method is as follows:
52
- # raise HelpException, self
53
- # The object that raised the exception will be available
54
- # as:
55
- # $!.obj
56
- # The message will be the help text:
57
- # $!.message == $!.obj.help # => true
58
- class HelpException < UsageException
59
- def initialize(help_parser)
60
- super([help_parser.help, help_parser])
61
- end
62
- end
63
-
64
- # VersionException is a type of UsageException, where the
65
- # user asks for version in the command line options. The
66
- # raise in a class method is as follows:
67
- # raise VersionException, self
68
- # The object that raised the exception will be available
69
- # as:
70
- # $!.obj
71
- # The message will be the version text:
72
- # $!.message == $!.obj.version # => true
73
- class VersionException < UsageException
74
- def initialize(help_parser)
75
- super([help_parser.version, help_parser])
76
- end
77
- end
78
-
79
- module Errors
80
- # HelpParser#usage_error will have make the HelpParser
81
- # object raise a UsageError error with the given message.
82
- def usage_error(msg)
83
- raise UsageError, [msg, self]
84
- end
85
-
86
- # HelpParser#implementation_error will have make the
87
- # HelpParser object raise a UsageError error with the
88
- # given message.
89
- def implementation_error(msg)
90
- raise ImplementationError, [msg, self]
91
- end
92
- end
93
9
 
94
- class HelpParser < Hash
95
- include Errors
96
10
 
97
- # I'm wrapping class functions in a Function module.
98
- module Function
11
+ # HelpParser.new(version, help, argv=ARGV, dict={})
12
+ # Not necessarily in that order, see the code.
13
+ attr_reader :version, :help, :dict
14
+ def initialize(*parameters)
15
+ super()
99
16
 
100
- # I'm wrapping Function's helper functions in a Private
101
- # module.
102
- module Private
103
- # HelpParser::Function::Private.to_value
104
- def to_value(string)
105
- case string
106
- when /^-?\d+$/
107
- return string.to_i
108
- when /^-?\d+\.\d+$/
109
- return string.to_f
110
- when /,/
111
- return string.split(',').map{|s| to_value(s)}
17
+ # Figure out what parameters you were given...
18
+ @argv = parameters.detect{|parameter| parameter.class == Array} || ARGV
19
+ @dict = parameters.detect{|parameter| parameter.class == Hash } || {}
20
+ parameters = parameters.select{|parameter| parameter.class == String}
21
+ @version = parameters.shift
22
+ @help = parameters.pop
23
+
24
+ raise "Need help" unless @help
25
+ raise "Need version" unless @version
26
+
27
+ # We ensure the following two mappings...
28
+ @dict[:help] = :h
29
+ @dict[:version] = :v
30
+
31
+ # Using the help for the options definition
32
+ @help.split("\n").select{|l|
33
+ (l=~/^\s*-/)
34
+ }.map{|l|
35
+ l.strip.split(/[,\s]+/)[0..1].select{|o|
36
+ o[0]=='-'
37
+ }.map{|o|
38
+ HelpParser.str2sym o.sub(/--?/,'').sub(/=.*$/,'')
39
+ }.reverse
40
+ }.each do |k,v|
41
+ unless @dict[k].nil?
42
+ # This is an implementation error. The help text is inconsistent.
43
+ # Note that we may have been given @dict, and we're verifying the help.
44
+ implementation_error "#{k} redefinition from #{@dict[k]} to #{v}." unless @dict[k]==v
112
45
  end
113
- return string
46
+ @dict[k]=v
114
47
  end
115
- end
116
- extend Private
117
48
 
118
- # HelpParser::Function.str2sym converts String keys to
119
- # Symbol. Symbol keys can have '-', but it's cumbersome
120
- # notation:
121
- # :"a-b"
122
- # So I translate it to underscore:
123
- # :a_b
124
- def str2sym(str)
125
- str.gsub('-','_').to_sym
126
- end
127
-
128
- # HelpParser#parse parses the @argv for command line
129
- # options, shifting them out, and passes on the key-value
130
- # pairs to the block. The keys are translated to their
131
- # short version if available, and the values are converted
132
- # to their best interpreted form as per Funtion.to_value.
133
- # Furthermore, no-key values are negated.
134
- def parse(argv, obj, &block)
135
- while argv[0] and argv[0][0]=='-'
136
- option = argv.shift[1..-1]
137
- if option[0]=='-'
138
- loption, value = option[1..-1].split('=', 2)
139
- if loption=~/no-(\w.*)$/
140
- loption = $1
141
- if value
142
- raise UsageError, ["no-key should not have value: no-#{loption}=#{value}", obj]
143
- end
144
- value = false
145
- end
146
- if value.nil?
147
- value = true
148
- block.call loption, value
149
- else
150
- block.call loption, Function.to_value(value)
49
+ # Values must be terminal states, that is for example:
50
+ # if :version => :v, then :v => nil.
51
+ terminals = []
52
+ @dict.each do |k,v|
53
+ next if v.nil?
54
+ if @dict.has_key?(v)
55
+ unless @dict[v].nil?
56
+ implementation_error "Expected terminal #{v}: #{k} => #{v} => #{@dict[v]}"
151
57
  end
152
58
  else
153
- # These are single character options...
154
- option.each_char do |c|
155
- block.call c, true
156
- end
59
+ terminals.push(v)
157
60
  end
158
61
  end
159
- end
160
- end
161
- extend Function
162
-
163
- def parse(&block)
164
- HelpParser.parse(@argv, self, &block)
165
- end
166
-
167
-
168
- # HelpParser.new(version, help, argv=ARGV, dict={})
169
- # Not necessarily in that order, see the code.
170
- attr_reader :version, :help, :dict
171
- def initialize(*parameters)
172
- super()
173
-
174
- # Figure out what parameters you were given...
175
- @argv = parameters.detect{|parameter| parameter.class == Array} || ARGV
176
- @dict = parameters.detect{|parameter| parameter.class == Hash } || {}
177
- parameters = parameters.select{|parameter| parameter.class == String}
178
- @version = parameters.shift
179
- @help = parameters.pop
180
-
181
- raise "Need help" unless @help
182
- raise "Need version" unless @version
183
-
184
- # We ensure the following two mappings...
185
- @dict[:help] = :h
186
- @dict[:version] = :v
187
-
188
- # Using the help for the options definition
189
- @help.split("\n").select{|l|
190
- (l=~/^\s*-/)
191
- }.map{|l|
192
- l.strip.split(/[,\s]+/)[0..1].select{|o|
193
- o[0]=='-'
194
- }.map{|o|
195
- HelpParser.str2sym o.sub(/--?/,'').sub(/=.*$/,'')
196
- }.reverse
197
- }.each do |k,v|
198
- unless @dict[k].nil?
199
- # This is an implementation error. The help text is inconsistent.
200
- # Note that we may have been given @dict, and we're verifying the help.
201
- implementation_error "#{k} redefinition from #{@dict[k]} to #{v}." unless @dict[k]==v
62
+ terminals.each{|v| @dict[v] = nil}
63
+
64
+ # Parsing command line options
65
+ parse do |opt, value|
66
+ key = HelpParser.str2sym opt
67
+ # Translate key to the terminal key.
68
+ key = @dict[key] unless @dict[key].nil?
69
+ # Ensure user only uses the defined keys.
70
+ usage_error "not a valid option: #{opt}" unless @dict.has_key?(key)
71
+ # As we parse ARGV, we should only be setting keys once.
72
+ usage_error "duplicate command line option: #{opt}" if self.has_key?(key)
73
+ self[key] = value
202
74
  end
203
- @dict[k]=v
204
- end
205
75
 
206
- # Values must be terminal states, that is for example:
207
- # if :version => :v, then :v => nil.
208
- terminals = []
209
- @dict.each do |k,v|
210
- next if v.nil?
211
- if @dict.has_key?(v)
212
- unless @dict[v].nil?
213
- implementation_error "Expected terminal #{v}: #{k} => #{v} => #{@dict[v]}"
76
+ # The parse takes all options to its terminal value.
77
+ # Now set the synonims...
78
+ @dict.each do |synonim, terminal|
79
+ next if terminal.nil?
80
+ if self.has_key?(terminal)
81
+ # I did not mean for the synonyms to have been set yet, so if I do,
82
+ # I have a bug somewhere.
83
+ raise "unexpected key overwrite" if self.has_key?(synonim)
84
+ self[synonim] = self[terminal]
214
85
  end
215
- else
216
- terminals.push(v)
217
86
  end
218
- end
219
- terminals.each{|v| @dict[v] = nil}
220
87
 
221
- # Parsing command line options
222
- parse do |opt, value|
223
- key = HelpParser.str2sym opt
224
- # Translate key to the terminal key.
225
- key = @dict[key] unless @dict[key].nil?
226
- # Ensure user only uses the defined keys.
227
- usage_error "not a valid option: #{opt}" unless @dict.has_key?(key)
228
- # As we parse ARGV, we should only be setting keys once.
229
- usage_error "duplicate command line option: #{opt}" if self.has_key?(key)
230
- self[key] = value
88
+ # Did the user ask for help or version?
89
+ raise HelpException, self if self[:h]==true
90
+ raise VersionException, self if self[:v]==true
231
91
  end
232
92
 
233
- # The parse takes all options to its terminal value.
234
- # Now set the synonims...
235
- @dict.each do |synonim, terminal|
236
- next if terminal.nil?
237
- if self.has_key?(terminal)
238
- # I did not mean for the synonyms to have been set yet, so if I do,
239
- # I have a bug somewhere.
240
- raise "unexpected key overwrite" if self.has_key?(synonim)
241
- self[synonim] = self[terminal]
242
- end
93
+ # HelpParser#defaults is a helper method to []
94
+ def defaults(symbol, default1, default2=default1)
95
+ type = (default2 || default1).class
96
+ a = self[symbol]
97
+ value = (a.nil?)? default1 : a
98
+ value = default2 if value==true
99
+ # !value is true if value is false or nil.
100
+ usage_error "type error: #{symbol} needs to be #{type}" unless !value or value.class == type
101
+ return value
243
102
  end
244
103
 
245
- # Did the user ask for help or version?
246
- raise HelpException, self if self[:h]==true
247
- raise VersionException, self if self[:v]==true
248
- end
249
-
250
- # HelpParser#defaults is a helper method to []
251
- def defaults(symbol, default1, default2=default1)
252
- type = (default2 || default1).class
253
- a = self[symbol]
254
- value = (a.nil?)? default1 : a
255
- value = default2 if value==true
256
- # !value is true if value is false or nil.
257
- usage_error "type error: #{symbol} needs to be #{type}" unless !value or value.class == type
258
- return value
259
- end
260
-
261
- # HelpParser#defaults! is used to replace value with a
262
- # default in the hash, self.
263
- def defaults!(symbol, default1, default2)
264
- self[symbol] = defaults(symbol, default1, default2)
265
- end
104
+ # HelpParser#defaults! is used to replace value with a
105
+ # default in the hash, self.
106
+ def defaults!(symbol, default1, default2)
107
+ self[symbol] = defaults(symbol, default1, default2)
108
+ end
266
109
 
267
- # HelpParser#[k, default1=nil, default2=nil]
268
- # Basically, for #[k, default1, default2]:
269
- # value = help_parser[k]
270
- # case value
271
- # when nil then default1
272
- # when true then default2
273
- # else value
274
- # end
275
- # For #[k, default1]:
276
- # value = help_parser[k] || default1
277
- # For #[k]:
278
- # help_parser[k]
279
- # Raises a UsageError if the value is not of the expected
280
- # type as given by the last default.
281
- def [](k, *defaults12)
282
- (defaults12.length==0)? super(k) : defaults(k, *defaults12)
110
+ # HelpParser#[k, default1=nil, default2=nil]
111
+ # Basically, for #[k, default1, default2]:
112
+ # value = help_parser[k]
113
+ # case value
114
+ # when nil then default1
115
+ # when true then default2
116
+ # else value
117
+ # end
118
+ # For #[k, default1]:
119
+ # value = help_parser[k] || default1
120
+ # For #[k]:
121
+ # help_parser[k]
122
+ # Raises a UsageError if the value is not of the expected
123
+ # type as given by the last default.
124
+ def [](k, *defaults12)
125
+ (defaults12.length==0)? super(k) : defaults(k, *defaults12)
126
+ end
283
127
  end
284
128
  end
285
- end
@@ -0,0 +1,16 @@
1
+ module HELP_PARSER
2
+ # **ImplementationError** is an error due to a
3
+ # inconsistent help text. The raise in a class method is
4
+ # as follows:
5
+ # raise ImplementationError, [message, self]
6
+ # The object that raised the error will be available as:
7
+ # $!.obj
8
+ class ImplementationError < StandardError
9
+ attr_accessor :obj
10
+ def initialize(array)
11
+ self.obj = array.pop
12
+ msg = array.pop
13
+ super(msg)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module HELP_PARSER
2
+ # **UsageError** is an error when the user passed command
3
+ # line options that are inconsistent with expectations.
4
+ # The raise in a class method is as follows:
5
+ # raise UsageError, [message, self]
6
+ # The object that raised the error will be available as:
7
+ # $!.obj
8
+ class UsageError < StandardError
9
+ attr_accessor :obj
10
+ def initialize(array)
11
+ self.obj = array.pop
12
+ msg = array.pop
13
+ super(msg)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ module HELP_PARSER
2
+ # UsageException is an actual exception to normal flow.
3
+ # For example, when a user asks for help or version
4
+ # number in the command line options. The raise in a
5
+ # class method is as follows:
6
+ # raise UsageException, [message, self]
7
+ # The object that raised the exception will be available
8
+ # as:
9
+ # $!.obj
10
+ class UsageException < Exception
11
+ attr_accessor :obj
12
+ def initialize(array)
13
+ self.obj = array.pop
14
+ msg = array.pop
15
+ super(msg)
16
+ end
17
+ end
18
+ end
@@ -1,3 +1,3 @@
1
1
  module HELP_PARSER
2
- VERSION = '1.0.2'
2
+ VERSION = '1.1.0'
3
3
  end
@@ -0,0 +1,16 @@
1
+ module HELP_PARSER
2
+ # VersionException is a type of UsageException, where the
3
+ # user asks for version in the command line options. The
4
+ # raise in a class method is as follows:
5
+ # raise VersionException, self
6
+ # The object that raised the exception will be available
7
+ # as:
8
+ # $!.obj
9
+ # The message will be the version text:
10
+ # $!.message == $!.obj.version # => true
11
+ class VersionException < UsageException
12
+ def initialize(help_parser)
13
+ super([help_parser.version, help_parser])
14
+ end
15
+ end
16
+ end
@@ -1,5 +1,5 @@
1
1
  require 'test/unit'
2
- require 'help_parser/help_parser'
2
+ require 'help_parser'
3
3
 
4
4
  class Test_HELP_PARSER_HelpParser < Test::Unit::TestCase
5
5
  include HELP_PARSER
@@ -142,7 +142,7 @@ class Test_HELP_PARSER_HelpParser < Test::Unit::TestCase
142
142
 
143
143
  def test_008_to_value
144
144
  [['1', Integer], ['1.0', Float], ['One', String], ['1,2.0,Three', Array]].each do |string, type|
145
- value = HelpParser::Function.to_value(string)
145
+ value = HelpParser.to_value(string)
146
146
  assert( value.kind_of?(type) )
147
147
  end
148
148
  end
metadata CHANGED
@@ -1,15 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: help_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - CarlosJHR64
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-13 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2013-12-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rainbow
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.1'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.1.4
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.1'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.1.4
33
+ - !ruby/object:Gem::Dependency
34
+ name: test-unit
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.5'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 2.5.5
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '2.5'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 2.5.5
13
53
  description: |
14
54
  _HelpParser_ - Parses your help text to define your command line options.
15
55
  email: carlosjhr64@gmail.com
@@ -21,7 +61,6 @@ files:
21
61
  - History.txt
22
62
  - Manifest.txt
23
63
  - README.rdoc
24
- - Rakefile
25
64
  - TODO.txt
26
65
  - examples/command_suite
27
66
  - examples/implementation_error_duplicate_key
@@ -34,12 +73,15 @@ files:
34
73
  - features/suite.feature
35
74
  - help_parser.gemspec
36
75
  - lib/help_parser.rb
76
+ - lib/help_parser/errors.rb
77
+ - lib/help_parser/functions.rb
78
+ - lib/help_parser/help_exception.rb
37
79
  - lib/help_parser/help_parser.rb
80
+ - lib/help_parser/implementation_error.rb
81
+ - lib/help_parser/usage_error.rb
82
+ - lib/help_parser/usage_exception.rb
38
83
  - lib/help_parser/version.rb
39
- - tasks/gemspecker.rb
40
- - tasks/manifester.rb
41
- - tasks/syntaxer.rb
42
- - tasks/unit_tests.rb
84
+ - lib/help_parser/version_exception.rb
43
85
  - test/help_parser.rb
44
86
  homepage: https://github.com/carlosjhr64/help_parser
45
87
  licenses:
@@ -61,7 +103,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
61
103
  - - ">="
62
104
  - !ruby/object:Gem::Version
63
105
  version: '0'
64
- requirements: []
106
+ requirements:
107
+ - requires json in development
108
+ - requires open3 in development
65
109
  rubyforge_project:
66
110
  rubygems_version: 2.0.3
67
111
  signing_key:
data/Rakefile DELETED
@@ -1,94 +0,0 @@
1
- require 'find'
2
-
3
- module RakingTasks
4
- def RakingTasks.git_tag_list
5
- `git tag --list`.strip.split("\n")
6
- end
7
-
8
- def RakingTasks.git_status_porcelain
9
- `git status --porcelain`.strip
10
- end
11
-
12
- def RakingTasks.gemspec_files
13
- `ls ./*.gemspec 2> /dev/null`.strip.split("\n")
14
- end
15
-
16
- def RakingTasks.uniq_gemspec_file
17
- gemspecs = RakingTasks.gemspec_files
18
- raise "Gemspec file not found" if gemspecs.length == 0
19
- raise "Mutiple gemspec files found" if gemspecs.length > 1
20
- gemspecs.first
21
- end
22
-
23
- def RakingTasks.pkg_gem_files
24
- `ls ./pkg/*.gem 2> /dev/null`.strip.split("\n")
25
- end
26
-
27
- def RakingTasks.gem_files
28
- `ls ./*.gem 2> /dev/null`.strip.split("\n")
29
- end
30
-
31
- def RakingTasks.uniq_gem_file
32
- gems = RakingTasks.gem_files
33
- raise "Gem file not found" if gems.length == 0
34
- raise "Multiple gem files found" if gems.length > 1
35
- gems.first
36
- end
37
-
38
- def RakingTasks.gem_build
39
- raise "Git status not clear" unless RakingTasks.git_status_porcelain.length == 0
40
- gems = RakingTasks.gem_files
41
- raise "Found gem files: #{gems.join(',')}" unless gems.length == 0
42
- gemspec = RakingTasks.uniq_gemspec_file
43
- system("gem build #{gemspec}")
44
- end
45
-
46
- def RakingTasks.load_existing_tasks
47
- if Dir.exist?('./tasks')
48
- Find.find('./tasks') do |fn|
49
- require fn if fn=~/\.rb/
50
- end
51
- end
52
- end
53
- end
54
- RakingTasks.load_existing_tasks
55
-
56
- desc 'By default, run git status'
57
- task :default do
58
- system('git status')
59
- end
60
-
61
- desc 'Cucumbers tests'
62
- task :cucumber do
63
- system('cucumber -f progress')
64
- end
65
-
66
- desc 'Runs all tests'
67
- task :'test-all' => [:syntaxer, :'unit-tests', :cucumber]
68
-
69
- desc 'Builds pre-release gem for testing, not published.'
70
- task :gem_build do
71
- RakingTasks.gem_build
72
- end
73
-
74
- desc 'pushes to rubygems and git'
75
- task :publish, :version do |t, args|
76
- version = args[:version]
77
- tags = RakingTasks.git_tag_list
78
- raise "#{version} in git tag list" if tags.include?(version)
79
- RakingTasks.gem_build
80
- gem = File.basename RakingTasks.uniq_gem_file
81
- raise "#{version} did not match gem file" unless gem.include?(version)
82
- pkgem = File.join('pkg', gem)
83
- raise "pkg/#{gem} exists!?" if File.exist? pkgem
84
- if system("gem push #{gem}")
85
- File.rename(gem, pkgem)
86
- File.open('./History.txt', 'a'){|fh| fh.puts "=== #{version} / #{Time.now}"}
87
- File.open('./History.txt', 'a'){|fh| fh.puts `md5sum #{pkgem}`}
88
- system("git commit -m '#{version}' ./History.txt")
89
- system("git tag '#{version}'")
90
- system('git push')
91
- else
92
- File.unlink(gem)
93
- end
94
- end
@@ -1,60 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'date'
3
-
4
- module Gemspecker
5
- def self.task
6
-
7
- name = File.basename(Dir.getwd)
8
- version = File.read("lib/#{name}/version.rb").match(/\d+\.\d+\.\d+/)[0]
9
- date = Date.today.to_s
10
- author = `git config user.name`.strip
11
- email = `git config user.email`.strip
12
- # get the first readme, preferably rdoc.
13
- readme = `ls README.rdoc README.txt README* 2> /dev/null`.split.first.strip
14
- description = File.read(readme).match(/DESCRIPTION:([^=]*)/i)[1].strip
15
- summary = description.split(/\n\n/).first
16
-
17
- # ./name.gemspec
18
- File.open("./#{name}.gemspec", 'w') do |gemspec|
19
-
20
- ### Gem Specification ####
21
- gemspec.puts <<EOT
22
- Gem::Specification.new do |s|
23
-
24
- s.name = '#{name}'
25
- s.version = '#{version}'
26
-
27
- s.homepage = 'https://github.com/#{author.downcase}/#{name}'
28
-
29
- s.author = '#{author}'
30
- s.email = '#{email}'
31
-
32
- s.date = '#{date}'
33
- s.licenses = ['MIT']
34
-
35
- s.description = <<DESCRIPTION
36
- #{description}
37
- DESCRIPTION
38
-
39
- s.summary = <<SUMMARY
40
- #{summary}
41
- SUMMARY
42
-
43
- s.extra_rdoc_files = ['#{readme}']
44
- s.rdoc_options = ["--main", "#{readme}"]
45
-
46
- s.require_paths = ["lib"]
47
- s.files = %w(
48
- #{`git ls-files`})
49
-
50
- end
51
- EOT
52
-
53
- end
54
- end
55
- end
56
-
57
- desc "Create/Update gemspec"
58
- task :gemspecker do
59
- Gemspecker.task
60
- end
@@ -1,13 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'date'
3
-
4
- module Manifester
5
- def self.task
6
- system('git ls-files > Manifest.txt')
7
- end
8
- end
9
-
10
- desc "Creates/Updates Manifest"
11
- task :manifester do
12
- Manifester.task
13
- end
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'find'
3
- require 'open3'
4
- require 'rainbow'
5
-
6
- module Syntaxer
7
- def self.task
8
- count = 0
9
- Find.find('.') do |fn|
10
- if fn=~/\.rb$/
11
- stdout, stderr, process = Open3.capture3("ruby -c #{fn}")
12
- unless process.exitstatus == 0
13
- count += 1
14
- puts stderr.chomp.color(:red)
15
- end
16
- end
17
- end
18
- puts "No syntax errors found.".color(:green) if count == 0
19
- end
20
- end
21
-
22
- desc "Checks *.rb's syntax"
23
- task :syntaxer do
24
- Syntaxer.task
25
- end
@@ -1,18 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'find'
3
-
4
- module UnitTests
5
- def self.task
6
- count = 0
7
- Find.find('./test') do |fn|
8
- if fn=~/\.rb$/
9
- system("ruby -I ./lib #{fn} --verbose=progress")
10
- end
11
- end
12
- end
13
- end
14
-
15
- desc "Runs unit tests"
16
- task :'unit-tests' do
17
- UnitTests.task
18
- end