razor-client 0.15.1 → 0.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/NEWS.md +22 -0
- data/bin/razor +24 -0
- data/lib/razor/cli/command.rb +139 -0
- data/lib/razor/cli/document.rb +8 -4
- data/lib/razor/cli/format.rb +46 -22
- data/lib/razor/cli/navigate.rb +27 -149
- data/lib/razor/cli/parse.rb +21 -5
- data/lib/razor/cli/query.rb +68 -0
- data/lib/razor/cli/table_format.rb +41 -0
- data/lib/razor/cli/transforms.rb +18 -0
- data/lib/razor/cli/version.rb +1 -1
- data/lib/razor/cli/views.yaml +38 -0
- data/lib/razor/cli.rb +5 -2
- data/spec/cli/format_spec.rb +95 -5
- data/spec/cli/navigate_spec.rb +49 -5
- data/spec/cli/parse_spec.rb +21 -0
- data/spec/fixtures/vcr/Razor_CLI_Navigate/argument_formatting/should_allow_in_string.yml +322 -0
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_API_command_help_for_razor_--api_command_--help_.yml +110 -0
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_API_command_help_for_razor_--api_command_help_.yml +110 -0
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_API_command_help_for_razor_--api_help_command_.yml +110 -0
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_API_command_help_for_razor_--help_--api_command_.yml +110 -0
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_API_command_help_for_razor_-a_-h_command_.yml +110 -0
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_API_command_help_for_razor_-a_command_-h_.yml +110 -0
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_multiple_arguments_with_same_name/combining_as_an_object/should_construct_a_json_object.yml +181 -49
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_multiple_arguments_with_same_name/combining_as_an_object/should_construct_a_json_object_with_unicode.yml +121 -46
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_multiple_arguments_with_same_name/combining_as_an_object/should_fail_with_mixed_types_array_then_hash_.yml +68 -65
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_multiple_arguments_with_same_name/combining_as_an_object/should_fail_with_mixed_types_hash_then_array_.yml +177 -45
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_query_parameters/should_append_limit.yml +69 -0
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_query_parameters/should_append_start.yml +69 -0
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_query_parameters/should_not_fail_when_query_returns_details_for_one_item.yml +421 -0
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_query_parameters/should_store_query_without_query_parameters.yml +773 -0
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_query_parameters/should_throw_an_error_if_the_query_parameter_is_not_in_the_API.yml +36 -0
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_query_parameters/should_throw_an_error_if_the_query_parameter_is_not_in_the_API_from_a_single_item.yml +388 -0
- metadata +94 -82
data/lib/razor/cli/parse.rb
CHANGED
@@ -18,12 +18,12 @@ module Razor::CLI
|
|
18
18
|
@dump = true
|
19
19
|
end
|
20
20
|
|
21
|
-
opts.on "-
|
22
|
-
@
|
21
|
+
opts.on "-a", "--api", "Show API help for a command" do
|
22
|
+
@api_help = true
|
23
23
|
end
|
24
24
|
|
25
|
-
opts.on "-
|
26
|
-
@
|
25
|
+
opts.on "-k", "--insecure", "Allow SSL connections without verified certificates" do
|
26
|
+
@verify_ssl = false
|
27
27
|
end
|
28
28
|
|
29
29
|
opts.on "-u", "--url URL",
|
@@ -93,6 +93,10 @@ ERR
|
|
93
93
|
!!@show_version
|
94
94
|
end
|
95
95
|
|
96
|
+
def show_api_help?
|
97
|
+
!!@api_help
|
98
|
+
end
|
99
|
+
|
96
100
|
def show_help?
|
97
101
|
!!@option_help
|
98
102
|
end
|
@@ -105,12 +109,21 @@ ERR
|
|
105
109
|
!!@dump
|
106
110
|
end
|
107
111
|
|
108
|
-
|
112
|
+
def verify_ssl?
|
113
|
+
!!@verify_ssl
|
114
|
+
end
|
115
|
+
|
116
|
+
attr_reader :api_url, :args
|
117
|
+
# The format can be determined from later segments.
|
118
|
+
attr_accessor :format, :stripped_args
|
109
119
|
|
110
120
|
def initialize(args)
|
111
121
|
parse_and_set_api_url(ENV["RAZOR_API"] || DEFAULT_RAZOR_API, :env)
|
112
122
|
@args = args.dup
|
123
|
+
# To be populated externally.
|
124
|
+
@stripped_args = []
|
113
125
|
@format = 'short'
|
126
|
+
@verify_ssl = true
|
114
127
|
@args = get_optparse.order(@args)
|
115
128
|
@args = set_help_vars(@args)
|
116
129
|
if @args == ['version'] or @show_version
|
@@ -150,6 +163,9 @@ ERR
|
|
150
163
|
private
|
151
164
|
def parse_and_set_api_url(url, source)
|
152
165
|
begin
|
166
|
+
unless url.start_with?('http:') or url.start_with?('https:')
|
167
|
+
raise Razor::CLI::InvalidURIError.new(url, source)
|
168
|
+
end
|
153
169
|
@api_url = URI.parse(url)
|
154
170
|
rescue URI::InvalidURIError => e
|
155
171
|
raise Razor::CLI::InvalidURIError.new(url, source)
|
@@ -0,0 +1,68 @@
|
|
1
|
+
class Razor::CLI::Query
|
2
|
+
def initialize(parse, navigate, collections, segments)
|
3
|
+
@parse = parse
|
4
|
+
@navigate = navigate
|
5
|
+
@collections = collections
|
6
|
+
@segments = segments
|
7
|
+
@stripped_segments = []
|
8
|
+
@options = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def stripped_segments
|
12
|
+
@stripped_segments.join
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_optparse(doc, nav)
|
16
|
+
# If the last document is an Array, we need to find
|
17
|
+
# which element matches the given query. Once found,
|
18
|
+
# return the 'params' section, if it has one.
|
19
|
+
if doc.is_a?(Array)
|
20
|
+
query = doc.find {|coll| coll['name'] == nav}
|
21
|
+
params = (query && query['params']) || {}
|
22
|
+
elsif doc.is_a?(Hash)
|
23
|
+
params = (doc[nav] && doc[nav]['params']) || {}
|
24
|
+
end
|
25
|
+
@queryoptparse = OptionParser.new do |opts|
|
26
|
+
opts.on "-f", "--full", "Show full details when viewing entities" do
|
27
|
+
@parse.format = 'full'
|
28
|
+
end
|
29
|
+
|
30
|
+
opts.on "-s", "--short", "Show shortened details when viewing entities" do
|
31
|
+
@parse.format = 'short'
|
32
|
+
end
|
33
|
+
|
34
|
+
params.each do |param, args|
|
35
|
+
if args['type'] == 'boolean'
|
36
|
+
opts.on "--#{param}" do
|
37
|
+
@options[param] = true
|
38
|
+
end
|
39
|
+
else
|
40
|
+
opts.on "--#{param} VALUE" do |value|
|
41
|
+
@options[param] = value
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def run
|
49
|
+
@doc = @collections
|
50
|
+
while @segments.any?
|
51
|
+
nav = @segments.shift
|
52
|
+
@parse.stripped_args << nav
|
53
|
+
@segments = get_optparse(@doc, nav).order(@segments)
|
54
|
+
@doc = @navigate.move_to nav, @doc, @options
|
55
|
+
end
|
56
|
+
|
57
|
+
# Get the next level if it's a list of objects.
|
58
|
+
if @doc.is_a?(Hash) and @doc['items'].is_a?(Array)
|
59
|
+
# Cache doc_resource since these queries are just for extra detail.
|
60
|
+
temp_doc_resource = @navigate.doc_resource
|
61
|
+
@doc['items'] = @doc['items'].map do |item|
|
62
|
+
item.is_a?(Hash) && item.has_key?('id') ? @navigate.json_get(URI.parse(item['id'])) : item
|
63
|
+
end
|
64
|
+
@navigate.doc_resource = temp_doc_resource
|
65
|
+
end
|
66
|
+
@doc
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'command_line_reporter'
|
2
|
+
class Razor::CLI::TableFormat
|
3
|
+
include CommandLineReporter
|
4
|
+
|
5
|
+
def run(doc, column_overrides)
|
6
|
+
suppress_output
|
7
|
+
table(:border => true, :encoding => :ascii) do
|
8
|
+
headings = (column_overrides or get_headers(doc))
|
9
|
+
row do
|
10
|
+
headings.each do |header|
|
11
|
+
column(header, :width => get_width(header, doc))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
doc.each do |page|
|
15
|
+
row do
|
16
|
+
headings.each do |heading|
|
17
|
+
column(page[heading])
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
# Capturing stores the string, rather than printing to STDOUT (default).
|
23
|
+
capture_output.strip
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_width(header, doc)
|
27
|
+
(doc.map do |page|
|
28
|
+
(page[header] or '').to_s.length
|
29
|
+
end << header.to_s.length).max
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_headers(doc)
|
33
|
+
[].tap do |headers|
|
34
|
+
doc.map do |page|
|
35
|
+
page.map do |item|
|
36
|
+
headers << item[0] unless headers.include?(item[0])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/razor/cli/transforms.rb
CHANGED
@@ -26,6 +26,10 @@ module Razor::CLI
|
|
26
26
|
def name(obj)
|
27
27
|
obj ? obj['name'] : "---"
|
28
28
|
end
|
29
|
+
def name_hide_nil(obj)
|
30
|
+
raise Razor::CLI::HideColumnError if obj.nil?
|
31
|
+
obj['name']
|
32
|
+
end
|
29
33
|
def name_if_present(obj)
|
30
34
|
obj ? obj['name'] : "---"
|
31
35
|
end
|
@@ -38,5 +42,19 @@ module Razor::CLI
|
|
38
42
|
def count_hash(hash)
|
39
43
|
hash.is_a?(Hash) ? hash.keys.size : 0
|
40
44
|
end
|
45
|
+
def event_msg(obj)
|
46
|
+
raise Razor::CLI::HideColumnError if obj['msg'].nil?
|
47
|
+
obj['msg'][0..50] + ('...' if obj['msg'].size > 50) if obj['msg']
|
48
|
+
end
|
49
|
+
def full_event_msg(obj)
|
50
|
+
raise Razor::CLI::HideColumnError if obj['msg'].nil?
|
51
|
+
obj['msg']
|
52
|
+
end
|
53
|
+
def event_entities(hash)
|
54
|
+
shallow_hash(Hash[hash].keep_if {|k,_| ['task', 'policy', 'broker', 'repo', 'node', 'command'].include?(k)})
|
55
|
+
end
|
56
|
+
def event_misc(hash)
|
57
|
+
shallow_hash(Hash[hash].delete_if {|k,_|['task', 'policy', 'broker', 'repo', 'node', 'msg', 'command'].include?(k)})
|
58
|
+
end
|
41
59
|
end
|
42
60
|
end
|
data/lib/razor/cli/version.rb
CHANGED
@@ -18,7 +18,7 @@ module Razor
|
|
18
18
|
#
|
19
19
|
# The next line is the one that our packaging tools modify, so please make
|
20
20
|
# sure that any change to it is discussed and agreed first.
|
21
|
-
version = '0.
|
21
|
+
version = '0.16.0'
|
22
22
|
|
23
23
|
if version == "DEVELOPMENT"
|
24
24
|
root = File.expand_path("../../..", File.dirname(__FILE__))
|
data/lib/razor/cli/views.yaml
CHANGED
@@ -9,6 +9,7 @@
|
|
9
9
|
# `+show`: This section configures which attributes are shown in the output.
|
10
10
|
# `+layout`: This configures whether to use 'list' or 'table' output.
|
11
11
|
# `+column`: This changes which column is used in the field formatting.
|
12
|
+
# `+format`: This references a method inside `transforms.rb` which will mutate the column's value.
|
12
13
|
collections:
|
13
14
|
brokers:
|
14
15
|
+short:
|
@@ -194,3 +195,40 @@ collections:
|
|
194
195
|
+format: count
|
195
196
|
status:
|
196
197
|
submitted_at:
|
198
|
+
events:
|
199
|
+
+short:
|
200
|
+
+layout: table
|
201
|
+
+show:
|
202
|
+
name:
|
203
|
+
timestamp:
|
204
|
+
message:
|
205
|
+
+column: entry
|
206
|
+
+format: event_msg
|
207
|
+
entities:
|
208
|
+
+column: entry
|
209
|
+
+format: event_entities
|
210
|
+
entry:
|
211
|
+
+column: entry
|
212
|
+
+format: event_misc
|
213
|
+
member:
|
214
|
+
+short:
|
215
|
+
+show:
|
216
|
+
name:
|
217
|
+
timestamp:
|
218
|
+
message:
|
219
|
+
+column: entry
|
220
|
+
+format: full_event_msg
|
221
|
+
broker:
|
222
|
+
+format: name_hide_nil
|
223
|
+
node:
|
224
|
+
+format: name_hide_nil
|
225
|
+
policy:
|
226
|
+
+format: name_hide_nil
|
227
|
+
repo:
|
228
|
+
+format: name_hide_nil
|
229
|
+
command:
|
230
|
+
+format: name_hide_nil
|
231
|
+
task:
|
232
|
+
+format: name_hide_nil
|
233
|
+
entry:
|
234
|
+
+format: event_misc
|
data/lib/razor/cli.rb
CHANGED
@@ -19,7 +19,7 @@ module Razor
|
|
19
19
|
when :env
|
20
20
|
super "URL '#{url}' in ENV variable RAZOR_API is not valid"
|
21
21
|
when :opts
|
22
|
-
super "URL '#{url}' provided by -
|
22
|
+
super "URL '#{url}' provided by -u or --url is not valid"
|
23
23
|
else
|
24
24
|
super "URL '#{url}' is not valid"
|
25
25
|
end
|
@@ -39,6 +39,9 @@ require_relative 'cli/version'
|
|
39
39
|
require_relative 'cli/navigate'
|
40
40
|
require_relative 'cli/parse'
|
41
41
|
require_relative 'cli/format'
|
42
|
+
require_relative 'cli/table_format'
|
42
43
|
require_relative 'cli/document'
|
43
44
|
require_relative 'cli/views'
|
44
|
-
require_relative 'cli/transforms'
|
45
|
+
require_relative 'cli/transforms'
|
46
|
+
require_relative 'cli/query'
|
47
|
+
require_relative 'cli/command'
|
data/spec/cli/format_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
1
2
|
# Needed to make the client work on Ruby 1.8.7
|
2
3
|
unless Kernel.respond_to?(:require_relative)
|
3
4
|
module Kernel
|
@@ -14,7 +15,8 @@ describe Razor::CLI::Format do
|
|
14
15
|
include described_class
|
15
16
|
|
16
17
|
def format(doc, args = {})
|
17
|
-
args = {:format => 'short', :
|
18
|
+
args = {:format => 'short', :stripped_args => ['something', 'else'], :query? => true, :show_command_help? => false,
|
19
|
+
:show_api_help? => false}.merge(args)
|
18
20
|
parse = double(args)
|
19
21
|
format_document doc, parse
|
20
22
|
end
|
@@ -86,14 +88,102 @@ describe Razor::CLI::Format do
|
|
86
88
|
"items"=>[{'a' => 'b', 'c' => 'd'},
|
87
89
|
{'b' => 'c', 'e' => 'f'}]}
|
88
90
|
result = format doc
|
89
|
-
result.should ==
|
91
|
+
result.should ==
|
92
|
+
# The framework seems to be adding unnecessary spaces at the end of each data line;
|
93
|
+
# Working around this by adding \s to the expectation.
|
94
|
+
|
95
|
+
# Unicode:
|
96
|
+
#┏━━━┳━━━┳━━━┳━━━┓
|
97
|
+
#┃ a ┃ c ┃ b ┃ e ┃\s
|
98
|
+
#┣━━━╊━━━╊━━━╊━━━┫
|
99
|
+
#┃ b ┃ d ┃ ┃ ┃\s
|
100
|
+
#┣━━━╊━━━╊━━━╊━━━┫
|
101
|
+
#┃ ┃ ┃ c ┃ f ┃\s
|
102
|
+
#┗━━━┻━━━┻━━━┻━━━┛
|
103
|
+
# ASCII:
|
104
|
+
<<-OUTPUT.rstrip
|
105
|
+
+---+---+---+---+
|
106
|
+
| a | c | b | e |\s
|
90
107
|
+---+---+---+---+
|
91
|
-
|
|
108
|
+
| b | d | | |\s
|
92
109
|
+---+---+---+---+
|
93
|
-
|
|
94
|
-
| | | c | f |
|
110
|
+
| | | c | f |\s
|
95
111
|
+---+---+---+---+
|
112
|
+
OUTPUT
|
113
|
+
end
|
114
|
+
|
115
|
+
it "works right with unicode" do
|
116
|
+
doc = {"spec"=>"http://api.puppetlabs.com/razor/v1/collections/nodes/log",
|
117
|
+
"items"=>[{'a' => 'ᓱᓴᓐ ᐊᒡᓗᒃᑲᖅ'}]}
|
118
|
+
result = format doc
|
119
|
+
result.should ==
|
120
|
+
# The framework seems to be adding unnecessary spaces at the end of each data line;
|
121
|
+
# Working around this by adding \s to the expectation.
|
122
|
+
|
123
|
+
# Unicode:
|
124
|
+
#┏━━━━━━━━━━━━┓
|
125
|
+
#┃ a ┃\s
|
126
|
+
#┣━━━━━━━━━━━━┫
|
127
|
+
#┃ ᓱᓴᓐ ᐊᒡᓗᒃᑲᖅ ┃\s
|
128
|
+
#┗━━━━━━━━━━━━┛
|
129
|
+
# ASCII:
|
130
|
+
<<-OUTPUT.rstrip
|
131
|
+
+------------+
|
132
|
+
| a |\s
|
133
|
+
+------------+
|
134
|
+
| ᓱᓴᓐ ᐊᒡᓗᒃᑲᖅ |\s
|
135
|
+
+------------+
|
96
136
|
OUTPUT
|
97
137
|
end
|
98
138
|
end
|
139
|
+
|
140
|
+
context 'api help' do
|
141
|
+
it "displays the CLI help by default" do
|
142
|
+
doc = {"name"=>"some-help", "help" => {"summary"=>"summary here",
|
143
|
+
"examples"=>{"api"=>"api example is here", "cli"=>"cli example is here"},
|
144
|
+
"full" => "shouldn't show this"},
|
145
|
+
"schema" => {"name"=>{"type"=>"string"}}}
|
146
|
+
result = format doc, show_command_help?: true
|
147
|
+
result.should =~ /cli example is here/
|
148
|
+
end
|
149
|
+
|
150
|
+
it "displays the API help when the --api flag is true" do
|
151
|
+
doc = {"name"=>"some-help", "help" => {"summary"=>"summary here",
|
152
|
+
"examples"=>{"api"=>"api example is here", "cli"=>"cli example is here"},
|
153
|
+
"full" => "shouldn't show this"},
|
154
|
+
"schema" => {"name"=>{"type"=>"string"}}}
|
155
|
+
result = format doc, show_api_help?: true, show_command_help?: true
|
156
|
+
result.should =~ /api example is here/
|
157
|
+
end
|
158
|
+
|
159
|
+
it "displays the full help if on an older server" do
|
160
|
+
doc = {"name"=>"some-help", "help" => {"full" => "full help is here"},
|
161
|
+
"schema" => {"name"=>{"type"=>"string"}}}
|
162
|
+
result = format doc, show_command_help?: true
|
163
|
+
result.should =~ /full help is here/
|
164
|
+
end
|
165
|
+
|
166
|
+
it "displays the full help if on an older server and api is specified" do
|
167
|
+
doc = {"name"=>"some-help", "help" => {"full" => "full help is here"},
|
168
|
+
"schema" => {"name"=>{"type"=>"string"}}}
|
169
|
+
result = format doc, show_api_help?: true, show_command_help?: true
|
170
|
+
result.should =~ /full help is here/
|
171
|
+
end
|
172
|
+
|
173
|
+
it "skips the 'Examples' section if cli examples are not included" do
|
174
|
+
doc = {"name"=>"some-help", "help" => {"summary"=>"summary here",
|
175
|
+
"examples"=>{"api"=>"api example is here"},
|
176
|
+
"full" => "shouldn't show this"},
|
177
|
+
"schema" => {"name"=>{"type"=>"string"}}}
|
178
|
+
result = format doc, show_cli_help?: true, show_command_help?: true
|
179
|
+
result.should =~ /summary here/
|
180
|
+
result.should_not =~ /EXAMPLES/
|
181
|
+
end
|
182
|
+
|
183
|
+
it "errors if help does not exist" do
|
184
|
+
doc = {"name"=>"some-help", "schema" => {"name"=>{"type"=>"string"}}}
|
185
|
+
expect { format doc, show_cli_help?: true, show_command_help?: true }.
|
186
|
+
to raise_error(Razor::CLI::Error, /Could not find help for that entry/)
|
187
|
+
end
|
188
|
+
end
|
99
189
|
end
|
data/spec/cli/navigate_spec.rb
CHANGED
@@ -38,7 +38,7 @@ describe Razor::CLI::Navigate do
|
|
38
38
|
context "with invalid parameter", :vcr do
|
39
39
|
it "should fail with bad JSON" do
|
40
40
|
nav = Razor::CLI::Parse.new(['create-broker', '--name', 'broker', '--type', 'puppet', '--configuration', 'not-json']).navigate
|
41
|
-
expect{nav.get_document}.to raise_error(ArgumentError, /Invalid
|
41
|
+
expect{nav.get_document}.to raise_error(ArgumentError, /Invalid object for argument 'configuration'/)
|
42
42
|
end
|
43
43
|
|
44
44
|
it "should fail with malformed argument" do
|
@@ -107,13 +107,13 @@ describe Razor::CLI::Navigate do
|
|
107
107
|
nav = Razor::CLI::Parse.new(['create-broker', '--name', 'broker2', '--broker-type', 'puppet',
|
108
108
|
'--configuration', '["server"]',
|
109
109
|
'--configuration', 'environment=production']).navigate
|
110
|
-
expect {nav.get_document}.to raise_error(ArgumentError, "
|
110
|
+
expect {nav.get_document}.to raise_error(ArgumentError, "Invalid object for argument 'configuration'")
|
111
111
|
end
|
112
112
|
it "should fail with mixed types (hash then array)" do
|
113
113
|
nav = Razor::CLI::Parse.new(['create-broker', '--name', 'broker3', '--broker-type', 'puppet',
|
114
114
|
'--configuration', 'environment=production',
|
115
115
|
'--configuration', '["server"]']).navigate
|
116
|
-
expect {nav.get_document}.to raise_error(ArgumentError, "
|
116
|
+
expect {nav.get_document}.to raise_error(ArgumentError, "Invalid object for argument 'configuration'")
|
117
117
|
end
|
118
118
|
end
|
119
119
|
end
|
@@ -124,6 +124,10 @@ describe Razor::CLI::Navigate do
|
|
124
124
|
Razor::CLI::Parse.new(['create-repo', '--name="double-quote with spaces"', '--url', 'http://url.com/some.iso', '--task', 'noop']).navigate.get_document
|
125
125
|
Razor::CLI::Parse.new(['create-repo', '--name=\'single-quote with spaces\'', '--url', 'http://url.com/some.iso', '--task', 'noop']).navigate.get_document
|
126
126
|
end
|
127
|
+
|
128
|
+
it "should allow '=' in string" do
|
129
|
+
Razor::CLI::Parse.new(['create-repo', '--name=\'with=equals\'', '--url', 'http://url.com/some.iso', '--task', 'noop']).navigate.get_document['name'].should =~ /with=equals/
|
130
|
+
end
|
127
131
|
end
|
128
132
|
|
129
133
|
context "for command help", :vcr do
|
@@ -149,13 +153,53 @@ describe Razor::CLI::Navigate do
|
|
149
153
|
it "should supply that to the API service" do
|
150
154
|
nav = Razor::CLI::Parse.new(AuthArg).navigate
|
151
155
|
nav.get_document.should be_an_instance_of Hash
|
152
|
-
|
156
|
+
nav.last_url.user.should == 'fred'
|
157
|
+
nav.last_url.password.should == 'dead'
|
153
158
|
end
|
154
159
|
|
155
160
|
it "should preserve that across navigation" do
|
156
161
|
nav = Razor::CLI::Parse.new(AuthArg + ['tags']).navigate
|
157
162
|
nav.get_document['items'].should == []
|
158
|
-
|
163
|
+
nav.last_url.user.should == 'fred'
|
164
|
+
nav.last_url.password.should == 'dead'
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
context "with query parameters", :vcr do
|
169
|
+
it "should append limit" do
|
170
|
+
nav = Razor::CLI::Parse.new(%w[-u http://fred:dead@localhost:8080/api events --limit 1]).navigate
|
171
|
+
nav.get_document.should be_an_instance_of Hash
|
172
|
+
nav.last_url.to_s.should =~ /limit=1/
|
173
|
+
end
|
174
|
+
it "should append start" do
|
175
|
+
nav = Razor::CLI::Parse.new(%w[-u http://fred:dead@localhost:8080/api events --start 1]).navigate
|
176
|
+
nav.get_document.should be_an_instance_of Hash
|
177
|
+
nav.last_url.to_s.should =~ /start=1/
|
178
|
+
end
|
179
|
+
it "should throw an error if the query parameter is not in the API" do
|
180
|
+
nav = Razor::CLI::Parse.new(%w[-u http://fred:dead@localhost:8080/api events --not-in-api 1]).navigate
|
181
|
+
expect {nav.get_document}.to raise_error(OptionParser::InvalidOption, 'invalid option: --not-in-api')
|
182
|
+
end
|
183
|
+
it "should not fail when query returns details for one item" do
|
184
|
+
nav = Razor::CLI::Parse.new(['register-node', '--installed', 'true', '--hw-info', 'net0=78:31:c1:be:c8:00']).navigate.get_document
|
185
|
+
name = nav['name']
|
186
|
+
nav = Razor::CLI::Parse.new(['-u', 'http://fred:dead@localhost:8080/api', 'nodes', name]).navigate
|
187
|
+
nav.get_document['name'].should == name
|
188
|
+
end
|
189
|
+
it "should throw an error if the query parameter is not in the API from a single item" do
|
190
|
+
nav = Razor::CLI::Parse.new(['register-node', '--installed', 'true', '--hw-info', 'net0=78:31:c1:be:c8:00']).navigate.get_document
|
191
|
+
name = nav['name']
|
192
|
+
expect {Razor::CLI::Parse.new(['-u', 'http://fred:dead@localhost:8080/api', 'nodes', name, '--limit', '1']).
|
193
|
+
navigate.get_document}.to raise_error(OptionParser::InvalidOption, 'invalid option: --limit')
|
194
|
+
end
|
195
|
+
it "should store query without query parameters" do
|
196
|
+
name = Razor::CLI::Parse.new(['register-node', '--installed', 'true', '--hw-info', 'net0=78:31:c1:be:c8:00']).
|
197
|
+
navigate.get_document['name']
|
198
|
+
Razor::CLI::Parse.new(['register-node', '--installed', 'true', '--hw-info', 'net0=78:31:c1:be:c8:01']).
|
199
|
+
navigate.get_document
|
200
|
+
parse = Razor::CLI::Parse.new(['-u', 'http://fred:dead@localhost:8080/api', 'nodes', name, 'log', '--limit', '1'])
|
201
|
+
parse.navigate.get_document
|
202
|
+
parse.stripped_args.should == ['nodes', name, 'log']
|
159
203
|
end
|
160
204
|
end
|
161
205
|
end
|