razor-client 1.3.0 → 1.6.1
Sign up to get free protection for your applications and to get access to all the features.
- data/NEWS.md +5 -0
- data/bin/razor +23 -15
- data/lib/razor/cli.rb +7 -7
- data/lib/razor/cli/command.rb +16 -13
- data/lib/razor/cli/format.rb +16 -16
- data/lib/razor/cli/navigate.rb +13 -6
- data/lib/razor/cli/parse.rb +24 -22
- data/lib/razor/cli/query.rb +2 -2
- data/lib/razor/cli/transforms.rb +9 -6
- data/lib/razor/cli/version.rb +1 -1
- data/locales/config.yaml +24 -0
- data/locales/razor-client.pot +268 -0
- data/spec/cli/navigate_spec.rb +19 -0
- data/spec/fixtures/vcr/Razor_CLI_Navigate/accept-language_header/should_allow_other_accept-language_headers.yml +38 -0
- data/spec/fixtures/vcr/Razor_CLI_Navigate/accept-language_header/should_set_the_accept-language_header.yml +38 -0
- data/spec/locales/config.yaml +24 -0
- data/spec/spec_helper.rb +3 -0
- metadata +27 -3
data/NEWS.md
CHANGED
data/bin/razor
CHANGED
@@ -10,12 +10,16 @@ unless Kernel.respond_to?(:require_relative)
|
|
10
10
|
end
|
11
11
|
|
12
12
|
require 'rubygems'
|
13
|
+
require 'gettext-setup'
|
13
14
|
require_relative "../lib/razor/cli"
|
14
15
|
|
16
|
+
GettextSetup.initialize(File.absolute_path('locales', File.dirname(File.dirname(__FILE__))))
|
17
|
+
FastGettext.locale = GettextSetup.negotiate_locale(GettextSetup.candidate_locales)
|
18
|
+
|
15
19
|
include Razor::CLI::Format
|
16
20
|
|
17
21
|
def die(message = nil)
|
18
|
-
puts "Error:
|
22
|
+
puts _("Error: %{error}") % {error: message} if message
|
19
23
|
exit 1
|
20
24
|
end
|
21
25
|
|
@@ -24,7 +28,7 @@ begin
|
|
24
28
|
rescue Razor::CLI::InvalidURIError => e
|
25
29
|
die e.message
|
26
30
|
rescue OptionParser::InvalidOption => e
|
27
|
-
die
|
31
|
+
die _("%{error}\nTry 'razor --help' for more information") % {error: e.message}
|
28
32
|
end
|
29
33
|
|
30
34
|
if parse.show_version?
|
@@ -40,14 +44,13 @@ if parse.show_help? and not parse.show_command_help?
|
|
40
44
|
end
|
41
45
|
|
42
46
|
def unexpected_error(e)
|
43
|
-
die <<-ERROR
|
47
|
+
die _(<<-ERROR) % {backtrace: e.backtrace.take(10).join("\n"), error: e}
|
44
48
|
An unexpected error has occurred.
|
45
49
|
|
46
50
|
Backtrace:
|
47
|
-
|
48
|
-
')}
|
51
|
+
%{backtrace}
|
49
52
|
|
50
|
-
Error:
|
53
|
+
Error: %{error}
|
51
54
|
|
52
55
|
Please inspect server logs for the cause, then report issue to:
|
53
56
|
https://tickets.puppetlabs.com/browse/RAZOR
|
@@ -58,22 +61,27 @@ end
|
|
58
61
|
begin
|
59
62
|
document = parse.navigate.get_document
|
60
63
|
url = parse.navigate.last_url
|
61
|
-
|
64
|
+
result = format_document document, parse
|
65
|
+
# TRANSLATORS: This is a template for all results that the client outputs.
|
66
|
+
puts _("From %{url}:\n\n%{result}\n\n") % {url: url, result: result}
|
62
67
|
rescue OptionParser::InvalidOption => e
|
63
|
-
#
|
64
|
-
die
|
68
|
+
# TRANSLATORS: This occurs when invalid flags are passed in the navigation.
|
69
|
+
die _("%{error}\nTry 'razor --help' for more information") %
|
70
|
+
{error: e.message}
|
65
71
|
rescue SocketError, Errno::ECONNREFUSED => e
|
66
|
-
puts "Error: Could not connect to the server at
|
67
|
-
|
72
|
+
puts _("Error: Could not connect to the server at %{url}\n" +
|
73
|
+
" %{error}") % {url: parse.api_url, error: e}
|
68
74
|
die
|
69
75
|
rescue RestClient::SSLCertificateNotVerified
|
70
|
-
puts "Error: SSL certificate could not be verified against known CA
|
71
|
-
|
76
|
+
puts _("Error: SSL certificate could not be verified against known CA " +
|
77
|
+
"certificates.\n To turn off verification, use the -k or --insecure option.")
|
72
78
|
die
|
73
79
|
rescue RestClient::Exception => e
|
74
80
|
r = e.response
|
75
81
|
unexpected_error(e) if r.nil?
|
76
|
-
|
82
|
+
request_type = r.args[:method].to_s.upcase
|
83
|
+
url = r.args[:url]
|
84
|
+
puts _("Error from doing %{request_type} %{url}") % {request_type: request_type, url: url}
|
77
85
|
puts e.message
|
78
86
|
begin
|
79
87
|
body = MultiJson::load(r.body)
|
@@ -88,5 +96,5 @@ rescue RestClient::Exception => e
|
|
88
96
|
end
|
89
97
|
die
|
90
98
|
rescue StandardError => e
|
91
|
-
die "
|
99
|
+
die _("%{error}\nTry 'razor --help' for more information\n\n") % {error: e.message}
|
92
100
|
end
|
data/lib/razor/cli.rb
CHANGED
@@ -6,9 +6,9 @@ module Razor
|
|
6
6
|
def initialize(url, key, doc)
|
7
7
|
@key = key; @doc = doc
|
8
8
|
if key.is_a?(Array)
|
9
|
-
super "Could not navigate to '
|
9
|
+
super _("Could not navigate to '%{path}' from %{url}") % {path: key.join(" "), url: url}
|
10
10
|
else
|
11
|
-
super "Could not find entry '
|
11
|
+
super _("Could not find entry '%{key}' in document at %{url}") % {key: key, url: url}
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -17,24 +17,24 @@ module Razor
|
|
17
17
|
def initialize(url, type)
|
18
18
|
case type
|
19
19
|
when :env
|
20
|
-
super "URL '
|
20
|
+
super _("URL '%{url}' in ENV variable RAZOR_API is not valid") % {url: url}
|
21
21
|
when :opts
|
22
|
-
super "URL '
|
22
|
+
super _("URL '%{url}' provided by -u or --url is not valid") % {url: url}
|
23
23
|
else
|
24
|
-
super "URL '
|
24
|
+
super _("URL '%{url}' is not valid") % {url: url}
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
29
|
class InvalidCAFileError < Error
|
30
30
|
def initialize(path)
|
31
|
-
super "CA file '
|
31
|
+
super _("CA file '%{path}' in ENV variable RAZOR_CA_FILE does not exist") % {path: path}
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
35
|
class VersionCompatibilityError < Error
|
36
36
|
def initialize(reason)
|
37
|
-
super "Server version is not compatible with client version:
|
37
|
+
super _("Server version is not compatible with client version: %{reason}") % {reason: reason}
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
data/lib/razor/cli/command.rb
CHANGED
@@ -16,7 +16,7 @@ class Razor::CLI::Command
|
|
16
16
|
else
|
17
17
|
if body.empty?
|
18
18
|
raise Razor::CLI::Error,
|
19
|
-
"No arguments for command (did you forget --json ?)"
|
19
|
+
_("No arguments for command (did you forget --json ?)")
|
20
20
|
end
|
21
21
|
result = @navigate.json_post(@cmd_url, body)
|
22
22
|
# Get actual object from the id.
|
@@ -41,11 +41,11 @@ class Razor::CLI::Command
|
|
41
41
|
elsif argument =~ /\A-([a-z-]{2,})(=(.+))?\Z/ and
|
42
42
|
@cmd_schema[self.class.resolve_alias($1, @cmd_schema)]
|
43
43
|
# Short form, should be long; offer suggestion
|
44
|
-
raise ArgumentError, "Unexpected argument
|
44
|
+
raise ArgumentError, _("Unexpected argument %{argument} (did you mean %{suggestion}?)") % {argument: argument, suggestion: "--#{$1}"}
|
45
45
|
elsif argument =~ /\A--([a-z])(=(.+))?\Z/ and
|
46
46
|
@cmd_schema[self.class.resolve_alias($1, @cmd_schema)]
|
47
47
|
# Long form, should be short; offer suggestion
|
48
|
-
raise ArgumentError, "Unexpected argument
|
48
|
+
raise ArgumentError, _("Unexpected argument %{argument} (did you mean %{suggestion}?)") % {argument: argument, suggestion: "-#{$1}"}
|
49
49
|
else
|
50
50
|
# This may be a positional argument.
|
51
51
|
arg_name = positional_argument(@cmd_schema, pos_index)
|
@@ -53,7 +53,7 @@ class Razor::CLI::Command
|
|
53
53
|
body[arg_name] = self.class.convert_arg(arg_name, argument, body[arg_name], @cmd_schema)
|
54
54
|
pos_index += 1
|
55
55
|
else
|
56
|
-
raise ArgumentError, "Unexpected argument
|
56
|
+
raise ArgumentError, _("Unexpected argument %{argument}") % {argument: argument}
|
57
57
|
end
|
58
58
|
end
|
59
59
|
end
|
@@ -61,12 +61,12 @@ class Razor::CLI::Command
|
|
61
61
|
begin
|
62
62
|
body = MultiJson::load(File::read(body["json"])) if body["json"]
|
63
63
|
rescue MultiJson::LoadError
|
64
|
-
raise Razor::CLI::Error, "File
|
64
|
+
raise Razor::CLI::Error, _("File %{path} is not valid JSON") % {path: body['json']}
|
65
65
|
rescue Errno::ENOENT
|
66
|
-
raise Razor::CLI::Error, "File
|
66
|
+
raise Razor::CLI::Error, _("File %{path} not found") % {path: body['json']}
|
67
67
|
rescue Errno::EACCES
|
68
68
|
raise Razor::CLI::Error,
|
69
|
-
"Permission to read file
|
69
|
+
_("Permission to read file %{path} denied") % {path: body['json']}
|
70
70
|
end
|
71
71
|
body
|
72
72
|
end
|
@@ -99,7 +99,8 @@ class Razor::CLI::Command
|
|
99
99
|
argument_type = arg_type(arg_name, cmd_schema)
|
100
100
|
|
101
101
|
# This might be helpful, since there's no other method for debug-level logging on the client.
|
102
|
-
puts "Formatting argument
|
102
|
+
puts _("Formatting argument %{argument_name} with value %{value} as %{argument_type}\n") %
|
103
|
+
{argument_name: arg_name, value: value, argument_type: argument_type} if @dump_response
|
103
104
|
|
104
105
|
case argument_type
|
105
106
|
when "array"
|
@@ -117,12 +118,13 @@ class Razor::CLI::Command
|
|
117
118
|
existing_value.merge($1 => $2)
|
118
119
|
else
|
119
120
|
MultiJson::load(value).tap do |value|
|
120
|
-
value.is_a?(Hash) or raise ArgumentError, "Invalid object for argument '
|
121
|
+
value.is_a?(Hash) or raise ArgumentError, _("Invalid object for argument '%{argument_name}'") % {argument_name: arg_name}
|
121
122
|
existing_value.merge(value)
|
122
123
|
end
|
123
124
|
end
|
124
125
|
rescue MultiJson::LoadError => error
|
125
|
-
raise ArgumentError, "Invalid object for argument '
|
126
|
+
raise ArgumentError, _("Invalid object for argument '%{argument_name}': %{error}") %
|
127
|
+
{argument_name: arg_name, error: error.message}
|
126
128
|
end
|
127
129
|
when "boolean"
|
128
130
|
["true", nil].include?(value)
|
@@ -130,15 +132,16 @@ class Razor::CLI::Command
|
|
130
132
|
begin
|
131
133
|
Integer(value)
|
132
134
|
rescue ArgumentError
|
133
|
-
raise ArgumentError, "Invalid integer for argument '
|
135
|
+
raise ArgumentError, _("Invalid integer for argument '%{arg_name}': %{value}") % {argument_name: arg_name, value: value}
|
134
136
|
end
|
135
137
|
when "null"
|
136
|
-
raise ArgumentError, "Expected nothing for argument '
|
138
|
+
raise ArgumentError, _("Expected nothing for argument '%{arg_name}', but was: '%{value}'") %
|
139
|
+
{argument_name: arg_name, value: value} unless value.nil?
|
137
140
|
nil
|
138
141
|
when "string", nil # `nil` for 'might be an alias, send as-is'
|
139
142
|
value
|
140
143
|
else
|
141
|
-
raise Razor::CLI::Error, "Unexpected datatype '
|
144
|
+
raise Razor::CLI::Error, _("Unexpected datatype '%{argument_type}' for argument %{argument_name}") % {argument_type: argument_type, argument_name: arg_name}
|
142
145
|
end
|
143
146
|
end
|
144
147
|
|
data/lib/razor/cli/format.rb
CHANGED
@@ -23,7 +23,7 @@ module Razor::CLI
|
|
23
23
|
arguments = parse && parse.stripped_args
|
24
24
|
doc = Razor::CLI::Document.new(doc, format)
|
25
25
|
|
26
|
-
return "There are no items for this query." if doc.items.empty?
|
26
|
+
return _("There are no items for this query.") if doc.items.empty?
|
27
27
|
return format_command_help(doc, parse.show_api_help?) if parse && parse.show_command_help?
|
28
28
|
|
29
29
|
case (doc.format_view['+layout'] or 'list')
|
@@ -36,7 +36,7 @@ module Razor::CLI
|
|
36
36
|
else doc.to_s
|
37
37
|
end
|
38
38
|
else
|
39
|
-
raise ArgumentError, "Unrecognized view format
|
39
|
+
raise ArgumentError, _("Unrecognized view format %{format_name}") % {format_name: doc.format_view['+layout']}
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
@@ -64,7 +64,7 @@ module Razor::CLI
|
|
64
64
|
|
65
65
|
def format_command_help(doc, show_api_help)
|
66
66
|
item = doc.items.first
|
67
|
-
raise Razor::CLI::Error, 'Could not find help for that entry' unless item.has_key?('help')
|
67
|
+
raise Razor::CLI::Error, _('Could not find help for that entry') unless item.has_key?('help')
|
68
68
|
if item['help'].has_key?('examples')
|
69
69
|
if show_api_help && item['help']['examples'].has_key?('api')
|
70
70
|
format_composed_help(item, item['help']['examples']['api']).chomp
|
@@ -85,31 +85,31 @@ module Razor::CLI
|
|
85
85
|
def format_composed_help(object, examples = object['help']['examples']['cli'])
|
86
86
|
help_obj = object['help']
|
87
87
|
ret = ''
|
88
|
-
ret = ret + <<-USAGE
|
88
|
+
ret = ret + _(<<-USAGE) % {command: object['name'], arguments: positional_args_usage(object)}
|
89
89
|
# USAGE
|
90
90
|
|
91
|
-
razor
|
91
|
+
razor %{command} %{arguments} <flags>
|
92
92
|
|
93
93
|
USAGE
|
94
|
-
ret = ret + <<-SYNOPSIS if help_obj.has_key?('summary')
|
94
|
+
ret = ret + _(<<-SYNOPSIS) % {summary: help_obj['summary']} if help_obj.has_key?('summary')
|
95
95
|
# SYNOPSIS
|
96
|
-
|
96
|
+
%{summary}
|
97
97
|
|
98
98
|
SYNOPSIS
|
99
|
-
ret = ret + <<-DESCRIPTION if help_obj.has_key?('description')
|
99
|
+
ret = ret + _(<<-DESCRIPTION) % {description: help_obj['description'], schema: help_obj['schema']} if help_obj.has_key?('description')
|
100
100
|
# DESCRIPTION
|
101
|
-
|
101
|
+
%{description}
|
102
102
|
|
103
|
-
|
103
|
+
%{schema}
|
104
104
|
DESCRIPTION
|
105
|
-
ret = ret + <<-RETURNS if help_obj.has_key?('returns')
|
105
|
+
ret = ret + _(<<-RETURNS) % {returns: help_obj['returns'].gsub(/^/, ' ')} if help_obj.has_key?('returns')
|
106
106
|
# RETURNS
|
107
|
-
|
107
|
+
%{returns}
|
108
108
|
RETURNS
|
109
|
-
ret = ret + <<-EXAMPLES if examples
|
109
|
+
ret = ret + _(<<-EXAMPLES) % {examples: examples.gsub(/^/, ' ')} if examples
|
110
110
|
# EXAMPLES
|
111
111
|
|
112
|
-
|
112
|
+
%{examples}
|
113
113
|
EXAMPLES
|
114
114
|
ret
|
115
115
|
end
|
@@ -160,7 +160,7 @@ module Razor::CLI
|
|
160
160
|
""
|
161
161
|
elsif doc.is_list? and objects.all? { |it| it.is_a?(Hash) && it.has_key?('name')}
|
162
162
|
# If every element has the 'name' key, it has nested elements.
|
163
|
-
"\n\nQuery an entry by including its name, e.g. `razor
|
163
|
+
_("\n\nQuery an entry by including its name, e.g. `razor %{arguments} %{name}`") % {arguments: arguments.join(' '), name: objects.first['name']}
|
164
164
|
elsif objects.any?
|
165
165
|
object = objects.first
|
166
166
|
fields = display_fields(object) - PriorityKeys
|
@@ -168,7 +168,7 @@ module Razor::CLI
|
|
168
168
|
object[f].is_a?(Hash) or object[f].is_a?(Array)
|
169
169
|
end.sort
|
170
170
|
if list.any?
|
171
|
-
"\n\nQuery additional details via: `razor
|
171
|
+
_("\n\nQuery additional details via: `razor %{arguments} [%{options}]`") % {arguments: arguments.join(' '), options: list.join(', ')}
|
172
172
|
end
|
173
173
|
end
|
174
174
|
end
|
data/lib/razor/cli/navigate.rb
CHANGED
@@ -48,7 +48,8 @@ module Razor::CLI
|
|
48
48
|
@segments = segments||[]
|
49
49
|
@doc = entrypoint
|
50
50
|
@username, @password = parse.api_url.userinfo.to_s.split(':')
|
51
|
-
@doc_resource = create_resource parse.api_url, {:accept => :json
|
51
|
+
@doc_resource = create_resource parse.api_url, {:accept => :json,
|
52
|
+
:accept_language => accept_language}
|
52
53
|
end
|
53
54
|
|
54
55
|
attr_accessor :doc_resource
|
@@ -70,7 +71,7 @@ module Razor::CLI
|
|
70
71
|
end
|
71
72
|
|
72
73
|
def server_version
|
73
|
-
entrypoint.has_key?('version') and entrypoint['version']['server'] or 'Unknown'
|
74
|
+
entrypoint.has_key?('version') and entrypoint['version']['server'] or _('Unknown')
|
74
75
|
end
|
75
76
|
|
76
77
|
def query?
|
@@ -144,6 +145,10 @@ module Razor::CLI
|
|
144
145
|
end
|
145
146
|
end
|
146
147
|
|
148
|
+
def accept_language
|
149
|
+
@accept_language ||= GettextSetup.candidate_locales
|
150
|
+
end
|
151
|
+
|
147
152
|
def get(url, headers={})
|
148
153
|
resource = create_resource(url, headers)
|
149
154
|
response = resource.get
|
@@ -156,22 +161,24 @@ module Razor::CLI
|
|
156
161
|
url.query = URI.encode_www_form(params)
|
157
162
|
url.query = nil if url.query.empty? # Remove dangling '?' from URL.
|
158
163
|
|
159
|
-
response = get(url,headers.merge(:accept => :json
|
164
|
+
response = get(url,headers.merge(:accept => :json,
|
165
|
+
:accept_language => accept_language))
|
160
166
|
unless response.headers[:content_type] =~ /application\/json/
|
161
|
-
raise "Received content type
|
167
|
+
raise _("Received content type %{content_type}") % {content_type: response.headers[:content_type]}
|
162
168
|
end
|
163
169
|
MultiJson.load(response.body)
|
164
170
|
end
|
165
171
|
|
166
172
|
def json_post(url, body)
|
167
|
-
headers = {
|
173
|
+
headers = { :accept=>:json, "Content-Type" => :json,
|
174
|
+
:accept_language => accept_language}
|
168
175
|
begin
|
169
176
|
resource = create_resource(url, headers)
|
170
177
|
response = resource.post MultiJson::dump(body)
|
171
178
|
ensure
|
172
179
|
if @parse.dump_response?
|
173
180
|
print "POST #{url.to_s}\n#{body}\n-->\n"
|
174
|
-
puts (response ? response.body : "ERROR")
|
181
|
+
puts (response ? response.body : _("ERROR"))
|
175
182
|
end
|
176
183
|
end
|
177
184
|
MultiJson::load(response.body)
|
data/lib/razor/cli/parse.rb
CHANGED
@@ -22,32 +22,32 @@ module Razor::CLI
|
|
22
22
|
|
23
23
|
def get_optparse
|
24
24
|
@optparse ||= OptionParser.new do |opts|
|
25
|
-
opts.banner = "Usage: razor [FLAGS] NAVIGATION\n"
|
25
|
+
opts.banner = _("Usage: razor [FLAGS] NAVIGATION\n")
|
26
26
|
|
27
|
-
opts.on "-d", "--dump", "Dumps API output to the screen" do
|
27
|
+
opts.on "-d", "--dump", _("Dumps API output to the screen") do
|
28
28
|
@dump = true
|
29
29
|
end
|
30
30
|
|
31
|
-
opts.on "-a", "--api", "Show API help for a command" do
|
31
|
+
opts.on "-a", "--api", _("Show API help for a command") do
|
32
32
|
@api_help = true
|
33
33
|
end
|
34
34
|
|
35
|
-
opts.on "-k", "--insecure", "Allow SSL connections without verified certificates" do
|
35
|
+
opts.on "-k", "--insecure", _("Allow SSL connections without verified certificates") do
|
36
36
|
@verify_ssl = false
|
37
37
|
end
|
38
38
|
|
39
39
|
opts.on "-u", "--url URL",
|
40
|
-
"The full Razor API URL, can also be set\n" + " "*37 +
|
40
|
+
_("The full Razor API URL, can also be set\n" + " "*37 +
|
41
41
|
"with the RAZOR_API environment variable\n" + " "*37 +
|
42
|
-
"(default
|
42
|
+
"(default %{default_api})") % {default_api: DEFAULT_RAZOR_API} do |url|
|
43
43
|
parse_and_set_api_url(url, :opts)
|
44
44
|
end
|
45
45
|
|
46
|
-
opts.on "-v", "--version", "Show the version of Razor" do
|
46
|
+
opts.on "-v", "--version", _("Show the version of Razor") do
|
47
47
|
@show_version = true
|
48
48
|
end
|
49
49
|
|
50
|
-
opts.on "-h", "--help", "Show this screen" do
|
50
|
+
opts.on "-h", "--help", _("Show this screen") do
|
51
51
|
# If searching for a command's help, leave the argument for navigation.
|
52
52
|
@option_help = true
|
53
53
|
end
|
@@ -68,11 +68,11 @@ module Razor::CLI
|
|
68
68
|
begin
|
69
69
|
server_version = navigate.server_version
|
70
70
|
rescue RestClient::Unauthorized
|
71
|
-
error = "Error: Credentials are required to connect to the server at
|
71
|
+
error = _("Error: Credentials are required to connect to the server at %{url}.") % {url: @api_url}
|
72
72
|
rescue
|
73
|
-
error = "Error: Could not connect to the server at
|
73
|
+
error = _("Error: Could not connect to the server at %{url}.") % {url: @api_url}
|
74
74
|
ensure
|
75
|
-
return [(<<-OUTPUT + "\n" + error).rstrip, error != '' ? 1 : 0]
|
75
|
+
return [(_(<<-OUTPUT) % {server_version: server_version, client_version: Razor::CLI::VERSION} + "\n" + error).rstrip, error != '' ? 1 : 0]
|
76
76
|
Razor Server version: #{server_version}
|
77
77
|
Razor Client version: #{Razor::CLI::VERSION}
|
78
78
|
OUTPUT
|
@@ -83,13 +83,15 @@ module Razor::CLI
|
|
83
83
|
output = get_optparse.to_s
|
84
84
|
exit = 0
|
85
85
|
begin
|
86
|
-
|
87
|
-
|
86
|
+
replacements = {collections: list_things(_("Collections"), navigate.collections),
|
87
|
+
commands: list_things(_("Commands"), navigate.commands)}
|
88
|
+
output << _(<<-HELP) % replacements
|
89
|
+
%{collections}
|
88
90
|
|
89
91
|
Navigate to entries of a collection using COLLECTION NAME, for example,
|
90
92
|
'nodes node15' for the details of a node or 'nodes node15 log' to see
|
91
93
|
the log for node15
|
92
|
-
|
94
|
+
%{commands}
|
93
95
|
|
94
96
|
Pass arguments to commands either directly by name ('--name=NAME')
|
95
97
|
or save the JSON body for the command in a file and pass it with
|
@@ -98,26 +100,26 @@ module Razor::CLI
|
|
98
100
|
|
99
101
|
HELP
|
100
102
|
rescue RestClient::Unauthorized
|
101
|
-
output << <<-UNAUTH
|
102
|
-
Error: Credentials are required to connect to the server at
|
103
|
+
output << _(<<-UNAUTH) % {url: @api_url}
|
104
|
+
Error: Credentials are required to connect to the server at %{url}"
|
103
105
|
UNAUTH
|
104
106
|
exit = 1
|
105
107
|
rescue SocketError, Errno::ECONNREFUSED => e
|
106
|
-
puts "Error: Could not connect to the server at
|
108
|
+
puts _("Error: Could not connect to the server at %{url}") % {url: @api_url}
|
107
109
|
puts " #{e}\n"
|
108
110
|
die
|
109
111
|
rescue RestClient::SSLCertificateNotVerified
|
110
|
-
puts "Error: SSL certificate could not be verified against known CA certificates
|
111
|
-
|
112
|
+
puts _("Error: SSL certificate could not be verified against known CA certificates.\n" +
|
113
|
+
" To turn off verification, use the -k or --insecure option.")
|
112
114
|
die
|
113
115
|
rescue OpenSSL::SSL::SSLError => e
|
114
116
|
# Occurs in case of e.g. certificate mismatch (FQDN vs. hostname)
|
115
|
-
puts "Error: SSL certificate error from server at
|
117
|
+
puts _("Error: SSL certificate error from server at %{url}") % {url: @api_url}
|
116
118
|
puts " #{e}"
|
117
119
|
die
|
118
120
|
rescue => e
|
119
|
-
output << <<-ERR
|
120
|
-
Error: Unknown error occurred while connecting to server at
|
121
|
+
output << _(<<-ERR) % {url: @api_url}
|
122
|
+
Error: Unknown error occurred while connecting to server at %{url}:
|
121
123
|
#{e}
|
122
124
|
ERR
|
123
125
|
exit = 1
|
data/lib/razor/cli/query.rb
CHANGED
@@ -24,11 +24,11 @@ class Razor::CLI::Query
|
|
24
24
|
doc[nav]['params'].is_a?(Hash) && doc[nav]['params']) || {}
|
25
25
|
end
|
26
26
|
@queryoptparse = OptionParser.new do |opts|
|
27
|
-
opts.on "-f", "--full", "Show full details when viewing entities" do
|
27
|
+
opts.on "-f", "--full", _("Show full details when viewing entities") do
|
28
28
|
@parse.format = 'full'
|
29
29
|
end
|
30
30
|
|
31
|
-
opts.on "-s", "--short", "Show shortened details when viewing entities" do
|
31
|
+
opts.on "-s", "--short", _("Show shortened details when viewing entities") do
|
32
32
|
@parse.format = 'short'
|
33
33
|
end
|
34
34
|
|
data/lib/razor/cli/transforms.rb
CHANGED
@@ -8,13 +8,13 @@ module Razor::CLI
|
|
8
8
|
obj.nil? ? "---" : obj
|
9
9
|
end
|
10
10
|
def join_names(arr)
|
11
|
-
(arr.nil? or arr.empty?) ? '(none)' : arr.map { |item| item['name'] }.join(", ")
|
11
|
+
(arr.nil? or arr.empty?) ? _('(none)') : arr.map { |item| item['name'] }.join(", ")
|
12
12
|
end
|
13
13
|
def nested(nested_obj)
|
14
|
-
(nested_obj.nil? or nested_obj.empty?) ? '(none)' : nested_obj.to_s
|
14
|
+
(nested_obj.nil? or nested_obj.empty?) ? _('(none)') : nested_obj.to_s
|
15
15
|
end
|
16
16
|
def shallow_hash(hash)
|
17
|
-
(hash.nil? or hash.empty?) ? '(none)' :
|
17
|
+
(hash.nil? or hash.empty?) ? _('(none)') :
|
18
18
|
hash.map {|key, val| "#{key}: #{val}"}.join(', ')
|
19
19
|
end
|
20
20
|
def select_name(item)
|
@@ -59,14 +59,17 @@ module Razor::CLI
|
|
59
59
|
end
|
60
60
|
def event_entities(hash)
|
61
61
|
hash ||= {}
|
62
|
-
|
62
|
+
fields = ['task', 'policy', 'broker', 'repo', 'node', 'command']
|
63
|
+
shallow_hash(Hash[hash].keep_if {|k,_| fields.include?(k)})
|
63
64
|
end
|
64
65
|
def event_misc(hash)
|
65
66
|
hash ||= {}
|
66
|
-
|
67
|
+
fields = ['task', 'policy', 'broker', 'repo', 'node', 'msg', 'command']
|
68
|
+
shallow_hash(Hash[hash].delete_if {|k,_| fields.include?(k)})
|
67
69
|
end
|
68
70
|
def node_log_entry(hash)
|
69
|
-
|
71
|
+
fields = ['event', 'timestamp', 'severity']
|
72
|
+
shallow_hash(Hash[hash].delete_if {|k,_| fields.include?(k)})
|
70
73
|
end
|
71
74
|
end
|
72
75
|
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 = '1.
|
21
|
+
version = '1.6.1'
|
22
22
|
|
23
23
|
if version == "DEVELOPMENT"
|
24
24
|
root = File.expand_path("../../..", File.dirname(__FILE__))
|
data/locales/config.yaml
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
---
|
2
|
+
# This is the project-specific configuration file for setting up
|
3
|
+
# fast_gettext for your project.
|
4
|
+
gettext:
|
5
|
+
# This is used for the name of the .pot and .po files; they will be
|
6
|
+
# called <project_name>.pot?
|
7
|
+
project_name: 'razor-client'
|
8
|
+
# This is used in comments in the .pot and .po files to indicate what
|
9
|
+
# project the files belong to and should be a little more descriptive than
|
10
|
+
# <project_name>
|
11
|
+
package_name: Razor Client
|
12
|
+
# The locale that the default messages in the .pot file are in
|
13
|
+
default_locale: en
|
14
|
+
# The email used for sending bug reports.
|
15
|
+
bugs_address: docs@puppet.com
|
16
|
+
# The holder of the copyright.
|
17
|
+
copyright_holder: Puppet Inc.
|
18
|
+
# This determines which comments in code should be eligible for translation.
|
19
|
+
comments_tag: TRANSLATORS
|
20
|
+
# Patterns for +Dir.glob+ used to find all files that might contain
|
21
|
+
# translatable content, relative to the project root directory
|
22
|
+
source_files:
|
23
|
+
- 'lib/**/*.rb'
|
24
|
+
- 'bin/razor'
|
@@ -0,0 +1,268 @@
|
|
1
|
+
# SOME DESCRIPTIVE TITLE.
|
2
|
+
# Copyright (C) 2017 Puppet, LLC.
|
3
|
+
# This file is distributed under the same license as the Razor Client package.
|
4
|
+
# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
|
5
|
+
#
|
6
|
+
#, fuzzy
|
7
|
+
msgid ""
|
8
|
+
msgstr ""
|
9
|
+
"Project-Id-Version: Razor Client 1.3.0-3-ga296fc7\n"
|
10
|
+
"\n"
|
11
|
+
"Report-Msgid-Bugs-To: docs@puppet.com\n"
|
12
|
+
"POT-Creation-Date: 2017-01-12 03:03-0600\n"
|
13
|
+
"PO-Revision-Date: 2017-01-12 03:03-0600\n"
|
14
|
+
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
15
|
+
"Language-Team: LANGUAGE <LL@li.org>\n"
|
16
|
+
"Language: \n"
|
17
|
+
"MIME-Version: 1.0\n"
|
18
|
+
"Content-Type: text/plain; charset=UTF-8\n"
|
19
|
+
"Content-Transfer-Encoding: 8bit\n"
|
20
|
+
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
|
21
|
+
|
22
|
+
msgid "Error: %{error}"
|
23
|
+
msgstr ""
|
24
|
+
|
25
|
+
#. TRANSLATORS: This occurs when invalid flags are passed in the navigation.
|
26
|
+
msgid ""
|
27
|
+
"%{error}\n"
|
28
|
+
"Try 'razor --help' for more information"
|
29
|
+
msgstr ""
|
30
|
+
|
31
|
+
msgid ""
|
32
|
+
"An unexpected error has occurred.\n"
|
33
|
+
"\n"
|
34
|
+
"Backtrace:\n"
|
35
|
+
" %{backtrace}\n"
|
36
|
+
"\n"
|
37
|
+
"Error: %{error}\n"
|
38
|
+
"\n"
|
39
|
+
"Please inspect server logs for the cause, then report issue to:\n"
|
40
|
+
"https://tickets.puppetlabs.com/browse/RAZOR\n"
|
41
|
+
"\n"
|
42
|
+
msgstr ""
|
43
|
+
|
44
|
+
#. TRANSLATORS: This is a template for all results that the client outputs.
|
45
|
+
msgid ""
|
46
|
+
"From %{url}:\n"
|
47
|
+
"\n"
|
48
|
+
"%{result}\n"
|
49
|
+
"\n"
|
50
|
+
msgstr ""
|
51
|
+
|
52
|
+
msgid ""
|
53
|
+
"Error: Could not connect to the server at %{url}\n"
|
54
|
+
" %{error}"
|
55
|
+
msgstr ""
|
56
|
+
|
57
|
+
msgid ""
|
58
|
+
"Error: SSL certificate could not be verified against known CA certificates.\n"
|
59
|
+
" To turn off verification, use the -k or --insecure option."
|
60
|
+
msgstr ""
|
61
|
+
|
62
|
+
msgid "Error from doing %{request_type} %{url}"
|
63
|
+
msgstr ""
|
64
|
+
|
65
|
+
msgid ""
|
66
|
+
"%{error}\n"
|
67
|
+
"Try 'razor --help' for more information\n"
|
68
|
+
"\n"
|
69
|
+
msgstr ""
|
70
|
+
|
71
|
+
msgid "Could not navigate to '%{path}' from %{url}"
|
72
|
+
msgstr ""
|
73
|
+
|
74
|
+
msgid "Could not find entry '%{key}' in document at %{url}"
|
75
|
+
msgstr ""
|
76
|
+
|
77
|
+
msgid "URL '%{url}' in ENV variable RAZOR_API is not valid"
|
78
|
+
msgstr ""
|
79
|
+
|
80
|
+
msgid "URL '%{url}' provided by -u or --url is not valid"
|
81
|
+
msgstr ""
|
82
|
+
|
83
|
+
msgid "URL '%{url}' is not valid"
|
84
|
+
msgstr ""
|
85
|
+
|
86
|
+
msgid "CA file '%{path}' in ENV variable RAZOR_CA_FILE does not exist"
|
87
|
+
msgstr ""
|
88
|
+
|
89
|
+
msgid "Server version is not compatible with client version: %{reason}"
|
90
|
+
msgstr ""
|
91
|
+
|
92
|
+
msgid "No arguments for command (did you forget --json ?)"
|
93
|
+
msgstr ""
|
94
|
+
|
95
|
+
msgid "Unexpected argument %{argument} (did you mean %{suggestion}?)"
|
96
|
+
msgstr ""
|
97
|
+
|
98
|
+
msgid "Unexpected argument %{argument}"
|
99
|
+
msgstr ""
|
100
|
+
|
101
|
+
msgid "File %{path} is not valid JSON"
|
102
|
+
msgstr ""
|
103
|
+
|
104
|
+
msgid "File %{path} not found"
|
105
|
+
msgstr ""
|
106
|
+
|
107
|
+
msgid "Permission to read file %{path} denied"
|
108
|
+
msgstr ""
|
109
|
+
|
110
|
+
msgid ""
|
111
|
+
"Formatting argument %{argument_name} with value %{value} as %{argument_type}\n"
|
112
|
+
msgstr ""
|
113
|
+
|
114
|
+
msgid "Invalid object for argument '%{argument_name}'"
|
115
|
+
msgstr ""
|
116
|
+
|
117
|
+
msgid "Invalid object for argument '%{argument_name}': %{error}"
|
118
|
+
msgstr ""
|
119
|
+
|
120
|
+
msgid "Invalid integer for argument '%{arg_name}': %{value}"
|
121
|
+
msgstr ""
|
122
|
+
|
123
|
+
msgid "Expected nothing for argument '%{arg_name}', but was: '%{value}'"
|
124
|
+
msgstr ""
|
125
|
+
|
126
|
+
msgid "Unexpected datatype '%{argument_type}' for argument %{argument_name}"
|
127
|
+
msgstr ""
|
128
|
+
|
129
|
+
msgid "There are no items for this query."
|
130
|
+
msgstr ""
|
131
|
+
|
132
|
+
msgid "Unrecognized view format %{format_name}"
|
133
|
+
msgstr ""
|
134
|
+
|
135
|
+
msgid "Could not find help for that entry"
|
136
|
+
msgstr ""
|
137
|
+
|
138
|
+
msgid ""
|
139
|
+
"# USAGE\n"
|
140
|
+
"\n"
|
141
|
+
" razor %{command} %{arguments} <flags>\n"
|
142
|
+
"\n"
|
143
|
+
msgstr ""
|
144
|
+
|
145
|
+
msgid ""
|
146
|
+
"# SYNOPSIS\n"
|
147
|
+
"%{summary}\n"
|
148
|
+
"\n"
|
149
|
+
msgstr ""
|
150
|
+
|
151
|
+
msgid ""
|
152
|
+
"# DESCRIPTION\n"
|
153
|
+
"%{description}\n"
|
154
|
+
"\n"
|
155
|
+
"%{schema}\n"
|
156
|
+
msgstr ""
|
157
|
+
|
158
|
+
msgid ""
|
159
|
+
"# RETURNS\n"
|
160
|
+
"%{returns}\n"
|
161
|
+
msgstr ""
|
162
|
+
|
163
|
+
msgid ""
|
164
|
+
"# EXAMPLES\n"
|
165
|
+
"\n"
|
166
|
+
"%{examples}\n"
|
167
|
+
msgstr ""
|
168
|
+
|
169
|
+
msgid ""
|
170
|
+
"\n"
|
171
|
+
"\n"
|
172
|
+
"Query an entry by including its name, e.g. `razor %{arguments} %{name}`"
|
173
|
+
msgstr ""
|
174
|
+
|
175
|
+
msgid ""
|
176
|
+
"\n"
|
177
|
+
"\n"
|
178
|
+
"Query additional details via: `razor %{arguments} [%{options}]`"
|
179
|
+
msgstr ""
|
180
|
+
|
181
|
+
msgid "Unknown"
|
182
|
+
msgstr ""
|
183
|
+
|
184
|
+
msgid "Received content type %{content_type}"
|
185
|
+
msgstr ""
|
186
|
+
|
187
|
+
msgid "ERROR"
|
188
|
+
msgstr ""
|
189
|
+
|
190
|
+
msgid ""
|
191
|
+
"Usage: razor [FLAGS] NAVIGATION\n"
|
192
|
+
msgstr ""
|
193
|
+
|
194
|
+
msgid "Dumps API output to the screen"
|
195
|
+
msgstr ""
|
196
|
+
|
197
|
+
msgid "Show API help for a command"
|
198
|
+
msgstr ""
|
199
|
+
|
200
|
+
msgid "Allow SSL connections without verified certificates"
|
201
|
+
msgstr ""
|
202
|
+
|
203
|
+
msgid ""
|
204
|
+
"The full Razor API URL, can also be set\n"
|
205
|
+
" "
|
206
|
+
msgstr ""
|
207
|
+
|
208
|
+
msgid "Show the version of Razor"
|
209
|
+
msgstr ""
|
210
|
+
|
211
|
+
msgid "Show this screen"
|
212
|
+
msgstr ""
|
213
|
+
|
214
|
+
msgid "Error: Credentials are required to connect to the server at %{url}."
|
215
|
+
msgstr ""
|
216
|
+
|
217
|
+
msgid "Error: Could not connect to the server at %{url}."
|
218
|
+
msgstr ""
|
219
|
+
|
220
|
+
msgid ""
|
221
|
+
" Razor Server version: #{server_version}\n"
|
222
|
+
" Razor Client version: #{Razor::CLI::VERSION}\n"
|
223
|
+
msgstr ""
|
224
|
+
|
225
|
+
msgid "Collections"
|
226
|
+
msgstr ""
|
227
|
+
|
228
|
+
msgid "Commands"
|
229
|
+
msgstr ""
|
230
|
+
|
231
|
+
msgid ""
|
232
|
+
"%{collections}\n"
|
233
|
+
"\n"
|
234
|
+
" Navigate to entries of a collection using COLLECTION NAME, for example,\n"
|
235
|
+
" 'nodes node15' for the details of a node or 'nodes node15 log' to see\n"
|
236
|
+
" the log for node15\n"
|
237
|
+
"%{commands}\n"
|
238
|
+
"\n"
|
239
|
+
" Pass arguments to commands either directly by name ('--name=NAME')\n"
|
240
|
+
" or save the JSON body for the command in a file and pass it with\n"
|
241
|
+
" '--json FILE'. Using --json is the only way to pass arguments in\n"
|
242
|
+
" nested structures such as the configuration for a broker.\n"
|
243
|
+
"\n"
|
244
|
+
msgstr ""
|
245
|
+
|
246
|
+
msgid ""
|
247
|
+
"Error: Credentials are required to connect to the server at %{url}\"\n"
|
248
|
+
msgstr ""
|
249
|
+
|
250
|
+
msgid "Error: Could not connect to the server at %{url}"
|
251
|
+
msgstr ""
|
252
|
+
|
253
|
+
msgid "Error: SSL certificate error from server at %{url}"
|
254
|
+
msgstr ""
|
255
|
+
|
256
|
+
msgid ""
|
257
|
+
"Error: Unknown error occurred while connecting to server at %{url}:\n"
|
258
|
+
" #{e}\n"
|
259
|
+
msgstr ""
|
260
|
+
|
261
|
+
msgid "Show full details when viewing entities"
|
262
|
+
msgstr ""
|
263
|
+
|
264
|
+
msgid "Show shortened details when viewing entities"
|
265
|
+
msgstr ""
|
266
|
+
|
267
|
+
msgid "(none)"
|
268
|
+
msgstr ""
|
data/spec/cli/navigate_spec.rb
CHANGED
@@ -227,4 +227,23 @@ describe Razor::CLI::Navigate do
|
|
227
227
|
parse.stripped_args.should == ['nodes', name, 'log']
|
228
228
|
end
|
229
229
|
end
|
230
|
+
|
231
|
+
context "accept-language header", :vcr do
|
232
|
+
before :each do
|
233
|
+
GettextSetup.clear
|
234
|
+
end
|
235
|
+
it "should set the accept-language header" do
|
236
|
+
GettextSetup.candidate_locales.should_not be_nil
|
237
|
+
nav = Razor::CLI::Parse.new(['create-broker', '--name=some-broker', '--broker-type', 'puppet-pe', '-c', 'server=abc.com']).navigate
|
238
|
+
nav.accept_language.should == GettextSetup.candidate_locales
|
239
|
+
end
|
240
|
+
it "should allow other accept-language headers" do
|
241
|
+
ENV['LANG'] = 'de_DE'
|
242
|
+
locales = GettextSetup.candidate_locales
|
243
|
+
locales.should == 'de_DE,de,en'
|
244
|
+
nav = Razor::CLI::Parse.new(['create-broker', '--name=other-broker', '--broker-type', 'puppet-pe', '-c', 'server=abc.com']).navigate
|
245
|
+
nav.accept_language.should == locales
|
246
|
+
nav.doc_resource.options[:headers][:accept_language].should == locales
|
247
|
+
end
|
248
|
+
end
|
230
249
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://localhost:8150/api
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- application/json
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip, deflate
|
14
|
+
Accept-Language:
|
15
|
+
- de_DE,de,en
|
16
|
+
User-Agent:
|
17
|
+
- Ruby
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Server:
|
24
|
+
- Apache-Coyote/1.1
|
25
|
+
X-Content-Type-Options:
|
26
|
+
- nosniff
|
27
|
+
Content-Type:
|
28
|
+
- application/json
|
29
|
+
Content-Length:
|
30
|
+
- '7116'
|
31
|
+
Date:
|
32
|
+
- Wed, 18 Jan 2017 18:16:48 GMT
|
33
|
+
body:
|
34
|
+
encoding: US-ASCII
|
35
|
+
string: '{"commands":[{"name":"add-policy-tag","rel":"http://api.puppetlabs.com/razor/v1/commands/add-policy-tag","id":"http://localhost:8150/api/commands/add-policy-tag"},{"name":"create-broker","rel":"http://api.puppetlabs.com/razor/v1/commands/create-broker","id":"http://localhost:8150/api/commands/create-broker"},{"name":"create-hook","rel":"http://api.puppetlabs.com/razor/v1/commands/create-hook","id":"http://localhost:8150/api/commands/create-hook"},{"name":"create-policy","rel":"http://api.puppetlabs.com/razor/v1/commands/create-policy","id":"http://localhost:8150/api/commands/create-policy"},{"name":"create-repo","rel":"http://api.puppetlabs.com/razor/v1/commands/create-repo","id":"http://localhost:8150/api/commands/create-repo"},{"name":"create-tag","rel":"http://api.puppetlabs.com/razor/v1/commands/create-tag","id":"http://localhost:8150/api/commands/create-tag"},{"name":"create-task","rel":"http://api.puppetlabs.com/razor/v1/commands/create-task","id":"http://localhost:8150/api/commands/create-task"},{"name":"delete-broker","rel":"http://api.puppetlabs.com/razor/v1/commands/delete-broker","id":"http://localhost:8150/api/commands/delete-broker"},{"name":"delete-hook","rel":"http://api.puppetlabs.com/razor/v1/commands/delete-hook","id":"http://localhost:8150/api/commands/delete-hook"},{"name":"delete-node","rel":"http://api.puppetlabs.com/razor/v1/commands/delete-node","id":"http://localhost:8150/api/commands/delete-node"},{"name":"delete-policy","rel":"http://api.puppetlabs.com/razor/v1/commands/delete-policy","id":"http://localhost:8150/api/commands/delete-policy"},{"name":"delete-repo","rel":"http://api.puppetlabs.com/razor/v1/commands/delete-repo","id":"http://localhost:8150/api/commands/delete-repo"},{"name":"delete-tag","rel":"http://api.puppetlabs.com/razor/v1/commands/delete-tag","id":"http://localhost:8150/api/commands/delete-tag"},{"name":"disable-policy","rel":"http://api.puppetlabs.com/razor/v1/commands/disable-policy","id":"http://localhost:8150/api/commands/disable-policy"},{"name":"enable-policy","rel":"http://api.puppetlabs.com/razor/v1/commands/enable-policy","id":"http://localhost:8150/api/commands/enable-policy"},{"name":"modify-node-metadata","rel":"http://api.puppetlabs.com/razor/v1/commands/modify-node-metadata","id":"http://localhost:8150/api/commands/modify-node-metadata"},{"name":"modify-policy-max-count","rel":"http://api.puppetlabs.com/razor/v1/commands/modify-policy-max-count","id":"http://localhost:8150/api/commands/modify-policy-max-count"},{"name":"move-policy","rel":"http://api.puppetlabs.com/razor/v1/commands/move-policy","id":"http://localhost:8150/api/commands/move-policy"},{"name":"reboot-node","rel":"http://api.puppetlabs.com/razor/v1/commands/reboot-node","id":"http://localhost:8150/api/commands/reboot-node"},{"name":"register-node","rel":"http://api.puppetlabs.com/razor/v1/commands/register-node","id":"http://localhost:8150/api/commands/register-node"},{"name":"reinstall-node","rel":"http://api.puppetlabs.com/razor/v1/commands/reinstall-node","id":"http://localhost:8150/api/commands/reinstall-node"},{"name":"remove-node-metadata","rel":"http://api.puppetlabs.com/razor/v1/commands/remove-node-metadata","id":"http://localhost:8150/api/commands/remove-node-metadata"},{"name":"remove-policy-tag","rel":"http://api.puppetlabs.com/razor/v1/commands/remove-policy-tag","id":"http://localhost:8150/api/commands/remove-policy-tag"},{"name":"run-hook","rel":"http://api.puppetlabs.com/razor/v1/commands/run-hook","id":"http://localhost:8150/api/commands/run-hook"},{"name":"set-node-desired-power-state","rel":"http://api.puppetlabs.com/razor/v1/commands/set-node-desired-power-state","id":"http://localhost:8150/api/commands/set-node-desired-power-state"},{"name":"set-node-hw-info","rel":"http://api.puppetlabs.com/razor/v1/commands/set-node-hw-info","id":"http://localhost:8150/api/commands/set-node-hw-info"},{"name":"set-node-ipmi-credentials","rel":"http://api.puppetlabs.com/razor/v1/commands/set-node-ipmi-credentials","id":"http://localhost:8150/api/commands/set-node-ipmi-credentials"},{"name":"update-broker-configuration","rel":"http://api.puppetlabs.com/razor/v1/commands/update-broker-configuration","id":"http://localhost:8150/api/commands/update-broker-configuration"},{"name":"update-hook-configuration","rel":"http://api.puppetlabs.com/razor/v1/commands/update-hook-configuration","id":"http://localhost:8150/api/commands/update-hook-configuration"},{"name":"update-node-metadata","rel":"http://api.puppetlabs.com/razor/v1/commands/update-node-metadata","id":"http://localhost:8150/api/commands/update-node-metadata"},{"name":"update-policy-broker","rel":"http://api.puppetlabs.com/razor/v1/commands/update-policy-broker","id":"http://localhost:8150/api/commands/update-policy-broker"},{"name":"update-policy-node-metadata","rel":"http://api.puppetlabs.com/razor/v1/commands/update-policy-node-metadata","id":"http://localhost:8150/api/commands/update-policy-node-metadata"},{"name":"update-policy-repo","rel":"http://api.puppetlabs.com/razor/v1/commands/update-policy-repo","id":"http://localhost:8150/api/commands/update-policy-repo"},{"name":"update-policy-task","rel":"http://api.puppetlabs.com/razor/v1/commands/update-policy-task","id":"http://localhost:8150/api/commands/update-policy-task"},{"name":"update-repo-task","rel":"http://api.puppetlabs.com/razor/v1/commands/update-repo-task","id":"http://localhost:8150/api/commands/update-repo-task"},{"name":"update-tag-rule","rel":"http://api.puppetlabs.com/razor/v1/commands/update-tag-rule","id":"http://localhost:8150/api/commands/update-tag-rule"}],"collections":[{"name":"brokers","rel":"http://api.puppetlabs.com/razor/v1/collections/brokers","id":"http://localhost:8150/api/collections/brokers"},{"name":"repos","rel":"http://api.puppetlabs.com/razor/v1/collections/repos","id":"http://localhost:8150/api/collections/repos"},{"name":"tags","rel":"http://api.puppetlabs.com/razor/v1/collections/tags","id":"http://localhost:8150/api/collections/tags"},{"name":"policies","rel":"http://api.puppetlabs.com/razor/v1/collections/policies","id":"http://localhost:8150/api/collections/policies"},{"name":"nodes","rel":"http://api.puppetlabs.com/razor/v1/collections/nodes","id":"http://localhost:8150/api/collections/nodes","params":{"start":{"type":"number"},"limit":{"type":"number"}}},{"name":"tasks","rel":"http://api.puppetlabs.com/razor/v1/collections/tasks","id":"http://localhost:8150/api/collections/tasks"},{"name":"commands","rel":"http://api.puppetlabs.com/razor/v1/collections/commands","id":"http://localhost:8150/api/collections/commands"},{"name":"events","rel":"http://api.puppetlabs.com/razor/v1/collections/events","id":"http://localhost:8150/api/collections/events","params":{"start":{"type":"number"},"limit":{"type":"number"}}},{"name":"hooks","rel":"http://api.puppetlabs.com/razor/v1/collections/hooks","id":"http://localhost:8150/api/collections/hooks"},{"name":"config","rel":"http://api.puppetlabs.com/razor/v1/collections/config","id":"http://localhost:8150/api/collections/config"}],"version":{"server":"v1.5.0-11-g89cc831"}}'
|
36
|
+
http_version:
|
37
|
+
recorded_at: Wed, 18 Jan 2017 18:16:48 GMT
|
38
|
+
recorded_with: VCR 2.5.0
|
@@ -0,0 +1,38 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://localhost:8150/api
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- application/json
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip, deflate
|
14
|
+
Accept-Language:
|
15
|
+
- en_US,en
|
16
|
+
User-Agent:
|
17
|
+
- Ruby
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Server:
|
24
|
+
- Apache-Coyote/1.1
|
25
|
+
X-Content-Type-Options:
|
26
|
+
- nosniff
|
27
|
+
Content-Type:
|
28
|
+
- application/json
|
29
|
+
Content-Length:
|
30
|
+
- '7116'
|
31
|
+
Date:
|
32
|
+
- Wed, 18 Jan 2017 18:16:43 GMT
|
33
|
+
body:
|
34
|
+
encoding: US-ASCII
|
35
|
+
string: '{"commands":[{"name":"add-policy-tag","rel":"http://api.puppetlabs.com/razor/v1/commands/add-policy-tag","id":"http://localhost:8150/api/commands/add-policy-tag"},{"name":"create-broker","rel":"http://api.puppetlabs.com/razor/v1/commands/create-broker","id":"http://localhost:8150/api/commands/create-broker"},{"name":"create-hook","rel":"http://api.puppetlabs.com/razor/v1/commands/create-hook","id":"http://localhost:8150/api/commands/create-hook"},{"name":"create-policy","rel":"http://api.puppetlabs.com/razor/v1/commands/create-policy","id":"http://localhost:8150/api/commands/create-policy"},{"name":"create-repo","rel":"http://api.puppetlabs.com/razor/v1/commands/create-repo","id":"http://localhost:8150/api/commands/create-repo"},{"name":"create-tag","rel":"http://api.puppetlabs.com/razor/v1/commands/create-tag","id":"http://localhost:8150/api/commands/create-tag"},{"name":"create-task","rel":"http://api.puppetlabs.com/razor/v1/commands/create-task","id":"http://localhost:8150/api/commands/create-task"},{"name":"delete-broker","rel":"http://api.puppetlabs.com/razor/v1/commands/delete-broker","id":"http://localhost:8150/api/commands/delete-broker"},{"name":"delete-hook","rel":"http://api.puppetlabs.com/razor/v1/commands/delete-hook","id":"http://localhost:8150/api/commands/delete-hook"},{"name":"delete-node","rel":"http://api.puppetlabs.com/razor/v1/commands/delete-node","id":"http://localhost:8150/api/commands/delete-node"},{"name":"delete-policy","rel":"http://api.puppetlabs.com/razor/v1/commands/delete-policy","id":"http://localhost:8150/api/commands/delete-policy"},{"name":"delete-repo","rel":"http://api.puppetlabs.com/razor/v1/commands/delete-repo","id":"http://localhost:8150/api/commands/delete-repo"},{"name":"delete-tag","rel":"http://api.puppetlabs.com/razor/v1/commands/delete-tag","id":"http://localhost:8150/api/commands/delete-tag"},{"name":"disable-policy","rel":"http://api.puppetlabs.com/razor/v1/commands/disable-policy","id":"http://localhost:8150/api/commands/disable-policy"},{"name":"enable-policy","rel":"http://api.puppetlabs.com/razor/v1/commands/enable-policy","id":"http://localhost:8150/api/commands/enable-policy"},{"name":"modify-node-metadata","rel":"http://api.puppetlabs.com/razor/v1/commands/modify-node-metadata","id":"http://localhost:8150/api/commands/modify-node-metadata"},{"name":"modify-policy-max-count","rel":"http://api.puppetlabs.com/razor/v1/commands/modify-policy-max-count","id":"http://localhost:8150/api/commands/modify-policy-max-count"},{"name":"move-policy","rel":"http://api.puppetlabs.com/razor/v1/commands/move-policy","id":"http://localhost:8150/api/commands/move-policy"},{"name":"reboot-node","rel":"http://api.puppetlabs.com/razor/v1/commands/reboot-node","id":"http://localhost:8150/api/commands/reboot-node"},{"name":"register-node","rel":"http://api.puppetlabs.com/razor/v1/commands/register-node","id":"http://localhost:8150/api/commands/register-node"},{"name":"reinstall-node","rel":"http://api.puppetlabs.com/razor/v1/commands/reinstall-node","id":"http://localhost:8150/api/commands/reinstall-node"},{"name":"remove-node-metadata","rel":"http://api.puppetlabs.com/razor/v1/commands/remove-node-metadata","id":"http://localhost:8150/api/commands/remove-node-metadata"},{"name":"remove-policy-tag","rel":"http://api.puppetlabs.com/razor/v1/commands/remove-policy-tag","id":"http://localhost:8150/api/commands/remove-policy-tag"},{"name":"run-hook","rel":"http://api.puppetlabs.com/razor/v1/commands/run-hook","id":"http://localhost:8150/api/commands/run-hook"},{"name":"set-node-desired-power-state","rel":"http://api.puppetlabs.com/razor/v1/commands/set-node-desired-power-state","id":"http://localhost:8150/api/commands/set-node-desired-power-state"},{"name":"set-node-hw-info","rel":"http://api.puppetlabs.com/razor/v1/commands/set-node-hw-info","id":"http://localhost:8150/api/commands/set-node-hw-info"},{"name":"set-node-ipmi-credentials","rel":"http://api.puppetlabs.com/razor/v1/commands/set-node-ipmi-credentials","id":"http://localhost:8150/api/commands/set-node-ipmi-credentials"},{"name":"update-broker-configuration","rel":"http://api.puppetlabs.com/razor/v1/commands/update-broker-configuration","id":"http://localhost:8150/api/commands/update-broker-configuration"},{"name":"update-hook-configuration","rel":"http://api.puppetlabs.com/razor/v1/commands/update-hook-configuration","id":"http://localhost:8150/api/commands/update-hook-configuration"},{"name":"update-node-metadata","rel":"http://api.puppetlabs.com/razor/v1/commands/update-node-metadata","id":"http://localhost:8150/api/commands/update-node-metadata"},{"name":"update-policy-broker","rel":"http://api.puppetlabs.com/razor/v1/commands/update-policy-broker","id":"http://localhost:8150/api/commands/update-policy-broker"},{"name":"update-policy-node-metadata","rel":"http://api.puppetlabs.com/razor/v1/commands/update-policy-node-metadata","id":"http://localhost:8150/api/commands/update-policy-node-metadata"},{"name":"update-policy-repo","rel":"http://api.puppetlabs.com/razor/v1/commands/update-policy-repo","id":"http://localhost:8150/api/commands/update-policy-repo"},{"name":"update-policy-task","rel":"http://api.puppetlabs.com/razor/v1/commands/update-policy-task","id":"http://localhost:8150/api/commands/update-policy-task"},{"name":"update-repo-task","rel":"http://api.puppetlabs.com/razor/v1/commands/update-repo-task","id":"http://localhost:8150/api/commands/update-repo-task"},{"name":"update-tag-rule","rel":"http://api.puppetlabs.com/razor/v1/commands/update-tag-rule","id":"http://localhost:8150/api/commands/update-tag-rule"}],"collections":[{"name":"brokers","rel":"http://api.puppetlabs.com/razor/v1/collections/brokers","id":"http://localhost:8150/api/collections/brokers"},{"name":"repos","rel":"http://api.puppetlabs.com/razor/v1/collections/repos","id":"http://localhost:8150/api/collections/repos"},{"name":"tags","rel":"http://api.puppetlabs.com/razor/v1/collections/tags","id":"http://localhost:8150/api/collections/tags"},{"name":"policies","rel":"http://api.puppetlabs.com/razor/v1/collections/policies","id":"http://localhost:8150/api/collections/policies"},{"name":"nodes","rel":"http://api.puppetlabs.com/razor/v1/collections/nodes","id":"http://localhost:8150/api/collections/nodes","params":{"start":{"type":"number"},"limit":{"type":"number"}}},{"name":"tasks","rel":"http://api.puppetlabs.com/razor/v1/collections/tasks","id":"http://localhost:8150/api/collections/tasks"},{"name":"commands","rel":"http://api.puppetlabs.com/razor/v1/collections/commands","id":"http://localhost:8150/api/collections/commands"},{"name":"events","rel":"http://api.puppetlabs.com/razor/v1/collections/events","id":"http://localhost:8150/api/collections/events","params":{"start":{"type":"number"},"limit":{"type":"number"}}},{"name":"hooks","rel":"http://api.puppetlabs.com/razor/v1/collections/hooks","id":"http://localhost:8150/api/collections/hooks"},{"name":"config","rel":"http://api.puppetlabs.com/razor/v1/collections/config","id":"http://localhost:8150/api/collections/config"}],"version":{"server":"v1.5.0-11-g89cc831"}}'
|
36
|
+
http_version:
|
37
|
+
recorded_at: Wed, 18 Jan 2017 18:16:43 GMT
|
38
|
+
recorded_with: VCR 2.5.0
|
@@ -0,0 +1,24 @@
|
|
1
|
+
---
|
2
|
+
# This is the project-specific configuration file for setting up
|
3
|
+
# fast_gettext for your project.
|
4
|
+
gettext:
|
5
|
+
# This is used for the name of the .pot and .po files; they will be
|
6
|
+
# called <project_name>.pot?
|
7
|
+
project_name: 'razor-client'
|
8
|
+
# This is used in comments in the .pot and .po files to indicate what
|
9
|
+
# project the files belong to and should be a little more descriptive than
|
10
|
+
# <project_name>
|
11
|
+
package_name: Razor Client
|
12
|
+
# The locale that the default messages in the .pot file are in
|
13
|
+
default_locale: en
|
14
|
+
# The email used for sending bug reports.
|
15
|
+
bugs_address: docs@puppet.com
|
16
|
+
# The holder of the copyright.
|
17
|
+
copyright_holder: Puppet Inc.
|
18
|
+
# This determines which comments in code should be eligible for translation.
|
19
|
+
comments_tag: TRANSLATORS
|
20
|
+
# Patterns for +Dir.glob+ used to find all files that might contain
|
21
|
+
# translatable content, relative to the project root directory
|
22
|
+
source_files:
|
23
|
+
- 'lib/**/*.rb'
|
24
|
+
- 'bin/razor'
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: razor-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2017-03-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mime-types
|
@@ -75,6 +75,22 @@ dependencies:
|
|
75
75
|
- - ! '>'
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '3.0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: gettext-setup
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
78
94
|
description: ! 'Razor is an advanced provisioning application which can deploy both
|
79
95
|
bare-metal
|
80
96
|
|
@@ -110,6 +126,8 @@ files:
|
|
110
126
|
- lib/razor/cli/views.rb
|
111
127
|
- lib/razor/cli/format.rb
|
112
128
|
- lib/razor/cli.rb
|
129
|
+
- locales/config.yaml
|
130
|
+
- locales/razor-client.pot
|
113
131
|
- NEWS.md
|
114
132
|
- README.md
|
115
133
|
- LICENSE
|
@@ -121,6 +139,8 @@ files:
|
|
121
139
|
- spec/cli/format_spec.rb
|
122
140
|
- spec/fixtures/vcr/Razor_CLI_Parse/_new/_help/should_print_a_list_of_known_endpoints.yml
|
123
141
|
- spec/fixtures/vcr/Razor_CLI_Navigate/with_no_parameters/should_fail_with_bad_JSON.yml
|
142
|
+
- spec/fixtures/vcr/Razor_CLI_Navigate/accept-language_header/should_allow_other_accept-language_headers.yml
|
143
|
+
- spec/fixtures/vcr/Razor_CLI_Navigate/accept-language_header/should_set_the_accept-language_header.yml
|
124
144
|
- spec/fixtures/vcr/Razor_CLI_Navigate/with_authentication/should_supply_that_to_the_API_service.yml
|
125
145
|
- spec/fixtures/vcr/Razor_CLI_Navigate/with_authentication/should_preserve_that_across_navigation.yml
|
126
146
|
- 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
|
@@ -154,6 +174,7 @@ files:
|
|
154
174
|
- spec/vcr_library.rb
|
155
175
|
- spec/version_spec.rb
|
156
176
|
- spec/spec_helper.rb
|
177
|
+
- spec/locales/config.yaml
|
157
178
|
homepage: http://puppetlabs.com/puppet/puppet-enterprise
|
158
179
|
licenses: []
|
159
180
|
post_install_message:
|
@@ -165,7 +186,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
165
186
|
requirements:
|
166
187
|
- - ! '>='
|
167
188
|
- !ruby/object:Gem::Version
|
168
|
-
version:
|
189
|
+
version: 1.9.3
|
169
190
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
170
191
|
none: false
|
171
192
|
requirements:
|
@@ -187,6 +208,8 @@ test_files:
|
|
187
208
|
- spec/cli/format_spec.rb
|
188
209
|
- spec/fixtures/vcr/Razor_CLI_Parse/_new/_help/should_print_a_list_of_known_endpoints.yml
|
189
210
|
- spec/fixtures/vcr/Razor_CLI_Navigate/with_no_parameters/should_fail_with_bad_JSON.yml
|
211
|
+
- spec/fixtures/vcr/Razor_CLI_Navigate/accept-language_header/should_allow_other_accept-language_headers.yml
|
212
|
+
- spec/fixtures/vcr/Razor_CLI_Navigate/accept-language_header/should_set_the_accept-language_header.yml
|
190
213
|
- spec/fixtures/vcr/Razor_CLI_Navigate/with_authentication/should_supply_that_to_the_API_service.yml
|
191
214
|
- spec/fixtures/vcr/Razor_CLI_Navigate/with_authentication/should_preserve_that_across_navigation.yml
|
192
215
|
- 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
|
@@ -220,3 +243,4 @@ test_files:
|
|
220
243
|
- spec/vcr_library.rb
|
221
244
|
- spec/version_spec.rb
|
222
245
|
- spec/spec_helper.rb
|
246
|
+
- spec/locales/config.yaml
|