roles 0.0.1

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/.gitignore ADDED
@@ -0,0 +1,8 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ tmp/*
6
+ log*/*
7
+ .rbx/*
8
+ .rspec
data/.travis.yml ADDED
@@ -0,0 +1,14 @@
1
+ rvm:
2
+ - 1.9.3
3
+ - ruby-head
4
+ - rbx-19mode
5
+ - jruby-19mode
6
+
7
+ env:
8
+ - ADAPTER=active_record
9
+ - ADAPTER=mongoid
10
+
11
+ before_install:
12
+ - gem update --system
13
+ - gem --version
14
+ - ruby -v
data/CHANGELOG.rdoc ADDED
@@ -0,0 +1,2 @@
1
+ = v0.1 (Aug 17, 2012)
2
+ * first release
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in roles.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 Liu Fengyun
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,103 @@
1
+ # Roles
2
+
3
+ Roles is an extremely simple roles gem inspired by rolify.
4
+
5
+ This library is recommended to be used with [CanCan](https://github.com/ryanb/cancan) and [devise](https://github.com/plataformatec/devise).
6
+
7
+ ## Quick Start
8
+
9
+ ```ruby
10
+
11
+ # query roles
12
+ user.has_role?(:admin) # if user is admin globally
13
+ user.has_role?(:admin, Organization) # if user is admin for Organization type
14
+ user.has_role?(:admin, Organization.first) # if user is not admin of the first organization
15
+
16
+ # grant roles
17
+ user.add_role(:admin) # a global admin
18
+ user.add_role(:admin, Organization) # admin for type Organization
19
+ user.add_role(:admin, Organization.first) # admin for the first organization
20
+
21
+ # revoke roles
22
+ user.remove_role(:admin) # remove global admin
23
+ user.remove_role(:admin, Organization) # remove admin for type Organization
24
+ user.remove_role(:admin, Organization.first) # remove admin for the first organization
25
+
26
+ # global role DON'T overrides resource role request
27
+ user = User.find(4)
28
+ user.add_role :moderator # sets a global role
29
+ user.has_role? :moderator, Forum # => false
30
+ user.add_role :moderator, Forum # sets a role on resource type
31
+ user.has_role? :moderator, Forum.first # => false
32
+ user.has_role? :moderator, Forum.last # => false
33
+
34
+ # query about users
35
+ Forum.users_with_role(role = nil) => returns all users with roles defined on Forum
36
+ forum.users_with_role => returns users with a role defined of current instance
37
+ User.with_role(role, resource = nil) => returns all users with the given role, optionally scoped by Class, instance or non-scoped(globally)
38
+
39
+ # query about resources
40
+ user.resouces(resource_class, :role_name = nil) => returns all resources of type resource_class for a given user, optionally filtered by role_name.
41
+
42
+ ```
43
+
44
+ ## Requirements
45
+
46
+ * Rails >= 3.1
47
+ * ActiveRecord >= 3.1
48
+ * supports ruby 1.9, JRuby 1.6.0+ (in 1.9 mode) and Rubinius 2.0.0dev (in 1.9 mode)
49
+
50
+ ## Installation
51
+
52
+ Add this to your Gemfile and run the +bundle+ command.
53
+
54
+ ```ruby
55
+ gem "roles"
56
+ ```
57
+
58
+ ## Getting Started
59
+
60
+ ### 1. Generate Role Model
61
+
62
+ First, create your Role model and migration file using this generator:
63
+
64
+ ```
65
+ rails g rolify:role Role User
66
+ ```
67
+
68
+ Role and User classes are the default. You can specify any Role class name you want. This is completly a new file so any name can do the job.
69
+ For the User class name, you would probably use the one provided by your authentication solution. rolify just adds some class methods in an existing User class.
70
+
71
+
72
+ ### 2. Run the migration
73
+
74
+ ```
75
+ rake db:migrate
76
+ ```
77
+
78
+ ### 3.1 Configure your user model
79
+
80
+ This gem adds the `rolify` method to your User class.
81
+
82
+ ```ruby
83
+ class User < ActiveRecord::Base
84
+ rolify
85
+ end
86
+ ```
87
+
88
+ ### 3.2 Configure your resource models
89
+
90
+ In the resource models you want to apply roles on, just add ``resourcify`` method.
91
+ For example, on this ActiveRecord class:
92
+
93
+ ```ruby
94
+ class Forum < ActiveRecord::Base
95
+ resourcify
96
+ end
97
+ ```
98
+
99
+ ## Resources
100
+
101
+ * [Rolify](https://github.com/EppO/rolify)
102
+ * [Amazing tutorial](http://railsapps.github.com/tutorial-rails-bootstrap-devise-cancan.html) provided by [RailsApps](http://railsapps.github.com/)
103
+
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ task :default => :spec
5
+
6
+ desc "Run all specs"
7
+ task "spec" do
8
+ exec "bundle exec rspec spec"
9
+ end
data/UPGRADE.rdoc ADDED
@@ -0,0 +1,2 @@
1
+ = Upgrade instructions for Roles library
2
+
@@ -0,0 +1,47 @@
1
+ require 'rails/generators/migration'
2
+
3
+ module Roles
4
+ module Generators
5
+ class RoleGenerator < Rails::Generators::Base
6
+ include Rails::Generators::Migration
7
+
8
+ source_root File.expand_path('../templates', __FILE__)
9
+ argument :role_cname, :type => :string, :default => "Role"
10
+ argument :user_cname, :type => :string, :default => "User"
11
+ argument :orm_adapter, :type => :string, :default => "active_record"
12
+
13
+ desc "Generates a model with the given NAME and a migration file."
14
+
15
+ def generate_role
16
+ template "role-#{orm_adapter}.rb", "app/models/#{role_cname.underscore}.rb"
17
+ inject_into_file(model_path, :after => inject_roles_method) do
18
+ " roles" + (role_cname == "Role" ? "" : " :role_cname => '#{role_cname.camelize}'") + "\n"
19
+ end
20
+ end
21
+
22
+ def copy_role_file
23
+ migration_template "migration.rb", "db/migrate/roles_create_#{role_cname.tableize}" if orm_adapter == "active_record"
24
+ end
25
+
26
+ def model_path
27
+ File.join("app", "models", "#{user_cname.underscore}.rb")
28
+ end
29
+
30
+ def self.next_migration_number(path)
31
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
32
+ end
33
+
34
+ def show_readme
35
+ readme "README-#{orm_adapter}" if behavior == :invoke
36
+ end
37
+
38
+ def inject_roles_method
39
+ if orm_adapter == "active_record"
40
+ /class #{user_cname.camelize}\n|class #{user_cname.camelize} .*\n/
41
+ else
42
+ /include Mongoid::Document\n|include Mongoid::Document .*\n/
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,7 @@
1
+ ===============================================================================
2
+
3
+ Now, you just have to run the migration using rake command:
4
+
5
+ rake db:migrate
6
+
7
+ ===============================================================================
@@ -0,0 +1,17 @@
1
+ ===============================================================================
2
+
3
+ A Role class has been been created in app/models (with the name you gave as
4
+ argument otherwise the default is role.rb), you can add your own business logic
5
+ inside.
6
+
7
+ Inside your User class (or the name you gave as argument otherwise the default
8
+ is user.rb), roles method has been inserted to provide roles methods.
9
+
10
+ Now, if you just have to run the migration using rake command:
11
+
12
+ rake db:migrate
13
+
14
+ and you will be able to add the resourcify method inside all models you want
15
+ scoped by a role.
16
+
17
+ ===============================================================================
@@ -0,0 +1,15 @@
1
+ class RolesCreate<%= role_cname.pluralize.camelize %> < ActiveRecord::Migration
2
+ def change
3
+ create_table(:<%= role_cname.tableize %>) do |t|
4
+ t.string :name
5
+ t.references :resource, :polymorphic => true
6
+ t.references :<%= user_cname.underscore.singularize %>
7
+
8
+ t.timestamps
9
+ end
10
+
11
+ add_index(:<%= role_cname.tableize %>, :name)
12
+ add_index(:<%= role_cname.tableize %>, [ :name, :resource_type, :resource_id ])
13
+ add_index(:<%= role_cname.tableize %>, [ :<%= user_cname.underscore.singularize %>_id, :name ])
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ class <%= role_cname.camelize %> < ActiveRecord::Base
2
+ belongs_to :<%= user_cname.tableize %>
3
+ belongs_to :resource, :polymorphic => true
4
+
5
+ end
@@ -0,0 +1,20 @@
1
+ require 'roles'
2
+ require 'rails'
3
+
4
+ module Rolies
5
+ class Railtie < Rails::Railtie
6
+ initializer 'roles.initialize' do
7
+ ActiveSupport.on_load(:active_record) do
8
+ ActiveRecord::Base.send :extend, Roles
9
+ end
10
+
11
+ config.before_initialize do
12
+ ::Mongoid::Document.module_eval do
13
+ def self.included(base)
14
+ base.extend Roles
15
+ end
16
+ end
17
+ end if defined?(Mongoid)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,25 @@
1
+ module Roles
2
+ module Resource
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ module ClassMethods
8
+ def users_with_role(role_name = nil)
9
+ if role_name.nil?
10
+ self.user_class.joins(:roles).where("roles.resource_type LIKE '%s'", self.to_s).where("roles.resource_id IS NULL")
11
+ else
12
+ self.user_class.joins(:roles).where("roles.resource_type LIKE '%s'", self.to_s).where("roles.resource_id IS NULL").where("roles.name LIKE '%s'", role_name.to_s)
13
+ end
14
+ end
15
+ end
16
+
17
+ def users_with_role(role_name = nil)
18
+ if role_name.nil?
19
+ self.class.user_class.joins(:roles).where("roles.resource_type LIKE '%s'", self.class.to_s).where("roles.resource_id = %s", self.id)
20
+ else
21
+ self.class.user_class.joins(:roles).where("roles.resource_type LIKE '%s'", self.class.to_s).where("roles.resource_id = %s", self.id).where("roles.name LIKE '%s'", role_name.to_s)
22
+ end
23
+ end
24
+ end
25
+ end
data/lib/roles/role.rb ADDED
@@ -0,0 +1,85 @@
1
+ module Roles
2
+ module Role
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ module ClassMethods
8
+ def with_role(role_name, resource = nil)
9
+ if resource.nil?
10
+ self.joins(:roles).where("roles.name LIKE '%s'", role_name.to_s).where("roles.resource_type IS NULL").where("roles.resource_id IS NULL")
11
+ elsif resource.is_a? Class
12
+ self.joins(:roles).where("roles.name LIKE '%s'", role_name.to_s).where("roles.resource_type = '%s'", resource.to_s).where("roles.resource_id IS NULL")
13
+ else
14
+ self.joins(:roles).where("roles.name LIKE '%s'", role_name.to_s).where("roles.resource_type = '%s'", resource.to_s).where("roles.resource_id = %s", resource.id)
15
+ end
16
+ end
17
+ end
18
+
19
+ def add_role(role_name, resource = nil)
20
+ if resource.nil?
21
+ self.roles.where(:resource_type => nil).where(:resource_id => nil).find_or_create_by_name(:name => role_name.to_s)
22
+ elsif resource.is_a? Class
23
+ self.roles.where(:resource_type => resource.to_s).where(:resource_id => nil).find_or_create_by_name(:name => role_name.to_s)
24
+ else
25
+ self.roles.where(:resource_type => resource.class.to_s).where(:resource_id => resource.id).find_or_create_by_name(:name => role_name.to_s)
26
+ end
27
+ end
28
+ alias_method :grant, :add_role
29
+
30
+ def has_role?(role_name, resource = nil)
31
+ if new_record?
32
+ self.roles.detect { |r| r.name == role_name.to_s && (r.resource == resource || resource.nil?) }.present?
33
+ else
34
+ if resource.nil?
35
+ self.roles.where(:name => role_name.to_s).where(:resource_type => nil).where(:resource_id => nil).size > 0
36
+ elsif resource.is_a? Class
37
+ self.roles.where(:name => role_name.to_s).where(:resource_type => resource.to_s).where(:resource_id => nil).size > 0
38
+ else
39
+ self.roles.where(:name => role_name.to_s).where(:resource_type => resource.class.to_s).where(:resource_id => resource.id).size > 0
40
+ end
41
+ end
42
+ end
43
+
44
+ def remove_role(role_name, resource = nil)
45
+ if resource.nil?
46
+ self.roles.where(:name => role_name.to_s).where(:resource_type => nil).where(:resource_id => nil).destroy_all
47
+ elsif resource.is_a? Class
48
+ self.roles.where(:name => role_name.to_s).where(:resource_type => resource.to_s).where(:resource_id => nil).destroy_all
49
+ else
50
+ self.roles.where(:name => role_name.to_s).where(:resource_type => resource.class.to_s).where(:resource_id => resource.id).destroy_all
51
+ end
52
+ end
53
+
54
+ alias_method :revoke, :remove_role
55
+
56
+ def role_names(resource = nil)
57
+ if resource.nil?
58
+ self.roles.where(:resource_type => nil).where(:resource_id => nil).select(:name).map { |r| r.name }
59
+ elsif resource.is_a? Class
60
+ self.roles.where(:resource_type => resource.name).where(:resource_id => nil).select(:name).map { |r| r.name }
61
+ else
62
+ self.roles.where(:resource_type => resource.class.to_s).where(:resource_id => resource.id).select(:name).map { |r| r.name }
63
+ end
64
+ end
65
+
66
+ def resources(resource_class, role_name = nil)
67
+ if role_name.nil?
68
+ resource_class.joins(:roles).where("roles.#{self.class.user_cname.underscore.singularize}_id = %s", self.id).where("roles.resource_type LIKE '%s'", resource_class.to_s)
69
+ else
70
+ resource_class.joins(:roles).where("roles.#{self.class.user_cname.underscore.singularize}_id = %s", self.id).where("roles.resource_type LIKE '%s'", resource_class.to_s).where("roles.name LIKE '%s'", role_name.to_s)
71
+ end
72
+ end
73
+
74
+ def method_missing(method, *args, &block)
75
+ if method.to_s.match(/^is_(\w+)_of[?]$/) || method.to_s.match(/^is_(\w+)[?]$/)
76
+ if self.class.role_class.where(:name => $1).count > 0
77
+ resource = args.first
78
+ return has_role?("#{$1}", resource)
79
+ end
80
+ end
81
+ super
82
+ end
83
+
84
+ end
85
+ end
@@ -0,0 +1,3 @@
1
+ module Roles
2
+ VERSION = "0.0.1"
3
+ end
data/lib/roles.rb ADDED
@@ -0,0 +1,40 @@
1
+ require 'roles/railtie' if defined?(Rails)
2
+ require 'roles/role'
3
+ require 'roles/resource'
4
+
5
+ module Roles
6
+ attr_accessor :role_cname
7
+ attr_accessor :user_cname
8
+
9
+ def roles(options = {})
10
+ include Role
11
+
12
+ options.reverse_merge!({:role_cname => 'Role'})
13
+
14
+ roles_options = { :class_name => options[:role_cname].camelize }
15
+ roles_options.merge!(options.select{ |k,v| [:before_add, :after_add, :before_remove, :after_remove].include? k.to_sym })
16
+
17
+ has_many :roles, roles_options
18
+
19
+ self.role_cname = options[:role_cname]
20
+ end
21
+
22
+ def resourcify(options = {})
23
+ include Resource
24
+
25
+ options.reverse_merge!({ :role_cname => 'Role', :dependent => :destroy })
26
+ resourcify_options = { :class_name => options[:role_cname].camelize, :as => :resource, :dependent => options[:dependent] }
27
+ has_many :roles, resourcify_options
28
+
29
+ self.role_cname = options[:role_cname]
30
+ self.user_cname = options[:user_cname] || 'User'
31
+ end
32
+
33
+ def user_class
34
+ self.user_cname.constantize
35
+ end
36
+
37
+ def role_class
38
+ self.role_cname.constantize
39
+ end
40
+ end
data/roles.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "roles/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "roles"
7
+ s.version = Roles::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["liufengyun"]
10
+ s.email = ["liufengyunchina@gmail.com"]
11
+ s.homepage = "http://github.com/liufengyun/roles"
12
+ s.summary = %q{Roles library with resource scoping}
13
+ s.description = %q{An extremely simple roles library inspired by rolify}
14
+
15
+ s.rubyforge_project = s.name
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
23
+ s.add_development_dependency "activerecord-jdbcsqlite3-adapter"
24
+ else
25
+ s.add_development_dependency "sqlite3"
26
+ end
27
+ s.add_development_dependency "activerecord", ">= 3.1.0"
28
+ s.add_development_dependency "rake"
29
+ s.add_development_dependency "rspec", ">= 2.0"
30
+ s.add_development_dependency "rspec-rails", ">= 2.0"
31
+ s.add_development_dependency "bundler"
32
+ end
metadata ADDED
@@ -0,0 +1,160 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: roles
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - liufengyun
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-17 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sqlite3
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: activerecord
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 3.1.0
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 3.1.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '2.0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '2.0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec-rails
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '2.0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '2.0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: bundler
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ description: An extremely simple roles library inspired by rolify
111
+ email:
112
+ - liufengyunchina@gmail.com
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - .gitignore
118
+ - .travis.yml
119
+ - CHANGELOG.rdoc
120
+ - Gemfile
121
+ - LICENSE
122
+ - README.md
123
+ - Rakefile
124
+ - UPGRADE.rdoc
125
+ - lib/generators/roles/role/role_generator.rb
126
+ - lib/generators/roles/role/templates/README
127
+ - lib/generators/roles/role/templates/README-active_record
128
+ - lib/generators/roles/role/templates/migration.rb
129
+ - lib/generators/roles/role/templates/role-active_record.rb
130
+ - lib/roles.rb
131
+ - lib/roles/railtie.rb
132
+ - lib/roles/resource.rb
133
+ - lib/roles/role.rb
134
+ - lib/roles/version.rb
135
+ - roles.gemspec
136
+ homepage: http://github.com/liufengyun/roles
137
+ licenses: []
138
+ post_install_message:
139
+ rdoc_options: []
140
+ require_paths:
141
+ - lib
142
+ required_ruby_version: !ruby/object:Gem::Requirement
143
+ none: false
144
+ requirements:
145
+ - - ! '>='
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ requirements: []
155
+ rubyforge_project: roles
156
+ rubygems_version: 1.8.24
157
+ signing_key:
158
+ specification_version: 3
159
+ summary: Roles library with resource scoping
160
+ test_files: []