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.
Files changed (185) hide show
  1. data/app/Rakefile +72 -0
  2. data/app/bin/waves-console +4 -0
  3. data/app/bin/waves-server +4 -0
  4. data/app/configurations/development.rb.erb +31 -0
  5. data/app/configurations/mapping.rb.erb +14 -0
  6. data/app/configurations/production.rb.erb +31 -0
  7. data/app/controllers/.gitignore +0 -0
  8. data/app/doc/.gitignore +0 -0
  9. data/app/helpers/.gitignore +0 -0
  10. data/app/lib/application.rb.erb +5 -0
  11. data/app/lib/tasks/.gitignore +0 -0
  12. data/app/log/.gitignore +0 -0
  13. data/app/models/.gitignore +0 -0
  14. data/app/public/css/.gitignore +0 -0
  15. data/app/public/flash/.gitignore +0 -0
  16. data/app/public/images/.gitignore +0 -0
  17. data/app/public/javascript/.gitignore +0 -0
  18. data/app/schema/migrations/.gitignore +0 -0
  19. data/app/startup.rb +5 -0
  20. data/app/templates/errors/not_found_404.mab +2 -0
  21. data/app/templates/errors/server_error_500.mab +2 -0
  22. data/app/templates/layouts/default.mab +14 -0
  23. data/app/tmp/sessions/.gitignore +0 -0
  24. data/app/views/.gitignore +0 -0
  25. data/bin/waves +84 -0
  26. data/bin/waves-console +4 -0
  27. data/bin/waves-server +4 -0
  28. data/doc/HISTORY +44 -0
  29. data/doc/LICENSE +22 -0
  30. data/lib/commands/waves-console.rb +21 -0
  31. data/lib/commands/waves-server.rb +55 -0
  32. data/lib/controllers/base.rb +11 -0
  33. data/lib/controllers/mixin.rb +165 -0
  34. data/lib/dispatchers/base.rb +67 -0
  35. data/lib/dispatchers/default.rb +81 -0
  36. data/lib/foundations/default.rb +27 -0
  37. data/lib/foundations/simple.rb +30 -0
  38. data/lib/helpers/asset_helper.rb +67 -0
  39. data/lib/helpers/common.rb +66 -0
  40. data/lib/helpers/default.rb +13 -0
  41. data/lib/helpers/form.rb +40 -0
  42. data/lib/helpers/formatting.rb +30 -0
  43. data/lib/helpers/model.rb +33 -0
  44. data/lib/helpers/number_helper.rb +25 -0
  45. data/lib/helpers/tag_helper.rb +58 -0
  46. data/lib/helpers/url_helper.rb +77 -0
  47. data/lib/helpers/view.rb +24 -0
  48. data/lib/layers/default_errors.rb +26 -0
  49. data/lib/layers/inflect/english.rb +24 -0
  50. data/lib/layers/inflect/english/rules.rb +88 -0
  51. data/lib/layers/inflect/english/string.rb +24 -0
  52. data/lib/layers/mvc.rb +54 -0
  53. data/lib/layers/orm/active_record.rb +92 -0
  54. data/lib/layers/orm/active_record/migrations/empty.rb.erb +9 -0
  55. data/lib/layers/orm/active_record/tasks/generate.rb +28 -0
  56. data/lib/layers/orm/active_record/tasks/schema.rb +22 -0
  57. data/lib/layers/orm/data_mapper.rb +38 -0
  58. data/lib/layers/orm/filebase.rb +22 -0
  59. data/lib/layers/orm/migration.rb +79 -0
  60. data/lib/layers/orm/sequel.rb +86 -0
  61. data/lib/layers/orm/sequel/migrations/empty.rb.erb +9 -0
  62. data/lib/layers/orm/sequel/tasks/generate.rb +28 -0
  63. data/lib/layers/orm/sequel/tasks/schema.rb +16 -0
  64. data/lib/layers/simple.rb +32 -0
  65. data/lib/layers/simple_errors.rb +23 -0
  66. data/lib/mapping/mapping.rb +289 -0
  67. data/lib/mapping/pretty_urls.rb +96 -0
  68. data/lib/renderers/erubis.rb +63 -0
  69. data/lib/renderers/haml.rb +45 -0
  70. data/lib/renderers/markaby.rb +33 -0
  71. data/lib/renderers/mixin.rb +50 -0
  72. data/lib/runtime/application.rb +69 -0
  73. data/lib/runtime/blackboard.rb +57 -0
  74. data/lib/runtime/configuration.rb +185 -0
  75. data/lib/runtime/console.rb +20 -0
  76. data/lib/runtime/debugger.rb +9 -0
  77. data/lib/runtime/logger.rb +59 -0
  78. data/lib/runtime/mime_types.rb +22 -0
  79. data/lib/runtime/request.rb +78 -0
  80. data/lib/runtime/response.rb +40 -0
  81. data/lib/runtime/response_mixin.rb +38 -0
  82. data/lib/runtime/response_proxy.rb +30 -0
  83. data/lib/runtime/server.rb +107 -0
  84. data/lib/runtime/session.rb +66 -0
  85. data/lib/tasks/cluster.rb +26 -0
  86. data/lib/tasks/gem.rb +31 -0
  87. data/lib/tasks/generate.rb +80 -0
  88. data/lib/utilities/hash.rb +31 -0
  89. data/lib/utilities/inflect.rb +110 -0
  90. data/lib/utilities/integer.rb +24 -0
  91. data/lib/utilities/module.rb +21 -0
  92. data/lib/utilities/object.rb +25 -0
  93. data/lib/utilities/proc.rb +16 -0
  94. data/lib/utilities/string.rb +49 -0
  95. data/lib/utilities/symbol.rb +10 -0
  96. data/lib/utilities/tempfile.rb +9 -0
  97. data/lib/views/base.rb +9 -0
  98. data/lib/views/mixin.rb +110 -0
  99. data/lib/waves.rb +84 -0
  100. data/samples/blog/Rakefile +14 -0
  101. data/samples/blog/bin/waves-console +3 -0
  102. data/samples/blog/bin/waves-server +3 -0
  103. data/samples/blog/configurations/development.rb +31 -0
  104. data/samples/blog/configurations/mapping.rb +23 -0
  105. data/samples/blog/configurations/production.rb +30 -0
  106. data/samples/blog/doc/EMTPY +0 -0
  107. data/samples/blog/lib/application.rb +5 -0
  108. data/samples/blog/models/comment.rb +14 -0
  109. data/samples/blog/models/entry.rb +14 -0
  110. data/samples/blog/public/css/site.css +2 -0
  111. data/samples/blog/public/javascript/site.js +13 -0
  112. data/samples/blog/schema/migrations/001_initial_schema.rb +17 -0
  113. data/samples/blog/schema/migrations/002_add_comments.rb +18 -0
  114. data/samples/blog/schema/migrations/templates/empty.rb.erb +9 -0
  115. data/samples/blog/startup.rb +6 -0
  116. data/samples/blog/templates/comment/add.mab +10 -0
  117. data/samples/blog/templates/comment/list.mab +6 -0
  118. data/samples/blog/templates/entry/editor.mab +13 -0
  119. data/samples/blog/templates/entry/list.mab +11 -0
  120. data/samples/blog/templates/entry/show.mab +9 -0
  121. data/samples/blog/templates/entry/summary.mab +5 -0
  122. data/samples/blog/templates/errors/not_found_404.mab +2 -0
  123. data/samples/blog/templates/errors/server_error_500.mab +2 -0
  124. data/samples/blog/templates/layouts/default.mab +17 -0
  125. data/verify/app_generation/helpers.rb +24 -0
  126. data/verify/app_generation/startup.rb +39 -0
  127. data/verify/blackboard/blackboard_verify.rb +92 -0
  128. data/verify/blackboard/helpers.rb +5 -0
  129. data/verify/configurations/attributes.rb +37 -0
  130. data/verify/configurations/helpers.rb +1 -0
  131. data/verify/configurations/rack_integration.rb +29 -0
  132. data/verify/controllers/base.rb +37 -0
  133. data/verify/controllers/helpers.rb +13 -0
  134. data/verify/controllers/interface.rb +51 -0
  135. data/verify/core/helpers.rb +3 -0
  136. data/verify/core/utilities.rb +177 -0
  137. data/verify/foundations/default.rb +86 -0
  138. data/verify/foundations/default_application/Rakefile +14 -0
  139. data/verify/foundations/default_application/bin/waves-console +3 -0
  140. data/verify/foundations/default_application/bin/waves-server +3 -0
  141. data/verify/foundations/default_application/configurations/development.rb +26 -0
  142. data/verify/foundations/default_application/configurations/mapping.rb +14 -0
  143. data/verify/foundations/default_application/configurations/production.rb +30 -0
  144. data/verify/foundations/default_application/controllers/default.rb +15 -0
  145. data/verify/foundations/default_application/controllers/loaded.rb +15 -0
  146. data/verify/foundations/default_application/defaultapplication.db +0 -0
  147. data/verify/foundations/default_application/helpers/loaded.rb +10 -0
  148. data/verify/foundations/default_application/lib/application.rb +5 -0
  149. data/verify/foundations/default_application/models/default.rb +13 -0
  150. data/verify/foundations/default_application/models/loaded.rb +13 -0
  151. data/verify/foundations/default_application/schema/migrations/templates/empty.rb.erb +9 -0
  152. data/verify/foundations/default_application/startup.rb +7 -0
  153. data/verify/foundations/default_application/templates/errors/not_found_404.mab +2 -0
  154. data/verify/foundations/default_application/templates/errors/server_error_500.mab +2 -0
  155. data/verify/foundations/default_application/templates/layouts/default.mab +14 -0
  156. data/verify/foundations/default_application/views/default.rb +7 -0
  157. data/verify/foundations/default_application/views/loaded.rb +15 -0
  158. data/verify/foundations/helpers.rb +1 -0
  159. data/verify/foundations/simple.rb +25 -0
  160. data/verify/helpers.rb +76 -0
  161. data/verify/layers/data_mapper/association_verify.rb +87 -0
  162. data/verify/layers/default_errors.rb +29 -0
  163. data/verify/layers/helpers.rb +1 -0
  164. data/verify/layers/migration.rb +33 -0
  165. data/verify/layers/sequel/model.rb +41 -0
  166. data/verify/mapping/always.rb +19 -0
  167. data/verify/mapping/filters.rb +65 -0
  168. data/verify/mapping/handle.rb +24 -0
  169. data/verify/mapping/helpers.rb +7 -0
  170. data/verify/mapping/matches.rb +27 -0
  171. data/verify/mapping/named.rb +29 -0
  172. data/verify/mapping/options.rb +17 -0
  173. data/verify/mapping/path.rb +40 -0
  174. data/verify/mapping/response_proxy.rb +50 -0
  175. data/verify/mapping/threaded.rb +25 -0
  176. data/verify/requests/helpers.rb +16 -0
  177. data/verify/requests/request.rb +73 -0
  178. data/verify/requests/response.rb +59 -0
  179. data/verify/requests/session.rb +54 -0
  180. data/verify/views/helpers.rb +1 -0
  181. data/verify/views/rendering.rb +34 -0
  182. data/verify/views/templates/foo.erb +0 -0
  183. data/verify/views/templates/moo.erb +0 -0
  184. data/verify/views/templates/moo.mab +0 -0
  185. 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
+