cream 0.8.6 → 0.8.7
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.
- 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
|