plz 0.0.6 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +32 -9
- data/lib/plz.rb +10 -1
- data/lib/plz/arguments.rb +1 -1
- data/lib/plz/command_builder.rb +50 -38
- data/lib/plz/commands/base_url_not_found.rb +13 -0
- data/lib/plz/commands/help.rb +30 -0
- data/lib/plz/commands/invalid_schema.rb +20 -0
- data/lib/plz/commands/link_not_found.rb +15 -0
- data/lib/plz/commands/no_action_name.rb +9 -0
- data/lib/plz/commands/no_target_name.rb +9 -0
- data/lib/plz/commands/request.rb +61 -0
- data/lib/plz/commands/schema_file_not_found.rb +9 -0
- data/lib/plz/commands/undecodable_schema_file.rb +13 -0
- data/lib/plz/commands/unparsable_json_param.rb +13 -0
- data/lib/plz/error.rb +2 -58
- data/lib/plz/version.rb +1 -1
- metadata +11 -2
- data/lib/plz/command.rb +0 -59
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74ec91c41138b2f96d02372d1166737067d0bb1a
|
4
|
+
data.tar.gz: 3f8766d51ffb4bc9dd2e72bc318de6d0fd3c02b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d87b4bd04dfa82276006b3e1340b6f2b34250fc4403d6b74895de0d967ea5fe9eb401422afa63b6ac1947bad3770ad1df653fd9cdb78b065828e65d7b4c81c4c
|
7
|
+
data.tar.gz: 442b673abd50fafd745cd3996e4c436ebb8de0f7cb3b28711ece3d7a3f0adc97284332a7efc5c3cbf6c3fb8aa696cf3b2ac6fb46c9b68b0fba5761f23da4d477
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -10,19 +10,20 @@ $ gem install plz
|
|
10
10
|
|
11
11
|
### Synopsis
|
12
12
|
```sh
|
13
|
-
$ plz <action> <target> [headers|params]
|
13
|
+
$ plz <action> <target> [headers|params] [options]
|
14
|
+
| | | | |
|
15
|
+
| | | | `-- --no-response-header
|
16
|
+
| | | | --no-response-body
|
17
|
+
| | | | --no-color
|
18
|
+
| | | | --help, -h
|
14
19
|
| | | |
|
15
|
-
| | |
|
16
|
-
| | | params can be:
|
17
|
-
| | | * URI Template variable
|
18
|
-
| | | * Query string in GET method
|
19
|
-
| | | * Request body in other methods
|
20
|
+
| | | `---------- key=value or key:=value
|
20
21
|
| | |
|
21
|
-
| |
|
22
|
+
| | `----------------- Key:value
|
22
23
|
| |
|
23
|
-
|
|
24
|
+
| `--------------------------- target name
|
24
25
|
|
|
25
|
-
|
26
|
+
`------------------------------------ action name
|
26
27
|
```
|
27
28
|
|
28
29
|
### Schema
|
@@ -31,6 +32,28 @@ that describes about the API where you want to send HTTP request.
|
|
31
32
|
Plz interprets command-line arguments based on that JSON Schema, then sends HTTP request.
|
32
33
|
See [schema.yml](schema.yml) as an example.
|
33
34
|
|
35
|
+
### Headers
|
36
|
+
To set custom request headers you can use `Key:value` syntax in command line argument.
|
37
|
+
|
38
|
+
```sh
|
39
|
+
$ plz list user Api-Access-Token:123
|
40
|
+
```
|
41
|
+
|
42
|
+
### Params
|
43
|
+
Params are used for the following purpose:
|
44
|
+
|
45
|
+
* URI Template variables
|
46
|
+
* Query string in GET method
|
47
|
+
* Request body in other methods
|
48
|
+
|
49
|
+
You can set params by `key=value` or `key:=value` syntax in command line argument.
|
50
|
+
`key=value` is parsed into String value,
|
51
|
+
while `key:=value` is parsed into JSON value (e.g. key:=17 will be `{"key":17}`).
|
52
|
+
|
53
|
+
```sh
|
54
|
+
$ plz create user name=alice age:=17
|
55
|
+
```
|
56
|
+
|
34
57
|
### Example
|
35
58
|
```sh
|
36
59
|
# GET /users
|
data/lib/plz.rb
CHANGED
@@ -16,8 +16,17 @@ require "yaml"
|
|
16
16
|
|
17
17
|
require "plz/error"
|
18
18
|
require "plz/arguments"
|
19
|
-
require "plz/command"
|
20
19
|
require "plz/command_builder"
|
20
|
+
require "plz/commands/base_url_not_found"
|
21
|
+
require "plz/commands/help"
|
22
|
+
require "plz/commands/invalid_schema"
|
23
|
+
require "plz/commands/link_not_found"
|
24
|
+
require "plz/commands/no_action_name"
|
25
|
+
require "plz/commands/no_target_name"
|
26
|
+
require "plz/commands/request"
|
27
|
+
require "plz/commands/schema_file_not_found"
|
28
|
+
require "plz/commands/undecodable_schema_file"
|
29
|
+
require "plz/commands/unparsable_json_param"
|
21
30
|
require "plz/error_command"
|
22
31
|
require "plz/response_renderer"
|
23
32
|
require "plz/version"
|
data/lib/plz/arguments.rb
CHANGED
@@ -18,7 +18,7 @@ module Plz
|
|
18
18
|
# @return [Hash] Params parsed from given arguments
|
19
19
|
# @raise [Plz::UnparsableJsonParam]
|
20
20
|
def params
|
21
|
-
ARGV[2..-1].inject({}) do |result, section|
|
21
|
+
@params ||= ARGV[2..-1].inject({}) do |result, section|
|
22
22
|
case
|
23
23
|
when /(?<key>.+):=(?<value>.+)/ =~ section
|
24
24
|
begin
|
data/lib/plz/command_builder.rb
CHANGED
@@ -26,42 +26,56 @@ module Plz
|
|
26
26
|
|
27
27
|
# @return [Plz::Command] Callable command object
|
28
28
|
def call
|
29
|
-
exit_if_help
|
30
|
-
validate!
|
31
|
-
Command.new(
|
32
|
-
method: method,
|
33
|
-
base_url: base_url,
|
34
|
-
path: path,
|
35
|
-
headers: headers,
|
36
|
-
params: request_params,
|
37
|
-
options: options,
|
38
|
-
)
|
39
|
-
rescue Error => error
|
40
|
-
ErrorCommand.new(error)
|
41
|
-
end
|
42
|
-
|
43
|
-
private
|
44
|
-
|
45
|
-
# @raise [Plz::Error] Raises if invalid arguments given
|
46
|
-
def validate!
|
47
29
|
case
|
48
|
-
when !has_action_name?
|
49
|
-
raise NoActionName
|
50
|
-
when !has_target_name?
|
51
|
-
raise NoTargetName
|
52
30
|
when !has_schema_file?
|
53
|
-
|
31
|
+
Commands::SchemaFileNotFound.new
|
54
32
|
when !has_decodable_schema_file?
|
55
|
-
|
33
|
+
Commands::UndecodableSchemaFile.new(pathname: schema_file_pathname)
|
56
34
|
when !has_valid_schema_file?
|
57
|
-
|
35
|
+
Commands::InvalidSchema.new(pathname: schema_file_pathname, error: @json_schema_error)
|
58
36
|
when !has_base_url?
|
59
|
-
|
37
|
+
Commands::BaseUrlNotFound.new(pathname: schema_file_pathname)
|
38
|
+
when has_help?
|
39
|
+
Commands::Help.new(options: options, schema: json_schema)
|
40
|
+
when !has_action_name?
|
41
|
+
Commands::NoActionName.new
|
42
|
+
when !has_target_name?
|
43
|
+
Commands::NoTargetName.new
|
60
44
|
when !has_link?
|
61
|
-
|
45
|
+
Commands::LinkNotFound.new(
|
46
|
+
pathname: schema_file_pathname,
|
47
|
+
action_name: action_name,
|
48
|
+
target_name: target_name
|
49
|
+
)
|
50
|
+
when has_unparsable_json_param?
|
51
|
+
Commands::UnparsableJsonParam.new(error: @json_parse_error)
|
52
|
+
else
|
53
|
+
Commands::Request.new(
|
54
|
+
method: method,
|
55
|
+
base_url: base_url,
|
56
|
+
path: path,
|
57
|
+
headers: headers,
|
58
|
+
params: request_params,
|
59
|
+
options: options,
|
60
|
+
)
|
62
61
|
end
|
63
62
|
end
|
64
63
|
|
64
|
+
private
|
65
|
+
|
66
|
+
def has_unparsable_json_param?
|
67
|
+
params
|
68
|
+
false
|
69
|
+
rescue UnparsableJsonParam => exception
|
70
|
+
@json_parse_error = exception
|
71
|
+
true
|
72
|
+
end
|
73
|
+
|
74
|
+
# @return [true, false] True if --help or -h given
|
75
|
+
def has_help?
|
76
|
+
options[:help]
|
77
|
+
end
|
78
|
+
|
65
79
|
# @return [true, false] True if given arguments include action name
|
66
80
|
def has_action_name?
|
67
81
|
!!action_name
|
@@ -79,7 +93,7 @@ module Plz
|
|
79
93
|
|
80
94
|
# @return [true, false] True if no error occured in parsing schema file as JSON Schema
|
81
95
|
def has_valid_schema_file?
|
82
|
-
|
96
|
+
!json_schema.nil?
|
83
97
|
end
|
84
98
|
|
85
99
|
# @return [true, false] True if no error occured in decoding schema file
|
@@ -195,7 +209,9 @@ module Plz
|
|
195
209
|
# @return [JsonSchema::Schema, nil]
|
196
210
|
def json_schema
|
197
211
|
@json_schema ||= JsonSchema.parse!(@schema).tap(&:expand_references!)
|
198
|
-
rescue
|
212
|
+
rescue => exception
|
213
|
+
@json_schema_error = exception
|
214
|
+
nil
|
199
215
|
end
|
200
216
|
|
201
217
|
# @return [Plz::Arguments] Wrapper of Raw ARGV
|
@@ -205,17 +221,13 @@ module Plz
|
|
205
221
|
|
206
222
|
# @return [Hash] Command line options
|
207
223
|
def options
|
208
|
-
@options ||= Slop.parse!(@argv
|
224
|
+
@options ||= Slop.parse!(@argv) do
|
209
225
|
banner Error::USAGE
|
210
|
-
on "
|
211
|
-
on "no-response-body", "Hide response body"
|
226
|
+
on "h", "help", "Display help message"
|
212
227
|
on "no-color", "Disable coloring output"
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
# Display the help message and exits the program if --help or -h given
|
217
|
-
def exit_if_help
|
218
|
-
options
|
228
|
+
on "no-response-body", "Hide response body"
|
229
|
+
on "no-response-header", "Hide response header"
|
230
|
+
end
|
219
231
|
end
|
220
232
|
end
|
221
233
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Plz
|
2
|
+
module Commands
|
3
|
+
class Help
|
4
|
+
# @param options [Slop]
|
5
|
+
# @param schema [JsonSchema::Schema]
|
6
|
+
def initialize(options: nil, schema: nil)
|
7
|
+
@options = options
|
8
|
+
@schema = schema
|
9
|
+
end
|
10
|
+
|
11
|
+
# Logs out help message
|
12
|
+
def call
|
13
|
+
puts %<#{@options}\nExamples:\n#{links.join("\n")}>
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
# @return [Array<String>]
|
19
|
+
def links
|
20
|
+
@schema.properties.map do |target_name, schema|
|
21
|
+
schema.links.map do |link|
|
22
|
+
if link.href && link.method && link.title
|
23
|
+
" plz #{link.title.underscore} #{target_name.underscore}"
|
24
|
+
end
|
25
|
+
end.compact
|
26
|
+
end.flatten
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Plz
|
2
|
+
module Commands
|
3
|
+
class InvalidSchema
|
4
|
+
def initialize(pathname: nil, error: error)
|
5
|
+
@pathname = pathname
|
6
|
+
@error = error
|
7
|
+
end
|
8
|
+
|
9
|
+
def call
|
10
|
+
puts "#{@pathname} was invalid:#{error_message}"
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def error_message
|
16
|
+
@error.to_s.gsub("#: ", "\n")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Plz
|
2
|
+
module Commands
|
3
|
+
class LinkNotFound
|
4
|
+
def initialize(pathname: nil, action_name: action_name, target_name: target_name)
|
5
|
+
@pathname = pathname
|
6
|
+
@action_name = action_name
|
7
|
+
@target_name = target_name
|
8
|
+
end
|
9
|
+
|
10
|
+
def call
|
11
|
+
puts "#{@pathname} has no definition for `#{@action_name} #{@target_name}`"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Plz
|
2
|
+
module Commands
|
3
|
+
class Request
|
4
|
+
# @param headers [Hash]
|
5
|
+
# @param params [Hash]
|
6
|
+
# @param method [String]
|
7
|
+
# @param base_url [String]
|
8
|
+
# @param path [String]
|
9
|
+
# @param options [Hash]
|
10
|
+
def initialize(headers: nil, params: nil, method: nil, base_url: nil, path: nil, options: nil)
|
11
|
+
@headers = headers
|
12
|
+
@params = params
|
13
|
+
@method = method
|
14
|
+
@base_url = base_url
|
15
|
+
@path = path
|
16
|
+
@options = options
|
17
|
+
end
|
18
|
+
|
19
|
+
# Sends an HTTP request and logs out the response
|
20
|
+
def call
|
21
|
+
response = client.send(@method.downcase, @path, @params, @headers)
|
22
|
+
print ResponseRenderer.call(
|
23
|
+
status: response.status,
|
24
|
+
headers: response.headers,
|
25
|
+
body: response.body,
|
26
|
+
response_header: flag_to_show_response_header,
|
27
|
+
response_body: flag_to_show_response_body,
|
28
|
+
color: flag_to_color_response,
|
29
|
+
)
|
30
|
+
rescue Faraday::ConnectionFailed => exception
|
31
|
+
puts exception
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
# @return [Faraday::Connection]
|
37
|
+
def client
|
38
|
+
Faraday.new(url: @base_url) do |connection|
|
39
|
+
connection.request :json
|
40
|
+
connection.response :json
|
41
|
+
connection.adapter :net_http
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# @return [true, false]
|
46
|
+
def flag_to_show_response_header
|
47
|
+
!@options[:"no-response-header"]
|
48
|
+
end
|
49
|
+
|
50
|
+
# @return [true, false]
|
51
|
+
def flag_to_show_response_body
|
52
|
+
!@options[:"no-response-body"]
|
53
|
+
end
|
54
|
+
|
55
|
+
# @return [true, false]
|
56
|
+
def flag_to_color_response
|
57
|
+
!@options[:"no-color"]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/lib/plz/error.rb
CHANGED
@@ -3,67 +3,11 @@ module Plz
|
|
3
3
|
USAGE = "Usage: plz <action> <target> [headers|params] [options]"
|
4
4
|
end
|
5
5
|
|
6
|
-
class NoActionName < Error
|
7
|
-
def to_s
|
8
|
-
"You didn't pass action name\n#{USAGE}"
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class NoTargetName < Error
|
13
|
-
def to_s
|
14
|
-
"You didn't pass target name\n#{USAGE}"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
class SchemaFileNotFound < Error
|
19
|
-
def to_s
|
20
|
-
"Schema file was not found in #{SCHEMA_FILE_PATH_PATTERN}"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
6
|
class UnparsableJsonParam < Error
|
7
|
+
attr_reader :value
|
8
|
+
|
25
9
|
def initialize(value: nil)
|
26
10
|
@value = value
|
27
11
|
end
|
28
|
-
|
29
|
-
def to_s
|
30
|
-
"Given `#{@value}` was not valid as JSON"
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
class InvalidSchema < Error
|
35
|
-
def initialize(pathname: nil)
|
36
|
-
@pathname = pathname
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
class UndecodableSchemaFile < InvalidSchema
|
41
|
-
def to_s
|
42
|
-
"Failed to decode #{@pathname}"
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
class InvalidSchemaFile < InvalidSchema
|
47
|
-
def to_s
|
48
|
-
"#{@pathname} was invalid JSON Schema"
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
class BaseUrlNotFound < InvalidSchema
|
53
|
-
def to_s
|
54
|
-
"#{@pathname} has no base URL at top-level links property"
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
class LinkNotFound < InvalidSchema
|
59
|
-
def initialize(action_name: action_name, target_name: target_name, **args)
|
60
|
-
super(**args)
|
61
|
-
@action_name = action_name
|
62
|
-
@target_name = target_name
|
63
|
-
end
|
64
|
-
|
65
|
-
def to_s
|
66
|
-
"#{@pathname} has no definition for `#{@action_name} #{@target_name}`"
|
67
|
-
end
|
68
12
|
end
|
69
13
|
end
|
data/lib/plz/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: plz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryo Nakamura
|
@@ -196,8 +196,17 @@ files:
|
|
196
196
|
- images/screenshot.png
|
197
197
|
- lib/plz.rb
|
198
198
|
- lib/plz/arguments.rb
|
199
|
-
- lib/plz/command.rb
|
200
199
|
- lib/plz/command_builder.rb
|
200
|
+
- lib/plz/commands/base_url_not_found.rb
|
201
|
+
- lib/plz/commands/help.rb
|
202
|
+
- lib/plz/commands/invalid_schema.rb
|
203
|
+
- lib/plz/commands/link_not_found.rb
|
204
|
+
- lib/plz/commands/no_action_name.rb
|
205
|
+
- lib/plz/commands/no_target_name.rb
|
206
|
+
- lib/plz/commands/request.rb
|
207
|
+
- lib/plz/commands/schema_file_not_found.rb
|
208
|
+
- lib/plz/commands/undecodable_schema_file.rb
|
209
|
+
- lib/plz/commands/unparsable_json_param.rb
|
201
210
|
- lib/plz/error.rb
|
202
211
|
- lib/plz/error_command.rb
|
203
212
|
- lib/plz/response_renderer.rb
|
data/lib/plz/command.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
module Plz
|
2
|
-
class Command
|
3
|
-
# @param headers [Hash]
|
4
|
-
# @param params [Hash]
|
5
|
-
# @param method [String]
|
6
|
-
# @param base_url [String]
|
7
|
-
# @param path [String]
|
8
|
-
# @param options [Hash]
|
9
|
-
def initialize(headers: nil, params: nil, method: nil, base_url: nil, path: nil, options: nil)
|
10
|
-
@headers = headers
|
11
|
-
@params = params
|
12
|
-
@method = method
|
13
|
-
@base_url = base_url
|
14
|
-
@path = path
|
15
|
-
@options = options
|
16
|
-
end
|
17
|
-
|
18
|
-
# Sends an HTTP request and logs out the response
|
19
|
-
def call
|
20
|
-
response = client.send(@method.downcase, @path, @params, @headers)
|
21
|
-
print ResponseRenderer.call(
|
22
|
-
status: response.status,
|
23
|
-
headers: response.headers,
|
24
|
-
body: response.body,
|
25
|
-
response_header: flag_to_show_response_header,
|
26
|
-
response_body: flag_to_show_response_body,
|
27
|
-
color: flag_to_color_response,
|
28
|
-
)
|
29
|
-
rescue Faraday::ConnectionFailed => exception
|
30
|
-
puts exception
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
# @return [Faraday::Connection]
|
36
|
-
def client
|
37
|
-
Faraday.new(url: @base_url) do |connection|
|
38
|
-
connection.request :json
|
39
|
-
connection.response :json
|
40
|
-
connection.adapter :net_http
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
# @return [true, false]
|
45
|
-
def flag_to_show_response_header
|
46
|
-
!@options[:"no-response-header"]
|
47
|
-
end
|
48
|
-
|
49
|
-
# @return [true, false]
|
50
|
-
def flag_to_show_response_body
|
51
|
-
!@options[:"no-response-body"]
|
52
|
-
end
|
53
|
-
|
54
|
-
# @return [true, false]
|
55
|
-
def flag_to_color_response
|
56
|
-
!@options[:"no-color"]
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|