declarative_authorization 0.5.5 → 0.5.6

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,13 @@
1
+ ** RELEASE 0.5.6 (Sep 23, 2012)
2
+
3
+ * Fix handling of stray object associations [jhawthorn]
4
+
5
+ * Improve test infrastructure [jhawthorn]
6
+
7
+ * Allow decl_auth to be used without ActiveRecord [bterkuile]
8
+
9
+ * Rule reloading in development based on changes [urkle/sb]
10
+
1
11
  ** RELEASE 0.5.5 (Jan 10, 2012)
2
12
 
3
13
  * Update of handling of association proxies for Rails 3.2
data/README.rdoc CHANGED
@@ -242,7 +242,7 @@ the conditions for manual rewrites.
242
242
  == Authorization Rules
243
243
 
244
244
  Authorization rules are defined in config/authorization_rules.rb
245
- (Or redefine rules files path via +Authorization::AUTH_RULE_FILES+). E.g.
245
+ (Or redefine rules files path via +Authorization::AUTH_DSL_FILES+). E.g.
246
246
 
247
247
  authorization do
248
248
  role :admin do
@@ -515,8 +515,10 @@ sbartsch at tzi.org
515
515
 
516
516
  Thanks to John Joseph Bachir, Dennis Blöte, Eike Carls, Damian Caruso, Kai Chen, Erik Dahlstrand,
517
517
  Jeroen van Dijk, Alexander Dobriakov, Sebastian Dyck, Ari Epstein, Jeremy Friesen,
518
- Tim Harper, John Hawthorn, hollownest, Daniel Kristensen, Jeremy Kleindl, Brad Langhorst, Brian Langenfeld,
519
- Georg Ledermann, Geoff Longman, Olly Lylo, Mark Mansour, Thomas Maurer, Tyler Pickett, Edward Rudd, Sharagoz,
518
+ Tim Harper, John Hawthorn, hollownest, Daniel Kristensen, Jeremy Kleindl,
519
+ Benjamin ter Kuile, Brad Langhorst, Brian Langenfeld,
520
+ Georg Ledermann, Geoff Longman, Olly Lylo, Mark Mansour, Thomas Maurer, Kevin Moore,
521
+ Tyler Pickett, Edward Rudd, Sharagoz,
520
522
  TJ Singleton, Mike Vincent, Joel Westerberg
521
523
 
522
524
 
data/Rakefile CHANGED
@@ -2,12 +2,30 @@ require 'rake'
2
2
  require 'rake/testtask'
3
3
  require 'rake/rdoctask'
4
4
 
5
- desc 'Default: run unit tests.'
6
- task :default => :test
5
+ desc 'Default: run unit tests against all versions.'
6
+ task :default => 'bundles:test'
7
+
8
+ def run_for_bundles cmd
9
+ Dir['gemfiles/*.gemfile'].each do |gemfile|
10
+ puts "\n#{gemfile}: #{cmd}"
11
+ ENV['BUNDLE_GEMFILE'] = gemfile
12
+ system(cmd)
13
+ end
14
+ end
15
+
16
+ task 'bundles:install' do
17
+ run_for_bundles 'bundle install'
18
+ end
19
+ task 'bundles:update' do
20
+ run_for_bundles 'bundle update'
21
+ end
22
+ task 'bundles:test' do
23
+ run_for_bundles 'bundle exec rake test'
24
+ end
7
25
 
8
26
  desc 'Test the authorization plugin.'
9
27
  Rake::TestTask.new(:test) do |t|
10
- t.libs << 'lib'
28
+ t.libs << 'lib' << 'test'
11
29
  t.pattern = 'test/**/*_test.rb'
12
30
  t.verbose = true
13
31
  end
@@ -1,8 +1,10 @@
1
1
  require File.join(%w{declarative_authorization rails_legacy})
2
2
  require File.join(%w{declarative_authorization helper})
3
3
  require File.join(%w{declarative_authorization in_controller})
4
- require File.join(%w{declarative_authorization in_model})
5
- require File.join(%w{declarative_authorization obligation_scope})
4
+ if defined?(ActiveRecord)
5
+ require File.join(%w{declarative_authorization in_model})
6
+ require File.join(%w{declarative_authorization obligation_scope})
7
+ end
6
8
 
7
9
  min_rails_version = "2.1.0"
8
10
  if Rails::VERSION::STRING < min_rails_version
@@ -14,4 +16,4 @@ require File.join(%w{declarative_authorization railsengine}) if defined?(::Rails
14
16
  ActionController::Base.send :include, Authorization::AuthorizationInController
15
17
  ActionController::Base.helper Authorization::AuthorizationHelper
16
18
 
17
- ActiveRecord::Base.send :include, Authorization::AuthorizationInModel
19
+ ActiveRecord::Base.send :include, Authorization::AuthorizationInModel if defined?(ActiveRecord)
@@ -164,7 +164,7 @@ module Authorization
164
164
  # Example: permit!( :edit, :object => user.posts )
165
165
  #
166
166
  if Authorization.is_a_association_proxy?(options[:object]) && options[:object].respond_to?(:new)
167
- options[:object] = options[:object].new
167
+ options[:object] = (Rails.version < "3.0" ? options[:object] : options[:object].scoped).new
168
168
  end
169
169
 
170
170
  options[:context] ||= options[:object] && (
@@ -233,6 +233,8 @@ module Authorization
233
233
 
234
234
  permit!(privilege, :skip_attribute_test => true, :user => user, :context => options[:context])
235
235
 
236
+ return [] if roles.is_a?(Array) and not (roles & omnipotent_roles).empty?
237
+
236
238
  attr_validator = AttributeValidator.new(self, user, nil, privilege, options[:context])
237
239
  matching_auth_rules(roles, privileges, options[:context]).collect do |rule|
238
240
  rule.obligations(attr_validator)
@@ -275,12 +277,23 @@ module Authorization
275
277
  def roles_with_hierarchy_for(user)
276
278
  flatten_roles(roles_for(user))
277
279
  end
278
-
280
+
281
+ def self.development_reload?
282
+ if Rails.env.development?
283
+ mod_time = AUTH_DSL_FILES.map { |m| File.mtime(m) rescue Time.at(0) }.flatten.max
284
+ @@auth_dsl_last_modified ||= mod_time
285
+ if mod_time > @@auth_dsl_last_modified
286
+ @@auth_dsl_last_modified = mod_time
287
+ return true
288
+ end
289
+ end
290
+ end
291
+
279
292
  # Returns an instance of Engine, which is created if there isn't one
280
293
  # yet. If +dsl_file+ is given, it is passed on to Engine.new and
281
294
  # a new instance is always created.
282
295
  def self.instance (dsl_file = nil)
283
- if dsl_file
296
+ if dsl_file or development_reload?
284
297
  @@instance = new(dsl_file)
285
298
  else
286
299
  @@instance ||= new
@@ -60,9 +60,10 @@ module Authorization
60
60
  end
61
61
  rescue Errno::ENOENT
62
62
  end
63
- controllers = []
64
- ObjectSpace.each_object(Class) do |obj|
65
- controllers << obj if obj.ancestors.include?(ActionController::Base) and obj != ActionController::Base and obj.name.demodulize != 'ApplicationController'
63
+ controllers = ObjectSpace.each_object(Class).select do |obj|
64
+ obj.ancestors.include?(ActionController::Base) &&
65
+ obj != ActionController::Base &&
66
+ (!obj.name || obj.name.demodulize != 'ApplicationController')
66
67
  end
67
68
 
68
69
  controllers.inject({}) do |memo, controller|
@@ -2,10 +2,10 @@ namespace :auth do
2
2
  desc "Lists all privileges used in controllers, views, models"
3
3
  task :used_privileges do
4
4
  # TODO note where privileges are used
5
- require File.join(RAILS_ROOT, 'config', 'boot.rb')
6
- require File.join(RAILS_ROOT, 'config', 'environment.rb')
5
+ require File.join(Rails.root, 'config', 'boot.rb')
6
+ require File.join(Rails.root, 'config', 'environment.rb')
7
7
  controllers = [ApplicationController]
8
- Dir.new("#{RAILS_ROOT}/app/controllers").entries.each do |controller_file|
8
+ Dir.new("#{Rails.root}/app/controllers").entries.each do |controller_file|
9
9
  if controller_file =~ /_controller/
10
10
  controllers << controller_file.gsub(".rb","").camelize.constantize
11
11
  end
@@ -24,19 +24,19 @@ namespace :auth do
24
24
  all += contr_perms.reject {|cp| cp[0].nil?}.collect {|cp| cp[0..1]}
25
25
  end
26
26
 
27
- model_all = `grep -l "Base\.using_access_control" #{RAILS_ROOT}/config/*.rb #{RAILS_ROOT}/config/initializers/*.rb`.split("\n")
27
+ model_all = `grep -l "Base\.using_access_control" #{Rails.root}/config/*.rb #{Rails.root}/config/initializers/*.rb`.split("\n")
28
28
  if model_all.count > 0
29
- model_files = Dir.glob( "#{RAILS_ROOT}/app/models/*.rb").reject do |item|
29
+ model_files = Dir.glob( "#{Rails.root}/app/models/*.rb").reject do |item|
30
30
  item.match(/_observer\.rb/)
31
31
  end
32
32
  else
33
- model_files = `grep -l "^[[:space:]]*using_access_control" #{RAILS_ROOT}/app/models/*.rb`.split("\n")
33
+ model_files = `grep -l "^[[:space:]]*using_access_control" #{Rails.root}/app/models/*.rb`.split("\n")
34
34
  end
35
35
  models_with_ac = model_files.collect {|mf| mf.sub(/^.*\//, "").sub(".rb", "").tableize.to_sym}
36
36
  model_security_privs = [:create, :read, :update, :delete]
37
37
  models_with_ac.each {|m| perms += model_security_privs.collect{|msp| [msp, m]}}
38
38
 
39
- grep_file_pattern = "#{RAILS_ROOT}/app/models/*.rb #{RAILS_ROOT}/app/views/**/* #{RAILS_ROOT}/app/controllers/*.rb"
39
+ grep_file_pattern = "#{Rails.root}/app/models/*.rb #{Rails.root}/app/views/**/* #{Rails.root}/app/controllers/*.rb"
40
40
  `grep "permitted_to?" #{grep_file_pattern}`.split("\n").each do |ptu|
41
41
  file, grep_match = ptu.split(':', 2)
42
42
  context = privilege = nil
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), 'test_helper.rb')
1
+ require 'test_helper'
2
2
 
3
3
  class AuthorizationTest < Test::Unit::TestCase
4
4
 
@@ -34,7 +34,7 @@ class AuthorizationTest < Test::Unit::TestCase
34
34
  :user => MockUser.new(:test_role))
35
35
  end
36
36
 
37
- def test_permit_elevated_people
37
+ def test_permit_with_has_omnipotence
38
38
  reader = Authorization::Reader::DSLReader.new
39
39
  reader.parse %{
40
40
  authorization do
@@ -121,6 +121,26 @@ class AuthorizationTest < Test::Unit::TestCase
121
121
  :user => MockUser.new(:test_role, :attr => 1))
122
122
  end
123
123
 
124
+ def test_obligations_with_omnipotence
125
+ reader = Authorization::Reader::DSLReader.new
126
+ reader.parse %{
127
+ authorization do
128
+ role :admin do
129
+ has_omnipotence
130
+ end
131
+ role :test_role do
132
+ has_permission_on :permissions, :to => :test do
133
+ if_attribute :attr => is { user.attr }
134
+ end
135
+ end
136
+ end
137
+ }
138
+ engine = Authorization::Engine.new(reader)
139
+ assert_equal [],
140
+ engine.obligations(:test, :context => :permissions,
141
+ :user => MockUser.new(:test_role, :admin, :attr => 1))
142
+ end
143
+
124
144
  def test_obligations_with_anded_conditions
125
145
  reader = Authorization::Reader::DSLReader.new
126
146
  reader.parse %{
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), 'test_helper.rb')
1
+ require 'test_helper'
2
2
 
3
3
  class BasicResource < MockDataObject
4
4
  def self.name
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), 'test_helper.rb')
1
+ require 'test_helper'
2
2
 
3
3
 
4
4
  class LoadMockObject < MockDataObject
@@ -477,4 +477,4 @@ class DeepNameSpacedControllerTest < ActionController::TestCase
477
477
  request!(MockUser.new(:prohibited_role), "update", reader)
478
478
  assert !@controller.authorized?
479
479
  end
480
- end
480
+ end
data/test/database.yml ADDED
@@ -0,0 +1,3 @@
1
+ test:
2
+ adapter: sqlite3
3
+ database: ":memory:"
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), 'test_helper.rb')
1
+ require 'test_helper'
2
2
 
3
3
  class DSLReaderTest < Test::Unit::TestCase
4
4
  def test_privileges
data/test/helper_test.rb CHANGED
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), 'test_helper.rb')
1
+ require 'test_helper'
2
2
  require File.join(File.dirname(__FILE__), %w{.. lib declarative_authorization helper})
3
3
 
4
4
 
@@ -244,4 +244,4 @@ class HelperTest < ActionController::TestCase
244
244
  end
245
245
  assert block_evaled
246
246
  end
247
- end
247
+ end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), 'test_helper.rb')
1
+ require 'test_helper'
2
2
  require File.join(File.dirname(__FILE__), %w{.. lib declarative_authorization maintenance})
3
3
 
4
4
  class MaintenanceTest < Test::Unit::TestCase
@@ -43,4 +43,4 @@ class MaintenanceTest < Test::Unit::TestCase
43
43
  end
44
44
  end
45
45
 
46
- end
46
+ end
data/test/model_test.rb CHANGED
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), 'test_helper.rb')
1
+ require 'test_helper'
2
2
  require File.join(File.dirname(__FILE__), %w{.. lib declarative_authorization in_model})
3
3
 
4
4
  ActiveRecord::Base.send :include, Authorization::AuthorizationInModel
@@ -26,6 +26,8 @@ class TestModel < ActiveRecord::Base
26
26
  :class_name => "TestAttrThrough", :source => :test_attr_throughs,
27
27
  :conditions => "test_attrs.attr = 1"
28
28
 
29
+ attr_accessible :content, :test_attr_through_id, :country_id
30
+
29
31
  # TODO currently not working in Rails 3
30
32
  if Rails.version < "3"
31
33
  has_and_belongs_to_many :test_attr_throughs_habtm, :join_table => :test_attrs,
@@ -73,6 +75,9 @@ class TestAttr < ActiveRecord::Base
73
75
  has_many :test_attr_throughs
74
76
  has_many :test_model_security_model_with_finds
75
77
  attr_reader :role_symbols
78
+ attr_accessible :test_model, :test_another_model, :attr, :branch, :company, :test_attr,
79
+ :test_a_third_model, :n_way_join_item, :n_way_join_item_id, :test_attr_through_id,
80
+ :test_model_id, :test_another_model_id
76
81
  def initialize (*args)
77
82
  @role_symbols = []
78
83
  super(*args)
@@ -86,6 +91,7 @@ end
86
91
  class TestModelSecurityModel < ActiveRecord::Base
87
92
  has_many :test_attrs
88
93
  using_access_control
94
+ attr_accessible :attr, :attr_2, :test_attrs
89
95
  end
90
96
  class TestModelSecurityModelWithFind < ActiveRecord::Base
91
97
  if Rails.version < "3.2"
@@ -97,16 +103,19 @@ class TestModelSecurityModelWithFind < ActiveRecord::Base
97
103
  belongs_to :test_attr
98
104
  using_access_control :include_read => true,
99
105
  :context => :test_model_security_models
106
+ attr_accessible :test_attr, :attr
100
107
  end
101
108
 
102
109
  class Branch < ActiveRecord::Base
103
110
  has_many :test_attrs
104
111
  belongs_to :company
112
+ attr_accessible :name, :company
105
113
  end
106
114
  class Company < ActiveRecord::Base
107
115
  has_many :test_attrs
108
116
  has_many :branches
109
117
  belongs_to :country
118
+ attr_accessible :name, :country, :country_id
110
119
  end
111
120
  class SmallCompany < Company
112
121
  def self.decl_auth_context
@@ -116,6 +125,7 @@ end
116
125
  class Country < ActiveRecord::Base
117
126
  has_many :test_models
118
127
  has_many :companies
128
+ attr_accessible :name
119
129
  end
120
130
 
121
131
  class NamedScopeModelTest < Test::Unit::TestCase
@@ -1791,6 +1801,7 @@ class ModelTest < Test::Unit::TestCase
1791
1801
  test_model = TestModel.create(:content => "content")
1792
1802
  assert engine.permit?(:read, :object => test_model.test_attrs,
1793
1803
  :user => MockUser.new(:test_role))
1804
+ assert test_model.test_attrs.empty?
1794
1805
  assert !engine.permit?(:read, :object => TestAttr.new,
1795
1806
  :user => MockUser.new(:test_role))
1796
1807
  TestModel.delete_all
data/test/test_helper.rb CHANGED
@@ -1,31 +1,24 @@
1
1
  require 'test/unit'
2
2
  require 'pathname'
3
3
 
4
- unless defined?(RAILS_ROOT)
5
- RAILS_ROOT = ENV['RAILS_ROOT'] ?
6
- ENV['RAILS_ROOT'] + "" :
7
- File.join(File.dirname(__FILE__), %w{.. .. .. ..})
4
+ ENV['RAILS_ENV'] = 'test'
5
+
6
+ require 'bundler/setup'
7
+ begin
8
+ # rails 3
9
+ require 'rails/all'
10
+ rescue LoadError
11
+ # rails 2.3
12
+ %w(action_pack action_controller active_record active_support initializer).each {|f| require f}
8
13
  end
14
+ Bundler.require
9
15
 
10
- unless defined?(ActiveRecord)
11
- if File.directory? RAILS_ROOT + '/config'
12
- puts 'Using config/boot.rb'
13
- ENV['RAILS_ENV'] = 'test'
14
- require File.join(RAILS_ROOT, 'config', 'environment.rb')
15
- else
16
- # simply use installed gems if available
17
- version_requirement = ENV['RAILS_VERSION'] ? "= #{ENV['RAILS_VERSION']}" : "> 2.1.0"
18
- puts "Using Rails from RubyGems (#{version_requirement || "default"})"
19
- require 'rubygems'
20
- %w{actionpack activerecord activesupport rails}.each do |gem_name|
21
- gem gem_name, version_requirement
22
- end
23
- end
16
+ # rails 2.3 and ruby 1.9.3 fix
17
+ MissingSourceFile::REGEXPS.push([/^cannot load such file -- (.+)$/i, 1])
24
18
 
25
- unless defined?(Rails) # needs to be explicit in Rails < 3
26
- %w(action_pack action_controller active_record active_support initializer).each {|f| require f}
27
- end
28
- end
19
+ puts "Testing against rails #{Rails::VERSION::STRING}"
20
+
21
+ RAILS_ROOT = File.dirname(__FILE__)
29
22
 
30
23
  DA_ROOT = Pathname.new(File.expand_path("..", File.dirname(__FILE__)))
31
24
 
@@ -114,10 +107,25 @@ class MocksController < ActionController::Base
114
107
  end
115
108
 
116
109
  if Rails.version < "3"
110
+ ActiveRecord::Base.establish_connection({:adapter => 'sqlite3', :database => ':memory:'})
117
111
  ActionController::Routing::Routes.draw do |map|
118
112
  map.connect ':controller/:action/:id'
119
113
  end
120
114
  else
115
+ class TestApp
116
+ class Application < ::Rails::Application
117
+ config.active_support.deprecation = :stderr
118
+ database_path = File.expand_path('../database.yml', __FILE__)
119
+ if Rails.version.start_with? '3.0.'
120
+ config.paths.config.database database_path
121
+ else
122
+ config.paths['config/database'] = database_path
123
+ end
124
+ initialize!
125
+ end
126
+ end
127
+ class ApplicationController < ActionController::Base
128
+ end
121
129
  #Rails::Application.routes.draw do
122
130
  Rails.application.routes.draw do
123
131
  match '/name/spaced_things(/:action)' => 'name/spaced_things'
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: declarative_authorization
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 7
5
+ prerelease:
5
6
  segments:
6
7
  - 0
7
8
  - 5
8
- - 5
9
- version: 0.5.5
9
+ - 6
10
+ version: 0.5.6
10
11
  platform: ruby
11
12
  authors:
12
13
  - Steffen Bartsch
@@ -14,8 +15,7 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2012-01-10 00:00:00 +01:00
18
- default_executable:
18
+ date: 2012-09-23 00:00:00 Z
19
19
  dependencies: []
20
20
 
21
21
  description:
@@ -35,43 +35,43 @@ files:
35
35
  - authorization_rules.dist.rb
36
36
  - garlic_example.rb
37
37
  - init.rb
38
- - app/controllers/authorization_rules_controller.rb
39
38
  - app/controllers/authorization_usages_controller.rb
39
+ - app/controllers/authorization_rules_controller.rb
40
40
  - app/helpers/authorization_rules_helper.rb
41
- - app/views/authorization_usages/index.html.erb
42
- - app/views/authorization_rules/index.html.erb
43
- - app/views/authorization_rules/_show_graph.erb
44
41
  - app/views/authorization_rules/_change.erb
45
- - app/views/authorization_rules/_suggestions.erb
46
- - app/views/authorization_rules/graph.dot.erb
47
42
  - app/views/authorization_rules/change.html.erb
48
43
  - app/views/authorization_rules/graph.html.erb
44
+ - app/views/authorization_rules/_suggestions.erb
45
+ - app/views/authorization_rules/_show_graph.erb
46
+ - app/views/authorization_rules/index.html.erb
47
+ - app/views/authorization_rules/graph.dot.erb
48
+ - app/views/authorization_usages/index.html.erb
49
49
  - config/routes.rb
50
50
  - lib/declarative_authorization.rb
51
+ - lib/declarative_authorization/helper.rb
51
52
  - lib/declarative_authorization/in_controller.rb
52
- - lib/declarative_authorization/reader.rb
53
- - lib/declarative_authorization/rails_legacy.rb
54
53
  - lib/declarative_authorization/obligation_scope.rb
55
54
  - lib/declarative_authorization/railsengine.rb
56
- - lib/declarative_authorization/in_model.rb
57
- - lib/declarative_authorization/helper.rb
58
- - lib/declarative_authorization/development_support/analyzer.rb
59
- - lib/declarative_authorization/development_support/change_analyzer.rb
60
55
  - lib/declarative_authorization/development_support/change_supporter.rb
56
+ - lib/declarative_authorization/development_support/change_analyzer.rb
61
57
  - lib/declarative_authorization/development_support/development_support.rb
58
+ - lib/declarative_authorization/development_support/analyzer.rb
62
59
  - lib/declarative_authorization/authorization.rb
60
+ - lib/declarative_authorization/reader.rb
63
61
  - lib/declarative_authorization/maintenance.rb
62
+ - lib/declarative_authorization/rails_legacy.rb
63
+ - lib/declarative_authorization/in_model.rb
64
64
  - lib/tasks/authorization_tasks.rake
65
- - test/authorization_test.rb
66
- - test/schema.sql
67
- - test/maintenance_test.rb
68
- - test/model_test.rb
69
- - test/controller_test.rb
70
65
  - test/helper_test.rb
71
66
  - test/dsl_reader_test.rb
72
- - test/controller_filter_resource_access_test.rb
67
+ - test/model_test.rb
68
+ - test/controller_test.rb
69
+ - test/schema.sql
73
70
  - test/test_helper.rb
74
- has_rdoc: true
71
+ - test/database.yml
72
+ - test/maintenance_test.rb
73
+ - test/controller_filter_resource_access_test.rb
74
+ - test/authorization_test.rb
75
75
  homepage: http://github.com/stffn/declarative_authorization
76
76
  licenses: []
77
77
 
@@ -81,25 +81,29 @@ rdoc_options: []
81
81
  require_paths:
82
82
  - lib
83
83
  required_ruby_version: !ruby/object:Gem::Requirement
84
+ none: false
84
85
  requirements:
85
86
  - - ">="
86
87
  - !ruby/object:Gem::Version
88
+ hash: 59
87
89
  segments:
88
90
  - 1
89
91
  - 8
90
92
  - 6
91
93
  version: 1.8.6
92
94
  required_rubygems_version: !ruby/object:Gem::Requirement
95
+ none: false
93
96
  requirements:
94
97
  - - ">="
95
98
  - !ruby/object:Gem::Version
99
+ hash: 3
96
100
  segments:
97
101
  - 0
98
102
  version: "0"
99
103
  requirements: []
100
104
 
101
105
  rubyforge_project:
102
- rubygems_version: 1.3.6
106
+ rubygems_version: 1.8.15
103
107
  signing_key:
104
108
  specification_version: 3
105
109
  summary: declarative_authorization is a Rails plugin for maintainable authorization based on readable authorization rules.