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,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,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,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,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
|