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,6 @@
1
+ @comments.each do |comment|
2
+ p "Posted on #{comment.updated_on.strftime('%b %d, %Y') if comment.updated_on} by
3
+ #{( ( comment.name.nil? or comment.name.empty? ) ?
4
+ 'anonymous coward' : comment.name )}"
5
+ textile comment.content
6
+ end
@@ -0,0 +1,13 @@
1
+ layout :default, :title => 'Edit Entry' do
2
+ form :action => "/entry/#{@entry.name}/", :method => 'POST' do
3
+ input :name => '_method', :type => 'hidden', :value => 'put'
4
+ label 'Title'; br
5
+ input :type => :text, :value => @entry.title, :name => 'entry.title'; br
6
+ label 'Summary'; br
7
+ textarea @entry.summary, :name => 'entry.summary', :rows => 10, :cols => 80; br
8
+ label 'Content'; br
9
+ textarea @entry.content, :name => 'entry.content', :rows => 20, :cols => 80; br
10
+ input :type => :submit, :value => 'Save'
11
+ a.delete 'Delete', :href => "/entry/#{@entry.name}"
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ layout :default, :title => 'Blog Entries' do
2
+ h1 'My Blog'
3
+ form :action => '/entries', :method => 'post' do
4
+ label 'Name'
5
+ input :type => :text, :name => 'entry.name'
6
+ input :type => :submit, :value => 'Add'
7
+ end
8
+ @entries.each do |entry|
9
+ view :entry, :summary, :entry => entry
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ layout :default, :title => @entry.title do
2
+ a 'Show All Entries', :href => '/entries'
3
+ a 'Edit This Entry', :href => "/entry/#{@entry.name}/editor"
4
+ h1 @entry.title
5
+ textile @entry.content
6
+ h1 'Comments'
7
+ view :comment, :add, :entry => @entry
8
+ view :comment, :list, :comments => @entry.comments
9
+ end
@@ -0,0 +1,5 @@
1
+ h2 do
2
+ a @entry.title, :href => "/entry/#{@entry.name}"
3
+ end
4
+ textile @entry.summary
5
+ a 'Read more ...', :href => "/entry/#{@entry.name}"
@@ -0,0 +1,2 @@
1
+ h1 '404'
2
+ p %q( That URL does not exist on this server. )
@@ -0,0 +1,2 @@
1
+ h1 '500'
2
+ p %q( Internal server error. Sorry, but your request could not be processed. )
@@ -0,0 +1,17 @@
1
+ doctype :html4_strict
2
+
3
+ html do
4
+
5
+ head do
6
+ title @title
7
+ script :src => 'http://jqueryjs.googlecode.com/files/jquery-1.2.2.min.js',
8
+ :type => 'text/javascript'
9
+ script :src => '/javascript/site.js', :type => 'text/javascript'
10
+ link :href => '/css/site.css', :rel => 'stylesheet', :type => 'text/css'
11
+ end
12
+
13
+ body do
14
+ layout_content
15
+ end
16
+
17
+ end
@@ -0,0 +1,24 @@
1
+ %w( rubygems bacon open3 extensions/all).each { |f| require f }
2
+
3
+ Bacon.extend Bacon::TestUnitOutput
4
+ Bacon.summary_on_exit
5
+
6
+ require File.join(File.dirname(__FILE__), "..", "..", "lib", "utilities", "string")
7
+
8
+
9
+ AppPath = File.expand_path(File.dirname(__FILE__) / "sandbox")
10
+ FrameworkPath = File.expand_path(File.dirname(__FILE__) / ".." / "..")
11
+
12
+ def generate_test_app(path)
13
+ command = File.dirname(__FILE__) / ".." / ".." / :bin / "waves"
14
+ system "#{command} #{path}"
15
+ end
16
+
17
+ def clobber_test_app(path)
18
+ FileUtils.rm_rf(path) if File.exist?(path)
19
+ end
20
+
21
+ def set_framework_path(path)
22
+ text = File.read(path / 'startup.rb').split("\n").unshift("WAVES = '#{FrameworkPath}'").join("\n")
23
+ File.write(path / 'startup.rb', text)
24
+ end
@@ -0,0 +1,39 @@
1
+ # require 'test_helper' because RubyMate needs help
2
+
3
+ require File.join(File.dirname(__FILE__) , "helpers")
4
+
5
+ clobber_test_app(AppPath)
6
+ generate_test_app(AppPath)
7
+
8
+ describe "A generated application" do
9
+
10
+ it "has executable script files" do
11
+ File.executable?(File.join(AppPath, "bin", "waves-console")).should.be.true
12
+ end
13
+
14
+ it "will fail to find waves framework, if the gem is not available" do
15
+ Dir.chdir(AppPath) do
16
+ stdin, stdout, stderr = Open3.popen3("ruby startup.rb")
17
+ stderr.gets.should =~ %r{no such file to load -- waves \(LoadError\)}
18
+ end
19
+ end
20
+
21
+ it "will find and use waves framework source when WAVES is defined" do
22
+ set_framework_path(AppPath)
23
+ Dir.chdir(AppPath) do
24
+ stdin, stdout, stderr = Open3.popen3("ruby startup.rb")
25
+ stderr.gets.should == nil
26
+ end
27
+ end
28
+
29
+ it "has the directories we expect it to have" do
30
+ dirs = %w{ bin/ configurations/ controllers/ doc/ helpers/ lib/
31
+ log/ models/ public/ schema/ templates/ tmp/ views/ }
32
+ Dir.chdir(AppPath) do
33
+ Dir.glob("*/").should == dirs
34
+ end
35
+ end
36
+
37
+ end
38
+
39
+ clobber_test_app(AppPath)
@@ -0,0 +1,92 @@
1
+ require File.join(File.dirname(__FILE__), "helpers")
2
+
3
+ specification "Blackboard" do
4
+
5
+ it 'should create a blackboard' do
6
+ request = mock(:request)
7
+ Waves::Blackboard.new(request).should.not == nil
8
+ end
9
+
10
+ it 'should allow adding a value, and reading from it' do
11
+ request = mock(:request)
12
+ bb = Waves::Blackboard.new(request)
13
+ bb.test = 2
14
+ bb.test.should == 2
15
+
16
+ bb["test"].should == 2
17
+
18
+ bb["test2"] = 3
19
+ bb["test2"].should == 3
20
+ bb.test2.should == 3
21
+ end
22
+
23
+ it 'should not have a value if never set' do
24
+ request = mock(:request)
25
+ bb = Waves::Blackboard.new(request)
26
+ bb.never_set.should == nil
27
+ bb["never_set"].should == nil
28
+ end
29
+
30
+ it 'should iterate over all defined values' do
31
+ request = mock(:request)
32
+ bb = Waves::Blackboard.new(request)
33
+ bb.value1 = 1
34
+ bb.value2 = 2
35
+ a = []
36
+ bb.each do |value|
37
+ a << value
38
+ end
39
+ a.should == [["value1", 1], ["value2", 2]]
40
+ end
41
+
42
+ end
43
+
44
+ module BlackBoardVerify
45
+ module Controllers
46
+ class Test
47
+ include Waves::Controllers::Mixin
48
+ end
49
+ end
50
+ end
51
+
52
+ module BlackBoardVerify
53
+ module Configurations
54
+ module Mapping
55
+ extend Waves::Mapping
56
+ end
57
+ end
58
+ end
59
+
60
+ module BlackBoardVerify
61
+ module Helpers
62
+ module Test
63
+ extend Waves::Helpers::Default
64
+ end
65
+ end
66
+ end
67
+
68
+ module BlackBoardVerify
69
+ module Views
70
+ module Test
71
+ extend Waves::Views::Mixin
72
+ end
73
+ end
74
+ end
75
+
76
+ specification "Blackboard included in other classes" do
77
+
78
+ before do
79
+ end
80
+
81
+ after do
82
+ end
83
+
84
+ it 'should be included in other classes' do
85
+ request = mock(:request)
86
+ BlackBoardVerify::Controllers::Test.instance_methods.should.include "blackboard"
87
+ Waves::Helpers::Default.instance_methods.should.include "blackboard"
88
+ Waves::ResponseProxy.instance_methods.should.include "blackboard"
89
+ BlackBoardVerify::Views::Test.methods.should.include "blackboard"
90
+ end
91
+
92
+ end
@@ -0,0 +1,5 @@
1
+ require File.join(File.dirname(__FILE__) , "..", "helpers")
2
+
3
+ module BlackBoardVerify ; include Waves::Foundations::Simple ; end
4
+ # Waves << BlackBoardVerify
5
+ # Waves::Console.load( :mode => :development )
@@ -0,0 +1,37 @@
1
+ # require 'test_helper' because RubyMate needs help
2
+ require File.join(File.dirname(__FILE__) , "helpers")
3
+
4
+ describe "Configuration attributes" do
5
+
6
+ class Basic < Waves::Configurations::Base; end
7
+
8
+ it "can be declared by developers" do
9
+ Basic.attribute :smurf
10
+ Basic.smurf("smurfy")
11
+ Basic.smurf.should == "smurfy"
12
+ end
13
+
14
+
15
+ it "must be declared before use" do
16
+ Basic.should.not.respond_to :gnome
17
+ end
18
+
19
+ end
20
+
21
+ describe "Waves::Configurations::Default" do
22
+
23
+ class Default < Waves::Configurations::Default; end
24
+
25
+ it "declares certain attributes necessary to run a Waves app" do
26
+ %w( host port ports log reloadable database session debug root synchronize? ).each do |attr|
27
+ Default.should.respond_to attr
28
+ end
29
+ end
30
+
31
+ it "sets default values for important attributes" do
32
+ [ :debug, :synchronize?, :session, :log, :reloadable ].each do |attr|
33
+ Default[attr].should.not.be.nil
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1 @@
1
+ require File.join(File.dirname(__FILE__) , "..", "helpers")
@@ -0,0 +1,29 @@
1
+ # require 'test_helper' because RubyMate needs help
2
+ require File.join(File.dirname(__FILE__) , "helpers")
3
+
4
+ describe "A Waves Configuration" do
5
+
6
+ class Default < Waves::Configurations::Default; end
7
+
8
+ it "can specify a Rack handler" do
9
+ class Default
10
+ handler(::Rack::Handler::Mongrel, :Host => '0.0.0.0', :Port => 8080)
11
+ end
12
+ Default.handler.should == [ ::Rack::Handler::Mongrel, { :Host => '0.0.0.0', :Port => 8080 } ]
13
+ end
14
+
15
+ it "provides an accessor for a hash of mime types" do
16
+ Waves::MimeTypes.should.receive(:[]).with('foo.png').and_return('image/png')
17
+ Default.mime_types['foo.png'].should == 'image/png'
18
+ end
19
+
20
+ it "must define the application for use with Rack" do
21
+ app = Rack::Builder.new() {}
22
+ Rack::Builder.should.receive(:new).with().and_return(app)
23
+ Default.application do
24
+ "stuff"
25
+ end
26
+ Default.application.should.be.a.kind_of Rack::Builder
27
+ end
28
+
29
+ end
@@ -0,0 +1,37 @@
1
+ # # require 'test_helper' because RubyMate needs help
2
+ # require File.join(File.dirname(__FILE__) , "helpers")
3
+ #
4
+ # # Nota bene, y'all: These model helper methods are very ORM specific, and should probably
5
+ # # get moved into the ORM layers.
6
+ #
7
+ # describe "The base Waves controller" do
8
+ #
9
+ # before do
10
+ # Waves.application.stub!(:models).and_return(VerifyControllers::Models)
11
+ # @request = mock('request')
12
+ # @dc = VerifyControllers::Controllers::Default.new(@request)
13
+ # end
14
+ #
15
+ # it "can isolate its model's attributes from the request params" do
16
+ # @dc.should.receive(:params).and_return({:foo => 'bar', :default => {:one => 'one', :two => 'two'}})
17
+ # @dc.attributes.should == {:one => 'one', :two => 'two'}
18
+ # end
19
+ #
20
+ # it "provides shortcut methods for common model interactions" do
21
+ # VerifyControllers::Models::Default.should.receive(:all)
22
+ # @dc.all
23
+ #
24
+ # VerifyControllers::Models::Default.should.receive(:[]).with(:name => 'This').and_return('That')
25
+ # @dc.find('This').should == 'That'
26
+ #
27
+ # VerifyControllers::Models::Default.should.receive(:create).with("Does it work?").and_return('It worked!')
28
+ # @dc.should.receive(:attributes).and_return("Does it work?")
29
+ # @dc.create.should == 'It worked!'
30
+ #
31
+ # # @dc.update('This')
32
+ #
33
+ # # @dc.delete('This')
34
+ #
35
+ # end
36
+ #
37
+ # end
@@ -0,0 +1,13 @@
1
+ require File.join(File.dirname(__FILE__) , "..", "helpers")
2
+
3
+ module VerifyControllers
4
+ module Models
5
+ class Default
6
+ end
7
+ end
8
+ module Controllers
9
+ class Default < Waves::Controllers::Base; end
10
+ end
11
+ end
12
+
13
+ VerifyControllers::Models.stub!(:[]).with(:default).and_return(VerifyControllers::Models::Default)
@@ -0,0 +1,51 @@
1
+ # require 'test_helper' because RubyMate needs help
2
+ require File.join(File.dirname(__FILE__) , "helpers")
3
+
4
+ describe "A Waves controller" do
5
+
6
+ before do
7
+ Waves.application.stub!(:models).and_return(VerifyControllers::Models)
8
+ @request = mock('request')
9
+ @dc = VerifyControllers::Controllers::Default.new(@request)
10
+ end
11
+
12
+ it "initializes with and can access a request" do
13
+ @dc.request.should == @request
14
+ end
15
+
16
+ it "can access a destructured version of the request params" do
17
+ request_hash = { 'beer.name' => 'Pale Rye Ale',
18
+ 'beer.brew.kind' => 'mini-mash',
19
+ 'beer.brew.yeast' => 'White Labs British Ale' ,
20
+ 'beer.brew.hops.variety' => 'Fuggles' }
21
+ destructured_hash = { :beer =>
22
+ { :name => 'Pale Rye Ale',
23
+ :brew => { :kind => 'mini-mash',
24
+ :yeast => 'White Labs British Ale',
25
+ :hops => { :variety => 'Fuggles' }}}}
26
+
27
+ @request.should.receive(:params).and_return(request_hash)
28
+ @dc.params.should == destructured_hash
29
+ end
30
+
31
+
32
+ it "has reflective model helpers to allow generalizing" do
33
+ # Waves.application handwaving done in ./helpers
34
+
35
+ @dc.model_name.should == 'default'
36
+ @dc.model.should == VerifyControllers::Models::Default
37
+ end
38
+
39
+ end
40
+
41
+ describe "The process method of a Waves controller class" do
42
+
43
+ it "executes a block within the scope of a controller instance" do
44
+ @request = mock('request')
45
+ result = VerifyControllers::Controllers::Default.process(@request) do
46
+ self.class.name
47
+ end
48
+ result.should == "VerifyControllers::Controllers::Default"
49
+ end
50
+
51
+ end
@@ -0,0 +1,3 @@
1
+ %w( rubygems bacon facon ).each { |f| require f }
2
+ Bacon.extend Bacon::TestUnitOutput
3
+ Bacon.summary_on_exit
@@ -0,0 +1,177 @@
1
+ # require 'test_helper' because RubyMate needs help
2
+ require File.join(File.dirname(__FILE__) , "helpers")
3
+
4
+ UTILITIES = "#{File.dirname(__FILE__)}/../../lib/utilities"
5
+
6
+ require "#{UTILITIES}/module"
7
+ require "#{UTILITIES}/inflect"
8
+ require "#{UTILITIES}/string"
9
+ require "#{UTILITIES}/symbol"
10
+ require "#{UTILITIES}/object"
11
+ require "#{UTILITIES}/integer"
12
+ require "#{UTILITIES}/proc"
13
+ require "#{UTILITIES}/hash"
14
+
15
+
16
+ describe "Waves::Utilities::Module" do
17
+
18
+ before do
19
+ module Eenie; module Meenie; module Miney; end; end ; end
20
+ end
21
+
22
+ it "defines a basename method" do
23
+ Eenie::Meenie.basename.should == "Meenie"
24
+ Eenie::Meenie::Miney.basename.should == "Miney"
25
+ end
26
+
27
+ it "defines [] for easy access to namespaced constants" do
28
+ Eenie[:Meenie].should == Eenie::Meenie
29
+ end
30
+
31
+ end
32
+
33
+ describe "a language extended with Waves::Utilities::Inflect" do
34
+
35
+ before do
36
+ # Nominative only, of course.
37
+ module Latin
38
+ extend Waves::Inflect::InflectorMethods
39
+ rule 'us', 'i'
40
+ rule 'u', 'ua'
41
+ rule 'x', 'gis'
42
+
43
+ word 'deus', 'di'
44
+ word 'cultus'
45
+
46
+ singular_rule 'inuum', 'inua'
47
+ plural_rule 'ix', 'ices'
48
+ end
49
+ end
50
+
51
+ it "can define general pluralization rules" do
52
+ Latin.plural('servus').should == 'servi'
53
+ end
54
+
55
+ it "can register two-way exceptions for specific words" do
56
+ Latin.plural('deus').should == 'di'
57
+ Latin.plural('cultus').should == 'cultus'
58
+ end
59
+
60
+ it "can register rules for singularization exceptions" do
61
+ Latin.singular('cornua').should == 'cornu'
62
+ Latin.singular('continua').should == 'continuum'
63
+ end
64
+
65
+ it "can register rules for pluralization exceptions" do
66
+ Latin.plural('phoenix').should == 'phoenices'
67
+ end
68
+
69
+
70
+ end
71
+
72
+ describe "Waves::Utilities::String" do
73
+
74
+ # ** API Change **
75
+ # it "delegates singular and plural inflection methods" do
76
+ # Waves::Inflect::English.should.receive(:singular).and_return("boring")
77
+ # Waves::Inflect::English.should.receive(:plural).and_return("still boring")
78
+ # "boring".singular.plural
79
+ # end
80
+
81
+ it "defines / as syntactic sugar for File.join" do
82
+ ( "lib" / "utilities" ).should == File.join( "lib", "utilities" )
83
+ ( "lib" / :utilities ).should == File.join( "lib", "utilities" )
84
+ ( "lib" / 3 ).should == File.join( "lib", "3" )
85
+ end
86
+
87
+ it "defines a snake_case method" do
88
+ "MilchCow".snake_case.should == "milch_cow"
89
+ "Milch Cow".snake_case.should == "milch_cow"
90
+ "milchCow".snake_case.should == "milch_cow"
91
+ "StrangeFaceMilchCow".snake_case.should == "strange_face_milch_cow"
92
+ end
93
+
94
+ it "defines a camel_case method" do
95
+ "siege_engine".camel_case.should == "SiegeEngine"
96
+ "ineffective_siege_engine".camel_case.should == "IneffectiveSiegeEngine"
97
+ end
98
+
99
+ it "defines a lower_camel_case method" do
100
+ "siege_engine".lower_camel_case.should == "siegeEngine"
101
+ "ineffective_siege_engine".lower_camel_case.should == "ineffectiveSiegeEngine"
102
+ end
103
+
104
+ it "defines a title_case method" do
105
+ # Yes, we know that this is naive title casing.
106
+ "sing ho! for the life of a bear".title_case.should == "Sing Ho! For The Life Of A Bear"
107
+ end
108
+
109
+ end
110
+
111
+ describe "A monkeypatch to Symbol" do
112
+
113
+ it "defines / as syntactic sugar for File.join" do
114
+ ( :lib / :utilities ).should == File.join( "lib", "utilities")
115
+ end
116
+
117
+ end
118
+
119
+
120
+ describe "Waves::Utilities::Object" do
121
+
122
+ before do |variable|
123
+ @foo = [ :a, :b, :c ]
124
+ end
125
+
126
+ it "defines instance_exec, to allow instance_eval-ing a block with parameters" do
127
+ result = @foo.instance_exec(2) do |i|
128
+ self[i]
129
+ end
130
+ result.should == :c
131
+
132
+ result = @foo.instance_exec(0,2) do |*args|
133
+ self.slice(*args)
134
+ end
135
+ result.should == [:a, :b]
136
+ end
137
+
138
+ end
139
+
140
+ describe "Waves::Utilities::Integer" do
141
+ # pedantic, no?
142
+ 1.kilobytes.should == "1,024".to_i
143
+ 1.megabytes.should == "1,048,576".to_i
144
+ 1.gigabytes.should == "1,073,741,824".to_i
145
+ 1.terabytes.should == "1,099,511,627,776".to_i
146
+ 1.petabytes.should == "1,125,899,906,842,624".to_i
147
+ 1.exabytes.should == "1,152,921,504,606,846,976".to_i
148
+ 1.zettabytes.should == "1,180,591,620,717,411,303,424".to_i
149
+ 1.yottabytes.should == "1,208,925,819,614,629,174,706,176".to_i
150
+ end
151
+
152
+ describe "Waves::Utilities::Proc" do
153
+
154
+ it "defines | as syntactic sugar for passing the result of a proc to a lambda" do
155
+ p = Proc.new { "smurf" }
156
+ l = lambda { |data| data.reverse }
157
+ result = p | l
158
+ result.call.should == "frums"
159
+ end
160
+
161
+ end
162
+
163
+ describe "Waves::Utilities::Hash" do
164
+
165
+ it "adds a non-destructive method for converting all hash keys to strings" do
166
+ h = { :a => 1, 'b' => 2, 3 => 3}
167
+ h.stringify_keys.should == { 'a' => 1, 'b' => 2, '3' => 3}
168
+ h.should == { :a => 1, 'b' => 2, 3 => 3}
169
+ end
170
+
171
+ it "adds a destructive method for converting hash keys to symbols" do
172
+ h = { "two" => 2, :three => 3}
173
+ h.symbolize_keys!
174
+ h.should == { :two => 2, :three => 3 }
175
+ end
176
+
177
+ end