cream 0.8.6 → 0.8.7
Sign up to get free protection for your applications and to get access to all the features.
- data/Changelog.txt +6 -1
- data/Design Ideas.textile +463 -0
- data/Gemfile +1 -0
- data/README.textile +158 -34
- data/Rakefile +8 -7
- data/VERSION +1 -1
- data/app/views/cream/menu/_admin_login_items.html.erb +2 -2
- data/app/views/cream/menu/_login_items.html.erb +2 -2
- data/app/views/cream/menu/_registration_items.html.erb +2 -2
- data/config/locales/cream.da.yml +16 -0
- data/cream.gemspec +38 -27
- data/lib/cream.rb +1 -0
- data/lib/cream/configure/after_init/role_config.rb +25 -21
- data/lib/cream/configure/rails.rb +8 -5
- data/lib/cream/controller/application_controller.rb +22 -0
- data/lib/cream/helper/role.rb +102 -11
- data/lib/generators/cream/app/app_generator.rb +50 -26
- data/lib/generators/cream/full_config/full_config_generator.rb +44 -9
- data/lib/generators/cream/helpers/all.rb +1 -0
- data/lib/generators/cream/helpers/execute_helper.rb +0 -4
- data/lib/generators/cream/helpers/gemfile_helper.rb +28 -0
- data/lib/generators/cream/helpers/orm_helper.rb +6 -2
- data/lib/generators/cream/helpers/strategy_helper.rb +28 -0
- data/lib/generators/cream/views/haml_util.rb +3 -4
- data/lib/generators/cream/views/views_generator.rb +13 -13
- data/lib/generators/devise/config/app_helper.rb +1 -1
- data/lib/generators/devise/config/config_generator.rb +1 -3
- data/lib/generators/devise/config/{gem_helper.rb → gem_config_helper.rb} +0 -23
- data/lib/generators/devise/customize/customize_generator.rb +49 -0
- data/lib/generators/devise/customize/customize_messages.rb +52 -0
- data/lib/generators/devise/customize/helpers/query_customizers.rb +43 -0
- data/lib/generators/devise/customize/helpers/recover_login.rb +80 -0
- data/lib/generators/devise/customize/helpers/username_helper.rb +149 -0
- data/lib/generators/devise/users/users_generator.rb +1 -3
- data/lib/generators/permits/config/config_generator.rb +1 -3
- data/lib/generators/roles/config/config_generator.rb +26 -4
- data/sandbox/any_user.rb +98 -0
- data/{lib/generators → sandbox}/cream_refactor.rb +0 -0
- data/sandbox/str_test.rb +50 -0
- data/spec/cream/configure/rails_role_spec.rb +1 -1
- data/spec/cream/helper/role_spec.rb +71 -21
- data/wiki/Cream-generators-overview.textile +79 -0
- data/wiki/How to gollum wiki.txt +13 -0
- metadata +107 -72
- data/wiki/CONFIG_GENERATOR.txt +0 -21
- data/wiki/DESIGN.txt +0 -21
- data/wiki/INSTALLATION.txt +0 -6
- data/wiki/PERMITS.txt +0 -32
- data/wiki/ROLE_STRATEGIES.txt +0 -40
- data/wiki/SPEC_NOTES.txt +0 -6
- data/wiki/VIEWS_GENERATOR.txt +0 -35
- data/wiki/VIEW_HELPERS.txt +0 -162
data/lib/cream.rb
CHANGED
@@ -1,18 +1,24 @@
|
|
1
1
|
module Cream::View
|
2
|
-
module Role
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
def #{role}_area &block
|
8
|
-
area_for_roles(#{role}, &block)
|
9
|
-
end
|
10
|
-
|
11
|
-
def for_#{role}(&block)
|
12
|
-
for_roles(#{role}, &block)
|
13
|
-
end
|
14
|
-
}
|
2
|
+
module Role
|
3
|
+
def self.roles_available
|
4
|
+
begin
|
5
|
+
return Cream::Role.available if defined? Cream::Role
|
6
|
+
rescue
|
15
7
|
end
|
8
|
+
[:guest, :admin]
|
9
|
+
end
|
10
|
+
|
11
|
+
# admin?, guest? ...
|
12
|
+
Cream::View::Role.roles_available.each do |role|
|
13
|
+
class_eval %{
|
14
|
+
def #{role}_area &block
|
15
|
+
area_for_role(:#{role}, &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def for_#{role}(&block)
|
19
|
+
for_role(:#{role}, &block)
|
20
|
+
end
|
21
|
+
}
|
16
22
|
end
|
17
23
|
end
|
18
24
|
end
|
@@ -20,14 +26,12 @@ end
|
|
20
26
|
module Cream::Helper
|
21
27
|
module Role
|
22
28
|
# admin?, guest? ...
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
}
|
30
|
-
end
|
29
|
+
Cream::View::Role.roles_available.each do |role|
|
30
|
+
class_eval %{
|
31
|
+
def #{role}?
|
32
|
+
has_role? :#{role}
|
33
|
+
end
|
34
|
+
}
|
31
35
|
end
|
32
36
|
end
|
33
37
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'active_support/railtie'
|
2
2
|
require 'r3_plugin_toolbox'
|
3
3
|
|
4
|
+
require_all File.dirname(__FILE__) + '/after_init'
|
5
|
+
|
4
6
|
Rails3::Plugin::Extender.new do
|
5
7
|
# extend action_controller with methods from some modules
|
6
8
|
|
@@ -16,11 +18,12 @@ Rails3::Plugin::Extender.new do
|
|
16
18
|
extend_from_module Cream::Helper, :role
|
17
19
|
end
|
18
20
|
|
19
|
-
after :initialize do
|
20
|
-
|
21
|
-
|
22
|
-
#
|
23
|
-
#
|
21
|
+
after :initialize do
|
22
|
+
load File.dirname(__FILE__) + '/after_init/role_config.rb'
|
23
|
+
#
|
24
|
+
# extend_rails :view do
|
25
|
+
# extend_from_module Cream::View, :role
|
26
|
+
# extend_from_module Cream::Helper, :role
|
24
27
|
# end
|
25
28
|
end
|
26
29
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class ApplicationController < ActionController::Base
|
2
|
+
def current_user
|
3
|
+
cu = super
|
4
|
+
if defined? Cream::Role
|
5
|
+
# Try to get instance of any of the available roles as the current user
|
6
|
+
Cream::Role.available.each do |role|
|
7
|
+
method = :"current_#{role}"
|
8
|
+
cu ||= send method if respond_to?(method)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
# if all else fails, the user is likely not signed in so create a Guest user for now
|
12
|
+
cu ||= Guest.create if defined?(Guest)
|
13
|
+
end
|
14
|
+
|
15
|
+
def user_signed_in?
|
16
|
+
current_user && !current_user.has_role?(:guest)
|
17
|
+
end
|
18
|
+
|
19
|
+
def user_session
|
20
|
+
user_signed_in? ? super : session
|
21
|
+
end
|
22
|
+
end
|
data/lib/cream/helper/role.rb
CHANGED
@@ -1,20 +1,38 @@
|
|
1
1
|
module Cream::Helper
|
2
2
|
module Role
|
3
|
+
|
4
|
+
# for_any_user :signed_in
|
5
|
+
# for_any_user :not_logged_in
|
6
|
+
# for_any_user :not_logged_in => true
|
7
|
+
|
8
|
+
def for_any_user options = nil, &block
|
9
|
+
yield if Labels.state_check Labels.extract(options), current_user
|
10
|
+
end
|
11
|
+
|
12
|
+
# not_for_any_user :signed_in
|
13
|
+
# not_for_any_user :logged_out
|
14
|
+
# not_for_any_user :logged_in => true
|
15
|
+
|
16
|
+
def not_for_any_user options = nil, &block
|
17
|
+
return if Labels.state_check Labels.extract(options), current_user
|
18
|
+
yield
|
19
|
+
end
|
20
|
+
|
3
21
|
# does the user have ANY of the given roles?
|
4
22
|
# Uses generic roles API
|
5
|
-
def has_role?
|
6
|
-
current_user.has_role?
|
23
|
+
def has_role? user_role
|
24
|
+
current_user && current_user.has_role?(user_role)
|
7
25
|
end
|
8
26
|
|
9
27
|
# does the user have ALL of the given roles?
|
10
28
|
# Uses generic roles API
|
11
|
-
def has_roles?
|
12
|
-
current_user.has_roles?
|
29
|
+
def has_roles? *roles
|
30
|
+
current_user && current_user.has_roles?(roles.flat_uniq)
|
13
31
|
end
|
14
32
|
|
15
33
|
# returns true if the current user owns the object
|
16
34
|
# tries default 'owner' relations if none given as an argument
|
17
|
-
def owner?
|
35
|
+
def owner? obj, relation=nil
|
18
36
|
if relation
|
19
37
|
return true if user_relation?(obj, relation)
|
20
38
|
end
|
@@ -25,24 +43,97 @@ module Cream::Helper
|
|
25
43
|
end
|
26
44
|
|
27
45
|
# execute block if user DOES have any of the given roles
|
28
|
-
def for_roles
|
46
|
+
def for_roles *user_roles, &block
|
47
|
+
user_roles = user_roles.flatten
|
48
|
+
yield if has_roles?(user_roles) && block
|
49
|
+
end
|
50
|
+
|
51
|
+
def for_any_role *user_roles, &block
|
29
52
|
user_roles = user_roles.flatten
|
30
53
|
yield if has_role?(user_roles) && block
|
31
54
|
end
|
32
|
-
alias_method :for_role, :for_roles
|
33
55
|
|
56
|
+
def for_role user_role, &block
|
57
|
+
if is_negation_role?(user_role)
|
58
|
+
not_for_role(user_role, &block)
|
59
|
+
return
|
60
|
+
end
|
61
|
+
yield if has_role?(user_role) && block
|
62
|
+
end
|
63
|
+
|
34
64
|
# execute block if user DOES NOT have any of the given roles
|
35
65
|
def not_for_roles(*user_roles, &block)
|
36
66
|
user_roles = user_roles.flatten
|
37
|
-
yield if !
|
67
|
+
yield if !has_roles?(user_roles) && block
|
68
|
+
end
|
69
|
+
|
70
|
+
def not_for_role(user_role, &block)
|
71
|
+
if is_negation_role?(user_role)
|
72
|
+
for_role(user_role, &block)
|
73
|
+
return
|
74
|
+
end
|
75
|
+
yield if !has_role?(user_role) && block
|
38
76
|
end
|
39
|
-
alias_method :not_for_role, :not_for_roles
|
40
77
|
|
41
|
-
protected
|
78
|
+
protected
|
79
|
+
|
80
|
+
def is_negation_role? user_role
|
81
|
+
!(:user_role.to_s =~ /^not_/).nil?
|
82
|
+
end
|
42
83
|
|
43
84
|
def user_relation? obj, relation
|
44
85
|
raise ArgumentError, "User method must be a Symbol or String" if !relation.kind_of_label?
|
45
|
-
current_user
|
86
|
+
current_user && is_owner?(current_user, obj, relation)
|
87
|
+
end
|
88
|
+
|
89
|
+
def is_owner? user, obj, relation
|
90
|
+
user == obj.send(relation) if obj.respond_to? relation
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
module Labels
|
96
|
+
class << self
|
97
|
+
def extract options
|
98
|
+
case options
|
99
|
+
when Symbol
|
100
|
+
return :logged_in if logged_in_labels.include?(options)
|
101
|
+
return :logged_out if logged_out_labels.include?(options)
|
102
|
+
when Hash
|
103
|
+
return :logged_in if logged_in_labels.any? {|lab| options[lab] }
|
104
|
+
return :logged_out if logged_out_labels.any? {|lab| options[lab] }
|
105
|
+
end
|
106
|
+
raise ArgumentException, "Unknown option #{options}"
|
107
|
+
end
|
108
|
+
|
109
|
+
def state_check state, current_user
|
110
|
+
logged_in_check(state, current_user) || logged_out_check(state, current_user)
|
111
|
+
end
|
112
|
+
|
113
|
+
def logged_in_check state, current_user
|
114
|
+
state == :logged_in && is_not_guest?(current_user)
|
115
|
+
end
|
116
|
+
|
117
|
+
def logged_out_check state, current_user
|
118
|
+
state == :logged_out && is_guest?(current_user)
|
119
|
+
end
|
120
|
+
|
121
|
+
def is_not_guest? current_user
|
122
|
+
!current_user || (current_user && !current_user.is?(:guest))
|
123
|
+
end
|
124
|
+
|
125
|
+
def is_guest? current_user
|
126
|
+
current_user && current_user.is?(:guest)
|
127
|
+
end
|
128
|
+
|
129
|
+
def logged_in_labels
|
130
|
+
[:logged_in, :signed_in, :not_logged_out, :not_signed_out]
|
131
|
+
end
|
132
|
+
|
133
|
+
def logged_out_labels
|
134
|
+
[:logged_out, :signed_out, :not_logged_in, :not_signed_in]
|
135
|
+
end
|
136
|
+
end
|
46
137
|
end
|
47
138
|
end
|
48
139
|
end
|
@@ -3,6 +3,7 @@ require 'sugar-high/module'
|
|
3
3
|
require 'cream'
|
4
4
|
require 'rails3_artifactor'
|
5
5
|
require 'logging_assist'
|
6
|
+
require 'generators/cream/helpers/all'
|
6
7
|
|
7
8
|
module Cream
|
8
9
|
module Generators
|
@@ -10,42 +11,31 @@ module Cream
|
|
10
11
|
desc "Configure Cream App"
|
11
12
|
|
12
13
|
# ORM to use
|
13
|
-
class_option :orm,
|
14
|
-
class_option :logfile,
|
15
|
-
|
14
|
+
class_option :orm, :type => :string, :default => 'active_record', :desc => "ORM to use"
|
15
|
+
class_option :logfile, :type => :string, :default => nil, :desc => "Logfile location"
|
16
|
+
class_option :guest_user, :type => :boolean, :default => true, :desc => "Create guest user"
|
17
|
+
|
16
18
|
def configure_application
|
17
19
|
logger.add_logfile :logfile => logfile if logfile
|
18
|
-
|
20
|
+
|
21
|
+
app_orm unless active_record?
|
22
|
+
|
23
|
+
set_orm
|
24
|
+
|
19
25
|
app_routes
|
20
26
|
app_layout
|
27
|
+
|
28
|
+
create_guest_user if guest_user?
|
21
29
|
end
|
22
30
|
|
23
31
|
protected
|
24
32
|
|
33
|
+
include Cream::GeneratorHelper
|
25
34
|
include Rails3::Assist::BasicLogger
|
26
35
|
extend Rails3::Assist::UseMacro
|
27
|
-
use_helpers :app, :special, :file, :view
|
28
|
-
|
29
|
-
def logfile
|
30
|
-
options[:logfile]
|
31
|
-
end
|
36
|
+
use_helpers :app, :special, :file, :view, :model
|
32
37
|
|
33
|
-
def
|
34
|
-
options[:orm]
|
35
|
-
end
|
36
|
-
|
37
|
-
# rails generate ...
|
38
|
-
def rgen command
|
39
|
-
execute "rails g #{command}"
|
40
|
-
end
|
41
|
-
|
42
|
-
def execute command
|
43
|
-
logger.debug command
|
44
|
-
run command
|
45
|
-
end
|
46
|
-
|
47
|
-
def app_orm
|
48
|
-
return if orm == 'active_record'
|
38
|
+
def app_orm
|
49
39
|
File.replace_content_from application_file, :where => "require 'rails/all'" do
|
50
40
|
%q{
|
51
41
|
require "action_controller/railtie"
|
@@ -61,8 +51,8 @@ require "rails/test_unit/railtie"
|
|
61
51
|
# if no :welcome controller
|
62
52
|
if !(routes =~ /root\s+:/)
|
63
53
|
# create one with an 'index' view.
|
64
|
-
File.insert_into routes_file, :after => 'do', :content => 'root :to => "welcome#index"'
|
65
54
|
rgen "controller Welcome index"
|
55
|
+
File.insert_into routes_file, :after => 'do', :content => 'root :to => "welcome#index"'
|
66
56
|
end
|
67
57
|
end
|
68
58
|
|
@@ -79,6 +69,40 @@ require "rails/test_unit/railtie"
|
|
79
69
|
insert_into_view :layouts => :application, :after => '<body>' do
|
80
70
|
%Q{<p class="#{name}"><%= #{name} %></p>}
|
81
71
|
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def create_guest_user
|
75
|
+
remove_model :guest if has_model?(:guest)
|
76
|
+
create_model :guest do
|
77
|
+
%Q{
|
78
|
+
def self.create
|
79
|
+
Guest.new
|
80
|
+
end
|
81
|
+
|
82
|
+
def is? role
|
83
|
+
role == :guest
|
84
|
+
end
|
85
|
+
|
86
|
+
def has_role? role
|
87
|
+
is? role
|
88
|
+
end
|
89
|
+
|
90
|
+
def has_roles? *roles
|
91
|
+
false
|
92
|
+
end
|
93
|
+
|
94
|
+
def has_any_role? *roles
|
95
|
+
roles.flat_uniq..to_symbols.include? :guest
|
96
|
+
end
|
97
|
+
}
|
98
|
+
end
|
99
|
+
say "A Guest user model has been created. Users that have not signed in will get an instance of this class as the current_user."
|
100
|
+
end
|
101
|
+
|
102
|
+
protected
|
103
|
+
|
104
|
+
def guest_user?
|
105
|
+
options[:gust_user]
|
82
106
|
end
|
83
107
|
end
|
84
108
|
end
|
@@ -27,12 +27,17 @@ module Cream
|
|
27
27
|
# ORM to use
|
28
28
|
class_option :orm, :type => :string, :default => 'active_record', :desc => "ORM to use"
|
29
29
|
|
30
|
+
class_option :locales, :type => :array, :default => ['all'], :desc => "List of locales - 'all' means ALL locales"
|
30
31
|
class_option :logfile, :type => :string, :default => nil, :desc => "Logfile location"
|
31
32
|
|
32
33
|
class_option :configure, :type => :array, :default => [], :desc => "Finetune which generators to run: app, permits, roles, devise, cancan"
|
33
34
|
class_option :gems, :type => :boolean, :default => true, :desc => "Add gems to gemfile?"
|
34
35
|
class_option :migrations, :type => :boolean, :default => false, :desc => "Autorun database migrations?", :aliases => '-m'
|
35
36
|
|
37
|
+
# Devise customize
|
38
|
+
class_option :user_name, :type => :boolean, :default => true, :desc => "Add username as login option"
|
39
|
+
class_option :login_type, :type => :string, :default => 'generic', :desc => "How to login: 'email', 'username', 'generic' (i.e 'username' or 'email')"
|
40
|
+
|
36
41
|
def main
|
37
42
|
execute_generator if validate_orm && validate_strategy
|
38
43
|
end
|
@@ -49,6 +54,7 @@ module Cream
|
|
49
54
|
|
50
55
|
def execute_generator
|
51
56
|
cream_initializer
|
57
|
+
cream_locales if locales
|
52
58
|
run_generators
|
53
59
|
run_migrations if run_migrations?
|
54
60
|
end
|
@@ -85,6 +91,7 @@ module Cream
|
|
85
91
|
def run_devise
|
86
92
|
rgen "devise:config #{user_class} --orm #{orm} #{admin_user_option}"
|
87
93
|
rgen "devise:users --orm #{orm} --roles #{roles_list} #{admin_user_option} --no-gems"
|
94
|
+
rgen "devise:customize #{user_class} --orm #{orm} --login-type #{login_type} #{user_name_option}"
|
88
95
|
end
|
89
96
|
|
90
97
|
def run_cancan
|
@@ -92,7 +99,7 @@ module Cream
|
|
92
99
|
end
|
93
100
|
|
94
101
|
def run_roles
|
95
|
-
rgen "roles:config --orm #{orm} --roles #{roles_list} --strategy #{strategy}"
|
102
|
+
rgen "roles:config #{user_class} --orm #{orm} --roles #{roles_list} --strategy #{strategy}"
|
96
103
|
end
|
97
104
|
|
98
105
|
def run_permits
|
@@ -103,23 +110,51 @@ module Cream
|
|
103
110
|
create_initializer :cream do
|
104
111
|
%Q{Cream.setup do |config|
|
105
112
|
config.roles = #{sym_roles.inspect}
|
106
|
-
end
|
113
|
+
end
|
114
|
+
|
115
|
+
require 'cream/configure/rails'
|
116
|
+
}
|
107
117
|
end
|
108
118
|
end
|
109
119
|
|
110
|
-
def
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
120
|
+
def login_type
|
121
|
+
options[:login_type]
|
122
|
+
end
|
123
|
+
|
124
|
+
def username?
|
125
|
+
options[:user_name]
|
126
|
+
end
|
127
|
+
|
128
|
+
def user_name_option
|
129
|
+
" --user-name " if username?
|
130
|
+
end
|
131
|
+
|
132
|
+
def locales
|
133
|
+
options[:locales]
|
134
|
+
end
|
135
|
+
|
136
|
+
def supported_locales
|
137
|
+
[:en, :da]
|
138
|
+
end
|
139
|
+
|
140
|
+
def locales_to_generate
|
141
|
+
supported_locales - locales
|
142
|
+
end
|
143
|
+
|
144
|
+
def cream_locales
|
145
|
+
return if locales_to_generate.empty?
|
146
|
+
logger.debug "Generate Cream locale files"
|
147
|
+
locales_to_generate.each do |locale|
|
148
|
+
src = File.expand_path "config/locales/cream.#{locale}.yml".path.up(5), __FILE__
|
149
|
+
copy_file src, "config/locales/cream.#{locale}.yml"
|
150
|
+
end
|
115
151
|
end
|
116
152
|
|
117
153
|
private
|
118
154
|
|
119
155
|
def run_migrations?
|
120
156
|
options[:migrations]
|
121
|
-
end
|
122
|
-
|
157
|
+
end
|
123
158
|
end
|
124
159
|
end
|
125
160
|
end
|