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,23 @@
1
+ module Cream::Generators
2
+ module Config
3
+ module Cream
4
+ def cream_gems
5
+ gem_name = ORM_MAP[orm]
6
+ gem gem_name if gem_name
7
+
8
+ gem 'devise'
9
+ gem 'cancan'
10
+ gem 'cream'
11
+ run "bundle install"
12
+ end
13
+
14
+ def configure_locale
15
+ src = File.expand_path "config/locales/en.yml".path.up(2)
16
+ # src = "config/locales/en.yml"
17
+ logger.debug "configure_locale, copy from: #{src}"
18
+ copy_file src, "config/locales/cream.en.yml"
19
+ end
20
+ end
21
+ end
22
+ end
23
+
@@ -0,0 +1,108 @@
1
+ module Cream::Generators
2
+ module Config
3
+ module Devise
4
+
5
+ def configure_devise
6
+ if !has_model? :user
7
+ # run devise generator to create User model
8
+ create_devise_model :user
9
+ end
10
+
11
+ # if User model is NOT configured with devise strategy
12
+ if !has_devise_strategy? :user
13
+ insert_devise_strategy :user, :defaults
14
+ end
15
+ end
16
+
17
+ configure_admin_user if configure_admin_user?
18
+ end
19
+
20
+ def configure_admin_user
21
+ # if app does NOT have a Admin model
22
+ if !has_model? :admin
23
+ create_admin_user
24
+ end
25
+ if has_model? :admin
26
+ # insert default devise Admin strategy
27
+ insert_devise_strategy :user, :defaults
28
+ end
29
+ end
30
+
31
+ def devise_gems
32
+ gem 'devise'
33
+
34
+ # Devise ORM integration
35
+ case orm.to_sym
36
+ when :mongoid
37
+ say "Please configure Devise for Mongoid as similar to Rails 3 example app: http://github.com/fortuity/rails3-mongoid-devise"
38
+ when :mongo_mapper
39
+ gem 'mm-devise'
40
+ when :data_mapper
41
+ gem 'dm-devise'
42
+ when :couch_db
43
+ gem 'devise_couch'
44
+ say "Please note that Couch DB does not currently have a Roles implementation. Feel free to provide one."
45
+ say "Look at Roles DataMapper (roles_data_mapper) for an example ;)"
46
+ end
47
+ end
48
+
49
+ def init_devise
50
+ execute 'devise_install'
51
+ end
52
+
53
+ def devise_users?
54
+ has_user?(:user) && has_user?(:admin)
55
+ end
56
+
57
+ def handle_devise_users
58
+ return notify_create_users if !init_devise?
59
+ create_users
60
+ end
61
+
62
+ def notify_create_users
63
+ logger.debug 'notify_create_users'
64
+ say "You must first run devise generators:"
65
+ say "rails g devise User"
66
+ say "rails g devise Admin" if admin_user?
67
+ end
68
+
69
+ def create_admin_user
70
+ logger.debug 'create_admin_user'
71
+ create_model :admin
72
+ # remove any current inheritance
73
+ remove_inheritance :admin
74
+ # and make Admin model inherit from User model
75
+ inherit_model :user => :admin
76
+ end
77
+
78
+ def remove_inheritance user
79
+ File.remove_from model_file user, :content => /<\s*ActiveRecord::Base/
80
+ end
81
+
82
+ def inherit_model hash
83
+ subclass = hash.keys.first
84
+ superclass = hash.values.first.to_s.camelize
85
+ File.replace_content_from model_file subclass, :where => /class Admin/, :with => "class Admin < #{superclass}"
86
+ end
87
+
88
+ # Must be ORM specific!
89
+ def create_devise_model user
90
+ execute "rails g devise #{user}"
91
+ end
92
+
93
+ def create_user user
94
+ execute "rails g model #{user}"
95
+ end
96
+
97
+ def has_user? user
98
+ return true if user == :admin && !admin_user?
99
+ begin
100
+ read_model(user) =~ /devise/
101
+ rescue Exception => e
102
+ logger.info "Exception for has_user? #{user}: #{e.message}"
103
+ false
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,57 @@
1
+ module Cream::Generators
2
+ module Config
3
+ module Helpers
4
+
5
+ ORM_MAP = {
6
+ :data_mapper => 'dm-devise',
7
+ :mongo_mapper => 'mm-devise',
8
+ :mongoid => 'rails3-mongoid-devise'
9
+ }
10
+
11
+ def execute command
12
+ logger.debug command
13
+ run command
14
+ end
15
+
16
+ def strategy
17
+ options[:strategy]
18
+ end
19
+
20
+ def logfile
21
+ options[:logfile]
22
+ end
23
+
24
+ def default_roles
25
+ options[:default_roles] ? '--default-roles' : '--no-default-roles'
26
+ end
27
+
28
+ def roles
29
+ options[:roles].join(' ')
30
+ end
31
+
32
+ def orm
33
+ options[:orm]
34
+ end
35
+
36
+ def roles_config?
37
+ options[:roles_config]
38
+ end
39
+
40
+ def permission_config?
41
+ options[:permission_config]
42
+ end
43
+
44
+ def admin_user?
45
+ options[:admin]
46
+ end
47
+
48
+ def here
49
+ File.dirname(__FILE__)
50
+ end
51
+
52
+ def root_dir
53
+ File.dirname(__FILE__).up(4)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,15 @@
1
+ module Cream::Generators
2
+ module Config
3
+ module Permits
4
+ def permits_gems
5
+ gem 'cancan-permits'
6
+ end
7
+
8
+ def configure_permits
9
+ logger.debug "Configure Permits"
10
+ # Run permits generator to generate permit for each role
11
+ execute "rails g permits --roles #{roles}"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Cream::Generators
2
+ module Config
3
+ module Roles
4
+ def configure_roles_gems
5
+ gem "roles_#{orm}"
6
+ end
7
+
8
+ def configure_roles
9
+ command = "rails g #{orm}:roles --strategy #{strategy} --roles #{roles} #{default_roles}"
10
+ logger.debug command
11
+ run command
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,44 @@
1
+ module Cream
2
+ module Generators
3
+ module HamlUtil
4
+ def verify_haml_existence
5
+ begin
6
+ require 'haml'
7
+ rescue LoadError
8
+ say "HAML is not installed, or it is not specified in your Gemfile."
9
+ exit
10
+ end
11
+ end
12
+
13
+ def verify_haml_version
14
+ unless Haml.version[:major] == 2 and Haml.version[:minor] >= 3 or Haml.version[:major] >= 3
15
+ say "To generate HAML templates, you need to install HAML 2.3 or above."
16
+ exit
17
+ end
18
+ end
19
+
20
+ def create_and_copy_haml_views
21
+ verify_haml_existence
22
+ verify_haml_version
23
+
24
+ require 'tmpdir'
25
+ html_root = "#{self.class.source_root}/cream"
26
+
27
+ Dir.mktmpdir("cream-haml.") do |haml_root|
28
+ Dir["#{html_root}/**/*"].each do |path|
29
+ relative_path = path.sub(html_root, "")
30
+ source_path = (haml_root + relative_path).sub(/erb$/, "haml")
31
+
32
+ if File.directory?(path)
33
+ FileUtils.mkdir_p(source_path)
34
+ else
35
+ `html2haml -r #{path} #{source_path}`
36
+ end
37
+ end
38
+
39
+ directory haml_root, "app/views/#{scope || 'devise'}"
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,34 @@
1
+ require 'generators/cream/string_ext'
2
+ require 'generators/views/haml_util'
3
+
4
+ module Cream
5
+ module Generators
6
+ class ViewsGenerator < Rails::Generators::Base
7
+ desc "Copies all AuthAssist views to your application."
8
+
9
+ argument :scope, :required => false, :default => nil, :desc => "The scope to copy views to"
10
+
11
+ class_option :haml, :type => :boolean, :default => "erb", :desc => "Use HAML"
12
+
13
+ def self.source_root
14
+ @_devise_source_root ||= File.expand_path("app/views".up(4), __FILE__)
15
+ end
16
+
17
+ def copy_views
18
+ if options[:haml]
19
+ create_and_copy_haml_views
20
+ else
21
+ copy_erb_views
22
+ end
23
+ end
24
+
25
+ protected
26
+
27
+ def copy_erb_views
28
+ directory "cream", "app/views/#{scope || 'devise'}"
29
+ end
30
+
31
+ include Cream::Generators::HamlUtil
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,82 @@
1
+ module Cream
2
+ module MigrationHelper
3
+ module CodeRefactor
4
+
5
+ # erase
6
+ def clear_relations(model_name)
7
+ model_name = model_name.to_s
8
+ erase_in(model_name, has_roles_through_assignments)
9
+ erase_in(model_name, has_roles)
10
+ erase_in(model_name, has_role_assignments)
11
+ end
12
+
13
+ def erase_in(model_name, txt)
14
+ model_name = model_name.to_s
15
+ file = File.new(model_file(model_name))
16
+ return if !(file.read =~ /#{txt}/)
17
+ gsub_file model_file(model_name), /#{Regexp.escape(txt + "\n")}/, ''
18
+ end
19
+
20
+
21
+ # insert
22
+ def write_model_file(model_name, content)
23
+ model_name = model_name.to_s
24
+ File.open(model_file(model_name), 'w+') do |f|
25
+ f.write(content)
26
+ end
27
+ end
28
+
29
+ def insert_relation(model_name, relation)
30
+ model_name = model_name.to_s
31
+ file = File.new(model_file(model_name))
32
+ return if (file.read =~ /#{relation}/)
33
+ gsub_file model_file(model_name), /class #{model.camelize} < ActiveRecord::Base/ do |match|
34
+ match << "\n #{relation}"
35
+ end
36
+ end
37
+
38
+ def remove_relation(model_name, relation)
39
+ erase_in(model_name.to_s, relation)
40
+ end
41
+
42
+ def belongs_to_user
43
+ 'belongs_to :user'
44
+ end
45
+
46
+ def belongs_to_role
47
+ 'belongs_to :role'
48
+ end
49
+
50
+ # refactor code
51
+ def has_role_assignments
52
+ 'has_many :role_assignments'
53
+ end
54
+
55
+ def has_roles_through_assignments
56
+ 'has_many :roles, :through => :role_assignments'
57
+ end
58
+
59
+ def has_roles
60
+ 'has_many :roles'
61
+ end
62
+
63
+ def role_file_content
64
+ %Q{
65
+ class Role < ActiveRecord::Base
66
+ #{has_role_assignments}
67
+ #{has_roles_through_assignments}
68
+ end
69
+ }
70
+ end
71
+
72
+ def role_assignment_file_content
73
+ %Q{
74
+ class RoleAssignment < ActiveRecord::Base
75
+ #{belongs_to_user}
76
+ #{belongs_to_role}
77
+ end
78
+ }
79
+ end
80
+ end
81
+ end
82
+ end
File without changes
data/sandbox/test.rb ADDED
@@ -0,0 +1,40 @@
1
+ module RolePermit
2
+
3
+ class Base
4
+ attr_accessor :ability
5
+
6
+ def initialize(ability)
7
+ @ability = ability
8
+ end
9
+
10
+ def permit?(user)
11
+ puts "Base Permit"
12
+ end
13
+ end
14
+
15
+ class Admin < Base
16
+ def initialize(ability)
17
+ super
18
+ end
19
+
20
+ def permit?(user)
21
+ super
22
+ puts "Admin"
23
+ end
24
+ end
25
+
26
+ class Guest < Base
27
+ def initialize(ability)
28
+ super
29
+ end
30
+
31
+ def permit?(user)
32
+ super
33
+ puts "User"
34
+ end
35
+ end
36
+ end
37
+
38
+
39
+ RolePermit::Admin.new(0).permit? 0
40
+ RolePermit::Guest.new(0).permit? 0
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+ require 'r3_plugin_toolbox'
3
+
4
+ require 'active_support'
5
+ require 'action_controller'
6
+ require 'action_view'
7
+ require 'active_support/railtie'
8
+
9
+ module Minimal
10
+ class Application < Rails::Application
11
+ config.active_support.deprecation = :log
12
+ end
13
+ end
14
+
15
+ class Role
16
+ attr_accessor :name
17
+
18
+ def initialize name
19
+ self.name = name
20
+ end
21
+
22
+ def self.all
23
+ [Role.new('admin'), Role.new('guest')]
24
+ end
25
+ end
26
+
27
+ require 'cream/role'
28
+ require 'cream/configure'
29
+
30
+ Rails.application = Minimal::Application
31
+
32
+ Minimal::Application.initialize!
33
+
34
+ describe "Rails extension" do
35
+ describe 'View extension' do
36
+ it "should extend Action View with Roles helper instance_methods and specific role methods" do
37
+ extend Rails3::Plugin::Extender::Macro
38
+
39
+ after_init :view do |view|
40
+ view.should be_extended_with Cream::View, :roles, :area, :user_action_menu
41
+ [:admin, :guest].each do |role|
42
+ view.should respond_to? :"for_#{role}"
43
+ view.should respond_to? :"#{role}_area"
44
+ view.should respond_to? :"#{role}?"
45
+ end
46
+ end
47
+
48
+ Minimal::Application.initialize!
49
+ end
50
+ end
51
+ end