rbacfull 0.1.1 → 0.1.2

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.
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