rolypoly 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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