hammer_cli 0.0.18 → 0.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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -314
  3. data/bin/hammer +45 -6
  4. data/config/cli.modules.d/module_config_template.yml +4 -0
  5. data/config/cli_config.template.yml +9 -11
  6. data/doc/developer_docs.md +1 -0
  7. data/doc/i18n.md +85 -0
  8. data/doc/installation.md +321 -0
  9. data/lib/hammer_cli.rb +3 -0
  10. data/lib/hammer_cli/abstract.rb +15 -24
  11. data/lib/hammer_cli/apipie/command.rb +13 -7
  12. data/lib/hammer_cli/apipie/options.rb +14 -16
  13. data/lib/hammer_cli/apipie/read_command.rb +6 -1
  14. data/lib/hammer_cli/apipie/resource.rb +48 -58
  15. data/lib/hammer_cli/apipie/write_command.rb +5 -1
  16. data/lib/hammer_cli/completer.rb +77 -21
  17. data/lib/hammer_cli/connection.rb +44 -0
  18. data/lib/hammer_cli/exception_handler.rb +15 -4
  19. data/lib/hammer_cli/exceptions.rb +6 -0
  20. data/lib/hammer_cli/i18n.rb +95 -0
  21. data/lib/hammer_cli/logger.rb +3 -3
  22. data/lib/hammer_cli/main.rb +12 -11
  23. data/lib/hammer_cli/modules.rb +19 -6
  24. data/lib/hammer_cli/options/normalizers.rb +42 -7
  25. data/lib/hammer_cli/options/option_definition.rb +2 -2
  26. data/lib/hammer_cli/output.rb +1 -0
  27. data/lib/hammer_cli/output/adapter/abstract.rb +20 -0
  28. data/lib/hammer_cli/output/adapter/base.rb +49 -78
  29. data/lib/hammer_cli/output/adapter/csv.rb +5 -5
  30. data/lib/hammer_cli/output/adapter/table.rb +41 -10
  31. data/lib/hammer_cli/output/dsl.rb +1 -1
  32. data/lib/hammer_cli/output/field_filter.rb +21 -0
  33. data/lib/hammer_cli/output/fields.rb +44 -78
  34. data/lib/hammer_cli/output/formatters.rb +38 -0
  35. data/lib/hammer_cli/settings.rb +28 -6
  36. data/lib/hammer_cli/shell.rb +58 -57
  37. data/lib/hammer_cli/utils.rb +14 -0
  38. data/lib/hammer_cli/validator.rb +5 -5
  39. data/lib/hammer_cli/version.rb +1 -1
  40. data/locale/Makefile +64 -0
  41. data/locale/hammer-cli.pot +203 -0
  42. data/locale/zanata.xml +29 -0
  43. data/test/unit/apipie/command_test.rb +42 -25
  44. data/test/unit/apipie/read_command_test.rb +10 -7
  45. data/test/unit/apipie/write_command_test.rb +9 -8
  46. data/test/unit/completer_test.rb +206 -21
  47. data/test/unit/connection_test.rb +68 -0
  48. data/test/unit/fixtures/apipie/architectures.json +153 -0
  49. data/test/unit/fixtures/apipie/documented.json +79 -0
  50. data/test/unit/fixtures/json_input/invalid.json +12 -0
  51. data/test/unit/fixtures/json_input/valid.json +12 -0
  52. data/test/unit/history_test.rb +71 -0
  53. data/test/unit/main_test.rb +9 -0
  54. data/test/unit/modules_test.rb +22 -6
  55. data/test/unit/options/field_filter_test.rb +27 -0
  56. data/test/unit/options/normalizers_test.rb +53 -0
  57. data/test/unit/output/adapter/base_test.rb +162 -10
  58. data/test/unit/output/adapter/csv_test.rb +16 -3
  59. data/test/unit/output/adapter/table_test.rb +97 -13
  60. data/test/unit/output/dsl_test.rb +74 -6
  61. data/test/unit/output/fields_test.rb +93 -62
  62. data/test/unit/output/formatters_test.rb +47 -0
  63. data/test/unit/settings_test.rb +35 -4
  64. data/test/unit/utils_test.rb +45 -0
  65. metadata +85 -4
  66. data/test/unit/apipie/fake_api.rb +0 -101
@@ -0,0 +1,29 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <config xmlns="http://zanata.org/namespace/config/">
3
+ <url>https://translate.zanata.org/zanata/</url>
4
+ <project>satellite6-hammer-cli</project>
5
+ <project-version>6.0</project-version>
6
+ <project-type>podir</project-type>
7
+ <locales>
8
+ <locale>fr</locale>
9
+ <locale>it</locale>
10
+ <locale>ja</locale>
11
+ <locale>ko</locale>
12
+ <locale>gu</locale>
13
+ <locale>hi</locale>
14
+ <locale>mr</locale>
15
+ <locale>or</locale>
16
+ <locale>ru</locale>
17
+ <locale>te</locale>
18
+ <locale>pa</locale>
19
+ <locale>kn</locale>
20
+ <locale>de</locale>
21
+ <locale>es</locale>
22
+ <locale>gl</locale>
23
+ <locale map-from="pt_BR">pt-BR</locale>
24
+ <locale map-from="bn">bn-IN</locale>
25
+ <locale map-from="ta">ta-IN</locale>
26
+ <locale map-from="zh_CN">zh-Hans-CN</locale>
27
+ <locale map-from="zh_TW">zh-Hant-TW</locale>
28
+ </locales>
29
+ </config>
@@ -1,15 +1,20 @@
1
1
  require File.join(File.dirname(__FILE__), '../test_helper')
2
- require File.join(File.dirname(__FILE__), 'fake_api')
3
2
 
4
3
 
5
4
  describe HammerCLI::Apipie::Command do
6
5
 
7
- class ParentCommand < HammerCLI::Apipie::Command
6
+ class TestCommand < HammerCLI::Apipie::Command
7
+ def self.resource_config
8
+ { :apidoc_cache_dir => 'test/unit/fixtures/apipie', :apidoc_cache_name => 'architectures' }
9
+ end
10
+ end
11
+
12
+ class ParentCommand < TestCommand
8
13
  action :show
9
14
  end
10
15
 
11
- class CommandA < HammerCLI::Apipie::Command
12
- resource FakeApi::Resources::Architecture, :index
16
+ class CommandA < TestCommand
17
+ resource :architectures, :index
13
18
 
14
19
  class CommandB < ParentCommand
15
20
  end
@@ -18,17 +23,20 @@ describe HammerCLI::Apipie::Command do
18
23
  class CommandC < CommandA
19
24
  end
20
25
 
21
-
22
26
  let(:ctx) { { :adapter => :silent, :interactive => false } }
23
- let(:cmd_class) { HammerCLI::Apipie::Command.dup }
27
+ let(:cmd_class) { TestCommand.dup }
24
28
  let(:cmd) { cmd_class.new("", ctx) }
25
29
 
30
+ before :each do
31
+ HammerCLI::Connection.drop_all
32
+ end
33
+
26
34
  context "setting identifiers" do
27
35
 
28
36
  let(:option_switches) { cmd_class.declared_options.map(&:switches).sort }
29
37
  let(:option_attribute_names) { cmd_class.declared_options.map(&:attribute_name).sort }
30
38
 
31
- class Cmd1 < HammerCLI::Apipie::Command
39
+ class Cmd1 < TestCommand
32
40
  identifiers :id, :name, :label
33
41
  apipie_options
34
42
  end
@@ -107,31 +115,31 @@ describe HammerCLI::Apipie::Command do
107
115
  context "setting resources" do
108
116
 
109
117
  it "should set resource and action together" do
110
- cmd_class.resource FakeApi::Resources::Architecture, :index
118
+ cmd_class.resource :architectures, :index
111
119
 
112
- cmd.resource.resource_class.must_equal FakeApi::Resources::Architecture
113
- cmd_class.resource.resource_class.must_equal FakeApi::Resources::Architecture
120
+ cmd.resource.name.must_equal :architectures
121
+ cmd_class.resource.name.must_equal :architectures
114
122
 
115
123
  cmd.action.must_equal :index
116
124
  cmd_class.action.must_equal :index
117
125
  end
118
126
 
119
127
  it "should set resource alone" do
120
- cmd_class.resource FakeApi::Resources::Architecture
128
+ cmd_class.resource :architectures
121
129
 
122
- cmd.resource.resource_class.must_equal FakeApi::Resources::Architecture
123
- cmd_class.resource.resource_class.must_equal FakeApi::Resources::Architecture
130
+ cmd.resource.name.must_equal :architectures
131
+ cmd_class.resource.name.must_equal :architectures
124
132
 
125
133
  cmd.action.must_equal nil
126
134
  cmd_class.action.must_equal nil
127
135
  end
128
136
 
129
137
  it "should set resource and action alone" do
130
- cmd_class.resource FakeApi::Resources::Architecture
138
+ cmd_class.resource :architectures
131
139
  cmd_class.action :index
132
140
 
133
- cmd.resource.resource_class.must_equal FakeApi::Resources::Architecture
134
- cmd_class.resource.resource_class.must_equal FakeApi::Resources::Architecture
141
+ cmd.resource.name.must_equal :architectures
142
+ cmd_class.resource.name.must_equal :architectures
135
143
 
136
144
  cmd.action.must_equal :index
137
145
  cmd_class.action.must_equal :index
@@ -145,25 +153,34 @@ describe HammerCLI::Apipie::Command do
145
153
 
146
154
  it "looks up resource in the class' modules" do
147
155
  cmd_b = CommandA::CommandB.new("", ctx)
148
- cmd_b.resource.resource_class.must_equal FakeApi::Resources::Architecture
149
- cmd_b.class.resource.resource_class.must_equal FakeApi::Resources::Architecture
156
+ cmd_b.resource.name.must_equal :architectures
157
+ cmd_b.class.resource.name.must_equal :architectures
150
158
  end
151
159
 
152
160
  it "looks up resource in the superclass" do
153
161
  cmd_c = CommandC.new("", ctx)
154
- cmd_c.resource.resource_class.must_equal FakeApi::Resources::Architecture
155
- cmd_c.class.resource.resource_class.must_equal FakeApi::Resources::Architecture
162
+ cmd_c.resource.name.must_equal :architectures
163
+ cmd_c.class.resource.name.must_equal :architectures
156
164
  end
157
165
  end
158
166
 
159
167
  context "apipie generated options" do
160
168
 
169
+ class DocumentedCommand < HammerCLI::Apipie::Command
170
+ def self.resource_config
171
+ { :apidoc_cache_dir => 'test/unit/fixtures/apipie', :apidoc_cache_name => 'documented' }
172
+ end
173
+ end
174
+
175
+ let(:cmd_class) { DocumentedCommand.dup }
176
+ let(:cmd) { cmd_class.new("", ctx) }
177
+
161
178
  context "with one simple param" do
162
179
 
163
180
  let(:option) { cmd_class.declared_options[0] }
164
181
 
165
182
  before :each do
166
- cmd_class.resource FakeApi::Resources::Documented, :index
183
+ cmd_class.resource :documented, :index
167
184
  cmd_class.apipie_options
168
185
  end
169
186
 
@@ -186,7 +203,7 @@ describe HammerCLI::Apipie::Command do
186
203
 
187
204
  context "required options" do
188
205
  before :each do
189
- cmd_class.resource FakeApi::Resources::Documented, :create
206
+ cmd_class.resource :documented, :create
190
207
  cmd_class.apipie_options
191
208
  end
192
209
 
@@ -199,7 +216,7 @@ describe HammerCLI::Apipie::Command do
199
216
 
200
217
  context "with hash params" do
201
218
  before :each do
202
- cmd_class.resource FakeApi::Resources::Documented, :create
219
+ cmd_class.resource :documented, :create
203
220
  cmd_class.apipie_options
204
221
  end
205
222
 
@@ -214,7 +231,7 @@ describe HammerCLI::Apipie::Command do
214
231
 
215
232
  context "array params" do
216
233
  before :each do
217
- cmd_class.resource FakeApi::Resources::Documented, :create
234
+ cmd_class.resource :documented, :create
218
235
  cmd_class.apipie_options
219
236
  end
220
237
 
@@ -244,7 +261,7 @@ describe HammerCLI::Apipie::Command do
244
261
 
245
262
  context "filtering options" do
246
263
  before :each do
247
- cmd_class.resource FakeApi::Resources::Documented, :create
264
+ cmd_class.resource :documented, :create
248
265
  end
249
266
 
250
267
  it "should skip filtered options" do
@@ -1,10 +1,15 @@
1
1
  require File.join(File.dirname(__FILE__), '../test_helper')
2
- require File.join(File.dirname(__FILE__), 'fake_api')
3
2
 
4
3
 
5
4
  describe HammerCLI::Apipie::ReadCommand do
6
5
 
7
- let(:cmd_class) { HammerCLI::Apipie::ReadCommand.dup }
6
+ class TestReadCommand < HammerCLI::Apipie::ReadCommand
7
+ def self.resource_config
8
+ { :apidoc_cache_dir => 'test/unit/fixtures/apipie', :apidoc_cache_name => 'architectures' }
9
+ end
10
+ end
11
+
12
+ let(:cmd_class) { TestReadCommand.dup }
8
13
  let(:cmd) { cmd_class.new("", { :adapter => :silent, :interactive => false }) }
9
14
  let(:cmd_run) { cmd.run([]) }
10
15
 
@@ -16,11 +21,9 @@ describe HammerCLI::Apipie::ReadCommand do
16
21
  context "resource defined" do
17
22
 
18
23
  before :each do
19
- cmd_class.resource FakeApi::Resources::Architecture, "some_action"
20
-
21
- arch = FakeApi::Resources::Architecture.new
22
- arch.expects(:some_action).returns([])
23
- FakeApi::Resources::Architecture.stubs(:new).returns(arch)
24
+ HammerCLI::Connection.drop_all
25
+ ApipieBindings::API.any_instance.stubs(:call).returns([])
26
+ cmd_class.resource :architectures, :index
24
27
  end
25
28
 
26
29
  it "should perform a call to api when resource is defined" do
@@ -1,11 +1,14 @@
1
1
  require File.join(File.dirname(__FILE__), '../test_helper')
2
- require File.join(File.dirname(__FILE__), 'fake_api')
3
2
 
4
3
  describe HammerCLI::Apipie::WriteCommand do
5
4
 
5
+ class TestWriteCommand < HammerCLI::Apipie::WriteCommand
6
+ def self.resource_config
7
+ { :apidoc_cache_dir => 'test/unit/fixtures/apipie', :apidoc_cache_name => 'architectures' }
8
+ end
9
+ end
6
10
 
7
- let(:ctx) { { :interactive => false } }
8
- let(:cmd) { HammerCLI::Apipie::WriteCommand.new("", ctx) }
11
+ let(:cmd) { TestWriteCommand.new("") }
9
12
  let(:cmd_run) { cmd.run([]) }
10
13
 
11
14
  it "should raise exception when no action is defined" do
@@ -16,11 +19,9 @@ describe HammerCLI::Apipie::WriteCommand do
16
19
  context "resource defined" do
17
20
 
18
21
  before :each do
19
- cmd.class.resource FakeApi::Resources::Architecture, "some_action"
20
-
21
- arch = FakeApi::Resources::Architecture.new
22
- arch.expects(:some_action).returns([])
23
- FakeApi::Resources::Architecture.stubs(:new).returns(arch)
22
+ HammerCLI::Connection.drop_all
23
+ ApipieBindings::API.any_instance.stubs(:call).returns([])
24
+ cmd.class.resource :architectures, :index
24
25
  end
25
26
 
26
27
  it "should perform a call to api when resource is defined" do
@@ -2,40 +2,198 @@ require File.join(File.dirname(__FILE__), 'test_helper')
2
2
  require 'tempfile'
3
3
 
4
4
 
5
- describe HammerCLI::CompleterLine do
5
+ describe HammerCLI::CompleterWord do
6
+
7
+
8
+ describe "quote" do
9
+ it "returns empty string for empty word" do
10
+ word = HammerCLI::CompleterWord.new('')
11
+ word.quote.must_equal ""
12
+ end
13
+
14
+ it "returns empty string for word without quotes" do
15
+ word = HammerCLI::CompleterWord.new('word')
16
+ word.quote.must_equal ""
17
+ end
18
+
19
+ it "recognizes double quotes" do
20
+ word = HammerCLI::CompleterWord.new('"word')
21
+ word.quote.must_equal '"'
22
+ end
23
+
24
+ it "recognizes single quotes" do
25
+ word = HammerCLI::CompleterWord.new('\'word')
26
+ word.quote.must_equal "'"
27
+ end
28
+ end
6
29
 
7
- let(:unfinished_line) { "architecture list --name arch" }
8
- let(:finished_line) { "architecture list --name arch " }
30
+ describe "quoted?" do
31
+ it "returns false for an unquoted word" do
32
+ word = HammerCLI::CompleterWord.new('word')
33
+ word.quoted?.must_equal false
34
+ end
35
+
36
+ it "returns true for double quotes" do
37
+ word = HammerCLI::CompleterWord.new('"word')
38
+ word.quoted?.must_equal true
39
+ end
40
+
41
+ it "returns true for single quotes" do
42
+ word = HammerCLI::CompleterWord.new('\'word')
43
+ word.quoted?.must_equal true
44
+ end
45
+ end
46
+
47
+ describe "complete?" do
48
+ it "considers a word without quotes complete" do
49
+ word = HammerCLI::CompleterWord.new('word')
50
+ word.complete?.must_equal false
51
+ end
52
+
53
+ it "considers a word without quotes ending with space incomplete" do
54
+ word = HammerCLI::CompleterWord.new('word ')
55
+ word.complete?.must_equal true
56
+ end
57
+
58
+ it "considers open double quotes incomplete" do
59
+ word = HammerCLI::CompleterWord.new('"word')
60
+ word.complete?.must_equal false
61
+ end
62
+
63
+ it "considers open double quotes with spaces incomplete" do
64
+ word = HammerCLI::CompleterWord.new('"word ')
65
+ word.complete?.must_equal false
66
+ end
67
+
68
+ it "considers closed double quotes complete" do
69
+ word = HammerCLI::CompleterWord.new('"word"')
70
+ word.complete?.must_equal true
71
+ end
72
+
73
+ it "considers open single quotes incomplete" do
74
+ word = HammerCLI::CompleterWord.new('\'word')
75
+ word.complete?.must_equal false
76
+ end
77
+
78
+ it "considers open single quotes with spaces incomplete" do
79
+ word = HammerCLI::CompleterWord.new('\'word ')
80
+ word.complete?.must_equal false
81
+ end
82
+
83
+ it "considers closed single quotes complete" do
84
+ word = HammerCLI::CompleterWord.new('\'word\'')
85
+ word.complete?.must_equal true
86
+ end
87
+ end
88
+
89
+ end
90
+
91
+ describe HammerCLI::CompleterLine do
9
92
 
10
93
  context "splitting words" do
11
94
 
12
95
  it "should split basic line" do
13
- line = HammerCLI::CompleterLine.new(finished_line)
96
+ line = HammerCLI::CompleterLine.new("architecture list --name arch")
14
97
  line.must_equal ["architecture", "list", "--name", "arch"]
15
98
  end
16
99
 
17
100
  it "should split basic line with space at the end" do
18
- line = HammerCLI::CompleterLine.new(finished_line)
101
+ line = HammerCLI::CompleterLine.new("architecture list --name arch ")
19
102
  line.must_equal ["architecture", "list", "--name", "arch"]
20
103
  end
21
104
 
105
+ it "should split on equal sign" do
106
+ line = HammerCLI::CompleterLine.new("--name=arch")
107
+ line.must_equal ["--name", "arch"]
108
+ end
109
+
110
+ it "should split when last character is equal sign" do
111
+ line = HammerCLI::CompleterLine.new("--name=")
112
+ line.must_equal ["--name"]
113
+ end
114
+
115
+ it "should split on equal sign when quotes are used" do
116
+ line = HammerCLI::CompleterLine.new("--name='arch' ")
117
+ line.must_equal ["--name", "arch"]
118
+ end
119
+
120
+ it "should split line with single quotes" do
121
+ line = HammerCLI::CompleterLine.new("--name 'arch' ")
122
+ line.must_equal ["--name", "arch"]
123
+ end
124
+
125
+ it "should split line with double quotes" do
126
+ line = HammerCLI::CompleterLine.new("--name \"arch\"")
127
+ line.must_equal ["--name", "arch"]
128
+ end
129
+
130
+ it "should split line with single quotes and space between" do
131
+ line = HammerCLI::CompleterLine.new("--name 'ar ch '")
132
+ line.must_equal ["--name", "ar ch "]
133
+ end
134
+
135
+ it "should split line with one single quote and space between" do
136
+ line = HammerCLI::CompleterLine.new("--name 'ar ch ")
137
+ line.must_equal ["--name", "ar ch "]
138
+ end
139
+
140
+ it "should split line with double quotes and space between" do
141
+ line = HammerCLI::CompleterLine.new("--name \"ar ch \"")
142
+ line.must_equal ["--name", "ar ch "]
143
+ end
144
+
145
+ it "should split line with one double quote and space between" do
146
+ line = HammerCLI::CompleterLine.new("--name \"ar ch ")
147
+ line.must_equal ["--name", "ar ch "]
148
+ end
149
+
22
150
  end
23
151
 
24
- context "last word finished" do
152
+ context "line complete" do
153
+
154
+ it "should recongize incomplete line" do
155
+ line = HammerCLI::CompleterLine.new("architecture list --name arch")
156
+ line.complete?.must_equal false
157
+ end
158
+
159
+ it "should recongize complete line" do
160
+ line = HammerCLI::CompleterLine.new("architecture list --name arch ")
161
+ line.complete?.must_equal true
162
+ end
163
+
164
+ it "should recongize complete line that ends with quotes" do
165
+ line = HammerCLI::CompleterLine.new("--name 'ar ch'")
166
+ line.complete?.must_equal true
167
+ end
25
168
 
26
- it "should recongize unfinished line" do
27
- line = HammerCLI::CompleterLine.new(unfinished_line)
28
- line.finished?.must_equal false
169
+ it "should recongize complete line that ends with quotes followed by space" do
170
+ line = HammerCLI::CompleterLine.new("--name 'ar ch' ")
171
+ line.complete?.must_equal true
29
172
  end
30
173
 
31
- it "should recongize finished line" do
32
- line = HammerCLI::CompleterLine.new(finished_line)
33
- line.finished?.must_equal true
174
+ it "should recongize complete line that ends with double quotes" do
175
+ line = HammerCLI::CompleterLine.new("--name \"ar ch\"")
176
+ line.complete?.must_equal true
34
177
  end
35
178
 
36
- it "should recongize empty line as finished" do
179
+ it "should recongize one quote as incomplete" do
180
+ line = HammerCLI::CompleterLine.new("--name '")
181
+ line.complete?.must_equal false
182
+ end
183
+
184
+ it "should recongize one quote followed by space as incomplete" do
185
+ line = HammerCLI::CompleterLine.new("--name ' ")
186
+ line.complete?.must_equal false
187
+ end
188
+
189
+ it "should recongize one double quote as incomplete" do
190
+ line = HammerCLI::CompleterLine.new("--name \"")
191
+ line.complete?.must_equal false
192
+ end
193
+
194
+ it "should recongize empty line as complete" do
37
195
  line = HammerCLI::CompleterLine.new("")
38
- line.finished?.must_equal true
196
+ line.complete?.must_equal true
39
197
  end
40
198
 
41
199
  end
@@ -55,7 +213,7 @@ describe HammerCLI::Completer do
55
213
  end
56
214
 
57
215
  def complete(val)
58
- ["small ", "tall "]
216
+ ["small ", "tall ", "smel ly"]
59
217
  end
60
218
 
61
219
  end
@@ -103,6 +261,9 @@ describe HammerCLI::Completer do
103
261
  let(:completer) { HammerCLI::Completer.new(FakeMainCmd) }
104
262
 
105
263
  context "command completion" do
264
+
265
+ let(:ape_completions) { ["makkak ", "malpa ", "orangutan ", "--hairy ", "--weight ", "--height ", "-h ", "--help "] }
266
+
106
267
  it "should offer all available commands" do
107
268
  completer.complete("").sort.must_equal ["anabolic ", "ape ", "apocalypse ", "beast ", "-h ", "--help "].sort
108
269
  end
@@ -120,30 +281,54 @@ describe HammerCLI::Completer do
120
281
  end
121
282
 
122
283
  it "should offer all available subcommands and options" do
123
- completer.complete("ape ").sort.must_equal ["makkak ", "malpa ", "orangutan ", "--hairy ", "--weight ", "--height ", "-h ", "--help "].sort
284
+ completer.complete("ape ").sort.must_equal ape_completions.sort
124
285
  end
125
286
 
126
287
  it "should offer all available subcommands and options even if a flag has been passed" do
127
- completer.complete("ape --hairy ").sort.must_equal ["makkak ", "malpa ", "orangutan ", "--hairy ", "--weight ", "--height ", "-h ", "--help "].sort
288
+ completer.complete("ape --hairy ").sort.must_equal ape_completions.sort
128
289
  end
129
290
 
130
291
  it "should offer all available subcommands and options even if an option has been passed" do
131
- completer.complete("ape --weight 12kg ").sort.must_equal ["makkak ", "malpa ", "orangutan ", "--hairy ", "--weight ", "--height ", "-h ", "--help "].sort
292
+ completer.complete("ape --weight 12kg ").sort.must_equal ape_completions.sort
132
293
  end
133
294
 
134
295
  it "should offer all available subcommands and options even if an egual sign option has been passed" do
135
- completer.complete("ape --weight=12kg ").sort.must_equal ["makkak ", "malpa ", "orangutan ", "--hairy ", "--weight ", "--height ", "-h ", "--help "].sort
296
+ completer.complete("ape --weight=12kg ").sort.must_equal ape_completions.sort
297
+ end
298
+
299
+ it "should offer all available subcommands and options when quoted value was passed" do
300
+ completer.complete("ape --weight '12 kg' ").sort.must_equal ape_completions.sort
301
+ end
302
+
303
+ it "should offer all available subcommands and options when double quoted value was passed" do
304
+ completer.complete("ape --weight \"12 kg\" ").sort.must_equal ape_completions.sort
305
+ end
306
+
307
+ it "should offer all available subcommands and options when quoted value with equal sign was passed" do
308
+ completer.complete("ape --weight='12 kg' ").sort.must_equal ape_completions.sort
136
309
  end
137
310
  end
138
311
 
139
312
 
140
313
  context "option value completion" do
141
314
  it "should complete option values" do
142
- completer.complete("ape --height ").sort.must_equal ["small ", "tall "].sort
315
+ completer.complete("ape --height ").sort.must_equal ["small ", "tall ", "smel ly"].sort
316
+ end
317
+
318
+ it "should complete option values when equal sign is used" do
319
+ completer.complete("ape --height=").sort.must_equal ["small ", "tall ", "smel ly"].sort
143
320
  end
144
321
 
145
322
  it "should complete option values" do
146
- completer.complete("ape --height s").must_equal ["small "]
323
+ completer.complete("ape --height s").must_equal ["small ", "smel ly"]
324
+ end
325
+
326
+ it "should complete quoted option values" do
327
+ completer.complete("ape --height 's").must_equal ["'small' ", "'smel ly"]
328
+ end
329
+
330
+ it "should complete quoted option values" do
331
+ completer.complete("ape --height 'smel l").must_equal ["'smel ly"]
147
332
  end
148
333
  end
149
334