jakewendt-simply_authorized 1.3.6

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 (41) hide show
  1. data/README.rdoc +52 -0
  2. data/app/controllers/roles_controller.rb +38 -0
  3. data/app/models/role.rb +34 -0
  4. data/config/routes.rb +9 -0
  5. data/generators/simply_authorized/USAGE +0 -0
  6. data/generators/simply_authorized/simply_authorized_generator.rb +84 -0
  7. data/generators/simply_authorized/templates/autotest_simply_authorized.rb +2 -0
  8. data/generators/simply_authorized/templates/functional/roles_controller_test.rb +143 -0
  9. data/generators/simply_authorized/templates/migrations/create_roles.rb +14 -0
  10. data/generators/simply_authorized/templates/migrations/create_roles_users.rb +14 -0
  11. data/generators/simply_authorized/templates/simply_authorized.rake +8 -0
  12. data/generators/simply_authorized/templates/stylesheets/authorized.css +0 -0
  13. data/generators/simply_authorized/templates/unit/role_test.rb +30 -0
  14. data/lib/jakewendt-simply_authorized.rb +1 -0
  15. data/lib/simply_authorized.rb +41 -0
  16. data/lib/simply_authorized/authorization.rb +68 -0
  17. data/lib/simply_authorized/autotest.rb +26 -0
  18. data/lib/simply_authorized/controller.rb +87 -0
  19. data/lib/simply_authorized/core_extension.rb +16 -0
  20. data/lib/simply_authorized/factories.rb +15 -0
  21. data/lib/simply_authorized/factory_test_helper.rb +47 -0
  22. data/lib/simply_authorized/helper.rb +28 -0
  23. data/lib/simply_authorized/permissive_controller.rb +27 -0
  24. data/lib/simply_authorized/resourceful_controller.rb +83 -0
  25. data/lib/simply_authorized/tasks.rb +1 -0
  26. data/lib/simply_authorized/test_tasks.rb +47 -0
  27. data/lib/simply_authorized/user_model.rb +161 -0
  28. data/lib/tasks/application.rake +40 -0
  29. data/lib/tasks/database.rake +52 -0
  30. data/lib/tasks/documentation.rake +68 -0
  31. data/lib/tasks/rcov.rake +44 -0
  32. data/lib/tasks/simply_sessions.rake +5 -0
  33. data/rails/init.rb +4 -0
  34. data/test/app/controllers/application_controller.rb +16 -0
  35. data/test/app/controllers/home_controller.rb +10 -0
  36. data/test/app/controllers/users_controller.rb +43 -0
  37. data/test/app/models/user.rb +3 -0
  38. data/test/config/routes.rb +11 -0
  39. data/test/functional/authorized/roles_controller_test.rb +143 -0
  40. data/test/unit/authorized/role_test.rb +30 -0
  41. metadata +167 -0
data/README.rdoc ADDED
@@ -0,0 +1,52 @@
1
+ = SimplyAuthorized
2
+
3
+ This is a rails app built around a ruby gem for testing.
4
+
5
+ == ToDo
6
+
7
+ * merge authorized/controller.rb into authorized/permissive_controller.rb
8
+ * perhaps include authorized/resourceful_controller.rb as well
9
+ * remove hard coded :users from Role model
10
+ * build a full development testing app
11
+
12
+ == Required Gem Sources
13
+
14
+ == Required Gems
15
+
16
+ == Other Required
17
+
18
+ * current_user method
19
+
20
+ == Installation (as a plugin/engine)
21
+
22
+ config.gem "jakewendt-simply_authorized",
23
+ :source => 'http://rubygems.org'
24
+
25
+ class User
26
+ simply_authorized
27
+ end
28
+
29
+ script/generate simply_authorized
30
+
31
+ == Testing (as an app)
32
+
33
+ rake db:migrate
34
+ rake db:fixtures:load
35
+ rake test
36
+ script/server
37
+
38
+ == Gemified with Jeweler
39
+
40
+ vi Rakefile
41
+ rake version:write
42
+
43
+ rake version:bump:patch
44
+ rake version:bump:minor
45
+ rake version:bump:major
46
+
47
+ rake gemspec
48
+
49
+ rake install
50
+ rake release
51
+
52
+ Copyright (c) 2010 [Jake Wendt], released under the MIT license
@@ -0,0 +1,38 @@
1
+ class RolesController < ApplicationController
2
+
3
+ before_filter :may_assign_roles_required
4
+ before_filter :user_id_required
5
+ before_filter :may_not_be_user_required
6
+ before_filter :id_required
7
+
8
+ def update
9
+ @user.roles << @role
10
+ flash[:notice] = 'User was successfully updated.'
11
+ redirect_to @user
12
+ end
13
+
14
+ def destroy
15
+ @user.roles.delete @role
16
+ flash[:notice] = 'User was successfully updated.'
17
+ redirect_to @user
18
+ end
19
+
20
+ protected
21
+
22
+ def user_id_required
23
+ if !params[:user_id].blank? and User.exists?(params[:user_id])
24
+ @user = User.find(params[:user_id])
25
+ else
26
+ access_denied("user id required!", users_path)
27
+ end
28
+ end
29
+
30
+ def id_required
31
+ if !params[:id].blank? and Role.exists?(:name => params[:id])
32
+ @role = Role.find_by_name(params[:id])
33
+ else
34
+ access_denied("id required!", @user)
35
+ end
36
+ end
37
+
38
+ end
@@ -0,0 +1,34 @@
1
+ # #82 new
2
+ # Roles and Users
3
+ #
4
+ # Reported by Magee | August 9th, 2010 @ 02:11 PM
5
+ #
6
+ # Currently we should have four roles (three in
7
+ # the system right now). They are effectively as follows:
8
+ #
9
+ # 1. Reader -- users with login accounts who can
10
+ # view contents of sections but not edit anything.
11
+ # 2. Editor -- users with the ability to add or edit
12
+ # content to the system. These are the users for
13
+ # whom an "edit" button displays on content details
14
+ # pages allowing them to make changes
15
+ # (or an "add" button as appropriate)
16
+ # 3. Administrator -- users who have administrative
17
+ # rights to the system to add users, etc.
18
+ # 4. Superuser -- Magee and Jake
19
+ #
20
+ # There may not be any system behaviors defined for
21
+ # Superusers. They may strictly be Conceptual Roles
22
+ # to describe users who may make backend or other
23
+ # changes outside of the scope of normal system
24
+ # operations. If necessary, a system role may be
25
+ # added in the future to address functions only
26
+ # for that group.
27
+ #
28
+ class Role < ActiveRecord::Base
29
+ acts_as_list
30
+ default_scope :order => :position
31
+ has_and_belongs_to_many :users, :uniq => true
32
+ validates_presence_of :name
33
+ validates_uniqueness_of :name
34
+ end
data/config/routes.rb ADDED
@@ -0,0 +1,9 @@
1
+ ActionController::Routing::Routes.draw do |map|
2
+
3
+ map.resources :users, :only => [:destroy,:show,:index],
4
+ :collection => { :menu => :get } do |user|
5
+ # map.resources :users, :only => [] do |user|
6
+ user.resources :roles, :only => [:update,:destroy]
7
+ end
8
+
9
+ end
File without changes
@@ -0,0 +1,84 @@
1
+ class SimplyAuthorizedGenerator < Rails::Generator::Base
2
+
3
+ def manifest
4
+ # See Rails::Generator::Commands::Create
5
+ # rails-2.3.10/lib/rails_generator/commands.rb
6
+ # for code methods for record (Manifest)
7
+ record do |m|
8
+ m.directory('config/autotest')
9
+ m.file('autotest_simply_authorized.rb', 'config/autotest/simply_authorized.rb')
10
+ m.directory('lib/tasks')
11
+ m.file('simply_authorized.rake', 'lib/tasks/simply_authorized.rake')
12
+
13
+ # File.open('Rakefile','a'){|f|
14
+ # f.puts <<-EOF
15
+ ## From `script/generate simply_authorized` ...
16
+ #require 'simply_authorized/test_tasks'
17
+ # EOF
18
+ # }
19
+ #
20
+ # File.open('.autotest','a'){|f|
21
+ # f.puts <<-EOF
22
+ ## From `script/generate simply_authorized` ...
23
+ #require 'simply_authorized/autotest'
24
+ # EOF
25
+ # }
26
+
27
+ %w( create_roles create_roles_users ).each do |migration|
28
+ m.migration_template "migrations/#{migration}.rb",
29
+ 'db/migrate', :migration_file_name => migration
30
+ end
31
+ dot = File.dirname(__FILE__)
32
+ m.directory('public/javascripts')
33
+ Dir["#{dot}/templates/javascripts/*js"].each{|file|
34
+ f = file.split('/').slice(-2,2).join('/')
35
+ m.file(f, "public/javascripts/#{File.basename(file)}")
36
+ }
37
+ m.directory('public/stylesheets')
38
+ Dir["#{dot}/templates/stylesheets/*css"].each{|file|
39
+ f = file.split('/').slice(-2,2).join('/')
40
+ m.file(f, "public/stylesheets/#{File.basename(file)}")
41
+ }
42
+ # m.directory('test/functional/authorized')
43
+ # Dir["#{dot}/templates/functional/*rb"].each{|file|
44
+ # f = file.split('/').slice(-2,2).join('/')
45
+ # m.file(f, "test/functional/authorized/#{File.basename(file)}")
46
+ # }
47
+ # m.directory('test/unit/authorized')
48
+ # Dir["#{dot}/templates/unit/*rb"].each{|file|
49
+ # f = file.split('/').slice(-2,2).join('/')
50
+ # m.file(f, "test/unit/authorized/#{File.basename(file)}")
51
+ # }
52
+ end
53
+ end
54
+
55
+ end
56
+ module Rails::Generator::Commands
57
+ class Create
58
+ def migration_template(relative_source,
59
+ relative_destination, template_options = {})
60
+ migration_directory relative_destination
61
+ migration_file_name = template_options[
62
+ :migration_file_name] || file_name
63
+ if migration_exists?(migration_file_name)
64
+ puts "Another migration is already named #{migration_file_name}: #{existing_migrations(migration_file_name).first}: Skipping"
65
+ else
66
+ template(relative_source, "#{relative_destination}/#{next_migration_string}_#{migration_file_name}.rb", template_options)
67
+ end
68
+ end
69
+ end # Create
70
+ class Base
71
+ protected
72
+ # the loop through migrations happens so fast
73
+ # that they all have the same timestamp which
74
+ # won't work when you actually try to migrate.
75
+ # All the timestamps MUST be unique.
76
+ def next_migration_string(padding = 3)
77
+ @s = (!@s.nil?)? @s.to_i + 1 : if ActiveRecord::Base.timestamped_migrations
78
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
79
+ else
80
+ "%.#{padding}d" % next_migration_number
81
+ end
82
+ end
83
+ end # Base
84
+ end
@@ -0,0 +1,2 @@
1
+ # From `script/generate simply_authorized` ...
2
+ require 'simply_authorized/autotest'
@@ -0,0 +1,143 @@
1
+ #require File.dirname(__FILE__) + '/../../test_helper'
2
+ require 'test_helper'
3
+
4
+ class SimplyAuthorized::RolesControllerTest < ActionController::TestCase
5
+ tests RolesController
6
+
7
+ # no user_id
8
+ assert_no_route(:put, :update, :id => 'reader')
9
+ assert_no_route(:delete, :destroy, :id => 'reader')
10
+
11
+ %w( super_user admin ).each do |cu|
12
+
13
+ test "should update with #{cu} login" do
14
+ login_as send(cu)
15
+ u = active_user
16
+ assert !u.reload.role_names.include?('reader')
17
+ assert_difference("User.find(#{u.id}).roles.length",1){
18
+ put :update, :user_id => u.id, :id => 'reader'
19
+ }
20
+ assert u.reload.role_names.include?('reader')
21
+ assert_not_nil flash[:notice]
22
+ assert_redirected_to user_path(assigns(:user))
23
+ end
24
+
25
+ test "should destroy with #{cu} login" do
26
+ login_as send(cu)
27
+ u = active_user
28
+ u.roles << Role.find_or_create_by_name('reader')
29
+ assert u.reload.role_names.include?('reader')
30
+ assert_difference("User.find(#{u.id}).roles.length",-1){
31
+ delete :destroy, :user_id => u.id, :id => 'reader'
32
+ }
33
+ assert !u.reload.role_names.include?('reader')
34
+ assert_not_nil flash[:notice]
35
+ assert_redirected_to user_path(assigns(:user))
36
+ end
37
+
38
+ test "should NOT update without valid user_id with #{cu} login" do
39
+ login_as send(cu)
40
+ put :update, :user_id => 0, :id => 'reader'
41
+ assert_not_nil flash[:error]
42
+ assert_redirected_to users_path
43
+ end
44
+
45
+ test "should NOT destroy without valid user_id with #{cu} login" do
46
+ login_as send(cu)
47
+ delete :destroy, :user_id => 0, :id => 'reader'
48
+ assert_not_nil flash[:error]
49
+ assert_redirected_to users_path
50
+ end
51
+
52
+ test "should NOT update self with #{cu} login" do
53
+ u = send(cu)
54
+ login_as u
55
+ assert_difference("User.find(#{u.id}).roles.length",0){
56
+ put :update, :user_id => u.id, :id => 'reader'
57
+ }
58
+ assert_not_nil flash[:error]
59
+ assert_equal u, assigns(:user)
60
+ assert_redirected_to user_path(assigns(:user))
61
+ # assert_redirected_to root_path
62
+ end
63
+
64
+ test "should NOT destroy self with #{cu} login" do
65
+ u = send(cu)
66
+ login_as u
67
+ assert_difference("User.find(#{u.id}).roles.length",0){
68
+ delete :destroy, :user_id => u.id, :id => 'reader'
69
+ }
70
+ assert_not_nil flash[:error]
71
+ assert_equal u, assigns(:user)
72
+ assert_redirected_to user_path(assigns(:user))
73
+ # assert_redirected_to root_path
74
+ end
75
+
76
+ test "should NOT update without valid role_name with #{cu} login" do
77
+ login_as send(cu)
78
+ u = active_user
79
+ assert_difference("User.find(#{u.id}).roles.length",0){
80
+ put :update, :user_id => u.id, :id => 'bogus_role_name'
81
+ }
82
+ assert_not_nil flash[:error]
83
+ assert_redirected_to user_path(assigns(:user))
84
+ end
85
+
86
+ test "should NOT destroy without valid role_name with #{cu} login" do
87
+ login_as send(cu)
88
+ u = active_user
89
+ assert_difference("User.find(#{u.id}).roles.length",0){
90
+ delete :destroy, :user_id => u.id, :id => 'bogus_role_name'
91
+ }
92
+ assert_not_nil flash[:error]
93
+ assert_redirected_to user_path(assigns(:user))
94
+ end
95
+
96
+ end
97
+
98
+ %w( interviewer reader editor active_user ).each do |cu|
99
+
100
+ test "should NOT update with #{cu} login" do
101
+ login_as send(cu)
102
+ u = active_user
103
+ assert !u.reload.role_names.include?('administrator')
104
+ assert_difference("User.find(#{u.id}).roles.length",0){
105
+ put :update, :user_id => u.id, :id => 'administrator'
106
+ }
107
+ assert !u.reload.role_names.include?('administrator')
108
+ assert_not_nil flash[:error]
109
+ assert_redirected_to root_path
110
+ end
111
+
112
+ test "should NOT destroy with #{cu} login" do
113
+ login_as send(cu)
114
+ u = active_user
115
+ u.roles << Role.find_or_create_by_name('administrator')
116
+ assert u.reload.role_names.include?('administrator')
117
+ assert_difference("User.find(#{u.id}).roles.length",0){
118
+ delete :destroy, :user_id => u.id, :id => 'administrator'
119
+ }
120
+ assert u.reload.role_names.include?('administrator')
121
+ assert_not_nil flash[:error]
122
+ assert_redirected_to root_path
123
+ end
124
+
125
+ end
126
+
127
+ test "should NOT update without login" do
128
+ u = active_user
129
+ assert_difference("User.find(#{u.id}).roles.length",0){
130
+ put :update, :user_id => u.id, :id => 'administrator'
131
+ }
132
+ assert_redirected_to_login
133
+ end
134
+
135
+ test "should NOT destroy without login" do
136
+ u = active_user
137
+ assert_difference("User.find(#{u.id}).roles.length",0){
138
+ delete :destroy, :user_id => u.id, :id => 'administrator'
139
+ }
140
+ assert_redirected_to_login
141
+ end
142
+
143
+ end
@@ -0,0 +1,14 @@
1
+ class CreateRoles < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :roles do |t|
4
+ t.integer :position
5
+ t.string :name
6
+ t.timestamps
7
+ end
8
+ add_index :roles, :name, :unique => true
9
+ end
10
+
11
+ def self.down
12
+ drop_table :roles
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ class CreateRolesUsers < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :roles_users, :id => false do |t|
4
+ t.references :role
5
+ t.references :user
6
+ end
7
+ add_index :roles_users, :role_id
8
+ add_index :roles_users, :user_id
9
+ end
10
+
11
+ def self.down
12
+ drop_table :roles_users
13
+ end
14
+ end
@@ -0,0 +1,8 @@
1
+ # From `script/generate simply_authorized` ...
2
+ if sa_gem = Gem.source_index.find_name('jakewendt-simply_authorized').last
3
+ gem 'jakewendt-simply_authorized'
4
+ require 'simply_authorized'
5
+ # it sucks, but this is needed for rake due to the configuration
6
+ require sa_gem.full_gem_path + '/app/models/role'
7
+ require 'simply_authorized/test_tasks'
8
+ end
@@ -0,0 +1,30 @@
1
+ #require File.dirname(__FILE__) + '/../../test_helper'
2
+ require 'test_helper'
3
+
4
+ class SimplyAuthorized::RoleTest < ActiveSupport::TestCase
5
+
6
+ assert_should_act_as_list(:model => 'Role')
7
+ assert_should_require(:name,
8
+ :model => 'Role')
9
+ assert_should_require_unique(:name,
10
+ :model => 'Role')
11
+ assert_should_habtm(:users,
12
+ :model => 'Role')
13
+
14
+ test "should create role" do
15
+ assert_difference('Role.count',1) do
16
+ object = create_object
17
+ assert !object.new_record?,
18
+ "#{object.errors.full_messages.to_sentence}"
19
+ end
20
+ end
21
+
22
+ protected
23
+
24
+ def create_object(options = {})
25
+ record = Factory.build(:role,options)
26
+ record.save
27
+ record
28
+ end
29
+
30
+ end