rubycom 0.3.0 → 0.3.2

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,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NDQwZWY1MzUyMTk1MGQ1OTc2YTEzYzNhOWRlNTZjZTkzMjU3MzliNw==
4
+ NzljMjJkOTA5OGI4NTlmNTNjMjQ0NDdkMzQ1NzY5YjYxMGRkMmQxNw==
5
5
  data.tar.gz: !binary |-
6
- OWVkOTI4MjY3ODhlODM1M2FhMTAxZTc2YjQxYTVkN2JmZDg2ZGE1Yg==
6
+ MTY3NjdiMTkyOTBhM2UyNjZiNjc4ODE5YzQ0MDJiNzQzNmNlOGJiOQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- Nzc5NWUyZTczZWMzZjUxM2UwMmEyNGQxYTZlZTEyYmI1MmViYmUwZDE0NmRm
10
- ZTYzM2Y0N2Q1MjhkOThjZTdiN2Q5OWIyODEyMmVkMjdiMjQ3OTc0ZWQ2MTcx
11
- NzUwZTAzMzZjOWMwN2FlZjk1NjUzMTFlM2EzZTdkZTk3NjI5ZGQ=
9
+ NDRmZWFhNTRhMWFmMTBjZjY1ZjE3N2JhODFjNThiMDc3MDk3YjQzMzc3NWM4
10
+ OWQwNWE3NzA3ZjgzMDdlODAzZjQzZmY3NWFjNDdhYjMxNDU5YzE2ZjkyM2Jl
11
+ OWU4ODYzMWFlZWY0NzYzOGQ5YzQwYWZlM2VmMDlmMzcxYzdmZTk=
12
12
  data.tar.gz: !binary |-
13
- YzVlZTBiODM0MzU0MmQzNTg1YWI1NDg0MTE0ZGRhOWMyMDA2M2Y5NTIxZTY1
14
- NTFmM2Y3NDM5MDU5ZmRhYmI2Y2FlMDc1YjdiNzA3OWIzYWVlNGYxNTRhMjU3
15
- MzZjYzNjMmQ2NzUwZmIxNDM2MzcxODU4OGUzMWYyZGNmOGVjNGY=
13
+ Njg1YWIxMzI5ODA1NGViMTA1NGMyMjYxOGViNDI0NTZjOWQyY2U1OTE3Mzgx
14
+ YmQ0NGNhOGVkNTg0OGE2OWNjMTBkNWI2YWE5ZjJkNjZjYWY0YzlmN2Q2ZWVm
15
+ ZTRmMTVlMDdhMDUxY2NjYzg4NjA1NjMwZWNkZmQyNzUxNzUxZGE=
data/lib/rubycom.rb CHANGED
@@ -18,15 +18,25 @@ module Rubycom
18
18
  #
19
19
  # @param [Module] base the module which invoked 'include Rubycom'
20
20
  def self.included(base)
21
- raise CLIError, 'base must be a module' if base.class != Module
22
21
  base_file_path = caller.first.gsub(/:\d+:.+/, '')
23
- if base_file_path == $0
22
+ if base.class == Module && (base_file_path == $0 || self.is_executed_by_gem?(base_file_path))
24
23
  base.module_eval {
25
24
  Rubycom.run(base, ARGV)
26
25
  }
27
26
  end
28
27
  end
29
28
 
29
+ # Determines whether the including module was executed by a gem binary
30
+ #
31
+ # @param [String] base_file_path the path to the including module's source file
32
+ def self.is_executed_by_gem?(base_file_path)
33
+ Gem.loaded_specs.map{|k,s|
34
+ {k => {name: "#{s.name}-#{s.version}", executables: s.executables}}
35
+ }.reduce(&:merge).map{|k,s|
36
+ base_file_path.include?(s[:name]) && s[:executables].include?(File.basename(base_file_path))
37
+ }.flatten.reduce(&:|)
38
+ end
39
+
30
40
  # Looks up the command specified in the first arg and executes with the rest of the args
31
41
  #
32
42
  # @param [Module] base the module which invoked 'include Rubycom'
@@ -112,10 +122,11 @@ module Rubycom
112
122
  end
113
123
  end
114
124
 
115
- # Calls the given Method#name on the given Module after parsing the given Array of arguments
125
+ # Handles the method call according to the given arguments. If the specified command is a Module then a recursive search
126
+ # is performed until a Method is found in the specified arguments.
116
127
  #
117
128
  # @param [Module] base the module which invoked 'include Rubycom'
118
- # @param [String] command the name of the Method to call
129
+ # @param [String] command the name of the command to call, may be a Module name or a Method
119
130
  # @param [Array] arguments a String Array representing the arguments for the given command
120
131
  def self.run_command(base, command, arguments=[])
121
132
  arguments = [] if arguments.nil?
@@ -125,17 +136,7 @@ module Rubycom
125
136
  if base.included_modules.map { |mod| mod.name.to_sym }.include?(command.to_sym)
126
137
  self.run_command(eval(command), arguments[0], arguments[1..-1])
127
138
  else
128
- method = base.public_method(command.to_sym)
129
- raise CLIError, "No public method found for symbol: #{command.to_sym}" if method.nil?
130
- param_defs = Arguments.get_param_definitions(method)
131
- args = Arguments.parse_arguments(param_defs, arguments)
132
- flatten = false
133
- params = method.parameters.map { |arr| flatten = true if arr[0]==:rest; args[arr[1]] }
134
- if flatten
135
- rest_arr = params.delete_at(-1)
136
- rest_arr.each { |arg| params << arg }
137
- end
138
- (arguments.nil? || arguments.empty?) ? method.call : method.call(*params)
139
+ self.call_method(base, command, arguments)
139
140
  end
140
141
  rescue CLIError => e
141
142
  $stderr.puts e
@@ -143,6 +144,30 @@ module Rubycom
143
144
  end
144
145
  end
145
146
 
147
+ # Calls the given command on the given Module after parsing the given Array of arguments
148
+ #
149
+ # @param [Module] base the module wherein the specified command is defined
150
+ # @param [String] command the name of the Method to call
151
+ # @param [Array] arguments a String Array representing the arguments for the given command
152
+ # @return the result of the specified Method call
153
+ def self.call_method(base, command, arguments=[])
154
+ method = base.public_method(command.to_sym)
155
+ raise CLIError, "No public method found for symbol: #{command.to_sym}" if method.nil?
156
+ param_defs = Arguments.get_param_definitions(method)
157
+ args = Arguments.resolve(param_defs, arguments)
158
+ flatten = false
159
+ params = method.parameters.map { |arr| flatten = true if arr[0]==:rest; args[arr[1]] }
160
+ if flatten
161
+ rest_arr = params.delete_at(-1)
162
+ if rest_arr.respond_to?(:each)
163
+ rest_arr.each { |arg| params << arg }
164
+ else
165
+ params << rest_arr
166
+ end
167
+ end
168
+ (arguments.nil? || arguments.empty?) ? method.call : method.call(*params)
169
+ end
170
+
146
171
  # Inserts a tab completion into the current user's .bash_profile with a command entry to register the function for
147
172
  # the current running ruby file
148
173
  #
@@ -13,41 +13,61 @@ module Rubycom
13
13
  # }
14
14
  # @param [Array] arguments an Array of Strings representing the arguments to be parsed
15
15
  # @return [Hash] a Hash mapping the defined parameters to their matching argument values
16
- def self.parse_arguments(parameters={}, arguments=[])
16
+ def self.resolve(parameters={}, arguments=[])
17
17
  raise CLIError, 'parameters may not be nil' if parameters.nil?
18
18
  raise CLIError, 'arguments may not be nil' if arguments.nil?
19
- sorted_args = arguments.map { |arg|
20
- self.parse_arg(arg)
21
- }.group_by { |hsh|
22
- hsh.keys.first
23
- }.map { |key, arr|
24
- (key == :rubycom_non_opt_arg) ? Hash[key, arr.map { |hsh| hsh.values }.flatten(1)] : Hash[key, arr.map { |hsh| hsh.values.first }.reduce(&:merge)]
25
- }.reduce(&:merge) || {}
19
+ parsed_args = self.parse_args(arguments)
26
20
 
27
- sorted_arg_count = sorted_args.map { |key, val| val }.flatten(1).length
21
+ args = parsed_args[:rubycom_non_opt_arg] || []
22
+ options = parsed_args.select{|key,_| key != :rubycom_non_opt_arg } || {}
23
+ parsed_arg_count = args.length + options.length
28
24
  types = parameters.values.group_by { |hsh| hsh[:type] }.map { |type, defs_arr| Hash[type, defs_arr.length] }.reduce(&:merge) || {}
29
- raise CLIError, "Wrong number of arguments. Expected at least #{types[:req]}, received #{sorted_arg_count}" if sorted_arg_count < (types[:req]||0)
30
- raise CLIError, "Wrong number of arguments. Expected at most #{(types[:req]||0) + (types[:opt]||0)}, received #{sorted_arg_count}" if types[:rest].nil? && (sorted_arg_count > ((types[:req]||0) + (types[:opt]||0)))
25
+ raise CLIError, "Wrong number of arguments. Expected at least #{types[:req]}, received #{parsed_arg_count}" if parsed_arg_count < (types[:req]||0)
26
+ raise CLIError, "Wrong number of arguments. Expected at most #{(types[:req]||0) + (types[:opt]||0)}, received #{parsed_arg_count}" if types[:rest].nil? && (parsed_arg_count > ((types[:req]||0) + (types[:opt]||0)))
27
+
28
+ self.merge_params(parameters, parsed_args)
29
+ end
31
30
 
31
+ # Matches the given parameters to the given pre-parsed arguments
32
+ #
33
+ # @param [Hash] parameters a Hash representing the parameters to match.
34
+ # Entries should match :param_name => { type: :req||:opt||:rest,
35
+ # def:(source_definition),
36
+ # default:(default_value || :nil_rubycom_required_param)
37
+ # }
38
+ # @param [Hash] parsed_args a Hash of parsed arguments where the keys are either the name of the optional argument
39
+ # the value to designated for or :rubycom_non_opt_arg if the argument was not sent for a specified optional parameter
40
+ # @return [Hash] a Hash mapping the defined parameters to their matching argument values
41
+ def self.merge_params(parameters={}, parsed_args={})
32
42
  parameters.map { |param_sym, def_hash|
33
43
  if def_hash[:type] == :req
34
- raise CLIError, "No argument available for #{param_sym}" if sorted_args[:rubycom_non_opt_arg].nil? || sorted_args[:rubycom_non_opt_arg].length == 0
35
- Hash[param_sym, sorted_args[:rubycom_non_opt_arg].shift]
44
+ raise CLIError, "No argument available for #{param_sym}" if parsed_args[:rubycom_non_opt_arg].nil? || parsed_args[:rubycom_non_opt_arg].length == 0
45
+ Hash[param_sym, parsed_args[:rubycom_non_opt_arg].shift]
36
46
  elsif def_hash[:type] == :opt
37
- if sorted_args[param_sym].nil?
38
- arg = (sorted_args[:rubycom_non_opt_arg].nil? || sorted_args[:rubycom_non_opt_arg].empty?) ? parameters[param_sym][:default] : sorted_args[:rubycom_non_opt_arg].shift
47
+ if parsed_args[param_sym].nil?
48
+ arg = (parsed_args[:rubycom_non_opt_arg].nil? || parsed_args[:rubycom_non_opt_arg].empty?) ? parameters[param_sym][:default] : parsed_args[:rubycom_non_opt_arg].shift
39
49
  else
40
- arg = sorted_args[param_sym]
50
+ arg = parsed_args[param_sym]
41
51
  end
42
52
  Hash[param_sym, arg]
43
53
  elsif def_hash[:type] == :rest
44
- ret = Hash[param_sym, ((!sorted_args[param_sym].nil?) ? sorted_args[param_sym] : sorted_args[:rubycom_non_opt_arg])]
45
- sorted_args[:rubycom_non_opt_arg] = []
54
+ ret = Hash[param_sym, ((!parsed_args[param_sym].nil?) ? parsed_args[param_sym] : parsed_args[:rubycom_non_opt_arg])]
55
+ parsed_args[:rubycom_non_opt_arg] = []
46
56
  ret
47
57
  end
48
58
  }.reduce(&:merge)
49
59
  end
50
60
 
61
+ def self.parse_args(arguments)
62
+ arguments.map { |arg|
63
+ self.parse_arg(arg)
64
+ }.group_by { |hsh|
65
+ hsh.keys.first
66
+ }.map { |key, arr|
67
+ (key == :rubycom_non_opt_arg) ? Hash[key, arr.map { |hsh| hsh.values }.flatten(1)] : Hash[key, arr.map { |hsh| hsh.values.first }.reduce(&:merge)]
68
+ }.reduce(&:merge) || {}
69
+ end
70
+
51
71
  # Uses YAML.load to parse the given String
52
72
  #
53
73
  # @param [String] arg a String representing the argument to be parsed
@@ -60,12 +80,23 @@ module Rubycom
60
80
  k, v = arg.partition(/^(-|--)\w+[=|\s]{1}/).select { |part|
61
81
  !part.empty?
62
82
  }.each_with_index.map { |part, index|
63
- index == 0 ? part.chomp('=').gsub(/^--/, '').gsub(/^-/, '').strip.to_sym : (YAML.load(part) rescue "#{part}")
83
+ if index == 0
84
+ part.chomp('=').gsub(/^--/, '').gsub(/^-/, '').strip.to_sym
85
+ else
86
+ if part.start_with?("#") || part.start_with?("!")
87
+ "#{part}"
88
+ else
89
+ (YAML.load(part) rescue "#{part}")
90
+ end
91
+ end
64
92
  }
65
93
  Hash[k, v]
66
94
  else
67
95
  begin
68
- parsed_arg = YAML.load("#{arg}")
96
+ parsed_arg = "#{arg}"
97
+ unless arg.start_with?("#") || arg.start_with?("!")
98
+ parsed_arg = YAML.load("#{arg}")
99
+ end
69
100
  rescue Exception
70
101
  parsed_arg = "#{arg}"
71
102
  end
@@ -31,17 +31,7 @@ module Rubycom
31
31
  raise CLIError, "Can not get usage for #{command_name} with base: #{base||"nil"}" if base.nil? || !base.respond_to?(:included_modules)
32
32
  return 'No command specified.' if command_name.nil? || command_name.length == 0
33
33
  if base.included_modules.map { |mod| mod.name.to_sym }.include?(command_name.to_sym)
34
- begin
35
- mod_const = Kernel.const_get(command_name.to_sym)
36
- desc = File.read(mod_const.public_method(mod_const.singleton_methods().first).source_location.first).split(//).reduce("") { |str, c|
37
- unless str.gsub("\n", '').gsub(/\s+/, '').include?("module#{mod_const}")
38
- str << c
39
- end
40
- str
41
- }.split("\n").select { |line| line.strip.match(/^#/) && !line.strip.match(/^#!/) }.map { |line| line.strip.gsub(/^#+/, '') }.join("\n")
42
- rescue
43
- desc = ""
44
- end
34
+ desc = self.get_module_doc(command_name)
45
35
  else
46
36
  raise CLIError, "Invalid command for #{base}, #{command_name}" unless base.public_methods.include?(command_name.to_sym)
47
37
  desc = self.get_doc(base.public_method(command_name.to_sym))[:desc].join("\n") rescue ""
@@ -128,6 +118,24 @@ module Rubycom
128
118
  }.join
129
119
  end
130
120
 
121
+ # Retrieves the given module's documentation from it's source code
122
+ #
123
+ # @param [String] base_name
124
+ # @return [String] the documentation text from the top of the specified module
125
+ def self.get_module_doc(base_name)
126
+ begin
127
+ mod_const = Kernel.const_get(base_name.to_sym)
128
+ File.read(mod_const.public_method(mod_const.singleton_methods().first).source_location.first).split(//).reduce("") { |str, c|
129
+ unless str.gsub("\n", '').gsub(/\s+/, '').include?("module#{mod_const}")
130
+ str << c
131
+ end
132
+ str
133
+ }.split("\n").select { |line| line.strip.match(/^#/) && !line.strip.match(/^#!/) }.map { |line| line.strip.gsub(/^#+/, '') }.join("\n")
134
+ rescue
135
+ ""
136
+ end
137
+ end
138
+
131
139
  # Retrieves the given method's documentation from it's source code
132
140
  #
133
141
  # @param [Method] method the Method who's documentation should be retrieved
@@ -1,3 +1,3 @@
1
1
  module Rubycom
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.2"
3
3
  end
@@ -145,4 +145,145 @@ class ArgumentsTest < Test::Unit::TestCase
145
145
  assert_equal(expected, result)
146
146
  end
147
147
 
148
+ def test_parse_args_no_params
149
+ test_method = UtilTestModule.public_method(:test_command)
150
+ params = Rubycom::Arguments.get_param_definitions(test_method)
151
+ arguments = []
152
+ expected = nil
153
+ result = Rubycom::Arguments.resolve(params, arguments)
154
+ assert_equal(expected, result)
155
+ end
156
+
157
+ def test_parse_args_one_param
158
+ test_method = UtilTestModule.public_method(:test_command_with_arg)
159
+ params = Rubycom::Arguments.get_param_definitions(test_method)
160
+ arguments = ["abc"]
161
+ expected = {:test_arg=>"abc"}
162
+ result = Rubycom::Arguments.resolve(params, arguments)
163
+ assert_equal(expected, result)
164
+ end
165
+
166
+ def test_parse_args_one_param_array
167
+ test_method = UtilTestModule.public_method(:test_command_with_arg)
168
+ params = Rubycom::Arguments.get_param_definitions(test_method)
169
+ arguments = ["[a,b,c,1,2,3]"]
170
+ expected = {:test_arg=>['a','b','c',1,2,3]}
171
+ result = Rubycom::Arguments.resolve(params, arguments)
172
+ assert_equal(expected, result)
173
+ end
174
+
175
+ def test_parse_args_one_param_hash
176
+ test_method = UtilTestModule.public_method(:test_command_with_arg)
177
+ params = Rubycom::Arguments.get_param_definitions(test_method)
178
+ arguments = ["{abc: 123}"]
179
+ expected = {:test_arg=>{"abc"=>123}}
180
+ result = Rubycom::Arguments.resolve(params, arguments)
181
+ assert_equal(expected, result)
182
+ end
183
+
184
+ def test_parse_args_too_many_args
185
+ test_method = UtilTestModule.public_method(:test_command)
186
+ params = Rubycom::Arguments.get_param_definitions(test_method)
187
+ arguments = ["123"]
188
+ expected = nil
189
+ result = nil
190
+ assert_raise Rubycom::CLIError do
191
+ result = Rubycom::Arguments.resolve(params, arguments)
192
+ end
193
+ assert_equal(expected, result)
194
+ end
195
+
196
+ def test_parse_args_too_few_args
197
+ test_method = UtilTestModule.public_method(:test_command_with_arg)
198
+ params = Rubycom::Arguments.get_param_definitions(test_method)
199
+ arguments = []
200
+ expected = nil
201
+ result = nil
202
+ assert_raise Rubycom::CLIError do
203
+ result = Rubycom::Arguments.resolve(params, arguments)
204
+ end
205
+ assert_equal(expected, result)
206
+ end
207
+
208
+ def test_parse_args_with_options
209
+ test_method = UtilTestModule.public_method(:test_command_with_options)
210
+ params = Rubycom::Arguments.get_param_definitions(test_method)
211
+ arguments = [";asd"]
212
+ expected = {:test_arg=>";asd", :test_option=>"option_default"}
213
+ result = Rubycom::Arguments.resolve(params, arguments)
214
+ assert_equal(expected, result)
215
+ end
216
+
217
+ def test_parse_args_with_options_filled
218
+ test_method = UtilTestModule.public_method(:test_command_with_options)
219
+ params = Rubycom::Arguments.get_param_definitions(test_method)
220
+ arguments = ["[1,2,3]","--test_option=abc"]
221
+ expected = {:test_arg=>[1, 2, 3], :test_option=>"abc"}
222
+ result = Rubycom::Arguments.resolve(params, arguments)
223
+ assert_equal(expected, result)
224
+ end
225
+
226
+ def test_parse_args_all_options
227
+ test_method = UtilTestModule.public_method(:test_command_all_options)
228
+ params = Rubycom::Arguments.get_param_definitions(test_method)
229
+ arguments = []
230
+ expected = {:test_arg=>"test_arg_default", :test_option=>"test_option_default"}
231
+ result = Rubycom::Arguments.resolve(params, arguments)
232
+ assert_equal(expected, result)
233
+ end
234
+
235
+ def test_parse_args_all_opts_args_entered
236
+ test_method = UtilTestModule.public_method(:test_command_all_options)
237
+ params = Rubycom::Arguments.get_param_definitions(test_method)
238
+ arguments = ["[1,2,3]","abc"]
239
+ expected = {:test_arg=>[1, 2, 3], :test_option=>"abc"}
240
+ result = Rubycom::Arguments.resolve(params, arguments)
241
+ assert_equal(expected, result)
242
+ end
243
+
244
+ def test_parse_args_all_opts_filled
245
+ test_method = UtilTestModule.public_method(:test_command_all_options)
246
+ params = Rubycom::Arguments.get_param_definitions(test_method)
247
+ arguments = ["-test_arg='123asd'","--test_option=[b,c,d]"]
248
+ expected = {:test_arg=>"123asd", :test_option=>["b","c","d"]}
249
+ result = Rubycom::Arguments.resolve(params, arguments)
250
+ assert_equal(expected, result)
251
+ end
252
+
253
+ def test_parse_args_arr_option
254
+ test_method = UtilTestModule.public_method(:test_command_arg_arr)
255
+ params = Rubycom::Arguments.get_param_definitions(test_method)
256
+ arguments = ["--test_arr=['123','abc']"]
257
+ expected = {:test_arr=>["123","abc"]}
258
+ result = Rubycom::Arguments.resolve(params, arguments)
259
+ assert_equal(expected, result)
260
+ end
261
+
262
+ def test_parse_args_options_arr
263
+ test_method = UtilTestModule.public_method(:test_command_options_arr)
264
+ params = Rubycom::Arguments.get_param_definitions(test_method)
265
+ arguments = [",a2","1","2","3","a","b","c"]
266
+ expected = {:test_option=>",a2", :test_options=>[1, 2, 3, "a", "b", "c"]}
267
+ result = Rubycom::Arguments.resolve(params, arguments)
268
+ assert_equal(expected, result)
269
+ end
270
+
271
+ def test_parse_args_options_arr_with_arr
272
+ test_method = UtilTestModule.public_method(:test_command_options_arr)
273
+ params = Rubycom::Arguments.get_param_definitions(test_method)
274
+ arguments = [",a2","[1,2,3,a,b,c]"]
275
+ expected = {:test_option=>",a2", :test_options=>[[1, 2, 3, "a", "b", "c"]]}
276
+ result = Rubycom::Arguments.resolve(params, arguments)
277
+ assert_equal(expected, result)
278
+ end
279
+
280
+ def test_parse_args_hash
281
+ test_method = UtilTestModule.public_method(:test_command_arg_hash)
282
+ params = Rubycom::Arguments.get_param_definitions(test_method)
283
+ arguments = ["{testing: 'arg1', 123: 'abc', abc: 123}"]
284
+ expected = {:test_hash=>{"testing"=>"arg1", 123=>"abc", "abc"=>123}}
285
+ result = Rubycom::Arguments.resolve(params, arguments)
286
+ assert_equal(expected, result)
287
+ end
288
+
148
289
  end
@@ -281,28 +281,22 @@ class RubycomTest < Test::Unit::TestCase
281
281
  end
282
282
 
283
283
  def test_run_options_arr
284
- tst_out = ''
285
-
286
- def tst_out.write(data)
287
- self << data
288
- end
289
-
290
- o_stdout, $stdout = $stdout, tst_out
291
- o_stderr, $stderr = $stderr, tst_out
292
-
293
- base = UtilTestModule
294
- args = ["test_command_options_arr", "test_option1", "test_option2", 1.0, false]
295
- result = Rubycom.run(base, args)
284
+ mod = "util_test_module.rb"
285
+ command = "test_command_options_arr"
286
+ args = "test_option1 test_option2 1.0 false"
287
+ expected = 'Output is test_option=test_option1,test_option_arr=["test_option2", 1.0, false]'+"\n\n"
288
+ result = %x(ruby #{File.expand_path(File.dirname(__FILE__))}/#{mod} #{command} #{args})
289
+ assert_equal(expected, result)
290
+ end
296
291
 
297
- e_test_arg = 'test_option1'
298
- e_test_options = ["test_option2", 1.0, false]
299
- expected = nil
300
- expected_out = "Output is test_option=#{e_test_arg},test_option_arr=#{e_test_options}\n"
292
+ def test_run_multi_args
293
+ mod = "util_test_composite.rb"
294
+ sub_mod = "UtilTestModule"
295
+ command = "test_command_with_args"
296
+ args = "a b"
297
+ expected = 'test_arg=a,another_test_arg=b'+"\n\n"
298
+ result = %x(ruby #{File.expand_path(File.dirname(__FILE__))}/#{mod} #{sub_mod} #{command} #{args})
301
299
  assert_equal(expected, result)
302
- assert_equal(expected_out.gsub(/\n|\r|\s/, ''), tst_out.gsub(/\n|\r|\s/, ''))
303
- ensure
304
- $stdout = o_stdout
305
- $stderr = o_stderr
306
300
  end
307
301
 
308
302
  def test_run_missing_required_arg
@@ -369,6 +363,15 @@ class RubycomTest < Test::Unit::TestCase
369
363
  assert_equal(expected, result)
370
364
  end
371
365
 
366
+ def test_full_run_args_for_opts
367
+ mod = "util_test_module.rb"
368
+ command = "test_command_mixed_options"
369
+ args = "testing_arg test2 testing_option test_hsh_arg true some other args"
370
+ expected = "test_arg=testing_arg test_arr=test2 test_opt=testing_option test_hsh=test_hsh_arg test_bool=true test_rest=[\"some\", \"other\", \"args\"]"+"\n"
371
+ result = %x(ruby #{File.expand_path(File.dirname(__FILE__))}/#{mod} #{command} #{args})
372
+ assert_equal(expected, result)
373
+ end
374
+
372
375
  def test_full_run_mixed_args_solid_arr
373
376
  mod = "util_test_module.rb"
374
377
  command = "test_command_mixed_options"
@@ -414,6 +417,24 @@ class RubycomTest < Test::Unit::TestCase
414
417
  assert_equal(expected, result)
415
418
  end
416
419
 
420
+ def test_full_run_sharp_arg
421
+ mod = "util_test_module.rb"
422
+ command = "test_command_mixed_options"
423
+ args = '#' + " \"[test1, test2]\" -test_opt='testing_option' \"{a: 'test_hsh_arg'}\" -test_bool=true some other args"
424
+ expected = 'test_arg=# test_arr=["test1", "test2"] test_opt=testing_option test_hsh={"a"=>"test_hsh_arg"} test_bool=true test_rest=["some", "other", "args"]'+"\n"
425
+ result = %x(ruby #{File.expand_path(File.dirname(__FILE__))}/#{mod} #{command} #{args})
426
+ assert_equal(expected, result)
427
+ end
428
+
429
+ def test_full_run_bang_arg
430
+ mod = "util_test_module.rb"
431
+ command = "test_command_mixed_options"
432
+ args = "! \"[test1, test2]\" -test_opt='testing_option' \"{a: 'test_hsh_arg'}\" -test_bool=true some other args"
433
+ expected = 'test_arg=! test_arr=["test1", "test2"] test_opt=testing_option test_hsh={"a"=>"test_hsh_arg"} test_bool=true test_rest=["some", "other", "args"]'+"\n"
434
+ result = %x(ruby #{File.expand_path(File.dirname(__FILE__))}/#{mod} #{command} #{args})
435
+ assert_equal(expected, result)
436
+ end
437
+
417
438
  def test_tab_complete_nil_arg
418
439
  mod = UtilTestComposite
419
440
  args = nil
@@ -53,7 +53,7 @@ module UtilTestModule
53
53
 
54
54
  # A test_command with an options array
55
55
  # @param [String] test_option an optional test argument
56
- # @param [String] test_options an optional array of arguments
56
+ # @param [Array] test_options an optional array of arguments
57
57
  def self.test_command_options_arr (
58
58
  test_option="test_option_default",
59
59
  *test_options
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubycom
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Danny Purcell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-07-29 00:00:00.000000000 Z
11
+ date: 2013-09-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler