rbacfull 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4d318bdc8ec82c96b5c5361388b94954d14899f4
4
- data.tar.gz: 508a022297dea1fff6f90d2068bde42508821349
3
+ metadata.gz: 9b98292784d6cbfedd0e8fbf9b26b8683939c122
4
+ data.tar.gz: ce2a4276c4c35f6179b18413e20eebda2a6d05ee
5
5
  SHA512:
6
- metadata.gz: c6c61b5cb72a7cce88254b79b6fe179511d74206e9fe9770e756f58546e641273f44d92c4e3b625b1703f60b97f722dbd3e6c97c2cba1993c59f3ba005fcd729
7
- data.tar.gz: cd96419281b86241354bcdff3ba3b0d1149b855e9bba611856a8d1aa8aa71b8e828c76bd82a530a71c68a50d53d41cda32ff28961f5901b9c5592a74bdc47b0f
6
+ metadata.gz: 651e76febe2b91aa907ab2307f9b3df5a48f4818d8468c0c0d67fb81a6002d62120f011cb9776078e6f6feafb56cacabc2cf8ff4679a2c0b21e986b6b315252b
7
+ data.tar.gz: fca49e4e8d16f64a3166165aababadc32ee3ca87aac54956780034315362c13a2d998ad0f5352a391d15a9e13d9378b350845b1e5190f5438f4cddb415e95c7b
@@ -2,11 +2,66 @@ require 'rails/generators'
2
2
 
3
3
  module Rbacfull
4
4
  class InstallGenerator < ::Rails::Generators::Base
5
+ include Rails::Generators::Migration
6
+
7
+
5
8
  desc "This generator installs rbacfull files to your rails project"
9
+ source_root File.expand_path('../../templates', __FILE__)
6
10
 
7
11
  def install
8
- puts "HelloWorld"
12
+ puts "Install gem's files"
13
+
14
+ end
15
+
16
+ def copy_migrations
17
+ copy_migration "create_user_roles"
18
+ copy_migration "create_roles"
19
+ copy_migration "create_actions"
20
+ copy_migration "create_permissions"
21
+ end
22
+
23
+ def copy_models
24
+ copy_model "role"
25
+ copy_model "action"
26
+ copy_model "permission"
27
+ copy_model "user_role"
28
+ end
29
+
30
+
31
+ def copy_helpers
32
+ copy_helper "user_helper"
33
+
9
34
  end
10
35
 
36
+
37
+
38
+ protected
39
+ def copy_migration(filename)
40
+ if self.class.migration_exists?("db/migrate", "#{filename}")
41
+ say_status("skipped", "Migration #{filename}.rb already exists")
42
+ else
43
+ migration_template "migrations/#{filename}.rb", "db/migrate/#{filename}.rb"
44
+ end
45
+ end
46
+
47
+ def copy_model(filename)
48
+ if self.class.migration_exists?("app/models", "#{filename}")
49
+ say_status("skipped", "Model #{filename}.rb already exists")
50
+ else
51
+ copy_file "models/#{filename}.rb", "app/models/#{filename}.rb"
52
+ end
53
+ end
54
+
55
+ def copy_helper(filename)
56
+ if self.class.migration_exists?("app/helpers", "#{filename}")
57
+ say_status("skipped", "Helper #{filename}.rb already exists")
58
+ else
59
+ copy_file "helpers/#{filename}.rb", "app/helpers/#{filename}.rb"
60
+ end
61
+ end
62
+
63
+ def self.next_migration_number(dir)
64
+ Time.now.utc.strftime("%Y%m%d%H%M%S%L")
65
+ end
11
66
  end
12
67
  end
@@ -0,0 +1,33 @@
1
+
2
+ # That's it! Now you have access to some awesome RBAC helper functions.
3
+ module UserHelper
4
+ # Determines if the user has one or more of the given roles linked to it.
5
+ #
6
+ # @param [String] args an argument list of one or more roles to check for.
7
+ # @return [true|false] true if the user is linked to at least one of the
8
+ # given roles.
9
+ def has_role?(*args)
10
+ throw Exception.new("Must supply at least one role.") if args.empty?
11
+ roles.where(name: args).count > 0
12
+ end
13
+
14
+ # Determines if the user has all of the given roles linked to it.
15
+ #
16
+ # @param [String] args an argument list of one or more roles to check for.
17
+ # @return [true|false] true if the user is linked to all of the given roles.
18
+ def has_roles?(*args)
19
+ throw Exception.new("Must supply at least one role.") if args.empty?
20
+ roles.where(name: args).count == args.count
21
+ end
22
+
23
+ # Determines if the user has permission to a given action. If the action
24
+ # does not exist at all, it is assumed the action is publicly available.
25
+ #
26
+ # @param [String] action name of the action to check permission for.
27
+ # @return [true|false] true if the user has at least one role linked to it
28
+ # with permission to the given action.
29
+ def has_permission?(action)
30
+ return true if Action.where(name: action).count == 0
31
+ actions.where(name: action).count > 0
32
+ end
33
+ end
@@ -0,0 +1,7 @@
1
+ Rbacfull.configure<%= "(\"#{class_name.camelize.to_s}\")" if class_name != "Role" %> do |config|
2
+ # By default ORM adapter is ActiveRecord. uncomment to use mongoid
3
+ <%= "# " if options.orm == :active_record || !options.orm %>config.use_mongoid
4
+
5
+ # Dynamic shortcuts for User class (user.is_admin? like methods). Default is: false
6
+ # config.use_dynamic_shortcuts
7
+ end
@@ -0,0 +1,10 @@
1
+ class CreateActions < ActiveRecord::Migration
2
+ def change
3
+ create_table :actions do |t|
4
+ t.string :name
5
+ t.string :description
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ class CreatePermissions < ActiveRecord::Migration
2
+ def change
3
+ create_table :permissions do |t|
4
+ t.integer :role_id
5
+ t.integer :action_id
6
+
7
+ t.timestamps
8
+ end
9
+
10
+ add_index :permissions, :role_id
11
+ add_index :permissions, :action_id
12
+ add_index :permissions, [:role_id, :action_id], unique: true
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ class CreateRoles < ActiveRecord::Migration
2
+ def change
3
+ create_table :roles do |t|
4
+ t.string :name
5
+ t.string :description
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ class CreateUserRoles < ActiveRecord::Migration
2
+ def change
3
+ create_table :user_roles do |t|
4
+ t.integer :user_id
5
+ t.integer :role_id
6
+
7
+ t.timestamps
8
+ end
9
+
10
+ add_index :user_roles, :user_id
11
+ add_index :user_roles, :role_id
12
+ add_index :user_roles, [:user_id, :role_id], unique: true
13
+ end
14
+ end
@@ -0,0 +1,3 @@
1
+ class Action < ActiveRecord::Base
2
+ has_many :permissions
3
+ end
@@ -0,0 +1,4 @@
1
+ class Permission < ActiveRecord::Base
2
+ belongs_to :role
3
+ belongs_to :action
4
+ end
@@ -0,0 +1,3 @@
1
+ class Role < ActiveRecord::Base
2
+ has_many :permissions
3
+ end
@@ -0,0 +1,4 @@
1
+ class UserRole < ActiveRecord::Base
2
+ belongs_to :user
3
+ belongs_to :role
4
+ end
@@ -0,0 +1,11 @@
1
+ class <%= role_cname.camelize %> < ActiveRecord::Base
2
+ <% if need_table_prefix?(role_cname) %>
3
+ def self.table_name_prefix
4
+ <%= table_prefix(role_cname) %>_
5
+ end
6
+ <% end %>
7
+ has_and_belongs_to_many :<%= user_cname.tableize %>, :join_table => :<%= "#{table_name(user_cname, true)}_#{table_name(role_cname, true)}" %>
8
+ belongs_to :resource, :polymorphic => true
9
+
10
+ scopify
11
+ end
data/lib/rbacfull.rb CHANGED
@@ -1,25 +1,68 @@
1
1
  require "rbacfull/version"
2
2
 
3
+
3
4
  module Rbacfull
4
- module ShowText
5
- class Hello
6
- attr_accessor :name
5
+ extend Configure
6
+ attr_accessor :role_cname, :adapter, :resource_adapter, :role_join_table_name, :role_table_name
7
+ @@resource_types = []
8
+
9
+ def rbacfull(options = {})
10
+ include Role
11
+ extend Dynamic if Rbacfull.dynamic_shortcuts
12
+
13
+ options.reverse_merge!({:role_cname => 'Role'})
14
+ self.role_cname = options[:role_cname]
15
+ self.role_table_name = self.role_cname.tableize.gsub(/\//, "_")
16
+
17
+ default_join_table = "#{self.to_s.tableize.gsub(/\//, "_")}_#{self.role_table_name}"
18
+ options.reverse_merge!({:role_join_table_name => default_join_table})
19
+ self.role_join_table_name = options[:role_join_table_name]
20
+
21
+ rbacfull_options = { :class_name => options[:role_cname].camelize }
22
+ rbacfull_options.merge!({ :join_table => self.role_join_table_name }) if Rbacfull.orm == "active_record"
23
+ rbacfull_options.merge!(options.reject{ |k,v| ![ :before_add, :after_add, :before_remove, :after_remove ].include? k.to_sym })
24
+
25
+ has_and_belongs_to_many :roles, rbacfull_options
26
+
27
+ self.adapter = Rbacfull::Adapter::Base.create("role_adapter", self.role_cname, self.name)
28
+ load_dynamic_methods if Rbacfull.dynamic_shortcuts
29
+ end
30
+
31
+ def adapter
32
+ return self.superclass.adapter unless self.instance_variable_defined? '@adapter'
33
+ @adapter
34
+ end
35
+
36
+ def resourcify(association_name = :roles, options = {})
37
+ include Resource
7
38
 
8
- def initialize(name)
9
- @name = name
10
- end
39
+ options.reverse_merge!({ :role_cname => 'Role', :dependent => :destroy })
40
+ resourcify_options = { :class_name => options[:role_cname].camelize, :as => :resource, :dependent => options[:dependent] }
41
+ self.role_cname = options[:role_cname]
42
+ self.role_table_name = self.role_cname.tableize.gsub(/\//, "_")
11
43
 
12
- def generate_hello
13
- "hello, #{@name}, from rbacfull!"
14
- end
44
+ has_many association_name, resourcify_options
15
45
 
16
- def say_hello
17
- puts generate_hello
18
- end
46
+ self.resource_adapter = Rbacfull::Adapter::Base.create("resource_adapter", self.role_cname, self.name)
47
+ @@resource_types << self.name
48
+ end
19
49
 
50
+ def resource_adapter
51
+ return self.superclass.resource_adapter unless self.instance_variable_defined? '@resource_adapter'
52
+ @resource_adapter
53
+ end
20
54
 
21
- end
55
+ def scopify
56
+ require "rbacfull/adapters/#{Rbacfull.orm}/scopes.rb"
57
+ extend Rbacfull::Adapter::Scopes
58
+ end
22
59
 
60
+ def role_class
61
+ return self.superclass.role_class unless self.instance_variable_defined? '@role_cname'
62
+ self.role_cname.constantize
63
+ end
23
64
 
65
+ def self.resource_types
66
+ @@resource_types
67
+ end
24
68
  end
25
- end
@@ -1,3 +1,3 @@
1
1
  module Rbacfull
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
data/rbacfull.gemspec CHANGED
@@ -27,5 +27,6 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency "rake", "~> 10.0"
28
28
 
29
29
  spec.add_development_dependency 'rspec'
30
+ spec.add_development_dependency 'devise'
30
31
 
31
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbacfull
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tatarsky Vladimir
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-07-30 00:00:00.000000000 Z
11
+ date: 2015-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: devise
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: description
56
70
  email:
57
71
  - v.tatarsky@telefonn.ru
@@ -68,6 +82,17 @@ files:
68
82
  - bin/console
69
83
  - bin/setup
70
84
  - lib/generators/rbacfull/install_generator.rb
85
+ - lib/generators/templates/helpers/user_helper.rb
86
+ - lib/generators/templates/initializer.rb
87
+ - lib/generators/templates/migrations/create_actions.rb
88
+ - lib/generators/templates/migrations/create_permissions.rb
89
+ - lib/generators/templates/migrations/create_roles.rb
90
+ - lib/generators/templates/migrations/create_user_roles.rb
91
+ - lib/generators/templates/models/action.rb
92
+ - lib/generators/templates/models/permission.rb
93
+ - lib/generators/templates/models/role.rb
94
+ - lib/generators/templates/models/user_role.rb
95
+ - lib/generators/templates/role-active_record.rb
71
96
  - lib/rbacfull.rb
72
97
  - lib/rbacfull/version.rb
73
98
  - rbacfull.gemspec