razor-client 1.9.1 → 1.9.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/release.yml +24 -0
- data/.gitignore +9 -0
- data/.travis.yml +4 -0
- data/.yardopts +2 -0
- data/CODEOWNERS +1 -0
- data/Gemfile +42 -0
- data/NEWS.md +24 -0
- data/Rakefile +69 -0
- data/bin/razor +10 -13
- data/ext/build_defaults.yaml +20 -0
- data/ext/project_data.yaml +38 -0
- data/lib/razor/cli.rb +6 -0
- data/lib/razor/cli/command.rb +3 -3
- data/lib/razor/cli/navigate.rb +28 -19
- data/lib/razor/cli/parse.rb +18 -25
- data/lib/razor/cli/version.rb +1 -1
- data/razor-client.gemspec +35 -0
- data/spec/cli/command_spec.rb +21 -0
- data/spec/cli/format_spec.rb +10 -16
- data/spec/cli/navigate_spec.rb +10 -12
- data/spec/cli/parse_spec.rb +5 -3
- data/spec/fixtures/vcr/Razor_CLI_Navigate/accept-language_header/should_allow_other_accept-language_headers.yml +10 -10
- data/spec/fixtures/vcr/Razor_CLI_Navigate/accept-language_header/should_set_the_accept-language_header.yml +10 -10
- data/spec/fixtures/vcr/Razor_CLI_Navigate/argument_formatting/should_allow_in_string.yml +37 -39
- data/spec/fixtures/vcr/Razor_CLI_Navigate/argument_formatting/should_allow_single-dash_with_single_character_flag.yml +39 -41
- data/spec/fixtures/vcr/Razor_CLI_Navigate/argument_formatting/should_allow_spaces.yml +111 -117
- data/spec/fixtures/vcr/Razor_CLI_Navigate/argument_formatting/should_not_allow_double-dash_with_single_character_flag.yml +21 -21
- data/spec/fixtures/vcr/Razor_CLI_Navigate/argument_formatting/should_not_allow_single-dash_with_multiple_character_flag.yml +21 -21
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_command_help_for_razor_--help_command_.yml +19 -19
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_command_help_for_razor_-h_command_.yml +19 -19
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_command_help_for_razor_command_--help_.yml +19 -19
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_command_help_for_razor_command_-h_.yml +19 -19
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_command_help_for_razor_command_help_.yml +19 -19
- data/spec/fixtures/vcr/Razor_CLI_Navigate/for_command_help/should_provide_command_help_for_razor_help_command_.yml +19 -19
- data/spec/fixtures/vcr/Razor_CLI_Navigate/positional_arguments/should_allow_the_use_of_positional_arguments.yml +136 -144
- data/spec/fixtures/vcr/Razor_CLI_Navigate/positional_arguments/should_fail_with_too_many_positional_arguments.yml +21 -21
- data/spec/fixtures/vcr/Razor_CLI_Navigate/when_the_collections_endpoint_has_a_depth_parameter/should_be_set_to_1_when_the_endpoint_is_the_final_query.yml +18 -18
- data/spec/fixtures/vcr/Razor_CLI_Navigate/when_the_collections_endpoint_has_a_depth_parameter/should_not_be_exposed_to_the_user.yml +10 -10
- data/spec/fixtures/vcr/Razor_CLI_Navigate/when_the_collections_endpoint_has_a_depth_parameter/should_not_carry-over_to_later_requests_in_a_nested_query.yml +65 -67
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_a_single_item_path/.yml +77 -0
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_an_invalid_path/.yml +40 -0
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_authentication/should_preserve_that_across_navigation.yml +17 -21
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_authentication/should_supply_that_to_the_API_service.yml +10 -12
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_invalid_parameter/should_fail_with_bad_JSON.yml +21 -21
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_invalid_parameter/should_fail_with_malformed_argument.yml +19 -19
- 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 +187 -197
- 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 +187 -197
- 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 +187 -197
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_multiple_arguments_with_same_name/combining_as_an_object/should_construct_a_json_object.yml +39 -41
- 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 +76 -80
- 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 +21 -21
- 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 +21 -21
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_no_parameters/should_fail_with_bad_JSON.yml +19 -19
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_no_path/.yml +40 -0
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_query_parameters/should_append_limit.yml +17 -21
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_query_parameters/should_append_start.yml +17 -21
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_query_parameters/should_not_fail_when_query_returns_details_for_one_item.yml +61 -69
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_query_parameters/should_store_query_without_query_parameters.yml +105 -117
- data/spec/fixtures/vcr/Razor_CLI_Navigate/with_query_parameters/should_throw_an_error_if_the_query_parameter_is_not_in_the_API.yml +10 -12
- 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 +54 -60
- data/spec/fixtures/vcr/Razor_CLI_Parse/_new/_help/.yml +40 -0
- data/spec/fixtures/vcr/Razor_CLI_Parse/_new/_help/should_print_a_list_of_known_endpoints.yml +10 -10
- data/spec/spec_helper.rb +1 -1
- data/spec/testing.md +4 -2
- metadata +69 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7240c2a4e68fab8d04ae7084b400d7a7bd472858c2190b3dca337577e5aa5cf7
|
4
|
+
data.tar.gz: 3f3b980e70b2d2de30f8fb49f4b8a34ad6ac67daf4e76b2d944250b1dd09894c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf8b0cf692487781a22c34b2df625ad729a39fc283fb3cc3b6abd0beefec6d8392b1d10a33eeae05d94f21677ea5cf36f9755fc6365d1ca38862fbadad7b7a9c
|
7
|
+
data.tar.gz: 5c56d03d1161b3c9d74c66b9ddb82123e072e24cebd7e42f703d579cc13d1e696f40d259670b673773ffb1b234fb76a38876528bdb7a6642199a61331a6a013e
|
@@ -0,0 +1,24 @@
|
|
1
|
+
name: Gem release
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches:
|
6
|
+
- refs/tags/*
|
7
|
+
|
8
|
+
jobs:
|
9
|
+
release:
|
10
|
+
runs-on: ubuntu-latest
|
11
|
+
|
12
|
+
steps:
|
13
|
+
- uses: actions/checkout@v1
|
14
|
+
- name: Build gem
|
15
|
+
uses: scarhand/actions-ruby@master
|
16
|
+
with:
|
17
|
+
args: build *.gemspec
|
18
|
+
- name: Publish gem
|
19
|
+
uses: scarhand/actions-ruby@master
|
20
|
+
env:
|
21
|
+
RUBYGEMS_AUTH_TOKEN: ${{ secrets.RUBYGEMS_AUTH_TOKEN }}
|
22
|
+
with:
|
23
|
+
args: push *.gem
|
24
|
+
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/.yardopts
ADDED
data/CODEOWNERS
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
* @puppetlabs/razor-maintainers
|
data/Gemfile
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gemspec
|
4
|
+
|
5
|
+
def location_for(place, fake_version = nil)
|
6
|
+
if place =~ /^(git[:@][^#]*)#(.*)/
|
7
|
+
[fake_version, { :git => $1, :branch => $2, :require => false }].compact
|
8
|
+
elsif place =~ /^file:\/\/(.*)/
|
9
|
+
['>= 0', { :path => File.expand_path($1), :require => false }]
|
10
|
+
else
|
11
|
+
[place, { :require => false }]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
group :packaging do
|
16
|
+
gem 'packaging', *location_for(ENV['PACKAGING_LOCATION'] || '~> 0.99')
|
17
|
+
end
|
18
|
+
|
19
|
+
group :doc do
|
20
|
+
gem 'yard'
|
21
|
+
gem 'kramdown'
|
22
|
+
end
|
23
|
+
|
24
|
+
# This group will be excluded by default in `torquebox archive`
|
25
|
+
group :test do
|
26
|
+
gem 'public_suffix', '~> 1.4.6'
|
27
|
+
gem 'rack-test'
|
28
|
+
gem 'rspec', '~> 2.13.0'
|
29
|
+
gem 'rspec-core', '~> 2.13.1'
|
30
|
+
gem 'rspec-expectations', '~> 2.13.0'
|
31
|
+
gem 'rspec-mocks', '~> 2.13.1'
|
32
|
+
gem 'simplecov'
|
33
|
+
gem 'webmock', '~> 3.3.0'
|
34
|
+
gem 'vcr', '~> 4.0.0'
|
35
|
+
end
|
36
|
+
|
37
|
+
# This allows you to create `Gemfile.local` and have it loaded automatically;
|
38
|
+
# the purpose of this is to allow you to put additional development gems
|
39
|
+
# somewhere convenient without having to constantly mess with this file.
|
40
|
+
#
|
41
|
+
# Gemfile.local is in the .gitignore file; do not check one in!
|
42
|
+
eval(File.read(File.dirname(__FILE__) + '/Gemfile.local'), binding) rescue nil
|
data/NEWS.md
CHANGED
@@ -1,5 +1,29 @@
|
|
1
1
|
# Razor Client Release Notes
|
2
2
|
|
3
|
+
## 1.9.4 - 2019-08-26
|
4
|
+
|
5
|
+
* IMPROVEMENT: Moved from `rest-client` to `faraday` due to increasing
|
6
|
+
dependency issues with `rest-client`.
|
7
|
+
|
8
|
+
## 1.9.3 - 2019-08-19 (yanked)
|
9
|
+
|
10
|
+
* BUGFIX: The `unf` gem dependency referenced a prerelease version of a gem.
|
11
|
+
Rather than force the use of `--pre` when installing the gem, we will pin
|
12
|
+
back to the released version, which requires GCC to build native extensions.
|
13
|
+
|
14
|
+
## 1.9.2 - 2019-08-14 (yanked)
|
15
|
+
|
16
|
+
* BUGFIX: Fixed error output when number or null datatypes are invalid.
|
17
|
+
* IMPROVEMENT: Now exits with status code 1 if login credentials are missing.
|
18
|
+
* IMPROVEMENT: Updated gem dependencies.
|
19
|
+
* IMPROVEMENT: Better error handling for REST exceptions returned from the
|
20
|
+
Razor server.
|
21
|
+
* IMPROVEMENT: Removed Gemfile.lock from repository. This broadens the spectrum
|
22
|
+
of which gems can be used as dependencies for this gem. This is especially
|
23
|
+
useful for gem dependencies that become outdated or obsolete.
|
24
|
+
* BUGFIX: Pinned a version of the `gettext-setup` gem which caused an error if
|
25
|
+
the version was too old.
|
26
|
+
|
3
27
|
## 1.9.1 - 2018-06-07
|
4
28
|
|
5
29
|
* NEW: Use the server's `depth` parameter if it is supported. This will
|
data/Rakefile
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
# Needed to make the client work on Ruby 1.8.7
|
5
|
+
unless Kernel.respond_to?(:require_relative)
|
6
|
+
module Kernel
|
7
|
+
def require_relative(path)
|
8
|
+
require File.join(File.dirname(caller[0]), path.to_str)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
require_relative 'spec/vcr_library'
|
14
|
+
|
15
|
+
namespace :bundler do
|
16
|
+
task :setup do
|
17
|
+
require 'bundler/setup'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
if defined?(RSpec::Core::RakeTask)
|
22
|
+
namespace :spec do
|
23
|
+
require 'rspec/core'
|
24
|
+
require 'rspec/core/rake_task'
|
25
|
+
|
26
|
+
desc <<EOS
|
27
|
+
Run all specs. Set VCR_RECORD to 'all' to rerecord and to 'new_episodes'
|
28
|
+
to record new tests. Tapes are in #{VCR_LIBRARY}
|
29
|
+
EOS
|
30
|
+
RSpec::Core::RakeTask.new(:all => :"bundler:setup") do |t|
|
31
|
+
t.pattern = 'spec/**/*_spec.rb'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
desc "Erase all VCR recordings"
|
37
|
+
task :"vcr:erase" do
|
38
|
+
erase_vcr_library
|
39
|
+
end
|
40
|
+
|
41
|
+
##############################################################################
|
42
|
+
# Support for our internal packaging toolchain. Most people outside of Puppet
|
43
|
+
# Labs will never actually need to deal with these.
|
44
|
+
begin
|
45
|
+
require 'packaging'
|
46
|
+
Pkg::Util::RakeUtils.load_packaging_tasks
|
47
|
+
rescue LoadError => e
|
48
|
+
puts "Error loading packaging rake tasks: #{e}"
|
49
|
+
end
|
50
|
+
|
51
|
+
# Kept for backwards compatibility
|
52
|
+
namespace :package do
|
53
|
+
desc "Bootstrap packaging automation, e.g. clone into packaging repo"
|
54
|
+
task :bootstrap do
|
55
|
+
puts 'Bootstrap is no longer needed, using packaging-as-a-gem'
|
56
|
+
end
|
57
|
+
|
58
|
+
desc "Remove all cloned packaging automation"
|
59
|
+
task :implode do
|
60
|
+
puts 'Implode is no longer needed, using packaging-as-a-gem'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
begin
|
65
|
+
spec = Gem::Specification.find_by_name 'gettext-setup'
|
66
|
+
load "#{spec.gem_dir}/lib/tasks/gettext.rake"
|
67
|
+
GettextSetup.initialize(File.absolute_path('locales', File.dirname(__FILE__)))
|
68
|
+
rescue LoadError
|
69
|
+
end
|
data/bin/razor
CHANGED
@@ -32,8 +32,6 @@ end
|
|
32
32
|
begin
|
33
33
|
parse = Razor::CLI::Parse.new(ARGV)
|
34
34
|
|
35
|
-
navigate = parse.navigate
|
36
|
-
|
37
35
|
if parse.show_version?
|
38
36
|
version, exit_code = parse.version
|
39
37
|
puts version
|
@@ -46,34 +44,33 @@ begin
|
|
46
44
|
exit exitcode
|
47
45
|
end
|
48
46
|
|
47
|
+
navigate = parse.navigate
|
48
|
+
|
49
49
|
document = navigate.get_document
|
50
50
|
url = parse.navigate.last_url
|
51
51
|
result = format_document document, parse
|
52
52
|
# TRANSLATORS: This is a template for all results that the client outputs.
|
53
53
|
puts _("From %{url}:\n\n%{result}\n\n") % {url: url, result: result}
|
54
|
-
rescue Razor::CLI::InvalidURIError => e
|
55
|
-
|
56
|
-
|
57
|
-
puts _(<<-UNAUTH) % {url: url}
|
58
|
-
Error: Credentials are required to connect to the server at %{url}"
|
59
|
-
UNAUTH
|
54
|
+
rescue Razor::CLI::InvalidURIError, Razor::CLI::UnauthorizedError => e
|
55
|
+
puts e.message
|
56
|
+
die
|
60
57
|
rescue OptionParser::InvalidOption => e
|
61
58
|
# TRANSLATORS: This occurs when invalid flags are passed in the navigation.
|
62
59
|
die _("%{error}\nTry 'razor --help' for more information") %
|
63
60
|
{error: e.message}
|
64
|
-
rescue SocketError,
|
61
|
+
rescue SocketError, Faraday::ConnectionFailed => e
|
65
62
|
puts _("Error: Could not connect to the server at %{url}\n" +
|
66
63
|
" %{error}") % {url: parse.api_url, error: e}
|
67
64
|
die
|
68
|
-
rescue
|
65
|
+
rescue Faraday::SSLError
|
69
66
|
puts _("Error: SSL certificate could not be verified against known CA " +
|
70
67
|
"certificates.\n To turn off verification, use the -k or --insecure option.")
|
71
68
|
die
|
72
|
-
rescue
|
69
|
+
rescue Faraday::Error => e
|
73
70
|
r = e.response
|
74
71
|
unexpected_error(e) if r.nil?
|
75
|
-
request_type = r.
|
76
|
-
url = r.
|
72
|
+
request_type = r.request.method.to_s.upcase
|
73
|
+
url = r.request.url
|
77
74
|
puts _("Error from doing %{request_type} %{url}") % {request_type: request_type, url: url}
|
78
75
|
puts e.message
|
79
76
|
begin
|
@@ -0,0 +1,20 @@
|
|
1
|
+
---
|
2
|
+
packaging_url: 'git://github.com/puppetlabs/packaging.git --branch=1.0.x'
|
3
|
+
packaging_repo: 'packaging'
|
4
|
+
default_cow: ''
|
5
|
+
cows: ''
|
6
|
+
pbuild_conf: '/etc/pbuilderrc'
|
7
|
+
packager: 'puppet'
|
8
|
+
gpg_name: 'release@puppet.com'
|
9
|
+
gpg_key: '7F438280EF8D349F'
|
10
|
+
sign_tar: FALSE
|
11
|
+
# a space separated list of mock configs
|
12
|
+
final_mocks: ''
|
13
|
+
yum_host: 'yum.puppetlabs.com'
|
14
|
+
build_gem: TRUE
|
15
|
+
build_dmg: FALSE
|
16
|
+
build_ips: FALSE
|
17
|
+
build_pe: FALSE
|
18
|
+
apt_host: 'apt.puppetlabs.com'
|
19
|
+
apt_repo_url: 'http://apt.puppetlabs.com'
|
20
|
+
tar_host: 'downloads.puppetlabs.com'
|
@@ -0,0 +1,38 @@
|
|
1
|
+
---
|
2
|
+
project: 'razor-client'
|
3
|
+
author: 'Puppet Labs'
|
4
|
+
email: 'info@puppetlabs.com'
|
5
|
+
homepage: 'http://puppetlabs.com/puppet/puppet-enterprise'
|
6
|
+
summary: 'Razor is an advanced provisioning application'
|
7
|
+
description: |
|
8
|
+
Razor is an advanced provisioning application which can deploy both bare-metal
|
9
|
+
and virtual systems. It's aimed at solving the problem of how to bring new
|
10
|
+
metal into a state where your existing DevOps/configuration management
|
11
|
+
workflows can take it over.
|
12
|
+
|
13
|
+
This provides the client application gem, used to provide CLI access and control
|
14
|
+
to users of razor-server.
|
15
|
+
# automatically burn our version into the generated source
|
16
|
+
version_file: 'lib/razor/cli/version.rb'
|
17
|
+
update_version_file: true
|
18
|
+
# files and gem_files are space separated lists (or arrays)
|
19
|
+
files:
|
20
|
+
- 'Gemfile*'
|
21
|
+
- razor-client.gemspec
|
22
|
+
- bin
|
23
|
+
- lib
|
24
|
+
- '*.md'
|
25
|
+
- LICENSE
|
26
|
+
- locales
|
27
|
+
gem_files: '{bin,lib,locales}/**/* *.md LICENSE'
|
28
|
+
gem_require_path: 'lib'
|
29
|
+
gem_test_files: 'spec/**/*'
|
30
|
+
gem_executables: 'razor'
|
31
|
+
gem_default_executables: 'razor'
|
32
|
+
gem_required_ruby_version: '>= 1.9.3'
|
33
|
+
gem_runtime_dependencies:
|
34
|
+
mime-types: '< 2.0'
|
35
|
+
multi_json:
|
36
|
+
faraday: '>= 0.15'
|
37
|
+
command_line_reporter: '> 3.0'
|
38
|
+
gettext-setup:
|
data/lib/razor/cli.rb
CHANGED
data/lib/razor/cli/command.rb
CHANGED
@@ -35,7 +35,7 @@ class Razor::CLI::Command
|
|
35
35
|
# `--arg=value`/`--arg value`
|
36
36
|
# `-a=value`/`-a value`
|
37
37
|
arg_name, value = [$1, $3]
|
38
|
-
value = @segments.shift if value.nil? && @segments[0] !~
|
38
|
+
value = @segments.shift if value.nil? && @segments[0] !~ /^-[a-z]/
|
39
39
|
arg_name = self.class.resolve_alias(arg_name, @cmd_schema)
|
40
40
|
body[arg_name] = self.class.convert_arg(arg_name, value, body[arg_name], @cmd_schema)
|
41
41
|
elsif argument =~ /\A-([a-z][a-z_-]+)(=(.+))?\Z/ and
|
@@ -132,10 +132,10 @@ class Razor::CLI::Command
|
|
132
132
|
begin
|
133
133
|
Integer(value)
|
134
134
|
rescue ArgumentError
|
135
|
-
raise ArgumentError, _("Invalid integer for argument '%{
|
135
|
+
raise ArgumentError, _("Invalid integer for argument '%{argument_name}': %{value}") % {argument_name: arg_name, value: value}
|
136
136
|
end
|
137
137
|
when "null"
|
138
|
-
raise ArgumentError, _("Expected nothing for argument '%{
|
138
|
+
raise ArgumentError, _("Expected nothing for argument '%{argument_name}', but was: '%{value}'") %
|
139
139
|
{argument_name: arg_name, value: value} unless value.nil?
|
140
140
|
nil
|
141
141
|
when "string", nil # `nil` for 'might be an alias, send as-is'
|
data/lib/razor/cli/navigate.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'faraday'
|
2
2
|
require 'multi_json'
|
3
3
|
require 'yaml'
|
4
4
|
require 'forwardable'
|
@@ -14,8 +14,7 @@ module Razor::CLI
|
|
14
14
|
@segments = segments||[]
|
15
15
|
set_api_url!(parse)
|
16
16
|
@doc = entrypoint
|
17
|
-
@doc_resource = create_resource parse.api_url,
|
18
|
-
:accept_language => accept_language}
|
17
|
+
@doc_resource = create_resource parse.api_url, default_headers
|
19
18
|
end
|
20
19
|
|
21
20
|
# This returns an array of two elements:
|
@@ -51,7 +50,7 @@ module Razor::CLI
|
|
51
50
|
attr_accessor :doc_resource
|
52
51
|
|
53
52
|
def last_url
|
54
|
-
@doc_resource
|
53
|
+
@doc_resource.build_url
|
55
54
|
end
|
56
55
|
|
57
56
|
def entrypoint
|
@@ -100,7 +99,7 @@ module Razor::CLI
|
|
100
99
|
command = json_get(cmd_url)
|
101
100
|
Razor::CLI::Command.new(@parse, self, command, @segments, cmd_url).run
|
102
101
|
else
|
103
|
-
raise NavigationError.new(@doc_resource, @segments, @doc)
|
102
|
+
raise NavigationError.new(@doc_resource.build_url, @segments, @doc)
|
104
103
|
end
|
105
104
|
end
|
106
105
|
|
@@ -114,7 +113,7 @@ module Razor::CLI
|
|
114
113
|
obj = @doc[key]
|
115
114
|
end
|
116
115
|
|
117
|
-
raise NavigationError.new(@doc_resource, key, @doc) if obj.nil?
|
116
|
+
raise NavigationError.new(@doc_resource.build_url, key, @doc) if obj.nil?
|
118
117
|
|
119
118
|
if obj.is_a?(Hash) && obj["id"]
|
120
119
|
url = URI.parse(obj["id"])
|
@@ -145,6 +144,11 @@ module Razor::CLI
|
|
145
144
|
@accept_language ||= GettextSetup.candidate_locales
|
146
145
|
end
|
147
146
|
|
147
|
+
def default_headers
|
148
|
+
{'accept' => 'application/json',
|
149
|
+
'accept_language' => accept_language}
|
150
|
+
end
|
151
|
+
|
148
152
|
def head(url, headers={})
|
149
153
|
resource = create_resource(url, headers)
|
150
154
|
response = resource.head
|
@@ -166,10 +170,12 @@ module Razor::CLI
|
|
166
170
|
@username ||= url.user
|
167
171
|
@password ||= url.password
|
168
172
|
|
169
|
-
response = get(url,headers.merge(
|
170
|
-
|
173
|
+
response = get(url, headers.merge(default_headers))
|
174
|
+
if response.status == 401
|
175
|
+
raise UnauthorizedError.new(url)
|
176
|
+
end
|
171
177
|
unless response.headers[:content_type] =~ /application\/json/
|
172
|
-
raise _(
|
178
|
+
raise _('Received content type %{content_type}') % {content_type: response.headers[:content_type]}
|
173
179
|
end
|
174
180
|
MultiJson.load(response.body)
|
175
181
|
end
|
@@ -178,11 +184,14 @@ module Razor::CLI
|
|
178
184
|
@username ||= url.user
|
179
185
|
@password ||= url.password
|
180
186
|
|
181
|
-
headers = {
|
182
|
-
:accept_language => accept_language}
|
187
|
+
headers = {'Content-Type' => 'application/json'}.merge(default_headers)
|
183
188
|
begin
|
184
189
|
resource = create_resource(url, headers)
|
185
|
-
|
190
|
+
# `nil` here because the URL above is absolute, not relative.
|
191
|
+
response = resource.post nil, MultiJson::dump(body)
|
192
|
+
if response.status == 401
|
193
|
+
raise UnauthorizedError.new(url)
|
194
|
+
end
|
186
195
|
ensure
|
187
196
|
if @parse.dump_response?
|
188
197
|
print "POST #{url.to_s}\n#{body}\n-->\n"
|
@@ -200,7 +209,7 @@ module Razor::CLI
|
|
200
209
|
begin
|
201
210
|
url = RAZOR_HTTPS_API
|
202
211
|
head(URI.parse(url))
|
203
|
-
rescue Errno::ENOENT,
|
212
|
+
rescue Errno::ENOENT, Faraday::ConnectionFailed
|
204
213
|
false
|
205
214
|
ensure
|
206
215
|
print "HEAD #{url.to_s}\n\n" if @parse.dump_response?
|
@@ -209,13 +218,13 @@ module Razor::CLI
|
|
209
218
|
end
|
210
219
|
|
211
220
|
def create_resource(url, headers)
|
212
|
-
@doc_resource =
|
221
|
+
@doc_resource = Faraday.new(url,
|
213
222
|
:headers => headers,
|
214
|
-
:
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
223
|
+
:ssl => {verify: @parse.verify_ssl?,
|
224
|
+
ca_file: @parse.ssl_ca_file}).tap do |req|
|
225
|
+
# Add these in case the URL above doesn't include authentication.
|
226
|
+
req.basic_auth(@username || url.user, @password || url.password)
|
227
|
+
end
|
219
228
|
end
|
220
229
|
end
|
221
230
|
end
|