dyoder-waves 0.7.7 → 0.8.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.
Files changed (171) hide show
  1. data/bin/waves +19 -56
  2. data/doc/HISTORY +1 -0
  3. data/doc/LICENSE +22 -0
  4. data/doc/README +1 -0
  5. data/doc/VERSION +1 -0
  6. data/lib/caches/file.rb +48 -0
  7. data/lib/caches/memcached.rb +40 -0
  8. data/lib/caches/simple.rb +25 -0
  9. data/lib/caches/synchronized.rb +25 -0
  10. data/lib/commands/console.rb +35 -0
  11. data/lib/commands/generate.rb +52 -0
  12. data/lib/commands/help.rb +5 -0
  13. data/lib/commands/{waves-server.rb → server.rb} +16 -3
  14. data/lib/dispatchers/base.rb +21 -20
  15. data/lib/dispatchers/default.rb +11 -63
  16. data/lib/ext/float.rb +13 -0
  17. data/lib/{utilities → ext}/hash.rb +2 -2
  18. data/lib/{utilities → ext}/integer.rb +5 -2
  19. data/lib/ext/kernel.rb +20 -0
  20. data/lib/ext/module.rb +20 -0
  21. data/lib/{utilities → ext}/object.rb +3 -5
  22. data/lib/ext/string.rb +20 -0
  23. data/lib/ext/symbol.rb +11 -0
  24. data/lib/ext/tempfile.rb +5 -0
  25. data/lib/foundations/classic.rb +64 -0
  26. data/lib/foundations/compact.rb +50 -0
  27. data/lib/helpers/basic.rb +11 -0
  28. data/lib/helpers/doc_type.rb +34 -0
  29. data/lib/helpers/extended.rb +21 -0
  30. data/lib/helpers/form.rb +3 -1
  31. data/lib/helpers/formatting.rb +3 -3
  32. data/lib/helpers/layouts.rb +37 -0
  33. data/lib/helpers/model.rb +8 -4
  34. data/lib/helpers/view.rb +2 -4
  35. data/lib/layers/inflect/english.rb +67 -0
  36. data/lib/layers/mvc.rb +18 -18
  37. data/lib/layers/mvc/controllers.rb +41 -0
  38. data/lib/layers/mvc/extensions.rb +52 -0
  39. data/lib/layers/orm/{active_record.rb → providers/active_record.rb} +12 -18
  40. data/lib/layers/orm/{active_record → providers/active_record}/migrations/empty.rb.erb +0 -0
  41. data/lib/layers/orm/{active_record → providers/active_record}/tasks/generate.rb +1 -1
  42. data/lib/layers/orm/{active_record → providers/active_record}/tasks/schema.rb +1 -1
  43. data/lib/layers/orm/{data_mapper.rb → providers/data_mapper.rb} +3 -4
  44. data/lib/layers/orm/providers/filebase.rb +25 -0
  45. data/lib/layers/orm/{sequel.rb → providers/sequel.rb} +16 -12
  46. data/lib/layers/orm/{sequel → providers/sequel}/migrations/empty.rb.erb +0 -0
  47. data/lib/layers/orm/{sequel → providers/sequel}/tasks/generate.rb +5 -3
  48. data/lib/layers/orm/{sequel → providers/sequel}/tasks/schema.rb +2 -2
  49. data/lib/{renderers → layers/renderers}/erubis.rb +10 -13
  50. data/lib/layers/renderers/haml.rb +47 -0
  51. data/lib/layers/renderers/markaby.rb +29 -0
  52. data/lib/matchers/accept.rb +21 -0
  53. data/lib/matchers/base.rb +30 -0
  54. data/lib/matchers/content_type.rb +17 -0
  55. data/lib/matchers/path.rb +67 -0
  56. data/lib/matchers/query.rb +21 -0
  57. data/lib/matchers/request.rb +27 -0
  58. data/lib/matchers/resource.rb +19 -0
  59. data/lib/matchers/traits.rb +19 -0
  60. data/lib/matchers/uri.rb +20 -0
  61. data/lib/renderers/mixin.rb +15 -29
  62. data/lib/resources/mixin.rb +132 -0
  63. data/lib/resources/paths.rb +34 -0
  64. data/lib/runtime/configuration.rb +55 -135
  65. data/lib/runtime/console.rb +4 -1
  66. data/lib/runtime/logger.rb +24 -48
  67. data/lib/runtime/mime_types.rb +516 -2
  68. data/lib/runtime/mocks.rb +14 -0
  69. data/lib/runtime/monitor.rb +32 -0
  70. data/lib/runtime/request.rb +107 -39
  71. data/lib/runtime/response.rb +5 -2
  72. data/lib/runtime/response_mixin.rb +43 -22
  73. data/lib/runtime/runtime.rb +67 -0
  74. data/lib/runtime/server.rb +14 -101
  75. data/lib/runtime/session.rb +4 -43
  76. data/lib/runtime/worker.rb +86 -0
  77. data/lib/servers/base.rb +42 -0
  78. data/lib/servers/mongrel.rb +13 -0
  79. data/lib/servers/webrick.rb +13 -0
  80. data/lib/tasks/gem.rb +1 -0
  81. data/lib/tasks/generate.rb +67 -62
  82. data/lib/views/errors.rb +49 -0
  83. data/lib/views/mixin.rb +34 -82
  84. data/lib/waves.rb +36 -55
  85. data/samples/blog/Rakefile +25 -0
  86. data/samples/blog/configurations/default.rb +11 -0
  87. data/samples/blog/configurations/development.rb +29 -0
  88. data/samples/blog/configurations/production.rb +26 -0
  89. data/samples/blog/models/comment.rb +23 -0
  90. data/samples/blog/models/entry.rb +31 -0
  91. data/samples/blog/public/css/site.css +13 -0
  92. data/samples/blog/public/javascript/jquery-1.2.6.min.js +32 -0
  93. data/samples/blog/public/javascript/site.js +13 -0
  94. data/samples/blog/resources/entry.rb +39 -0
  95. data/samples/blog/resources/map.rb +9 -0
  96. data/samples/blog/schema/migrations/001_initial_schema.rb +17 -0
  97. data/samples/blog/schema/migrations/002_add_comments.rb +18 -0
  98. data/samples/blog/schema/migrations/templates/empty.rb.erb +9 -0
  99. data/samples/blog/startup.rb +8 -0
  100. data/samples/blog/templates/comment/add.mab +12 -0
  101. data/samples/blog/templates/comment/list.mab +6 -0
  102. data/samples/blog/templates/entry/edit.mab +14 -0
  103. data/samples/blog/templates/entry/list.mab +16 -0
  104. data/samples/blog/templates/entry/show.mab +18 -0
  105. data/samples/blog/templates/entry/summary.mab +9 -0
  106. data/samples/blog/templates/errors/not_found_404.mab +7 -0
  107. data/{app → samples/blog}/templates/errors/server_error_500.mab +0 -0
  108. data/samples/blog/templates/layouts/default.mab +19 -0
  109. data/samples/blog/templates/waves/status.mab +85 -0
  110. data/templates/classic/Rakefile +130 -0
  111. data/templates/classic/configurations/default.rb.erb +9 -0
  112. data/{app → templates/classic}/configurations/development.rb.erb +3 -7
  113. data/{app → templates/classic}/configurations/production.rb.erb +3 -4
  114. data/templates/classic/resources/map.rb.erb +8 -0
  115. data/templates/classic/startup.rb.erb +11 -0
  116. data/{app → templates/classic}/templates/errors/not_found_404.mab +0 -0
  117. data/templates/classic/templates/errors/server_error_500.mab +2 -0
  118. data/{app → templates/classic}/templates/layouts/default.mab +0 -0
  119. data/templates/compact/startup.rb.erb +11 -0
  120. metadata +967 -144
  121. data/app/Rakefile +0 -14
  122. data/app/bin/waves-console +0 -4
  123. data/app/bin/waves-server +0 -4
  124. data/app/configurations/mapping.rb.erb +0 -13
  125. data/app/controllers/.gitignore +0 -0
  126. data/app/doc/.gitignore +0 -0
  127. data/app/helpers/.gitignore +0 -0
  128. data/app/lib/application.rb.erb +0 -5
  129. data/app/lib/tasks/.gitignore +0 -0
  130. data/app/log/.gitignore +0 -0
  131. data/app/models/.gitignore +0 -0
  132. data/app/public/css/.gitignore +0 -0
  133. data/app/public/flash/.gitignore +0 -0
  134. data/app/public/images/.gitignore +0 -0
  135. data/app/public/javascript/.gitignore +0 -0
  136. data/app/schema/migrations/.gitignore +0 -0
  137. data/app/startup.rb +0 -5
  138. data/app/tmp/sessions/.gitignore +0 -0
  139. data/app/views/.gitignore +0 -0
  140. data/bin/waves-console +0 -4
  141. data/bin/waves-server +0 -4
  142. data/lib/commands/waves-console.rb +0 -21
  143. data/lib/controllers/base.rb +0 -11
  144. data/lib/controllers/mixin.rb +0 -165
  145. data/lib/foundations/default.rb +0 -26
  146. data/lib/foundations/simple.rb +0 -30
  147. data/lib/helpers/asset_helper.rb +0 -67
  148. data/lib/helpers/common.rb +0 -66
  149. data/lib/helpers/default.rb +0 -13
  150. data/lib/helpers/number_helper.rb +0 -25
  151. data/lib/helpers/tag_helper.rb +0 -58
  152. data/lib/helpers/url_helper.rb +0 -77
  153. data/lib/layers/default_errors.rb +0 -26
  154. data/lib/layers/orm/filebase.rb +0 -22
  155. data/lib/layers/simple.rb +0 -35
  156. data/lib/layers/simple_errors.rb +0 -23
  157. data/lib/mapping/mapping.rb +0 -289
  158. data/lib/mapping/pretty_urls.rb +0 -96
  159. data/lib/renderers/markaby.rb +0 -33
  160. data/lib/runtime/application.rb +0 -69
  161. data/lib/runtime/blackboard.rb +0 -57
  162. data/lib/runtime/debugger.rb +0 -9
  163. data/lib/runtime/response_proxy.rb +0 -30
  164. data/lib/tasks/cluster.rb +0 -26
  165. data/lib/utilities/inflect.rb +0 -110
  166. data/lib/utilities/inflect/english.rb +0 -84
  167. data/lib/utilities/module.rb +0 -21
  168. data/lib/utilities/proc.rb +0 -16
  169. data/lib/utilities/string.rb +0 -61
  170. data/lib/utilities/symbol.rb +0 -10
  171. data/lib/views/base.rb +0 -9
data/bin/waves CHANGED
@@ -1,66 +1,29 @@
1
1
  #!/usr/bin/env ruby
2
- require 'rubygems'
3
- require 'choice'
4
- require 'rakegen'
5
-
6
- # if we're in the waves source, prepend it to the load path
7
- waves_lib = File.expand_path( "#{File.dirname(__FILE__)}/../../waves/lib" )
8
- $:.unshift waves_lib if File.exist?(waves_lib)
9
- require 'waves'
10
-
11
- begin
12
- require 'utilities/string'
13
- rescue LoadError
14
- require File.join(File.dirname(__FILE__), '..', 'lib', 'utilities', 'string')
15
- end
16
-
17
- Choice.options do
18
- banner 'Usage: waves path/to/app [-h]'
19
- option :help do
20
- long '--help'
21
- desc 'Show this message'
22
- end
23
-
24
- option :orm do
25
- short '-o'
26
- long '--orm=ORM'
27
- desc "Select an ORM (e.g. active_record, sequel, none)"
28
- default "sequel"
29
- end
30
-
31
- end
32
2
 
33
- orm = Choice.choices.orm.snake_case
34
- orm_require, orm_include = case orm
35
- when 'sequel'
36
- ["require 'layers/orm/sequel'", "include Waves::Layers::ORM::Sequel"]
37
- when 'active_record'
38
- ["require 'layers/orm/active_record'", "include Waves::Layers::ORM::ActiveRecord"]
39
- when 'none'
40
- ['', '# This app was generated without an ORM layer']
41
- end
3
+ # WARNING: This strange preamble might look easy to clean-up, but it is needed
4
+ # to work with older versions of gems (< 1.2).
42
5
 
43
- app_path = ARGV[0]
44
- app_name = File.basename(app_path)
45
- if app_name =~ /[^\w\d_]/
46
- raise ArgumentError, <<-TEXT
47
- Unusable name: \"#{app_name}\"
48
- Application names may contain only letters, numbers, and underscores."
49
- TEXT
50
- end
6
+ require 'rubygems'
51
7
 
52
- template = "#{WAVES}/app"
8
+ WAVES = "#{File.dirname(__FILE__)}/.." unless defined? WAVES
53
9
 
54
- generator = Rakegen.new("waves:app") do |gen|
55
- gen.source = template
56
- gen.target = app_path
57
- gen.template_assigns = {:name => app_name.camel_case, :orm_require => orm_require, :orm_include => orm_include }
58
- gen.executables = %w{ bin/waves-console bin/waves-server}
10
+ waves = [
11
+ WAVES, ENV['WAVES'], './waves'
12
+ ].compact.map { |dir| File.join(dir, 'lib') }.find( &File.method( :directory? ) )
13
+ if waves
14
+ $: << waves
15
+ waves = File.join( waves, 'waves' )
16
+ else
17
+ waves = 'waves'
59
18
  end
19
+ require waves
60
20
 
61
- puts "** Creating new Waves application ..."
62
21
 
63
- Rake::Task["waves:app"].invoke
22
+ puts "** Waves #{Waves.version} **"
64
23
 
65
- puts "** Application created!"
66
24
 
25
+ begin
26
+ require "commands/#{ARGV.first}"
27
+ rescue LoadError => e
28
+ require "commands/help"
29
+ end
data/doc/HISTORY ADDED
@@ -0,0 +1 @@
1
+ See http://github.com/dyoder/waves/tree/master
data/doc/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2007-8 Dan Yoder
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
data/doc/README ADDED
@@ -0,0 +1 @@
1
+ To find out more about Waves, visit our Web site, http://rubywaves.com.
data/doc/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.8.0
@@ -0,0 +1,48 @@
1
+ require 'caches/synchronized'
2
+
3
+ module Waves
4
+ module Caches
5
+
6
+ class File < Simple
7
+
8
+ def initialize( args )
9
+ raise ArgumentError, ":directory is nil" if args[ :directory ].nil?
10
+ @directory = args[ :directory ] ; @keys = []
11
+ end
12
+
13
+ def store( key, value )
14
+ @keys << key
15
+ ::File.open( @directory / key, 'w') { |f| Marshal.dump( value, f ) }
16
+ end
17
+
18
+ def delete( key )
19
+ if @keys.include? key
20
+ ::File.delete( @directory / key )
21
+ @keys.delete( key )
22
+ end
23
+ end
24
+
25
+ def clear
26
+ @keys.each { |key| delete( key ) }
27
+ end
28
+
29
+ def fetch( key )
30
+ Marshal.load( ::File.read( @directory / key ) ) if @keys.include?( key )
31
+ rescue ArgumentError
32
+ nil
33
+ end
34
+
35
+ end
36
+
37
+ class SynchronizedFile < Synchronized
38
+
39
+ def initialize( args )
40
+ super( File.new( args ) )
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+ end
47
+
48
+
@@ -0,0 +1,40 @@
1
+ require 'memcached'
2
+ module Waves
3
+ module Caches
4
+ class Memcached < Simple
5
+
6
+ def initialize( args )
7
+ raise ArgumentError, ":servers is nil" if args[ :servers ].nil?
8
+ @cache = ::Memcached.new( args[ :servers ], args[ :options ] || {} )
9
+ end
10
+
11
+ def store( key,value, ttl = 0, marshal = true )
12
+ cache = @cache.clone; cache.add( key.to_s, value, ttl, marshal ); cache.destroy
13
+ end
14
+
15
+ def fetch( key )
16
+ cache = @cache.clone; cache.get( key.to_s ); cache.destroy
17
+ rescue ::Memcached::NotFound => e
18
+ nil
19
+ end
20
+
21
+ def delete( key )
22
+ cache = @cache.clone; cache.delete( key.to_s ); cache.destroy
23
+ end
24
+
25
+ def clear
26
+ cache = @cache.clone; cache.flush; cache.destroy
27
+ end
28
+
29
+ end
30
+
31
+ class SynchronizedMemcached < Synchronized
32
+
33
+ def initialize( args )
34
+ super( Memcached.new( args ) )
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,25 @@
1
+ module Waves
2
+
3
+ module Caches
4
+
5
+ #
6
+ # This class is more or less here to establish the basic interface for caching and for
7
+ # lightweight caching that doesn't require a dedicated caching process.
8
+ #
9
+
10
+ class Simple
11
+
12
+ def initialize( hash = {} ) ; @cache = hash ; end
13
+ def [](key) ; fetch(key) ; end
14
+ def []=( key, value ) ; store( key, value ) ; end
15
+ def exists?( key ) ; fetch(key) == nil ? false : true ; end
16
+ alias :exist? :exists?
17
+ def store( key, val ) ; @cache[ key ] = val ; end
18
+ def fetch( key ) ; @cache[ key ] ; end
19
+ def delete( key ) ; @cache.delete( key ) ; end
20
+ def clear ; @cache = {} ; end
21
+
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+
2
+ module Waves
3
+
4
+ module Caches
5
+
6
+ #
7
+ # This is just a proxy for the real cache, but adds Waves synchronization
8
+ #
9
+
10
+ class Synchronized
11
+
12
+ def initialize( cache ) ; @cache = cache ; end
13
+ def [](key) ; @cache.fetch(key) ; end
14
+ def []=( key, value ) ; @cache.store( key, value ) ; end
15
+ def exists?( key ) ; @cache.has_key?( key ) ; end
16
+ alias :exist? :exists?
17
+ def store( key, val ) ; synchronize { @cache.store( key, value ) }; end
18
+ def fetch( keys ) ; @cache.fetch( key ) ; end
19
+ def delete( key ) ; synchronize { @cache.delete( key ) } ; end
20
+ def clear ; synchronize { @cache.clear } ; end
21
+ def synchronize( &block ) ; Waves.synchronize( &block ) ; end
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,35 @@
1
+ require 'choice'
2
+
3
+ Choice.options do
4
+ header 'Run waves in console mode.'
5
+ header ''
6
+ option :mode do
7
+ short '-c'
8
+ long '--config=CONFIG'
9
+ desc 'Configuration to use.'
10
+ desc 'Defaults to development.'
11
+ cast Symbol
12
+ end
13
+ separator ''
14
+ option :startup do
15
+ short '-s'
16
+ long '--startup'
17
+ desc 'Startup file to load.'
18
+ desc 'Defaults to "startup.rb"'
19
+ end
20
+ separator ''
21
+ end
22
+
23
+ require 'runtime/console'
24
+
25
+ begin
26
+ console = Waves::Console.load( Choice.choices )
27
+ Object.send(:define_method, :waves) { console }
28
+ require 'irb'
29
+ require 'irb/completion'
30
+ ARGV.clear
31
+ Waves.log.info "Runtime console starting ..."
32
+ IRB.start
33
+ rescue LoadError => e
34
+ puts e.message
35
+ end
@@ -0,0 +1,52 @@
1
+ require 'choice'
2
+ require 'rakegen'
3
+
4
+ waves = File.expand_path( File.dirname( __FILE__ ) / '..' / '..' )
5
+ orms = Dir[ waves / :lib / :layers / :orm / :providers / '*.rb' ].map { |path| File.basename( path, '.rb' )}
6
+ templates = Dir[ waves / :templates / '*' ].map { |path| File.basename( path ) }
7
+
8
+ Choice.options do
9
+
10
+ option :help do
11
+ long '--help'
12
+ desc 'Show this message'
13
+ end
14
+
15
+ option :orm do
16
+ short '-o'
17
+ long '--orm=ORM'
18
+ desc "Select an ORM (currently supported: #{orms * ', '} )"
19
+ valid orms
20
+ end
21
+
22
+ option :template do
23
+ short '-t'
24
+ long '--template=TEMPLATE'
25
+ desc "Select a template for your app (options: #{templates * ', '})."
26
+ valid templates
27
+ default 'classic'
28
+ end
29
+
30
+ option :name, :required => true do
31
+ short '-n'
32
+ long '--name'
33
+ desc "Select a name for the application. Use only letters, numbers, dashes, or underscores."
34
+ validate /^[\w\d\-]+$/
35
+ end
36
+
37
+ end
38
+
39
+ options = Choice.choices
40
+
41
+ puts "** Creating new Waves application ..."
42
+
43
+ # why do i have to do this?
44
+ FileUtils.mkdir( File.expand_path( options.name ) )
45
+
46
+ generator = Rakegen.new("generate") do |gen|
47
+ gen.source = waves / :templates / options.template
48
+ gen.target = File.expand_path( options.name )
49
+ gen.template_assigns = options.merge( :name => options.name.gsub('-','_').camel_case )
50
+ end.invoke
51
+
52
+ puts "** Application created!"
@@ -0,0 +1,5 @@
1
+ puts <<-HELP
2
+ Usage: waves [ gen | start | console ] [ options ]
3
+ Run a waves command with the given options. Use --help with any command to learn
4
+ more about that command. EXAMPLE: waves gen --help
5
+ HELP
@@ -39,6 +39,12 @@ Choice.options do
39
39
  desc 'Run as a daemon.'
40
40
  end
41
41
  separator ''
42
+ option :turbo do
43
+ short '-t'
44
+ long '--turbo'
45
+ desc 'For thread-safe applications, run without dispatch level mutex.'
46
+ end
47
+ separator ''
42
48
  option :debugger do
43
49
  short '-u'
44
50
  long '--debugger'
@@ -47,9 +53,16 @@ Choice.options do
47
53
  separator ''
48
54
  option :startup do
49
55
  short '-s'
50
- long '--startup'
56
+ long '--startup=PATH'
51
57
  desc 'Startup file to load.'
52
- desc 'Defaults to "lib/startup.rb"'
58
+ desc 'Defaults to "startup.rb"'
53
59
  end
60
+ separator ''
61
+ end
62
+
63
+ require 'runtime/server'
64
+ begin
65
+ Waves::Server.run( Choice.choices )
66
+ rescue LoadError => e
67
+ puts e.message
54
68
  end
55
- Waves::Server.run( Choice.choices )
@@ -2,11 +2,9 @@ module Waves
2
2
 
3
3
  module Dispatchers
4
4
 
5
- # A NotFoundError means what you think it means. The dispatchers included with Waves do not
6
- # natively intercept this exception. Instead an exception handler must be registered in the application
7
- # mappings. The Simple foundation registers a minimal handler, while the Default foundation registers
8
- # a slightly fleshier one.
9
- class NotFoundError < Exception ; end
5
+ class NotFoundError < RuntimeError ; end
6
+ class Unauthorized < RuntimeError; end
7
+ class BadRequest < RuntimeError; end
10
8
 
11
9
  # Redirect exceptions are rescued by the Waves dispatcher and used to set the
12
10
  # response status and location.
@@ -16,32 +14,35 @@ module Waves
16
14
  @path = path
17
15
  @status = status
18
16
  end
17
+ def message
18
+ "location: #{@path} status: #{@status}"
19
+ end
19
20
  end
20
21
 
21
- # Waves::Dispatchers::Base provides the basic request processing structure.
22
- # All other Waves dispatchers should inherit from it. It creates a Waves request,
23
- # determines whether to enclose the request processing in a mutex, benchmarks it,
24
- # logs it, and handles common exceptions and redirects. Derived classes need only
25
- # process the request within the +safe+ method, which must take a Waves::Request and return a Waves::Response.
26
-
22
+ #
23
+ # Waves::Dispatchers::Base provides the basic request processing structure
24
+ # for a Rack application. It creates a Waves request, determines whether
25
+ # to enclose the request processing in a mutex benchmarks it, logs it,
26
+ # and handles redirects. Derived classes need only process the request
27
+ # within the +safe+ method, which must take a Waves::Request and return
28
+ # a Waves::Response.
29
+ #
30
+
27
31
  class Base
28
32
 
29
33
  # As with any Rack application, a Waves dispatcher must provide a call method
30
- # that takes an +env+ parameter.
34
+ # that takes an +env+ hash.
31
35
  def call( env )
32
- if Waves.config.synchronize?
33
- Waves::Application.instance.synchronize { _call( env ) }
36
+ response = if Waves.synchronize? or Waves.debug?
37
+ Waves.synchronize { Waves.reload ; _call( env ) }
34
38
  else
35
39
  _call( env )
36
40
  end
37
41
  end
38
42
 
39
43
  # Called by event driven servers like thin and ebb. Returns true if
40
- # the server should run the request in a separate thread, as determined by
41
- # Configurations::Mapping#threaded?
42
- def deferred?( env )
43
- Waves::Application.instance.mapping.threaded?( env )
44
- end
44
+ # the server should run the request in a separate thread.
45
+ def deferred?( env ) ; Waves.config.resource.new( Waves::Request.new( env ) ).deferred? ; end
45
46
 
46
47
  private
47
48
 
@@ -59,7 +60,7 @@ module Waves
59
60
  Waves::Logger.info "#{request.method}: #{request.url} handled in #{(t*1000).round} ms."
60
61
  response.finish
61
62
  end
62
-
63
+
63
64
  end
64
65
 
65
66
  end