razor-client 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +2 -0
- data/bin/razor +3 -0
- data/lib/razor/cli/navigate.rb +18 -2
- data/lib/razor/cli/navigate.yaml +14 -0
- data/lib/razor/cli/parse.rb +24 -5
- data/lib/razor/cli.rb +14 -0
- data/razor-client.gemspec +26 -0
- data/spec/cli/parse_spec.rb +25 -0
- data/spec/spec_helper.rb +3 -0
- metadata +7 -5
data/.gitignore
CHANGED
data/bin/razor
CHANGED
@@ -15,6 +15,9 @@ begin
|
|
15
15
|
puts "From #{url}:\n\n#{format_document document}\n\n"
|
16
16
|
rescue Razor::CLI::NavigationError => e
|
17
17
|
puts "Error: #{e}\n#{parse.help}\n\n"
|
18
|
+
rescue SocketError, Errno::ECONNREFUSED => e
|
19
|
+
puts "Error: Could not connect to the server at #{parse.api_url}"
|
20
|
+
puts " #{e}\n"
|
18
21
|
rescue RestClient::Exception => e
|
19
22
|
r = e.response
|
20
23
|
puts "Error from doing #{r.args[:method].to_s.upcase} #{r.args[:url]}"
|
data/lib/razor/cli/navigate.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'rest-client'
|
2
2
|
require 'json'
|
3
|
+
require 'yaml'
|
3
4
|
|
4
5
|
module Razor::CLI
|
5
6
|
class Navigate
|
@@ -63,10 +64,10 @@ module Razor::CLI
|
|
63
64
|
body = {}
|
64
65
|
until @segments.empty?
|
65
66
|
if @segments.shift =~ /\A--([a-z-]+)(=(\S+))?\Z/
|
66
|
-
body[$1] = ($3 || @segments.shift)
|
67
|
+
body[$1] = convert_arg(cmd["name"], $1, ($3 || @segments.shift))
|
67
68
|
end
|
68
69
|
end
|
69
|
-
#
|
70
|
+
# Parse JSON-valued arguments
|
70
71
|
if cmd["name"] == "create-tag" && body["rule"]
|
71
72
|
body["rule"] = JSON::parse(body["rule"])
|
72
73
|
end
|
@@ -114,5 +115,20 @@ module Razor::CLI
|
|
114
115
|
puts "POST #{url.to_s}\n#{body}\n-->\n#{response.body}" if @parse.dump_response?
|
115
116
|
JSON::parse(response.body)
|
116
117
|
end
|
118
|
+
|
119
|
+
private
|
120
|
+
def self.annotations
|
121
|
+
@@annotations ||=
|
122
|
+
YAML::load_file(File::join(File::dirname(__FILE__), "navigate.yaml"))
|
123
|
+
end
|
124
|
+
|
125
|
+
def self.arg_type(cmd_name, arg_name)
|
126
|
+
cmd = annotations["commands"][cmd_name]
|
127
|
+
cmd && cmd["args"][arg_name]
|
128
|
+
end
|
129
|
+
|
130
|
+
def convert_arg(cmd_name, arg_name, value)
|
131
|
+
self.class.arg_type(cmd_name, arg_name) == "json" ? JSON::parse(value) : value
|
132
|
+
end
|
117
133
|
end
|
118
134
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
---
|
2
|
+
|
3
|
+
# This file helps Razor::CLI::Navigate with a few things by annotating the
|
4
|
+
# API. Ultimately, this should be something the server provides. But until
|
5
|
+
# we better understand what sort of annotation we need from the server,
|
6
|
+
# we'll keep this with the client.
|
7
|
+
|
8
|
+
commands:
|
9
|
+
create-tag:
|
10
|
+
args:
|
11
|
+
rule: json
|
12
|
+
update-tag-rule:
|
13
|
+
args:
|
14
|
+
rule: json
|
data/lib/razor/cli/parse.rb
CHANGED
@@ -4,6 +4,8 @@ require 'optparse'
|
|
4
4
|
module Razor::CLI
|
5
5
|
|
6
6
|
class Parse
|
7
|
+
DEFAULT_RAZOR_API = "http://localhost:8080/api"
|
8
|
+
|
7
9
|
def get_optparse
|
8
10
|
@optparse ||= OptionParser.new do |opts|
|
9
11
|
opts.banner = "Usage: razor [FLAGS] NAVIGATION\n"
|
@@ -13,8 +15,11 @@ module Razor::CLI
|
|
13
15
|
@dump = true
|
14
16
|
end
|
15
17
|
|
16
|
-
opts.on "-U", "--url URL",
|
17
|
-
|
18
|
+
opts.on "-U", "--url URL",
|
19
|
+
"The full Razor API URL, can also be set\n" + " "*37 +
|
20
|
+
"with the RAZOR_API environment variable\n" + " "*37 +
|
21
|
+
"(default #{DEFAULT_RAZOR_API})" do |url|
|
22
|
+
parse_and_set_api_url(url, :opts)
|
18
23
|
end
|
19
24
|
|
20
25
|
opts.on "-h", "--help", "Show this screen" do
|
@@ -33,8 +38,13 @@ module Razor::CLI
|
|
33
38
|
|
34
39
|
def help
|
35
40
|
output = get_optparse.to_s
|
36
|
-
|
37
|
-
|
41
|
+
begin
|
42
|
+
output << list_things("collections", navigate.collections)
|
43
|
+
output << list_things("commands", navigate.commands)
|
44
|
+
rescue
|
45
|
+
output << "\nCould not connect to the server at #{@api_url}. More help is available after "
|
46
|
+
output << "pointing\nthe client to a Razor server"
|
47
|
+
end
|
38
48
|
output
|
39
49
|
end
|
40
50
|
|
@@ -49,7 +59,7 @@ module Razor::CLI
|
|
49
59
|
attr_reader :api_url
|
50
60
|
|
51
61
|
def initialize(args)
|
52
|
-
|
62
|
+
parse_and_set_api_url(ENV["RAZOR_API"] || DEFAULT_RAZOR_API, :env)
|
53
63
|
@args = args.dup
|
54
64
|
rest = get_optparse.order(args)
|
55
65
|
if rest.any?
|
@@ -62,5 +72,14 @@ module Razor::CLI
|
|
62
72
|
def navigate
|
63
73
|
@navigate ||=Navigate.new(self, @navigation)
|
64
74
|
end
|
75
|
+
|
76
|
+
private
|
77
|
+
def parse_and_set_api_url(url, source)
|
78
|
+
begin
|
79
|
+
@api_url = URI.parse(url)
|
80
|
+
rescue URI::InvalidURIError => e
|
81
|
+
raise Razor::CLI::InvalidURIError.new(url, source)
|
82
|
+
end
|
83
|
+
end
|
65
84
|
end
|
66
85
|
end
|
data/lib/razor/cli.rb
CHANGED
@@ -12,6 +12,20 @@ module Razor
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
15
|
+
|
16
|
+
class InvalidURIError < Error
|
17
|
+
def initialize(url, type)
|
18
|
+
case type
|
19
|
+
when :env
|
20
|
+
super "URL '#{url}' in ENV variable RAZOR_API is not valid"
|
21
|
+
when :opts
|
22
|
+
super "URL '#{url}' provided by -U or --url is not valid"
|
23
|
+
else
|
24
|
+
super "URL '#{url}' is not valid"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
15
29
|
end
|
16
30
|
end
|
17
31
|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "razor-client"
|
7
|
+
spec.version = "0.11.0"
|
8
|
+
spec.authors = ["Puppet Labs"]
|
9
|
+
spec.email = ["info@puppetlabs.com"]
|
10
|
+
spec.description = "The client for the Razor server"
|
11
|
+
spec.summary = "The client for everybody's favorite provisioning tool"
|
12
|
+
spec.homepage = "https://github.com/puppetlabs/razor-client"
|
13
|
+
spec.license = "ASL2"
|
14
|
+
|
15
|
+
spec.files = `git ls-files`.split($/)
|
16
|
+
spec.bindir = "bin"
|
17
|
+
spec.executables = ['razor']
|
18
|
+
spec.test_files = spec.files.grep(%r{^spec/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "rest-client"
|
22
|
+
spec.add_dependency "terminal-table"
|
23
|
+
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
25
|
+
spec.add_development_dependency "rake"
|
26
|
+
end
|
data/spec/cli/parse_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require "rspec/expectations"
|
1
2
|
require_relative '../spec_helper'
|
2
3
|
|
3
4
|
describe Razor::CLI::Parse do
|
@@ -24,6 +25,30 @@ describe Razor::CLI::Parse do
|
|
24
25
|
url = 'http://razor.example.com:2150/path/to/api'
|
25
26
|
parse('-U',url).api_url.to_s.should == url
|
26
27
|
end
|
28
|
+
|
29
|
+
it "should terminate with an error if an invalid URL is provided" do
|
30
|
+
expect{parse('-U','not valid url')}.to raise_error(Razor::CLI::InvalidURIError)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "with ENV RAZOR_API set" do
|
35
|
+
it "should use the given URL" do
|
36
|
+
url = 'http://razor.example.com:2150/env/path/to/api'
|
37
|
+
ENV["RAZOR_API"] = url
|
38
|
+
parse.api_url.to_s.should == url
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should use -U before ENV" do
|
42
|
+
env_url = 'http://razor.example.com:2150/env/path/to/api'
|
43
|
+
url = 'http://razor.example.com:2150/path/to/api'
|
44
|
+
ENV["RAZOR_API"] = env_url
|
45
|
+
parse('-U',url).api_url.to_s.should == url
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should terminate with an error if an invalid URL is provided" do
|
49
|
+
ENV["RAZOR_API"] = 'not valid url'
|
50
|
+
expect{parse}.to raise_error(Razor::CLI::InvalidURIError)
|
51
|
+
end
|
27
52
|
end
|
28
53
|
|
29
54
|
describe "#help", :vcr do
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: razor-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
|
-
-
|
8
|
+
- Puppet Labs
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-11-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-client
|
@@ -77,7 +77,7 @@ dependencies:
|
|
77
77
|
version: '0'
|
78
78
|
description: The client for the Razor server
|
79
79
|
email:
|
80
|
-
-
|
80
|
+
- info@puppetlabs.com
|
81
81
|
executables:
|
82
82
|
- razor
|
83
83
|
extensions: []
|
@@ -95,7 +95,9 @@ files:
|
|
95
95
|
- lib/razor/cli.rb
|
96
96
|
- lib/razor/cli/format.rb
|
97
97
|
- lib/razor/cli/navigate.rb
|
98
|
+
- lib/razor/cli/navigate.yaml
|
98
99
|
- lib/razor/cli/parse.rb
|
100
|
+
- razor-client.gemspec
|
99
101
|
- spec/cli/navigate_spec.rb
|
100
102
|
- spec/cli/parse_spec.rb
|
101
103
|
- spec/fixtures/vcr/Razor_CLI_Navigate/with_a_single_item_path/.yml
|
@@ -129,7 +131,7 @@ rubyforge_project:
|
|
129
131
|
rubygems_version: 1.8.23
|
130
132
|
signing_key:
|
131
133
|
specification_version: 3
|
132
|
-
summary: The client for
|
134
|
+
summary: The client for everybody's favorite provisioning tool
|
133
135
|
test_files:
|
134
136
|
- spec/cli/navigate_spec.rb
|
135
137
|
- spec/cli/parse_spec.rb
|