racli 0.1.1 → 0.1.2
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/.gitignore +1 -0
- data/.rubocop.yml +26 -0
- data/Gemfile +4 -2
- data/README.md +21 -2
- data/Rakefile +5 -3
- data/bin/console +4 -3
- data/exe/racli +2 -1
- data/lib/racli.rb +2 -0
- data/lib/racli/cli.rb +50 -22
- data/lib/racli/handlers/base.rb +2 -0
- data/lib/racli/handlers/debug_handler.rb +3 -1
- data/lib/racli/handlers/default_handler.rb +7 -7
- data/lib/racli/handlers/retry_handler.rb +3 -1
- data/lib/racli/option_parser.rb +5 -3
- data/lib/racli/rack.rb +2 -0
- data/lib/racli/version.rb +3 -1
- data/racli.gemspec +5 -3
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 692db1ac3147aa4605a0ea9d6ac4febb5d4f181e2c830bd76ffb4917efb4fd1f
|
4
|
+
data.tar.gz: 709d75e96471bff4864ed669c865d5b0e7e3a356292e5d9c379ca83e4059ecd8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 952da0b5d635090c3e3dc2da434b84fa0129139b1965e78130db49c770ab2cbc29282339cc5b4c8a0692f8f40bcc2287110019baca452eb543a2257feeb3b4d6
|
7
|
+
data.tar.gz: 67c415aa050b8b2676a0e143a74c2ad2a7b13818b18e51812cb4647ee1fe230726397f4f510d405b3fc42196d6c41e1da2402c5353f58afdbfb17f29be3f2a99
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.5
|
3
|
+
|
4
|
+
Lint/ShadowingOuterLocalVariable:
|
5
|
+
Exclude:
|
6
|
+
- 'lib/racli/cli.rb'
|
7
|
+
|
8
|
+
Metrics/AbcSize:
|
9
|
+
Max: 20
|
10
|
+
|
11
|
+
Metrics/MethodLength:
|
12
|
+
Max: 30
|
13
|
+
|
14
|
+
Security/Eval:
|
15
|
+
Exclude:
|
16
|
+
- 'lib/racli/cli.rb'
|
17
|
+
|
18
|
+
Style/Documentation:
|
19
|
+
Enabled: false
|
20
|
+
|
21
|
+
Style/TrivialAccessors:
|
22
|
+
Exclude:
|
23
|
+
- 'lib/racli/cli.rb'
|
24
|
+
|
25
|
+
Metrics/LineLength:
|
26
|
+
Max: 100
|
data/Gemfile
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
source 'https://rubygems.org'
|
4
|
+
|
5
|
+
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
4
6
|
|
5
7
|
# Specify your gem's dependencies in racli.gemspec
|
6
8
|
gemspec
|
data/README.md
CHANGED
@@ -25,9 +25,28 @@ put config.ru
|
|
25
25
|
run lambda { |env| [200, {}, ['hello']] }
|
26
26
|
```
|
27
27
|
|
28
|
-
Run
|
28
|
+
Run racli on directory where you put config.ru.
|
29
29
|
```bash
|
30
|
-
|
30
|
+
racli
|
31
|
+
```
|
32
|
+
|
33
|
+
By default, racli requests root path, that is '/', with GET method.
|
34
|
+
You can specify HTTP method and path.
|
35
|
+
```bash
|
36
|
+
racli {METHOD} {PATH} # ex) racli POST /users
|
37
|
+
```
|
38
|
+
|
39
|
+
The rack configuration file is `config.ru` on current directory by default.
|
40
|
+
If you want to use other file as rack configuration file, you should specify `--config` option
|
41
|
+
```bash
|
42
|
+
racli --config /path/to/config_file
|
43
|
+
```
|
44
|
+
|
45
|
+
If you want to add rack response handler, you should put .raclirc on the same directory as config.ru is put.
|
46
|
+
The following is sample .raclirc
|
47
|
+
```ruby
|
48
|
+
add_handler Racli::Handlers::RetryHandler
|
49
|
+
# add_handler Racli::Handlers::DebugHandler
|
31
50
|
```
|
32
51
|
|
33
52
|
## Development
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
require
|
4
|
-
require
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'racli'
|
5
6
|
|
6
7
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
8
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +11,5 @@ require "racli"
|
|
10
11
|
# require "pry"
|
11
12
|
# Pry.start
|
12
13
|
|
13
|
-
require
|
14
|
+
require 'irb'
|
14
15
|
IRB.start(__FILE__)
|
data/exe/racli
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require 'racli'
|
4
5
|
Bundler.require
|
@@ -6,4 +7,4 @@ Bundler.require
|
|
6
7
|
config_params, request_params = Racli::OptionParser.new.call(ARGV)
|
7
8
|
|
8
9
|
cli = Racli::CLI.new(**config_params)
|
9
|
-
cli.call(**request_params)
|
10
|
+
cli.call(**request_params)
|
data/lib/racli.rb
CHANGED
data/lib/racli/cli.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'racli/rack'
|
2
4
|
require 'cgi'
|
3
5
|
require 'json'
|
@@ -6,42 +8,72 @@ Dir[File.expand_path('./handlers/**/*.rb', __dir__)].each { |f| require f }
|
|
6
8
|
|
7
9
|
module Racli
|
8
10
|
class CLI
|
9
|
-
attr_accessor :method, :path, :params, :config
|
10
|
-
|
11
11
|
def initialize(config:, rcfile:)
|
12
12
|
config_ruby_string = File.read(config)
|
13
|
-
|
13
|
+
eval_string = "::Racli::Rack.new { #{config_ruby_string} }.to_app"
|
14
|
+
@rackapp = TOPLEVEL_BINDING.eval eval_string, '(racli)', 0
|
14
15
|
@default_handler = Racli::Handlers::DefaultHandler.new(self)
|
16
|
+
@handlers = []
|
17
|
+
@aliases = {}
|
18
|
+
@default_headers = {}
|
15
19
|
|
16
|
-
eval(File.read(rcfile)) if File.
|
20
|
+
eval(File.read(rcfile)) if File.exist?(rcfile)
|
17
21
|
end
|
18
22
|
|
19
|
-
def call(method:, path:, params:)
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
response_handlers = handlers + [@default_handler]
|
26
|
-
response_handlers.reduce([status, headers, body]) do |(status, headers, body), handler|
|
27
|
-
handler.call(status, headers, body, original_args)
|
28
|
-
end
|
23
|
+
def call(method:, path:, params:, headers: @default_headers)
|
24
|
+
if @aliases.include?(method.to_sym)
|
25
|
+
alias_setting = @aliases[method.to_sym]
|
26
|
+
method = alias_setting[:method]
|
27
|
+
path = alias_setting[:path]
|
28
|
+
headers.merge!(alias_setting[:headers])
|
29
29
|
end
|
30
|
+
|
31
|
+
request_params = request_params(
|
32
|
+
method: method,
|
33
|
+
path: path,
|
34
|
+
params: params,
|
35
|
+
headers: headers
|
36
|
+
)
|
37
|
+
status, headers, body = @rackapp.call(request_params)
|
38
|
+
handle_response(
|
39
|
+
status: status,
|
40
|
+
headers: headers,
|
41
|
+
body: body,
|
42
|
+
original_args: { method: method, path: path, params: params }
|
43
|
+
)
|
30
44
|
end
|
31
45
|
|
32
46
|
def add_handler(handler_klass)
|
33
47
|
handler = handler_klass.new(self)
|
34
|
-
handlers.push handler
|
48
|
+
@handlers.push handler
|
49
|
+
end
|
50
|
+
|
51
|
+
def add_alias(alias_name, method = 'GET', path = '/', headers = {})
|
52
|
+
@aliases[alias_name] = { method: method, path: path, headers: headers }
|
53
|
+
end
|
54
|
+
|
55
|
+
def default_headers(headers)
|
56
|
+
@default_headers = headers
|
35
57
|
end
|
36
58
|
|
37
59
|
private
|
38
60
|
|
39
|
-
def
|
61
|
+
def handle_response(status:, headers:, body:, original_args:)
|
62
|
+
catch(:abort) do
|
63
|
+
response_handlers = @handlers + [@default_handler]
|
64
|
+
response_handlers.each do |handler|
|
65
|
+
status, headers, body = handler.call(status, headers, body, original_args)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def request_params(method:, path:, params:, headers:)
|
40
71
|
query_string = to_query_string(params)
|
41
72
|
request_params = {
|
42
73
|
'PATH_INFO' => path || '/',
|
43
|
-
'REQUEST_METHOD' => method || 'GET'
|
44
|
-
}
|
74
|
+
'REQUEST_METHOD' => method || 'GET'
|
75
|
+
}.merge(headers)
|
76
|
+
|
45
77
|
if method == 'GET'
|
46
78
|
request_params['QUERY_STRING'] = query_string
|
47
79
|
request_params['rack.input'] = StringIO.new('')
|
@@ -52,10 +84,6 @@ module Racli
|
|
52
84
|
request_params
|
53
85
|
end
|
54
86
|
|
55
|
-
def handlers
|
56
|
-
@handlers ||= []
|
57
|
-
end
|
58
|
-
|
59
87
|
def to_query_string(params)
|
60
88
|
params.map { |k, v| "#{k}=#{CGI.escape(v)}" }.join('&')
|
61
89
|
end
|
data/lib/racli/handlers/base.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'racli/handlers/base'
|
2
4
|
|
3
5
|
module Racli
|
4
6
|
module Handlers
|
5
7
|
class DebugHandler < Base
|
6
|
-
def call(status, headers, body,
|
8
|
+
def call(status, headers, body, _original_args)
|
7
9
|
puts '*** debug ***'
|
8
10
|
puts status
|
9
11
|
puts headers
|
@@ -1,16 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'racli/handlers/base'
|
2
4
|
|
3
5
|
module Racli
|
4
6
|
module Handlers
|
5
7
|
class DefaultHandler < Base
|
6
|
-
def call(status, headers, body,
|
8
|
+
def call(status, headers, body, _original_args)
|
7
9
|
case status.to_i
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
else
|
13
|
-
STDERR.puts body[0]
|
10
|
+
when 200...300
|
11
|
+
puts body[0]
|
12
|
+
when 400...600
|
13
|
+
STDERR.puts body[0]
|
14
14
|
end
|
15
15
|
[status, headers, body]
|
16
16
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'racli/handlers/base'
|
2
4
|
|
3
5
|
module Racli
|
@@ -14,7 +16,7 @@ module Racli
|
|
14
16
|
end
|
15
17
|
|
16
18
|
def call(status, headers, body, original_args)
|
17
|
-
if (
|
19
|
+
if (300...400).cover?(status.to_i) && headers['Location']
|
18
20
|
unless within_max_retry_count?
|
19
21
|
STDERR.puts 'Too many redirection!'
|
20
22
|
throw :abort
|
data/lib/racli/option_parser.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'optparse'
|
2
4
|
|
3
5
|
module Racli
|
@@ -7,7 +9,7 @@ module Racli
|
|
7
9
|
config_params = { config: options[:config], rcfile: options[:rcfile] }
|
8
10
|
|
9
11
|
params = { method: 'GET', path: '/' }
|
10
|
-
params[:method] = args[0]
|
12
|
+
params[:method] = args[0] unless args.empty?
|
11
13
|
params[:path] = args[1] if args.length > 1
|
12
14
|
|
13
15
|
request_params = options.dup
|
@@ -22,8 +24,8 @@ module Racli
|
|
22
24
|
|
23
25
|
def parse(args)
|
24
26
|
keys = args.select { |key| key.include?('--') }
|
25
|
-
|
26
|
-
|
27
|
+
.map { |key| key.gsub(/^\-\-/, '') }
|
28
|
+
.reject { |key| %w[config rcfile].include?(key) }
|
27
29
|
options = {}
|
28
30
|
options[:config] = File.expand_path('./config.ru', Dir.pwd)
|
29
31
|
options[:rcfile] = File.expand_path('./.raclirc', Dir.pwd)
|
data/lib/racli/rack.rb
CHANGED
data/lib/racli/version.rb
CHANGED
data/racli.gemspec
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
|
-
lib = File.expand_path('
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'racli/version'
|
5
6
|
|
@@ -9,8 +10,8 @@ Gem::Specification.new do |spec|
|
|
9
10
|
spec.authors = ['tzmfreedom']
|
10
11
|
spec.email = ['makoto_tajitsu@hotmail.co.jp']
|
11
12
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
13
|
+
spec.summary = 'CLI Backend with Rack'
|
14
|
+
spec.description = 'CLI Backend with Rack'
|
14
15
|
spec.homepage = 'https://github.com/tzmfreedom/racli'
|
15
16
|
spec.license = 'MIT'
|
16
17
|
|
@@ -25,4 +26,5 @@ Gem::Specification.new do |spec|
|
|
25
26
|
spec.add_development_dependency 'bundler', '~> 1.16'
|
26
27
|
spec.add_development_dependency 'rake', '~> 10.0'
|
27
28
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
29
|
+
spec.add_development_dependency 'rubocop'
|
28
30
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: racli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- tzmfreedom
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '3.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
description: CLI Backend with Rack
|
70
84
|
email:
|
71
85
|
- makoto_tajitsu@hotmail.co.jp
|
@@ -76,6 +90,7 @@ extra_rdoc_files: []
|
|
76
90
|
files:
|
77
91
|
- ".gitignore"
|
78
92
|
- ".rspec"
|
93
|
+
- ".rubocop.yml"
|
79
94
|
- ".travis.yml"
|
80
95
|
- Gemfile
|
81
96
|
- LICENSE.txt
|