waves-edge 2009.03.10.13.14
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/waves +30 -0
- 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/server.rb +68 -0
- data/lib/dispatchers/base.rb +68 -0
- data/lib/dispatchers/default.rb +25 -0
- data/lib/ext/float.rb +13 -0
- data/lib/ext/hash.rb +31 -0
- data/lib/ext/integer.rb +27 -0
- data/lib/ext/kernel.rb +20 -0
- data/lib/ext/module.rb +20 -0
- data/lib/ext/object.rb +33 -0
- 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 +59 -0
- data/lib/foundations/compact.rb +52 -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 +42 -0
- data/lib/helpers/formatting.rb +30 -0
- data/lib/helpers/layouts.rb +37 -0
- data/lib/helpers/model.rb +37 -0
- data/lib/helpers/view.rb +22 -0
- data/lib/layers/inflect/english.rb +35 -0
- data/lib/layers/mvc.rb +41 -0
- data/lib/layers/mvc/controllers.rb +41 -0
- data/lib/layers/mvc/extensions.rb +52 -0
- data/lib/layers/orm/migration.rb +79 -0
- data/lib/layers/orm/providers/active_record.rb +84 -0
- data/lib/layers/orm/providers/active_record/migrations/empty.rb.erb +9 -0
- data/lib/layers/orm/providers/active_record/tasks/generate.rb +28 -0
- data/lib/layers/orm/providers/active_record/tasks/schema.rb +22 -0
- data/lib/layers/orm/providers/data_mapper.rb +37 -0
- data/lib/layers/orm/providers/filebase.rb +25 -0
- data/lib/layers/orm/providers/sequel.rb +87 -0
- data/lib/layers/orm/providers/sequel/migrations/empty.rb.erb +9 -0
- data/lib/layers/orm/providers/sequel/tasks/generate.rb +30 -0
- data/lib/layers/orm/providers/sequel/tasks/schema.rb +16 -0
- data/lib/layers/renderers/erubis.rb +52 -0
- data/lib/layers/renderers/haml.rb +67 -0
- data/lib/layers/renderers/markaby.rb +41 -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 +13 -0
- data/lib/resources/mixin.rb +136 -0
- data/lib/resources/paths.rb +132 -0
- data/lib/runtime/configuration.rb +100 -0
- data/lib/runtime/console.rb +23 -0
- data/lib/runtime/logger.rb +35 -0
- data/lib/runtime/mime_types.rb +536 -0
- data/lib/runtime/mocks.rb +14 -0
- data/lib/runtime/monitor.rb +32 -0
- data/lib/runtime/request.rb +152 -0
- data/lib/runtime/response.rb +43 -0
- data/lib/runtime/response_mixin.rb +54 -0
- data/lib/runtime/runtime.rb +69 -0
- data/lib/runtime/server.rb +20 -0
- data/lib/runtime/session.rb +27 -0
- 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 +32 -0
- data/lib/tasks/generate.rb +85 -0
- data/lib/views/errors.rb +49 -0
- data/lib/views/mixin.rb +64 -0
- data/lib/waves.rb +63 -0
- 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/samples/blog/templates/errors/server_error_500.mab +2 -0
- data/samples/blog/templates/layouts/default.mab +19 -0
- data/samples/blog/templates/waves/status.mab +85 -0
- data/templates/classic/Rakefile +90 -0
- data/templates/classic/configurations/default.rb.erb +9 -0
- data/templates/classic/configurations/development.rb.erb +26 -0
- data/templates/classic/configurations/production.rb.erb +29 -0
- data/templates/classic/controllers/.gitignore +0 -0
- data/templates/classic/helpers/.gitignore +0 -0
- data/templates/classic/lib/tasks/.gitignore +0 -0
- data/templates/classic/models/.gitignore +0 -0
- data/templates/classic/public/css/.gitignore +0 -0
- data/templates/classic/public/flash/.gitignore +0 -0
- data/templates/classic/public/images/.gitignore +0 -0
- data/templates/classic/public/javascript/.gitignore +0 -0
- data/templates/classic/resources/.gitignore +0 -0
- data/templates/classic/resources/map.rb.erb +8 -0
- data/templates/classic/schema/migrations/.gitignore +0 -0
- data/templates/classic/startup.rb.erb +11 -0
- data/templates/classic/templates/errors/not_found_404.mab +7 -0
- data/templates/classic/templates/errors/server_error_500.mab +7 -0
- data/templates/classic/templates/layouts/default.mab +14 -0
- data/templates/classic/tmp/sessions/.gitignore +0 -0
- data/templates/classic/views/.gitignore +0 -0
- data/templates/compact/startup.rb.erb +11 -0
- data/test/ext/object.rb +55 -0
- data/test/ext/shortcuts.rb +73 -0
- data/test/helpers.rb +17 -0
- data/test/match/accept.rb +34 -0
- data/test/match/methods.rb +22 -0
- data/test/match/params.rb +33 -0
- data/test/match/path.rb +106 -0
- data/test/match/query.rb +40 -0
- data/test/process/request.rb +75 -0
- data/test/process/resource.rb +53 -0
- data/test/resources/path.rb +166 -0
- data/test/runtime/configurations.rb +19 -0
- data/test/runtime/request.rb +63 -0
- data/test/runtime/response.rb +55 -0
- data/test/views/views.rb +34 -0
- metadata +394 -0
@@ -0,0 +1,28 @@
|
|
1
|
+
namespace :generate do
|
2
|
+
|
3
|
+
desc 'Generate an ActiveRecord model, with name=<name>'
|
4
|
+
task :model do |task|
|
5
|
+
name = ENV['name']
|
6
|
+
model_name = name.camel_case
|
7
|
+
raise "Cannot generate Default yet" if model_name == 'Default'
|
8
|
+
|
9
|
+
filename = File.expand_path "models/#{model_name}.rb"
|
10
|
+
if File.exist?(filename)
|
11
|
+
$stderr.puts "#{filename} already exists"
|
12
|
+
exit
|
13
|
+
end
|
14
|
+
|
15
|
+
model = <<TEXT
|
16
|
+
module #{app_name}
|
17
|
+
module Models
|
18
|
+
class #{model_name} < Default
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
TEXT
|
24
|
+
|
25
|
+
File.write( filename, model )
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../../../migration"
|
2
|
+
|
3
|
+
namespace :schema do
|
4
|
+
|
5
|
+
desc "Create ActiveRecord migration with name=<name>"
|
6
|
+
task :migration do |task|
|
7
|
+
Waves::Layers::ORM.create_migration_for(ActiveRecord)
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "Performs ActiveRecord migrations to version=<version>"
|
11
|
+
task :migrate => :connect do |task|
|
12
|
+
version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
|
13
|
+
ActiveRecord::Migrator.migrate(Waves::Layers::ORM.migration_directory, version)
|
14
|
+
end
|
15
|
+
|
16
|
+
task :connect do
|
17
|
+
Waves.main.database
|
18
|
+
ActiveRecord::Base.logger = Logger.new($stdout)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Waves
|
2
|
+
module Layers
|
3
|
+
module ORM
|
4
|
+
|
5
|
+
# Work in Progress
|
6
|
+
module DataMapper
|
7
|
+
|
8
|
+
def self.included(app)
|
9
|
+
gem 'dm-core', '=0.9.0'
|
10
|
+
|
11
|
+
require 'data_mapper'
|
12
|
+
|
13
|
+
def app.database
|
14
|
+
@adapter ||= ::DataMapper.setup(:main_repository, config.database[:database])
|
15
|
+
end
|
16
|
+
|
17
|
+
app.auto_eval :Models do
|
18
|
+
auto_load true, :directories => [:models]
|
19
|
+
end
|
20
|
+
|
21
|
+
app.auto_eval :Configurations do
|
22
|
+
auto_eval :Mapping do
|
23
|
+
before true do
|
24
|
+
app.database #force adapter init if not already done
|
25
|
+
::DataMapper::Repository.context.push(::DataMapper::Repository.new(:main_repository))
|
26
|
+
end
|
27
|
+
always true do
|
28
|
+
::DataMapper::Repository.context.pop
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Waves
|
2
|
+
module Layers
|
3
|
+
module ORM
|
4
|
+
|
5
|
+
# The Filebase ORM layer configures model classes to use Filebase with a datastore located in
|
6
|
+
# <tt>db/model_name</tt>, where @model_name@ is the snakecased version of the class name.
|
7
|
+
#
|
8
|
+
# The Filebase store for Blog::Models::Entry would be located in <tt>db/entry</tt>, for example.
|
9
|
+
module Filebase
|
10
|
+
|
11
|
+
def self.included(app)
|
12
|
+
app.module_eval do
|
13
|
+
auto_eval( :Models ) do
|
14
|
+
auto_eval( true ) { include ::Filebase::Model[ :db / self.basename.snake_case ] }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module Waves
|
2
|
+
module Layers
|
3
|
+
module ORM # :nodoc:
|
4
|
+
|
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.
|
8
|
+
module Sequel
|
9
|
+
# On inclusion, this module:
|
10
|
+
# - creates on the application module a database method that establishes the Sequel connection
|
11
|
+
# - arranges for autoloading/autocreation of missing constants in the Models namespace
|
12
|
+
# - defines Sequel-specific helper methods on Waves::Controllers::Base
|
13
|
+
#
|
14
|
+
# The controller helper methdods are:
|
15
|
+
# - all
|
16
|
+
# - find(name)
|
17
|
+
# - create
|
18
|
+
# - delete(name)
|
19
|
+
# - update(name)
|
20
|
+
#
|
21
|
+
|
22
|
+
|
23
|
+
def self.included(app)
|
24
|
+
|
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
|
31
|
+
|
32
|
+
app.auto_create_module( :Models ) do
|
33
|
+
auto_create_class :Default, ::Sequel::Model
|
34
|
+
auto_load :Default, :directories => [ :models ]
|
35
|
+
auto_create_class true, :Default
|
36
|
+
auto_load true, :directories => [ :models ]
|
37
|
+
|
38
|
+
# set the Sequel dataset based on the model class name
|
39
|
+
# note that this is not done for app::Models::Default, as it isn't
|
40
|
+
# supposed to represent a table
|
41
|
+
auto_eval true do
|
42
|
+
next if self.basename == "Default"
|
43
|
+
default = self.superclass.basename.snake_case.pluralize.intern
|
44
|
+
if @dataset && @dataset.opts[:from] != [ default ]
|
45
|
+
# don't clobber dataset from autoloaded file
|
46
|
+
elsif respond_to? :set_dataset
|
47
|
+
set_dataset Waves.main.database[ basename.snake_case.pluralize.intern ]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
Waves::Controllers::Base.instance_eval do
|
54
|
+
include Waves::Layers::ORM::Sequel::ControllerMethods
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
# Mixed into Waves::Controllers::Base. Provides ORM-specific helper methods for model access.
|
60
|
+
module ControllerMethods
|
61
|
+
def all
|
62
|
+
model.all
|
63
|
+
end
|
64
|
+
|
65
|
+
def find( name )
|
66
|
+
model[ :name => name ] or not_found
|
67
|
+
end
|
68
|
+
|
69
|
+
def create
|
70
|
+
model.create( attributes.to_hash )
|
71
|
+
end
|
72
|
+
|
73
|
+
def delete( name )
|
74
|
+
find( name ).destroy
|
75
|
+
end
|
76
|
+
|
77
|
+
def update( name )
|
78
|
+
instance = find( name )
|
79
|
+
instance.update_with_params( attributes.to_hash )
|
80
|
+
instance
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
namespace :generate do
|
2
|
+
|
3
|
+
desc 'Generate a Sequel model, with name=<name>'
|
4
|
+
task :model do |task|
|
5
|
+
|
6
|
+
model_name = ENV['name'].camel_case
|
7
|
+
app_name = ( ENV['app'] || Dir.pwd.split('/').last ).camel_case
|
8
|
+
|
9
|
+
raise "Cannot generate Default yet" if model_name == 'Default'
|
10
|
+
|
11
|
+
filename = File.expand_path "models/#{model_name}.rb"
|
12
|
+
if File.exist?(filename)
|
13
|
+
$stderr.puts "#{filename} already exists"
|
14
|
+
exit
|
15
|
+
end
|
16
|
+
|
17
|
+
model = <<TEXT
|
18
|
+
module #{app_name}
|
19
|
+
module Models
|
20
|
+
class #{model_name} < Default
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
TEXT
|
26
|
+
|
27
|
+
File.write( filename, model )
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../../../migration"
|
2
|
+
|
3
|
+
namespace :schema do
|
4
|
+
|
5
|
+
desc "Create a new Sequel Migration with name=<name>"
|
6
|
+
task :migration do |task|
|
7
|
+
Waves::Layers::ORM.create_migration_for(Sequel)
|
8
|
+
end
|
9
|
+
|
10
|
+
desc "Performs Sequel migrations to version=<version>"
|
11
|
+
task :migrate do |task|
|
12
|
+
version = ENV['version']; version = version.to_i unless version.nil?
|
13
|
+
Sequel::Migrator.apply( Waves.main.database, Waves::Layers::ORM.migration_directory , version )
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'erubis'
|
2
|
+
|
3
|
+
module Waves
|
4
|
+
|
5
|
+
module Renderers
|
6
|
+
|
7
|
+
module Erubis
|
8
|
+
|
9
|
+
Extension = :erb
|
10
|
+
|
11
|
+
# extend Waves::Renderers::Mixin
|
12
|
+
|
13
|
+
def self.included( app )
|
14
|
+
Waves::Views.renderers << self
|
15
|
+
app.auto_eval :Views do
|
16
|
+
auto_eval true do
|
17
|
+
include ViewMethods
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# def self.render( path, assigns={} )
|
23
|
+
# eruby = ::Erubis::Eruby.new( template( path ) )
|
24
|
+
# helper = helper( path )
|
25
|
+
# context = ::Erubis::Context.new( assigns )
|
26
|
+
# ( class << context ; self ; end ).module_eval do
|
27
|
+
# include( helper )
|
28
|
+
# def << (s) ; s ; end
|
29
|
+
# end
|
30
|
+
# eruby.evaluate( context )
|
31
|
+
# end
|
32
|
+
|
33
|
+
module ViewMethods
|
34
|
+
|
35
|
+
def erb(string, assigns={})
|
36
|
+
eruby = ::Erubis::Eruby.new( string )
|
37
|
+
helper = Waves.main::Helpers[self.class.basename]
|
38
|
+
context = ::Erubis::Context.new( assigns )
|
39
|
+
( class << context ; self ; end ).module_eval do
|
40
|
+
include( helper )
|
41
|
+
def << (s) ; s ; end
|
42
|
+
end
|
43
|
+
eruby.evaluate( context )
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,67 @@
|
|
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.included(app)
|
14
|
+
Waves::Views.renderers << self
|
15
|
+
Waves::Views::Base.send(:include, self::ViewMethods)
|
16
|
+
end
|
17
|
+
|
18
|
+
module ViewMethods
|
19
|
+
|
20
|
+
def haml(string, assigns={})
|
21
|
+
engine = ::Haml::Engine.new( string )
|
22
|
+
scope = Scope.new
|
23
|
+
helper = Waves.main::Helpers[self.class.basename]
|
24
|
+
scope.meta_eval { include( helper ) }
|
25
|
+
scope.instance_eval do
|
26
|
+
assigns.each { |key,val| instance_variable_set("@#{key}",val) unless key == :request }
|
27
|
+
end
|
28
|
+
engine.render(scope, assigns)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
# def self.render( path, assigns )
|
34
|
+
# engine = ::Haml::Engine.new( template( path ) )
|
35
|
+
# scope = Scope.new
|
36
|
+
# helper = helper( path )
|
37
|
+
# scope.meta_eval { include( helper ) }
|
38
|
+
# scope.instance_eval do
|
39
|
+
# assigns.each { |key,val| instance_variable_set("@#{key}",val) unless key == :request }
|
40
|
+
# end
|
41
|
+
# engine.render(scope, assigns)
|
42
|
+
# end
|
43
|
+
|
44
|
+
class Scope
|
45
|
+
include Waves::Helpers::DocType
|
46
|
+
include Waves::Helpers::Layouts
|
47
|
+
include Waves::Helpers::Model
|
48
|
+
include Waves::Helpers::View
|
49
|
+
|
50
|
+
def <<(s)
|
51
|
+
eval("@haml_buffer", @binding).push_text s # add to rendered output
|
52
|
+
end
|
53
|
+
|
54
|
+
def capture(&block)
|
55
|
+
capture_haml(nil, &block)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
|
@@ -0,0 +1,41 @@
|
|
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
|
+
Waves::Views.renderers << self
|
15
|
+
# Waves::Views::Base.send(:include, self::ViewMethods)
|
16
|
+
app.auto_eval :Views do
|
17
|
+
auto_eval :Default do
|
18
|
+
include ViewMethods
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module ViewMethods
|
24
|
+
|
25
|
+
def mab(string, assigns={})
|
26
|
+
builder = ::Markaby::Builder.new( assigns )
|
27
|
+
helper = Waves.main::Helpers[self.class.basename]
|
28
|
+
builder.meta_eval { include( helper ) }
|
29
|
+
builder.instance_eval( string )
|
30
|
+
builder.to_s
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
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
|