cream 0.5.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.
- data/.document +5 -0
- data/.gitignore +39 -0
- data/.rspec +1 -0
- data/Changelog.txt +8 -0
- data/Gemfile +27 -0
- data/LICENSE +20 -0
- data/README.markdown +196 -0
- data/Rakefile +40 -0
- data/VERSION +1 -0
- data/app/views/auth_assist/menu/_admin_login_items.html.erb +11 -0
- data/app/views/auth_assist/menu/_login_items.html.erb +11 -0
- data/app/views/auth_assist/menu/_registration_items.html.erb +10 -0
- data/config/locales/en.yml +14 -0
- data/cream.gemspec +169 -0
- data/features/FEATURE_NOTES.txt +6 -0
- data/features/permission/adds_permission.feature +0 -0
- data/features/role_strategy/adds_role_strategy.feature +0 -0
- data/features/role_strategy/clears_role_strategy.feature +0 -0
- data/init.rb +1 -0
- data/lib/cream.rb +21 -0
- data/lib/cream/configure.rb +3 -0
- data/lib/cream/configure/after_init/role_config.rb +29 -0
- data/lib/cream/configure/rails.rb +23 -0
- data/lib/cream/controller/ability.rb +7 -0
- data/lib/cream/helper/authlabels.rb +21 -0
- data/lib/cream/helper/host.rb +11 -0
- data/lib/cream/helper/role.rb +48 -0
- data/lib/cream/namespaces.rb +5 -0
- data/lib/cream/role.rb +7 -0
- data/lib/cream/view/host_area.rb +12 -0
- data/lib/cream/view/role_area.rb +38 -0
- data/lib/cream/view/user_action_menu.rb +21 -0
- data/lib/generators/cream/config/DESIGN NOTES.markdown +61 -0
- data/lib/generators/cream/config/config_generator.rb +72 -0
- data/lib/generators/cream/config/modules/cancan_config.rb +22 -0
- data/lib/generators/cream/config/modules/cream_config.rb +23 -0
- data/lib/generators/cream/config/modules/devise_config.rb +108 -0
- data/lib/generators/cream/config/modules/helper.rb +57 -0
- data/lib/generators/cream/config/modules/permits_config.rb +15 -0
- data/lib/generators/cream/config/modules/roles_config.rb +15 -0
- data/lib/generators/cream/views/haml_util.rb +44 -0
- data/lib/generators/cream/views/views_generator.rb +34 -0
- data/lib/generators/cream_refactor.rb +82 -0
- data/log/development.log +0 -0
- data/sandbox/test.rb +40 -0
- data/spec/cream/configure/rails_spec.rb +51 -0
- data/spec/cream/helper/host_spec.rb +68 -0
- data/spec/cream/helper/role_spec.rb +187 -0
- data/spec/cream/view/host_area_spec.rb +61 -0
- data/spec/cream/view/role_area_spec.rb +124 -0
- data/spec/cream/view/role_ext_spec.rb +36 -0
- data/spec/generator_spec_helper.rb +26 -0
- data/spec/generators/cream/config/devise/existing_devise_users.rb +61 -0
- data/spec/generators/cream/config/empty_app/default_args_spec.rb +51 -0
- data/spec/generators/cream/config/permits/existing_permits_spec.rb +0 -0
- data/spec/generators/cream/config/permits/no_permits_spec.rb +0 -0
- data/spec/generators/cream/config/roles/default_roles.rb +51 -0
- data/spec/generators/cream/config/roles/roles_spec.rb +60 -0
- data/spec/generators/cream/shared_examples.rb +18 -0
- data/spec/generators/cream/views_generator_spec.rb +30 -0
- data/spec/spec_helper.rb +18 -0
- data/wiki/CONFIG_GENERATOR.txt +21 -0
- data/wiki/DESIGN.txt +21 -0
- data/wiki/INSTALLATION.txt +6 -0
- data/wiki/PERMITS.txt +32 -0
- data/wiki/ROLE_STRATEGIES.txt +40 -0
- data/wiki/SPEC_NOTES.txt +6 -0
- data/wiki/VIEWS_GENERATOR.txt +35 -0
- data/wiki/VIEW_HELPERS.txt +162 -0
- metadata +374 -0
File without changes
|
File without changes
|
File without changes
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'cream'
|
data/lib/cream.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'active_support/inflector'
|
2
|
+
require 'require_all'
|
3
|
+
|
4
|
+
require 'rails'
|
5
|
+
# require 'devise'
|
6
|
+
require 'devise-links'
|
7
|
+
|
8
|
+
require 'cancan'
|
9
|
+
require 'cancan-rest-links'
|
10
|
+
require 'cancan-permits'
|
11
|
+
|
12
|
+
require 'cream/namespaces'
|
13
|
+
|
14
|
+
require 'sugar-high/alias'
|
15
|
+
require 'sugar-high/kind_of'
|
16
|
+
require 'sugar-high/array'
|
17
|
+
|
18
|
+
require_all File.dirname(__FILE__) + '/cream/controller'
|
19
|
+
require_all File.dirname(__FILE__) + '/cream/helper'
|
20
|
+
require_all File.dirname(__FILE__) + '/cream/view'
|
21
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Cream::View
|
2
|
+
module Role
|
3
|
+
# admin?, guest? ...
|
4
|
+
Cream::Role.available.each do |role|
|
5
|
+
class_eval %{
|
6
|
+
def #{role}_area &block
|
7
|
+
area_for_roles(#{role}, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
def for_#{role}(&block)
|
11
|
+
for_roles(#{role}, &block)
|
12
|
+
end
|
13
|
+
}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module Cream::Helper
|
19
|
+
module Role
|
20
|
+
# admin?, guest? ...
|
21
|
+
AuthAssistant::Role.available.each do |role|
|
22
|
+
class_eval %{
|
23
|
+
def #{role}?
|
24
|
+
has_role? :#{role}
|
25
|
+
end
|
26
|
+
}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'active_support/railtie'
|
2
|
+
require 'r3_plugin_toolbox'
|
3
|
+
|
4
|
+
Rails3::Plugin::Extender.new do
|
5
|
+
# extend action_controller with methods from some modules
|
6
|
+
# extend_rails(:controller) do
|
7
|
+
# extend_from_module Cream, :role
|
8
|
+
# extend_from_module Cream::Controller, :ability
|
9
|
+
# extend_from_module Cream::Helper, :role, :local_host, :auth_label
|
10
|
+
# extend_from_module Cream::Link, :session, :registration, :rest, :session
|
11
|
+
# end
|
12
|
+
|
13
|
+
# extend action_view with methods from some modules
|
14
|
+
extend_rails :view do
|
15
|
+
extend_from_module Cream::View, :role, :user_action_menu
|
16
|
+
extend_from_module Cream::Helper, :role
|
17
|
+
end
|
18
|
+
|
19
|
+
after :initialize do
|
20
|
+
puts "Rails app initialized"
|
21
|
+
require_all File.dirname(__FILE__) + '/after_init'
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Cream::Helper
|
2
|
+
module AuthLabel
|
3
|
+
def auth_labels
|
4
|
+
@auth_labels ||= translate_labels
|
5
|
+
end
|
6
|
+
|
7
|
+
def translate_labels
|
8
|
+
ns_actions = 'cream.actions'
|
9
|
+
labels = {}
|
10
|
+
%w{new edit delete show sign_in sign_out sign_up edit_registration}.each do |action|
|
11
|
+
labels[action.to_sym] = t "#{ns_actions}.#{action}"
|
12
|
+
end
|
13
|
+
labels[:confirm] = t 'cream.confirm'
|
14
|
+
labels
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.included(base)
|
18
|
+
base.helper_method :auth_labels
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Cream::Helper
|
2
|
+
module Role
|
3
|
+
# does the user have ANY of the given roles?
|
4
|
+
# Uses generic roles API
|
5
|
+
def has_role?(*roles)
|
6
|
+
current_user.has_role? roles.flatten
|
7
|
+
end
|
8
|
+
|
9
|
+
# does the user have ALL of the given roles?
|
10
|
+
# Uses generic roles API
|
11
|
+
def has_roles?(*roles)
|
12
|
+
current_user.has_roles? roles.flatten
|
13
|
+
end
|
14
|
+
|
15
|
+
# returns true if the current user owns the object
|
16
|
+
# tries default 'owner' relations if none given as an argument
|
17
|
+
def owner?(obj, relation=nil)
|
18
|
+
if relation
|
19
|
+
return true if user_relation?(obj, relation)
|
20
|
+
end
|
21
|
+
[:user, :owner, :author].each do |relation|
|
22
|
+
return true if user_relation?(obj, relation)
|
23
|
+
end
|
24
|
+
false
|
25
|
+
end
|
26
|
+
|
27
|
+
# execute block if user DOES have any of the given roles
|
28
|
+
def for_roles(*user_roles, &block)
|
29
|
+
user_roles = user_roles.flatten
|
30
|
+
yield if has_role?(user_roles) && block
|
31
|
+
end
|
32
|
+
alias_method :for_role, :for_roles
|
33
|
+
|
34
|
+
# execute block if user DOES NOT have any of the given roles
|
35
|
+
def not_for_roles(*user_roles, &block)
|
36
|
+
user_roles = user_roles.flatten
|
37
|
+
yield if !has_role?(user_roles) && block
|
38
|
+
end
|
39
|
+
alias_method :not_for_role, :not_for_roles
|
40
|
+
|
41
|
+
protected
|
42
|
+
|
43
|
+
def user_relation? obj, relation
|
44
|
+
raise ArgumentError, "User method must be a Symbol or String" if !relation.kind_of_label?
|
45
|
+
current_user == obj.send(relation) if obj.respond_to? relation
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/cream/role.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'sugar-high/arguments'
|
2
|
+
|
3
|
+
module Cream::View
|
4
|
+
module Role
|
5
|
+
# for users WITH the given roles create a div area
|
6
|
+
# with optional class given in options hash and render block
|
7
|
+
# within this div
|
8
|
+
def area_for_roles(*user_roles, &block)
|
9
|
+
options = last_option(user_roles)
|
10
|
+
|
11
|
+
return area(&block) if user_roles.empty?
|
12
|
+
|
13
|
+
not_for_roles(user_roles, &block) if user_roles.first == false
|
14
|
+
|
15
|
+
for_roles user_roles do
|
16
|
+
area(options, &block)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
alias_method :area_for_role, :area_for_roles
|
20
|
+
|
21
|
+
# for users WITHOUT the given roles create a div area
|
22
|
+
# with optional class given in options hash and render block
|
23
|
+
# within this div
|
24
|
+
def area_not_for_roles(*user_roles, &block)
|
25
|
+
options = last_option(user_roles)
|
26
|
+
not_for_roles user_roles do
|
27
|
+
clazz = options[:class] || 'special'
|
28
|
+
area(clazz, &block)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
alias_method :area_not_for_role, :area_not_for_roles
|
32
|
+
|
33
|
+
def area(options=nil, &block)
|
34
|
+
content = yield #with_output_buffer(&block)
|
35
|
+
content_tag :div, content, options
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Cream::View
|
2
|
+
module UserActionMenu
|
3
|
+
|
4
|
+
MENU_ITEMS = {
|
5
|
+
:sign_out => :logout,
|
6
|
+
:sign_in => :login,
|
7
|
+
:sign_up => :register,
|
8
|
+
:edit_registration => [:edit_user, :edit_account]
|
9
|
+
}
|
10
|
+
|
11
|
+
MENU_ITEMS.keys.each do |name|
|
12
|
+
class_eval %{
|
13
|
+
def #{name}_menu_item tag = 'li'
|
14
|
+
content_tag tag, #{name}_link
|
15
|
+
end
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
multi_alias :menu_item, MENU_ITEMS
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# Config generator
|
2
|
+
|
3
|
+
Each of the following should be a module in its own right!
|
4
|
+
|
5
|
+
1. Create fresh Rails 3 app and set it up so that all the sub-systems work
|
6
|
+
2. Develop the generator so that it can mutate a Rails 3 app that matches this example app
|
7
|
+
|
8
|
+
## Code Design
|
9
|
+
|
10
|
+
* Create a module for each sub-system to configure
|
11
|
+
* Include modules depending on options
|
12
|
+
* For each module call the config_[module_name] method, which is responsible for configuring that module!
|
13
|
+
|
14
|
+
## Devise Configuration
|
15
|
+
|
16
|
+
Gemfile
|
17
|
+
gem 'devise'
|
18
|
+
gem ORM 'devise'
|
19
|
+
|
20
|
+
if app does NOT have a User model
|
21
|
+
run devise generator to create User model
|
22
|
+
else
|
23
|
+
if User model is NOT configured with devise strategy
|
24
|
+
insert default devise User strategy
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
if --admin option set
|
29
|
+
if app does NOT have a Admin model
|
30
|
+
run devise generator to create Admin model
|
31
|
+
remove any current inheritance
|
32
|
+
and make Admin model inherit from User model
|
33
|
+
else
|
34
|
+
insert default devise Admin strategy
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
## Cream configuration
|
39
|
+
|
40
|
+
copy locales and views (optional)
|
41
|
+
|
42
|
+
## CanCan Configuration
|
43
|
+
|
44
|
+
Gemfile:
|
45
|
+
gem 'cancan'
|
46
|
+
gem 'cancan-rest-links'
|
47
|
+
|
48
|
+
CanCan access denied exception handling
|
49
|
+
|
50
|
+
## Permits Configuration
|
51
|
+
|
52
|
+
Gemfile:
|
53
|
+
gem 'cancan-permits'
|
54
|
+
|
55
|
+
Run permits generator to generate permit for each role
|
56
|
+
|
57
|
+
## Roles Configuration
|
58
|
+
|
59
|
+
gem ORM 'roles'
|
60
|
+
|
61
|
+
run roles generator for ORM chosen
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'sugar-high/file'
|
2
|
+
require 'sugar-high/modules'
|
3
|
+
require 'cream'
|
4
|
+
require 'rails3_artifactor'
|
5
|
+
require 'logging_assist'
|
6
|
+
|
7
|
+
module Cream
|
8
|
+
module Generators
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
require_all File.dirname(__FILE__) + '/modules'
|
13
|
+
|
14
|
+
module Cream::Generators
|
15
|
+
class ConfigGenerator < Rails::Generators::Base
|
16
|
+
extend Rails3::Assist::UseMacro
|
17
|
+
|
18
|
+
desc "Configures Devise and Users"
|
19
|
+
|
20
|
+
source_root File.dirname(__FILE__)
|
21
|
+
|
22
|
+
# Role Strategy
|
23
|
+
class_option :strategy, :type => :string, :default => 'role_string', :desc => "Role strategy to use",
|
24
|
+
|
25
|
+
# Create Admin user
|
26
|
+
class_option :admin_user, :type => :boolean, :default => false, :desc => "Create admin user",
|
27
|
+
|
28
|
+
# Roles
|
29
|
+
class_option :default_roles, :type => :boolean, :default => true, :desc => "Create default roles :admin and :guest"
|
30
|
+
class_option :roles, :type => :array, :default => [], :desc => "Roles to create"
|
31
|
+
|
32
|
+
# Permits
|
33
|
+
class_option :permits, :type => :boolean, :default => true, :desc => "Configure permits or not"
|
34
|
+
|
35
|
+
# ORM to use
|
36
|
+
class_option :orm, :type => :string, :default => 'active_record', :desc => "ORM to use"
|
37
|
+
|
38
|
+
class_option :logfile, :type => :string, :default => nil, :desc => "Logfile location"
|
39
|
+
|
40
|
+
def main_flow
|
41
|
+
configure_logger
|
42
|
+
configure_gems
|
43
|
+
|
44
|
+
MODULES.each do |name|
|
45
|
+
send :"configure_#{name}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# -----------------
|
50
|
+
protected
|
51
|
+
|
52
|
+
MODULES = [:devise] #, :cancan, :roles, :permits, :cream]
|
53
|
+
|
54
|
+
includes Cream::Generators::Config, :helper, MODULES #, :cancan, :roles, :permits, :cream
|
55
|
+
|
56
|
+
include Rails3::Assist::BasicLogger
|
57
|
+
|
58
|
+
use_helpers :model, :controller, :permit
|
59
|
+
|
60
|
+
def configure_logger
|
61
|
+
logger.add_logfile :logfile => logfile
|
62
|
+
logger.debug 'main flow'
|
63
|
+
end
|
64
|
+
|
65
|
+
def configure_gems
|
66
|
+
MODULES.each do |name|
|
67
|
+
send :"#{name}_gems"
|
68
|
+
end
|
69
|
+
run "bundle install"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Cream::Generators
|
2
|
+
module Config
|
3
|
+
module CanCan
|
4
|
+
def configure_devise_gems
|
5
|
+
gem 'cancan'
|
6
|
+
gem 'cancan-rest-links'
|
7
|
+
end
|
8
|
+
|
9
|
+
# CanCan access denied exception handling
|
10
|
+
def configure_exception_handling
|
11
|
+
insert_into_controller :application, :after => "ActionController::Base\n" do
|
12
|
+
%{
|
13
|
+
rescue_from CanCan::AccessDenied do |exception|
|
14
|
+
flash[:error] = exception.message
|
15
|
+
redirect_to root_url
|
16
|
+
end
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|