plz 0.0.3 → 0.0.5
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 +2 -1
- data/images/screenshot.png +0 -0
- data/lib/plz.rb +4 -0
- data/lib/plz/arguments.rb +49 -0
- data/lib/plz/command_builder.rb +44 -77
- data/lib/plz/error.rb +65 -0
- data/lib/plz/version.rb +1 -1
- data/plz.gemspec +2 -0
- data/schema.yml +2 -2
- data/spec/plz_spec.rb +5 -0
- data/spec/spec_helper.rb +7 -0
- metadata +37 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f5260f7a973909cd914441eb5b29d5611e6a1aff
|
4
|
+
data.tar.gz: 501f2095a5c66ff2b40ec1ebe742f6ded54f3f4e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f29827446649900133e5fd58ce91086434fbd4a3f0d7454876b6d298ca83dc4a3b35a9f94665caae6875139f636015f4556f8b81ab7bf112c804aa5bfbe3e689
|
7
|
+
data.tar.gz: 0432bc2eb51b8efc96ca242a612d05d3d64a568aa99f2594834bbbe0232f6f832d3fbd8782aa0cdb3de737c3a56d6ae62db1f09e14ec31dec6a8d5f47ea19a17
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Plz
|
2
2
|
JSON Schema based command line HTTP client.
|
3
3
|
|
4
|
-
|
4
|
+

|
5
5
|
|
6
6
|
### Install
|
7
7
|
```sh
|
@@ -29,6 +29,7 @@ $ plz <action> <target> [headers|params]
|
|
29
29
|
To use Plz, you need to have a JSON Schema file at `./schema.json` or `./schema.yaml`,
|
30
30
|
that describes about the API where you want to send HTTP request.
|
31
31
|
Plz interprets command-line arguments based on that JSON Schema, then sends HTTP request.
|
32
|
+
See [schema.yml](schema.yml) as an example.
|
32
33
|
|
33
34
|
### Example
|
34
35
|
```sh
|
Binary file
|
data/lib/plz.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require "active_support/core_ext/hash/keys"
|
2
|
+
require "active_support/core_ext/hash/slice"
|
3
|
+
require "active_support/core_ext/module/delegation"
|
1
4
|
require "active_support/core_ext/string/inflections"
|
2
5
|
require "active_support/core_ext/string/strip"
|
3
6
|
require "faraday"
|
@@ -11,6 +14,7 @@ require "rouge"
|
|
11
14
|
require "yaml"
|
12
15
|
|
13
16
|
require "plz/error"
|
17
|
+
require "plz/arguments"
|
14
18
|
require "plz/command"
|
15
19
|
require "plz/command_builder"
|
16
20
|
require "plz/error_command"
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Plz
|
2
|
+
class Arguments
|
3
|
+
# @param arguments [Array] Raw ARGV
|
4
|
+
def initialize(argv)
|
5
|
+
@argv = argv
|
6
|
+
end
|
7
|
+
|
8
|
+
# @return [String, nil] Given action name
|
9
|
+
def action_name
|
10
|
+
ARGV[0]
|
11
|
+
end
|
12
|
+
|
13
|
+
# @return [String, nil] Given target name
|
14
|
+
def target_name
|
15
|
+
ARGV[1]
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [Hash] Params parsed from given arguments
|
19
|
+
# @raise [Plz::UnparsableJsonParam]
|
20
|
+
def params
|
21
|
+
ARGV[2..-1].inject({}) do |result, section|
|
22
|
+
case
|
23
|
+
when /(?<key>.+):=(?<value>.+)/ =~ section
|
24
|
+
begin
|
25
|
+
result.merge(key => JSON.parse(%<{"key":#{value}}>)["key"])
|
26
|
+
rescue JSON::ParserError
|
27
|
+
raise UnparsableJsonParam, value: value
|
28
|
+
end
|
29
|
+
when /(?<key>.+)=(?<value>.+)/ =~ section
|
30
|
+
result.merge(key => value)
|
31
|
+
else
|
32
|
+
result
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# @return [Hash] Headers parsed from given arguments
|
38
|
+
def headers
|
39
|
+
ARGV[2..-1].inject({}) do |result, section|
|
40
|
+
case
|
41
|
+
when /(?<key>.+):(?<value>[^=]+)/ =~ section
|
42
|
+
result.merge(key => value)
|
43
|
+
else
|
44
|
+
result
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/plz/command_builder.rb
CHANGED
@@ -10,9 +10,17 @@ module Plz
|
|
10
10
|
new(arguments).call
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
delegate(
|
14
|
+
:action_name,
|
15
|
+
:target_name,
|
16
|
+
:headers,
|
17
|
+
:params,
|
18
|
+
to: :arguments,
|
19
|
+
)
|
20
|
+
|
21
|
+
# @param argv [Array<String>] Raw ARGV
|
22
|
+
def initialize(argv)
|
23
|
+
@argv = argv
|
16
24
|
end
|
17
25
|
|
18
26
|
# @return [Plz::Command] Callable command object
|
@@ -23,7 +31,7 @@ module Plz
|
|
23
31
|
base_url: base_url,
|
24
32
|
path: path,
|
25
33
|
headers: headers,
|
26
|
-
params:
|
34
|
+
params: request_params,
|
27
35
|
)
|
28
36
|
rescue Error => error
|
29
37
|
ErrorCommand.new(error)
|
@@ -109,32 +117,44 @@ module Plz
|
|
109
117
|
@schema_file_pathname ||= Pathname.glob(SCHEMA_FILE_PATH_PATTERN).first
|
110
118
|
end
|
111
119
|
|
112
|
-
# @return [String
|
113
|
-
|
114
|
-
|
120
|
+
# @return [String]
|
121
|
+
# @example
|
122
|
+
# path #=> "/users"
|
123
|
+
def path
|
124
|
+
path_with_template % path_params.symbolize_keys
|
115
125
|
end
|
116
126
|
|
117
|
-
# @return [String
|
118
|
-
|
119
|
-
|
127
|
+
# @return [String]
|
128
|
+
# @example
|
129
|
+
# path_with_template #=> "/apps/%{id}"
|
130
|
+
def path_with_template
|
131
|
+
link.href.gsub(/{(.+)}/) do |matched|
|
132
|
+
key = CGI.unescape($1).gsub(/[()]/, "").split("/").last
|
133
|
+
"%{#{key}}"
|
134
|
+
end
|
120
135
|
end
|
121
136
|
|
122
|
-
#
|
123
|
-
# @
|
124
|
-
|
125
|
-
|
137
|
+
# @return [Array<String>] Parameter names required for path
|
138
|
+
# @exmaple
|
139
|
+
# path_keys #=> ["id"]
|
140
|
+
def path_keys
|
141
|
+
link.href.scan(/{(.+)}/).map do |str|
|
142
|
+
CGI.unescape($1).gsub(/[()]/, "").split("/").last
|
143
|
+
end
|
126
144
|
end
|
127
145
|
|
128
|
-
#
|
129
|
-
# @
|
130
|
-
|
146
|
+
# @return [Hash] Params to be embedded into path
|
147
|
+
# @example
|
148
|
+
# path_params #=> { "id" => 1 }
|
149
|
+
def path_params
|
150
|
+
params.slice(*path_keys)
|
131
151
|
end
|
132
152
|
|
133
|
-
# @return [
|
153
|
+
# @return [Hash] Params to be used for request body or query string
|
134
154
|
# @example
|
135
|
-
#
|
136
|
-
def
|
137
|
-
|
155
|
+
# request_params #=> { "name" => "example" }
|
156
|
+
def request_params
|
157
|
+
params.except(*path_keys)
|
138
158
|
end
|
139
159
|
|
140
160
|
# @return [String]
|
@@ -175,62 +195,9 @@ module Plz
|
|
175
195
|
rescue JsonSchema::SchemaError
|
176
196
|
end
|
177
197
|
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
class NoActionName < Error
|
183
|
-
def to_s
|
184
|
-
"You didn't pass action name\n#{USAGE}"
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
class NoTargetName < Error
|
189
|
-
def to_s
|
190
|
-
"You didn't pass target name\n#{USAGE}"
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
class SchemaFileNotFound < Error
|
195
|
-
def to_s
|
196
|
-
"Schema file was not found in #{SCHEMA_FILE_PATH_PATTERN}"
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
class InvalidSchema < Error
|
201
|
-
def initialize(pathname: pathname)
|
202
|
-
@pathname = pathname
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
|
-
class UndecodableSchemaFile < InvalidSchema
|
207
|
-
def to_s
|
208
|
-
"Failed to decode #{@pathname}"
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
|
-
class InvalidSchemaFile < InvalidSchema
|
213
|
-
def to_s
|
214
|
-
"#{@pathname} was invalid JSON Schema"
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
|
-
class BaseUrlNotFound < InvalidSchema
|
219
|
-
def to_s
|
220
|
-
"#{@pathname} has no base URL at top-level links property"
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
class LinkNotFound < InvalidSchema
|
225
|
-
def initialize(action_name: action_name, target_name: target_name, **args)
|
226
|
-
super(**args)
|
227
|
-
@action_name = action_name
|
228
|
-
@target_name = target_name
|
229
|
-
end
|
230
|
-
|
231
|
-
def to_s
|
232
|
-
"#{@pathname} has no definition for `#{@action_name} #{@target_name}`"
|
233
|
-
end
|
198
|
+
# @return [Plz::Arguments] Wrapper of Raw ARGV
|
199
|
+
def arguments
|
200
|
+
@arguments ||= Arguments.new(@argv)
|
234
201
|
end
|
235
202
|
end
|
236
203
|
end
|
data/lib/plz/error.rb
CHANGED
@@ -1,4 +1,69 @@
|
|
1
1
|
module Plz
|
2
2
|
class Error < StandardError
|
3
|
+
USAGE = "Usage: plz <action> <target> [headers|params]"
|
4
|
+
end
|
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
|
+
class UnparsableJsonParam < Error
|
25
|
+
def initialize(value: nil)
|
26
|
+
@value = value
|
27
|
+
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
|
3
68
|
end
|
4
69
|
end
|
data/lib/plz/version.rb
CHANGED
data/plz.gemspec
CHANGED
@@ -25,4 +25,6 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_dependency "rouge"
|
26
26
|
spec.add_development_dependency "bundler", "~> 1.6"
|
27
27
|
spec.add_development_dependency "rake"
|
28
|
+
spec.add_development_dependency "rspec", "2.14.1"
|
29
|
+
spec.add_development_dependency "rack-json_schema"
|
28
30
|
end
|
data/schema.yml
CHANGED
data/spec/plz_spec.rb
ADDED
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryo Nakamura
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-06-
|
11
|
+
date: 2014-06-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -136,6 +136,34 @@ dependencies:
|
|
136
136
|
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rspec
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - '='
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 2.14.1
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - '='
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 2.14.1
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: rack-json_schema
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
139
167
|
description:
|
140
168
|
email:
|
141
169
|
- r7kamura@gmail.com
|
@@ -151,7 +179,9 @@ files:
|
|
151
179
|
- README.md
|
152
180
|
- Rakefile
|
153
181
|
- bin/plz
|
182
|
+
- images/screenshot.png
|
154
183
|
- lib/plz.rb
|
184
|
+
- lib/plz/arguments.rb
|
155
185
|
- lib/plz/command.rb
|
156
186
|
- lib/plz/command_builder.rb
|
157
187
|
- lib/plz/error.rb
|
@@ -160,6 +190,8 @@ files:
|
|
160
190
|
- lib/plz/version.rb
|
161
191
|
- plz.gemspec
|
162
192
|
- schema.yml
|
193
|
+
- spec/plz_spec.rb
|
194
|
+
- spec/spec_helper.rb
|
163
195
|
homepage: https://github.com/r7kamura/plz
|
164
196
|
licenses:
|
165
197
|
- MIT
|
@@ -184,5 +216,7 @@ rubygems_version: 2.2.2
|
|
184
216
|
signing_key:
|
185
217
|
specification_version: 4
|
186
218
|
summary: JSON Schema based command line HTTP client.
|
187
|
-
test_files:
|
219
|
+
test_files:
|
220
|
+
- spec/plz_spec.rb
|
221
|
+
- spec/spec_helper.rb
|
188
222
|
has_rdoc:
|