waves-stable 0.7.7
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/app/Rakefile +72 -0
- data/app/bin/waves-console +4 -0
- data/app/bin/waves-server +4 -0
- data/app/configurations/development.rb.erb +31 -0
- data/app/configurations/mapping.rb.erb +14 -0
- data/app/configurations/production.rb.erb +31 -0
- data/app/controllers/.gitignore +0 -0
- data/app/doc/.gitignore +0 -0
- data/app/helpers/.gitignore +0 -0
- data/app/lib/application.rb.erb +5 -0
- 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 +5 -0
- data/app/templates/errors/not_found_404.mab +2 -0
- data/app/templates/errors/server_error_500.mab +2 -0
- data/app/templates/layouts/default.mab +14 -0
- data/app/tmp/sessions/.gitignore +0 -0
- data/app/views/.gitignore +0 -0
- data/bin/waves +84 -0
- data/bin/waves-console +4 -0
- data/bin/waves-server +4 -0
- data/doc/HISTORY +44 -0
- data/doc/LICENSE +22 -0
- data/lib/commands/waves-console.rb +21 -0
- data/lib/commands/waves-server.rb +55 -0
- data/lib/controllers/base.rb +11 -0
- data/lib/controllers/mixin.rb +165 -0
- data/lib/dispatchers/base.rb +67 -0
- data/lib/dispatchers/default.rb +81 -0
- data/lib/foundations/default.rb +27 -0
- data/lib/foundations/simple.rb +30 -0
- data/lib/helpers/asset_helper.rb +67 -0
- data/lib/helpers/common.rb +66 -0
- data/lib/helpers/default.rb +13 -0
- data/lib/helpers/form.rb +40 -0
- data/lib/helpers/formatting.rb +30 -0
- data/lib/helpers/model.rb +33 -0
- data/lib/helpers/number_helper.rb +25 -0
- data/lib/helpers/tag_helper.rb +58 -0
- data/lib/helpers/url_helper.rb +77 -0
- data/lib/helpers/view.rb +24 -0
- data/lib/layers/default_errors.rb +26 -0
- data/lib/layers/inflect/english.rb +24 -0
- data/lib/layers/inflect/english/rules.rb +88 -0
- data/lib/layers/inflect/english/string.rb +24 -0
- data/lib/layers/mvc.rb +54 -0
- data/lib/layers/orm/active_record.rb +92 -0
- data/lib/layers/orm/active_record/migrations/empty.rb.erb +9 -0
- data/lib/layers/orm/active_record/tasks/generate.rb +28 -0
- data/lib/layers/orm/active_record/tasks/schema.rb +22 -0
- data/lib/layers/orm/data_mapper.rb +38 -0
- data/lib/layers/orm/filebase.rb +22 -0
- data/lib/layers/orm/migration.rb +79 -0
- data/lib/layers/orm/sequel.rb +86 -0
- data/lib/layers/orm/sequel/migrations/empty.rb.erb +9 -0
- data/lib/layers/orm/sequel/tasks/generate.rb +28 -0
- data/lib/layers/orm/sequel/tasks/schema.rb +16 -0
- data/lib/layers/simple.rb +32 -0
- data/lib/layers/simple_errors.rb +23 -0
- data/lib/mapping/mapping.rb +289 -0
- data/lib/mapping/pretty_urls.rb +96 -0
- data/lib/renderers/erubis.rb +63 -0
- data/lib/renderers/haml.rb +45 -0
- data/lib/renderers/markaby.rb +33 -0
- data/lib/renderers/mixin.rb +50 -0
- data/lib/runtime/application.rb +69 -0
- data/lib/runtime/blackboard.rb +57 -0
- data/lib/runtime/configuration.rb +185 -0
- data/lib/runtime/console.rb +20 -0
- data/lib/runtime/debugger.rb +9 -0
- data/lib/runtime/logger.rb +59 -0
- data/lib/runtime/mime_types.rb +22 -0
- data/lib/runtime/request.rb +78 -0
- data/lib/runtime/response.rb +40 -0
- data/lib/runtime/response_mixin.rb +38 -0
- data/lib/runtime/response_proxy.rb +30 -0
- data/lib/runtime/server.rb +107 -0
- data/lib/runtime/session.rb +66 -0
- data/lib/tasks/cluster.rb +26 -0
- data/lib/tasks/gem.rb +31 -0
- data/lib/tasks/generate.rb +80 -0
- data/lib/utilities/hash.rb +31 -0
- data/lib/utilities/inflect.rb +110 -0
- data/lib/utilities/integer.rb +24 -0
- data/lib/utilities/module.rb +21 -0
- data/lib/utilities/object.rb +25 -0
- data/lib/utilities/proc.rb +16 -0
- data/lib/utilities/string.rb +49 -0
- data/lib/utilities/symbol.rb +10 -0
- data/lib/utilities/tempfile.rb +9 -0
- data/lib/views/base.rb +9 -0
- data/lib/views/mixin.rb +110 -0
- data/lib/waves.rb +84 -0
- data/samples/blog/Rakefile +14 -0
- data/samples/blog/bin/waves-console +3 -0
- data/samples/blog/bin/waves-server +3 -0
- data/samples/blog/configurations/development.rb +31 -0
- data/samples/blog/configurations/mapping.rb +23 -0
- data/samples/blog/configurations/production.rb +30 -0
- data/samples/blog/doc/EMTPY +0 -0
- data/samples/blog/lib/application.rb +5 -0
- data/samples/blog/models/comment.rb +14 -0
- data/samples/blog/models/entry.rb +14 -0
- data/samples/blog/public/css/site.css +2 -0
- data/samples/blog/public/javascript/site.js +13 -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 +6 -0
- data/samples/blog/templates/comment/add.mab +10 -0
- data/samples/blog/templates/comment/list.mab +6 -0
- data/samples/blog/templates/entry/editor.mab +13 -0
- data/samples/blog/templates/entry/list.mab +11 -0
- data/samples/blog/templates/entry/show.mab +9 -0
- data/samples/blog/templates/entry/summary.mab +5 -0
- data/samples/blog/templates/errors/not_found_404.mab +2 -0
- data/samples/blog/templates/errors/server_error_500.mab +2 -0
- data/samples/blog/templates/layouts/default.mab +17 -0
- data/verify/app_generation/helpers.rb +24 -0
- data/verify/app_generation/startup.rb +39 -0
- data/verify/blackboard/blackboard_verify.rb +92 -0
- data/verify/blackboard/helpers.rb +5 -0
- data/verify/configurations/attributes.rb +37 -0
- data/verify/configurations/helpers.rb +1 -0
- data/verify/configurations/rack_integration.rb +29 -0
- data/verify/controllers/base.rb +37 -0
- data/verify/controllers/helpers.rb +13 -0
- data/verify/controllers/interface.rb +51 -0
- data/verify/core/helpers.rb +3 -0
- data/verify/core/utilities.rb +177 -0
- data/verify/foundations/default.rb +86 -0
- data/verify/foundations/default_application/Rakefile +14 -0
- data/verify/foundations/default_application/bin/waves-console +3 -0
- data/verify/foundations/default_application/bin/waves-server +3 -0
- data/verify/foundations/default_application/configurations/development.rb +26 -0
- data/verify/foundations/default_application/configurations/mapping.rb +14 -0
- data/verify/foundations/default_application/configurations/production.rb +30 -0
- data/verify/foundations/default_application/controllers/default.rb +15 -0
- data/verify/foundations/default_application/controllers/loaded.rb +15 -0
- data/verify/foundations/default_application/defaultapplication.db +0 -0
- data/verify/foundations/default_application/helpers/loaded.rb +10 -0
- data/verify/foundations/default_application/lib/application.rb +5 -0
- data/verify/foundations/default_application/models/default.rb +13 -0
- data/verify/foundations/default_application/models/loaded.rb +13 -0
- data/verify/foundations/default_application/schema/migrations/templates/empty.rb.erb +9 -0
- data/verify/foundations/default_application/startup.rb +7 -0
- data/verify/foundations/default_application/templates/errors/not_found_404.mab +2 -0
- data/verify/foundations/default_application/templates/errors/server_error_500.mab +2 -0
- data/verify/foundations/default_application/templates/layouts/default.mab +14 -0
- data/verify/foundations/default_application/views/default.rb +7 -0
- data/verify/foundations/default_application/views/loaded.rb +15 -0
- data/verify/foundations/helpers.rb +1 -0
- data/verify/foundations/simple.rb +25 -0
- data/verify/helpers.rb +76 -0
- data/verify/layers/data_mapper/association_verify.rb +87 -0
- data/verify/layers/default_errors.rb +29 -0
- data/verify/layers/helpers.rb +1 -0
- data/verify/layers/migration.rb +33 -0
- data/verify/layers/sequel/model.rb +41 -0
- data/verify/mapping/always.rb +19 -0
- data/verify/mapping/filters.rb +65 -0
- data/verify/mapping/handle.rb +24 -0
- data/verify/mapping/helpers.rb +7 -0
- data/verify/mapping/matches.rb +27 -0
- data/verify/mapping/named.rb +29 -0
- data/verify/mapping/options.rb +17 -0
- data/verify/mapping/path.rb +40 -0
- data/verify/mapping/response_proxy.rb +50 -0
- data/verify/mapping/threaded.rb +25 -0
- data/verify/requests/helpers.rb +16 -0
- data/verify/requests/request.rb +73 -0
- data/verify/requests/response.rb +59 -0
- data/verify/requests/session.rb +54 -0
- data/verify/views/helpers.rb +1 -0
- data/verify/views/rendering.rb +34 -0
- data/verify/views/templates/foo.erb +0 -0
- data/verify/views/templates/moo.erb +0 -0
- data/verify/views/templates/moo.mab +0 -0
- metadata +439 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# require 'test_helper' because RubyMate needs help
|
|
2
|
+
require File.join(File.dirname(__FILE__), "..", "helpers")
|
|
3
|
+
|
|
4
|
+
begin
|
|
5
|
+
require 'layers/orm/data_mapper'
|
|
6
|
+
require 'flexmock'
|
|
7
|
+
|
|
8
|
+
module DMApplication
|
|
9
|
+
include Waves::Foundations::Default
|
|
10
|
+
include Waves::Layers::ORM::DataMapper
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
DMA = DMApplication
|
|
14
|
+
DMAMapping = DMA::Configurations::Mapping
|
|
15
|
+
DMApplication::Configurations::Default
|
|
16
|
+
|
|
17
|
+
module DMA ; include Waves::Foundations::Simple ; end
|
|
18
|
+
Waves << DMA
|
|
19
|
+
Waves::Console.load( :mode => :development )
|
|
20
|
+
|
|
21
|
+
module DMApplication
|
|
22
|
+
module Configurations
|
|
23
|
+
class Development < Default
|
|
24
|
+
database :database => 'sqlite3::memory'
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
module Bacon
|
|
30
|
+
class Context
|
|
31
|
+
include FlexMock::ArgumentTypes
|
|
32
|
+
include FlexMock::MockContainer
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe "DataMapper Associations" do
|
|
37
|
+
|
|
38
|
+
before do
|
|
39
|
+
@adapter = FlexMock::DefaultFrameworkAdapter.new
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
after do
|
|
43
|
+
flexmock_verify
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'should add before and after filters that push a new repo' do
|
|
47
|
+
filters = DMAMapping.send :filters
|
|
48
|
+
filters.should.not == nil
|
|
49
|
+
filters[:before][0][0][:path].should == true
|
|
50
|
+
filters[:always][0][0][:path].should == true
|
|
51
|
+
before_size = ::DataMapper::Repository.context.size
|
|
52
|
+
filters[:before][0][1].call
|
|
53
|
+
after_size = ::DataMapper::Repository.context.size
|
|
54
|
+
(after_size - before_size).should == 1
|
|
55
|
+
filters[:always][0][1].call
|
|
56
|
+
end_size = ::DataMapper::Repository.context.size
|
|
57
|
+
(end_size - after_size).should == -1
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it 'should add before and after filters that push a new repo with flexmock' do
|
|
61
|
+
mock_context = flexmock("context")
|
|
62
|
+
flexmock(::DataMapper::Repository, :context => mock_context)
|
|
63
|
+
mock_context.should_receive(:push).once
|
|
64
|
+
mock_context.should_receive(:pop).once
|
|
65
|
+
|
|
66
|
+
filters = DMAMapping.send :filters
|
|
67
|
+
filters[:before][0][1].call
|
|
68
|
+
filters[:always][0][1].call
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it 'should initialize the database adapater' do
|
|
72
|
+
DMA.database.class.should.not == nil
|
|
73
|
+
DMA.database.class.should == ::DataMapper::Adapters::Sqlite3Adapter
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it 'It should load models' do
|
|
77
|
+
# pending
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
end
|
|
81
|
+
rescue LoadError => e
|
|
82
|
+
describe "DataMapper Associations" do
|
|
83
|
+
it 'should be able to load dm-core' do
|
|
84
|
+
puts "\nDatamapper associations specs not run! Could not load dm-core: #{e}\n"
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# require 'test_helper' because RubyMate needs help
|
|
2
|
+
require File.join(File.dirname(__FILE__) , "helpers")
|
|
3
|
+
|
|
4
|
+
module DefaultErrorsApp
|
|
5
|
+
include Waves::Foundations::Simple
|
|
6
|
+
include Waves::Layers::DefaultErrors
|
|
7
|
+
module Views
|
|
8
|
+
class Errors
|
|
9
|
+
include Waves::Views::Mixin
|
|
10
|
+
def not_found_404(arg)
|
|
11
|
+
"View-based 404"
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
stub!(:views).and_return(Views)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Waves << DefaultErrorsApp
|
|
19
|
+
Waves::Console.load( :mode => :development )
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
describe "An application which includes the DefaultErrors layer" do
|
|
23
|
+
|
|
24
|
+
it "registers a view-based handler for NotFound errors" do
|
|
25
|
+
r = get('/bogus')
|
|
26
|
+
r.body.should == "View-based 404"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__) , "..", "helpers")
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# require 'test_helper' because RubyMate needs help
|
|
2
|
+
require File.join(File.dirname(__FILE__) , "helpers")
|
|
3
|
+
require 'layers/orm/migration'
|
|
4
|
+
|
|
5
|
+
ORM = Waves::Layers::ORM
|
|
6
|
+
|
|
7
|
+
Dir.chdir("#{File.dirname(__FILE__)}/../../samples/blog") do
|
|
8
|
+
|
|
9
|
+
describe "Waves::Layers::ORM migration helpers" do
|
|
10
|
+
|
|
11
|
+
it "defines a standard migration location" do
|
|
12
|
+
ORM.migration_directory.should == "schema/migrations"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "supplies a list of all migration files found in the standard location" do
|
|
16
|
+
ORM.migration_files.should == ["schema/migrations/001_initial_schema.rb", "schema/migrations/002_add_comments.rb"]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "detects the highest-numbered existing migration file" do
|
|
20
|
+
ORM.latest_migration_version.should == 2
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "determines the number of the next migration to be created" do
|
|
24
|
+
ORM.next_migration_version.should == 3
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "generates the path for the next migration with a given name" do
|
|
28
|
+
ORM.migration_destination("blink").should == "schema/migrations/003_blink.rb"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# require 'test_helper' because RubyMate needs help
|
|
2
|
+
require File.join(File.dirname(__FILE__) , "..", "helpers")
|
|
3
|
+
require 'layers/orm/sequel'
|
|
4
|
+
|
|
5
|
+
module TestApplication
|
|
6
|
+
include AutoCode
|
|
7
|
+
module Configurations
|
|
8
|
+
class Development
|
|
9
|
+
stub!(:database).and_return(:adapter => 'sqlite',
|
|
10
|
+
:database => "#{File.dirname(__FILE__)}test.db")
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
stub!(:config).and_return(Configurations::Development)
|
|
14
|
+
include Waves::Layers::ORM::Sequel
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
Waves << TestApplication
|
|
18
|
+
# Waves::Console.load( :mode => :development )
|
|
19
|
+
TA = TestApplication
|
|
20
|
+
|
|
21
|
+
describe "An application module which includes the Sequel ORM layer" do
|
|
22
|
+
|
|
23
|
+
wrap { rm_if_exist 'test.db' }
|
|
24
|
+
|
|
25
|
+
it "auto_creates models that inherit from Sequel::Model" do
|
|
26
|
+
TA::Models::Default.superclass.should == Sequel::Model
|
|
27
|
+
TA::Models::Thingy.superclass.should == TA::Models::Default
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "sets the dataset to use the snake_case of the class name as the table name" do
|
|
31
|
+
TA::Models::Thingy.dataset.send(:to_table_reference).should =~ /SELECT.+FROM.+thingies+/
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "provides an accessor for database" do
|
|
35
|
+
TA.should.respond_to :database
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Waves.instance_variable_set(:@application, nil)
|
|
41
|
+
# raise Waves.application.inspect
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# require 'test_helper' because RubyMate needs help
|
|
2
|
+
require File.join(File.dirname(__FILE__), "helpers")
|
|
3
|
+
::TEST_VALUE = 'foo'
|
|
4
|
+
|
|
5
|
+
specification "A developer can ensure" do
|
|
6
|
+
|
|
7
|
+
before do
|
|
8
|
+
mapping.clear
|
|
9
|
+
path('/' ) { raise RuntimeError.new('bar') }
|
|
10
|
+
always( true ) { Waves.been_there }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
specify 'processing is guaranteed regardless of what happens in an action' do
|
|
14
|
+
Waves.should.receive(:been_there)
|
|
15
|
+
lambda { get('/') }.should.raise RuntimeError
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# require 'test_helper' because RubyMate needs help
|
|
2
|
+
require File.join(File.dirname(__FILE__), "helpers")
|
|
3
|
+
|
|
4
|
+
describe "A developer can map requests to filters." do
|
|
5
|
+
|
|
6
|
+
before do
|
|
7
|
+
mapping.clear
|
|
8
|
+
handle(Waves::Dispatchers::NotFoundError) { response.status = 404}
|
|
9
|
+
mapping.before( :path => '/filters', :method => :post ) { request.response.write('Before post:') }
|
|
10
|
+
mapping.before( :path => '/filters' ) { request.response.write('Before:') }
|
|
11
|
+
mapping.wrap( :path => '/filters', :method => :post ) { request.response.write(':Wrap post:') }
|
|
12
|
+
mapping.wrap( :path => '/filters' ) { request.response.write(':Wrap:') }
|
|
13
|
+
mapping.path( '/filters' ) { 'During' }
|
|
14
|
+
mapping.after( :path => '/filters', :method => :post ) { request.response.write('After post:') }
|
|
15
|
+
mapping.after( :path => '/filters' ) { request.response.write(':After') }
|
|
16
|
+
|
|
17
|
+
regexp = %r{^/filters/(\w+)$}
|
|
18
|
+
|
|
19
|
+
mapping.before( :path => regexp ) { |filtername| request.response.write("Before #{filtername}:") }
|
|
20
|
+
mapping.wrap( :path => regexp ) { |filtername| request.response.write(":Wrap #{filtername}:") }
|
|
21
|
+
mapping.path( regexp ) { 'During' }
|
|
22
|
+
mapping.after( :path => regexp ) { |filtername| request.response.write(":After #{filtername}") }
|
|
23
|
+
|
|
24
|
+
mapping.before( :path => 'filters_with_no_map' ) { request.response.write("Before") }
|
|
25
|
+
mapping.wrap( :path => 'filters_with_no_map' ) { request.response.write("Wrap") }
|
|
26
|
+
mapping.after( :path => 'filters_with_no_map' ) { request.response.write("After") }
|
|
27
|
+
|
|
28
|
+
mapping.before('/pathstring') { request.response.write("Before pathstring") }
|
|
29
|
+
mapping.wrap('/pathstring') { request.response.write("Wrap pathstring") }
|
|
30
|
+
mapping.path('/pathstring') { "During pathstring" }
|
|
31
|
+
mapping.after('/pathstring') { request.response.write("After pathstring") }
|
|
32
|
+
|
|
33
|
+
mapping.before(%r{^/pathregexp$}) { request.response.write("Before pathregexp") }
|
|
34
|
+
mapping.wrap(%r{^/pathregexp$}) { request.response.write("Wrap pathregexp") }
|
|
35
|
+
mapping.path(%r{^/pathregexp$}) { "During pathregexp" }
|
|
36
|
+
mapping.after(%r{^/pathregexp$}) { request.response.write("After pathregexp") }
|
|
37
|
+
|
|
38
|
+
mapping.before('/pathstring/name', :method => :post) { request.response.write("Before pathstring post") }
|
|
39
|
+
mapping.wrap('/pathstring/name', :method => :post) { request.response.write("Wrap pathstring post") }
|
|
40
|
+
mapping.path('/pathstring/name', :method => :post) { "During pathstring post" }
|
|
41
|
+
mapping.after('/pathstring/name', :method => :post) { request.response.write("After pathstring post") }
|
|
42
|
+
|
|
43
|
+
mapping.before(%r{^/pathregexp/name$}, :method => :post) { request.response.write("Before pathregexp post") }
|
|
44
|
+
mapping.wrap(%r{^/pathregexp/name$}, :method => :post) { request.response.write("Wrap pathregexp post") }
|
|
45
|
+
mapping.path(%r{^/pathregexp/name$}, :method => :post) { "During pathregexp post" }
|
|
46
|
+
mapping.after(%r{^/pathregexp/name$}, :method => :post) { request.response.write("After pathregexp post") }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "Map a path to a 'before', 'after' and 'wrap' filters." do
|
|
50
|
+
get('/filters').body.should == 'Before::Wrap:During:Wrap::After'
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "Map a POST to a path to a 'before', 'after' and 'wrap' filters" do
|
|
54
|
+
post('/filters').body.should == 'Before post:Before::Wrap post::Wrap:During:Wrap post::Wrap:After post::After'
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "The 'before', 'after' and 'wrap' filters accept a regular expression and can extract parameters from the request path" do
|
|
58
|
+
get('/filters/xyz').body.should == 'Before xyz::Wrap xyz:During:Wrap xyz::After xyz'
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "When having 'before', 'after' and 'wrap' filters but no corresponding map action this results in a 404" do
|
|
62
|
+
get('/filters_with_no_map').status.should == 404
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# require 'test_helper' because RubyMate needs help
|
|
2
|
+
require File.join(File.dirname(__FILE__), "helpers")
|
|
3
|
+
|
|
4
|
+
specification "A developer can register exception handlers" do
|
|
5
|
+
|
|
6
|
+
before do
|
|
7
|
+
mapping.clear
|
|
8
|
+
mapping.handle(Waves::Dispatchers::NotFoundError) do
|
|
9
|
+
response.status = 404; response.body = "404 Not Found"
|
|
10
|
+
end
|
|
11
|
+
mapping.handle(Waves::Dispatchers::NotFoundError) do
|
|
12
|
+
response.status = 404; response.body = "Something Different"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
specify 'The minimal 404 handler in SimpleErrors' do
|
|
17
|
+
|
|
18
|
+
r = get('/')
|
|
19
|
+
r.status.should == 404
|
|
20
|
+
r.body.should == '404 Not Found'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
end
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__) , "..", "helpers")
|
|
2
|
+
|
|
3
|
+
# define basic app for use in testing
|
|
4
|
+
# before methods may add to it using helper methods
|
|
5
|
+
module MappingApp ; include Waves::Foundations::Simple ; end
|
|
6
|
+
Waves << MappingApp
|
|
7
|
+
Waves::Console.load( :mode => :development )
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# require 'test_helper' because RubyMate needs help
|
|
2
|
+
require File.join(File.dirname(__FILE__), "helpers")
|
|
3
|
+
|
|
4
|
+
specification "A developer can extract parameters from a request path or URL." do
|
|
5
|
+
|
|
6
|
+
before do
|
|
7
|
+
mapping.clear
|
|
8
|
+
|
|
9
|
+
path %r{/param/(\w+)} do |value|
|
|
10
|
+
"You asked for: #{value}."
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
url %r{http://localhost:(\d+)/port} do |port|
|
|
14
|
+
port
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
specify 'Extract a parameter via a regexp match of the path.' do
|
|
20
|
+
get('/param/elephant').body.should == 'You asked for: elephant.'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
specify 'Extract a parameter via a regexp match of the URL.' do
|
|
24
|
+
get('http://localhost:3000/port').body.should == '3000'
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# require 'test_helper' because RubyMate needs help
|
|
2
|
+
require File.join(File.dirname(__FILE__), "helpers")
|
|
3
|
+
|
|
4
|
+
specification "A developer can register named mappings" do
|
|
5
|
+
|
|
6
|
+
# before do
|
|
7
|
+
# mapping.clear
|
|
8
|
+
# resource = /([\w\-]+)/
|
|
9
|
+
# name = /([\w\-\_\.\+\@]+)/
|
|
10
|
+
# path [resource, name],
|
|
11
|
+
# :generator => generator(:show) { |resource,name| "/#{resource}/#{name}" } do
|
|
12
|
+
# "Works"
|
|
13
|
+
# end
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# specify "accessible via Waves.mapping.named" do
|
|
17
|
+
#
|
|
18
|
+
# Waves.mapping.named.show("foo", "bar").should == "/foo/bar"
|
|
19
|
+
#
|
|
20
|
+
# end
|
|
21
|
+
#
|
|
22
|
+
# specify "accessible via Application.paths" do
|
|
23
|
+
#
|
|
24
|
+
# Test.paths.show("foo", "bar").should == "/foo/bar"
|
|
25
|
+
#
|
|
26
|
+
# end
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# require 'test_helper' because RubyMate needs help
|
|
2
|
+
require File.join(File.dirname(__FILE__), "helpers")
|
|
3
|
+
|
|
4
|
+
specification "A developer can map requests with options." do
|
|
5
|
+
|
|
6
|
+
before do
|
|
7
|
+
mapping.clear
|
|
8
|
+
path('/', :remote_addr => "10.10.10.10" ) { 'This request is from 10.10.10.10' }
|
|
9
|
+
path('/', :remote_addr => "127.0.0.1" ) { 'This request is from 127.0.0.1' }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
specify 'Map the path of a GET request to a lambda.' do
|
|
13
|
+
get('/').body.should == 'This request is from 127.0.0.1'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
17
|
+
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# require 'test_helper' because RubyMate needs help
|
|
2
|
+
require File.join(File.dirname(__FILE__), "helpers")
|
|
3
|
+
|
|
4
|
+
specification "A developer can map requests using the request path." do
|
|
5
|
+
|
|
6
|
+
before do
|
|
7
|
+
mapping.clear
|
|
8
|
+
path('/', :method => :post ) { 'This is a simple post rule.' }
|
|
9
|
+
path('/', :method => :put ) { 'This is a simple put rule.' }
|
|
10
|
+
path('/', :method => :delete ) { 'This is a simple delete rule.' }
|
|
11
|
+
path('/', :method => :get) { 'This is a simple get rule.' }
|
|
12
|
+
path('/foo') { "The server says, 'bar!'" }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
specify 'Map the path of a GET request to a lambda.' do
|
|
16
|
+
get('/').body.should == 'This is a simple get rule.'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
specify 'Map the path of a POST request to a lambda.' do
|
|
20
|
+
post('/').body.should == 'This is a simple post rule.'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
specify 'Map the path of a PUT request to a lambda.' do
|
|
24
|
+
put('/').body.should == 'This is a simple put rule.'
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
specify 'Map the path of a DELETE request to a lambda.' do
|
|
28
|
+
delete('/').body.should == 'This is a simple delete rule.'
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
specify 'When method is not explicitely set in a mapping it accepts all methods' do
|
|
32
|
+
get( '/foo' ).body.should == "The server says, 'bar!'"
|
|
33
|
+
post( '/foo' ).body.should == "The server says, 'bar!'"
|
|
34
|
+
put( '/foo' ).body.should == "The server says, 'bar!'"
|
|
35
|
+
delete( '/foo' ).body.should == "The server says, 'bar!'"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# require 'test_helper' because RubyMate needs help
|
|
2
|
+
require File.join(File.dirname(__FILE__), "helpers")
|
|
3
|
+
|
|
4
|
+
# Note: you have to define the resource classes using module_eval here, because otherwise
|
|
5
|
+
# the auto_create code never gets triggered in the application.
|
|
6
|
+
|
|
7
|
+
module MappingApp
|
|
8
|
+
include Waves::Layers::MVC
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
MappingApp::Controllers.module_eval do
|
|
12
|
+
class Animal
|
|
13
|
+
include Waves::Controllers::Mixin
|
|
14
|
+
def cow() 'Moo!' end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
MappingApp::Views.module_eval do
|
|
19
|
+
class Animal
|
|
20
|
+
include Waves::Views::Mixin
|
|
21
|
+
def say( says ) "This animal says: '#{says}'" end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
specification "A developer may succinctly define a resource-based controller-view chain." do
|
|
26
|
+
|
|
27
|
+
before do
|
|
28
|
+
mapping.clear
|
|
29
|
+
path('/cow' ) do
|
|
30
|
+
resource( :animal ) { controller { cow } | view { | says | say( says ) } }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
path('/onager') do
|
|
34
|
+
resource( "cow" ) do
|
|
35
|
+
controller { redirect model_name }.call
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
specify 'Pipe output of controller to view within a resource context.' do
|
|
41
|
+
get('/cow').body.should == "This animal says: 'Moo!'"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
specify "Redirect from within controller" do
|
|
45
|
+
get('/onager').status.should == 302
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
|