cream 0.5.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. data/.document +5 -0
  2. data/.gitignore +39 -0
  3. data/.rspec +1 -0
  4. data/Changelog.txt +8 -0
  5. data/Gemfile +27 -0
  6. data/LICENSE +20 -0
  7. data/README.markdown +196 -0
  8. data/Rakefile +40 -0
  9. data/VERSION +1 -0
  10. data/app/views/auth_assist/menu/_admin_login_items.html.erb +11 -0
  11. data/app/views/auth_assist/menu/_login_items.html.erb +11 -0
  12. data/app/views/auth_assist/menu/_registration_items.html.erb +10 -0
  13. data/config/locales/en.yml +14 -0
  14. data/cream.gemspec +169 -0
  15. data/features/FEATURE_NOTES.txt +6 -0
  16. data/features/permission/adds_permission.feature +0 -0
  17. data/features/role_strategy/adds_role_strategy.feature +0 -0
  18. data/features/role_strategy/clears_role_strategy.feature +0 -0
  19. data/init.rb +1 -0
  20. data/lib/cream.rb +21 -0
  21. data/lib/cream/configure.rb +3 -0
  22. data/lib/cream/configure/after_init/role_config.rb +29 -0
  23. data/lib/cream/configure/rails.rb +23 -0
  24. data/lib/cream/controller/ability.rb +7 -0
  25. data/lib/cream/helper/authlabels.rb +21 -0
  26. data/lib/cream/helper/host.rb +11 -0
  27. data/lib/cream/helper/role.rb +48 -0
  28. data/lib/cream/namespaces.rb +5 -0
  29. data/lib/cream/role.rb +7 -0
  30. data/lib/cream/view/host_area.rb +12 -0
  31. data/lib/cream/view/role_area.rb +38 -0
  32. data/lib/cream/view/user_action_menu.rb +21 -0
  33. data/lib/generators/cream/config/DESIGN NOTES.markdown +61 -0
  34. data/lib/generators/cream/config/config_generator.rb +72 -0
  35. data/lib/generators/cream/config/modules/cancan_config.rb +22 -0
  36. data/lib/generators/cream/config/modules/cream_config.rb +23 -0
  37. data/lib/generators/cream/config/modules/devise_config.rb +108 -0
  38. data/lib/generators/cream/config/modules/helper.rb +57 -0
  39. data/lib/generators/cream/config/modules/permits_config.rb +15 -0
  40. data/lib/generators/cream/config/modules/roles_config.rb +15 -0
  41. data/lib/generators/cream/views/haml_util.rb +44 -0
  42. data/lib/generators/cream/views/views_generator.rb +34 -0
  43. data/lib/generators/cream_refactor.rb +82 -0
  44. data/log/development.log +0 -0
  45. data/sandbox/test.rb +40 -0
  46. data/spec/cream/configure/rails_spec.rb +51 -0
  47. data/spec/cream/helper/host_spec.rb +68 -0
  48. data/spec/cream/helper/role_spec.rb +187 -0
  49. data/spec/cream/view/host_area_spec.rb +61 -0
  50. data/spec/cream/view/role_area_spec.rb +124 -0
  51. data/spec/cream/view/role_ext_spec.rb +36 -0
  52. data/spec/generator_spec_helper.rb +26 -0
  53. data/spec/generators/cream/config/devise/existing_devise_users.rb +61 -0
  54. data/spec/generators/cream/config/empty_app/default_args_spec.rb +51 -0
  55. data/spec/generators/cream/config/permits/existing_permits_spec.rb +0 -0
  56. data/spec/generators/cream/config/permits/no_permits_spec.rb +0 -0
  57. data/spec/generators/cream/config/roles/default_roles.rb +51 -0
  58. data/spec/generators/cream/config/roles/roles_spec.rb +60 -0
  59. data/spec/generators/cream/shared_examples.rb +18 -0
  60. data/spec/generators/cream/views_generator_spec.rb +30 -0
  61. data/spec/spec_helper.rb +18 -0
  62. data/wiki/CONFIG_GENERATOR.txt +21 -0
  63. data/wiki/DESIGN.txt +21 -0
  64. data/wiki/INSTALLATION.txt +6 -0
  65. data/wiki/PERMITS.txt +32 -0
  66. data/wiki/ROLE_STRATEGIES.txt +40 -0
  67. data/wiki/SPEC_NOTES.txt +6 -0
  68. data/wiki/VIEWS_GENERATOR.txt +35 -0
  69. data/wiki/VIEW_HELPERS.txt +162 -0
  70. metadata +374 -0
@@ -0,0 +1,26 @@
1
+ require 'rspec/core'
2
+ require 'generator-spec'
3
+ require 'devise-spec'
4
+ require 'roles-spec'
5
+ require 'cream'
6
+
7
+ RSpec::Generator.configure do |config|
8
+ config.debug = false
9
+ config.remove_temp_dir = false # true
10
+ config.default_rails_root(__FILE__)
11
+ config.lib = File.dirname(__FILE__) + '/../lib'
12
+ config.logger = :stdout
13
+ end
14
+
15
+ RSpec.configure do |config|
16
+ config.mock_with :mocha
17
+
18
+ config.before do
19
+ create_rails_app
20
+ end
21
+
22
+ config.after do
23
+ remove_rails_app
24
+ end
25
+ end
26
+
@@ -0,0 +1,61 @@
1
+ require 'generator_spec_helper'
2
+ require_generator :cream => :config
3
+
4
+ LOGFILE = File.expand_path File.dirname(__FILE__) + '/../../config_generator-init.log'
5
+
6
+ describe 'Cream config generator: strategy "admin_flag", init Devise user model User' do
7
+ use_helpers :model, :controller, :permit, :files, :file
8
+
9
+ before :each do
10
+ setup_generator 'config_generator' do
11
+ tests Cream::Generators::ConfigGenerator
12
+ end
13
+ remove_all_permits
14
+ remove_locale :cream
15
+
16
+ File.remove_from controller_file(:application) do
17
+ %{
18
+ rescue_from CanCan::AccessDenied do |exception|
19
+ flash[:error] = exception.message
20
+ redirect_to root_url
21
+ end
22
+ }
23
+ end
24
+ end
25
+
26
+ after :each do
27
+ remove_all_permits
28
+ end
29
+
30
+ describe "Configure Rails 3 app with Cream using init devise" do
31
+ before do
32
+ puts "Running generator"
33
+ Dir.chdir Rails.root do
34
+ @generator = with_generator do |g|
35
+ arguments = "--strategy admin_flag --init-devise --logfile #{LOGFILE}".args
36
+ puts "arguments: #{arguments}"
37
+ g.run_generator arguments
38
+ end
39
+ end
40
+ end # before
41
+
42
+ it "should generate a Devise User with only a :guest role using :role_string strategy" do
43
+ @generator.should generate_model :user do |clazz|
44
+ clazz.should have_default_devise_options
45
+
46
+ # clazz.should use_roles :generic
47
+ # clazz.should include_module 'Roles::Generic'
48
+ # clazz.should have_call :roles, :args => ':guest'
49
+ # clazz.should have_call :role_strategy, :args => ":role_string"
50
+ end
51
+ end # it
52
+
53
+ # it "should generate a Devise Admin user" do
54
+ # @generator.should generate_model :admin do |clazz|
55
+ # # clazz.should use_roles :generic
56
+ # # clazz.should include_module 'Roles::Generic'
57
+ # clazz.should inherit_from :user
58
+ # end
59
+ # end # it
60
+ end # desc
61
+ end
@@ -0,0 +1,51 @@
1
+ require 'generator_spec_helper'
2
+ require_generator :cream => :config
3
+
4
+ LOGFILE = File.expand_path File.dirname(__FILE__) + '/../../config_generator-default.log'
5
+
6
+ puts "Logfile at: #{LOGFILE}"
7
+
8
+ describe 'role strategy generator: admin_flag' do
9
+ use_helpers :model, :controller, :permit, :files, :file
10
+
11
+ before :each do
12
+ setup_generator 'roles_generator' do
13
+ tests Cream::Generators::ConfigGenerator
14
+ end
15
+ remove_all_permits
16
+ remove_locale :cream if locale_file? :cream
17
+
18
+ File.remove_from controller_file(:application) do
19
+ %{
20
+ rescue_from CanCan::AccessDenied do |exception|
21
+ flash[:error] = exception.message
22
+ redirect_to root_url
23
+ end
24
+ }
25
+ end if controller_file? :application
26
+ end
27
+
28
+ after :each do
29
+ remove_all_permits
30
+ end
31
+
32
+ describe "Configure Rails 3 app with Cream using default options" do
33
+ before do
34
+ puts "Running generator"
35
+ Dir.chdir Rails.root do
36
+ @generator = with_generator do |g|
37
+ arguments = "--strategy admin_flag --logfile #{LOGFILE}".args
38
+ puts "arguments: #{arguments}"
39
+ g.run_generator arguments
40
+ end
41
+ end
42
+ end # before
43
+
44
+ it "should generate a Devise User with only a :guest role using :role_string strategy" do
45
+ @generator.should_not generate_model :user
46
+ @generator.should have_gems :devise, :cancan, :roles_active_record
47
+ end # it
48
+ end # desc
49
+ end # desc
50
+
51
+
@@ -0,0 +1,51 @@
1
+ require 'generator_spec_helper'
2
+ require_generator :cream => :config
3
+
4
+ LOGFILE = File.expand_path File.dirname(__FILE__) + '/../../config_generator-default.log'
5
+
6
+ puts "Logfile at: #{LOGFILE}"
7
+
8
+ describe 'role strategy generator: admin_flag' do
9
+ use_helpers :model, :controller, :permit, :files, :file
10
+
11
+ before :each do
12
+ setup_generator 'roles_generator' do
13
+ tests Cream::Generators::ConfigGenerator
14
+ end
15
+ remove_all_permits
16
+ remove_locale :cream if locale_file? :cream
17
+
18
+ File.remove_from controller_file(:application) do
19
+ %{
20
+ rescue_from CanCan::AccessDenied do |exception|
21
+ flash[:error] = exception.message
22
+ redirect_to root_url
23
+ end
24
+ }
25
+ end if controller_file? :application
26
+ end
27
+
28
+ after :each do
29
+ remove_all_permits
30
+ end
31
+
32
+ describe "Configure Rails 3 app with Cream using default options" do
33
+ before do
34
+ puts "Running generator"
35
+ Dir.chdir Rails.root do
36
+ @generator = with_generator do |g|
37
+ arguments = "--strategy admin_flag --logfile #{LOGFILE}".args
38
+ puts "arguments: #{arguments}"
39
+ g.run_generator arguments
40
+ end
41
+ end
42
+ end # before
43
+
44
+ it "should generate a Devise User with only a :guest role using :role_string strategy" do
45
+ @generator.should_not generate_model :user
46
+ @generator.should have_gems :devise, :cancan, :roles_active_record
47
+ end # it
48
+ end # desc
49
+ end # desc
50
+
51
+
@@ -0,0 +1,60 @@
1
+ require 'generator_spec_helper'
2
+ require_generator :cream => :config
3
+
4
+ LOGFILE = File.expand_path File.dirname(__FILE__) + '/../../config_generator-roles.log'
5
+
6
+ describe 'role strategy generator: admin_flag' do
7
+ use_helpers :model, :controller, :permit, :files, :file
8
+
9
+ before :each do
10
+ setup_generator 'config_generator' do
11
+ tests Cream::Generators::ConfigGenerator
12
+ end
13
+ remove_all_permits
14
+ remove_locale :cream
15
+
16
+ File.remove_from controller_file(:application) do
17
+ %{
18
+ rescue_from CanCan::AccessDenied do |exception|
19
+ flash[:error] = exception.message
20
+ redirect_to root_url
21
+ end
22
+ }
23
+ end
24
+ end
25
+
26
+ after :each do
27
+ remove_all_permits
28
+ end
29
+
30
+ describe "Configure Rails 3 app with Cream using init devise" do
31
+ before do
32
+ puts "Running generator"
33
+ Dir.chdir Rails.root do
34
+ @generator = with_generator do |g|
35
+ arguments = "--strategy role_string --init-devise --roles editor author --logfile #{LOGFILE}".args
36
+ puts "arguments: #{arguments}"
37
+ g.run_generator arguments
38
+ end
39
+ end
40
+ end # before
41
+
42
+ it "should generate a Devise User with only a :guest role using :role_string strategy" do
43
+
44
+ # Devise User with Roles setup
45
+ @generator.should generate_model :user do |clazz|
46
+ clazz.should have_devise_options :defaults
47
+ clazz.should use_roles :generic
48
+ clazz.should include_module 'Roles::ActiveRecord'
49
+ clazz.should have_call :valid_roles_are, :args => ':admin, :guest, :editor, :author'
50
+ clazz.should have_call :role_strategy, :args => ":role_string"
51
+ end
52
+
53
+ # Gemfile
54
+ @generator.should have_gems :devise, :cancan, :roles_active_record
55
+
56
+ # Permissions
57
+ @generator.should generate_permits :admin, :guest, :editor, :author
58
+ end # it
59
+ end # desc
60
+ end
@@ -0,0 +1,18 @@
1
+ it "should generate Permits for Guest and Admin roles"
2
+ @generator.should generate_permits :guest, :admin
3
+ end
4
+
5
+ it "should generate Permits for Guest and Admin roles"
6
+ @generator.should generate_permits :guest, :admin
7
+ end
8
+
9
+
10
+ it "should inject permission exception handling into controller 'application_controller'"
11
+ @generator.should update_controller :application do |clazz|
12
+ clazz.should match /rescue_from CanCan::AccessDenied/
13
+ end
14
+ end
15
+
16
+ it "should generate 'cream' locale file"
17
+ @generator.should generate_locale_file :cream
18
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Generator' do
4
+ with_generator do |g, c|
5
+ g.tests Cream::Generators::ViewsGenerator
6
+ c.setup
7
+ end
8
+
9
+ def check_generated_views folder=nil
10
+ with_generator do |g, check|
11
+ if folder
12
+ g.run_generator folder
13
+ else
14
+ g.run_generator
15
+ folder = 'menu'
16
+ end
17
+ check.view folder, '_admin_login_items.html.erb', %w{admin_block not_admin_block}
18
+ check.view folder, '_login_items.html.erb', %w{user_block not_user_block}
19
+ check.view folder, 'registration_items.html.erb', %w{user_block not_user_block}
20
+ end
21
+ end
22
+
23
+ it "should create views in default scope 'menu' " do
24
+ check_generated_views
25
+ end
26
+
27
+ it "should create views in explicit scope 'login' " do
28
+ check_generated_views 'login'
29
+ end
30
+ end
@@ -0,0 +1,18 @@
1
+ require 'rspec/core'
2
+ require 'rspec-action_view'
3
+ require 'generator-spec'
4
+ require 'cream'
5
+
6
+ RSpec::Generator.configure do |config|
7
+ config.debug = false
8
+ config.remove_temp_dir = false # true
9
+ config.default_rails_root(__FILE__)
10
+ config.lib = File.dirname(__FILE__) + '/../lib'
11
+ config.logger = :stdout
12
+ end
13
+
14
+
15
+ RSpec.configure do |config|
16
+ config.mock_with :mocha
17
+ end
18
+
@@ -0,0 +1,21 @@
1
+ The *config* generator generates a configuration initializer file for setting up `cream` to use a particular role strategy.
2
+
3
+ <pre>$ rails g cream:config --strategy NAME</pre>
4
+
5
+ NAME is the name of a role strategy.
6
+
7
+ Strategies with a single role for each user
8
+ * admin_field
9
+ * role_string
10
+ * one_role
11
+
12
+ Strategies with multiple roles for each user
13
+ * roles_mask
14
+ * many_roles
15
+
16
+ Currently role groups are not supported. Feel free to provide an add-on to support this or integrate with an existing 'role group' solution.
17
+
18
+ Example usage:
19
+
20
+ <pre>$ rails g cream:config --strategy admin_field</pre>
21
+
data/wiki/DESIGN.txt ADDED
@@ -0,0 +1,21 @@
1
+ # Design and plans for the future...
2
+
3
+ 1) Specs for generators
4
+ Currently there are a few generators. I have found some good examples of how to write generator tests (using test_unit) in the rails3-generators project.
5
+ I am porting this to RSpec 2 and will then write generator specs next.
6
+
7
+ 2) New hook-in approach for controller and view methods
8
+ I will change how the methods are added to Rails controllers and views using a new approach I found and used in the Netzke project.
9
+
10
+ 3) Create specs for the custom methods
11
+ 4) Create cucumber features for various Role scenarios
12
+ 5) Add Mongoid and Mongo Mapper ORM support
13
+ Mongoid currently supported by Devise, and Mongo Mapper will be supported after Rails 3 release I think (have heard?)
14
+
15
+ 6) Add Data Mapper support
16
+ dm-devise project almost done by jm81 as per. July 9, 2010
17
+
18
+ 7) Add support for Canable (jnunemaker), an even simpler permission system alternative to CanCan.
19
+ I already added generators and specs to this gem.
20
+
21
+ Feel free to suggest other improvements etc ;)
@@ -0,0 +1,6 @@
1
+ This gem has been designed for Rails 3 only. Any back port to Rails 2 is most welcome ;)
2
+
3
+ Insert <pre>gem 'auth-assistant'</pre> in your Rails 3 Gemfile
4
+
5
+ <pre>$ bundle install</pre>
6
+
data/wiki/PERMITS.txt ADDED
@@ -0,0 +1,32 @@
1
+ Authorization is setup by designing permits for each can of role to do certain actions.
2
+ The config generator generates a default permits.rb file in /lib
3
+
4
+ Please see "cancan 1.3 wiki":http://wiki.github.com/ryanb/cancan/upgrading-to-13 for more options
5
+ you can use in designing your Permits. The 'owns' convenience method provided, now uses the new hash option so it
6
+ is also available in the controller using fx:
7
+
8
+ <pre>Book.accessible_by(current_ability)</pre>
9
+
10
+ The user can manage any Comment instance if 'user' field on instance points to the user, marking ownership
11
+ <pre>user.owns(Comment)</pre>
12
+
13
+ Override default 'user_id' field used by owns, to instead use 'author' as ownership key (foreign key) pointing to the user (user.id).
14
+ <pre>user.owns(Book, :author)</pre>
15
+
16
+ Example:
17
+ <pre>module RolePermit
18
+ class Moderator
19
+ def initialize(ability)
20
+ super
21
+ end
22
+
23
+ def permit?(user)
24
+ super
25
+ return if !user.role?(:moderator)
26
+ can :read, :all
27
+
28
+ user.owns(Comment)
29
+ user.owns(Book, :author)
30
+ end
31
+ end
32
+ end</pre>
@@ -0,0 +1,40 @@
1
+ *Auth assistant* supports single and multiple role strategies. Currently groups are not supported.
2
+
3
+ Note: Maybe roles support could be integrated in the future using an existing solution for roles and groups?
4
+
5
+ h2. Single role per user
6
+
7
+ * admin_field
8
+ * role_field (role : string in users table)
9
+ * role_assignment (role_id -> role.id)
10
+
11
+ h3. admin_field
12
+ Uses the field *admin : boolean* in the _users_ table
13
+
14
+ h3. role_field
15
+ Uses the field *role : string* in the _users_ table
16
+
17
+ h3. role_assignment
18
+ Uses the field *role_id :integer* in the _users_ table.
19
+ A _roles_ table has id and name fields, where name is the name of the role.
20
+ `users.role_id` points to `role.id` in a 1-M relation.
21
+
22
+ Many (M) users can have the same (1) role. Any user can however only have a single role.
23
+
24
+ h2. Multiple roles per user
25
+ * roles mask
26
+ * roles_field
27
+ * multi_role_assignment
28
+
29
+ h3. roles mask
30
+ Uses the field *role_masks : integer* in the _users_ table.
31
+ Each bit of the integer matches a given role.
32
+
33
+ h3. roles_field
34
+ Uses the field *roles : string* in the _users_ table.
35
+ Currently "experimental".
36
+
37
+ h3. multi_role_assignment
38
+ Uses the field *role_assignment_id : integer* in the _users_ table.
39
+ A _roles_ table has id and name fields, where name is the name of the role.
40
+ A _role_assignments_ table has _role_id_ and _user_id_ fields, linking the assignment to a user in the users table and a role in the roles table.