rack-app 5.4.0 → 5.5.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6dd2f46b2f007bef6e687579c333ebad1d77ac65
4
- data.tar.gz: 0a216bf4a522cd5b6ed17385a09137101812e1e4
3
+ metadata.gz: b4b3d25d410555551a8d81c6be4c797cb28d9a2b
4
+ data.tar.gz: 6b4c65de92a11cfcf01d7a613674797e855a0ffa
5
5
  SHA512:
6
- metadata.gz: 21e7fa7810f21fd7f0336728633aa7cd18a18525d0bfd458103037ffdac57e0abb1cfc3d50f9e85801efb79b23aed43ee120cb164370f0e74a43f0f1d4b4cc3f
7
- data.tar.gz: acc7507fa92edeefae60d910ee0be289eb649899dcf088bbff149875640b3b07f26e5679ed5ec7bc969f24394f1087f6f8e1fc6fbf02ce4cdf1b511249864fb4
6
+ metadata.gz: d84f255799c2c240f6245732a2ae00701c25584bb9eb37797206bbc88a2b69f3584d5ca441638699d7e5c33e090f24f2d3b84ebc564a170e85f420fd917a8386
7
+ data.tar.gz: 1a0db3ae2452a57f87c11f02613f8491b3659131d2af2d61ac41f1ec7ab0d0eb0599ffdb510fac27188c91f5b220f214dab0754386a72690d5591b338eac1363
data/VERSION CHANGED
@@ -1 +1 @@
1
- 5.4.0
1
+ 5.5.1
@@ -1,5 +1,11 @@
1
1
  module Rack::App::Constants
2
2
 
3
+ def self.rack_constant(constant_name, fallback_value)
4
+ ::Rack.const_get(constant_name)
5
+ rescue NameError
6
+ fallback_value.freeze
7
+ end
8
+
3
9
  module HTTP
4
10
 
5
11
  module METHOD
@@ -18,13 +24,19 @@ module Rack::App::Constants
18
24
 
19
25
  METHODS = (METHOD.constants - [:ANY]).map(&:to_s).freeze
20
26
 
27
+ module Headers
28
+ CONTENT_TYPE = Rack::App::Constants.rack_constant(:CONTENT_TYPE, "Content-Type")
29
+ end
30
+
21
31
  end
22
32
 
23
33
  module ENV
24
- PATH_INFO = (defined?(::Rack::PATH_INFO) ? ::Rack::PATH_INFO : "PATH_INFO".freeze)
25
- REQUEST_METHOD = (defined?(::Rack::REQUEST_METHOD) ? ::Rack::REQUEST_METHOD : "REQUEST_METHOD".freeze)
26
- REQUEST_PATH = (defined?(::Rack::REQUEST_PATH) ? ::Rack::REQUEST_PATH : "REQUEST_PATH".freeze)
27
34
 
35
+ PATH_INFO = Rack::App::Constants.rack_constant(:PATH_INFO, "PATH_INFO")
36
+ REQUEST_PATH = Rack::App::Constants.rack_constant(:REQUEST_PATH, "REQUEST_PATH")
37
+ REQUEST_METHOD = Rack::App::Constants.rack_constant(:REQUEST_METHOD, "REQUEST_METHOD")
38
+
39
+ EXTNAME = 'rack-app.extname'.freeze
28
40
  REQUEST_HANDLER = 'rack-app.handler'
29
41
  SERIALIZER = 'rack-app.serializer'
30
42
  PARSED_PARAMS = 'rack-app.parsed_params'
@@ -26,6 +26,10 @@ class Rack::App::Endpoint
26
26
  to_app.call(env)
27
27
  end
28
28
 
29
+ def supported_extnames
30
+ @config.serializer.extnames
31
+ end
32
+
29
33
  def to_app
30
34
  @config.application || self.class::Builder.new(@config).build
31
35
  end
@@ -19,7 +19,7 @@ class Rack::App::Endpoint::Builder
19
19
  builder_blocks.each do |builder_block|
20
20
  builder_block.call(builder)
21
21
  end
22
- builder.use(Rack::App::Middlewares::Configuration, @config.to_hash)
22
+ builder.use(Rack::App::Middlewares::Configuration, @config)
23
23
  apply_hook_middlewares(builder)
24
24
  end
25
25
 
@@ -1,7 +1,6 @@
1
1
  class Rack::App::Endpoint::Config
2
2
 
3
3
  def to_hash
4
- serializer
5
4
  error_handler
6
5
  middleware_builders_blocks
7
6
  request_path
@@ -18,7 +17,11 @@ class Rack::App::Endpoint::Config
18
17
  end
19
18
 
20
19
  def serializer
21
- @raw[:serializer] ||= Rack::App::Serializer.new
20
+ serializer_builder.to_serializer
21
+ end
22
+
23
+ def serializer_builder
24
+ @raw[:serializer_builder] ||= app_class.__send__(:formats)
22
25
  end
23
26
 
24
27
  def error_handler
@@ -12,7 +12,7 @@ class Rack::App::Endpoint::Executor
12
12
 
13
13
  def execute(env)
14
14
  request_handler = env[Rack::App::Constants::ENV::REQUEST_HANDLER]
15
- set_response_body(request_handler.response, get_response_body(request_handler))
15
+ set_response_body(request_handler, get_response_body(request_handler))
16
16
  return request_handler.response
17
17
  end
18
18
 
@@ -24,8 +24,13 @@ class Rack::App::Endpoint::Executor
24
24
  end
25
25
  end
26
26
 
27
- def set_response_body(response, response_body)
28
- response.write(String(@endpoint_properties.serializer.serialize(response_body)))
27
+ EXTNAME = ::Rack::App::Constants::ENV::EXTNAME
28
+ CONTENT_TYPE = ::Rack::App::Constants::HTTP::Headers::CONTENT_TYPE
29
+
30
+ def set_response_body(handler, response_body)
31
+ extname = handler.request.env[EXTNAME]
32
+ handler.response.headers.merge!(@endpoint_properties.serializer.response_headers_for(extname))
33
+ handler.response.write(@endpoint_properties.serializer.serialize(extname, response_body))
29
34
  end
30
35
 
31
36
  def evaluate_value(request_handler)
@@ -34,5 +39,4 @@ class Rack::App::Endpoint::Executor
34
39
  end
35
40
  end
36
41
 
37
-
38
42
  end
@@ -1,4 +1,5 @@
1
1
  module Rack::App::Middlewares
2
+ require 'rack/app/middlewares/path_info_cutter'
2
3
  require 'rack/app/middlewares/configuration'
3
4
  require 'rack/app/middlewares/header_setter'
4
5
  require 'rack/app/middlewares/params'
@@ -1,29 +1,34 @@
1
+ require "rack/builder"
1
2
  require "rack/request"
2
3
  require "rack/response"
3
4
  class Rack::App::Middlewares::Configuration
4
5
 
5
- require "rack/app/middlewares/configuration/path_info_formatter"
6
+ require "rack/app/middlewares/configuration/handler_setter"
7
+ require "rack/app/middlewares/configuration/serializer_setter"
8
+
6
9
  require "rack/app/middlewares/configuration/path_params_matcher"
7
10
 
8
- def initialize(app, options={})
9
- @handler_class = options[:app_class] || raise
10
- @serializer = options[:serializer] || raise
11
- @app = app
11
+ def initialize(app, config)
12
+ @stack = build_stack(app) do |builder|
13
+ builder.use Rack::App::Middlewares::Configuration::SerializerSetter,
14
+ config.serializer
15
+
16
+ builder.use Rack::App::Middlewares::Configuration::HandlerSetter,
17
+ config.app_class
18
+
19
+ end
12
20
  end
13
21
 
14
22
  def call(env)
15
- env[Rack::App::Constants::ENV::SERIALIZER]= @serializer
16
- env[Rack::App::Constants::ENV::REQUEST_HANDLER]= handler(env)
17
- @app.call(env)
23
+ @stack.call(env)
18
24
  end
19
25
 
20
26
  protected
21
27
 
22
- def handler(env)
23
- new_handler = @handler_class.new
24
- new_handler.request = ::Rack::Request.new(env)
25
- new_handler.response = ::Rack::Response.new
26
- new_handler
28
+ def build_stack(app)
29
+ builder = Rack::Builder.new
30
+ yield(builder)
31
+ builder.run(app)
32
+ return builder.to_app
27
33
  end
28
-
29
34
  end
@@ -0,0 +1,22 @@
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
@@ -0,0 +1,21 @@
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
@@ -0,0 +1,15 @@
1
+ class Rack::App::Middlewares::PathInfoCutter
2
+
3
+ def initialize(app, cut_string_from_path)
4
+ @cut_string_from_path = cut_string_from_path
5
+ @app = app
6
+ end
7
+
8
+ def call(env)
9
+ #env[::Rack::App::Constants::ENV::ORIGINAL_PATH_INFO]= env[::Rack::App::Constants::ENV::PATH_INFO]
10
+ env[::Rack::App::Constants::ENV::PATH_INFO]= env[::Rack::App::Constants::ENV::PATH_INFO].dup
11
+ env[::Rack::App::Constants::ENV::PATH_INFO].sub!(@cut_string_from_path, '')
12
+ @app.call(env)
13
+ end
14
+
15
+ end
@@ -2,8 +2,8 @@ require 'cgi'
2
2
  class Rack::App::Params
3
3
 
4
4
  def to_hash
5
- if @request_env[::Rack::App::Constants::ENV::PARSED_PARAMS]
6
- @request_env[::Rack::App::Constants::ENV::PARSED_PARAMS]
5
+ if @env[::Rack::App::Constants::ENV::PARSED_PARAMS]
6
+ @env[::Rack::App::Constants::ENV::PARSED_PARAMS]
7
7
  else
8
8
  query_params.merge(request_path_params)
9
9
  end
@@ -11,24 +11,21 @@ class Rack::App::Params
11
11
 
12
12
  protected
13
13
 
14
- def initialize(request_env)
15
- @request_env = request_env
14
+ def initialize(env)
15
+ @env = env
16
16
  end
17
17
 
18
18
  def query_params
19
19
  raw_cgi_params.reduce({}) do |params_collection, (k, v)|
20
+ stripped_key = k.sub(/\[\]$/, '')
20
21
 
21
- if single_paramter_value?(v)
22
- params_collection[k]= v[0]
23
-
22
+ if single_paramter_value?(v) && !k.end_with?("[]")
23
+ params_collection[stripped_key]= v[0]
24
24
  else
25
- k = k.sub(/\[\]$/, '')
26
- params_collection[k]= v
27
-
25
+ params_collection[stripped_key]= v
28
26
  end
29
27
 
30
28
  params_collection
31
-
32
29
  end
33
30
  end
34
31
 
@@ -37,7 +34,7 @@ class Rack::App::Params
37
34
  end
38
35
 
39
36
  def raw_cgi_params
40
- CGI.parse(@request_env[::Rack::QUERY_STRING].to_s)
37
+ CGI.parse(@env[::Rack::QUERY_STRING].to_s)
41
38
  end
42
39
 
43
40
  def request_path_params
@@ -47,18 +44,26 @@ class Rack::App::Params
47
44
  end
48
45
 
49
46
  def extract_path_params
47
+ last_index = request_path_parts.length - 1
50
48
  request_path_parts.each.with_index.reduce({}) do |params_col, (path_part, index)|
51
- params_col[path_params_matcher[index]]= path_part if path_params_matcher[index]
49
+ if path_params_matcher[index]
50
+ if index == last_index && @env[::Rack::App::Constants::ENV::EXTNAME]
51
+ matcher = Regexp.escape(@env[::Rack::App::Constants::ENV::EXTNAME])
52
+ path_part = path_part.sub(/#{matcher}$/,'')
53
+ end
54
+ params_col[path_params_matcher[index]]= path_part
55
+ end
56
+
52
57
  params_col
53
58
  end
54
59
  end
55
60
 
56
61
  def request_path_parts
57
- @request_env[::Rack::App::Constants::ENV::PATH_INFO].split('/')
62
+ @env[::Rack::App::Constants::ENV::PATH_INFO].split('/')
58
63
  end
59
64
 
60
65
  def path_params_matcher
61
- @request_env[::Rack::App::Constants::ENV::PATH_PARAMS_MATCHER] || {}
66
+ @env[::Rack::App::Constants::ENV::PATH_PARAMS_MATCHER] || {}
62
67
  end
63
68
 
64
69
  end
@@ -3,16 +3,26 @@ module Rack::App::RequestConfigurator
3
3
  extend self
4
4
 
5
5
  def configure(env)
6
- path_info(env)
7
- env
6
+ set_path_info(env)
7
+ set_extname(env)
8
8
  end
9
9
 
10
10
  protected
11
11
 
12
- def path_info(env)
13
- path_info = env[::Rack::App::Constants::ENV::PATH_INFO]
14
- env[::Rack::App::Constants::ENV::ORIGINAL_PATH_INFO]= path_info
15
- env[::Rack::App::Constants::ENV::PATH_INFO]= Rack::App::Utils.normalize_path(path_info)
12
+ EXTNAME = ::Rack::App::Constants::ENV::EXTNAME
13
+ PATH_INFO = ::Rack::App::Constants::ENV::PATH_INFO
14
+ ORIGINAL_PATH_INFO = ::Rack::App::Constants::ENV::ORIGINAL_PATH_INFO
15
+
16
+ def set_path_info(env)
17
+ path_info = env[PATH_INFO]
18
+ env[ORIGINAL_PATH_INFO]= path_info.dup
19
+ env[PATH_INFO]= Rack::App::Utils.normalize_path(path_info)
20
+ end
21
+
22
+ def set_extname(env)
23
+ path_info = env[PATH_INFO]
24
+ basename = path_info.split("/").last.to_s
25
+ env[EXTNAME]= File.extname(basename)
16
26
  end
17
27
 
18
- end
28
+ end
@@ -6,6 +6,7 @@ class Rack::App::Router
6
6
  require 'rack/app/router/not_found'
7
7
 
8
8
  def call(env)
9
+ Rack::App::RequestConfigurator.configure(env)
9
10
  @static.call(env) or @dynamic.call(env) or @not_found.call(env)
10
11
  end
11
12
 
@@ -1,17 +1,10 @@
1
1
  class Rack::App::Router::Base
2
2
 
3
3
  def call(env)
4
-
5
- request_method= env[::Rack::App::Constants::ENV::REQUEST_METHOD]
6
- path_info= env[Rack::App::Constants::ENV::PATH_INFO]
7
-
8
- context = fetch_context(request_method, path_info)
9
- return unless context.is_a?(Hash) and not context[:app].nil?
10
-
11
- context[:app].call(env)
4
+ app = get_app(env)
5
+ app && app.call(env)
12
6
  end
13
7
 
14
-
15
8
  def endpoints
16
9
  @endpoints ||= []
17
10
  end
@@ -29,6 +22,10 @@ class Rack::App::Router::Base
29
22
 
30
23
  protected
31
24
 
25
+ def get_app(env)
26
+ raise(NotImplementedError)
27
+ end
28
+
32
29
  def compile_endpoint!(endpoint)
33
30
  raise(NotImplementedError)
34
31
  end
@@ -53,4 +50,26 @@ class Rack::App::Router::Base
53
50
  end
54
51
  end
55
52
 
53
+ def find_by_path_infos(env, &block)
54
+ block.call(raw_path_info(env)) || block.call(formatted_path_info(env))
55
+ end
56
+
57
+ def get_request_method(env)
58
+ env[::Rack::App::Constants::ENV::REQUEST_METHOD]
59
+ end
60
+
61
+ def raw_path_info(env)
62
+ env[::Rack::App::Constants::ENV::PATH_INFO]
63
+ end
64
+
65
+ def formatted_path_info(env)
66
+ path_info = raw_path_info(env).dup
67
+ path_info.slice!(/#{Regexp.escape(extname(env))}$/)
68
+ path_info
69
+ end
70
+
71
+ def extname(env)
72
+ env[::Rack::App::Constants::ENV::EXTNAME]
73
+ end
74
+
56
75
  end
@@ -70,7 +70,7 @@ class Rack::App::Router::Dynamic < Rack::App::Router::Base
70
70
  elsif path_part_is_a_mounted_rack_based_application?(path_part)
71
71
  break_build = true
72
72
  builder.use(
73
- Rack::App::Middlewares::Configuration::PathInfoFormatter,
73
+ Rack::App::Middlewares::PathInfoCutter,
74
74
  calculate_mount_path(request_path_parts)
75
75
  )
76
76
  MOUNTED_APPLICATION
@@ -116,14 +116,25 @@ class Rack::App::Router::Dynamic < Rack::App::Router::Base
116
116
  ::Rack::App::Constants::HTTP::METHODS
117
117
  end
118
118
 
119
+ def get_app(env)
120
+ find_by_path_infos(env) do |path_info|
121
+ c = fetch_context(get_request_method(env), path_info)
122
+
123
+ if c.is_a?(Hash)
124
+ c[:app]
125
+ else
126
+ nil
127
+ end
128
+ end
129
+ end
119
130
 
120
131
  def fetch_context(request_method, path_info)
121
- normalized_request_path = Rack::App::Utils.normalize_path(path_info)
122
132
 
123
133
  last_mounted_directory = nil
124
134
  last_mounted_app = nil
125
135
  current_cluster = main_cluster(request_method)
126
- normalized_request_path.split('/').each do |path_part|
136
+
137
+ path_info.split('/').each do |path_part|
127
138
 
128
139
  last_mounted_directory = current_cluster[MOUNTED_DIRECTORY] || last_mounted_directory
129
140
  last_mounted_app = current_cluster[MOUNTED_APPLICATION] || last_mounted_app
@@ -1,23 +1,19 @@
1
1
  require "rack/response"
2
2
  class Rack::App::Router::NotFound < Rack::App::Router::Base
3
3
 
4
- def fetch_context(request_method, path_info)
5
- {:app => lambda{|env| not_found_response }}
6
- end
7
-
8
- def fetch_endpoint(request_method, path_info)
9
- ::Rack::App::Endpoint::NOT_FOUND
10
- end
11
-
12
4
  protected
13
5
 
14
- def not_found_response
6
+ NOT_FOUND_APP = lambda do |env|
15
7
  rack_response = Rack::Response.new
16
8
  rack_response.status = 404
17
9
  rack_response.write('404 Not Found')
18
10
  rack_response.finish
19
11
  end
20
-
12
+
13
+ def get_app(env)
14
+ NOT_FOUND_APP
15
+ end
16
+
21
17
  def compile_registered_endpoints!
22
18
  end
23
19
  end
@@ -2,9 +2,11 @@ class Rack::App::Router::Static < Rack::App::Router::Base
2
2
 
3
3
  protected
4
4
 
5
- def fetch_context(request_method, request_path)
6
- app = mapped_endpoint_routes[[request_method, request_path]]
7
- app && {:app => app}
5
+ def get_app(env)
6
+ request_method= get_request_method(env)
7
+ find_by_path_infos(env) do |request_path|
8
+ mapped_endpoint_routes[[request_method, request_path]]
9
+ end
8
10
  end
9
11
 
10
12
  def mapped_endpoint_routes
@@ -17,6 +19,7 @@ class Rack::App::Router::Static < Rack::App::Router::Base
17
19
 
18
20
  def compile_endpoint!(endpoint)
19
21
  routing_key = [endpoint.request_method, endpoint.request_path]
22
+
20
23
  mapped_endpoint_routes[routing_key]= as_app(endpoint)
21
24
  end
22
25
 
@@ -1,13 +1,56 @@
1
1
  class Rack::App::Serializer
2
2
 
3
- attr_reader :logic
3
+ require "rack/app/serializer/formats_builder"
4
4
 
5
- def initialize(&block)
6
- @logic = block || lambda { |o| o.to_s }
5
+ def initialize(options={})
6
+
7
+ @default_formatter = options[:default_formatter] || lambda { |o| o.to_s }
8
+ @default_content_type = options[:default_content_type]
9
+
10
+ formatters = options[:formatters] || {}
11
+ content_types = options[:content_types] || {}
12
+
13
+ @content_types = Hash.new(@default_content_type)
14
+ @content_types.merge!(content_types)
15
+
16
+ @formatters = Hash.new(@default_formatter)
17
+ @formatters.merge!(formatters)
18
+
19
+ end
20
+
21
+ def serialize(extname, object)
22
+ String(@formatters[extname].call(object))
23
+ end
24
+
25
+ CONTENT_TYPE = ::Rack::App::Constants::HTTP::Headers::CONTENT_TYPE
26
+
27
+ def response_headers_for(extname)
28
+ headers = {}
29
+ add_content_type_for(headers, extname)
30
+ headers
31
+ end
32
+
33
+ def to_options
34
+ {
35
+ :formatters => @formatters,
36
+ :content_types => @content_types,
37
+ :default_formatter => @default_formatter,
38
+ :default_content_type => @default_content_type,
39
+ }
7
40
  end
8
41
 
9
- def serialize(object)
10
- String(@logic.call(object))
42
+ def extnames
43
+ (@formatters.keys + @content_types.keys).uniq
11
44
  end
12
45
 
46
+ protected
47
+
48
+ def add_content_type_for(headers, extname)
49
+ content_type = @content_types[extname]
50
+ if content_type
51
+ headers[CONTENT_TYPE]= content_type.dup
52
+ end
53
+ end
54
+
55
+
13
56
  end
@@ -0,0 +1,39 @@
1
+ class Rack::App::Serializer::FormatsBuilder
2
+
3
+ def initialize
4
+ @formatters = {}
5
+ @content_types = {}
6
+ @default_formatter = lambda { |o| o.to_s }
7
+ @default_content_type = nil
8
+ end
9
+
10
+ def on(extname, response_content_type, &formatter)
11
+ format = String(extname).downcase
12
+ extension = (format[0,1] == '.' ? format : ".#{format}")
13
+ @formatters[extension]= formatter
14
+ @content_types[extension]= response_content_type
15
+ self
16
+ end
17
+
18
+ def default(content_type=nil, &block)
19
+ @default_content_type = content_type if content_type
20
+ @default_formatter = block if block
21
+ self
22
+ end
23
+
24
+ def to_serializer
25
+ Rack::App::Serializer.new(
26
+ :formatters => @formatters,
27
+ :content_types => @content_types,
28
+ :default_formatter => @default_formatter,
29
+ :default_content_type => @default_content_type
30
+ )
31
+ end
32
+
33
+ def merge!(formats_builder)
34
+ @formatters.merge!(formats_builder.instance_variable_get(:@formatters))
35
+ @default_formatter = formats_builder.instance_variable_get(:@default_formatter)
36
+ self
37
+ end
38
+
39
+ end
@@ -9,6 +9,7 @@ module Rack::App::SingletonMethods
9
9
  require 'rack/app/singleton_methods/route_handling'
10
10
  require 'rack/app/singleton_methods/settings'
11
11
  require 'rack/app/singleton_methods/extensions'
12
+ require 'rack/app/singleton_methods/formats'
12
13
  require 'rack/app/singleton_methods/hooks'
13
14
 
14
15
  include Rack::App::SingletonMethods::HttpMethods
@@ -20,6 +21,7 @@ module Rack::App::SingletonMethods
20
21
  include Rack::App::SingletonMethods::RouteHandling
21
22
  include Rack::App::SingletonMethods::Settings
22
23
  include Rack::App::SingletonMethods::Extensions
24
+ include Rack::App::SingletonMethods::Formats
23
25
  include Rack::App::SingletonMethods::Hooks
24
26
 
25
27
  end
@@ -0,0 +1,17 @@
1
+ module Rack::App::SingletonMethods::Formats
2
+
3
+ def formats(&descriptor)
4
+ @formats_builder ||= Rack::App::Serializer::FormatsBuilder.new
5
+ unless descriptor.nil?
6
+ @formats_builder.instance_exec(&descriptor)
7
+ router.reset
8
+ end
9
+ @formats_builder
10
+ end
11
+
12
+ def serializer(default_content_type=nil, &how_to_serialize)
13
+ formats{ default(default_content_type,&how_to_serialize) } unless how_to_serialize.nil?
14
+ return formats.to_serializer
15
+ end
16
+
17
+ end
@@ -10,7 +10,8 @@ module Rack::App::SingletonMethods::Inheritance
10
10
 
11
11
  def inherited(child)
12
12
 
13
- child.serializer(&serializer.logic)
13
+ child.formats.merge!(formats)
14
+
14
15
  [:middlewares, :before, :after].each do |type|
15
16
  child.__send__(type).push(*__send__(type))
16
17
  end
@@ -3,7 +3,6 @@ module Rack::App::SingletonMethods::RackInterface
3
3
  public
4
4
 
5
5
  def call(env)
6
- Rack::App::RequestConfigurator.configure(env)
7
6
  return router.call(env)
8
7
  end
9
8
 
@@ -26,7 +26,6 @@ module Rack::App::SingletonMethods::RouteHandling
26
26
  Rack::App::Endpoint.new({
27
27
  :app_class => self,
28
28
  :error_handler => error,
29
- :serializer => serializer,
30
29
  :user_defined_logic => block,
31
30
  :request_method => request_method,
32
31
  :route => route_registration_properties.dup,
@@ -8,12 +8,6 @@ module Rack::App::SingletonMethods::Settings
8
8
 
9
9
  protected
10
10
 
11
- def serializer(&definition_how_to_serialize)
12
- @serializer ||= Rack::App::Serializer.new
13
- @serializer = Rack::App::Serializer.new(&definition_how_to_serialize) unless definition_how_to_serialize.nil?
14
- return @serializer
15
- end
16
-
17
11
  def headers(new_headers=nil)
18
12
  middleware do |b|
19
13
  b.use(Rack::App::Middlewares::HeaderSetter,new_headers)
@@ -13,7 +13,8 @@ class Rack::App::Streamer
13
13
  require "rack/app/streamer/scheduler"
14
14
 
15
15
  def initialize(env, options={}, &back)
16
- @serializer = env[Rack::App::Constants::ENV::SERIALIZER]
16
+ @serializer = env[::Rack::App::Constants::ENV::SERIALIZER]
17
+ @extname = env[::Rack::App::Constants::ENV::EXTNAME]
17
18
  @scheduler = options[:scheduler] || Rack::App::Streamer::Scheduler.by_env(env)
18
19
  @keep_open = options[:keep_open] || false
19
20
  @back = back.to_proc
@@ -39,7 +40,7 @@ class Rack::App::Streamer
39
40
  end
40
41
 
41
42
  def <<(data)
42
- @scheduler.schedule { @front.call(@serializer.serialize(data)) }
43
+ @scheduler.schedule { @front.call(@serializer.serialize(@extname, data)) }
43
44
  self
44
45
  end
45
46
 
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.0
4
+ version: 5.5.1
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-09-21 00:00:00.000000000 Z
11
+ date: 2016-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -120,8 +120,9 @@ files:
120
120
  - lib/rack/app/instance_methods/streaming.rb
121
121
  - lib/rack/app/middlewares.rb
122
122
  - lib/rack/app/middlewares/configuration.rb
123
- - lib/rack/app/middlewares/configuration/path_info_formatter.rb
123
+ - lib/rack/app/middlewares/configuration/handler_setter.rb
124
124
  - lib/rack/app/middlewares/configuration/path_params_matcher.rb
125
+ - lib/rack/app/middlewares/configuration/serializer_setter.rb
125
126
  - lib/rack/app/middlewares/header_setter.rb
126
127
  - lib/rack/app/middlewares/hooks.rb
127
128
  - lib/rack/app/middlewares/hooks/after.rb
@@ -132,6 +133,7 @@ files:
132
133
  - lib/rack/app/middlewares/params/parser.rb
133
134
  - lib/rack/app/middlewares/params/setter.rb
134
135
  - lib/rack/app/middlewares/params/validator.rb
136
+ - lib/rack/app/middlewares/path_info_cutter.rb
135
137
  - lib/rack/app/params.rb
136
138
  - lib/rack/app/request_configurator.rb
137
139
  - lib/rack/app/router.rb
@@ -141,8 +143,10 @@ files:
141
143
  - lib/rack/app/router/not_found.rb
142
144
  - lib/rack/app/router/static.rb
143
145
  - lib/rack/app/serializer.rb
146
+ - lib/rack/app/serializer/formats_builder.rb
144
147
  - lib/rack/app/singleton_methods.rb
145
148
  - lib/rack/app/singleton_methods/extensions.rb
149
+ - lib/rack/app/singleton_methods/formats.rb
146
150
  - lib/rack/app/singleton_methods/hooks.rb
147
151
  - lib/rack/app/singleton_methods/http_methods.rb
148
152
  - lib/rack/app/singleton_methods/inheritance.rb
@@ -1,14 +0,0 @@
1
- class Rack::App::Middlewares::Configuration::PathInfoFormatter
2
-
3
- def initialize(app, cut_string_from_path)
4
- @cut_string_from_path = cut_string_from_path
5
- @app = app
6
- end
7
-
8
- def call(env)
9
- env[::Rack::App::Constants::ENV::ORIGINAL_PATH_INFO]= env[::Rack::App::Constants::ENV::PATH_INFO].dup
10
- env[::Rack::App::Constants::ENV::PATH_INFO].sub!(@cut_string_from_path, '')
11
- @app.call(env)
12
- end
13
-
14
- end