plz 0.0.6 → 0.0.8
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.
- 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
|