deas 0.42.0 → 0.43.0
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 +5 -5
 - data/deas.gemspec +1 -1
 - data/lib/deas/error_handler.rb +17 -12
 - data/lib/deas/handler_proxy.rb +18 -18
 - data/lib/deas/logging.rb +4 -3
 - data/lib/deas/request_data.rb +33 -0
 - data/lib/deas/route.rb +5 -7
 - data/lib/deas/router.rb +15 -5
 - data/lib/deas/runner.rb +49 -6
 - data/lib/deas/server.rb +41 -115
 - data/lib/deas/server_data.rb +12 -1
 - data/lib/deas/sinatra_app.rb +69 -43
 - data/lib/deas/test_runner.rb +3 -2
 - data/lib/deas/url.rb +11 -7
 - data/lib/deas/version.rb +1 -1
 - data/lib/deas/view_handler.rb +0 -2
 - data/test/support/factory.rb +16 -0
 - data/test/support/fake_request.rb +1 -0
 - data/test/support/fake_response.rb +12 -0
 - data/test/support/fake_sinatra_call.rb +1 -11
 - data/test/support/routes.rb +8 -7
 - data/test/system/deas_tests.rb +3 -11
 - data/test/unit/error_handler_tests.rb +19 -5
 - data/test/unit/handler_proxy_tests.rb +28 -33
 - data/test/unit/logging_tests.rb +12 -5
 - data/test/unit/request_data_tests.rb +57 -0
 - data/test/unit/route_tests.rb +15 -15
 - data/test/unit/router_tests.rb +38 -24
 - data/test/unit/runner_tests.rb +66 -12
 - data/test/unit/server_data_tests.rb +14 -1
 - data/test/unit/server_tests.rb +41 -106
 - data/test/unit/sinatra_app_tests.rb +38 -24
 - data/test/unit/test_runner_tests.rb +7 -4
 - data/test/unit/url_tests.rb +13 -2
 - data/test/unit/view_handler_tests.rb +1 -7
 - metadata +8 -3
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- 
         
     | 
| 
       2 
     | 
    
         
            -
            SHA1: 
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz: 1105d3943d8f80cbcfd722a4fd5796b015fb7e0c
         
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz: 4847313602ffd9942d2b287f36052c0946e03c06
         
     | 
| 
       5 
2 
     | 
    
         
             
            SHA512: 
         
     | 
| 
       6 
     | 
    
         
            -
               
     | 
| 
       7 
     | 
    
         
            -
               
     | 
| 
      
 3 
     | 
    
         
            +
              data.tar.gz: 3520f4645edbc6b6b89e470cc2025f436e6031989c7c7ebf60f9b2c50ec4ec9e68b938fd0149603c8addd798ccd9fc895a0a68e58b89b12c51e2aad0e6f84f1d
         
     | 
| 
      
 4 
     | 
    
         
            +
              metadata.gz: ba28b9b16f9011f958849afdb5a774a1f559d5c258447b6f0e3ba551328ebbad70d36d84f462af46cce1fcd9f9fec2ebc5fc57d3da01d86aa9f7d778bc181a7f
         
     | 
| 
      
 5 
     | 
    
         
            +
            SHA1: 
         
     | 
| 
      
 6 
     | 
    
         
            +
              data.tar.gz: 91a77987b3fb3b6d87a728643150a787b620c04a
         
     | 
| 
      
 7 
     | 
    
         
            +
              metadata.gz: 69eab40552eaaf3cb49bf1d9dd1bc3f4cadb8533
         
     | 
    
        data/deas.gemspec
    CHANGED
    
    | 
         @@ -22,7 +22,7 @@ Gem::Specification.new do |gem| 
     | 
|
| 
       22 
22 
     | 
    
         
             
              gem.add_development_dependency("assert-rack-test", ["~> 1.0.4"])
         
     | 
| 
       23 
23 
     | 
    
         | 
| 
       24 
24 
     | 
    
         
             
              gem.add_dependency("much-plugin", ["~> 0.2.0"])
         
     | 
| 
       25 
     | 
    
         
            -
              gem.add_dependency("rack",        ["~> 1. 
     | 
| 
      
 25 
     | 
    
         
            +
              gem.add_dependency("rack",        ["~> 1.6.4"])
         
     | 
| 
       26 
26 
     | 
    
         
             
              gem.add_dependency("sinatra",     ["~> 1.2"])
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
       28 
28 
     | 
    
         
             
            end
         
     | 
    
        data/lib/deas/error_handler.rb
    CHANGED
    
    | 
         @@ -35,25 +35,30 @@ module Deas 
     | 
|
| 
       35 
35 
     | 
    
         
             
                class Context
         
     | 
| 
       36 
36 
     | 
    
         | 
| 
       37 
37 
     | 
    
         
             
                  attr_reader :server_data
         
     | 
| 
       38 
     | 
    
         
            -
                  attr_reader :request, :response, :handler_class, :handler 
     | 
| 
      
 38 
     | 
    
         
            +
                  attr_reader :request, :response, :handler_class, :handler
         
     | 
| 
      
 39 
     | 
    
         
            +
                  attr_reader :params, :splat, :route_path
         
     | 
| 
       39 
40 
     | 
    
         | 
| 
       40 
41 
     | 
    
         
             
                  def initialize(args)
         
     | 
| 
       41 
     | 
    
         
            -
                    @server_data   = args 
     | 
| 
       42 
     | 
    
         
            -
                    @request       = args 
     | 
| 
       43 
     | 
    
         
            -
                    @response      = args 
     | 
| 
       44 
     | 
    
         
            -
                    @handler_class = args 
     | 
| 
       45 
     | 
    
         
            -
                    @handler       = args 
     | 
| 
       46 
     | 
    
         
            -
                    @params        = args 
     | 
| 
      
 42 
     | 
    
         
            +
                    @server_data   = args.fetch(:server_data)
         
     | 
| 
      
 43 
     | 
    
         
            +
                    @request       = args.fetch(:request)
         
     | 
| 
      
 44 
     | 
    
         
            +
                    @response      = args.fetch(:response)
         
     | 
| 
      
 45 
     | 
    
         
            +
                    @handler_class = args.fetch(:handler_class)
         
     | 
| 
      
 46 
     | 
    
         
            +
                    @handler       = args.fetch(:handler)
         
     | 
| 
      
 47 
     | 
    
         
            +
                    @params        = args.fetch(:params)
         
     | 
| 
      
 48 
     | 
    
         
            +
                    @splat         = args.fetch(:splat)
         
     | 
| 
      
 49 
     | 
    
         
            +
                    @route_path    = args.fetch(:route_path)
         
     | 
| 
       47 
50 
     | 
    
         
             
                  end
         
     | 
| 
       48 
51 
     | 
    
         | 
| 
       49 
52 
     | 
    
         
             
                  def ==(other)
         
     | 
| 
       50 
53 
     | 
    
         
             
                    if other.kind_of?(self.class)
         
     | 
| 
       51 
     | 
    
         
            -
                      self.server_data   == other.server_data 
     | 
| 
      
 54 
     | 
    
         
            +
                      self.server_data   == other.server_data   &&
         
     | 
| 
       52 
55 
     | 
    
         
             
                      self.handler_class == other.handler_class &&
         
     | 
| 
       53 
     | 
    
         
            -
                      self.request       == other.request 
     | 
| 
       54 
     | 
    
         
            -
                      self.response      == other.response 
     | 
| 
       55 
     | 
    
         
            -
                      self.handler       == other.handler 
     | 
| 
       56 
     | 
    
         
            -
                      self.params        == other.params
         
     | 
| 
      
 56 
     | 
    
         
            +
                      self.request       == other.request       &&
         
     | 
| 
      
 57 
     | 
    
         
            +
                      self.response      == other.response      &&
         
     | 
| 
      
 58 
     | 
    
         
            +
                      self.handler       == other.handler       &&
         
     | 
| 
      
 59 
     | 
    
         
            +
                      self.params        == other.params        &&
         
     | 
| 
      
 60 
     | 
    
         
            +
                      self.splat         == other.splat         &&
         
     | 
| 
      
 61 
     | 
    
         
            +
                      self.route_path    == other.route_path
         
     | 
| 
       57 
62 
     | 
    
         
             
                    else
         
     | 
| 
       58 
63 
     | 
    
         
             
                      super
         
     | 
| 
       59 
64 
     | 
    
         
             
                    end
         
     | 
    
        data/lib/deas/handler_proxy.rb
    CHANGED
    
    | 
         @@ -15,29 +15,26 @@ module Deas 
     | 
|
| 
       15 
15 
     | 
    
         
             
                  raise NotImplementedError
         
     | 
| 
       16 
16 
     | 
    
         
             
                end
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
                def run(server_data,  
     | 
| 
       19 
     | 
    
         
            -
                  # captures are not part of Deas' intended behavior and route matching
         
     | 
| 
       20 
     | 
    
         
            -
                  # they are a side- 
     | 
| 
       21 
     | 
    
         
            -
                  # be relied upon in Deas apps.
         
     | 
| 
       22 
     | 
    
         
            -
                   
     | 
| 
       23 
     | 
    
         
            -
                   
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                  #  
     | 
| 
       26 
     | 
    
         
            -
                  #  
     | 
| 
       27 
     | 
    
         
            -
                  #  
     | 
| 
       28 
     | 
    
         
            -
                   
     | 
| 
       29 
     | 
    
         
            -
                   
     | 
| 
       30 
     | 
    
         
            -
                  splat_string_param = sinatra_call.params.delete('splat')
         
     | 
| 
       31 
     | 
    
         
            -
                  splat_value        = (splat_sym_param || splat_string_param || []).last
         
     | 
| 
      
 18 
     | 
    
         
            +
                def run(server_data, request_data)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  # captures are not part of Deas' intended behavior and route matching -
         
     | 
| 
      
 20 
     | 
    
         
            +
                  # they are a side-effect of using Sinatra.  remove them so they won't
         
     | 
| 
      
 21 
     | 
    
         
            +
                  # be relied upon in Deas apps.  Remove all of this when Sinatra is removed.
         
     | 
| 
      
 22 
     | 
    
         
            +
                  request_data.params.delete(:captures)
         
     | 
| 
      
 23 
     | 
    
         
            +
                  request_data.params.delete('captures')
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                  # splats that Sinatra provides aren't used by Deas - they are a
         
     | 
| 
      
 26 
     | 
    
         
            +
                  # side-effect of using Sinatra.  remove them so they won't be relied upon
         
     | 
| 
      
 27 
     | 
    
         
            +
                  # in Deas apps.  Remove all of this when Sinatra is removed.
         
     | 
| 
      
 28 
     | 
    
         
            +
                  request_data.params.delete(:splat)
         
     | 
| 
      
 29 
     | 
    
         
            +
                  request_data.params.delete('splat')
         
     | 
| 
       32 
30 
     | 
    
         | 
| 
       33 
31 
     | 
    
         
             
                  runner = DeasRunner.new(self.handler_class, {
         
     | 
| 
       34 
32 
     | 
    
         
             
                    :logger          => server_data.logger,
         
     | 
| 
       35 
33 
     | 
    
         
             
                    :router          => server_data.router,
         
     | 
| 
       36 
34 
     | 
    
         
             
                    :template_source => server_data.template_source,
         
     | 
| 
       37 
     | 
    
         
            -
                    :request         =>  
     | 
| 
       38 
     | 
    
         
            -
                    : 
     | 
| 
       39 
     | 
    
         
            -
                    : 
     | 
| 
       40 
     | 
    
         
            -
                    :splat           => splat_value
         
     | 
| 
      
 35 
     | 
    
         
            +
                    :request         => request_data.request,
         
     | 
| 
      
 36 
     | 
    
         
            +
                    :params          => request_data.params,
         
     | 
| 
      
 37 
     | 
    
         
            +
                    :route_path      => request_data.route_path
         
     | 
| 
       41 
38 
     | 
    
         
             
                  })
         
     | 
| 
       42 
39 
     | 
    
         | 
| 
       43 
40 
     | 
    
         
             
                  runner.request.env.tap do |env|
         
     | 
| 
         @@ -48,11 +45,14 @@ module Deas 
     | 
|
| 
       48 
45 
     | 
    
         
             
                    env['deas.handler_class'] = self.handler_class
         
     | 
| 
       49 
46 
     | 
    
         
             
                    env['deas.handler']       = runner.handler
         
     | 
| 
       50 
47 
     | 
    
         
             
                    env['deas.params']        = runner.params
         
     | 
| 
      
 48 
     | 
    
         
            +
                    env['deas.splat']         = runner.splat
         
     | 
| 
      
 49 
     | 
    
         
            +
                    env['deas.route_path']    = runner.route_path
         
     | 
| 
       51 
50 
     | 
    
         | 
| 
       52 
51 
     | 
    
         
             
                    # this handles the verbose logging (it is a no-op if summary logging)
         
     | 
| 
       53 
52 
     | 
    
         
             
                    env['deas.logging'].call "  Handler: #{self.handler_class.name}"
         
     | 
| 
       54 
53 
     | 
    
         
             
                    env['deas.logging'].call "  Params:  #{runner.params.inspect}"
         
     | 
| 
       55 
54 
     | 
    
         
             
                    env['deas.logging'].call "  Splat:   #{runner.splat.inspect}" if !runner.splat.nil?
         
     | 
| 
      
 55 
     | 
    
         
            +
                    env['deas.logging'].call "  Route:   #{runner.route_path.inspect}"
         
     | 
| 
       56 
56 
     | 
    
         
             
                  end
         
     | 
| 
       57 
57 
     | 
    
         | 
| 
       58 
58 
     | 
    
         
             
                  runner.run
         
     | 
    
        data/lib/deas/logging.rb
    CHANGED
    
    | 
         @@ -4,8 +4,8 @@ require 'sinatra/base' 
     | 
|
| 
       4 
4 
     | 
    
         
             
            module Deas
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
              module Logging
         
     | 
| 
       7 
     | 
    
         
            -
                def self. 
     | 
| 
       8 
     | 
    
         
            -
                  verbose ? VerboseLogging : SummaryLogging
         
     | 
| 
      
 7 
     | 
    
         
            +
                def self.middleware_args(verbose)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  verbose ? [VerboseLogging] : [SummaryLogging]
         
     | 
| 
       9 
9 
     | 
    
         
             
                end
         
     | 
| 
       10 
10 
     | 
    
         
             
              end
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
         @@ -102,6 +102,7 @@ module Deas 
     | 
|
| 
       102 
102 
     | 
    
         
             
                    'method'  => request.request_method,
         
     | 
| 
       103 
103 
     | 
    
         
             
                    'path'    => request.path,
         
     | 
| 
       104 
104 
     | 
    
         
             
                    'params'  => env['deas.params'],
         
     | 
| 
      
 105 
     | 
    
         
            +
                    'splat'   => env['deas.splat'],
         
     | 
| 
       105 
106 
     | 
    
         
             
                    'time'    => env['deas.time_taken'],
         
     | 
| 
       106 
107 
     | 
    
         
             
                    'status'  => status
         
     | 
| 
       107 
108 
     | 
    
         
             
                  }
         
     | 
| 
         @@ -119,7 +120,7 @@ module Deas 
     | 
|
| 
       119 
120 
     | 
    
         | 
| 
       120 
121 
     | 
    
         
             
              module SummaryLine
         
     | 
| 
       121 
122 
     | 
    
         
             
                def self.keys
         
     | 
| 
       122 
     | 
    
         
            -
                  %w{time status method path handler params redir}
         
     | 
| 
      
 123 
     | 
    
         
            +
                  %w{time status method path handler params splat redir}
         
     | 
| 
       123 
124 
     | 
    
         
             
                end
         
     | 
| 
       124 
125 
     | 
    
         
             
                def self.new(line_attrs)
         
     | 
| 
       125 
126 
     | 
    
         
             
                  self.keys.select{ |k| line_attrs.key?(k) }.
         
     | 
| 
         @@ -0,0 +1,33 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Deas
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              class RequestData
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                # The rack app uses this to "compile" the request-related data. The goal
         
     | 
| 
      
 6 
     | 
    
         
            +
                # here is to wrap up these (and any future) request objects into a struct
         
     | 
| 
      
 7 
     | 
    
         
            +
                # object to make them available to the runner/handler.  This is also to
         
     | 
| 
      
 8 
     | 
    
         
            +
                # decouple the rack app from the handlers (we can use any rack app as long
         
     | 
| 
      
 9 
     | 
    
         
            +
                # as they provide this data).
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                attr_reader :request, :response, :params, :route_path
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                def initialize(args)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  @request    = args[:request]
         
     | 
| 
      
 15 
     | 
    
         
            +
                  @response   = args[:response]
         
     | 
| 
      
 16 
     | 
    
         
            +
                  @params     = args[:params]
         
     | 
| 
      
 17 
     | 
    
         
            +
                  @route_path = args[:route_path]
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                def ==(other_request_data)
         
     | 
| 
      
 21 
     | 
    
         
            +
                  if other_request_data.kind_of?(RequestData)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    self.request    == other_request_data.request    &&
         
     | 
| 
      
 23 
     | 
    
         
            +
                    self.response   == other_request_data.response   &&
         
     | 
| 
      
 24 
     | 
    
         
            +
                    self.params     == other_request_data.params     &&
         
     | 
| 
      
 25 
     | 
    
         
            +
                    self.route_path == other_request_data.route_path
         
     | 
| 
      
 26 
     | 
    
         
            +
                  else
         
     | 
| 
      
 27 
     | 
    
         
            +
                    super
         
     | 
| 
      
 28 
     | 
    
         
            +
                  end
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
              end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/deas/route.rb
    CHANGED
    
    | 
         @@ -16,15 +16,13 @@ module Deas 
     | 
|
| 
       16 
16 
     | 
    
         
             
                  end
         
     | 
| 
       17 
17 
     | 
    
         
             
                end
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
     | 
    
         
            -
                def run(server_data,  
     | 
| 
       20 
     | 
    
         
            -
                   
     | 
| 
       21 
     | 
    
         
            -
                   
     | 
| 
       22 
     | 
    
         
            -
                    @handler_proxies[ 
     | 
| 
      
 19 
     | 
    
         
            +
                def run(server_data, request_data)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  request_type_name = server_data.router.request_type_name(request_data.request)
         
     | 
| 
      
 21 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 22 
     | 
    
         
            +
                    @handler_proxies[request_type_name].run(server_data, request_data)
         
     | 
| 
       23 
23 
     | 
    
         
             
                  rescue HandlerProxyNotFound
         
     | 
| 
       24 
     | 
    
         
            -
                     
     | 
| 
      
 24 
     | 
    
         
            +
                    [404, Rack::Utils::HeaderHash.new, []]
         
     | 
| 
       25 
25 
     | 
    
         
             
                  end
         
     | 
| 
       26 
     | 
    
         
            -
                  # TODO: eventually stop sending sinatra call (part of phasing out Sinatra)
         
     | 
| 
       27 
     | 
    
         
            -
                  proxy.run(server_data, sinatra_call)
         
     | 
| 
       28 
26 
     | 
    
         
             
                end
         
     | 
| 
       29 
27 
     | 
    
         | 
| 
       30 
28 
     | 
    
         
             
              end
         
     | 
    
        data/lib/deas/router.rb
    CHANGED
    
    | 
         @@ -43,15 +43,15 @@ module Deas 
     | 
|
| 
       43 
43 
     | 
    
         
             
                end
         
     | 
| 
       44 
44 
     | 
    
         | 
| 
       45 
45 
     | 
    
         
             
                def url(name, path, options = nil)
         
     | 
| 
      
 46 
     | 
    
         
            +
                  if !name.kind_of?(::Symbol)
         
     | 
| 
      
 47 
     | 
    
         
            +
                    raise ArgumentError, "invalid name `#{name.inspect}` - "\
         
     | 
| 
      
 48 
     | 
    
         
            +
                                         "named urls must be defined with Symbol names"
         
     | 
| 
      
 49 
     | 
    
         
            +
                  end
         
     | 
| 
       46 
50 
     | 
    
         
             
                  if !path.kind_of?(::String)
         
     | 
| 
       47 
51 
     | 
    
         
             
                    raise ArgumentError, "invalid path `#{path.inspect}` - "\
         
     | 
| 
       48 
52 
     | 
    
         
             
                                         "named urls must be defined with String paths"
         
     | 
| 
       49 
53 
     | 
    
         
             
                  end
         
     | 
| 
       50 
     | 
    
         
            -
                   
     | 
| 
       51 
     | 
    
         
            -
                    raise ArgumentError, "invalid path `#{path.inspect}` - "\
         
     | 
| 
       52 
     | 
    
         
            -
                                         "named urls can only have a single splat at the end of the path"
         
     | 
| 
       53 
     | 
    
         
            -
                  end
         
     | 
| 
       54 
     | 
    
         
            -
                  add_url(name.to_sym, path, options || {})
         
     | 
| 
      
 54 
     | 
    
         
            +
                  add_url(name, path, options || {})
         
     | 
| 
       55 
55 
     | 
    
         
             
                end
         
     | 
| 
       56 
56 
     | 
    
         | 
| 
       57 
57 
     | 
    
         
             
                def url_for(name, *args)
         
     | 
| 
         @@ -179,11 +179,21 @@ module Deas 
     | 
|
| 
       179 
179 
     | 
    
         
             
                end
         
     | 
| 
       180 
180 
     | 
    
         | 
| 
       181 
181 
     | 
    
         
             
                def add_route(http_method, path, proxies)
         
     | 
| 
      
 182 
     | 
    
         
            +
                  # splat not at end of path OR
         
     | 
| 
      
 183 
     | 
    
         
            +
                  # at end of path without preceding forward slash
         
     | 
| 
      
 184 
     | 
    
         
            +
                  if path =~ /\*(?!$)|[^\/]\*/
         
     | 
| 
      
 185 
     | 
    
         
            +
                    raise InvalidSplatError, "invalid path `#{path.inspect}` - "\
         
     | 
| 
      
 186 
     | 
    
         
            +
                                             "routes can only have a single splat and " \
         
     | 
| 
      
 187 
     | 
    
         
            +
                                             "it must be the last path segment " \
         
     | 
| 
      
 188 
     | 
    
         
            +
                                             "(ie '/something/*')"
         
     | 
| 
      
 189 
     | 
    
         
            +
                  end
         
     | 
| 
       182 
190 
     | 
    
         
             
                  proxies = HandlerProxies.new(proxies, self.default_request_type_name)
         
     | 
| 
       183 
191 
     | 
    
         
             
                  require 'deas/route'
         
     | 
| 
       184 
192 
     | 
    
         
             
                  Deas::Route.new(http_method, path, proxies).tap{ |r| self.routes.push(r) }
         
     | 
| 
       185 
193 
     | 
    
         
             
                end
         
     | 
| 
       186 
194 
     | 
    
         | 
| 
      
 195 
     | 
    
         
            +
                InvalidSplatError = Class.new(ArgumentError)
         
     | 
| 
      
 196 
     | 
    
         
            +
             
     | 
| 
       187 
197 
     | 
    
         
             
                class HandlerProxies
         
     | 
| 
       188 
198 
     | 
    
         | 
| 
       189 
199 
     | 
    
         
             
                  attr_reader :default_type
         
     | 
    
        data/lib/deas/runner.rb
    CHANGED
    
    | 
         @@ -15,24 +15,27 @@ module Deas 
     | 
|
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
                attr_reader :handler_class, :handler
         
     | 
| 
       17 
17 
     | 
    
         
             
                attr_reader :logger, :router, :template_source
         
     | 
| 
       18 
     | 
    
         
            -
                attr_reader :request, : 
     | 
| 
      
 18 
     | 
    
         
            +
                attr_reader :request, :params, :route_path
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
                def initialize(handler_class, args = nil)
         
     | 
| 
       21 
21 
     | 
    
         
             
                  @status, @headers, @body = nil, Rack::Utils::HeaderHash.new, nil
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
                  args ||= {}
         
     | 
| 
       24 
     | 
    
         
            -
                  @logger          = args[:logger] 
     | 
| 
       25 
     | 
    
         
            -
                  @router          = args[:router] 
     | 
| 
      
 24 
     | 
    
         
            +
                  @logger          = args[:logger]          || Deas::NullLogger.new
         
     | 
| 
      
 25 
     | 
    
         
            +
                  @router          = args[:router]          || Deas::Router.new
         
     | 
| 
       26 
26 
     | 
    
         
             
                  @template_source = args[:template_source] || Deas::NullTemplateSource.new
         
     | 
| 
       27 
27 
     | 
    
         
             
                  @request         = args[:request]
         
     | 
| 
       28 
     | 
    
         
            -
                  @ 
     | 
| 
       29 
     | 
    
         
            -
                  @ 
     | 
| 
       30 
     | 
    
         
            -
                  @splat           = args[:splat]
         
     | 
| 
      
 28 
     | 
    
         
            +
                  @params          = args[:params]          || {}
         
     | 
| 
      
 29 
     | 
    
         
            +
                  @route_path      = args[:route_path].to_s
         
     | 
| 
       31 
30 
     | 
    
         | 
| 
       32 
31 
     | 
    
         
             
                  @handler_class = handler_class
         
     | 
| 
       33 
32 
     | 
    
         
             
                  @handler = @handler_class.new(self)
         
     | 
| 
       34 
33 
     | 
    
         
             
                end
         
     | 
| 
       35 
34 
     | 
    
         | 
| 
      
 35 
     | 
    
         
            +
                def splat
         
     | 
| 
      
 36 
     | 
    
         
            +
                  @splat ||= parse_splat_value
         
     | 
| 
      
 37 
     | 
    
         
            +
                end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
       36 
39 
     | 
    
         
             
                def run
         
     | 
| 
       37 
40 
     | 
    
         
             
                  raise NotImplementedError
         
     | 
| 
       38 
41 
     | 
    
         
             
                end
         
     | 
| 
         @@ -138,6 +141,46 @@ module Deas 
     | 
|
| 
       138 
141 
     | 
    
         
             
                  File.join("#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}", url)
         
     | 
| 
       139 
142 
     | 
    
         
             
                end
         
     | 
| 
       140 
143 
     | 
    
         | 
| 
      
 144 
     | 
    
         
            +
                def parse_splat_value
         
     | 
| 
      
 145 
     | 
    
         
            +
                  return nil if request.nil? || (path_info = request.env['PATH_INFO']).nil?
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
      
 147 
     | 
    
         
            +
                  regex = splat_value_parse_regex
         
     | 
| 
      
 148 
     | 
    
         
            +
                  match = regex.match(path_info)
         
     | 
| 
      
 149 
     | 
    
         
            +
                  if match.nil?
         
     | 
| 
      
 150 
     | 
    
         
            +
                    raise SplatParseError, "could not parse the splat value: " \
         
     | 
| 
      
 151 
     | 
    
         
            +
                                           "the PATH_INFO, `#{path_info.inspect}`, " \
         
     | 
| 
      
 152 
     | 
    
         
            +
                                           "doesn't match " \
         
     | 
| 
      
 153 
     | 
    
         
            +
                                           "the route, `#{self.route_path.inspect}`, " \
         
     | 
| 
      
 154 
     | 
    
         
            +
                                           "using the route regex, `#{regex.inspect}`"
         
     | 
| 
      
 155 
     | 
    
         
            +
                  end
         
     | 
| 
      
 156 
     | 
    
         
            +
                  match.captures.first
         
     | 
| 
      
 157 
     | 
    
         
            +
                end
         
     | 
| 
      
 158 
     | 
    
         
            +
             
     | 
| 
      
 159 
     | 
    
         
            +
                SplatParseError = Class.new(RuntimeError)
         
     | 
| 
      
 160 
     | 
    
         
            +
             
     | 
| 
      
 161 
     | 
    
         
            +
                def splat_value_parse_regex
         
     | 
| 
      
 162 
     | 
    
         
            +
                  # `sub` should suffice as only a single trailing splat is allowed. Replace
         
     | 
| 
      
 163 
     | 
    
         
            +
                  # any splat with a capture placholder so we can extract the splat value.
         
     | 
| 
      
 164 
     | 
    
         
            +
                  /^#{route_path_with_regex_placeholders.sub('*', '(.+?)')}$/
         
     | 
| 
      
 165 
     | 
    
         
            +
                end
         
     | 
| 
      
 166 
     | 
    
         
            +
             
     | 
| 
      
 167 
     | 
    
         
            +
                def route_path_with_regex_placeholders
         
     | 
| 
      
 168 
     | 
    
         
            +
                  # Replace param values with regex placeholders b/c we don't care what
         
     | 
| 
      
 169 
     | 
    
         
            +
                  # the values are just that "a param value goes here".  Use gsub in the odd
         
     | 
| 
      
 170 
     | 
    
         
            +
                  # case a placeholder is used more than once in a route.  This is to help
         
     | 
| 
      
 171 
     | 
    
         
            +
                  # ensure matching and capturing splats even on nonsense paths.
         
     | 
| 
      
 172 
     | 
    
         
            +
                  sorted_param_names.inject(self.route_path) do |path, name|
         
     | 
| 
      
 173 
     | 
    
         
            +
                    path.gsub(":#{name}", '.+?')
         
     | 
| 
      
 174 
     | 
    
         
            +
                  end
         
     | 
| 
      
 175 
     | 
    
         
            +
                end
         
     | 
| 
      
 176 
     | 
    
         
            +
             
     | 
| 
      
 177 
     | 
    
         
            +
                def sorted_param_names
         
     | 
| 
      
 178 
     | 
    
         
            +
                  # Sort longer key names first so they will be processed first.  This
         
     | 
| 
      
 179 
     | 
    
         
            +
                  # ensures that shorter param names that compose longer param names won't
         
     | 
| 
      
 180 
     | 
    
         
            +
                  # be subbed in the longer param name's place.
         
     | 
| 
      
 181 
     | 
    
         
            +
                  self.params.keys.sort{ |a, b| b.size <=> a.size }
         
     | 
| 
      
 182 
     | 
    
         
            +
                end
         
     | 
| 
      
 183 
     | 
    
         
            +
             
     | 
| 
       141 
184 
     | 
    
         
             
                class NormalizedParams
         
     | 
| 
       142 
185 
     | 
    
         | 
| 
       143 
186 
     | 
    
         
             
                  attr_reader :value
         
     | 
    
        data/lib/deas/server.rb
    CHANGED
    
    | 
         @@ -31,7 +31,12 @@ module Deas 
     | 
|
| 
       31 
31 
     | 
    
         
             
                  # TODO: needed while Deas is powered by Sinatra
         
     | 
| 
       32 
32 
     | 
    
         
             
                  # eventually do an initialize method more like Sanford does
         
     | 
| 
       33 
33 
     | 
    
         
             
                  def new
         
     | 
| 
       34 
     | 
    
         
            -
                     
     | 
| 
      
 34 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 35 
     | 
    
         
            +
                      Deas::SinatraApp.new(self.config)
         
     | 
| 
      
 36 
     | 
    
         
            +
                    rescue Router::InvalidSplatError => e
         
     | 
| 
      
 37 
     | 
    
         
            +
                      # reset the exception backtrace to hide Deas internals
         
     | 
| 
      
 38 
     | 
    
         
            +
                      raise e.class, e.message, caller
         
     | 
| 
      
 39 
     | 
    
         
            +
                    end
         
     | 
| 
       35 
40 
     | 
    
         
             
                  end
         
     | 
| 
       36 
41 
     | 
    
         | 
| 
       37 
42 
     | 
    
         
             
                  def config
         
     | 
| 
         @@ -48,44 +53,19 @@ module Deas 
     | 
|
| 
       48 
53 
     | 
    
         
             
                    self.config.root
         
     | 
| 
       49 
54 
     | 
    
         
             
                  end
         
     | 
| 
       50 
55 
     | 
    
         | 
| 
       51 
     | 
    
         
            -
                  def  
     | 
| 
       52 
     | 
    
         
            -
                    self.config. 
     | 
| 
       53 
     | 
    
         
            -
                    self.config. 
     | 
| 
       54 
     | 
    
         
            -
                  end
         
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
                  def views_root
         
     | 
| 
       57 
     | 
    
         
            -
                    self.config.views_root
         
     | 
| 
       58 
     | 
    
         
            -
                  end
         
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
                  def public_path(value = nil)
         
     | 
| 
       61 
     | 
    
         
            -
                    self.config.public_path = value if !value.nil?
         
     | 
| 
       62 
     | 
    
         
            -
                    self.config.public_path
         
     | 
| 
       63 
     | 
    
         
            -
                  end
         
     | 
| 
       64 
     | 
    
         
            -
             
     | 
| 
       65 
     | 
    
         
            -
                  def public_root
         
     | 
| 
       66 
     | 
    
         
            -
                    self.config.public_root
         
     | 
| 
       67 
     | 
    
         
            -
                  end
         
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
       69 
     | 
    
         
            -
                  def default_encoding(value = nil)
         
     | 
| 
       70 
     | 
    
         
            -
                    self.config.default_encoding = value if !value.nil?
         
     | 
| 
       71 
     | 
    
         
            -
                    self.config.default_encoding
         
     | 
| 
       72 
     | 
    
         
            -
                  end
         
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
       74 
     | 
    
         
            -
                  def set(name, value)
         
     | 
| 
       75 
     | 
    
         
            -
                    self.config.settings[name.to_sym] = value
         
     | 
| 
       76 
     | 
    
         
            -
                  end
         
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
       78 
     | 
    
         
            -
                  def settings
         
     | 
| 
       79 
     | 
    
         
            -
                    self.config.settings
         
     | 
| 
      
 56 
     | 
    
         
            +
                  def method_override(value = nil)
         
     | 
| 
      
 57 
     | 
    
         
            +
                    self.config.method_override = value if !value.nil?
         
     | 
| 
      
 58 
     | 
    
         
            +
                    self.config.method_override
         
     | 
| 
       80 
59 
     | 
    
         
             
                  end
         
     | 
| 
       81 
60 
     | 
    
         | 
| 
       82 
     | 
    
         
            -
                  def  
     | 
| 
       83 
     | 
    
         
            -
                     
     | 
| 
       84 
     | 
    
         
            -
                    self.config. 
     | 
| 
      
 61 
     | 
    
         
            +
                  def show_exceptions(value = nil)
         
     | 
| 
      
 62 
     | 
    
         
            +
                    self.config.show_exceptions = value if !value.nil?
         
     | 
| 
      
 63 
     | 
    
         
            +
                    self.config.show_exceptions
         
     | 
| 
       85 
64 
     | 
    
         
             
                  end
         
     | 
| 
       86 
65 
     | 
    
         | 
| 
       87 
     | 
    
         
            -
                  def  
     | 
| 
       88 
     | 
    
         
            -
                    self.config. 
     | 
| 
      
 66 
     | 
    
         
            +
                  def verbose_logging(value = nil)
         
     | 
| 
      
 67 
     | 
    
         
            +
                    self.config.verbose_logging = value if !value.nil?
         
     | 
| 
      
 68 
     | 
    
         
            +
                    self.config.verbose_logging
         
     | 
| 
       89 
69 
     | 
    
         
             
                  end
         
     | 
| 
       90 
70 
     | 
    
         | 
| 
       91 
71 
     | 
    
         
             
                  def use(*args)
         
     | 
| 
         @@ -132,94 +112,33 @@ module Deas 
     | 
|
| 
       132 
112 
     | 
    
         | 
| 
       133 
113 
     | 
    
         
             
                  def url_for(*args, &block); self.router.url_for(*args, &block); end
         
     | 
| 
       134 
114 
     | 
    
         | 
| 
       135 
     | 
    
         
            -
                  # flags
         
     | 
| 
       136 
     | 
    
         
            -
             
     | 
| 
       137 
     | 
    
         
            -
                  def dump_errors(value = nil)
         
     | 
| 
       138 
     | 
    
         
            -
                    self.config.dump_errors = value if !value.nil?
         
     | 
| 
       139 
     | 
    
         
            -
                    self.config.dump_errors
         
     | 
| 
       140 
     | 
    
         
            -
                  end
         
     | 
| 
       141 
     | 
    
         
            -
             
     | 
| 
       142 
     | 
    
         
            -
                  def method_override(value = nil)
         
     | 
| 
       143 
     | 
    
         
            -
                    self.config.method_override = value if !value.nil?
         
     | 
| 
       144 
     | 
    
         
            -
                    self.config.method_override
         
     | 
| 
       145 
     | 
    
         
            -
                  end
         
     | 
| 
       146 
     | 
    
         
            -
             
     | 
| 
       147 
     | 
    
         
            -
                  def reload_templates(value = nil)
         
     | 
| 
       148 
     | 
    
         
            -
                    self.config.reload_templates = value if !value.nil?
         
     | 
| 
       149 
     | 
    
         
            -
                    self.config.reload_templates
         
     | 
| 
       150 
     | 
    
         
            -
                  end
         
     | 
| 
       151 
     | 
    
         
            -
             
     | 
| 
       152 
     | 
    
         
            -
                  def sessions(value = nil)
         
     | 
| 
       153 
     | 
    
         
            -
                    self.config.sessions = value if !value.nil?
         
     | 
| 
       154 
     | 
    
         
            -
                    self.config.sessions
         
     | 
| 
       155 
     | 
    
         
            -
                  end
         
     | 
| 
       156 
     | 
    
         
            -
             
     | 
| 
       157 
     | 
    
         
            -
                  def show_exceptions(value = nil)
         
     | 
| 
       158 
     | 
    
         
            -
                    self.config.show_exceptions = value if !value.nil?
         
     | 
| 
       159 
     | 
    
         
            -
                    self.config.show_exceptions
         
     | 
| 
       160 
     | 
    
         
            -
                  end
         
     | 
| 
       161 
     | 
    
         
            -
             
     | 
| 
       162 
     | 
    
         
            -
                  def static_files(value = nil)
         
     | 
| 
       163 
     | 
    
         
            -
                    self.config.static_files = value if !value.nil?
         
     | 
| 
       164 
     | 
    
         
            -
                    self.config.static_files
         
     | 
| 
       165 
     | 
    
         
            -
                  end
         
     | 
| 
       166 
     | 
    
         
            -
             
     | 
| 
       167 
     | 
    
         
            -
                  def verbose_logging(value = nil)
         
     | 
| 
       168 
     | 
    
         
            -
                    self.config.verbose_logging = value if !value.nil?
         
     | 
| 
       169 
     | 
    
         
            -
                    self.config.verbose_logging
         
     | 
| 
       170 
     | 
    
         
            -
                  end
         
     | 
| 
       171 
     | 
    
         
            -
             
     | 
| 
       172 
115 
     | 
    
         
             
                end
         
     | 
| 
       173 
116 
     | 
    
         | 
| 
       174 
117 
     | 
    
         
             
                class Config
         
     | 
| 
       175 
118 
     | 
    
         | 
| 
       176 
     | 
    
         
            -
                  DEFAULT_ENV 
     | 
| 
       177 
     | 
    
         
            -
                  DEFAULT_VIEWS_PATH  = 'views'.freeze
         
     | 
| 
       178 
     | 
    
         
            -
                  DEFAULT_PUBLIC_PATH = 'public'.freeze
         
     | 
| 
       179 
     | 
    
         
            -
                  DEFAULT_ENCODING    = 'utf-8'.freeze
         
     | 
| 
       180 
     | 
    
         
            -
             
     | 
| 
       181 
     | 
    
         
            -
                  attr_accessor :env, :root, :views_path, :public_path, :default_encoding
         
     | 
| 
       182 
     | 
    
         
            -
                  attr_accessor :settings, :template_helpers, :middlewares
         
     | 
| 
       183 
     | 
    
         
            -
                  attr_accessor :init_procs, :error_procs, :template_source, :logger, :router
         
     | 
| 
      
 119 
     | 
    
         
            +
                  DEFAULT_ENV = 'development'.freeze
         
     | 
| 
       184 
120 
     | 
    
         | 
| 
       185 
     | 
    
         
            -
                  attr_accessor : 
     | 
| 
       186 
     | 
    
         
            -
                  attr_accessor : 
     | 
| 
       187 
     | 
    
         
            -
                  attr_accessor : 
     | 
| 
      
 121 
     | 
    
         
            +
                  attr_accessor :env, :root
         
     | 
| 
      
 122 
     | 
    
         
            +
                  attr_accessor :method_override, :show_exceptions, :verbose_logging
         
     | 
| 
      
 123 
     | 
    
         
            +
                  attr_accessor :middlewares, :init_procs, :error_procs
         
     | 
| 
      
 124 
     | 
    
         
            +
                  attr_accessor :template_source, :logger, :router
         
     | 
| 
       188 
125 
     | 
    
         | 
| 
       189 
126 
     | 
    
         
             
                  def initialize
         
     | 
| 
       190 
     | 
    
         
            -
                    @env 
     | 
| 
       191 
     | 
    
         
            -
                    @root 
     | 
| 
       192 
     | 
    
         
            -
                    @ 
     | 
| 
       193 
     | 
    
         
            -
                    @ 
     | 
| 
       194 
     | 
    
         
            -
                    @ 
     | 
| 
       195 
     | 
    
         
            -
                    @ 
     | 
| 
       196 
     | 
    
         
            -
                    @ 
     | 
| 
       197 
     | 
    
         
            -
                    @ 
     | 
| 
       198 
     | 
    
         
            -
                    @ 
     | 
| 
       199 
     | 
    
         
            -
                    @ 
     | 
| 
       200 
     | 
    
         
            -
                    @ 
     | 
| 
       201 
     | 
    
         
            -
                    @logger           = Deas::NullLogger.new
         
     | 
| 
       202 
     | 
    
         
            -
                    @router           = Deas::Router.new
         
     | 
| 
       203 
     | 
    
         
            -
             
     | 
| 
       204 
     | 
    
         
            -
                    @dump_errors      = false
         
     | 
| 
       205 
     | 
    
         
            -
                    @method_override  = true
         
     | 
| 
       206 
     | 
    
         
            -
                    @reload_templates = false
         
     | 
| 
       207 
     | 
    
         
            -
                    @sessions         = false
         
     | 
| 
       208 
     | 
    
         
            -
                    @show_exceptions  = false
         
     | 
| 
       209 
     | 
    
         
            -
                    @static_files     = true
         
     | 
| 
       210 
     | 
    
         
            -
                    @verbose_logging  = true
         
     | 
| 
      
 127 
     | 
    
         
            +
                    @env             = DEFAULT_ENV
         
     | 
| 
      
 128 
     | 
    
         
            +
                    @root            = ENV['PWD']
         
     | 
| 
      
 129 
     | 
    
         
            +
                    @method_override = true
         
     | 
| 
      
 130 
     | 
    
         
            +
                    @show_exceptions = false
         
     | 
| 
      
 131 
     | 
    
         
            +
                    @verbose_logging = true
         
     | 
| 
      
 132 
     | 
    
         
            +
                    @middlewares     = []
         
     | 
| 
      
 133 
     | 
    
         
            +
                    @init_procs      = []
         
     | 
| 
      
 134 
     | 
    
         
            +
                    @error_procs     = []
         
     | 
| 
      
 135 
     | 
    
         
            +
                    @template_source = nil
         
     | 
| 
      
 136 
     | 
    
         
            +
                    @logger          = Deas::NullLogger.new
         
     | 
| 
      
 137 
     | 
    
         
            +
                    @router          = Deas::Router.new
         
     | 
| 
       211 
138 
     | 
    
         | 
| 
       212 
139 
     | 
    
         
             
                    @valid = nil
         
     | 
| 
       213 
140 
     | 
    
         
             
                  end
         
     | 
| 
       214 
141 
     | 
    
         | 
| 
       215 
     | 
    
         
            -
                  def views_root
         
     | 
| 
       216 
     | 
    
         
            -
                    File.expand_path(@views_path.to_s, @root.to_s)
         
     | 
| 
       217 
     | 
    
         
            -
                  end
         
     | 
| 
       218 
     | 
    
         
            -
             
     | 
| 
       219 
     | 
    
         
            -
                  def public_root
         
     | 
| 
       220 
     | 
    
         
            -
                    File.expand_path(@public_path.to_s, @root.to_s)
         
     | 
| 
       221 
     | 
    
         
            -
                  end
         
     | 
| 
       222 
     | 
    
         
            -
             
     | 
| 
       223 
142 
     | 
    
         
             
                  def template_source
         
     | 
| 
       224 
143 
     | 
    
         
             
                    @template_source ||= Deas::NullTemplateSource.new(self.root)
         
     | 
| 
       225 
144 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -242,19 +161,26 @@ module Deas 
     | 
|
| 
       242 
161 
     | 
    
         
             
                  def validate!
         
     | 
| 
       243 
162 
     | 
    
         
             
                    return @valid if !@valid.nil?  # only need to run this once per config
         
     | 
| 
       244 
163 
     | 
    
         | 
| 
       245 
     | 
    
         
            -
                    # ensure all user and plugin configs 
     | 
| 
      
 164 
     | 
    
         
            +
                    # ensure all user and plugin configs are applied
         
     | 
| 
       246 
165 
     | 
    
         
             
                    self.init_procs.each(&:call)
         
     | 
| 
       247 
166 
     | 
    
         
             
                    raise Deas::ServerRootError if self.root.nil?
         
     | 
| 
       248 
167 
     | 
    
         | 
| 
       249 
168 
     | 
    
         
             
                    # validate the router
         
     | 
| 
       250 
169 
     | 
    
         
             
                    self.router.validate!
         
     | 
| 
       251 
170 
     | 
    
         | 
| 
      
 171 
     | 
    
         
            +
                    # TODO: build final middleware stack when building the rack app, not here
         
     | 
| 
      
 172 
     | 
    
         
            +
                    # (once Sinatra is removed)
         
     | 
| 
      
 173 
     | 
    
         
            +
             
     | 
| 
      
 174 
     | 
    
         
            +
                    # prepend the method override middleware first.  This ensures that the
         
     | 
| 
      
 175 
     | 
    
         
            +
                    # it is run before any other middleware
         
     | 
| 
      
 176 
     | 
    
         
            +
                    self.middlewares.unshift([Rack::MethodOverride]) if self.method_override
         
     | 
| 
      
 177 
     | 
    
         
            +
             
     | 
| 
       252 
178 
     | 
    
         
             
                    # append the show exceptions and logging middlewares last.  This ensures
         
     | 
| 
       253 
179 
     | 
    
         
             
                    # that the logging and exception showing happens just before the app gets
         
     | 
| 
       254 
180 
     | 
    
         
             
                    # the request and just after the app sends a response.
         
     | 
| 
       255 
181 
     | 
    
         
             
                    self.middlewares << [Deas::ShowExceptions] if self.show_exceptions
         
     | 
| 
       256 
     | 
    
         
            -
                     
     | 
| 
       257 
     | 
    
         
            -
                    self.middlewares 
     | 
| 
      
 182 
     | 
    
         
            +
                    self.middlewares << Deas::Logging.middleware_args(self.verbose_logging)
         
     | 
| 
      
 183 
     | 
    
         
            +
                    self.middlewares.freeze
         
     | 
| 
       258 
184 
     | 
    
         | 
| 
       259 
185 
     | 
    
         
             
                    @valid = true # if it made it this far, its valid!
         
     | 
| 
       260 
186 
     | 
    
         
             
                  end
         
     |