rack-app 5.7.0 → 5.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -3
- data/VERSION +1 -1
- data/lib/rack/app.rb +1 -0
- data/lib/rack/app/bundled_extensions/logger.rb +3 -44
- data/lib/rack/app/endpoint/builder.rb +1 -6
- data/lib/rack/app/endpoint/config.rb +4 -0
- data/lib/rack/app/logger.rb +24 -0
- data/lib/rack/app/middlewares.rb +0 -1
- data/lib/rack/app/middlewares/configuration.rb +22 -18
- data/lib/rack/app/payload/builder.rb +5 -2
- data/lib/rack/app/payload/parser.rb +9 -3
- data/lib/rack/app/payload/parser/builder.rb +18 -14
- data/lib/rack/app/singleton_methods/payload.rb +2 -5
- data/lib/rack/app/singleton_methods/route_handling.rb +1 -0
- metadata +3 -6
- data/lib/rack/app/middlewares/configuration/handler_setter.rb +0 -22
- data/lib/rack/app/middlewares/configuration/payload_parser_setter.rb +0 -18
- data/lib/rack/app/middlewares/configuration/serializer_setter.rb +0 -21
- data/lib/rack/app/middlewares/payload_parser_setter.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f508a985161b52acd4c9670809dd2e67e58e0651
|
4
|
+
data.tar.gz: 996142d38f74b27f7ae120711f7e46006801828f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ece40a6832073132ddcbb0d103615f189247899cd361761da3955af816ed61017bd9aca772d853e0fe0f76609b0ef77bdd86e3883c78747c5687e34bfcc5084
|
7
|
+
data.tar.gz: d1ba5d8943f0404cb48ed44cc2c58e06a740e79bc353d9d90b06de5609e4b4f8a6617d3e220879904be83932dd4ac5dc73dfaa8c77a72163a273c4f252a07053
|
data/README.md
CHANGED
@@ -199,14 +199,14 @@ describe App do
|
|
199
199
|
|
200
200
|
it { expect(subject.status).to eq 200 }
|
201
201
|
|
202
|
-
it { expect(subject.body
|
202
|
+
it { expect(subject.body).to eq "Hello World!" }
|
203
203
|
end
|
204
204
|
|
205
205
|
describe '/users/:user_id' do
|
206
206
|
# restful endpoint example
|
207
207
|
subject{ get(url: '/users/1234') }
|
208
208
|
|
209
|
-
it { expect(subject.body
|
209
|
+
it { expect(subject.body).to eq 'hello 1234!'}
|
210
210
|
|
211
211
|
it { expect(subject.status).to eq 201 }
|
212
212
|
|
@@ -216,7 +216,7 @@ describe App do
|
|
216
216
|
# error handled example
|
217
217
|
subject{ get(url: '/make_error') }
|
218
218
|
|
219
|
-
it { expect(subject.body
|
219
|
+
it { expect(subject.body).to eq '{:error=>"error block rescued"}' }
|
220
220
|
end
|
221
221
|
|
222
222
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
5.
|
1
|
+
5.8.0
|
data/lib/rack/app.rb
CHANGED
@@ -3,51 +3,10 @@ Rack::App::Extension.register(:logger) do
|
|
3
3
|
require "logger"
|
4
4
|
require "securerandom"
|
5
5
|
|
6
|
-
logger_class = Class.new
|
7
|
-
logger_class.class_eval do
|
8
|
-
|
9
|
-
def initialize(request_id)
|
10
|
-
@request_id = request_id
|
11
|
-
@logger = ::Logger.new(STDOUT)
|
12
|
-
end
|
13
|
-
|
14
|
-
[:info, :warn, :error, :fatal, :unknown].each do |log_level|
|
15
|
-
define_method(log_level) do |msg|
|
16
|
-
if msg.is_a?(Hash)
|
17
|
-
@logger.__send__(log_level, @request_id){format_hash(msg)}
|
18
|
-
else
|
19
|
-
@logger.__send__(log_level, @request_id){String(msg)}
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
protected
|
25
|
-
|
26
|
-
begin
|
27
|
-
require "json"
|
28
|
-
rescue LoadError
|
29
|
-
end
|
30
|
-
|
31
|
-
def format_hash(hash)
|
32
|
-
if defined?(::JSON)
|
33
|
-
JSON.dump(hash)
|
34
|
-
else
|
35
|
-
hash.inspect
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def method_missing(name,*args)
|
40
|
-
if @logger.respond_to?(:binding)
|
41
|
-
@logger.__send__(name,*args)
|
42
|
-
else
|
43
|
-
super
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
|
49
6
|
define_method(:logger) do
|
50
|
-
@logger ||=
|
7
|
+
@logger ||= Rack::App::Logger.new(STDOUT).tap do |this|
|
8
|
+
this.id = request.env['HTTP_X_REQUEST_ID']
|
9
|
+
end
|
51
10
|
end
|
52
11
|
|
53
12
|
end
|
@@ -7,7 +7,6 @@ class Rack::App::Endpoint::Builder
|
|
7
7
|
|
8
8
|
def build
|
9
9
|
builder = Rack::Builder.new
|
10
|
-
apply_core_middlewares(builder)
|
11
10
|
apply_middleware_build_blocks(builder)
|
12
11
|
builder.run(Rack::App::Endpoint::Executor.new(@config))
|
13
12
|
builder.to_app
|
@@ -15,10 +14,6 @@ class Rack::App::Endpoint::Builder
|
|
15
14
|
|
16
15
|
protected
|
17
16
|
|
18
|
-
def apply_core_middlewares(builder)
|
19
|
-
builder.use(Rack::App::Middlewares::Configuration::PayloadParserSetter)
|
20
|
-
end
|
21
|
-
|
22
17
|
def apply_middleware_build_blocks(builder)
|
23
18
|
builder_blocks.each do |builder_block|
|
24
19
|
builder_block.call(builder)
|
@@ -37,7 +32,7 @@ class Rack::App::Endpoint::Builder
|
|
37
32
|
end
|
38
33
|
|
39
34
|
def builder_blocks
|
40
|
-
@config.app_class.middlewares
|
35
|
+
[@config.app_class.middlewares, @config.middleware_builders_blocks].flatten
|
41
36
|
end
|
42
37
|
|
43
38
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'logger'
|
2
|
+
class Rack::App::Logger < ::Logger
|
3
|
+
attr_writer :id
|
4
|
+
|
5
|
+
def initialize(*args)
|
6
|
+
super
|
7
|
+
configure!
|
8
|
+
end
|
9
|
+
|
10
|
+
protected
|
11
|
+
|
12
|
+
def id
|
13
|
+
@id ||= SecureRandom.hex
|
14
|
+
end
|
15
|
+
|
16
|
+
def configure!
|
17
|
+
original_formatter = Logger::Formatter.new
|
18
|
+
self.formatter = proc do |severity, datetime, progname, msg|
|
19
|
+
fmsg = msg.is_a?(::Hash) ? (defined?(::JSON) ? JSON.dump(msg) : msg) : msg
|
20
|
+
fprname = progname || id
|
21
|
+
original_formatter.call(severity, datetime, fprname, fmsg)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/rack/app/middlewares.rb
CHANGED
@@ -3,33 +3,37 @@ require "rack/request"
|
|
3
3
|
require "rack/response"
|
4
4
|
class Rack::App::Middlewares::Configuration
|
5
5
|
|
6
|
-
require "rack/app/middlewares/configuration/handler_setter"
|
7
|
-
require "rack/app/middlewares/configuration/serializer_setter"
|
8
|
-
require "rack/app/middlewares/configuration/payload_parser_setter"
|
9
|
-
|
10
6
|
require "rack/app/middlewares/configuration/path_params_matcher"
|
11
7
|
|
12
8
|
def initialize(app, config)
|
13
|
-
@
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
builder.use Rack::App::Middlewares::Configuration::HandlerSetter,
|
18
|
-
config.app_class
|
19
|
-
|
20
|
-
end
|
9
|
+
@app = app || raise
|
10
|
+
@serializer = config.serializer || raise
|
11
|
+
@handler_class = config.app_class || raise
|
12
|
+
@payload_parser = config.payload_builder.to_parser || raise
|
21
13
|
end
|
22
14
|
|
23
15
|
def call(env)
|
24
|
-
|
16
|
+
env[Rack::App::Constants::ENV::REQUEST_HANDLER]= handler(env)
|
17
|
+
env[::Rack::App::Constants::ENV::SERIALIZER]= @serializer
|
18
|
+
env[::Rack::App::Constants::ENV::PAYLOAD_PARSER]= @payload_parser
|
19
|
+
env[::Rack::App::Constants::ENV::PAYLOAD_GETTER]= lambda do
|
20
|
+
env[::Rack::App::Constants::ENV::PARSED_PAYLOAD] ||= env[::Rack::App::Constants::ENV::PAYLOAD_PARSER].parse_env(env)
|
21
|
+
end
|
22
|
+
@app.call(env)
|
25
23
|
end
|
26
24
|
|
27
25
|
protected
|
28
26
|
|
29
|
-
def
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
27
|
+
def handler(env)
|
28
|
+
new_handler = @handler_class.new
|
29
|
+
new_handler.request = ::Rack::Request.new(env)
|
30
|
+
new_handler.response = ::Rack::Response.new
|
31
|
+
new_handler
|
34
32
|
end
|
33
|
+
|
34
|
+
def extname(env)
|
35
|
+
path_info = env[::Rack::App::Constants::ENV::PATH_INFO]
|
36
|
+
File.extname(path_info.split("/").last.to_s)
|
37
|
+
end
|
38
|
+
|
35
39
|
end
|
@@ -1,9 +1,12 @@
|
|
1
1
|
class Rack::App::Payload::Builder
|
2
|
-
|
3
|
-
def
|
2
|
+
|
3
|
+
def parser_builder(&block)
|
4
4
|
@parser_builder ||= Rack::App::Payload::Parser::Builder.new
|
5
5
|
@parser_builder.instance_exec(&block) if block
|
6
6
|
@parser_builder
|
7
7
|
end
|
8
8
|
|
9
|
+
alias parser parser_builder
|
10
|
+
alias configure_parser parser_builder
|
11
|
+
|
9
12
|
end
|
@@ -7,12 +7,11 @@ class Rack::App::Payload::Parser
|
|
7
7
|
|
8
8
|
def initialize(content_type__parsers = {})
|
9
9
|
raise unless content_type__parsers.is_a?(Hash)
|
10
|
-
@content_type__parsers =
|
11
|
-
@content_type__parsers.merge!(content_type__parsers)
|
10
|
+
@content_type__parsers = content_type__parsers
|
12
11
|
end
|
13
12
|
|
14
13
|
def parse_io(content_type, io)
|
15
|
-
|
14
|
+
parser_for(content_type.to_s).call(io)
|
16
15
|
end
|
17
16
|
|
18
17
|
def parse_env(env)
|
@@ -23,4 +22,11 @@ class Rack::App::Payload::Parser
|
|
23
22
|
def parse_string(content_type, str)
|
24
23
|
parse_io(content_type, StringIO.new(str))
|
25
24
|
end
|
25
|
+
|
26
|
+
protected
|
27
|
+
|
28
|
+
def parser_for(content_type)
|
29
|
+
@content_type__parsers[content_type] || DEFAULT_PARSER
|
30
|
+
end
|
31
|
+
|
26
32
|
end
|
@@ -3,15 +3,15 @@ class Rack::App::Payload::Parser::Builder
|
|
3
3
|
require "rack/app/payload/parser/builder/formats"
|
4
4
|
|
5
5
|
def initialize
|
6
|
-
@
|
6
|
+
@content_type__parsers = Hash.new(Rack::App::Payload::Parser::DEFAULT_PARSER)
|
7
7
|
end
|
8
8
|
|
9
9
|
def to_parser
|
10
|
-
Rack::App::Payload::Parser.new(@
|
10
|
+
Rack::App::Payload::Parser.new(@content_type__parsers.dup)
|
11
11
|
end
|
12
12
|
|
13
13
|
def on(content_type, &parser)
|
14
|
-
@
|
14
|
+
@content_type__parsers[content_type]= parser
|
15
15
|
self
|
16
16
|
end
|
17
17
|
|
@@ -19,20 +19,24 @@ class Rack::App::Payload::Parser::Builder
|
|
19
19
|
Rack::App::Payload::Parser::Builder::Formats.accept(self, *formats)
|
20
20
|
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
22
|
+
def reject_unsupported_media_types
|
23
|
+
reject = proc do |io|
|
24
|
+
rr = Rack::Response.new
|
25
|
+
rr.status = 415
|
26
|
+
rr.write("Unsupported Media Type")
|
27
|
+
rr.write("Accepted content-types:")
|
28
|
+
@content_type__parsers.each do |content_type, _|
|
29
|
+
rr.write(content_type.to_s)
|
30
|
+
end
|
31
|
+
throw(:rack_response, rr)
|
32
|
+
end
|
33
|
+
@content_type__parsers = Hash.new(reject).merge(@content_type__parsers)
|
34
|
+
nil
|
35
|
+
end
|
32
36
|
|
33
37
|
def merge!(parser_builder)
|
34
38
|
raise unless parser_builder.is_a?(self.class)
|
35
|
-
@
|
39
|
+
@content_type__parsers.merge!(parser_builder.instance_variable_get(:@content_type__parsers))
|
36
40
|
self
|
37
41
|
end
|
38
42
|
|
@@ -1,12 +1,9 @@
|
|
1
1
|
module Rack::App::SingletonMethods::Payload
|
2
2
|
|
3
3
|
def payload(&block)
|
4
|
-
|
5
|
-
@payload_builder = Rack::App::Payload::Builder.new
|
6
|
-
use(Rack::App::Middlewares::Payload::ParserSetter, @payload_builder)
|
7
|
-
end
|
4
|
+
@payload_builder ||= Rack::App::Payload::Builder.new
|
8
5
|
@payload_builder.instance_exec(&block) if block
|
9
|
-
|
6
|
+
@payload_builder
|
10
7
|
end
|
11
8
|
|
12
9
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-app
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Luzsi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-12-
|
11
|
+
date: 2016-12-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -121,12 +121,10 @@ files:
|
|
121
121
|
- lib/rack/app/instance_methods/redirect_to.rb
|
122
122
|
- lib/rack/app/instance_methods/serve_file.rb
|
123
123
|
- lib/rack/app/instance_methods/streaming.rb
|
124
|
+
- lib/rack/app/logger.rb
|
124
125
|
- lib/rack/app/middlewares.rb
|
125
126
|
- lib/rack/app/middlewares/configuration.rb
|
126
|
-
- lib/rack/app/middlewares/configuration/handler_setter.rb
|
127
127
|
- lib/rack/app/middlewares/configuration/path_params_matcher.rb
|
128
|
-
- lib/rack/app/middlewares/configuration/payload_parser_setter.rb
|
129
|
-
- lib/rack/app/middlewares/configuration/serializer_setter.rb
|
130
128
|
- lib/rack/app/middlewares/header_setter.rb
|
131
129
|
- lib/rack/app/middlewares/hooks.rb
|
132
130
|
- lib/rack/app/middlewares/hooks/after.rb
|
@@ -141,7 +139,6 @@ files:
|
|
141
139
|
- lib/rack/app/middlewares/path_info_cutter.rb
|
142
140
|
- lib/rack/app/middlewares/payload.rb
|
143
141
|
- lib/rack/app/middlewares/payload/parser_setter.rb
|
144
|
-
- lib/rack/app/middlewares/payload_parser_setter.rb
|
145
142
|
- lib/rack/app/params.rb
|
146
143
|
- lib/rack/app/payload.rb
|
147
144
|
- lib/rack/app/payload/builder.rb
|
@@ -1,22 +0,0 @@
|
|
1
|
-
class Rack::App::Middlewares::Configuration::HandlerSetter
|
2
|
-
|
3
|
-
def initialize(app, handler_class)
|
4
|
-
@app = app
|
5
|
-
@handler_class = handler_class || raise
|
6
|
-
end
|
7
|
-
|
8
|
-
def call(env)
|
9
|
-
env[Rack::App::Constants::ENV::REQUEST_HANDLER]= handler(env)
|
10
|
-
@app.call(env)
|
11
|
-
end
|
12
|
-
|
13
|
-
protected
|
14
|
-
|
15
|
-
def handler(env)
|
16
|
-
new_handler = @handler_class.new
|
17
|
-
new_handler.request = ::Rack::Request.new(env)
|
18
|
-
new_handler.response = ::Rack::Response.new
|
19
|
-
new_handler
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
class Rack::App::Middlewares::Configuration::PayloadParserSetter
|
2
|
-
|
3
|
-
PARSER = ::Rack::App::Constants::ENV::PAYLOAD_PARSER
|
4
|
-
PARSED = ::Rack::App::Constants::ENV::PARSED_PAYLOAD
|
5
|
-
GETTER = ::Rack::App::Constants::ENV::PAYLOAD_GETTER
|
6
|
-
|
7
|
-
def initialize(app)
|
8
|
-
@app = app
|
9
|
-
@parser = Rack::App::Payload::Parser.new
|
10
|
-
end
|
11
|
-
|
12
|
-
def call(env)
|
13
|
-
env[PARSER]= @parser
|
14
|
-
env[GETTER]= lambda { env[PARSED] ||= env[PARSER].parse_env(env) }
|
15
|
-
@app.call(env)
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
class Rack::App::Middlewares::Configuration::SerializerSetter
|
2
|
-
|
3
|
-
def initialize(app, serializer)
|
4
|
-
@app = app
|
5
|
-
@serializer = serializer || raise
|
6
|
-
end
|
7
|
-
|
8
|
-
def call(env)
|
9
|
-
# env[::Rack::App::Constants::ENV::EXTNAME] ||= extname(env)
|
10
|
-
env[::Rack::App::Constants::ENV::SERIALIZER]= @serializer
|
11
|
-
@app.call(env)
|
12
|
-
end
|
13
|
-
|
14
|
-
protected
|
15
|
-
|
16
|
-
def extname(env)
|
17
|
-
path_info = env[::Rack::App::Constants::ENV::PATH_INFO]
|
18
|
-
File.extname(path_info.split("/").last.to_s)
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
class Rack::App::Middlewares::PayloadParserSetter
|
2
|
-
|
3
|
-
PARSER = ::Rack::App::Constants::ENV::PAYLOAD_PARSER
|
4
|
-
PARSED = ::Rack::App::Constants::ENV::PARSED_PAYLOAD
|
5
|
-
GETTER = ::Rack::App::Constants::ENV::PAYLOAD_GETTER
|
6
|
-
|
7
|
-
def initialize(app, payload_parser)
|
8
|
-
@payload_parser = payload_parser
|
9
|
-
@app = app
|
10
|
-
end
|
11
|
-
|
12
|
-
def call(env)
|
13
|
-
env[PARSER]= @payload_parser
|
14
|
-
env[GETTER]= lambda { env[PARSED] ||= env[PARSER].parse_env(env) }
|
15
|
-
@app.call(env)
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|