razor-client 0.16.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/NEWS.md +15 -0
- data/bin/razor +3 -2
- data/lib/razor/cli.rb +6 -0
- data/lib/razor/cli/command.rb +24 -13
- data/lib/razor/cli/navigate.rb +1 -0
- data/lib/razor/cli/parse.rb +29 -3
- data/lib/razor/cli/query.rb +2 -1
- data/lib/razor/cli/table_format.rb +38 -2
- data/lib/razor/cli/transforms.rb +8 -1
- data/lib/razor/cli/version.rb +1 -1
- data/lib/razor/cli/views.yaml +17 -4
- data/spec/cli/command_spec.rb +66 -0
- data/spec/cli/navigate_spec.rb +7 -7
- data/spec/cli/parse_spec.rb +23 -4
- data/spec/fixtures/vcr/Razor_CLI_Navigate/argument_formatting/should_allow_in_string.yml +82 -171
- data/spec/fixtures/vcr/Razor_CLI_Navigate/argument_formatting/should_allow_spaces.yml +281 -548
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_command_help_for_razor_--help_command_.yml +160 -37
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_command_help_for_razor_-h_command_.yml +160 -37
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_command_help_for_razor_command_--help_.yml +160 -37
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_command_help_for_razor_command_-h_.yml +160 -37
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_command_help_for_razor_command_help_.yml +160 -37
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_command_help_for_razor_help_command_.yml +160 -37
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_authentication/should_preserve_that_across_navigation.yml +10 -10
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_authentication/should_supply_that_to_the_API_service.yml +5 -5
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_invalid_parameter/should_fail_with_bad_JSON.yml +71 -166
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_invalid_parameter/should_fail_with_malformed_argument.yml +109 -59
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_multiple_arguments_with_same_name/combining_as_an_array/should_merge_an_array_into_an_existing_array.yml +527 -1360
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_multiple_arguments_with_same_name/combining_as_an_array/should_merge_the_arguments_as_an_array.yml +528 -1361
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_multiple_arguments_with_same_name/combining_as_an_array/should_merge_the_arguments_into_an_existing_array.yml +528 -1361
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_multiple_arguments_with_same_name/combining_as_an_object/should_construct_a_json_object.yml +66 -229
- 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 +104 -165
- 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 +57 -155
- 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 +57 -220
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_no_parameters/should_fail_with_bad_JSON.yml +98 -5
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_query_parameters/should_append_limit.yml +8 -8
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_query_parameters/should_append_start.yml +8 -8
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_query_parameters/should_not_fail_when_query_returns_details_for_one_item.yml +41 -149
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_query_parameters/should_store_query_without_query_parameters.yml +70 -286
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_query_parameters/should_throw_an_error_if_the_query_parameter_is_not_in_the_API.yml +5 -5
- 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 +36 -144
- data/spec/fixtures/vcr/Razor_CLI_Parse/_new/_help/should_print_a_list_of_known_endpoints.yml +5 -5
- data/spec/spec_helper.rb +8 -4
- metadata +92 -85
- checksums.yaml +0 -7
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_API_command_help_for_razor_--api_command_--help_.yml +0 -110
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_API_command_help_for_razor_--api_command_help_.yml +0 -110
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_API_command_help_for_razor_--api_help_command_.yml +0 -110
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_API_command_help_for_razor_--help_--api_command_.yml +0 -110
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_API_command_help_for_razor_-a_-h_command_.yml +0 -110
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_API_command_help_for_razor_-a_command_-h_.yml +0 -110
data/NEWS.md
CHANGED
@@ -1,5 +1,20 @@
|
|
1
1
|
# Razor Client Release Notes
|
2
2
|
|
3
|
+
## 1.0.0 - 2015-06-08
|
4
|
+
|
5
|
+
* NEW: Fit collection output to STDIN size for easier viewing.
|
6
|
+
* NEW: RAZOR_CA_FILE environment variable allows TLS/SSL certificate
|
7
|
+
verification for requests.
|
8
|
+
* NEW: The default API protocol and port are HTTPS over TLS/SSL on port 8151.
|
9
|
+
* NEW: Utilizes `aliases` property in command metadata to better guess datatypes
|
10
|
+
for aliases.
|
11
|
+
* IMPROVEMENT: `razor hooks` now displays as a table.
|
12
|
+
* IMPROVEMENT: Better output for `razor events ##`.
|
13
|
+
* IMPROVEMENT: Exits with an error code of 1 when a `razor` command fails.
|
14
|
+
* BUGFIX: `razor events` no longer causes exception.
|
15
|
+
* BUGFIX: `razor commands ## errors` no longer causes exception.
|
16
|
+
* BUGFIX: Hook output message can now be any datatype.
|
17
|
+
|
3
18
|
## 0.16.0 - 2015-01-05
|
4
19
|
|
5
20
|
* BUGFIX: Commands were not always including authentication
|
data/bin/razor
CHANGED
data/lib/razor/cli.rb
CHANGED
@@ -26,6 +26,12 @@ module Razor
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
+
class InvalidCAFileError < Error
|
30
|
+
def initialize(path)
|
31
|
+
super "CA file '#{path}' in ENV variable RAZOR_CA_FILE does not exist"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
29
35
|
class VersionCompatibilityError < Error
|
30
36
|
def initialize(reason)
|
31
37
|
super "Server version is not compatible with client version: #{reason}"
|
data/lib/razor/cli/command.rb
CHANGED
@@ -37,6 +37,7 @@ class Razor::CLI::Command
|
|
37
37
|
def extract_command
|
38
38
|
cmd = command(@segments.shift)
|
39
39
|
@cmd_url = URI.parse(cmd['id'])
|
40
|
+
@cmd_schema = cmd_schema(@cmd_url)
|
40
41
|
body = {}
|
41
42
|
until @segments.empty?
|
42
43
|
argument = @segments.shift
|
@@ -44,7 +45,8 @@ class Razor::CLI::Command
|
|
44
45
|
# `--arg=value` or `--arg value`
|
45
46
|
arg, value = [$1, $3]
|
46
47
|
value = @segments.shift if value.nil? && @segments[0] !~ /^--/
|
47
|
-
|
48
|
+
arg = self.class.resolve_alias(arg, @cmd_schema)
|
49
|
+
body[arg] = self.class.convert_arg(arg, value, body[arg], @cmd_schema)
|
48
50
|
else
|
49
51
|
raise ArgumentError, "Unexpected argument #{argument}"
|
50
52
|
end
|
@@ -63,19 +65,20 @@ class Razor::CLI::Command
|
|
63
65
|
[cmd, body]
|
64
66
|
end
|
65
67
|
|
66
|
-
def cmd_schema(
|
68
|
+
def cmd_schema(cmd_url)
|
67
69
|
begin
|
68
|
-
@navigate.json_get(
|
70
|
+
@navigate.json_get(cmd_url)['schema']
|
69
71
|
rescue RestClient::ResourceNotFound => _
|
70
72
|
raise VersionCompatibilityError, 'Server must supply the expected datatypes for command arguments; use `--json` or upgrade razor-server'
|
71
73
|
end
|
72
74
|
end
|
73
75
|
|
74
|
-
def arg_type(
|
76
|
+
def self.arg_type(arg_name, cmd_schema)
|
75
77
|
# Short-circuit to allow this as a work-around for backwards compatibility.
|
76
78
|
return nil if arg_name == 'json'
|
77
|
-
|
78
|
-
|
79
|
+
return nil unless cmd_schema.is_a?(Hash)
|
80
|
+
return cmd_schema[arg_name]['type'] if cmd_schema.has_key?(arg_name)
|
81
|
+
return nil
|
79
82
|
end
|
80
83
|
|
81
84
|
# `cmd_name`: The name of the command being executed.
|
@@ -85,22 +88,19 @@ class Razor::CLI::Command
|
|
85
88
|
# by previous calls to this method. The new `value` will be
|
86
89
|
# concatenated to an array or hash if an array/hash is
|
87
90
|
# accepted by the command for the given argument.
|
88
|
-
def convert_arg(
|
91
|
+
def self.convert_arg(arg_name, value, existing_value, cmd_schema)
|
89
92
|
value = nil if value == "null"
|
90
93
|
|
91
|
-
argument_type = arg_type(
|
94
|
+
argument_type = arg_type(arg_name, cmd_schema)
|
92
95
|
|
93
96
|
# This might be helpful, since there's no other method for debug-level logging on the client.
|
94
|
-
puts "Formatting argument #{arg_name} with value #{value} as #{argument_type}\n" if @parse.dump_response?
|
97
|
+
puts "Formatting argument #{arg_name} with value #{value} as #{argument_type}\n" if @parse && @parse.dump_response?
|
95
98
|
|
96
99
|
case argument_type
|
97
100
|
when "array"
|
98
101
|
existing_value ||= []
|
99
102
|
begin
|
100
|
-
MultiJson::load(value)
|
101
|
-
value = Array(value)
|
102
|
-
existing_value + value
|
103
|
-
end
|
103
|
+
existing_value + Array(MultiJson::load(value))
|
104
104
|
rescue MultiJson::LoadError => _
|
105
105
|
existing_value + Array(value)
|
106
106
|
end
|
@@ -136,4 +136,15 @@ class Razor::CLI::Command
|
|
136
136
|
raise Razor::CLI::Error, "Unexpected datatype '#{argument_type}' for argument #{arg_name}"
|
137
137
|
end
|
138
138
|
end
|
139
|
+
|
140
|
+
def self.resolve_alias(arg_name, cmd_schema)
|
141
|
+
return arg_name if cmd_schema[arg_name]
|
142
|
+
cmd_schema.find do |other_attr, metadata|
|
143
|
+
if metadata && metadata.has_key?('aliases')
|
144
|
+
return other_attr if metadata['aliases'].find {|aliaz| aliaz == arg_name}
|
145
|
+
end
|
146
|
+
end
|
147
|
+
# No results; return the same name to generate a reasonable error message.
|
148
|
+
arg_name
|
149
|
+
end
|
139
150
|
end
|
data/lib/razor/cli/navigate.rb
CHANGED
@@ -142,6 +142,7 @@ module Razor::CLI
|
|
142
142
|
def create_resource(url, headers)
|
143
143
|
@doc_resource = RestClient::Resource.new(url.to_s, :headers => headers,
|
144
144
|
:verify_ssl => @parse.verify_ssl?,
|
145
|
+
:ssl_ca_file => @parse.ssl_ca_file,
|
145
146
|
:user => @username,
|
146
147
|
:password => @password)
|
147
148
|
end
|
data/lib/razor/cli/parse.rb
CHANGED
@@ -53,14 +53,28 @@ module Razor::CLI
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def version
|
56
|
+
begin
|
56
57
|
<<-VERSION
|
57
58
|
Razor Server version: #{navigate.server_version}
|
58
59
|
Razor Client version: #{Razor::CLI::VERSION}
|
59
60
|
VERSION
|
61
|
+
rescue RestClient::Unauthorized
|
62
|
+
puts <<-UNAUTH
|
63
|
+
Error: Credentials are required to connect to the server at #{@api_url}"
|
64
|
+
UNAUTH
|
65
|
+
exit 1
|
66
|
+
rescue
|
67
|
+
puts <<-ERR
|
68
|
+
Error: Could not connect to the server at #{@api_url}. More help is available after pointing
|
69
|
+
the client to a Razor server
|
70
|
+
ERR
|
71
|
+
exit 1
|
72
|
+
end
|
60
73
|
end
|
61
74
|
|
62
75
|
def help
|
63
76
|
output = get_optparse.to_s
|
77
|
+
exit = 0
|
64
78
|
begin
|
65
79
|
output << <<-HELP
|
66
80
|
#{list_things("Collections", navigate.collections)}
|
@@ -80,13 +94,15 @@ HELP
|
|
80
94
|
output << <<-UNAUTH
|
81
95
|
Error: Credentials are required to connect to the server at #{@api_url}"
|
82
96
|
UNAUTH
|
97
|
+
exit = 1
|
83
98
|
rescue
|
84
99
|
output << <<-ERR
|
85
100
|
Error: Could not connect to the server at #{@api_url}. More help is available after pointing
|
86
101
|
the client to a Razor server
|
87
102
|
ERR
|
103
|
+
exit = 1
|
88
104
|
end
|
89
|
-
output
|
105
|
+
[output, exit]
|
90
106
|
end
|
91
107
|
|
92
108
|
def show_version?
|
@@ -115,7 +131,7 @@ ERR
|
|
115
131
|
|
116
132
|
attr_reader :api_url, :args
|
117
133
|
# The format can be determined from later segments.
|
118
|
-
attr_accessor :format, :stripped_args
|
134
|
+
attr_accessor :format, :stripped_args, :ssl_ca_file
|
119
135
|
|
120
136
|
def initialize(args)
|
121
137
|
parse_and_set_api_url(ENV["RAZOR_API"] || DEFAULT_RAZOR_API, :env)
|
@@ -123,8 +139,18 @@ ERR
|
|
123
139
|
# To be populated externally.
|
124
140
|
@stripped_args = []
|
125
141
|
@format = 'short'
|
126
|
-
|
142
|
+
# If this is set, it should actually exist.
|
143
|
+
if ENV['RAZOR_CA_FILE'] && !File.exists?(ENV['RAZOR_CA_FILE'])
|
144
|
+
raise Razor::CLI::InvalidCAFileError.new(ENV['RAZOR_CA_FILE'])
|
145
|
+
end
|
146
|
+
ca_file = ENV["RAZOR_CA_FILE"]
|
147
|
+
@ssl_ca_file = ca_file if ca_file && File.exists?(ca_file)
|
127
148
|
@args = get_optparse.order(@args)
|
149
|
+
|
150
|
+
# Localhost won't match the server's certificate; no verification required.
|
151
|
+
# This needs to happen after get_optparse so `-k` and `-u` can take effect.
|
152
|
+
@verify_ssl ||= (@api_url.hostname != 'localhost')
|
153
|
+
|
128
154
|
@args = set_help_vars(@args)
|
129
155
|
if @args == ['version'] or @show_version
|
130
156
|
@show_version = true
|
data/lib/razor/cli/query.rb
CHANGED
@@ -20,7 +20,8 @@ class Razor::CLI::Query
|
|
20
20
|
query = doc.find {|coll| coll['name'] == nav}
|
21
21
|
params = (query && query['params']) || {}
|
22
22
|
elsif doc.is_a?(Hash)
|
23
|
-
params = (doc[nav] && doc[nav]
|
23
|
+
params = (doc[nav].is_a?(Hash) && doc[nav].has_key?('params') &&
|
24
|
+
doc[nav]['params'].is_a?(Hash) && doc[nav]['params']) || {}
|
24
25
|
end
|
25
26
|
@queryoptparse = OptionParser.new do |opts|
|
26
27
|
opts.on "-f", "--full", "Show full details when viewing entities" do
|
@@ -8,7 +8,7 @@ class Razor::CLI::TableFormat
|
|
8
8
|
headings = (column_overrides or get_headers(doc))
|
9
9
|
row do
|
10
10
|
headings.each do |header|
|
11
|
-
column(header, :width =>
|
11
|
+
column(header, :width => column_width!(headings, header, doc))
|
12
12
|
end
|
13
13
|
end
|
14
14
|
doc.each do |page|
|
@@ -23,12 +23,48 @@ class Razor::CLI::TableFormat
|
|
23
23
|
capture_output.strip
|
24
24
|
end
|
25
25
|
|
26
|
-
|
26
|
+
# This method has the side effect of modifying the remaining extra_width.
|
27
|
+
# It pulls everything together to come up with a single value for the column.
|
28
|
+
def column_width!(headings, header, doc)
|
29
|
+
content_width = content_width(header, doc)
|
30
|
+
average_width = average_width(headings)
|
31
|
+
# Is the column too wide and can we do anything about it?
|
32
|
+
if content_width > average_width && extra_width(headings, doc) > 0
|
33
|
+
# Determine how much room we'd need to make to accommodate the content.
|
34
|
+
remaining = content_width - average_width
|
35
|
+
# Add back in what we can.
|
36
|
+
width = average_width + [@extra_width, remaining].min
|
37
|
+
# The new width can't be negative.
|
38
|
+
@extra_width = [@extra_width - remaining, 0].max
|
39
|
+
width
|
40
|
+
else
|
41
|
+
[content_width, average_width].min
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# This calculates how much leeway would exist in all columns if we were to
|
46
|
+
# use an auto-sized fixed width for the whole table.
|
47
|
+
def extra_width(headings, doc)
|
48
|
+
@extra_width ||= headings.map do |header|
|
49
|
+
[average_width(headings) - content_width(header, doc), 0].max
|
50
|
+
end.inject(:+)
|
51
|
+
end
|
52
|
+
|
53
|
+
# This calculates what an auto-sized fixed-width table's column width would be.
|
54
|
+
def average_width(headings)
|
55
|
+
# The 3 here = 2 for width gap + 1 for the column separator.
|
56
|
+
# The 1 is for the last separator.
|
57
|
+
@average_width ||= (((`stty size | cut -d ' ' -f 2` || 80).to_i - (headings.count * 3) - 1) / headings.count)
|
58
|
+
end
|
59
|
+
|
60
|
+
def content_width(header, doc)
|
61
|
+
# Find longest item, including the header
|
27
62
|
(doc.map do |page|
|
28
63
|
(page[header] or '').to_s.length
|
29
64
|
end << header.to_s.length).max
|
30
65
|
end
|
31
66
|
|
67
|
+
# Traverse all headers to compile a unique list.
|
32
68
|
def get_headers(doc)
|
33
69
|
[].tap do |headers|
|
34
70
|
doc.map do |page|
|
data/lib/razor/cli/transforms.rb
CHANGED
@@ -33,6 +33,13 @@ module Razor::CLI
|
|
33
33
|
def name_if_present(obj)
|
34
34
|
obj ? obj['name'] : "---"
|
35
35
|
end
|
36
|
+
def name_or_whole(obj)
|
37
|
+
if obj
|
38
|
+
(obj['name'] ? obj['name'] : obj)
|
39
|
+
else
|
40
|
+
'---'
|
41
|
+
end
|
42
|
+
end
|
36
43
|
def count_column(hash)
|
37
44
|
hash['count']
|
38
45
|
end
|
@@ -44,7 +51,7 @@ module Razor::CLI
|
|
44
51
|
end
|
45
52
|
def event_msg(obj)
|
46
53
|
raise Razor::CLI::HideColumnError if obj['msg'].nil?
|
47
|
-
obj['msg'][0..50] + (
|
54
|
+
obj['msg'].to_s[0..50] + (obj['msg'].to_s.size > 50 ? '...' : '')
|
48
55
|
end
|
49
56
|
def full_event_msg(obj)
|
50
57
|
raise Razor::CLI::HideColumnError if obj['msg'].nil?
|
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 = '1.0.0'
|
22
22
|
|
23
23
|
if version == "DEVELOPMENT"
|
24
24
|
root = File.expand_path("../../..", File.dirname(__FILE__))
|
data/lib/razor/cli/views.yaml
CHANGED
@@ -16,7 +16,7 @@ collections:
|
|
16
16
|
+layout: table
|
17
17
|
+show:
|
18
18
|
name:
|
19
|
-
|
19
|
+
broker_type:
|
20
20
|
configuration:
|
21
21
|
+format: nested
|
22
22
|
policies:
|
@@ -26,7 +26,7 @@ collections:
|
|
26
26
|
+layout: list
|
27
27
|
+show:
|
28
28
|
name:
|
29
|
-
|
29
|
+
broker_type:
|
30
30
|
configuration:
|
31
31
|
policies:
|
32
32
|
+format: count_column
|
@@ -227,8 +227,21 @@ collections:
|
|
227
227
|
repo:
|
228
228
|
+format: name_hide_nil
|
229
229
|
command:
|
230
|
-
+format:
|
230
|
+
+format: name_or_whole
|
231
231
|
task:
|
232
232
|
+format: name_hide_nil
|
233
233
|
entry:
|
234
|
-
|
234
|
+
hooks:
|
235
|
+
+short:
|
236
|
+
+layout: table
|
237
|
+
+show:
|
238
|
+
name:
|
239
|
+
hook_type:
|
240
|
+
configuration:
|
241
|
+
+format: shallow_hash
|
242
|
+
member:
|
243
|
+
+short:
|
244
|
+
+show:
|
245
|
+
name:
|
246
|
+
hook_type:
|
247
|
+
configuration:
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
# Needed to make the client work on Ruby 1.8.7
|
3
|
+
unless Kernel.respond_to?(:require_relative)
|
4
|
+
module Kernel
|
5
|
+
def require_relative(path)
|
6
|
+
require File.join(File.dirname(caller[0]), path.to_str)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
require_relative '../spec_helper'
|
12
|
+
|
13
|
+
describe Razor::CLI::Command do
|
14
|
+
Command = Razor::CLI::Command
|
15
|
+
# let(:inst) { Class.new { include Razor::CLI::Command } }
|
16
|
+
|
17
|
+
let :existing_value do nil end
|
18
|
+
|
19
|
+
context "convert_arg" do
|
20
|
+
it "performs no conversion for 'json' reserved argument name" do
|
21
|
+
value = '/some/path'
|
22
|
+
cmd_schema = {'json' => {'type' => 'number', 'aliases' => ['b']}}
|
23
|
+
result = Command.convert_arg('json', value, existing_value, cmd_schema)
|
24
|
+
result.should == '/some/path'
|
25
|
+
end
|
26
|
+
|
27
|
+
[['number', '123', 123], ['array', '[1, 2]', [1, 2]], ['array', '1', [1]],
|
28
|
+
['object', '{"abc":123}', {'abc' => 123}], ['object', 'abc=123', {'abc' => '123'}]].
|
29
|
+
each do |type, orig, final|
|
30
|
+
it "finds the right datatype for #{type} #{orig}" do
|
31
|
+
cmd_schema = {"tags"=>{"type"=>"#{type}"}}
|
32
|
+
result = Command.convert_arg('tags', orig, existing_value, cmd_schema)
|
33
|
+
result.should == final
|
34
|
+
end
|
35
|
+
end
|
36
|
+
it "returns argument as-is when it cannot find the datatype" do
|
37
|
+
cmd_schema = {"tags"=>{}}
|
38
|
+
result = Command.convert_arg('tags', 'abc', existing_value, cmd_schema)
|
39
|
+
result.should == 'abc'
|
40
|
+
end
|
41
|
+
it "appends to existing values" do
|
42
|
+
cmd_schema = {"tags"=>{'type' => 'array'}}
|
43
|
+
existing_value = ['abc']
|
44
|
+
result = Command.convert_arg('tags', 'def', existing_value, cmd_schema)
|
45
|
+
result.should == %w(abc def)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "resolve_alias" do
|
50
|
+
it "resolves the alias when alias is present" do
|
51
|
+
cmd_schema = {'def' => {'type' => 'array', 'aliases' => ['abc']}}
|
52
|
+
result = Command.resolve_alias('abc', cmd_schema)
|
53
|
+
result.should == 'def'
|
54
|
+
end
|
55
|
+
it "leaves name alone when alias is present" do
|
56
|
+
cmd_schema = {'def' => {'type' => 'array', 'aliases' => ['abc']}}
|
57
|
+
result = Command.resolve_alias('ghi', cmd_schema)
|
58
|
+
result.should == 'ghi'
|
59
|
+
end
|
60
|
+
it "leaves name alone when no alias is present" do
|
61
|
+
cmd_schema = {'def' => {'type' => 'array'}}
|
62
|
+
result = Command.resolve_alias('abc', cmd_schema)
|
63
|
+
result.should == 'abc'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/spec/cli/navigate_spec.rb
CHANGED
@@ -148,7 +148,7 @@ describe Razor::CLI::Navigate do
|
|
148
148
|
end
|
149
149
|
|
150
150
|
context "with authentication", :vcr do
|
151
|
-
AuthArg = %w[-u http://fred:dead@localhost:
|
151
|
+
AuthArg = %w[-u http://fred:dead@localhost:8150/api].freeze
|
152
152
|
|
153
153
|
it "should supply that to the API service" do
|
154
154
|
nav = Razor::CLI::Parse.new(AuthArg).navigate
|
@@ -167,29 +167,29 @@ describe Razor::CLI::Navigate do
|
|
167
167
|
|
168
168
|
context "with query parameters", :vcr do
|
169
169
|
it "should append limit" do
|
170
|
-
nav = Razor::CLI::Parse.new(%w[-u http://fred:dead@localhost:
|
170
|
+
nav = Razor::CLI::Parse.new(%w[-u http://fred:dead@localhost:8150/api events --limit 1]).navigate
|
171
171
|
nav.get_document.should be_an_instance_of Hash
|
172
172
|
nav.last_url.to_s.should =~ /limit=1/
|
173
173
|
end
|
174
174
|
it "should append start" do
|
175
|
-
nav = Razor::CLI::Parse.new(%w[-u http://fred:dead@localhost:
|
175
|
+
nav = Razor::CLI::Parse.new(%w[-u http://fred:dead@localhost:8150/api events --start 1]).navigate
|
176
176
|
nav.get_document.should be_an_instance_of Hash
|
177
177
|
nav.last_url.to_s.should =~ /start=1/
|
178
178
|
end
|
179
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:
|
180
|
+
nav = Razor::CLI::Parse.new(%w[-u http://fred:dead@localhost:8150/api events --not-in-api 1]).navigate
|
181
181
|
expect {nav.get_document}.to raise_error(OptionParser::InvalidOption, 'invalid option: --not-in-api')
|
182
182
|
end
|
183
183
|
it "should not fail when query returns details for one item" do
|
184
184
|
nav = Razor::CLI::Parse.new(['register-node', '--installed', 'true', '--hw-info', 'net0=78:31:c1:be:c8:00']).navigate.get_document
|
185
185
|
name = nav['name']
|
186
|
-
nav = Razor::CLI::Parse.new(['-u', 'http://fred:dead@localhost:
|
186
|
+
nav = Razor::CLI::Parse.new(['-u', 'http://fred:dead@localhost:8150/api', 'nodes', name]).navigate
|
187
187
|
nav.get_document['name'].should == name
|
188
188
|
end
|
189
189
|
it "should throw an error if the query parameter is not in the API from a single item" do
|
190
190
|
nav = Razor::CLI::Parse.new(['register-node', '--installed', 'true', '--hw-info', 'net0=78:31:c1:be:c8:00']).navigate.get_document
|
191
191
|
name = nav['name']
|
192
|
-
expect {Razor::CLI::Parse.new(['-u', 'http://fred:dead@localhost:
|
192
|
+
expect {Razor::CLI::Parse.new(['-u', 'http://fred:dead@localhost:8150/api', 'nodes', name, '--limit', '1']).
|
193
193
|
navigate.get_document}.to raise_error(OptionParser::InvalidOption, 'invalid option: --limit')
|
194
194
|
end
|
195
195
|
it "should store query without query parameters" do
|
@@ -197,7 +197,7 @@ describe Razor::CLI::Navigate do
|
|
197
197
|
navigate.get_document['name']
|
198
198
|
Razor::CLI::Parse.new(['register-node', '--installed', 'true', '--hw-info', 'net0=78:31:c1:be:c8:01']).
|
199
199
|
navigate.get_document
|
200
|
-
parse = Razor::CLI::Parse.new(['-u', 'http://fred:dead@localhost:
|
200
|
+
parse = Razor::CLI::Parse.new(['-u', 'http://fred:dead@localhost:8150/api', 'nodes', name, 'log', '--limit', '1'])
|
201
201
|
parse.navigate.get_document
|
202
202
|
parse.stripped_args.should == ['nodes', name, 'log']
|
203
203
|
end
|