mintdigital-has_roles 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 Krzysztof Zylawy
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/Manifest ADDED
@@ -0,0 +1,18 @@
1
+ generators/has_roles/has_roles_generator.rb
2
+ generators/has_roles/templates/migration.rb
3
+ generators/has_roles/USAGE
4
+ has_roles.gemspec
5
+ install.rb
6
+ lib/has_roles.rb
7
+ lib/role.rb
8
+ lib/role_assignment.rb
9
+ Manifest
10
+ MIT-LICENSE
11
+ rails/init.rb
12
+ Rakefile
13
+ README
14
+ tasks/has_roles_tasks.rake
15
+ test/assertions.rb
16
+ test/has_roles_test.rb
17
+ test/test_helper.rb
18
+ uninstall.rb
data/README ADDED
@@ -0,0 +1,35 @@
1
+ Install
2
+ =======
3
+
4
+ $ gem source -a http://gems.github.com/
5
+ $ sudo gem install mintdigital-has_roles
6
+
7
+ # environment.rb
8
+ config.gem 'mintdigital-has_roles', :lib => 'has_roles'
9
+
10
+ Example
11
+ =======
12
+
13
+ In an ActiveRecord class:
14
+
15
+ has_roles :admin, :moderator
16
+
17
+ Then run:
18
+
19
+ ./script/generate has_roles && rake db:migrate
20
+
21
+ Now your model has these instance methods:
22
+
23
+ add_role(:moderator) #=> true
24
+ remove_role(:admin) #=> true (doesn't have role)
25
+ has_role?(:admin) #=> false
26
+ can_have_role?(:writer) #=> false
27
+
28
+ # These are auto-generated based on your defined roles.
29
+ # They just call has_role?(name)
30
+ admin? #=> false
31
+ moderator? #=> true
32
+
33
+ ---
34
+
35
+ Copyright (c) 2008 Krzysztof Zylawy, released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,31 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+ require 'echoe'
5
+ require File.join(File.dirname(__FILE__), %w[lib/has_roles])
6
+
7
+ Echoe.new('has_roles') do |a|
8
+ a.version = HasRoles::Version::STRING
9
+ a.summary = "Simple roles for ActiveRecord"
10
+ a.author = "Krzysztof Zylawy"
11
+ a.email = "krzysztof@mintdigital.com"
12
+ a.runtime_dependencies = ['activerecord']
13
+ a.development_dependencies = ['echoe']
14
+ a.has_rdoc = false
15
+ a.retain_gemspec = true
16
+ end
17
+
18
+ desc 'Default: Run Tests'
19
+ Rake::TestTask.new do |t|
20
+ t.warning = true
21
+ t.pattern = 'test/**/*_test.rb'
22
+ end
23
+
24
+ desc 'Generate documentation for the has_roles plugin.'
25
+ Rake::RDocTask.new(:rdoc) do |rdoc|
26
+ rdoc.rdoc_dir = 'rdoc'
27
+ rdoc.title = 'HasRoles'
28
+ rdoc.options << '--line-numbers' << '--inline-source'
29
+ rdoc.rdoc_files.include('README')
30
+ rdoc.rdoc_files.include('lib/**/*.rb')
31
+ end
@@ -0,0 +1,7 @@
1
+ Description:
2
+ This generates migrations for roles and role_assignments models
3
+
4
+ Example:
5
+ ./script/generate has_roles && rake db:migrate
6
+
7
+ This will create a migration for the roles and role_assignments tables.
@@ -0,0 +1,10 @@
1
+ class HasRolesGenerator < Rails::Generator::Base
2
+ def manifest
3
+ recorded_session = record do |m|
4
+ unless options[:skip_migration]
5
+ m.migration_template "migration.rb", "db/migrate",
6
+ :migration_file_name => 'create_roles'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,17 @@
1
+ class CreateRoles < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :roles do |t|
4
+ t.string :name
5
+ end
6
+
7
+ create_table :role_assignments do |t|
8
+ t.integer :roleable_id, :role_id
9
+ t.string :roleable_type
10
+ end
11
+ end
12
+
13
+ def self.down
14
+ drop_table :role_assignments
15
+ drop_table :roles
16
+ end
17
+ end
data/has_roles.gemspec ADDED
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{has_roles}
5
+ s.version = "1.0.0"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Krzysztof Zylawy"]
9
+ s.date = %q{2009-02-17}
10
+ s.description = %q{Simple roles for ActiveRecord}
11
+ s.email = %q{krzysztof@mintdigital.com}
12
+ s.extra_rdoc_files = ["lib/has_roles.rb", "lib/role.rb", "lib/role_assignment.rb", "README", "tasks/has_roles_tasks.rake"]
13
+ s.files = ["generators/has_roles/has_roles_generator.rb", "generators/has_roles/templates/migration.rb", "generators/has_roles/USAGE", "has_roles.gemspec", "install.rb", "lib/has_roles.rb", "lib/role.rb", "lib/role_assignment.rb", "Manifest", "MIT-LICENSE", "rails/init.rb", "Rakefile", "README", "tasks/has_roles_tasks.rake", "test/assertions.rb", "test/has_roles_test.rb", "test/test_helper.rb", "uninstall.rb"]
14
+ s.homepage = %q{}
15
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Has_roles", "--main", "README"]
16
+ s.require_paths = ["lib"]
17
+ s.rubyforge_project = %q{has_roles}
18
+ s.rubygems_version = %q{1.3.1}
19
+ s.summary = %q{Simple roles for ActiveRecord}
20
+ s.test_files = ["test/has_roles_test.rb", "test/test_helper.rb"]
21
+
22
+ if s.respond_to? :specification_version then
23
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
24
+ s.specification_version = 2
25
+
26
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
27
+ s.add_runtime_dependency(%q<activerecord>, [">= 0"])
28
+ s.add_development_dependency(%q<echoe>, [">= 0"])
29
+ else
30
+ s.add_dependency(%q<activerecord>, [">= 0"])
31
+ s.add_dependency(%q<echoe>, [">= 0"])
32
+ end
33
+ else
34
+ s.add_dependency(%q<activerecord>, [">= 0"])
35
+ s.add_dependency(%q<echoe>, [">= 0"])
36
+ end
37
+ end
data/install.rb ADDED
@@ -0,0 +1 @@
1
+ # Install hook code here
data/lib/has_roles.rb ADDED
@@ -0,0 +1,64 @@
1
+ module HasRoles
2
+
3
+ module Version
4
+ MAJOR = 1
5
+ MINOR = 0
6
+ TINY = 0
7
+
8
+ STRING = [MAJOR,MINOR,TINY].join('.')
9
+ end
10
+
11
+ def self.included(base)
12
+ base.extend HasMethods
13
+ end
14
+
15
+ module HasMethods
16
+ def has_roles(*roles)
17
+ roles.flatten!
18
+ write_inheritable_attribute(:available_roles, roles)
19
+ class_inheritable_reader :available_roles
20
+
21
+ unless included_modules.include? InstanceMethods
22
+ has_many :role_assignments, :as => :roleable, :dependent => :destroy
23
+ has_many :roles, :through => :role_assignments
24
+
25
+ extend ClassMethods
26
+ include InstanceMethods
27
+ available_roles.each do |role|
28
+ self.class_eval do
29
+ define_method "#{role}?".to_sym do
30
+ has_role?(role)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ module ClassMethods
39
+ end
40
+
41
+ module InstanceMethods
42
+ def can_have_role?(role_name)
43
+ available_roles.include?(role_name)
44
+ end
45
+
46
+ def has_role?(rolename)
47
+ !self.roles.find_by_name(rolename.to_s).nil?
48
+ end
49
+
50
+ def add_role rolename
51
+ return false unless can_have_role?(rolename)
52
+ return true if has_role?(rolename)
53
+ self.roles << Role.find_or_create_by_name(rolename.to_s)
54
+ self.save
55
+ end
56
+
57
+ def remove_role name
58
+ return true if !has_role?(name)
59
+ role_assignment = self.role_assignments.detect { |x| x.role.name == name.to_s }
60
+ role_assignment.destroy if role_assignment
61
+ end
62
+
63
+ end
64
+ end
data/lib/role.rb ADDED
@@ -0,0 +1,6 @@
1
+ class Role < ActiveRecord::Base
2
+ has_many :role_assignments
3
+ has_many :roleables, :through => :role_assignments
4
+
5
+ validates_uniqueness_of :name, :message => "Role with that name already exists"
6
+ end
@@ -0,0 +1,6 @@
1
+ class RoleAssignment < ActiveRecord::Base
2
+ belongs_to :roleable, :polymorphic => true
3
+ belongs_to :role
4
+ validates_uniqueness_of :role_id, :scope => [:roleable_id, :roleable_type]
5
+ validates_presence_of :roleable_id, :roleable_type, :role_id
6
+ end
data/rails/init.rb ADDED
@@ -0,0 +1,4 @@
1
+ require File.join(File.dirname(__FILE__), %w[.. lib has_roles])
2
+
3
+ ActiveRecord::Base.send(:include, HasRoles)
4
+
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :has_roles do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,82 @@
1
+ # Copyright (c) 2005-2009 David Heinemeier Hansson
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.
21
+
22
+ module ActiveSupport
23
+ module Testing
24
+ module Assertions
25
+ # Test numeric difference between the return value of an expression as a result of what is evaluated
26
+ # in the yielded block.
27
+ #
28
+ # assert_difference 'Article.count' do
29
+ # post :create, :article => {...}
30
+ # end
31
+ #
32
+ # An arbitrary expression is passed in and evaluated.
33
+ #
34
+ # assert_difference 'assigns(:article).comments(:reload).size' do
35
+ # post :create, :comment => {...}
36
+ # end
37
+ #
38
+ # An arbitrary positive or negative difference can be specified. The default is +1.
39
+ #
40
+ # assert_difference 'Article.count', -1 do
41
+ # post :delete, :id => ...
42
+ # end
43
+ #
44
+ # An array of expressions can also be passed in and evaluated.
45
+ #
46
+ # assert_difference [ 'Article.count', 'Post.count' ], +2 do
47
+ # post :create, :article => {...}
48
+ # end
49
+ #
50
+ # A error message can be specified.
51
+ #
52
+ # assert_difference 'Article.count', -1, "An Article should be destroyed" do
53
+ # post :delete, :id => ...
54
+ # end
55
+ def assert_difference(expressions, difference = 1, message = nil, &block)
56
+ expression_evaluations = Array(expressions).collect{ |expression| lambda { eval(expression, block.send(:binding)) } }
57
+
58
+ original_values = expression_evaluations.inject([]) { |memo, expression| memo << expression.call }
59
+ yield
60
+ expression_evaluations.each_with_index do |expression, i|
61
+ assert_equal original_values[i] + difference, expression.call, message
62
+ end
63
+ end
64
+
65
+ # Assertion that the numeric result of evaluating an expression is not changed before and after
66
+ # invoking the passed in block.
67
+ #
68
+ # assert_no_difference 'Article.count' do
69
+ # post :create, :article => invalid_attributes
70
+ # end
71
+ #
72
+ # A error message can be specified.
73
+ #
74
+ # assert_no_difference 'Article.count', "An Article should not be destroyed" do
75
+ # post :create, :article => invalid_attributes
76
+ # end
77
+ def assert_no_difference(expressions, message = nil, &block)
78
+ assert_difference expressions, 0, message, &block
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,144 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ class RoleableSample < ActiveRecord::Base
4
+ has_roles [:sample_role_1, :sample_role_2]
5
+ end
6
+
7
+ class AnotherRoleable < ActiveRecord::Base
8
+ has_roles :another1, :another2
9
+ end
10
+
11
+ class HasRolesTest < Test::Unit::TestCase
12
+
13
+ def setup
14
+ @roleable_sample = RoleableSample.create
15
+ end
16
+
17
+ def teardown
18
+ [Role, RoleAssignment, RoleableSample].each {|klass| klass.delete_all }
19
+ end
20
+
21
+ def test_active_record_should_respond_to_has_roles
22
+ assert ActiveRecord::Base.respond_to?(:has_roles)
23
+ end
24
+
25
+ def test_roleable_class_should_return_available_roles
26
+ assert_equal [:sample_role_1, :sample_role_2], RoleableSample.available_roles
27
+ end
28
+
29
+ def test_roleable_object_can_have_its_class_roles
30
+ [:sample_role_1, :sample_role_2].each do |role_name|
31
+ assert_equal(true, @roleable_sample.can_have_role?(role_name))
32
+ end
33
+ end
34
+
35
+ def test_should_be_able_to_add_valid_role_to_roleable
36
+ assert_difference "RoleAssignment.count", 1 do
37
+ assert_difference "Role.count", 1 do
38
+ @roleable_sample.add_role(:sample_role_1)
39
+ end
40
+ end
41
+ end
42
+
43
+ def test_should_return_true_when_role_added
44
+ assert @roleable_sample.add_role(:sample_role_1)
45
+ end
46
+
47
+ def test_should_not_be_able_to_add_invalid_role_to_roleable
48
+ assert_no_difference "RoleAssignment.count", 1 do
49
+ assert_no_difference "Role.count", 1 do
50
+ @roleable_sample.add_role(:invalid_role)
51
+ end
52
+ end
53
+ assert_equal(false, @roleable_sample.has_role?(:invalid_role))
54
+ end
55
+
56
+ def test_should_return_false_when_invalid_role_not_added
57
+ assert !@roleable_sample.add_role(:invalid_role)
58
+ end
59
+
60
+ def test_should_not_add_role_nor_assignment_if_already_has_role
61
+ @roleable_sample.add_role(:sample_role_1)
62
+ assert_no_difference "RoleAssignment.count" do
63
+ assert_no_difference "Role.count" do
64
+ @roleable_sample.add_role(:sample_role_1)
65
+ end
66
+ end
67
+ assert_equal(true, @roleable_sample.has_role?(:sample_role_1))
68
+ end
69
+
70
+ def test_should_return_true_if_already_has_role
71
+ @roleable_sample.add_role(:sample_role_1)
72
+ assert @roleable_sample.has_role?(:sample_role_1), 'Precondition: has role'
73
+ assert @roleable_sample.add_role(:sample_role_1)
74
+ end
75
+
76
+ def test_should_add_assignment_but_not_role_nor_assignment_if_role_exists
77
+ Role.create(:name => 'sample_role_1')
78
+ assert_difference "RoleAssignment.count", 1 do
79
+ assert_no_difference "Role.count" do
80
+ @roleable_sample.add_role(:sample_role_1)
81
+ end
82
+ end
83
+ assert_equal(true, @roleable_sample.has_role?(:sample_role_1))
84
+ end
85
+
86
+ def test_should_have_added_role
87
+ @roleable_sample.add_role(:sample_role_1)
88
+ assert_equal(true, @roleable_sample.has_role?(:sample_role_1))
89
+ end
90
+
91
+ def test_should_not_have_not_added_role
92
+ @roleable_sample.add_role(:sample_role_1)
93
+ assert_equal(false, @roleable_sample.has_role?(:sample_role_2))
94
+ end
95
+
96
+ def test_should_remove_role_assignment
97
+ @roleable_sample.add_role(:sample_role_1)
98
+ assert_difference "RoleAssignment.count", -1 do
99
+ assert_no_difference "Role.count" do
100
+ @roleable_sample.remove_role(:sample_role_1)
101
+ end
102
+ end
103
+ assert_equal(false, @roleable_sample.has_role?(:sample_role_1))
104
+ end
105
+
106
+ def test_should_return_true_when_role_removed
107
+ @roleable_sample.add_role(:sample_role_1)
108
+ assert @roleable_sample.has_role?(:sample_role_1), 'Precondition: has role'
109
+ assert @roleable_sample.remove_role(:sample_role_1)
110
+ end
111
+
112
+ def test_should_not_remove_role_assignment_when_removing_other_role
113
+ @roleable_sample.add_role(:sample_role_1)
114
+ assert_no_difference "RoleAssignment.count" do
115
+ assert_no_difference "Role.count" do
116
+ @roleable_sample.remove_role(:sample_role_2)
117
+ end
118
+ end
119
+ assert_equal(true, @roleable_sample.has_role?(:sample_role_1))
120
+ end
121
+
122
+ def test_should_return_true_when_trying_to_remove_un_had_role
123
+ assert !@roleable_sample.has_role?(:sample_role_1), 'Precondition: does not have role'
124
+ assert @roleable_sample.remove_role(:sample_role_1)
125
+ end
126
+
127
+ def test_should_return_true_when_asking_if_is_existing_role
128
+ @roleable_sample.add_role(:sample_role_1)
129
+ assert_equal(true, @roleable_sample.sample_role_1?)
130
+ end
131
+
132
+ def test_should_return_false_when_asking_if_is_unexisting_role
133
+ @roleable_sample.add_role(:sample_role_1)
134
+ assert_equal(false, @roleable_sample.sample_role_2?)
135
+ end
136
+
137
+ def test_should_raise_exception_when_asking_if_is_invalid_role
138
+ @roleable_sample.add_role(:sample_role_1)
139
+ assert_raise(NoMethodError) {
140
+ @roleable_sample.invalid_role?
141
+ }
142
+ end
143
+
144
+ end
@@ -0,0 +1,24 @@
1
+ require 'test/unit'
2
+ require File.join(File.dirname(__FILE__), 'assertions')
3
+ require File.join(File.dirname(__FILE__), %w[.. init.rb])
4
+
5
+ Test::Unit::TestCase.send :include, ActiveSupport::Testing::Assertions
6
+
7
+ ActiveRecord::Base.establish_connection(
8
+ :adapter => 'sqlite3', :dbfile => ':memory:'
9
+ )
10
+
11
+ ActiveRecord::Schema.define(:version => 1) do
12
+ create_table :roleable_samples do |t|
13
+ end
14
+
15
+ create_table :roles do |t|
16
+ t.string :name
17
+ end
18
+
19
+ create_table :role_assignments do |t|
20
+ t.integer :roleable_id
21
+ t.string :roleable_type
22
+ t.integer :role_id
23
+ end
24
+ end
data/uninstall.rb ADDED
@@ -0,0 +1 @@
1
+ # Uninstall hook code here
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mintdigital-has_roles
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Krzysztof Zylawy
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-02-17 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activerecord
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: echoe
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ description: Simple roles for ActiveRecord
36
+ email: krzysztof@mintdigital.com
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - lib/has_roles.rb
43
+ - lib/role.rb
44
+ - lib/role_assignment.rb
45
+ - README
46
+ - tasks/has_roles_tasks.rake
47
+ files:
48
+ - generators/has_roles/has_roles_generator.rb
49
+ - generators/has_roles/templates/migration.rb
50
+ - generators/has_roles/USAGE
51
+ - has_roles.gemspec
52
+ - install.rb
53
+ - lib/has_roles.rb
54
+ - lib/role.rb
55
+ - lib/role_assignment.rb
56
+ - Manifest
57
+ - MIT-LICENSE
58
+ - rails/init.rb
59
+ - Rakefile
60
+ - README
61
+ - tasks/has_roles_tasks.rake
62
+ - test/assertions.rb
63
+ - test/has_roles_test.rb
64
+ - test/test_helper.rb
65
+ - uninstall.rb
66
+ has_rdoc: false
67
+ homepage: ""
68
+ post_install_message:
69
+ rdoc_options:
70
+ - --line-numbers
71
+ - --inline-source
72
+ - --title
73
+ - Has_roles
74
+ - --main
75
+ - README
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: "0"
83
+ version:
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: "1.2"
89
+ version:
90
+ requirements: []
91
+
92
+ rubyforge_project: has_roles
93
+ rubygems_version: 1.2.0
94
+ signing_key:
95
+ specification_version: 2
96
+ summary: Simple roles for ActiveRecord
97
+ test_files:
98
+ - test/has_roles_test.rb
99
+ - test/test_helper.rb