rubycom 0.2.5 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,102 @@
1
+ require 'yaml'
2
+ require 'method_source'
3
+
4
+ module Rubycom
5
+ module Arguments
6
+
7
+ # Parses the given arguments and matches them to the given parameters
8
+ #
9
+ # @param [Hash] parameters a Hash representing the parameters to match.
10
+ # Entries should match :param_name => { type: :req||:opt||:rest,
11
+ # def:(source_definition),
12
+ # default:(default_value || :nil_rubycom_required_param)
13
+ # }
14
+ # @param [Array] arguments an Array of Strings representing the arguments to be parsed
15
+ # @return [Hash] a Hash mapping the defined parameters to their matching argument values
16
+ def self.parse_arguments(parameters={}, arguments=[])
17
+ raise CLIError, 'parameters may not be nil' if parameters.nil?
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) || {}
26
+
27
+ sorted_arg_count = sorted_args.map { |key, val| val }.flatten(1).length
28
+ 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)))
31
+
32
+ parameters.map { |param_sym, def_hash|
33
+ 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]
36
+ 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
39
+ else
40
+ arg = sorted_args[param_sym]
41
+ end
42
+ Hash[param_sym, arg]
43
+ 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] = []
46
+ ret
47
+ end
48
+ }.reduce(&:merge)
49
+ end
50
+
51
+ # Uses YAML.load to parse the given String
52
+ #
53
+ # @param [String] arg a String representing the argument to be parsed
54
+ # @return [Object] the result of parsing the given arg with YAML.load
55
+ def self.parse_arg(arg)
56
+ return Hash[:rubycom_non_opt_arg, nil] if arg.nil?
57
+ if arg.is_a?(String) && ((arg.match(/^[-]{3,}\w+/) != nil) || ((arg.match(/^[-]{1,}\w+/) == nil) && (arg.match(/^\w+=/) != nil)))
58
+ raise CLIError, "Improper option specification, options must start with one or two dashes. Received: #{arg}"
59
+ elsif arg.is_a?(String) && arg.match(/^(-|--)\w+[=|\s]{1}/) != nil
60
+ k, v = arg.partition(/^(-|--)\w+[=|\s]{1}/).select { |part|
61
+ !part.empty?
62
+ }.each_with_index.map { |part, index|
63
+ index == 0 ? part.chomp('=').gsub(/^--/, '').gsub(/^-/, '').strip.to_sym : (YAML.load(part) rescue "#{part}")
64
+ }
65
+ Hash[k, v]
66
+ else
67
+ begin
68
+ parsed_arg = YAML.load("#{arg}")
69
+ rescue Exception
70
+ parsed_arg = "#{arg}"
71
+ end
72
+ Hash[:rubycom_non_opt_arg, parsed_arg]
73
+ end
74
+ end
75
+
76
+ # Builds a hash mapping parameter names (as symbols) to their
77
+ # :type (:req,:opt,:rest), :def (source_definition), :default (default_value || :nil_rubycom_required_param)
78
+ # for each parameter defined by the given method.
79
+ #
80
+ # @param [Method] method the Method who's parameter hash should be built
81
+ # @return [Hash] a Hash representing the given Method's parameters
82
+ def self.get_param_definitions(method)
83
+ raise CLIError, 'method must be an instance of the Method class' unless method.class == Method
84
+ method.parameters.map { |param|
85
+ param[1].to_s
86
+ }.map { |param_name|
87
+ {param_name.to_sym => method.source.split("\n").select { |line| line.include?(param_name) }.first}
88
+ }.map { |param_hash|
89
+ param_def = param_hash.flatten[1].gsub(/(def\s+self\.#{method.name.to_s}|def\s+#{method.name.to_s})/, '').lstrip.chomp.chomp(')').reverse.chomp('(').reverse.split(',').map { |param_n| param_n.lstrip }.select { |candidate| candidate.include?(param_hash.flatten[0].to_s) }.first
90
+ Hash[
91
+ param_hash.flatten[0],
92
+ Hash[
93
+ :def, param_def,
94
+ :type, method.parameters.select { |arr| arr[1] == param_hash.flatten[0] }.flatten[0],
95
+ :default, (param_def.include?('=') ? YAML.load(param_def.split('=')[1..-1].join('=')) : :nil_rubycom_required_param)
96
+ ]
97
+ ]
98
+ }.reduce(&:merge) || {}
99
+ end
100
+
101
+ end
102
+ end
@@ -0,0 +1,63 @@
1
+ module Rubycom
2
+ module Commands
3
+
4
+ # Retrieves the singleton methods in the given base and included Modules
5
+ #
6
+ # @param [Module] base the module which invoked 'include Rubycom'
7
+ # @param [Boolean] all if true recursively search for included modules' commands, if false return only top level commands
8
+ # @return [Hash] a Hash of Symbols representing the command methods in the given base and it's included modules (if all=true)
9
+ def self.get_commands(base, all=true)
10
+ return {} if base.nil? || !base.respond_to?(:singleton_methods) || !base.respond_to?(:included_modules)
11
+ {
12
+ base.name.to_sym => {
13
+ commands: base.singleton_methods(true).select { |sym| ![:included, :extended].include?(sym) },
14
+ inclusions: base.included_modules.select { |mod|
15
+ ![:Rubycom].include?(mod.name.to_sym)
16
+ }.map { |mod|
17
+ all ? self.get_commands(mod) : mod.name.to_sym
18
+ }
19
+ }
20
+ }
21
+ end
22
+
23
+ # Discovers the commands specified in the given base without considering the commands contained in sub-modules
24
+ #
25
+ # @param [Module] base the base Module to search
26
+ # @return [Array] a list of command name symbols which are defined in the given Module
27
+ def self.get_top_level_commands(base)
28
+ return {} if base.nil? || !base.respond_to?(:singleton_methods) || !base.respond_to?(:included_modules)
29
+ excluded_commands = [:included, :extended]
30
+ excluded_modules = [:Rubycom]
31
+ base.singleton_methods(true).select { |sym| !excluded_commands.include?(sym) } +
32
+ base.included_modules.select { |mod| !excluded_modules.include?(mod.name.to_sym) }.map { |mod| mod.name.to_sym }.flatten
33
+ end
34
+
35
+ # Discovers the commands specified in the given base and included Modules
36
+ #
37
+ # @param [Module] base the base Module to search
38
+ # @return [Hash] a set of command name symbols mapped to containing Modules
39
+ def self.index_commands(base)
40
+ excluded_commands = [:included, :extended]
41
+ excluded_modules = [:Rubycom]
42
+ Hash[base.singleton_methods(true).select { |sym| !excluded_commands.include?(sym) }.map { |sym|
43
+ [sym, base]
44
+ }].merge(
45
+ base.included_modules.select { |mod| !excluded_modules.include?(mod.name.to_sym) }.map { |mod|
46
+ self.index_commands(mod)
47
+ }.reduce(&:merge) || {}
48
+ )
49
+ end
50
+
51
+ # Looks up the commands which will be available on the given base Module and returns the longest command name
52
+ # Used in arranging the command list format
53
+ #
54
+ # @param [Module] base the base Module to look up
55
+ # @return [String] the longest command name which will show in a list of commands for the given base Module
56
+ def self.get_longest_command_name(base)
57
+ return '' if base.nil?
58
+ self.get_commands(base, false).map { |_, mod_hash|
59
+ mod_hash[:commands] + mod_hash[:inclusions].flatten }.flatten.max_by(&:size) or ''
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,204 @@
1
+ require "#{File.dirname(__FILE__)}/commands.rb"
2
+
3
+ module Rubycom
4
+ module Documentation
5
+
6
+ # Retrieves the summary for each command method in the given Module
7
+ #
8
+ # @param [Module] base the module which invoked 'include Rubycom'
9
+ # @return [String] the summary for each command method in the given Module
10
+ def self.get_summary(base)
11
+ Commands.get_top_level_commands(base).each_with_index.map { |sym, index|
12
+ "#{"Commands:\n" if index == 0}" << self.get_command_summary(base, sym, self.get_separator(sym, Commands.get_longest_command_name(base).length))
13
+ }.reduce(:+) or "No Commands found for #{base}."
14
+ end
15
+
16
+ # Creates a separator with the appropriate spacing to line up a command/description pair in a command list
17
+ #
18
+ # @param [Symbol] sym
19
+ # @param [Integer] spacer_length
20
+ # @return [String] a spaced separator String for use in a command/description list
21
+ def self.get_separator(sym, spacer_length=0)
22
+ [].unshift(" " * (spacer_length - sym.to_s.length)).join << " - "
23
+ end
24
+
25
+ # Retrieves the summary for the given command_name
26
+ #
27
+ # @param [Module] base the module which invoked 'include Rubycom'
28
+ # @param [String] command_name the command to retrieve usage for
29
+ # @return [String] a summary of the given command_name
30
+ def self.get_command_summary(base, command_name, separator = ' - ')
31
+ raise CLIError, "Can not get usage for #{command_name} with base: #{base||"nil"}" if base.nil? || !base.respond_to?(:included_modules)
32
+ return 'No command specified.' if command_name.nil? || command_name.length == 0
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
45
+ else
46
+ raise CLIError, "Invalid command for #{base}, #{command_name}" unless base.public_methods.include?(command_name.to_sym)
47
+ desc = self.get_doc(base.public_method(command_name.to_sym))[:desc].join("\n") rescue ""
48
+ end
49
+ (desc.nil?||desc=='nil'||desc.length==0) ? "#{command_name}\n" : self.get_formatted_summary(command_name, desc, separator)
50
+ end
51
+
52
+ # Arranges the given command_name and command_description with the separator in a standard format
53
+ #
54
+ # @param [String] command_name the command format
55
+ # @param [String] command_description the description for the given command
56
+ # @param [String] separator optional separator to use
57
+ def self.get_formatted_summary(command_name, command_description, separator = ' - ')
58
+ width = 95
59
+ prefix = command_name.to_s.split(//).map { " " }.join + separator.split(//).map { " " }.join
60
+ line_width = width - prefix.length
61
+ description_msg = command_description.gsub(/(.{1,#{line_width}})(?: +|$)\n?|(.{#{line_width}})/, "#{prefix}"+'\1\2'+"\n")
62
+ "#{command_name}#{separator}#{description_msg.lstrip}"
63
+ end
64
+
65
+ # Retrieves the usage description for the given Module with a list of command methods
66
+ #
67
+ # @param [Module] base the module which invoked 'include Rubycom'
68
+ # @return [String] the usage description for the module with a list of command methods
69
+ def self.get_usage(base)
70
+ return '' if base.nil? || !base.respond_to?(:included_modules)
71
+ return '' if Commands.get_top_level_commands(base).size == 0
72
+ "Usage:\n #{base} <command> [args]\n\n" << self.get_summary(base)
73
+ end
74
+
75
+ # Retrieves the usage description for the given command_name
76
+ #
77
+ # @param [Module] base the module which invoked 'include Rubycom'
78
+ # @param [String] command_name the command to retrieve usage for
79
+ # @param [Array] args the remaining args other than the command_name, used of sub-command look-ups
80
+ # @return [String] the detailed usage description for the given command_name
81
+ def self.get_command_usage(base, command_name, args=[])
82
+ raise CLIError, "Can not get usage for #{command_name} with base: #{base||"nil"}" if base.nil? || !base.respond_to?(:included_modules)
83
+ return 'No command specified.' if command_name.nil? || command_name.length == 0
84
+ if base.included_modules.map { |mod| mod.name.to_sym }.include?(command_name.to_sym)
85
+ if args.empty?
86
+ self.get_usage(eval(command_name.to_s))
87
+ else
88
+ self.get_command_usage(eval(command_name.to_s), args[0], args[1..-1])
89
+ end
90
+ else
91
+ raise CLIError, "Invalid command for #{base}, #{command_name}" unless base.public_methods.include?(command_name.to_sym)
92
+ m = base.public_method(command_name.to_sym)
93
+ method_doc = self.get_doc(m) || {}
94
+
95
+ msg = "Usage: #{m.name}#{self.get_param_usage(m)}\n"
96
+ msg << "Parameters:\n " unless m.parameters.empty?
97
+ msg << "#{method_doc[:param].join("\n ")}\n" unless method_doc[:param].nil?
98
+ msg << "Returns:\n " unless method_doc[:return].nil?
99
+ msg << "#{method_doc[:return].join("\n ")}\n" unless method_doc[:return].nil?
100
+ msg
101
+ end
102
+ end
103
+
104
+ # Discovers the given Method's parameters and uses them to build a formatted usage string
105
+ #
106
+ # @param [Method] method the Method object to generate usage for
107
+ def self.get_param_usage(method)
108
+ return "" if method.parameters.nil? || method.parameters.empty?
109
+ Arguments.get_param_definitions(method).group_by { |_, hsh|
110
+ hsh[:type]
111
+ }.map { |key, val_arr|
112
+ vals = Hash[*val_arr.flatten]
113
+ {
114
+ key => if key == :opt
115
+ vals.map { |param, val_hsh| "-#{param.to_s}=#{val_hsh[:default]}" }
116
+ elsif key == :req
117
+ vals.keys.map { |param| " <#{param.to_s}>" }
118
+ else
119
+ vals.keys.map { |param| " [&#{param.to_s}]" }
120
+ end
121
+ }
122
+ }.reduce(&:merge).map { |type, param_arr|
123
+ if type == :opt
124
+ " [#{param_arr.join("|")}]"
125
+ else
126
+ param_arr.join
127
+ end
128
+ }.join
129
+ end
130
+
131
+ # Retrieves the given method's documentation from it's source code
132
+ #
133
+ # @param [Method] method the Method who's documentation should be retrieved
134
+ # @return [Hash] a Hash representing the given Method's documentation, documentation parsed as follows:
135
+ # :desc = the first general method comment lines,
136
+ # :word = each @word comment (i.e.- a line starting with @param will be saved as :param => ["line"])
137
+ def self.get_doc(method)
138
+ method.comment.split("\n").map { |line|
139
+ line.gsub(/#\s*/, '') }.group_by { |doc|
140
+ if doc.match(/^@\w+/).nil?
141
+ :desc
142
+ else
143
+ doc.match(/^@\w+/).to_s.gsub('@', '').to_sym
144
+ end
145
+ }.map { |key, val|
146
+ Hash[key, val.map { |val_line| val_line.gsub(/^@\w+/, '').lstrip }.select { |line| line != '' }]
147
+ }.reduce(&:merge)
148
+ end
149
+
150
+ # @return [String] the usage message for Rubycom's default commands
151
+ def self.get_default_commands_usage()
152
+ <<-END.gsub(/^ {6}/,'')
153
+
154
+ Default Commands:
155
+ help - prints this help page
156
+ job - run a job file
157
+ register_completions - setup bash tab completion
158
+ tab_complete - print a list of possible matches for a given word
159
+ END
160
+ end
161
+
162
+ # @return [String] the usage message for Rubycom's job runner
163
+ def self.get_job_usage(base)
164
+ <<-END.gsub(/^ {6}/,'')
165
+ Usage: #{base} job <job_path>
166
+ Parameters:
167
+ [String] job_path the path to the job yaml to be run
168
+ Details:
169
+ A job yaml is any yaml file which follows the format below.
170
+ * The env: key shown below is optional
171
+ * The steps: key must contain a set of numbered steps as shown
172
+ * The desc: key shown below is an optional context for the job's log output
173
+ * Other than cmd: there may be as many keys in a numbered command as you choose
174
+ ---
175
+ env:
176
+ test_msg: Hello World
177
+ test_arg: 123
178
+ working_dir: ./test
179
+ steps:
180
+ 1:
181
+ desc: Run test command with environment variable
182
+ test_context: Some more log context
183
+ cmd: ruby env[working_dir]/test.rb test_command env[test_msg]
184
+ 2:
185
+ cmd: ls env[working_dir]
186
+ END
187
+ end
188
+
189
+ def self.get_register_completions_usage(base)
190
+ <<-END.gsub(/^ {6}/,'')
191
+ Usage: #{base} register_completions
192
+ END
193
+ end
194
+
195
+ def self.get_tab_complete_usage(base)
196
+ <<-END.gsub(/^ {6}/,'')
197
+ Usage: #{base} tab_complete <word>
198
+ Parameters:
199
+ [String] word the word or partial word to find matches for
200
+ END
201
+ end
202
+
203
+ end
204
+ end
@@ -1,3 +1,3 @@
1
1
  module Rubycom
2
- VERSION = "0.2.5"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -0,0 +1,148 @@
1
+ require "#{File.dirname(__FILE__)}/../../lib/rubycom/arguments.rb"
2
+
3
+ require "#{File.dirname(__FILE__)}/util_test_module.rb"
4
+ require "#{File.dirname(__FILE__)}/util_test_composite.rb"
5
+ require "#{File.dirname(__FILE__)}/util_test_no_singleton.rb"
6
+
7
+ require 'test/unit'
8
+
9
+ class ArgumentsTest < Test::Unit::TestCase
10
+
11
+ def test_parse_arg_string
12
+ test_arg = "test_arg"
13
+ result = Rubycom::Arguments.parse_arg(test_arg)
14
+ expected = {rubycom_non_opt_arg: "test_arg"}
15
+ assert_equal(expected, result)
16
+ end
17
+
18
+ def test_parse_arg_fixnum
19
+ test_arg = "1234512415435"
20
+ result = Rubycom::Arguments.parse_arg(test_arg)
21
+ expected = {rubycom_non_opt_arg: 1234512415435}
22
+ assert_equal(expected, result)
23
+ end
24
+
25
+ def test_parse_arg_float
26
+ test_arg = "12345.67890"
27
+ result = Rubycom::Arguments.parse_arg(test_arg)
28
+ expected = {rubycom_non_opt_arg: 12345.67890}
29
+ assert_equal(expected, result)
30
+ end
31
+
32
+ def test_parse_arg_timestamp
33
+ time = Time.new
34
+ test_arg = time.to_s
35
+ result = Rubycom::Arguments.parse_arg(test_arg)
36
+ expected = {rubycom_non_opt_arg: time}
37
+ assert_equal(expected[:rubycom_non_opt_arg].to_i, result[:rubycom_non_opt_arg].to_i)
38
+ end
39
+
40
+ def test_parse_arg_datetime
41
+ time = Time.new("2013-05-08 00:00:00 -0500")
42
+ date = Date.new(time.year, time.month, time.day)
43
+ test_arg = date.to_s
44
+ result = Rubycom::Arguments.parse_arg(test_arg)
45
+ expected = {rubycom_non_opt_arg: date}
46
+ assert_equal(expected, result)
47
+ end
48
+
49
+ def test_parse_arg_array
50
+ test_arg = ["1", 2, "a", 'b']
51
+ result = Rubycom::Arguments.parse_arg(test_arg.to_s)
52
+ expected = {rubycom_non_opt_arg: test_arg}
53
+ assert_equal(expected, result)
54
+ end
55
+
56
+ def test_parse_arg_hash
57
+ time = Time.new.to_s
58
+ test_arg = ":a: \"#{time}\""
59
+ result = Rubycom::Arguments.parse_arg(test_arg.to_s)
60
+ expected = {rubycom_non_opt_arg: {a: time}}
61
+ assert_equal(expected, result)
62
+ end
63
+
64
+ def test_parse_arg_hash_group
65
+ test_arg = ":a: [1,2]\n:b: 1\n:c: test\n:d: 1.0\n:e: \"2013-05-08 23:21:52 -0500\"\n"
66
+ result = Rubycom::Arguments.parse_arg(test_arg.to_s)
67
+ expected = {rubycom_non_opt_arg: {:a => [1, 2], :b => 1, :c => "test", :d => 1.0, :e => "2013-05-08 23:21:52 -0500"}}
68
+ assert_equal(expected, result)
69
+ end
70
+
71
+ def test_parse_arg_yaml
72
+ test_arg = {:a => ["1", 2, "a", 'b'], :b => 1, :c => "test", :d => "#{Time.now.to_s}"}
73
+ result = Rubycom::Arguments.parse_arg(test_arg.to_yaml)
74
+ expected = {rubycom_non_opt_arg: test_arg}
75
+ assert_equal(expected, result)
76
+ end
77
+
78
+ def test_parse_arg_code
79
+ test_arg = 'def self.test_code_method; raise "Fail - test_parse_arg_code";end'
80
+ result = Rubycom::Arguments.parse_arg(test_arg.to_s)
81
+ expected = {rubycom_non_opt_arg: 'def self.test_code_method; raise "Fail - test_parse_arg_code";end'}
82
+ assert_equal(expected, result)
83
+ end
84
+
85
+ def test_parse_opt_string_eq
86
+ test_arg = "-test_arg=\"test\""
87
+ result = Rubycom::Arguments.parse_arg(test_arg)
88
+ expected = {test_arg: "test"}
89
+ assert_equal(expected, result)
90
+ end
91
+
92
+ def test_parse_opt_string_sp
93
+ test_arg = "-test_arg \"test\""
94
+ result = Rubycom::Arguments.parse_arg(test_arg)
95
+ expected = {test_arg: "test"}
96
+ assert_equal(expected, result)
97
+ end
98
+
99
+ def test_parse_opt_long_string_eq
100
+ test_arg = "--test_arg=\"test\""
101
+ result = Rubycom::Arguments.parse_arg(test_arg)
102
+ expected = {test_arg: "test"}
103
+ assert_equal(expected, result)
104
+ end
105
+
106
+ def test_parse_opt_long_string_sp
107
+ test_arg = "--test_arg \"test\""
108
+ result = Rubycom::Arguments.parse_arg(test_arg)
109
+ expected = {test_arg: "test"}
110
+ assert_equal(expected, result)
111
+ end
112
+
113
+ def test_get_param_definitions
114
+ test_method = UtilTestModule.public_method('test_command_with_args')
115
+ expected = {:test_arg => {:def => "test_arg", :type => :req, :default => :nil_rubycom_required_param}, :another_test_arg => {:def => "another_test_arg", :type => :req, :default => :nil_rubycom_required_param}}
116
+ result = Rubycom::Arguments.get_param_definitions(test_method)
117
+ assert_equal(expected, result)
118
+ end
119
+
120
+ def test_get_param_definitions_no_args
121
+ test_method = UtilTestModule.public_method('test_command')
122
+ expected = {}
123
+ result = Rubycom::Arguments.get_param_definitions(test_method)
124
+ assert_equal(expected, result)
125
+ end
126
+
127
+ def test_get_param_definitions_arr_param
128
+ test_method = UtilTestModule.public_method('test_command_options_arr')
129
+ expected = {:test_option => {:def => "test_option=\"test_option_default\"", :type => :opt, :default => "test_option_default"}, :test_options => {:def => "*test_options", :type => :rest, :default => :nil_rubycom_required_param}}
130
+ result = Rubycom::Arguments.get_param_definitions(test_method)
131
+ assert_equal(expected, result)
132
+ end
133
+
134
+ def test_get_param_definitions_all_options
135
+ test_method = UtilTestModule.public_method('test_command_all_options')
136
+ expected = {:test_arg => {:def => "test_arg='test_arg_default'", :type => :opt, :default => "test_arg_default"}, :test_option => {:def => "test_option='test_option_default'", :type => :opt, :default => "test_option_default"}}
137
+ result = Rubycom::Arguments.get_param_definitions(test_method)
138
+ assert_equal(expected, result)
139
+ end
140
+
141
+ def test_get_param_definitions_mixed
142
+ test_method = UtilTestModule.public_method('test_command_with_options')
143
+ expected = {:test_arg => {:def => "test_arg", :type => :req, :default => :nil_rubycom_required_param}, :test_option => {:def => "test_option='option_default'", :type => :opt, :default => "option_default"}}
144
+ result = Rubycom::Arguments.get_param_definitions(test_method)
145
+ assert_equal(expected, result)
146
+ end
147
+
148
+ end