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.
- data/bin/waves +19 -56
- data/doc/HISTORY +1 -0
- data/doc/LICENSE +22 -0
- data/doc/README +1 -0
- data/doc/VERSION +1 -0
- data/lib/caches/file.rb +48 -0
- data/lib/caches/memcached.rb +40 -0
- data/lib/caches/simple.rb +25 -0
- data/lib/caches/synchronized.rb +25 -0
- data/lib/commands/console.rb +35 -0
- data/lib/commands/generate.rb +52 -0
- data/lib/commands/help.rb +5 -0
- data/lib/commands/{waves-server.rb → server.rb} +16 -3
- data/lib/dispatchers/base.rb +21 -20
- data/lib/dispatchers/default.rb +11 -63
- data/lib/ext/float.rb +13 -0
- data/lib/{utilities → ext}/hash.rb +2 -2
- data/lib/{utilities → ext}/integer.rb +5 -2
- data/lib/ext/kernel.rb +20 -0
- data/lib/ext/module.rb +20 -0
- data/lib/{utilities → ext}/object.rb +3 -5
- data/lib/ext/string.rb +20 -0
- data/lib/ext/symbol.rb +11 -0
- data/lib/ext/tempfile.rb +5 -0
- data/lib/foundations/classic.rb +64 -0
- data/lib/foundations/compact.rb +50 -0
- data/lib/helpers/basic.rb +11 -0
- data/lib/helpers/doc_type.rb +34 -0
- data/lib/helpers/extended.rb +21 -0
- data/lib/helpers/form.rb +3 -1
- data/lib/helpers/formatting.rb +3 -3
- data/lib/helpers/layouts.rb +37 -0
- data/lib/helpers/model.rb +8 -4
- data/lib/helpers/view.rb +2 -4
- data/lib/layers/inflect/english.rb +67 -0
- data/lib/layers/mvc.rb +18 -18
- data/lib/layers/mvc/controllers.rb +41 -0
- data/lib/layers/mvc/extensions.rb +52 -0
- data/lib/layers/orm/{active_record.rb → providers/active_record.rb} +12 -18
- data/lib/layers/orm/{active_record → providers/active_record}/migrations/empty.rb.erb +0 -0
- data/lib/layers/orm/{active_record → providers/active_record}/tasks/generate.rb +1 -1
- data/lib/layers/orm/{active_record → providers/active_record}/tasks/schema.rb +1 -1
- data/lib/layers/orm/{data_mapper.rb → providers/data_mapper.rb} +3 -4
- data/lib/layers/orm/providers/filebase.rb +25 -0
- data/lib/layers/orm/{sequel.rb → providers/sequel.rb} +16 -12
- data/lib/layers/orm/{sequel → providers/sequel}/migrations/empty.rb.erb +0 -0
- data/lib/layers/orm/{sequel → providers/sequel}/tasks/generate.rb +5 -3
- data/lib/layers/orm/{sequel → providers/sequel}/tasks/schema.rb +2 -2
- data/lib/{renderers → layers/renderers}/erubis.rb +10 -13
- data/lib/layers/renderers/haml.rb +47 -0
- data/lib/layers/renderers/markaby.rb +29 -0
- data/lib/matchers/accept.rb +21 -0
- data/lib/matchers/base.rb +30 -0
- data/lib/matchers/content_type.rb +17 -0
- data/lib/matchers/path.rb +67 -0
- data/lib/matchers/query.rb +21 -0
- data/lib/matchers/request.rb +27 -0
- data/lib/matchers/resource.rb +19 -0
- data/lib/matchers/traits.rb +19 -0
- data/lib/matchers/uri.rb +20 -0
- data/lib/renderers/mixin.rb +15 -29
- data/lib/resources/mixin.rb +132 -0
- data/lib/resources/paths.rb +34 -0
- data/lib/runtime/configuration.rb +55 -135
- data/lib/runtime/console.rb +4 -1
- data/lib/runtime/logger.rb +24 -48
- data/lib/runtime/mime_types.rb +516 -2
- data/lib/runtime/mocks.rb +14 -0
- data/lib/runtime/monitor.rb +32 -0
- data/lib/runtime/request.rb +107 -39
- data/lib/runtime/response.rb +5 -2
- data/lib/runtime/response_mixin.rb +43 -22
- data/lib/runtime/runtime.rb +67 -0
- data/lib/runtime/server.rb +14 -101
- data/lib/runtime/session.rb +4 -43
- data/lib/runtime/worker.rb +86 -0
- data/lib/servers/base.rb +42 -0
- data/lib/servers/mongrel.rb +13 -0
- data/lib/servers/webrick.rb +13 -0
- data/lib/tasks/gem.rb +1 -0
- data/lib/tasks/generate.rb +67 -62
- data/lib/views/errors.rb +49 -0
- data/lib/views/mixin.rb +34 -82
- data/lib/waves.rb +36 -55
- data/samples/blog/Rakefile +25 -0
- data/samples/blog/configurations/default.rb +11 -0
- data/samples/blog/configurations/development.rb +29 -0
- data/samples/blog/configurations/production.rb +26 -0
- data/samples/blog/models/comment.rb +23 -0
- data/samples/blog/models/entry.rb +31 -0
- data/samples/blog/public/css/site.css +13 -0
- data/samples/blog/public/javascript/jquery-1.2.6.min.js +32 -0
- data/samples/blog/public/javascript/site.js +13 -0
- data/samples/blog/resources/entry.rb +39 -0
- data/samples/blog/resources/map.rb +9 -0
- data/samples/blog/schema/migrations/001_initial_schema.rb +17 -0
- data/samples/blog/schema/migrations/002_add_comments.rb +18 -0
- data/samples/blog/schema/migrations/templates/empty.rb.erb +9 -0
- data/samples/blog/startup.rb +8 -0
- data/samples/blog/templates/comment/add.mab +12 -0
- data/samples/blog/templates/comment/list.mab +6 -0
- data/samples/blog/templates/entry/edit.mab +14 -0
- data/samples/blog/templates/entry/list.mab +16 -0
- data/samples/blog/templates/entry/show.mab +18 -0
- data/samples/blog/templates/entry/summary.mab +9 -0
- data/samples/blog/templates/errors/not_found_404.mab +7 -0
- data/{app → samples/blog}/templates/errors/server_error_500.mab +0 -0
- data/samples/blog/templates/layouts/default.mab +19 -0
- data/samples/blog/templates/waves/status.mab +85 -0
- data/templates/classic/Rakefile +130 -0
- data/templates/classic/configurations/default.rb.erb +9 -0
- data/{app → templates/classic}/configurations/development.rb.erb +3 -7
- data/{app → templates/classic}/configurations/production.rb.erb +3 -4
- data/templates/classic/resources/map.rb.erb +8 -0
- data/templates/classic/startup.rb.erb +11 -0
- data/{app → templates/classic}/templates/errors/not_found_404.mab +0 -0
- data/templates/classic/templates/errors/server_error_500.mab +2 -0
- data/{app → templates/classic}/templates/layouts/default.mab +0 -0
- data/templates/compact/startup.rb.erb +11 -0
- metadata +967 -144
- data/app/Rakefile +0 -14
- data/app/bin/waves-console +0 -4
- data/app/bin/waves-server +0 -4
- data/app/configurations/mapping.rb.erb +0 -13
- data/app/controllers/.gitignore +0 -0
- data/app/doc/.gitignore +0 -0
- data/app/helpers/.gitignore +0 -0
- data/app/lib/application.rb.erb +0 -5
- data/app/lib/tasks/.gitignore +0 -0
- data/app/log/.gitignore +0 -0
- data/app/models/.gitignore +0 -0
- data/app/public/css/.gitignore +0 -0
- data/app/public/flash/.gitignore +0 -0
- data/app/public/images/.gitignore +0 -0
- data/app/public/javascript/.gitignore +0 -0
- data/app/schema/migrations/.gitignore +0 -0
- data/app/startup.rb +0 -5
- data/app/tmp/sessions/.gitignore +0 -0
- data/app/views/.gitignore +0 -0
- data/bin/waves-console +0 -4
- data/bin/waves-server +0 -4
- data/lib/commands/waves-console.rb +0 -21
- data/lib/controllers/base.rb +0 -11
- data/lib/controllers/mixin.rb +0 -165
- data/lib/foundations/default.rb +0 -26
- data/lib/foundations/simple.rb +0 -30
- data/lib/helpers/asset_helper.rb +0 -67
- data/lib/helpers/common.rb +0 -66
- data/lib/helpers/default.rb +0 -13
- data/lib/helpers/number_helper.rb +0 -25
- data/lib/helpers/tag_helper.rb +0 -58
- data/lib/helpers/url_helper.rb +0 -77
- data/lib/layers/default_errors.rb +0 -26
- data/lib/layers/orm/filebase.rb +0 -22
- data/lib/layers/simple.rb +0 -35
- data/lib/layers/simple_errors.rb +0 -23
- data/lib/mapping/mapping.rb +0 -289
- data/lib/mapping/pretty_urls.rb +0 -96
- data/lib/renderers/markaby.rb +0 -33
- data/lib/runtime/application.rb +0 -69
- data/lib/runtime/blackboard.rb +0 -57
- data/lib/runtime/debugger.rb +0 -9
- data/lib/runtime/response_proxy.rb +0 -30
- data/lib/tasks/cluster.rb +0 -26
- data/lib/utilities/inflect.rb +0 -110
- data/lib/utilities/inflect/english.rb +0 -84
- data/lib/utilities/module.rb +0 -21
- data/lib/utilities/proc.rb +0 -16
- data/lib/utilities/string.rb +0 -61
- data/lib/utilities/symbol.rb +0 -10
- data/lib/views/base.rb +0 -9
|
@@ -1,16 +1,11 @@
|
|
|
1
|
-
gem 'sequel', '>= 2.0.0'
|
|
2
|
-
require 'sequel'
|
|
3
|
-
require "#{File.dirname(__FILE__)}/sequel/tasks/schema" if defined?(Rake)
|
|
4
|
-
require "#{File.dirname(__FILE__)}/sequel/tasks/generate" if defined?(Rake)
|
|
5
|
-
|
|
6
1
|
module Waves
|
|
7
2
|
module Layers
|
|
8
3
|
module ORM # :nodoc:
|
|
9
4
|
|
|
10
|
-
#
|
|
11
|
-
# 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.
|
|
12
8
|
module Sequel
|
|
13
|
-
|
|
14
9
|
# On inclusion, this module:
|
|
15
10
|
# - creates on the application module a database method that establishes the Sequel connection
|
|
16
11
|
# - arranges for autoloading/autocreation of missing constants in the Models namespace
|
|
@@ -23,9 +18,16 @@ module Waves
|
|
|
23
18
|
# - delete(name)
|
|
24
19
|
# - update(name)
|
|
25
20
|
#
|
|
21
|
+
|
|
22
|
+
|
|
26
23
|
def self.included(app)
|
|
27
24
|
|
|
28
|
-
|
|
25
|
+
gem 'sequel', '>= 2.0.0'
|
|
26
|
+
require 'sequel'
|
|
27
|
+
require "#{File.dirname(__FILE__)}/sequel/tasks/schema" if defined?(Rake)
|
|
28
|
+
require "#{File.dirname(__FILE__)}/sequel/tasks/generate" if defined?(Rake)
|
|
29
|
+
|
|
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
|
-
|
|
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
|
|
File without changes
|
|
@@ -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
|
-
|
|
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 #{
|
|
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__)}
|
|
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.
|
|
13
|
+
Sequel::Migrator.apply( Waves.main.database, Waves::Layers::ORM.migration_directory , version )
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
end
|
|
@@ -5,10 +5,6 @@ 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
10
|
eval("_buf", @binding).concat s # add to rendered output
|
|
@@ -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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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 )
|
|
@@ -56,8 +52,9 @@ module Waves
|
|
|
56
52
|
context.render(eruby)
|
|
57
53
|
end
|
|
58
54
|
|
|
59
|
-
end
|
|
60
55
|
|
|
56
|
+
end
|
|
57
|
+
|
|
61
58
|
end
|
|
62
59
|
|
|
63
|
-
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
require 'haml'
|
|
2
|
+
|
|
3
|
+
module Waves
|
|
4
|
+
|
|
5
|
+
module Renderers
|
|
6
|
+
|
|
7
|
+
module Haml
|
|
8
|
+
|
|
9
|
+
Extension = :haml
|
|
10
|
+
|
|
11
|
+
extend Waves::Renderers::Mixin
|
|
12
|
+
|
|
13
|
+
def self.render( path, assigns )
|
|
14
|
+
engine = ::Haml::Engine.new( template( path ) )
|
|
15
|
+
scope = Scope.new
|
|
16
|
+
helper = helper( path )
|
|
17
|
+
scope.meta_eval { include( helper ) }
|
|
18
|
+
scope.instance_eval do
|
|
19
|
+
assigns.each { |key,val| instance_variable_set("@#{key}",val) unless key == :request }
|
|
20
|
+
end
|
|
21
|
+
engine.render(scope, assigns)
|
|
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
|
|
33
|
+
|
|
34
|
+
def capture(&block)
|
|
35
|
+
capture_haml(nil, &block)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
|
|
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
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Waves
|
|
2
|
+
|
|
3
|
+
module Matchers
|
|
4
|
+
|
|
5
|
+
class Resource
|
|
6
|
+
|
|
7
|
+
def initialize( options )
|
|
8
|
+
@matcher = Waves::Matchers::Request.new( options )
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def call( resource ) ; @matcher.call( resource.request ) ; end
|
|
12
|
+
def []( *args ) ; call( *args ) ; end
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|