command_mapper 0.1.0.pre1

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.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ruby.yml +27 -0
  3. data/.gitignore +10 -0
  4. data/.rspec +1 -0
  5. data/.yardopts +1 -0
  6. data/ChangeLog.md +25 -0
  7. data/Gemfile +15 -0
  8. data/LICENSE.txt +20 -0
  9. data/README.md +369 -0
  10. data/Rakefile +12 -0
  11. data/commnad_mapper.gemspec +61 -0
  12. data/gemspec.yml +23 -0
  13. data/lib/command_mapper/arg.rb +75 -0
  14. data/lib/command_mapper/argument.rb +142 -0
  15. data/lib/command_mapper/command.rb +606 -0
  16. data/lib/command_mapper/exceptions.rb +19 -0
  17. data/lib/command_mapper/option.rb +282 -0
  18. data/lib/command_mapper/option_value.rb +21 -0
  19. data/lib/command_mapper/sudo.rb +73 -0
  20. data/lib/command_mapper/types/enum.rb +35 -0
  21. data/lib/command_mapper/types/hex.rb +82 -0
  22. data/lib/command_mapper/types/input_dir.rb +35 -0
  23. data/lib/command_mapper/types/input_file.rb +35 -0
  24. data/lib/command_mapper/types/input_path.rb +29 -0
  25. data/lib/command_mapper/types/key_value.rb +131 -0
  26. data/lib/command_mapper/types/key_value_list.rb +45 -0
  27. data/lib/command_mapper/types/list.rb +90 -0
  28. data/lib/command_mapper/types/map.rb +64 -0
  29. data/lib/command_mapper/types/num.rb +50 -0
  30. data/lib/command_mapper/types/str.rb +85 -0
  31. data/lib/command_mapper/types/type.rb +102 -0
  32. data/lib/command_mapper/types.rb +6 -0
  33. data/lib/command_mapper/version.rb +4 -0
  34. data/lib/command_mapper.rb +2 -0
  35. data/spec/arg_spec.rb +137 -0
  36. data/spec/argument_spec.rb +513 -0
  37. data/spec/commnad_spec.rb +1175 -0
  38. data/spec/exceptions_spec.rb +14 -0
  39. data/spec/option_spec.rb +882 -0
  40. data/spec/option_value_spec.rb +17 -0
  41. data/spec/spec_helper.rb +6 -0
  42. data/spec/sudo_spec.rb +24 -0
  43. data/spec/types/enum_spec.rb +31 -0
  44. data/spec/types/hex_spec.rb +158 -0
  45. data/spec/types/input_dir_spec.rb +30 -0
  46. data/spec/types/input_file_spec.rb +34 -0
  47. data/spec/types/input_path_spec.rb +32 -0
  48. data/spec/types/key_value_list_spec.rb +100 -0
  49. data/spec/types/key_value_spec.rb +272 -0
  50. data/spec/types/list_spec.rb +143 -0
  51. data/spec/types/map_spec.rb +62 -0
  52. data/spec/types/num_spec.rb +90 -0
  53. data/spec/types/str_spec.rb +232 -0
  54. data/spec/types/type_spec.rb +59 -0
  55. metadata +118 -0
@@ -0,0 +1,142 @@
1
+ require 'command_mapper/exceptions'
2
+ require 'command_mapper/arg'
3
+
4
+ module CommandMapper
5
+ #
6
+ # Represents an additional argument of a command.
7
+ #
8
+ class Argument < Arg
9
+
10
+ # The argument name.
11
+ #
12
+ # @return [Symbol]
13
+ attr_reader :name
14
+
15
+ #
16
+ # Initializes the argument.
17
+ #
18
+ # @param [Symbol] name
19
+ # The argument's name.
20
+ #
21
+ # @param [Boolean] required
22
+ # Specifies whether the argument is required or can be omitted.
23
+ #
24
+ # @param [Types::Type, Hash] type
25
+ # The value type of the argument.
26
+ #
27
+ # @param [Boolean] repeats
28
+ # Specifies whether the argument can be given multiple times.
29
+ #
30
+ # @raise [ArgumentError]
31
+ # The given `type:` must not be `false` or `nil`.
32
+ #
33
+ def initialize(name, required: true, type: Types::Str.new, repeats: false)
34
+ super(required: required, type: type)
35
+
36
+ @name = name
37
+ @repeats = repeats
38
+ end
39
+
40
+ #
41
+ # Indicates whether the arg can be repeated multiple times or not.
42
+ #
43
+ # @return [Boolean]
44
+ #
45
+ def repeats?
46
+ @repeats
47
+ end
48
+
49
+ #
50
+ # Validates whether a given value is compatible with the arg.
51
+ #
52
+ # @param [Array<Object>, Object] value
53
+ #
54
+ # @return [true, (false, String)]
55
+ # Returns true if the value is valid, or `false` and a validation error
56
+ # message if the value is not compatible.
57
+ #
58
+ def validate(value)
59
+ if repeats?
60
+ values = case value
61
+ when Array then value
62
+ else [value]
63
+ end
64
+
65
+ if required?
66
+ # argument requires atleast one value
67
+ if values.empty?
68
+ return [false, "requires at least one value"]
69
+ end
70
+ end
71
+
72
+ # validate each element in the value
73
+ values.each do |element|
74
+ valid, message = @type.validate(element)
75
+
76
+ unless valid
77
+ return [valid, message]
78
+ end
79
+ end
80
+
81
+ return true
82
+ else
83
+ super(value)
84
+ end
85
+ end
86
+
87
+ #
88
+ # Converts the given value into the command-line arguments for the
89
+ # argument's flag and value.
90
+ #
91
+ # @param [Array] argv
92
+ # The argv array.
93
+ #
94
+ # @param [Object] value
95
+ # The value for the argument.
96
+ #
97
+ # @return [Array<String>]
98
+ # The command-line arguments.
99
+ #
100
+ # @raise [ArgumentError]
101
+ # The given value was incompatible with the argument.
102
+ #
103
+ def argv(argv=[],value)
104
+ valid, message = validate(value)
105
+
106
+ unless valid
107
+ raise(ValidationError,"argument #{@name} was given an invalid value (#{value.inspect}): #{message}")
108
+ end
109
+
110
+ if repeats?
111
+ values = Array(value)
112
+
113
+ values.each do |element|
114
+ emit_arg_value(argv,element)
115
+ end
116
+ else
117
+ emit_arg_value(argv,value)
118
+ end
119
+
120
+ return argv
121
+ end
122
+
123
+ private
124
+
125
+ #
126
+ # Emits a single command-line arg value.
127
+ #
128
+ # @param [Array<String>] argv
129
+ # The argv array to append to.
130
+ #
131
+ # @param [Object] value
132
+ # The value for the argument.
133
+ #
134
+ def emit_arg_value(argv,value)
135
+ # explicitly ignore nil values
136
+ unless value.nil?
137
+ argv << @type.format(value)
138
+ end
139
+ end
140
+
141
+ end
142
+ end