rolypoly 0.1.2 → 0.2.0

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,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NmU4ZmFmOTUwZjg3YTliMmZjMGJjZGVjZmJmOGQxYTY2NTk2YmU0ZA==
5
- data.tar.gz: !binary |-
6
- ZjA1MmZkZmJhM2Q2NDAzZTdhNWI0YjQ5NzM3NjI2Y2MwYTQ5MDc4Yw==
2
+ SHA1:
3
+ metadata.gz: 8cbaff5553d1ea031bdb189ab537a9ff7c72aadd
4
+ data.tar.gz: 332873a3a06a886b821e12a0977ae9da8a13a781
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- YjVjNjhiMWJjZmI2MzA2OGQ2YjRhNDVkYmQ2ZTE3ODVkMGFkNDFiNTFhMGIw
10
- NDNiMmJiMjFiZGQwOGM2MjgyOTlkNWJlOGYwNWMwMTlkMTY4NTdhN2YwOTdk
11
- YzJlZjQ5N2RjZjliNjE2M2JhNTVmNGRiMjE1MTUzNmFiMzYyMjM=
12
- data.tar.gz: !binary |-
13
- YTlhNWY1MzhjNDEzZDE5OTFmNWRiNzViZTY0NTM5OGQwNzI4YjIxYzc2NDNi
14
- N2Q4MjFiYTBlNjY2MTNkYWYyZTJlOTlhOGIxZTMwMmJmZDcxNjU3ODY1ZGY0
15
- ZGJjY2FlZDZjMTZmYzcxNTI4YmY4NWVjNGFlZjUzMGZkZWUzYWU=
6
+ metadata.gz: 1e25dbecd6ba8902d65f210a800179c6e63908bd24daf6f77775c314ea22d9e3418abfbffc06c08f496157bcb1b7462faf30d73fef054844481026851496b0d5
7
+ data.tar.gz: f76e7eebd9c64d69e4bc098a2730304dab04922dbe0e3206a77227ca4d0e1b3bc9ac838e8f3e4313393b17d972d3823566b840bbf72fdccb85d6d12c1c6c4f7e
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-1.9.3-p448
1
+ 2.2.0
data/README.md CHANGED
@@ -93,6 +93,49 @@ class ProfilesController < ApplicationController
93
93
  end
94
94
  ```
95
95
 
96
+ # Allow roles with a resource
97
+ `allow_with_resource` acts similarly to `allow` but executes a resource check on the `SomeCustomerRoleObject` to access the endpoint.
98
+
99
+ This requires a method to be defined on `SomeCustomRoleObject` that checks if the resource is valid for that role.
100
+
101
+ The `role_resource` needs to be defined on the controller to pass the resource that the role will be validated against.
102
+ If `role_resource` is not defined it will be defaulted to an empty hash `{}`.
103
+
104
+
105
+ ```ruby
106
+ class SomeCustomRoleObject
107
+ def resource?(resource)
108
+ self.resources.includes?(resource)
109
+ end
110
+ end
111
+
112
+ class ProfilesController < ApplicationController
113
+ allow_with_resource(:admin).to_access(:index)
114
+ allow_with_resource(:owner).to_access(:edit)
115
+ publicize(:show)
116
+
117
+ def index
118
+ current_roles # => [#<SomeCustomRoleObject to_role_string: "admin", resource?: true >]
119
+ end
120
+
121
+ def edit # Raises permission error before entering this
122
+ current_roles # => []
123
+ end
124
+
125
+ def show
126
+ current_roles # => []
127
+ end
128
+
129
+ private def current_user_roles
130
+ current_user.roles # => [#<SomeCustomRoleObject to_role_string: "admin", resource?: true>, #<SomeCustomRoleObject to_role_string: "scorekeeper", resource?: false>]
131
+ end
132
+
133
+ private def role_resource
134
+ { resource: params[:resource_id] }
135
+ end
136
+ end
137
+ ```
138
+
96
139
  ## Contributing
97
140
 
98
141
  1. Fork it
@@ -17,6 +17,10 @@ module Rolypoly
17
17
  unless sub.method_defined? :current_user_roles
18
18
  define_method(:current_user_roles) { [] }
19
19
  end
20
+
21
+ unless sub.method_defined? :role_resource
22
+ define_method(:role_resource) { {} }
23
+ end
20
24
  sub.send :extend, ClassMethods
21
25
  end
22
26
 
@@ -31,8 +35,8 @@ module Rolypoly
31
35
  def current_roles
32
36
  return [] if rolypoly_gatekeepers.empty?
33
37
  current_gatekeepers.reduce([]) { |array, gatekeeper|
34
- if gatekeeper.role? current_user_roles
35
- array += Array(gatekeeper.allowed_roles(current_user_roles, action_name))
38
+ if gatekeeper.role?(current_user_roles, role_resource)
39
+ array += Array(gatekeeper.allowed_roles(current_user_roles, action_name, role_resource))
36
40
  end
37
41
  array
38
42
  }
@@ -52,7 +56,7 @@ module Rolypoly
52
56
  def rolypoly_role_access?
53
57
  rolypoly_gatekeepers.empty? ||
54
58
  rolypoly_gatekeepers.any? { |gatekeeper|
55
- gatekeeper.allow? current_roles, action_name
59
+ gatekeeper.allow?(current_roles, action_name, role_resource)
56
60
  }
57
61
  end
58
62
  private :rolypoly_role_access?
@@ -75,6 +79,10 @@ module Rolypoly
75
79
  build_gatekeeper roles, nil
76
80
  end
77
81
 
82
+ def allow_with_resource(*roles)
83
+ build_gatekeeper roles, nil, true
84
+ end
85
+
78
86
  def publicize(*actions)
79
87
  restrict(*actions).to_none
80
88
  end
@@ -90,8 +98,8 @@ module Rolypoly
90
98
  end
91
99
  end
92
100
 
93
- def build_gatekeeper(roles, actions)
94
- RoleGatekeeper.new(roles, actions).tap { |gatekeeper|
101
+ def build_gatekeeper(roles, actions, require_resource = false)
102
+ RoleGatekeeper.new(roles, actions, require_resource).tap { |gatekeeper|
95
103
  rolypoly_gatekeepers << gatekeeper
96
104
  }
97
105
  end
@@ -2,9 +2,10 @@ require 'set'
2
2
  module Rolypoly
3
3
  class RoleGatekeeper
4
4
  attr_reader :roles
5
- def initialize(roles, actions)
5
+ def initialize(roles, actions, require_resource)
6
6
  self.roles = Set.new Array(roles).map(&:to_s)
7
7
  self.actions = Set.new Array(actions).map(&:to_s)
8
+ self.require_resource = require_resource
8
9
  self.all_actions = false
9
10
  self.public = false
10
11
  end
@@ -31,14 +32,14 @@ module Rolypoly
31
32
  self.all_actions = true
32
33
  end
33
34
 
34
- def allow?(current_roles, action)
35
+ def allow?(current_roles, action, resource)
35
36
  action?(action) &&
36
- role?(current_roles)
37
+ role?(current_roles, resource)
37
38
  end
38
39
 
39
- def allowed_roles(current_roles, action)
40
+ def allowed_roles(current_roles, action, resource)
40
41
  return [] if public? || !action?(action)
41
- match_roles(current_roles)
42
+ match_roles(current_roles, resource)
42
43
  end
43
44
 
44
45
  def all_public
@@ -46,7 +47,8 @@ module Rolypoly
46
47
  self.all_actions = true
47
48
  end
48
49
 
49
- def role?(check_roles)
50
+ def role?(check_roles, resource)
51
+ check_roles = filter_roles_by_resource(check_roles, resource)
50
52
  check_roles = Set.new sanitize_role_input(check_roles)
51
53
  public? || !(check_roles & roles).empty?
52
54
  end
@@ -65,8 +67,10 @@ module Rolypoly
65
67
  attr_accessor :actions
66
68
  attr_accessor :all_actions
67
69
  attr_accessor :public
70
+ attr_accessor :require_resource
68
71
 
69
- def match_roles(check_roles)
72
+ def match_roles(check_roles, resource)
73
+ check_roles = filter_roles_by_resource(check_roles, resource)
70
74
  check_roles.reduce([]) { |array, role_object|
71
75
  array << role_object if roles.include?(sanitize_role_object(role_object))
72
76
  array
@@ -74,6 +78,14 @@ module Rolypoly
74
78
  end
75
79
  private :match_roles
76
80
 
81
+ def filter_roles_by_resource(check_roles, resource)
82
+ return check_roles if check_roles.nil? || !require_resource
83
+ check_roles.select do |check_role|
84
+ check_role.respond_to?(:resource?) && check_role.resource?(resource)
85
+ end
86
+ end
87
+ private :filter_roles_by_resource
88
+
77
89
  def sanitize_role_input(role_objects)
78
90
  Array(role_objects).map { |r| sanitize_role_object(r) }
79
91
  end
@@ -1,3 +1,3 @@
1
1
  module Rolypoly
2
- VERSION = "0.1.2"
2
+ VERSION = "0.2.0"
3
3
  end
data/rolypoly.gemspec CHANGED
@@ -6,8 +6,8 @@ require 'rolypoly/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "rolypoly"
8
8
  spec.version = Rolypoly::VERSION
9
- spec.authors = ["Jon Phenow"]
10
- spec.email = ["j.phenow@gmail.com"]
9
+ spec.authors = ["Jon Phenow", "Jake Waletzko"]
10
+ spec.email = ["j.phenow@gmail.com", "jnwaletzko@gmail.com"]
11
11
  spec.description = %q{Tools for handling per-action and per-app Role authorization}
12
12
  spec.summary = %q{Tools for handling per-action and per-app Role authorization}
13
13
  spec.homepage = "https://github.com/sportngin/rolypoly"
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.3"
21
+ spec.add_development_dependency "bundler", "~> 1.8"
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "rspec"
24
24
  end
@@ -15,6 +15,7 @@ module Rolypoly
15
15
  subject { example_controller }
16
16
  it { should respond_to :restrict }
17
17
  it { should respond_to :allow }
18
+ it { should respond_to :allow_with_resource }
18
19
 
19
20
  describe "setting up with DSL" do
20
21
  describe "from allow side" do
@@ -23,14 +24,15 @@ module Rolypoly
23
24
  before do
24
25
  subject.allow(:admin).to_access(:index)
25
26
  subject.publicize(:landing)
26
- controller_instance.stub current_user_roles: current_user_roles, action_name: action_name
27
+ allow(controller_instance).to receive(:current_user_roles).and_return(current_user_roles)
28
+ allow(controller_instance).to receive(:action_name).and_return(action_name)
27
29
  end
28
30
 
29
31
  describe "#index" do
30
32
  let(:action_name) { "index" }
31
33
 
32
34
  it "is not public" do
33
- controller_instance.should_not be_public
35
+ expect(controller_instance).to_not be_public
34
36
  end
35
37
 
36
38
  it "allows admin access" do
@@ -39,7 +41,7 @@ module Rolypoly
39
41
  end
40
42
 
41
43
  it "can get current_roles from controller" do
42
- controller_instance.current_roles.should == [RoleObject.new(:admin)]
44
+ expect(controller_instance.current_roles).to eq([RoleObject.new(:admin)])
43
45
  end
44
46
  end
45
47
 
@@ -51,7 +53,7 @@ module Rolypoly
51
53
  end
52
54
 
53
55
  it "is not public" do
54
- controller_instance.should_not be_public
56
+ expect(controller_instance).to_not be_public
55
57
  end
56
58
  end
57
59
 
@@ -70,11 +72,57 @@ module Rolypoly
70
72
  end
71
73
 
72
74
  it "is public" do
73
- controller_instance.should be_public
75
+ expect(controller_instance).to be_public
74
76
  end
75
77
  end
76
78
  end
77
79
  end
80
+
81
+ describe "from allow_with_resource side" do
82
+ let(:controller_instance) { subject.new }
83
+ let(:admin_role) { RoleObject.new(:admin) }
84
+ let(:scorekeeper_role) { RoleObject.new(:scorekeeper) }
85
+ let(:current_user_roles) { [admin_role, scorekeeper_role] }
86
+ let(:role_resource) { {resource: 123} }
87
+ let(:check_access!) { controller_instance.rolypoly_check_role_access! }
88
+
89
+ before do
90
+ subject.allow_with_resource(:admin).to_access(:index)
91
+ subject.publicize(:landing)
92
+ allow(admin_role).to receive(:resource?).and_return true
93
+ allow(controller_instance).to receive(:current_user_roles).and_return(current_user_roles)
94
+ allow(controller_instance).to receive(:action_name).and_return(action_name)
95
+ allow(controller_instance).to receive(:role_resource).and_return(role_resource)
96
+ end
97
+
98
+ describe "#index" do
99
+ let(:action_name) { "index" }
100
+
101
+ it { expect(controller_instance).to_not be_public }
102
+ it { expect{ check_access! }.not_to raise_error }
103
+ it { expect(controller_instance.current_roles).to eq([RoleObject.new(:admin)])}
104
+ end
105
+
106
+ describe "#show" do
107
+ let(:action_name) { "show" }
108
+
109
+ it { expect{ check_access! }.to raise_error(Rolypoly::FailedRoleCheckError)}
110
+ it { expect(controller_instance).to_not be_public }
111
+ end
112
+
113
+ describe "#landing" do
114
+ let(:action_name) { "landing" }
115
+
116
+ it { expect{ check_access! }.not_to raise_error }
117
+
118
+ describe "with no role" do
119
+ let(:current_roles) { [] }
120
+
121
+ it { expect { check_access! }.not_to raise_error }
122
+ it { expect(controller_instance).to be_public }
123
+ end
124
+ end
125
+ end
78
126
  end
79
127
  end
80
128
  end
@@ -4,102 +4,144 @@ module Rolypoly
4
4
  describe RoleGatekeeper do
5
5
  let(:roles) { %w[admin scorekeeper] }
6
6
  let(:actions) { %w[index show] }
7
+ let(:resource) { {} }
7
8
 
8
- subject { described_class.new roles, actions }
9
+ context "resource not required" do
10
+ subject { described_class.new roles, actions, false }
9
11
 
10
- shared_examples_for "allow should behave correctly" do
11
- it "shouldn't auto-allow" do
12
- subject.allow?(nil, nil).should be_false
13
- end
14
-
15
- it "should allow scorekeepr access to index" do
16
- subject.allow?([:scorekeeper], "index").should be_true
17
- end
18
-
19
- it "should not allow scorekeepr access to edit" do
20
- subject.allow?([:scorekeeper], "edit").should be_false
21
- end
22
-
23
- describe "all public" do
24
- before do
25
- subject.all_public
26
- end
27
-
28
- it "should allow whatever" do
29
- subject.allow?(nil, nil).should be_true
12
+ shared_examples_for "allow should behave correctly" do
13
+ it "shouldn't auto-allow" do
14
+ expect(subject.allow?(nil, nil, resource)).to be false
30
15
  end
31
16
 
32
17
  it "should allow scorekeepr access to index" do
33
- subject.allow?([:scorekeeper], "index").should be_true
18
+ expect(subject.allow?([:scorekeeper], "index", resource)).to be true
34
19
  end
35
20
 
36
- it "should allow scorekeepr access to edit" do
37
- subject.allow?([:scorekeeper], "edit").should be_true
21
+ it "should not allow scorekeepr access to edit" do
22
+ expect(subject.allow?([:scorekeeper], "edit", resource)).to be false
38
23
  end
39
- end
40
24
 
41
- describe "all roles" do
42
- before do
43
- subject.to_none
44
- end
25
+ describe "all public" do
26
+ before do
27
+ subject.all_public
28
+ end
45
29
 
46
- it "shouldn't auto-allow" do
47
- subject.allow?(nil, nil).should be_false
30
+ it "should allow whatever" do
31
+ expect(subject.allow?(nil, nil, resource)).to be true
32
+ end
33
+
34
+ it "should allow scorekeepr access to index" do
35
+ expect(subject.allow?([:scorekeeper], "index", resource)).to be true
36
+ end
37
+
38
+ it "should allow scorekeepr access to edit" do
39
+ expect(subject.allow?([:scorekeeper], "edit", resource)).to be true
40
+ end
48
41
  end
49
42
 
50
- it "should allow scorekeepr access to index" do
51
- subject.allow?([:janitor], "index").should be_true
52
- subject.allow?([:admin], "index").should be_true
43
+ describe "all roles" do
44
+ before do
45
+ subject.to_none
46
+ end
47
+
48
+ it "shouldn't auto-allow" do
49
+ expect(subject.allow?(nil, nil, resource)).to be false
50
+ end
51
+
52
+ it "should allow scorekeepr access to index" do
53
+ expect(subject.allow?([:janitor], "index", resource)).to be true
54
+ expect(subject.allow?([:admin], "index", resource)).to be true
55
+ end
56
+
57
+ it "to should not allow scorekeepr access to edit" do
58
+ expect(subject.allow?([:scorekeeper], "edit", resource)).to be false
59
+ expect(subject.allow?([:janitor], "edit", resource)).to be false
60
+ end
53
61
  end
54
62
 
55
- it "should not allow scorekeepr access to edit" do
56
- subject.allow?([:scorekeeper], "edit").should be_false
57
- subject.allow?([:janitor], "edit").should be_false
63
+ describe "all actions" do
64
+ before do
65
+ subject.to_all
66
+ end
67
+
68
+ it "shouldn't auto-allow" do
69
+ expect(subject.allow?(nil, nil, resource)).to be false
70
+ end
71
+
72
+ it "should allow scorekeepr access to index" do
73
+ expect(subject.allow?([:scorekeeper], "index", resource)).to be true
74
+ end
75
+
76
+ it "shouldn't allow janitor access to any" do
77
+ expect(subject.allow?([:janitor], "index", resource)).to be false
78
+ end
79
+
80
+ it "should allow scorekeepr access to edit" do
81
+ expect(subject.allow?([:scorekeeper], "edit", resource)).to be true
82
+ end
58
83
  end
59
84
  end
85
+ it_should_behave_like "allow should behave correctly"
86
+
87
+ describe "with only roles set" do
88
+ let(:actions) { [] }
60
89
 
61
- describe "all actions" do
62
90
  before do
63
- subject.to_all
91
+ subject.to_access(:index, :show)
64
92
  end
65
93
 
66
- it "shouldn't auto-allow" do
67
- subject.allow?(nil, nil).should be_false
68
- end
94
+ it_should_behave_like "allow should behave correctly"
95
+ end
69
96
 
70
- it "should allow scorekeepr access to index" do
71
- subject.allow?([:scorekeeper], "index").should be_true
72
- end
97
+ describe "with only actions set" do
98
+ let(:roles) { [] }
73
99
 
74
- it "shouldn't allow janitor access to any" do
75
- subject.allow?([:janitor], "index").should be_false
100
+ before do
101
+ subject.to(:admin, :scorekeeper)
76
102
  end
77
103
 
78
- it "should allow scorekeepr access to edit" do
79
- subject.allow?([:scorekeeper], "edit").should be_true
104
+ it_should_behave_like "allow should behave correctly"
105
+ end
106
+
107
+ describe "with resource defined" do
108
+ let(:resource) { [organization: 123] }
109
+
110
+ before do
111
+ subject.to(:admin, :scorekeeper)
80
112
  end
113
+
114
+ it_should_behave_like "allow should behave correctly"
81
115
  end
82
116
  end
83
- it_should_behave_like "allow should behave correctly"
84
117
 
85
- describe "with only roles set" do
86
- let(:actions) { [] }
118
+ context "resource required" do
119
+ let(:scorekeeper_role) { RoleObject.new(:scorekeeper) }
120
+
121
+ subject { described_class.new roles, actions, true }
122
+
123
+ describe "resource does not match" do
124
+ before do
125
+ allow(scorekeeper_role).to receive(:resource?).and_return false
126
+ allow(scorekeeper_role).to receive(:to_role_string).and_return "scorekeeper"
127
+ end
87
128
 
88
- before do
89
- subject.to_access(:index, :show)
129
+ it { expect(subject.allow?(nil, nil, resource)).to be false }
130
+ it { expect(subject.allow?([scorekeeper_role], "index", resource)).to be false }
131
+ it { expect(subject.allow?([scorekeeper_role], "edit", resource)).to be false }
90
132
  end
91
133
 
92
- it_should_behave_like "allow should behave correctly"
93
- end
134
+ describe "resource matches" do
135
+ let(:resource) { {resource: 123} }
94
136
 
95
- describe "with only actions set" do
96
- let(:roles) { [] }
137
+ before do
138
+ allow(scorekeeper_role).to receive(:resource?).and_return true
139
+ end
97
140
 
98
- before do
99
- subject.to(:admin, :scorekeeper)
141
+ it { expect(subject.allow?(nil, nil, resource)).to be false }
142
+ it { expect(subject.allow?([scorekeeper_role], "index", resource)).to be true }
143
+ it { expect(subject.allow?([scorekeeper_role], "edit", resource)).to be false }
100
144
  end
101
-
102
- it_should_behave_like "allow should behave correctly"
103
145
  end
104
146
  end
105
147
  end
data/spec/spec_helper.rb CHANGED
@@ -6,7 +6,6 @@
6
6
  # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
7
  require 'rolypoly'
8
8
  RSpec.configure do |config|
9
- config.treat_symbols_as_metadata_keys_with_true_values = true
10
9
  config.run_all_when_everything_filtered = true
11
10
  config.filter_run :focus
12
11
 
metadata CHANGED
@@ -1,68 +1,70 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rolypoly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Phenow
8
+ - Jake Waletzko
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-12-02 00:00:00.000000000 Z
12
+ date: 2016-12-09 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: bundler
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
- - - ~>
18
+ - - "~>"
18
19
  - !ruby/object:Gem::Version
19
- version: '1.3'
20
+ version: '1.8'
20
21
  type: :development
21
22
  prerelease: false
22
23
  version_requirements: !ruby/object:Gem::Requirement
23
24
  requirements:
24
- - - ~>
25
+ - - "~>"
25
26
  - !ruby/object:Gem::Version
26
- version: '1.3'
27
+ version: '1.8'
27
28
  - !ruby/object:Gem::Dependency
28
29
  name: rake
29
30
  requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
31
- - - ! '>='
32
+ - - ">="
32
33
  - !ruby/object:Gem::Version
33
34
  version: '0'
34
35
  type: :development
35
36
  prerelease: false
36
37
  version_requirements: !ruby/object:Gem::Requirement
37
38
  requirements:
38
- - - ! '>='
39
+ - - ">="
39
40
  - !ruby/object:Gem::Version
40
41
  version: '0'
41
42
  - !ruby/object:Gem::Dependency
42
43
  name: rspec
43
44
  requirement: !ruby/object:Gem::Requirement
44
45
  requirements:
45
- - - ! '>='
46
+ - - ">="
46
47
  - !ruby/object:Gem::Version
47
48
  version: '0'
48
49
  type: :development
49
50
  prerelease: false
50
51
  version_requirements: !ruby/object:Gem::Requirement
51
52
  requirements:
52
- - - ! '>='
53
+ - - ">="
53
54
  - !ruby/object:Gem::Version
54
55
  version: '0'
55
56
  description: Tools for handling per-action and per-app Role authorization
56
57
  email:
57
58
  - j.phenow@gmail.com
59
+ - jnwaletzko@gmail.com
58
60
  executables: []
59
61
  extensions: []
60
62
  extra_rdoc_files: []
61
63
  files:
62
- - .gitignore
63
- - .rspec
64
- - .ruby-gemset
65
- - .ruby-version
64
+ - ".gitignore"
65
+ - ".rspec"
66
+ - ".ruby-gemset"
67
+ - ".ruby-version"
66
68
  - Gemfile
67
69
  - LICENSE.txt
68
70
  - README.md
@@ -85,17 +87,17 @@ require_paths:
85
87
  - lib
86
88
  required_ruby_version: !ruby/object:Gem::Requirement
87
89
  requirements:
88
- - - ! '>='
90
+ - - ">="
89
91
  - !ruby/object:Gem::Version
90
92
  version: '0'
91
93
  required_rubygems_version: !ruby/object:Gem::Requirement
92
94
  requirements:
93
- - - ! '>='
95
+ - - ">="
94
96
  - !ruby/object:Gem::Version
95
97
  version: '0'
96
98
  requirements: []
97
99
  rubyforge_project:
98
- rubygems_version: 2.1.11
100
+ rubygems_version: 2.4.8
99
101
  signing_key:
100
102
  specification_version: 4
101
103
  summary: Tools for handling per-action and per-app Role authorization