cliqr 2.1.1 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +43 -0
- data/Rakefile +2 -2
- data/lib/cliqr/argument_validation/option_validator.rb +4 -2
- data/lib/cliqr/argument_validation/validator.rb +2 -2
- data/lib/cliqr/command/command_context.rb +38 -13
- data/lib/cliqr/command/shell_command.rb +1 -1
- data/lib/cliqr/config/base.rb +3 -3
- data/lib/cliqr/config/option.rb +14 -0
- data/lib/cliqr/config/validation/validator_factory.rb +11 -11
- data/lib/cliqr/executor/command_runner_factory.rb +3 -3
- data/lib/cliqr/interface.rb +2 -2
- data/lib/cliqr/parser/option_token.rb +2 -2
- data/lib/cliqr/parser/parsed_input.rb +1 -5
- data/lib/cliqr/parser/parsed_input_builder.rb +17 -6
- data/lib/cliqr/usage/usage_builder.rb +2 -2
- data/lib/cliqr/version.rb +1 -1
- data/spec/argument_parser_spec_helper.rb +1 -1
- data/spec/config/option_config_validator_spec.rb +13 -0
- data/spec/dsl/usage_spec.rb +1 -1
- data/spec/executor/event_executor_spec.rb +2 -2
- data/spec/executor/executor_spec.rb +57 -0
- data/spec/executor/selection_spec.rb +23 -0
- data/spec/fixtures/test_invoker_event_handler.rb +1 -1
- data/spec/parser/action_argument_parser_spec.rb +14 -26
- data/spec/parser/argument_parser_spec.rb +84 -48
- data/spec/shell/shell_executor_spec.rb +1 -26
- data/spec/spec_util.rb +27 -0
- metadata +9 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aa7b636b8c96c46131bce26dc5019a0ab0a1cadc
|
4
|
+
data.tar.gz: a7a236dd9d2c144b271e132e8520c75cac921094
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64435fe4b4bb4c5eebd23452c091d474f282eea28d997d11d3f81a52404bab76ba12c3b52f4f8b5a551f13704b2285a74a3b1860274891cf7b0c6d9ca57d0e9e
|
7
|
+
data.tar.gz: c0134be11cb243f3073277f745719c4376be96b33a876b0c9cfb5d7b99ff1ce7cd49cf41065bdef48b0d7d14e88ddb13da22b80d1e56c6cf831e9acdf9b4c1d1
|
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,17 @@ item in this nested table for further details.
|
|
5
5
|
<!-- markdown-toc start - Don't edit this section. Run M-x markdown-toc/generate-toc again -->
|
6
6
|
**Table of Contents**
|
7
7
|
|
8
|
+
- [2.2.0 / 2015-07-28](#220--2015-07-28)
|
9
|
+
- [Features](#features)
|
10
|
+
- [Ability to hook into sawaal for selection](#ability-to-hook-into-sawaal-for-selection)
|
11
|
+
- [Ability to specify multiple values for an option](#ability-to-specify-multiple-values-for-an-option)
|
12
|
+
- [Compatibility upgrades](#compatibility-upgrades)
|
13
|
+
- [Not supporting ruby versions 1.9.3 and jruby-19mode](#not-supporting-ruby-versions-193-and-jruby-19mode)
|
14
|
+
- [Bugfix](#bugfix)
|
15
|
+
- [Make sure specs are executing in CI](#make-sure-specs-are-executing-in-ci)
|
16
|
+
- [Upgrade and fix style issues in rubocop](#upgrade-and-fix-style-issues-in-rubocop)
|
17
|
+
- [Minor Improvements](#minor-improvements)
|
18
|
+
- [Enable all auto fixable rubocops](#enable-all-auto-fixable-rubocops)
|
8
19
|
- [2.1.1 / 2015-07-15](#211--2015-07-15)
|
9
20
|
- [Bugfix](#bugfix)
|
10
21
|
- [2.1.0 / 2015-07-15](#210--2015-07-15)
|
@@ -118,6 +129,38 @@ item in this nested table for further details.
|
|
118
129
|
|
119
130
|
<!-- markdown-toc end -->
|
120
131
|
|
132
|
+
|
133
|
+
2.2.0 / 2015-07-28
|
134
|
+
==================
|
135
|
+
|
136
|
+
Some shiny new features coming in this release.
|
137
|
+
|
138
|
+
## Features
|
139
|
+
|
140
|
+
### Ability to hook into sawaal for selection
|
141
|
+
|
142
|
+
`[Sawaal](https://github.com/anshulverma/sawaal)` allows us to allow
|
143
|
+
users to use arrow keys to make selection in a list of items.
|
144
|
+
|
145
|
+
### Ability to specify multiple values for an option
|
146
|
+
|
147
|
+
Now we can specify multiple values for a option. Simple set
|
148
|
+
`multi_valued` property to true for a option to make it multi_valued.
|
149
|
+
|
150
|
+
## Compatibility upgrades
|
151
|
+
|
152
|
+
### Not supporting ruby versions 1.9.3 and jruby-19mode
|
153
|
+
|
154
|
+
## Bugfix
|
155
|
+
|
156
|
+
### Make sure specs are executing in CI
|
157
|
+
|
158
|
+
### Upgrade and fix style issues in rubocop
|
159
|
+
|
160
|
+
## Minor Improvements
|
161
|
+
|
162
|
+
### Enable all auto fixable rubocops
|
163
|
+
|
121
164
|
2.1.1 / 2015-07-15
|
122
165
|
==================
|
123
166
|
|
data/Rakefile
CHANGED
@@ -13,7 +13,7 @@ FileList['tasks/*.rake'].each(&method(:import))
|
|
13
13
|
desc 'run code coverage checker'
|
14
14
|
task :coverage do
|
15
15
|
ENV['COVERAGE'] = 'true'
|
16
|
-
Rake::Task['spec'].
|
16
|
+
Rake::Task['spec'].invoke
|
17
17
|
end
|
18
18
|
|
19
19
|
desc 'default rake task'
|
@@ -22,7 +22,7 @@ task default: [:clean, :coverage, :rubocop, :verify_measurements, :yardstick_mea
|
|
22
22
|
desc 'run CI tasks'
|
23
23
|
task :ci do
|
24
24
|
ENV['CI'] = 'true'
|
25
|
-
Rake::Task['default'].
|
25
|
+
Rake::Task['default'].invoke
|
26
26
|
end
|
27
27
|
|
28
28
|
desc 'Load gem inside irb console'
|
@@ -18,8 +18,10 @@ module Cliqr
|
|
18
18
|
# Run all the validators for a option
|
19
19
|
#
|
20
20
|
# @return [Cliqr::ValidationErrors]
|
21
|
-
def validate(
|
22
|
-
@validators.each
|
21
|
+
def validate(values, option, errors)
|
22
|
+
@validators.each do |validator|
|
23
|
+
values.each { |value| validator.validate(value, option, errors) }
|
24
|
+
end
|
23
25
|
errors
|
24
26
|
end
|
25
27
|
end
|
@@ -39,9 +39,9 @@ module Cliqr
|
|
39
39
|
# Validate a argument for an option and return errors
|
40
40
|
#
|
41
41
|
# @return [Cliqr::ValidationErrors]
|
42
|
-
def validate_argument(
|
42
|
+
def validate_argument(values, option, errors)
|
43
43
|
option_validator = get_option_validator(option)
|
44
|
-
option_validator.validate(
|
44
|
+
option_validator.validate(values, option, errors)
|
45
45
|
errors
|
46
46
|
end
|
47
47
|
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
+
require 'sawaal'
|
4
|
+
|
3
5
|
require 'cliqr/command/color'
|
4
6
|
require 'cliqr/command/argument_operator_context'
|
5
7
|
require 'cliqr/events/invoker'
|
@@ -119,6 +121,13 @@ module Cliqr
|
|
119
121
|
@executor.call(args, options)
|
120
122
|
end
|
121
123
|
|
124
|
+
# Run the [Sawaal] selector on a set of options
|
125
|
+
#
|
126
|
+
# @return [Object] Selected key
|
127
|
+
def ask(question, options)
|
128
|
+
Sawaal.select(question, options)
|
129
|
+
end
|
130
|
+
|
122
131
|
# Invoke an event
|
123
132
|
#
|
124
133
|
# @return [Boolean] <tt>true</tt> if the event was handled by any event handler
|
@@ -139,7 +148,7 @@ module Cliqr
|
|
139
148
|
def get_or_check_option(name)
|
140
149
|
option_name = name.to_s.chomp('?')
|
141
150
|
existence_check = name.to_s.end_with?('?')
|
142
|
-
existence_check ? option?(option_name) : option(option_name)
|
151
|
+
existence_check ? option?(option_name) : option(option_name) \
|
143
152
|
if @config.option?(option_name)
|
144
153
|
end
|
145
154
|
|
@@ -148,7 +157,7 @@ module Cliqr
|
|
148
157
|
# @return [Object]
|
149
158
|
def default(name)
|
150
159
|
option_config = @config.option(name)
|
151
|
-
CommandOption.new(
|
160
|
+
CommandOption.new(name, [option_config.default], option_config)
|
152
161
|
end
|
153
162
|
|
154
163
|
# Check if running in a bash environment
|
@@ -203,8 +212,8 @@ module Cliqr
|
|
203
212
|
#
|
204
213
|
# @return [Cliqr::Command::CommandContext] A newly created CommandContext instance
|
205
214
|
def build
|
206
|
-
option_contexts = @parsed_input.options.map do |
|
207
|
-
CommandOption.new(
|
215
|
+
option_contexts = @parsed_input.options.map do |option_name, option_values|
|
216
|
+
CommandOption.new(option_name, option_values, @config.option(option_name))
|
208
217
|
end
|
209
218
|
|
210
219
|
CommandContext.new @config,
|
@@ -239,27 +248,43 @@ module Cliqr
|
|
239
248
|
# @return [String]
|
240
249
|
attr_accessor :name
|
241
250
|
|
242
|
-
# Value for the command line argument's option
|
251
|
+
# Value array for the command line argument's option
|
243
252
|
#
|
244
|
-
# @return [
|
245
|
-
attr_accessor :
|
253
|
+
# @return [Array]
|
254
|
+
attr_accessor :values
|
246
255
|
|
247
256
|
# Create a new command line option instance
|
248
257
|
#
|
249
|
-
# @param [
|
258
|
+
# @param [String] name Name of the option
|
259
|
+
# @param [Array] values Parsed values for this option
|
250
260
|
# @param [Cliqr::Config::Option] option_config Option's config settings
|
251
261
|
#
|
252
262
|
# @return [Cliqr::Command::CommandContext] A new CommandOption object
|
253
|
-
def initialize(
|
254
|
-
@
|
255
|
-
@
|
263
|
+
def initialize(name, values, option_config)
|
264
|
+
@name = name
|
265
|
+
@values = values.map { |value| run_value_operator(value, option_config.operator) }
|
266
|
+
end
|
267
|
+
|
268
|
+
# Get value for this option
|
269
|
+
#
|
270
|
+
# @return [Object] Joins in a CSV format if multiple
|
271
|
+
def value
|
272
|
+
return values.first if values.length == 1
|
273
|
+
values.join(',')
|
274
|
+
end
|
275
|
+
|
276
|
+
# Get string representation for this option
|
277
|
+
#
|
278
|
+
# @return [String]
|
279
|
+
def to_s
|
280
|
+
value.to_s
|
256
281
|
end
|
257
282
|
|
258
283
|
private
|
259
284
|
|
260
|
-
# Run the operator for a named attribute for
|
285
|
+
# Run the operator for a named attribute for option's values
|
261
286
|
#
|
262
|
-
# @return [
|
287
|
+
# @return [Array]
|
263
288
|
def run_value_operator(value, operator)
|
264
289
|
if operator.is_a?(Proc)
|
265
290
|
Command::ArgumentOperatorContext.new(value).instance_eval(&operator)
|
@@ -110,7 +110,7 @@ module Cliqr
|
|
110
110
|
@context.puts "unknown action \"#{action_name}\""
|
111
111
|
return Cliqr::Executor::ExitCode.code(nil)
|
112
112
|
end
|
113
|
-
@context.forward("#{@base_command} #{command}", :
|
113
|
+
@context.forward("#{@base_command} #{command}", environment: @context.environment)
|
114
114
|
rescue StandardError => e
|
115
115
|
@context.puts e.message
|
116
116
|
end
|
data/lib/cliqr/config/base.rb
CHANGED
@@ -28,9 +28,9 @@ module Cliqr
|
|
28
28
|
|
29
29
|
# Default values based on argument type
|
30
30
|
ARGUMENT_DEFAULTS = {
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
NUMERIC_ARGUMENT_TYPE => 0,
|
32
|
+
BOOLEAN_ARGUMENT_TYPE => false,
|
33
|
+
ANY_ARGUMENT_TYPE => nil
|
34
34
|
}
|
35
35
|
|
36
36
|
# Get the passed param value if current attribute is unset
|
data/lib/cliqr/config/option.rb
CHANGED
@@ -33,6 +33,13 @@ module Cliqr
|
|
33
33
|
{ type_of: Proc }
|
34
34
|
]
|
35
35
|
|
36
|
+
# Enable or disable multiple values for this option
|
37
|
+
#
|
38
|
+
# @return [Boolean]
|
39
|
+
attr_accessor :multi_valued
|
40
|
+
validates :multi_valued,
|
41
|
+
inclusion: [true, false]
|
42
|
+
|
36
43
|
# Default value for this option
|
37
44
|
#
|
38
45
|
# @return [Object]
|
@@ -46,6 +53,7 @@ module Cliqr
|
|
46
53
|
@type = UNSET
|
47
54
|
@operator = UNSET
|
48
55
|
@default = UNSET
|
56
|
+
@multi_valued = UNSET
|
49
57
|
end
|
50
58
|
|
51
59
|
# Finalize option's config by adding default values for unset values
|
@@ -59,6 +67,7 @@ module Cliqr
|
|
59
67
|
@operator = Util.ensure_instance(
|
60
68
|
Config.get_if_unset(@operator, Cliqr::Command::ArgumentOperator.for_type(@type)))
|
61
69
|
@default = Config.get_if_unset(@default, ARGUMENT_DEFAULTS[@type])
|
70
|
+
@multi_valued = Config.get_if_unset(@multi_valued, false)
|
62
71
|
|
63
72
|
self
|
64
73
|
end
|
@@ -90,6 +99,11 @@ module Cliqr
|
|
90
99
|
def default?
|
91
100
|
!@default.nil?
|
92
101
|
end
|
102
|
+
|
103
|
+
# Check if this option supports multiple values
|
104
|
+
def multi_valued?
|
105
|
+
@multi_valued
|
106
|
+
end
|
93
107
|
end
|
94
108
|
end
|
95
109
|
end
|
@@ -373,17 +373,17 @@ module Cliqr
|
|
373
373
|
|
374
374
|
# A hash of validator type id to validator class
|
375
375
|
VALIDATORS = {
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
376
|
+
non_empty: NonEmptyValidator,
|
377
|
+
non_empty_format: NonEmptyFormatValidator,
|
378
|
+
non_empty_nil_ok_format: NonEmptyNilOkFormatValidator,
|
379
|
+
format: FormatValidator,
|
380
|
+
extend: TypeHierarchyValidator,
|
381
|
+
collection: CollectionValidator,
|
382
|
+
hash: HashValidator,
|
383
|
+
inclusion: InclusionValidator,
|
384
|
+
one_of: OneOfValidator,
|
385
|
+
type_of: TypeOfValidator,
|
386
|
+
child: ChildValidator
|
387
387
|
}
|
388
388
|
|
389
389
|
# Get a new validator based on the type and config param
|
@@ -50,9 +50,9 @@ module Cliqr
|
|
50
50
|
$stderr = old_stderr.is_a?(StringIO) ? old_stderr : StringIO.new('', 'w')
|
51
51
|
yield
|
52
52
|
{
|
53
|
-
|
54
|
-
|
55
|
-
|
53
|
+
stdout: $stdout.string,
|
54
|
+
stderr: $stderr.string,
|
55
|
+
status: 0
|
56
56
|
}
|
57
57
|
ensure
|
58
58
|
$stdout = old_stdout
|
data/lib/cliqr/interface.rb
CHANGED
@@ -49,8 +49,8 @@ module Cliqr
|
|
49
49
|
# @return [Integer] Exit code
|
50
50
|
def execute_internal(args = [], **options)
|
51
51
|
options = {
|
52
|
-
|
53
|
-
|
52
|
+
output: :default,
|
53
|
+
environment: :cli
|
54
54
|
}.merge(options)
|
55
55
|
@runner.execute(args, options)
|
56
56
|
end
|
@@ -23,11 +23,7 @@ module Cliqr
|
|
23
23
|
# Initialize a new parsed input
|
24
24
|
def initialize(parsed_arguments)
|
25
25
|
@command = parsed_arguments[:command]
|
26
|
-
|
27
|
-
@options = Hash[parsed_arguments[:options].collect \
|
28
|
-
{ |option| [option[:name].to_s, option[:value]] }]\
|
29
|
-
if parsed_arguments.key?(:options)
|
30
|
-
|
26
|
+
@options = parsed_arguments[:options]
|
31
27
|
@arguments = parsed_arguments[:arguments]
|
32
28
|
end
|
33
29
|
|
@@ -52,14 +52,25 @@ module Cliqr
|
|
52
52
|
#
|
53
53
|
# @return [Cliqr::Parser::ParsedInput] Parsed arguments wrapper
|
54
54
|
def build
|
55
|
-
ParsedInput.new(:
|
56
|
-
:
|
57
|
-
:
|
58
|
-
:
|
55
|
+
ParsedInput.new(command: @config.name,
|
56
|
+
actions: @actions,
|
57
|
+
options: grouped_options,
|
58
|
+
arguments: @arguments)
|
59
59
|
end
|
60
60
|
|
61
61
|
private
|
62
62
|
|
63
|
+
# Group options in a hash of option name to an array of its values
|
64
|
+
#
|
65
|
+
# @return [Hash]
|
66
|
+
def grouped_options
|
67
|
+
@options.group_by { |option| option[:name] }.each_with_object({}) do |(name, group), hash|
|
68
|
+
hash[name] ||= []
|
69
|
+
group.each { |item| hash[name].push(item[:value]) }
|
70
|
+
hash
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
63
74
|
# Add option's name to a list of already added options and fail if duplicate
|
64
75
|
#
|
65
76
|
# @param [Cliqr::CLI::Parser::Token] token A parsed token from command line arguments
|
@@ -68,8 +79,8 @@ module Cliqr
|
|
68
79
|
def add_option_name(token)
|
69
80
|
option_config = @action_config.option(token.name)
|
70
81
|
old_config = @option_names.add?(option_config.name)
|
71
|
-
fail Cliqr::Error::MultipleOptionValues,
|
72
|
-
|
82
|
+
fail Cliqr::Error::MultipleOptionValues, "multiple values for option \"#{token.arg}\"" \
|
83
|
+
if old_config.nil? && !option_config.multi_valued?
|
73
84
|
@option_names.add(option_config.short) if option_config.short?
|
74
85
|
@option_names
|
75
86
|
end
|
@@ -13,8 +13,8 @@ module Cliqr
|
|
13
13
|
TEMPLATES_PATH = "#{File.expand_path(File.dirname(__FILE__))}/templates"
|
14
14
|
|
15
15
|
USAGE_TYPES = {
|
16
|
-
|
17
|
-
|
16
|
+
cli: "#{TEMPLATES_PATH}/usage/cli.erb",
|
17
|
+
shell: "#{TEMPLATES_PATH}/usage/shell.erb"
|
18
18
|
}
|
19
19
|
|
20
20
|
# Create a new usage builder
|
data/lib/cliqr/version.rb
CHANGED
@@ -10,6 +10,6 @@ require 'fixtures/test_command'
|
|
10
10
|
def assert_results(config, args, expected_result, expected_config = nil)
|
11
11
|
expected_config ||= config
|
12
12
|
action_config, actual_parsed_input = Cliqr::Parser.parse(config, args)
|
13
|
-
expect(actual_parsed_input).to
|
13
|
+
expect(actual_parsed_input).to(match(expected_result))
|
14
14
|
expect(action_config).to eq(expected_config)
|
15
15
|
end
|
@@ -140,4 +140,17 @@ describe Cliqr::Config::Option do
|
|
140
140
|
end.to(raise_error(Cliqr::Error::ValidationError,
|
141
141
|
"invalid Cliqr interface configuration - [option \"option-1\" - invalid type '']"))
|
142
142
|
end
|
143
|
+
|
144
|
+
it 'only allows boolean values for multi_valued field' do
|
145
|
+
def define_interface
|
146
|
+
Cliqr.interface do
|
147
|
+
name 'my-command'
|
148
|
+
option 'test' do
|
149
|
+
multi_valued Object
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
expect { define_interface }.to(raise_error(Cliqr::Error::ValidationError,
|
154
|
+
"invalid Cliqr interface configuration - [option \"test\" - invalid type 'Object']"))
|
155
|
+
end
|
143
156
|
end
|
data/spec/dsl/usage_spec.rb
CHANGED
@@ -143,7 +143,7 @@ Time
|
|
143
143
|
puts "invoked #{event.name} : #{event.command} : #{ch} : #{num}"
|
144
144
|
puts "#{event.name} #{(event.parent? ? "has parent => #{event.parent.name}" : 'does not have parent')}"
|
145
145
|
sleep 1
|
146
|
-
invoke :baz, 'b', 2, :
|
146
|
+
invoke :baz, 'b', 2, t: 1
|
147
147
|
puts "#{event.name} ending"
|
148
148
|
end
|
149
149
|
on :baz do |event, ch, num, hash|
|
@@ -152,7 +152,7 @@ Time
|
|
152
152
|
puts "parent: #{event.parent.name} : #{event.parent.command}"
|
153
153
|
puts "diff => #{event.timestamp.to_i - event.parent.timestamp.to_i}"
|
154
154
|
sleep 1
|
155
|
-
invoke :foo, 'c', 3, :
|
155
|
+
invoke :foo, 'c', 3, s: 2
|
156
156
|
puts "#{event.name} ending"
|
157
157
|
end
|
158
158
|
handler do
|
@@ -572,4 +572,61 @@ a question?
|
|
572
572
|
end
|
573
573
|
end
|
574
574
|
end
|
575
|
+
|
576
|
+
it 'can get multiple values for an option' do
|
577
|
+
cli = Cliqr.interface do
|
578
|
+
name 'my-command'
|
579
|
+
|
580
|
+
option 'foo' do
|
581
|
+
multi_valued true
|
582
|
+
end
|
583
|
+
|
584
|
+
handler do
|
585
|
+
puts foo
|
586
|
+
puts foo.value
|
587
|
+
puts foo.values.first
|
588
|
+
end
|
589
|
+
end
|
590
|
+
|
591
|
+
result = cli.execute_internal %w(--foo v1 --foo v2 --foo v3), output: :buffer
|
592
|
+
expect(result[:stdout]).to eq <<-EOS
|
593
|
+
v1,v2,v3
|
594
|
+
v1,v2,v3
|
595
|
+
v1
|
596
|
+
EOS
|
597
|
+
end
|
598
|
+
|
599
|
+
it 'operates on multi option values' do
|
600
|
+
cli = Cliqr.interface do
|
601
|
+
name 'my-command'
|
602
|
+
|
603
|
+
option 'foo' do
|
604
|
+
multi_valued true
|
605
|
+
type :numeric
|
606
|
+
end
|
607
|
+
|
608
|
+
option 'bar' do
|
609
|
+
multi_valued true
|
610
|
+
type :boolean
|
611
|
+
end
|
612
|
+
|
613
|
+
handler do
|
614
|
+
puts foo
|
615
|
+
puts foo.values.map(&:class)
|
616
|
+
puts bar
|
617
|
+
puts bar.values.map(&:class)
|
618
|
+
end
|
619
|
+
end
|
620
|
+
|
621
|
+
result = cli.execute_internal %w(--foo 123 --foo 987 --bar --bar --no-bar), output: :buffer
|
622
|
+
expect(result[:stdout]).to eq <<-EOS
|
623
|
+
123,987
|
624
|
+
Fixnum
|
625
|
+
Fixnum
|
626
|
+
true,true,false
|
627
|
+
TrueClass
|
628
|
+
TrueClass
|
629
|
+
FalseClass
|
630
|
+
EOS
|
631
|
+
end
|
575
632
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Cliqr::Command::CommandContext do
|
6
|
+
it 'allows selection of an item from a list' do
|
7
|
+
allow(Sawaal).to(receive(:select)).and_return(3)
|
8
|
+
cli = Cliqr.interface do
|
9
|
+
name 'my-command'
|
10
|
+
handler do
|
11
|
+
food_items = %w(pizza salad coke lasagna apple)
|
12
|
+
selected = ask('what would you like?', food_items)
|
13
|
+
puts selected
|
14
|
+
puts food_items[selected]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
result = cli.execute_internal ['my-command'], output: :buffer
|
18
|
+
expect(result[:stdout]).to eq <<-EOS
|
19
|
+
3
|
20
|
+
lasagna
|
21
|
+
EOS
|
22
|
+
end
|
23
|
+
end
|
@@ -13,8 +13,8 @@ describe Cliqr::Parser do
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
config = cli.config
|
16
|
-
parsed_input = Cliqr::Parser::ParsedInput.new(:
|
17
|
-
:
|
16
|
+
parsed_input = Cliqr::Parser::ParsedInput.new(command: 'my-command',
|
17
|
+
options: {})
|
18
18
|
assert_results(config, ['my-action'], parsed_input, config.action('my-action'))
|
19
19
|
end
|
20
20
|
|
@@ -36,8 +36,8 @@ describe Cliqr::Parser do
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
config = cli.config
|
39
|
-
parsed_input = Cliqr::Parser::ParsedInput.new(:
|
40
|
-
:
|
39
|
+
parsed_input = Cliqr::Parser::ParsedInput.new(command: 'my-command',
|
40
|
+
options: {})
|
41
41
|
assert_results(config, %w(my-action-1 my-action-2 my-action-3), parsed_input,
|
42
42
|
config.action('my-action-1').action('my-action-2').action('my-action-3'))
|
43
43
|
end
|
@@ -60,17 +60,11 @@ describe Cliqr::Parser do
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
config = cli.config
|
63
|
-
parsed_input = Cliqr::Parser::ParsedInput.new(:
|
64
|
-
:
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
},
|
69
|
-
{
|
70
|
-
:name => 'test-option-2',
|
71
|
-
:value => 'qwe'
|
72
|
-
}
|
73
|
-
])
|
63
|
+
parsed_input = Cliqr::Parser::ParsedInput.new(command: 'my-command',
|
64
|
+
options: {
|
65
|
+
'test-option-1' => ['abcd'],
|
66
|
+
'test-option-2' => ['qwe']
|
67
|
+
})
|
74
68
|
assert_results(config, %w(my-action -t abcd --test-option-2 qwe), parsed_input, config.action('my-action'))
|
75
69
|
end
|
76
70
|
|
@@ -96,17 +90,11 @@ describe Cliqr::Parser do
|
|
96
90
|
end
|
97
91
|
end
|
98
92
|
config = cli.config
|
99
|
-
parsed_input = Cliqr::Parser::ParsedInput.new(:
|
100
|
-
:
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
},
|
105
|
-
{
|
106
|
-
:name => 'test-option-2',
|
107
|
-
:value => 'qwe'
|
108
|
-
}
|
109
|
-
])
|
93
|
+
parsed_input = Cliqr::Parser::ParsedInput.new(command: 'my-command',
|
94
|
+
options: {
|
95
|
+
'test-option-1' => ['abcd'],
|
96
|
+
'test-option-2' => ['qwe']
|
97
|
+
})
|
110
98
|
assert_results(config, %w(my-action-1 -t abcd --test-option-2 qwe my-action-2), parsed_input,
|
111
99
|
config.action('my-action-1').action('my-action-2'))
|
112
100
|
end
|
@@ -15,32 +15,23 @@ describe Cliqr::Parser do
|
|
15
15
|
CONFIG = TEST_CLI.config
|
16
16
|
|
17
17
|
it 'can parse no argument command' do
|
18
|
-
assert_results(CONFIG, [], Cliqr::Parser::ParsedInput.new(:
|
18
|
+
assert_results(CONFIG, [], Cliqr::Parser::ParsedInput.new(command: 'my-command', options: {}))
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'can parse command with option using long name' do
|
22
|
-
parsed_input = Cliqr::Parser::ParsedInput.new(:
|
23
|
-
:
|
24
|
-
|
25
|
-
|
26
|
-
:value => 'abcd'
|
27
|
-
}
|
28
|
-
])
|
22
|
+
parsed_input = Cliqr::Parser::ParsedInput.new(command: 'my-command',
|
23
|
+
options: {
|
24
|
+
'test-option' => ['abcd']
|
25
|
+
})
|
29
26
|
assert_results(CONFIG, %w(--test-option abcd), parsed_input)
|
30
27
|
end
|
31
28
|
|
32
29
|
it 'can parse multiple options' do
|
33
|
-
parsed_input = Cliqr::Parser::ParsedInput.new(:
|
34
|
-
:
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
},
|
39
|
-
{
|
40
|
-
:name => 'test-option-2',
|
41
|
-
:value => 'xyz'
|
42
|
-
}
|
43
|
-
])
|
30
|
+
parsed_input = Cliqr::Parser::ParsedInput.new(command: 'my-command',
|
31
|
+
options: {
|
32
|
+
'test-option-1' => ['abcd'],
|
33
|
+
'test-option-2' => ['xyz']
|
34
|
+
})
|
44
35
|
cli = Cliqr.interface do
|
45
36
|
name 'my-command'
|
46
37
|
handler TestCommand
|
@@ -52,13 +43,10 @@ describe Cliqr::Parser do
|
|
52
43
|
end
|
53
44
|
|
54
45
|
it 'can parse command with option using short name' do
|
55
|
-
parsed_input = Cliqr::Parser::ParsedInput.new(:
|
56
|
-
:
|
57
|
-
|
58
|
-
|
59
|
-
:value => 'abcd'
|
60
|
-
}
|
61
|
-
])
|
46
|
+
parsed_input = Cliqr::Parser::ParsedInput.new(command: 'my-command',
|
47
|
+
options: {
|
48
|
+
'test-option' => ['abcd']
|
49
|
+
})
|
62
50
|
assert_results(CONFIG, %w(-t abcd), parsed_input)
|
63
51
|
end
|
64
52
|
|
@@ -96,20 +84,18 @@ describe Cliqr::Parser do
|
|
96
84
|
short 't'
|
97
85
|
end
|
98
86
|
end
|
99
|
-
parsed_input = Cliqr::Parser::ParsedInput.new(:
|
100
|
-
:
|
101
|
-
:
|
87
|
+
parsed_input = Cliqr::Parser::ParsedInput.new(command: 'my-command',
|
88
|
+
options: {},
|
89
|
+
arguments: ['value1'])
|
102
90
|
assert_results(cli.config, ['value1'], parsed_input)
|
103
91
|
end
|
104
92
|
|
105
93
|
it 'can parse command with one option and one argument' do
|
106
|
-
parsed_input = Cliqr::Parser::ParsedInput.new(:
|
107
|
-
:
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
}],
|
112
|
-
:arguments => ['value1'])
|
94
|
+
parsed_input = Cliqr::Parser::ParsedInput.new(command: 'my-command',
|
95
|
+
options: {
|
96
|
+
'test-option' => ['abcd']
|
97
|
+
},
|
98
|
+
arguments: ['value1'])
|
113
99
|
cli = Cliqr.interface do
|
114
100
|
name 'my-command'
|
115
101
|
handler TestCommand
|
@@ -139,20 +125,70 @@ describe Cliqr::Parser do
|
|
139
125
|
end
|
140
126
|
end
|
141
127
|
config = cli.config
|
142
|
-
parsed_input = Cliqr::Parser::ParsedInput.new(:
|
143
|
-
:
|
144
|
-
:
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
},
|
149
|
-
{
|
150
|
-
:name => 'test-option-2',
|
151
|
-
:value => 'qwe'
|
152
|
-
}
|
153
|
-
])
|
128
|
+
parsed_input = Cliqr::Parser::ParsedInput.new(command: 'my-command',
|
129
|
+
arguments: %w(value1 value2),
|
130
|
+
options: {
|
131
|
+
'test-option-1' => ['abcd'],
|
132
|
+
'test-option-2' => ['qwe']
|
133
|
+
})
|
154
134
|
assert_results(config, %w(-t abcd -p qwe value1 value2), parsed_input)
|
155
135
|
assert_results(config, %w(value1 -t abcd value2 -p qwe), parsed_input)
|
156
136
|
assert_results(config, %w(-t abcd value1 -p qwe value2), parsed_input)
|
157
137
|
end
|
138
|
+
|
139
|
+
it 'can parse command with multiple arguments for a option' do
|
140
|
+
cli = Cliqr.interface do
|
141
|
+
name 'my-command'
|
142
|
+
arguments :enable
|
143
|
+
|
144
|
+
option 'test-option' do
|
145
|
+
short 't'
|
146
|
+
multi_valued true
|
147
|
+
end
|
148
|
+
|
149
|
+
option 'test-option-2' do
|
150
|
+
short 'p'
|
151
|
+
multi_valued false
|
152
|
+
end
|
153
|
+
end
|
154
|
+
parsed_input = Cliqr::Parser::ParsedInput.new(command: 'my-command',
|
155
|
+
arguments: [],
|
156
|
+
options: {
|
157
|
+
'test-option' => %w(v1 v2 v3),
|
158
|
+
'test-option-2' => %w(x)
|
159
|
+
})
|
160
|
+
assert_results(cli.config, %w(--test-option v1 -t v2 --test-option v3 -p x), parsed_input)
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'can parse command with multiple arguments for a numeric option' do
|
164
|
+
cli = Cliqr.interface do
|
165
|
+
name 'my-command'
|
166
|
+
arguments :enable
|
167
|
+
|
168
|
+
option 'test-option' do
|
169
|
+
multi_valued true
|
170
|
+
type :numeric
|
171
|
+
end
|
172
|
+
end
|
173
|
+
parsed_input = Cliqr::Parser::ParsedInput.new(command: 'my-command',
|
174
|
+
options: {},
|
175
|
+
arguments: ['value1'])
|
176
|
+
assert_results(cli.config, ['value1'], parsed_input)
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'can parse command with multiple arguments for a boolean option' do
|
180
|
+
cli = Cliqr.interface do
|
181
|
+
name 'my-command'
|
182
|
+
arguments :enable
|
183
|
+
|
184
|
+
option 'test-option' do
|
185
|
+
multi_valued true
|
186
|
+
type :boolean
|
187
|
+
end
|
188
|
+
end
|
189
|
+
parsed_input = Cliqr::Parser::ParsedInput.new(command: 'my-command',
|
190
|
+
options: {},
|
191
|
+
arguments: ['value1'])
|
192
|
+
assert_results(cli.config, ['value1'], parsed_input)
|
193
|
+
end
|
158
194
|
end
|
@@ -1,8 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
require 'tempfile'
|
4
|
-
|
5
3
|
require 'spec_helper'
|
4
|
+
require 'spec_util'
|
6
5
|
|
7
6
|
require 'fixtures/test_command'
|
8
7
|
require 'fixtures/test_shell_prompt'
|
@@ -679,27 +678,3 @@ shell exited with code 0.
|
|
679
678
|
end
|
680
679
|
end
|
681
680
|
end
|
682
|
-
|
683
|
-
def with_input_output(lines, &block)
|
684
|
-
old_stdin = $stdin
|
685
|
-
old_stdout = $stdout
|
686
|
-
input_file = Tempfile.new('cliqr').tap do |file|
|
687
|
-
lines.push('exit').each { |line| file.write("#{line}\n") }
|
688
|
-
end
|
689
|
-
output_file = Tempfile.new('cliqr')
|
690
|
-
begin
|
691
|
-
$stdin = input_file.open
|
692
|
-
$stdout = output_file.open
|
693
|
-
output_getter = proc do
|
694
|
-
IO.read(output_file.path).gsub(/(.*)\n/, "\\1.\n")
|
695
|
-
end
|
696
|
-
block.call(output_getter)
|
697
|
-
ensure
|
698
|
-
$stdin = old_stdin
|
699
|
-
$stdout = old_stdout
|
700
|
-
input_file.close
|
701
|
-
output_file.close
|
702
|
-
input_file.unlink
|
703
|
-
output_file.unlink
|
704
|
-
end
|
705
|
-
end
|
data/spec/spec_util.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'tempfile'
|
4
|
+
|
5
|
+
def with_input_output(lines, &block)
|
6
|
+
old_stdin = $stdin
|
7
|
+
old_stdout = $stdout
|
8
|
+
input_file = Tempfile.new('cliqr').tap do |file|
|
9
|
+
lines.push('exit').each { |line| file.write("#{line}\n") }
|
10
|
+
end
|
11
|
+
output_file = Tempfile.new('cliqr')
|
12
|
+
begin
|
13
|
+
$stdin = input_file.open
|
14
|
+
$stdout = output_file.open
|
15
|
+
output_getter = proc do
|
16
|
+
IO.read(output_file.path).gsub(/(.*)\n/, "\\1.\n")
|
17
|
+
end
|
18
|
+
block.call(output_getter)
|
19
|
+
ensure
|
20
|
+
$stdin = old_stdin
|
21
|
+
$stdout = old_stdout
|
22
|
+
input_file.close
|
23
|
+
output_file.close
|
24
|
+
input_file.unlink
|
25
|
+
output_file.unlink
|
26
|
+
end
|
27
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cliqr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anshul Verma
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: sawaal
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 1.0.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -131,6 +131,7 @@ files:
|
|
131
131
|
- spec/executor/event_executor_spec.rb
|
132
132
|
- spec/executor/executor_spec.rb
|
133
133
|
- spec/executor/help_executor_spec.rb
|
134
|
+
- spec/executor/selection_spec.rb
|
134
135
|
- spec/fixtures/action_reader_command.rb
|
135
136
|
- spec/fixtures/always_error_command.rb
|
136
137
|
- spec/fixtures/argument_reader_command.rb
|
@@ -150,6 +151,7 @@ files:
|
|
150
151
|
- spec/parser/argument_parser_spec.rb
|
151
152
|
- spec/shell/shell_executor_spec.rb
|
152
153
|
- spec/spec_helper.rb
|
154
|
+
- spec/spec_util.rb
|
153
155
|
- spec/validation/action_argument_validator_spec.rb
|
154
156
|
- spec/validation/command_argument_validation_spec.rb
|
155
157
|
- spec/validation/error_spec.rb
|
@@ -195,6 +197,7 @@ test_files:
|
|
195
197
|
- spec/executor/event_executor_spec.rb
|
196
198
|
- spec/executor/executor_spec.rb
|
197
199
|
- spec/executor/help_executor_spec.rb
|
200
|
+
- spec/executor/selection_spec.rb
|
198
201
|
- spec/fixtures/action_reader_command.rb
|
199
202
|
- spec/fixtures/always_error_command.rb
|
200
203
|
- spec/fixtures/argument_reader_command.rb
|
@@ -214,6 +217,7 @@ test_files:
|
|
214
217
|
- spec/parser/argument_parser_spec.rb
|
215
218
|
- spec/shell/shell_executor_spec.rb
|
216
219
|
- spec/spec_helper.rb
|
220
|
+
- spec/spec_util.rb
|
217
221
|
- spec/validation/action_argument_validator_spec.rb
|
218
222
|
- spec/validation/command_argument_validation_spec.rb
|
219
223
|
- spec/validation/error_spec.rb
|