waves-stable 0.7.7 → 2009.3.10

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 (236) hide show
  1. data/bin/waves +20 -74
  2. data/doc/HISTORY +1 -44
  3. data/doc/README +1 -0
  4. data/doc/VERSION +1 -0
  5. data/lib/caches/file.rb +48 -0
  6. data/lib/caches/memcached.rb +40 -0
  7. data/lib/caches/simple.rb +25 -0
  8. data/lib/caches/synchronized.rb +25 -0
  9. data/lib/commands/console.rb +35 -0
  10. data/lib/commands/generate.rb +52 -0
  11. data/lib/commands/help.rb +5 -0
  12. data/lib/commands/{waves-server.rb → server.rb} +16 -3
  13. data/lib/dispatchers/base.rb +22 -21
  14. data/lib/dispatchers/default.rb +10 -66
  15. data/lib/ext/float.rb +13 -0
  16. data/lib/{utilities → ext}/hash.rb +2 -2
  17. data/lib/{utilities → ext}/integer.rb +5 -2
  18. data/lib/ext/kernel.rb +20 -0
  19. data/lib/ext/module.rb +20 -0
  20. data/lib/{utilities → ext}/object.rb +3 -5
  21. data/lib/ext/string.rb +20 -0
  22. data/lib/ext/symbol.rb +11 -0
  23. data/lib/ext/tempfile.rb +5 -0
  24. data/lib/foundations/classic.rb +66 -0
  25. data/lib/foundations/compact.rb +50 -0
  26. data/lib/helpers/basic.rb +11 -0
  27. data/lib/helpers/doc_type.rb +34 -0
  28. data/lib/helpers/extended.rb +21 -0
  29. data/lib/helpers/form.rb +3 -1
  30. data/lib/helpers/formatting.rb +3 -3
  31. data/lib/helpers/layouts.rb +37 -0
  32. data/lib/helpers/model.rb +8 -4
  33. data/lib/helpers/view.rb +2 -4
  34. data/lib/layers/inflect/english.rb +48 -5
  35. data/lib/layers/mvc.rb +18 -18
  36. data/lib/layers/mvc/controllers.rb +41 -0
  37. data/lib/layers/mvc/extensions.rb +52 -0
  38. data/lib/layers/orm/migration.rb +1 -1
  39. data/lib/layers/orm/{active_record.rb → providers/active_record.rb} +9 -14
  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} +11 -7
  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 +13 -16
  50. data/lib/{renderers → layers/renderers}/haml.rb +27 -25
  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 +134 -0
  63. data/lib/resources/paths.rb +34 -0
  64. data/lib/runtime/configuration.rb +51 -136
  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 +41 -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 -57
  85. data/samples/blog/Rakefile +16 -5
  86. data/samples/blog/configurations/default.rb +11 -0
  87. data/samples/blog/configurations/development.rb +9 -11
  88. data/samples/blog/configurations/production.rb +11 -15
  89. data/samples/blog/models/comment.rb +9 -0
  90. data/samples/blog/models/entry.rb +17 -0
  91. data/samples/blog/public/css/site.css +13 -2
  92. data/samples/blog/public/javascript/jquery-1.2.6.min.js +32 -0
  93. data/samples/blog/resources/entry.rb +39 -0
  94. data/samples/blog/resources/map.rb +9 -0
  95. data/samples/blog/schema/migrations/001_initial_schema.rb +3 -3
  96. data/samples/blog/schema/migrations/002_add_comments.rb +2 -2
  97. data/samples/blog/startup.rb +8 -6
  98. data/samples/blog/templates/comment/add.mab +6 -4
  99. data/samples/blog/templates/comment/list.mab +4 -4
  100. data/samples/blog/templates/entry/{editor.mab → edit.mab} +7 -6
  101. data/samples/blog/templates/entry/list.mab +10 -5
  102. data/samples/blog/templates/entry/show.mab +16 -7
  103. data/samples/blog/templates/entry/summary.mab +8 -4
  104. data/samples/blog/templates/errors/not_found_404.mab +6 -1
  105. data/samples/blog/templates/layouts/default.mab +5 -3
  106. data/samples/blog/templates/waves/status.mab +85 -0
  107. data/{app → templates/classic}/Rakefile +21 -3
  108. data/templates/classic/configurations/default.rb.erb +9 -0
  109. data/{app → templates/classic}/configurations/development.rb.erb +3 -8
  110. data/{app → templates/classic}/configurations/production.rb.erb +3 -5
  111. data/{app → templates/classic}/controllers/.gitignore +0 -0
  112. data/{app/doc → templates/classic/helpers}/.gitignore +0 -0
  113. data/{app/helpers → templates/classic/lib/tasks}/.gitignore +0 -0
  114. data/{app/lib/tasks → templates/classic/models}/.gitignore +0 -0
  115. data/{app/log → templates/classic/public/css}/.gitignore +0 -0
  116. data/{app/models → templates/classic/public/flash}/.gitignore +0 -0
  117. data/{app/public/css → templates/classic/public/images}/.gitignore +0 -0
  118. data/{app/public/flash → templates/classic/public/javascript}/.gitignore +0 -0
  119. data/{app/public/images → templates/classic/resources}/.gitignore +0 -0
  120. data/templates/classic/resources/map.rb.erb +8 -0
  121. data/{app/public/javascript → templates/classic/schema/migrations}/.gitignore +0 -0
  122. data/templates/classic/startup.rb.erb +11 -0
  123. data/templates/classic/templates/errors/not_found_404.mab +7 -0
  124. data/templates/classic/templates/errors/server_error_500.mab +7 -0
  125. data/{app → templates/classic}/templates/layouts/default.mab +0 -0
  126. data/{app/schema/migrations → templates/classic/tmp/sessions}/.gitignore +0 -0
  127. data/{app/tmp/sessions → templates/classic/views}/.gitignore +0 -0
  128. data/templates/compact/startup.rb.erb +11 -0
  129. metadata +152 -258
  130. data/app/bin/waves-console +0 -4
  131. data/app/bin/waves-server +0 -4
  132. data/app/configurations/mapping.rb.erb +0 -14
  133. data/app/lib/application.rb.erb +0 -5
  134. data/app/startup.rb +0 -5
  135. data/app/templates/errors/not_found_404.mab +0 -2
  136. data/app/templates/errors/server_error_500.mab +0 -2
  137. data/app/views/.gitignore +0 -0
  138. data/bin/waves-console +0 -4
  139. data/bin/waves-server +0 -4
  140. data/lib/commands/waves-console.rb +0 -21
  141. data/lib/controllers/base.rb +0 -11
  142. data/lib/controllers/mixin.rb +0 -165
  143. data/lib/foundations/default.rb +0 -27
  144. data/lib/foundations/simple.rb +0 -30
  145. data/lib/helpers/asset_helper.rb +0 -67
  146. data/lib/helpers/common.rb +0 -66
  147. data/lib/helpers/default.rb +0 -13
  148. data/lib/helpers/number_helper.rb +0 -25
  149. data/lib/helpers/tag_helper.rb +0 -58
  150. data/lib/helpers/url_helper.rb +0 -77
  151. data/lib/layers/default_errors.rb +0 -26
  152. data/lib/layers/inflect/english/rules.rb +0 -88
  153. data/lib/layers/inflect/english/string.rb +0 -24
  154. data/lib/layers/orm/filebase.rb +0 -22
  155. data/lib/layers/simple.rb +0 -32
  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/module.rb +0 -21
  167. data/lib/utilities/proc.rb +0 -16
  168. data/lib/utilities/string.rb +0 -49
  169. data/lib/utilities/symbol.rb +0 -10
  170. data/lib/utilities/tempfile.rb +0 -9
  171. data/lib/views/base.rb +0 -9
  172. data/samples/blog/bin/waves-console +0 -3
  173. data/samples/blog/bin/waves-server +0 -3
  174. data/samples/blog/configurations/mapping.rb +0 -23
  175. data/samples/blog/doc/EMTPY +0 -0
  176. data/samples/blog/lib/application.rb +0 -5
  177. data/verify/app_generation/helpers.rb +0 -24
  178. data/verify/app_generation/startup.rb +0 -39
  179. data/verify/blackboard/blackboard_verify.rb +0 -92
  180. data/verify/blackboard/helpers.rb +0 -5
  181. data/verify/configurations/attributes.rb +0 -37
  182. data/verify/configurations/helpers.rb +0 -1
  183. data/verify/configurations/rack_integration.rb +0 -29
  184. data/verify/controllers/base.rb +0 -37
  185. data/verify/controllers/helpers.rb +0 -13
  186. data/verify/controllers/interface.rb +0 -51
  187. data/verify/core/helpers.rb +0 -3
  188. data/verify/core/utilities.rb +0 -177
  189. data/verify/foundations/default.rb +0 -86
  190. data/verify/foundations/default_application/Rakefile +0 -14
  191. data/verify/foundations/default_application/bin/waves-console +0 -3
  192. data/verify/foundations/default_application/bin/waves-server +0 -3
  193. data/verify/foundations/default_application/configurations/development.rb +0 -26
  194. data/verify/foundations/default_application/configurations/mapping.rb +0 -14
  195. data/verify/foundations/default_application/configurations/production.rb +0 -30
  196. data/verify/foundations/default_application/controllers/default.rb +0 -15
  197. data/verify/foundations/default_application/controllers/loaded.rb +0 -15
  198. data/verify/foundations/default_application/defaultapplication.db +0 -0
  199. data/verify/foundations/default_application/helpers/loaded.rb +0 -10
  200. data/verify/foundations/default_application/lib/application.rb +0 -5
  201. data/verify/foundations/default_application/models/default.rb +0 -13
  202. data/verify/foundations/default_application/models/loaded.rb +0 -13
  203. data/verify/foundations/default_application/schema/migrations/templates/empty.rb.erb +0 -9
  204. data/verify/foundations/default_application/startup.rb +0 -7
  205. data/verify/foundations/default_application/templates/errors/not_found_404.mab +0 -2
  206. data/verify/foundations/default_application/templates/errors/server_error_500.mab +0 -2
  207. data/verify/foundations/default_application/templates/layouts/default.mab +0 -14
  208. data/verify/foundations/default_application/views/default.rb +0 -7
  209. data/verify/foundations/default_application/views/loaded.rb +0 -15
  210. data/verify/foundations/helpers.rb +0 -1
  211. data/verify/foundations/simple.rb +0 -25
  212. data/verify/helpers.rb +0 -76
  213. data/verify/layers/data_mapper/association_verify.rb +0 -87
  214. data/verify/layers/default_errors.rb +0 -29
  215. data/verify/layers/helpers.rb +0 -1
  216. data/verify/layers/migration.rb +0 -33
  217. data/verify/layers/sequel/model.rb +0 -41
  218. data/verify/mapping/always.rb +0 -19
  219. data/verify/mapping/filters.rb +0 -65
  220. data/verify/mapping/handle.rb +0 -24
  221. data/verify/mapping/helpers.rb +0 -7
  222. data/verify/mapping/matches.rb +0 -27
  223. data/verify/mapping/named.rb +0 -29
  224. data/verify/mapping/options.rb +0 -17
  225. data/verify/mapping/path.rb +0 -40
  226. data/verify/mapping/response_proxy.rb +0 -50
  227. data/verify/mapping/threaded.rb +0 -25
  228. data/verify/requests/helpers.rb +0 -16
  229. data/verify/requests/request.rb +0 -73
  230. data/verify/requests/response.rb +0 -59
  231. data/verify/requests/session.rb +0 -54
  232. data/verify/views/helpers.rb +0 -1
  233. data/verify/views/rendering.rb +0 -34
  234. data/verify/views/templates/foo.erb +0 -0
  235. data/verify/views/templates/moo.erb +0 -0
  236. data/verify/views/templates/moo.mab +0 -0
@@ -2,10 +2,10 @@ module Waves
2
2
  module Layers
3
3
  module ORM # :nodoc:
4
4
 
5
- # Sets up the Sequel connection and configures AutoCode on Models, so that constants in that
6
- # namespace get loaded from file or created as subclasses of Models::Default
5
+ # The Sequel ORM layer sets up the Sequel connection and configures AutoCode on Models, so that constants in that
6
+ # namespace get loaded from file or created as subclasses of Models::Default. The dataset for models is set to the
7
+ # snakecased version of the model's class name.
7
8
  module Sequel
8
-
9
9
  # On inclusion, this module:
10
10
  # - creates on the application module a database method that establishes the Sequel connection
11
11
  # - arranges for autoloading/autocreation of missing constants in the Models namespace
@@ -18,6 +18,8 @@ module Waves
18
18
  # - delete(name)
19
19
  # - update(name)
20
20
  #
21
+
22
+
21
23
  def self.included(app)
22
24
 
23
25
  gem 'sequel', '>= 2.0.0'
@@ -25,7 +27,7 @@ module Waves
25
27
  require "#{File.dirname(__FILE__)}/sequel/tasks/schema" if defined?(Rake)
26
28
  require "#{File.dirname(__FILE__)}/sequel/tasks/generate" if defined?(Rake)
27
29
 
28
- def app.database ; @sequel ||= ::Sequel.open( config.database ) ; end
30
+ def app.database ; @sequel ||= ::Sequel.open( Waves.config.database ) ; end
29
31
 
30
32
  app.auto_create_module( :Models ) do
31
33
  include AutoCode
@@ -44,7 +46,9 @@ module Waves
44
46
  if @dataset && @dataset.opts[:from] != [ default ]
45
47
  # don't clobber dataset from autoloaded file
46
48
  else
47
- set_dataset Waves.application.database[ basename.snake_case.pluralize.intern ]
49
+ if respond_to? :set_dataset
50
+ set_dataset Waves.main.database[ basename.snake_case.pluralize.intern ]
51
+ end
48
52
  end
49
53
  end
50
54
  end
@@ -66,7 +70,7 @@ module Waves
66
70
  end
67
71
 
68
72
  def create
69
- model.create( attributes )
73
+ model.create( attributes.to_hash )
70
74
  end
71
75
 
72
76
  def delete( name )
@@ -75,7 +79,7 @@ module Waves
75
79
 
76
80
  def update( name )
77
81
  instance = find( name )
78
- instance.update_with_params( attributes )
82
+ instance.update_with_params( attributes.to_hash )
79
83
  instance
80
84
  end
81
85
  end
@@ -2,8 +2,10 @@ namespace :generate do
2
2
 
3
3
  desc 'Generate a Sequel model, with name=<name>'
4
4
  task :model do |task|
5
- name = ENV['name']
6
- model_name = name.camel_case
5
+
6
+ model_name = ENV['name'].camel_case
7
+ app_name = ( ENV['app'] || Dir.pwd.split('/').last ).camel_case
8
+
7
9
  raise "Cannot generate Default yet" if model_name == 'Default'
8
10
 
9
11
  filename = File.expand_path "models/#{name}.rb"
@@ -13,7 +15,7 @@ namespace :generate do
13
15
  end
14
16
 
15
17
  model = <<TEXT
16
- module #{Waves.application.name}
18
+ module #{app_name}
17
19
  module Models
18
20
  class #{model_name} < Default
19
21
 
@@ -1,4 +1,4 @@
1
- require "#{File.dirname(__FILE__)}/../../migration"
1
+ require "#{File.dirname(__FILE__)}/../../../migration"
2
2
 
3
3
  namespace :schema do
4
4
 
@@ -10,7 +10,7 @@ namespace :schema do
10
10
  desc "Performs Sequel migrations to version=<version>"
11
11
  task :migrate do |task|
12
12
  version = ENV['version']; version = version.to_i unless version.nil?
13
- Sequel::Migrator.apply( Waves.application.database, Waves::Layers::ORM.migration_directory , version )
13
+ Sequel::Migrator.apply( Waves.main.database, Waves::Layers::ORM.migration_directory , version )
14
14
  end
15
15
 
16
16
  end
@@ -5,13 +5,9 @@ module Erubis # :nodoc:
5
5
  # This is added to the Erubis Content class to allow the same helper methods
6
6
  # to be used with both Markaby and Erubis.
7
7
  class Context
8
- include Waves::Helpers::UrlHelper
9
- include Waves::Helpers::TagHelper
10
- include Waves::Helpers::AssetHelper
11
- include Waves::Helpers::NumberHelper
12
8
 
13
9
  def <<(s)
14
- eval("_buf", @binding).concat s # add to rendered output
10
+ eval("_buf << '#{s}'", @binding)
15
11
  end
16
12
 
17
13
  def capture
@@ -21,7 +17,7 @@ module Erubis # :nodoc:
21
17
  result
22
18
  end
23
19
 
24
- def render(eruby)
20
+ def to_s(eruby)
25
21
  unless @binding
26
22
  @binding = binding
27
23
  eval("_buf = ''; _context = []", @binding)
@@ -34,15 +30,15 @@ module Erubis # :nodoc:
34
30
  end
35
31
 
36
32
  module Waves
37
-
33
+
38
34
  module Renderers
39
35
 
40
- class Erubis
41
-
42
- include Renderers::Mixin
43
-
44
- extension :erb
45
-
36
+ module Erubis
37
+
38
+ Extension = :erb
39
+
40
+ extend Waves::Renderers::Mixin
41
+
46
42
  def self.render( path, assigns )
47
43
  eruby = ::Erubis::Eruby.new( template( path ) )
48
44
  helper = helper( path )
@@ -53,11 +49,12 @@ module Waves
53
49
  instance_variable_set("@#{key}",val)
54
50
  end
55
51
  end
56
- context.render(eruby)
52
+ context.to_s(eruby)
57
53
  end
58
54
 
59
- end
60
55
 
56
+ end
57
+
61
58
  end
62
59
 
63
- end
60
+ end
@@ -1,32 +1,15 @@
1
1
  require 'haml'
2
2
 
3
3
  module Waves
4
-
4
+
5
5
  module Renderers
6
6
 
7
- class Scope
8
- include Waves::Helpers::Common
9
- include Waves::Helpers::Model
10
- include Waves::Helpers::TagHelper
11
- include Waves::Helpers::UrlHelper
12
- include Waves::Helpers::View
13
-
14
- def <<(s)
15
- eval("@haml_buffer", @binding).push_text s # add to rendered output
16
- end
17
-
18
- def capture(&block)
19
- capture_haml(nil, &block)
20
- end
21
-
22
- end
23
-
24
- class Haml
25
-
26
- include Renderers::Mixin
27
-
28
- extension :haml
29
-
7
+ module Haml
8
+
9
+ Extension = :haml
10
+
11
+ extend Waves::Renderers::Mixin
12
+
30
13
  def self.render( path, assigns )
31
14
  engine = ::Haml::Engine.new( template( path ) )
32
15
  scope = Scope.new
@@ -37,9 +20,28 @@ module Waves
37
20
  end
38
21
  engine.render(scope, assigns)
39
22
  end
23
+
24
+ class Scope
25
+ include Waves::Helpers::DocType
26
+ include Waves::Helpers::Layouts
27
+ include Waves::Helpers::Model
28
+ include Waves::Helpers::View
29
+
30
+ def <<(s)
31
+ eval("@haml_buffer", @binding).push_text s # add to rendered output
32
+ end
40
33
 
41
- end
34
+ def capture(&block)
35
+ capture_haml(nil, &block)
36
+ end
37
+
38
+ end
42
39
 
40
+ end
41
+
43
42
  end
44
43
 
45
44
  end
45
+
46
+
47
+
@@ -0,0 +1,29 @@
1
+ module Waves
2
+
3
+ module Renderers
4
+
5
+ module Markaby
6
+
7
+ Extension = :mab
8
+
9
+ extend Waves::Renderers::Mixin
10
+
11
+ def self.included( app )
12
+ require 'markaby'
13
+ ::Markaby::Builder.set( :indent, 2 )
14
+ super
15
+ end
16
+
17
+ def self.render( path, assigns )
18
+ builder = ::Markaby::Builder.new( assigns )
19
+ helper = helper( path )
20
+ builder.meta_eval { include( helper ) }
21
+ builder.instance_eval( template( path ) )
22
+ builder.to_s
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,21 @@
1
+ module Waves
2
+
3
+ module Matchers
4
+
5
+ class Accept < Base
6
+
7
+ def initialize( options )
8
+ @constraints = {
9
+ :accept => options[ :accept ],
10
+ :lang => options[ :lang ],
11
+ :charset => options[ :charset ]
12
+ }
13
+ end
14
+
15
+ def call( request ) ; test( request ) ; end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,30 @@
1
+ module Waves
2
+
3
+ module Matchers
4
+
5
+ class Base
6
+
7
+ attr_accessor :constraints
8
+
9
+ def []( *args ) ; call( *args ) ; end
10
+
11
+ # used to provide consisting matching logic across all matchers
12
+ def test( request )
13
+ constraints.all? do | key, val |
14
+ if val.nil? or val == true
15
+ true
16
+ else
17
+ if val.respond_to? :call
18
+ val.call( request )
19
+ else
20
+ val == request.send( key ) or val === request.send( key ) or request.send( key ) === val
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,17 @@
1
+ module Waves
2
+
3
+ module Matchers
4
+
5
+ class ContentType < Base
6
+
7
+ def initialize( content_type ) ; @constraints = { :content_type => content_type } ; end
8
+
9
+ # we could maybe do something more sophisticated here, matching against content type patterns
10
+ # such */html or */xml, etc.; adapt from the matching done on accepts ... ?
11
+ def call( request ) ; test( request ) ; end
12
+
13
+ end
14
+
15
+ end
16
+
17
+ end
@@ -0,0 +1,67 @@
1
+ module Waves
2
+
3
+ module Matchers
4
+
5
+ class Path < Base
6
+
7
+ # Takes an array of pattern elements ... coming soon, support for formatted strings!
8
+ def initialize( pattern ) ; @pattern = pattern ; end
9
+
10
+ def call( request )
11
+ return {} if @pattern == true or @pattern == false or @pattern.nil?
12
+ path = extract_path( request ).reverse
13
+ return {} if ( path.empty? and @pattern.empty? )
14
+ capture = {}
15
+ match = @pattern.all? do | want |
16
+ case want
17
+ when true # means 1..-1
18
+ path = [] unless path.empty?
19
+ when Range
20
+ if want.end == -1
21
+ path = [] if path.length >= want.begin
22
+ else
23
+ path = [] if want.include? path.length
24
+ end
25
+ when String then want == path.pop
26
+ when Symbol then capture[ want ] = path.pop
27
+ when Regexp then want === path.pop
28
+ when Hash
29
+ key, value = want.to_a.first
30
+ case value
31
+ when true
32
+ ( capture[ key ], path = path.reverse, [] ) unless path.empty?
33
+ when Range
34
+ if value.end == -1
35
+ ( capture[ key ], path = path.reverse, [] ) if path.length >= value.begin
36
+ else
37
+ ( capture[ key ], path = path.reverse, [] ) if value.include? path.length
38
+ end
39
+ when String, Symbol
40
+ got = path.pop
41
+ capture[ key ] = got ? got : value.to_s
42
+ when Regexp then
43
+ got = path.pop
44
+ capture[ key ] = got if value === got
45
+ end
46
+ end
47
+ end
48
+ capture if match && path.empty?
49
+ end
50
+
51
+ private
52
+
53
+ # just a little helper method
54
+ def extract_path( request )
55
+ path = request.traits.waves.path
56
+ return path if path
57
+ path = request.path.split('/')
58
+ path.shift unless path.empty?
59
+ request.traits.waves.path = path
60
+ end
61
+
62
+ end
63
+
64
+
65
+ end
66
+
67
+ end
@@ -0,0 +1,21 @@
1
+ module Waves
2
+
3
+ module Matchers
4
+
5
+ class Query < Base
6
+
7
+ def initialize( pattern ) ; @pattern = ( pattern or {} ) ; end
8
+
9
+ def call( request )
10
+ @pattern.all? do | key, val |
11
+ key = key.to_s
12
+ ( ( val.respond_to?(:call) and val.call( request.query[ key ] ) ) or
13
+ ( request.query[ key ] and ( ( val == true ) or ( val === request.query[ key ] ) ) ) )
14
+ end
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,27 @@
1
+ module Waves
2
+
3
+ module Matchers
4
+
5
+ class Request < Base
6
+
7
+ def initialize( options )
8
+ @uri = Matchers::URI.new( options )
9
+ @constraints = {
10
+ :content_type => Matchers::ContentType.new( options[ :content_type ] ),
11
+ :accept => Matchers::Accept.new( options ),
12
+ :query => Matchers::Query.new( options[:query] ),
13
+ :traits => Matchers::Traits.new( options[:traits] )
14
+ }
15
+ end
16
+
17
+ def call( request )
18
+ if test( request ) and captured = @uri[ request ]
19
+ request.traits.waves.captured = captured
20
+ end
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end