walruz-rails 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +31 -0
  3. data/Rakefile +49 -0
  4. data/VERSION.yml +4 -0
  5. data/examples/rails/README +243 -0
  6. data/examples/rails/Rakefile +10 -0
  7. data/examples/rails/app/controllers/application_controller.rb +10 -0
  8. data/examples/rails/app/helpers/application_helper.rb +3 -0
  9. data/examples/rails/app/models/beatle.rb +26 -0
  10. data/examples/rails/app/models/colaboration.rb +6 -0
  11. data/examples/rails/app/models/song.rb +10 -0
  12. data/examples/rails/config/boot.rb +110 -0
  13. data/examples/rails/config/database.yml +22 -0
  14. data/examples/rails/config/environment.rb +43 -0
  15. data/examples/rails/config/environments/development.rb +17 -0
  16. data/examples/rails/config/environments/production.rb +28 -0
  17. data/examples/rails/config/environments/test.rb +28 -0
  18. data/examples/rails/config/initializers/backtrace_silencers.rb +7 -0
  19. data/examples/rails/config/initializers/inflections.rb +10 -0
  20. data/examples/rails/config/initializers/mime_types.rb +5 -0
  21. data/examples/rails/config/initializers/new_rails_defaults.rb +19 -0
  22. data/examples/rails/config/initializers/session_store.rb +15 -0
  23. data/examples/rails/config/initializers/walruz_initializer.rb +23 -0
  24. data/examples/rails/config/locales/en.yml +5 -0
  25. data/examples/rails/config/routes.rb +43 -0
  26. data/examples/rails/db/development.sqlite3 +0 -0
  27. data/examples/rails/db/migrate/20090604201506_create_beatles.rb +12 -0
  28. data/examples/rails/db/migrate/20090604201512_create_songs.rb +15 -0
  29. data/examples/rails/db/migrate/20090604201527_create_colaborations.rb +17 -0
  30. data/examples/rails/db/schema.rb +44 -0
  31. data/examples/rails/db/test.sqlite3 +0 -0
  32. data/examples/rails/doc/README_FOR_APP +2 -0
  33. data/examples/rails/lib/tasks/rspec.rake +165 -0
  34. data/examples/rails/lib/walruz/policies/author_policy.rb +9 -0
  35. data/examples/rails/lib/walruz/policies/colaboration_policy.rb +22 -0
  36. data/examples/rails/lib/walruz/policies.rb +33 -0
  37. data/examples/rails/log/development.log +1347 -0
  38. data/examples/rails/log/production.log +0 -0
  39. data/examples/rails/log/server.log +0 -0
  40. data/examples/rails/log/test.log +354 -0
  41. data/examples/rails/public/404.html +30 -0
  42. data/examples/rails/public/422.html +30 -0
  43. data/examples/rails/public/500.html +30 -0
  44. data/examples/rails/public/favicon.ico +0 -0
  45. data/examples/rails/public/images/rails.png +0 -0
  46. data/examples/rails/public/index.html +275 -0
  47. data/examples/rails/public/javascripts/application.js +2 -0
  48. data/examples/rails/public/javascripts/controls.js +963 -0
  49. data/examples/rails/public/javascripts/dragdrop.js +973 -0
  50. data/examples/rails/public/javascripts/effects.js +1128 -0
  51. data/examples/rails/public/javascripts/prototype.js +4320 -0
  52. data/examples/rails/public/robots.txt +5 -0
  53. data/examples/rails/public/unathorized.html +9 -0
  54. data/examples/rails/script/about +4 -0
  55. data/examples/rails/script/autospec +6 -0
  56. data/examples/rails/script/console +3 -0
  57. data/examples/rails/script/dbconsole +3 -0
  58. data/examples/rails/script/destroy +3 -0
  59. data/examples/rails/script/generate +3 -0
  60. data/examples/rails/script/performance/benchmarker +3 -0
  61. data/examples/rails/script/performance/profiler +3 -0
  62. data/examples/rails/script/plugin +3 -0
  63. data/examples/rails/script/runner +3 -0
  64. data/examples/rails/script/server +3 -0
  65. data/examples/rails/script/spec +10 -0
  66. data/examples/rails/script/spec_server +9 -0
  67. data/examples/rails/spec/fixtures/beatles.yml +7 -0
  68. data/examples/rails/spec/fixtures/colaborations.yml +7 -0
  69. data/examples/rails/spec/fixtures/songs.yml +7 -0
  70. data/examples/rails/spec/models/beatle_spec.rb +47 -0
  71. data/examples/rails/spec/models/colaboration_spec.rb +4 -0
  72. data/examples/rails/spec/models/song_spec.rb +4 -0
  73. data/examples/rails/spec/rcov.opts +2 -0
  74. data/examples/rails/spec/spec.opts +4 -0
  75. data/examples/rails/spec/spec_helper.rb +48 -0
  76. data/examples/rails/test/performance/browsing_test.rb +9 -0
  77. data/examples/rails/test/test_helper.rb +38 -0
  78. data/lib/walruz/controller_mixin.rb +107 -0
  79. data/lib/walruz_rails.rb +10 -0
  80. data/spec/controller_mixin_spec.rb +92 -0
  81. data/spec/scenario.rb +247 -0
  82. data/spec/spec_helper.rb +29 -0
  83. metadata +169 -0
@@ -0,0 +1,5 @@
1
+ # See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
2
+ #
3
+ # To ban all spiders from the entire site uncomment the next two lines:
4
+ # User-Agent: *
5
+ # Disallow: /
@@ -0,0 +1,9 @@
1
+ <html>
2
+ <head>
3
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8">
4
+ <title>401 unathorized</title>
5
+ </head>
6
+ <body>
7
+ <h1>401 unauthorized</h1>
8
+ </body>
9
+ </html>
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../config/boot'
3
+ $LOAD_PATH.unshift "#{RAILTIES_PATH}/builtin/rails_info"
4
+ require 'commands/about'
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9
3
+ ENV['RSPEC'] = 'true' # allows autotest to discover rspec
4
+ ENV['AUTOTEST'] = 'true' # allows autotest to run w/ color on linux
5
+ system((RUBY_PLATFORM =~ /mswin|mingw/ ? 'autotest.bat' : 'autotest'), *ARGV) ||
6
+ $stderr.puts("Unable to find autotest. Please install ZenTest or fix your PATH")
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../config/boot'
3
+ require 'commands/console'
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../config/boot'
3
+ require 'commands/dbconsole'
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../config/boot'
3
+ require 'commands/destroy'
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../config/boot'
3
+ require 'commands/generate'
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../../config/boot'
3
+ require 'commands/performance/benchmarker'
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../../config/boot'
3
+ require 'commands/performance/profiler'
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../config/boot'
3
+ require 'commands/plugin'
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../config/boot'
3
+ require 'commands/runner'
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../config/boot'
3
+ require 'commands/server'
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ if ARGV.any? {|arg| %w[--drb -X --generate-options -G --help -h --version -v].include?(arg)}
3
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
4
+ else
5
+ gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9
6
+ ENV["RAILS_ENV"] ||= 'test'
7
+ require File.expand_path(File.dirname(__FILE__) + "/../config/environment") unless defined?(RAILS_ROOT)
8
+ end
9
+ require 'spec/autorun'
10
+ exit ::Spec::Runner::CommandLine.run
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ gem 'test-unit', '1.2.3' if RUBY_VERSION.to_f >= 1.9
3
+
4
+ puts "Loading Rails environment"
5
+ ENV["RAILS_ENV"] ||= 'test'
6
+ require File.expand_path(File.dirname(__FILE__) + "/../config/environment") unless defined?(RAILS_ROOT)
7
+
8
+ require 'optparse'
9
+ require 'spec/rails/spec_server'
@@ -0,0 +1,7 @@
1
+ # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
2
+
3
+ # one:
4
+ # column: value
5
+ #
6
+ # two:
7
+ # column: value
@@ -0,0 +1,7 @@
1
+ # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
2
+
3
+ # one:
4
+ # column: value
5
+ #
6
+ # two:
7
+ # column: value
@@ -0,0 +1,7 @@
1
+ # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
2
+
3
+ # one:
4
+ # column: value
5
+ #
6
+ # two:
7
+ # column: value
@@ -0,0 +1,47 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Beatle do
4
+
5
+ before(:all) do
6
+ @john = Beatle.create!(:name => 'John Lennon')
7
+ @paul = Beatle.create!(:name => 'Paul McCartney')
8
+ @george = Beatle.create!(:name => 'George Harrison')
9
+ @ringo = Beatle.create!(:name => 'Ringo Starr')
10
+ @john_paul = Colaboration.new
11
+ @john_paul.beatles << @john
12
+ @john_paul.beatles << @paul
13
+ @john_paul.save!
14
+ @a_day_in_life = Song.create!(:author => @john_paul, :name => 'A Day In Life')
15
+ @all_you_need_is_love = Song.create!(:author => @john, :name => 'All You Need Is Love')
16
+ @yesterday = Song.create!(:author => @paul, :name => 'Yesterday')
17
+ end
18
+
19
+ describe "when wants to sing a song" do
20
+
21
+ it "should be able to do it when he is the author or a colaborator" do
22
+ @john.sings(@a_day_in_life).should == "I'll need Paul McCartney to perform this properly"
23
+ end
24
+
25
+ it "should not be able to do it when he is not the author nor the colaborator" do
26
+ lambda do
27
+ @john.sings(@yesterday)
28
+ end.should raise_error(Walruz::NotAuthorized)
29
+ end
30
+
31
+ end
32
+
33
+ describe "when he wants to sell a song" do
34
+
35
+ it "should be able to do so if he is the only author" do
36
+ @john.sell(@all_you_need_is_love).should == "Who wants the rights of 'All You Need Is Love'?"
37
+ end
38
+
39
+ it "should not be able to do so if he is on a colaboration" do
40
+ lambda do
41
+ @john.sell(@a_day_in_life)
42
+ end.should raise_error(Walruz::NotAuthorized)
43
+ end
44
+
45
+ end
46
+
47
+ end
@@ -0,0 +1,4 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Colaboration do
4
+ end
@@ -0,0 +1,4 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Song do
4
+ end
@@ -0,0 +1,2 @@
1
+ --exclude "spec/*,gems/*"
2
+ --rails
@@ -0,0 +1,4 @@
1
+ --colour
2
+ --format specdoc
3
+ --loadby mtime
4
+ --reverse
@@ -0,0 +1,48 @@
1
+ # This file is copied to ~/spec when you run 'ruby script/generate rspec'
2
+ # from the project root directory.
3
+ ENV["RAILS_ENV"] ||= 'test'
4
+ require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
5
+ require 'spec/autorun'
6
+ require 'spec/rails'
7
+ require 'walruz/policies'
8
+
9
+ Spec::Runner.configure do |config|
10
+ # If you're not using ActiveRecord you should remove these
11
+ # lines, delete config/database.yml and disable :active_record
12
+ # in your config/boot.rb
13
+ config.use_transactional_fixtures = true
14
+ config.use_instantiated_fixtures = false
15
+ config.fixture_path = RAILS_ROOT + '/spec/fixtures/'
16
+
17
+ # == Fixtures
18
+ #
19
+ # You can declare fixtures for each example_group like this:
20
+ # describe "...." do
21
+ # fixtures :table_a, :table_b
22
+ #
23
+ # Alternatively, if you prefer to declare them only once, you can
24
+ # do so right here. Just uncomment the next line and replace the fixture
25
+ # names with your fixtures.
26
+ #
27
+ # config.global_fixtures = :table_a, :table_b
28
+ #
29
+ # If you declare global fixtures, be aware that they will be declared
30
+ # for all of your examples, even those that don't use them.
31
+ #
32
+ # You can also declare which fixtures to use (for example fixtures for test/fixtures):
33
+ #
34
+ # config.fixture_path = RAILS_ROOT + '/spec/fixtures/'
35
+ #
36
+ # == Mock Framework
37
+ #
38
+ # RSpec uses it's own mocking framework by default. If you prefer to
39
+ # use mocha, flexmock or RR, uncomment the appropriate line:
40
+ #
41
+ # config.mock_with :mocha
42
+ # config.mock_with :flexmock
43
+ # config.mock_with :rr
44
+ #
45
+ # == Notes
46
+ #
47
+ # For more information take a look at Spec::Runner::Configuration and Spec::Runner
48
+ end
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+ require 'performance_test_help'
3
+
4
+ # Profiling results for each test method are written to tmp/performance.
5
+ class BrowsingTest < ActionController::PerformanceTest
6
+ def test_homepage
7
+ get '/'
8
+ end
9
+ end
@@ -0,0 +1,38 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
3
+ require 'test_help'
4
+
5
+ class ActiveSupport::TestCase
6
+ # Transactional fixtures accelerate your tests by wrapping each test method
7
+ # in a transaction that's rolled back on completion. This ensures that the
8
+ # test database remains unchanged so your fixtures don't have to be reloaded
9
+ # between every test method. Fewer database queries means faster tests.
10
+ #
11
+ # Read Mike Clark's excellent walkthrough at
12
+ # http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting
13
+ #
14
+ # Every Active Record database supports transactions except MyISAM tables
15
+ # in MySQL. Turn off transactional fixtures in this case; however, if you
16
+ # don't care one way or the other, switching from MyISAM to InnoDB tables
17
+ # is recommended.
18
+ #
19
+ # The only drawback to using transactional fixtures is when you actually
20
+ # need to test transactions. Since your test is bracketed by a transaction,
21
+ # any transactions started in your code will be automatically rolled back.
22
+ self.use_transactional_fixtures = true
23
+
24
+ # Instantiated fixtures are slow, but give you @david where otherwise you
25
+ # would need people(:david). If you don't want to migrate your existing
26
+ # test cases which use the @david style and don't mind the speed hit (each
27
+ # instantiated fixtures translates to a database query per test method),
28
+ # then set this back to true.
29
+ self.use_instantiated_fixtures = false
30
+
31
+ # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
32
+ #
33
+ # Note: You'll currently still have to declare fixtures explicitly in integration tests
34
+ # -- they do not yet inherit this setting
35
+ fixtures :all
36
+
37
+ # Add more helper methods to be used by all tests here...
38
+ end
@@ -0,0 +1,107 @@
1
+ module Walruz
2
+ module ControllerMixin
3
+
4
+ def self.included(base)
5
+ base.send(:include, InstanceMethods)
6
+ base.extend ClassMethods
7
+ end
8
+
9
+ module InstanceMethods
10
+
11
+ def set_policy_params!(params)
12
+ @_policy_params = params
13
+ end
14
+
15
+ def policy_params
16
+ @_policy_params
17
+ end
18
+
19
+ end
20
+
21
+ module ClassMethods
22
+
23
+ #
24
+ # Returns a before filter that will check if the actor returned by the method `current_user` can execute the
25
+ # given action on the given subject.
26
+ #
27
+ # Requirements:
28
+ # - The controller must have a method called `current_user` that returns the authenticated user
29
+ #
30
+ # Parameters:
31
+ # - action: Symbol that represents the action wich will be executed on the subject
32
+ # - subject: Symbol that indicates an instance variable or method on the controller that
33
+ # returns the subject
34
+ #
35
+ # Returns:
36
+ # A proc that will be executed as a before_filter method
37
+ #
38
+ # Example:
39
+ #
40
+ # class UserController < ActionController::Base
41
+ #
42
+ # before_filter check_authorization!(:create, :user), :only => [:new, :create]
43
+ # before_filter check_authorization!(:destroy, :complicated_method_that_returns_a_user), :only => :destroy
44
+ #
45
+ # def complicated_method_that_returns_a_user
46
+ # # some complex logic here
47
+ # return user
48
+ # end
49
+ # end
50
+ #
51
+ def check_authorization!(action, subject)
52
+ lambda do |controller|
53
+ # we get the subject
54
+ subject_instance = if controller.instance_variable_defined?("@%s" % subject)
55
+ controller.instance_variable_get("@%s" % subject)
56
+ elsif controller.respond_to?(subject)
57
+ controller.send(subject)
58
+ else
59
+ error_message = "There is neither an instance variable @%s nor a instance method %s on the %s instance context" % [subject, subject, controller.class.name]
60
+ raise ArgumentError.new(error_message)
61
+ end
62
+ params = controller.send(:current_user).can!(action, subject_instance)
63
+ controller.set_policy_params!(params)
64
+ end
65
+ end
66
+
67
+
68
+ #
69
+ # Generates dynamically all the before filters needed for authorizations on a CRUD model.
70
+ #
71
+ # Requirements:
72
+ # - The controller must have a method called `current_user` that returns the authenticated user
73
+ # - The subject must implement the four actions (:create, :read, :update, :destroy) or have a :default action
74
+ #
75
+ # Parameters:
76
+ # - subject: Symbol that indicates an instance variable or method on the controller that
77
+ # returns the subject
78
+ #
79
+ # Example:
80
+ #
81
+ # class CommentController < ActionController::Base
82
+ #
83
+ # before_check_crud_authorizations_on :@comment
84
+ #
85
+ # # This would be the same as:
86
+ # # before_filter check_authorization!(:create, :@comment), :only => [:new, :create]
87
+ # # before_filter check_authorization!(:read, :@comment), :only => :show
88
+ # # before_filter check_authorization!(:update, :@comment), :only => [:edit, :update]
89
+ # # before_filter check_authorization!(:destroy, :@comment), :only => :destroy
90
+ #
91
+ # end
92
+ #
93
+ def before_check_crud_authorizations_on(subject)
94
+ [
95
+ [:create, ['new', 'create']],
96
+ [:read, 'show'],
97
+ [:update, ['edit', 'update']],
98
+ [:destroy, 'destroy']
99
+ ].each do |(actor_action, actions)|
100
+ before_filter(check_authorization!(actor_action, subject), :only => actions)
101
+ end
102
+ end
103
+
104
+ end
105
+
106
+ end
107
+ end
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'walruz'
3
+ require 'active_support'
4
+ require File.dirname(__FILE__) + '/walruz/controller_mixin'
5
+
6
+ if defined?(Rails)
7
+ Rails.configuration.after_initialize do
8
+ ActionController::Base.class_eval { include Walruz::ControllerMixin }
9
+ end
10
+ end
@@ -0,0 +1,92 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Walruz::ControllerMixin do
4
+
5
+ before(:each) do
6
+ @controller = SongsController.new
7
+ @request = ActionController::TestRequest.new
8
+ @response = ActionController::TestResponse.new
9
+ end
10
+
11
+ it "should provide a check_authorization! method" do
12
+ @controller.class.should respond_to(:check_authorization!)
13
+ end
14
+
15
+ it "should provide a before_check_crud_authorizations_on method" do
16
+ @controller.class.should respond_to(:before_check_crud_authorizations_on)
17
+ end
18
+
19
+ it "should provide a policy_params instance method" do
20
+ @controller.should respond_to(:policy_params)
21
+ end
22
+
23
+ describe '#check_authorization!' do
24
+
25
+ describe "with current_user authorized" do
26
+
27
+ before(:each) do
28
+ @controller.stub!(:current_user).and_return(Beatle::PAUL)
29
+ post(:sings, :song => 'Yesterday')
30
+ end
31
+
32
+ it "should invoke the authorization with the current_user successfuly" do
33
+ @response.body.should == 'Paul is singing Yesterday'
34
+ end
35
+
36
+ it "should provide the policy return hash on the policy_params instance method" do
37
+ @controller.policy_params.should_not be_nil
38
+ @controller.policy_params[:author_policy?].should == true
39
+ end
40
+
41
+ end
42
+
43
+ describe "when the specified user is not setted on the context" do
44
+
45
+ before(:each) do
46
+ @controller.stub!(:assign_song)
47
+ end
48
+
49
+ it "should raise an argument error" do
50
+ post(:sings, :song => 'Yesterday')
51
+ @response.body.should =~ /There is neither an instance variable/
52
+ end
53
+
54
+ end
55
+
56
+ describe "with current_user not authorized" do
57
+
58
+ before(:each) do
59
+ @controller.stub!(:current_user).and_return(Beatle::JOHN)
60
+ end
61
+
62
+ it "should invoke the authorization with the current_user successfuly" do
63
+ post(:sings, :song => 'Yesterday')
64
+ @response.body.should == 'Unauthorized'
65
+ end
66
+
67
+ end
68
+
69
+
70
+ end
71
+
72
+ describe '#before_check_crud_authorizations_on' do
73
+
74
+ before(:each) do
75
+ @controller = PostsController.new
76
+ @request = ActionController::TestRequest.new
77
+ @response = ActionController::TestResponse.new
78
+ end
79
+
80
+ it "should generate before filters for each CRUD action" do
81
+ PostsController.before_filters.should have(5).filters # + 1 of the get_post
82
+ OtherPostsController.before_filters.should have(5).filters
83
+ end
84
+
85
+ it "every action should work correctly" do
86
+ post :destroy, :method => '_delete'
87
+ @response.body.should =~ /Unauthorized/
88
+ end
89
+
90
+ end
91
+
92
+ end