ii_policy 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f4b0ae3047d7ec960796e3bc2cb0fec29584717eb19e23035337121b17b0f66e
4
+ data.tar.gz: 2d0e5696b4a5888f062ae7b9240eff50f7d94e5ee0f4bf49c461c037e4006619
5
+ SHA512:
6
+ metadata.gz: caec6ed0fba367ae7f425afc1c427acef1ec1260e5e0b5057f106a95f237a65d598daadd75156875a4f282d7a606c0616fb7caeccc25b8147e4edc9f7e08adde
7
+ data.tar.gz: a49b1a52334ce402ea35a11055a76823713564d84b9d6105e42ec931973acf67dd15d6a85f0e3c98c8d06631ac1369323b8b862883000300d275fef062fb33bf
@@ -0,0 +1,42 @@
1
+ name: CI
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ test:
7
+ runs-on: ubuntu-18.04
8
+ strategy:
9
+ fail-fast: false
10
+ matrix:
11
+ ruby: [2.3, 2.4, 2.5, 2.6, 2.7, 3.0]
12
+ gemfile: ['rails50', 'rails51', 'rails52', 'rails60', 'rails61']
13
+ exclude:
14
+ - ruby: 2.3
15
+ gemfile: rails60
16
+ - ruby: 2.3
17
+ gemfile: rails61
18
+ - ruby: 2.4
19
+ gemfile: rails60
20
+ - ruby: 2.4
21
+ gemfile: rails61
22
+ - ruby: 3.0
23
+ gemfile: rails50
24
+ - ruby: 3.0
25
+ gemfile: rails51
26
+ - ruby: 3.0
27
+ gemfile: rails52
28
+
29
+ name: ruby ${{ matrix.ruby }}, ${{ matrix.gemfile }}
30
+
31
+ env:
32
+ BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}.gemfile
33
+
34
+ steps:
35
+ - uses: actions/checkout@v2
36
+ - uses: ruby/setup-ruby@v1
37
+ with:
38
+ ruby-version: ${{ matrix.ruby }}
39
+ bundler-cache: true
40
+ - name: Run test
41
+ run: |
42
+ bundle exec rspec
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ .bundle/
2
+ .project
3
+ Gemfile.lock
4
+ coverage/
5
+ gemfiles/*.lock
6
+ pkg/
7
+ tmp/
8
+ spec/dummy/db/*.sqlite3
9
+ spec/dummy/db/schema_*.rb
10
+ spec/dummy/log/*.log
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # CHANGELOG
2
+
3
+ ## 1.0.0
4
+
5
+ * First release.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2021 Yoshikazu Kaneta
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,259 @@
1
+ # IIPolicy
2
+
3
+ A base policy to support management of authorization logic.
4
+
5
+ This gem is inspired by [pundit](https://github.com/varvet/pundit) specs.
6
+
7
+ ## Dependencies
8
+
9
+ * ruby 2.3+
10
+ * activesupport 5.0+
11
+
12
+ ## Installation
13
+
14
+ Add this line to your application's Gemfile:
15
+
16
+ ```ruby
17
+ gem 'ii_policy'
18
+ ```
19
+
20
+ Then execute:
21
+
22
+ $ bundle
23
+
24
+ ## Usage
25
+
26
+ Prepare model:
27
+
28
+ ```ruby
29
+ class Item < ActiveRecord::Base
30
+ end
31
+ ```
32
+
33
+ Prepare controller with `current_user` and call `authorize`:
34
+
35
+ ```ruby
36
+ class ItemsController < ActionController::Base
37
+ def index
38
+ @policy = authorize(ItemPolicy)
39
+ @items = Item.all
40
+ end
41
+
42
+ def show
43
+ @item = Item.find(params[:id])
44
+ @policy = authorize(@item)
45
+ end
46
+
47
+ def current_user
48
+ User.find(session[:login_user_id])
49
+ end
50
+ end
51
+ ```
52
+
53
+ Create policy that has methods corresponding with actions of controller:
54
+
55
+ ```ruby
56
+ class ItemPolicy < IIPolicy::Base
57
+ def index?
58
+ @user.admin?
59
+ end
60
+
61
+ def show?
62
+ @user.admin? && @item.status != 'deleted'
63
+ end
64
+ end
65
+ ```
66
+
67
+ ### Controller
68
+
69
+ `authorize` lookups policy and calls it's method corresponding with current action.
70
+ `authorize` takes following arguments:
71
+
72
+ ```ruby
73
+ # no argument (policy class is looked up using the name of controller class)
74
+ authorize
75
+
76
+ # instance (policy class is looked up using the name of instance's class)
77
+ authorize(@item)
78
+
79
+ # policy class
80
+ authorize(ItemPolicy)
81
+
82
+ # with extra context as second argument
83
+ authorize(@item, something: 'something')
84
+ ```
85
+
86
+ Context is set to `{ user: current_user }` in the controller by default.
87
+ You can set other context you want by overriding `policy_context`:
88
+
89
+ ```ruby
90
+ class ItemsController < ActionController::Base
91
+ def policy_context
92
+ super.merge(something: 'something')
93
+ end
94
+ end
95
+ ```
96
+
97
+ When current user is not authoized, `IIPolicy::AuthorizationError` is raised.
98
+ You can catch the error and render a special page using `rescue_from`:
99
+
100
+ ```ruby
101
+ class ItemsController < ActionController::Base
102
+ rescue_from IIPolicy::AuthorizationError, with: -> { ... }
103
+ end
104
+ ```
105
+
106
+ You can also create policy instance by yourself and check authorization using `allowed` method as follows:
107
+
108
+ ```ruby
109
+ # policy class
110
+ policy(ItemPolicy).allowed(:index?)
111
+
112
+ # instance
113
+ policy(@item).allowed(:index?)
114
+ ```
115
+
116
+ ### Policy
117
+
118
+ Policy has following attributes:
119
+
120
+ ```ruby
121
+ class ItemPolicy < IIPolicy::Base
122
+ def index?
123
+ puts "user: #{@user}"
124
+ puts "item: #{@item}"
125
+ puts "context: #{@context}"
126
+ end
127
+ end
128
+
129
+ policy = ItemPolicy.new(user: User.find(1), item: Item.find(1), something: 'something')
130
+ policy.allowed(:index?)
131
+ #=> user: #<User: ...>
132
+ # item: #<Item: ...>
133
+ # context: #<IIPolicy::Context user=..., item=..., something="something">
134
+ ```
135
+
136
+ You can call another policy method in the same context:
137
+
138
+ ```ruby
139
+ class ItemPolicy < IIPolicy::Base
140
+ def another_show?
141
+ allowed(:show?)
142
+ end
143
+ end
144
+ ```
145
+
146
+ You can use policy for another instance by using `policy`:
147
+
148
+ ```ruby
149
+ class ItemPolicy < IIPolicy::Base
150
+ def another_show?
151
+ policy(@context.another_item).allowed(:show?)
152
+ end
153
+ end
154
+ ```
155
+
156
+ #### Callbacks
157
+
158
+ Following callbacks are available:
159
+
160
+ * `before_call`
161
+ * `around_call`
162
+ * `after_call`
163
+
164
+ For example:
165
+
166
+ ```ruby
167
+ class ItemPolicy < IIPolicy::Base
168
+ before_call do
169
+ @something = @context.something
170
+ end
171
+
172
+ def index?
173
+ @something == 'something'
174
+ end
175
+ end
176
+ ```
177
+
178
+ #### Policy chain
179
+
180
+ You can chain shared policies to base policy by including `IIPolicy::Chain` as follows:
181
+
182
+ ```ruby
183
+ # shared policy
184
+ class SharedPolicy < IIPolicy::Base
185
+ def show?
186
+ @user.admin?
187
+ end
188
+ end
189
+
190
+ # base policy
191
+ class ItemPolicy < IIPolicy::Base
192
+ include IIPolicy::Chain
193
+
194
+ chain SharedPolicy
195
+
196
+ def show?
197
+ @item.status != 'deleted'
198
+ end
199
+ end
200
+
201
+ policy = ItemPolicy.new(user: User.find(1), item: Item.find(1))
202
+ policy.allowed(:show?)
203
+ #=> true
204
+ ```
205
+
206
+ In this example, `policy.allowed(:show?)` is evaluated by `SharedPolicy#show? && ItemPolicy#show?`.
207
+
208
+ ### Lookup for policy
209
+
210
+ `authorize` and `policy` lookups policy class if the first argument of them is not a policy class.
211
+ So the name of policy class should be composed of the base name of model or controller.
212
+ For example:
213
+
214
+ ```ruby
215
+ class ItemPolicy < IIPolicy::Base
216
+ end
217
+
218
+ class Item
219
+ end
220
+
221
+ class ItemsController < ActionController::Base
222
+ end
223
+
224
+ IIPolicy::Base.lookup(Item)
225
+ #=> ItemPolicy
226
+
227
+ IIPolicy::Base.lookup(Item.new)
228
+ #=> ItemPolicy
229
+
230
+ IIPolicy::Base.lookup(ItemsController)
231
+ #=> ItemPolicy
232
+ ```
233
+
234
+ Note that superclass of model or controller is also looked up until policy is found.
235
+
236
+ ```ruby
237
+ class ItemPolicy < IIPolicy::Base
238
+ end
239
+
240
+ class Item
241
+ end
242
+
243
+ class InheritedItem < Item
244
+ end
245
+
246
+ IIPolicy::Base.lookup(InheritedItem)
247
+ #=> ItemPolicy
248
+
249
+ IIPolicy::Base.lookup(InheritedItem.new)
250
+ #=> ItemPolicy
251
+ ```
252
+
253
+ ## Contributing
254
+
255
+ Bug reports and pull requests are welcome at https://github.com/kanety/ii_policy.
256
+
257
+ ## License
258
+
259
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "ii_policy"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ # require "irb"
14
+ # IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "rails", "~> 5.0.0"
4
+ gem "sqlite3", "~> 1.3.6"
5
+
6
+ gemspec path: "../"
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "rails", "~> 5.1.0"
4
+ gem "sqlite3", "~> 1.3.6"
5
+
6
+ gemspec path: "../"
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "rails", "~> 5.2.0"
4
+ gem "sqlite3", "~> 1.3.6"
5
+
6
+ gemspec path: "../"
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "rails", "~> 6.0.0"
4
+
5
+ gemspec path: "../"
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "rails", "~> 6.1.0"
4
+
5
+ gemspec path: "../"
data/ii_policy.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'ii_policy/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "ii_policy"
8
+ spec.version = IIPolicy::VERSION
9
+ spec.authors = ["Yoshikazu Kaneta"]
10
+ spec.email = ["kaneta@sitebridge.co.jp"]
11
+ spec.summary = %q{A base policy to support management of authorization logic}
12
+ spec.description = %q{A base policy to support management of authorization logic}
13
+ spec.homepage = "https://github.com/kanety/ii_policy"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
+ spec.bindir = "exe"
17
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency "activesupport", ">= 5.0"
21
+
22
+ spec.add_development_dependency "rails", ">= 5.0"
23
+ spec.add_development_dependency "sqlite3"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec-rails"
26
+ spec.add_development_dependency "simplecov"
27
+ end
data/lib/ii_policy.rb ADDED
@@ -0,0 +1,21 @@
1
+ require 'active_support'
2
+
3
+ require 'ii_policy/version'
4
+ require 'ii_policy/config'
5
+ require 'ii_policy/errors'
6
+ require 'ii_policy/base'
7
+ require 'ii_policy/controller'
8
+ require 'ii_policy/helper'
9
+ require 'ii_policy/railtie' if defined?(Rails)
10
+
11
+ module IIPolicy
12
+ class << self
13
+ def configure
14
+ yield Config
15
+ end
16
+
17
+ def config
18
+ Config
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'context'
4
+ require_relative 'callbacks'
5
+ require_relative 'lookup'
6
+ require_relative 'chain'
7
+
8
+ module IIPolicy
9
+ class Base
10
+ include Callbacks
11
+ include Lookup
12
+
13
+ attr_reader :context, :user, :item
14
+
15
+ def initialize(context = {})
16
+ @context = if context.is_a?(IIPolicy::Context)
17
+ context
18
+ else
19
+ IIPolicy::Context.new(context)
20
+ end
21
+ @item = @context.item
22
+ @user = @context.user
23
+ end
24
+
25
+ def call(action)
26
+ run_callbacks(:call) do
27
+ return false if respond_to?(action) && !send(action)
28
+ end
29
+ return true
30
+ end
31
+
32
+ def allowed(action)
33
+ call(action)
34
+ end
35
+
36
+ def policy(item)
37
+ context = @context.dup
38
+ context.item = item
39
+ self.class.lookup(item).new(context)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IIPolicy
4
+ module Callbacks
5
+ extend ActiveSupport::Concern
6
+ include ActiveSupport::Callbacks
7
+
8
+ included do
9
+ define_callbacks :call
10
+ end
11
+
12
+ class_methods do
13
+ def before_call(*args, &block)
14
+ set_callback(:call, :before, *args, &block)
15
+ end
16
+
17
+ def after_call(*args, &block)
18
+ set_callback(:call, :after, *args, &block)
19
+ end
20
+
21
+ def around_call(*args, &block)
22
+ set_callback(:call, :around, *args, &block)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IIPolicy
4
+ module Chain
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ class_attribute :_chains
9
+ self._chains = []
10
+ end
11
+
12
+ def call(action)
13
+ self.class._chains.each do |policy|
14
+ return false unless policy.new(@context).call(action)
15
+ end
16
+ super
17
+ end
18
+
19
+ class_methods do
20
+ def chain(*policies)
21
+ self._chains = _chains + policies
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IIPolicy
4
+ class Config
5
+ class_attribute :data
6
+
7
+ self.data = {
8
+ lookup_cache: true
9
+ }
10
+
11
+ data.keys.each do |key|
12
+ define_singleton_method "#{key}" do
13
+ data[key]
14
+ end
15
+
16
+ define_singleton_method "#{key}=" do |val|
17
+ data[key] = val
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IIPolicy
4
+ class Context < OpenStruct
5
+ end
6
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IIPolicy
4
+ module Controller
5
+ extend ActiveSupport::Concern
6
+
7
+ def policy_context
8
+ { user: current_user }
9
+ end
10
+
11
+ def policy(item, context = {})
12
+ if item.is_a?(Class) && item < IIPolicy::Base
13
+ item.new(policy_context.merge(context))
14
+ else
15
+ klass = IIPolicy::Base.lookup(item)
16
+ raise IIPolicy::Error.new("could not find policy for #{item}") unless klass
17
+ klass.new(policy_context.merge(context.merge(item: item)))
18
+ end
19
+ end
20
+
21
+ def authorize(item, context = {})
22
+ instance = policy(item, context)
23
+ raise IIPolicy::AuthorizationError.new('Not Authorized') unless instance.call("#{action_name}?")
24
+ instance
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IIPolicy
4
+ class Error < StandardError
5
+ end
6
+
7
+ class AuthorizationError < StandardError
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IIPolicy
4
+ module Helper
5
+ delegate :policy, to: :controller
6
+ end
7
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IIPolicy
4
+ module Lookup
5
+ extend ActiveSupport::Concern
6
+
7
+ class_methods do
8
+ def lookup(klass)
9
+ Lookup.call(klass)
10
+ end
11
+ end
12
+
13
+ class << self
14
+ class_attribute :_cache
15
+ self._cache = {}
16
+
17
+ def call(klass)
18
+ klass = klass.class unless klass.is_a?(Module)
19
+ return if terminate?(klass)
20
+
21
+ cache(klass) do
22
+ if klass.name && (policy = resolve(klass))
23
+ policy
24
+ elsif klass.superclass
25
+ call(klass.superclass)
26
+ end
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def cache(klass)
33
+ if Config.lookup_cache
34
+ self._cache[klass] ||= yield
35
+ else
36
+ yield
37
+ end
38
+ end
39
+
40
+ def terminate?(klass)
41
+ klass.name.to_s.in?(['Object', 'ActiveRecord::Base', 'ActiveModel::Base', 'ActionController::Base'])
42
+ end
43
+
44
+ def resolve(klass)
45
+ policy_name = if klass < ActionController::Base
46
+ "#{klass.name.sub(/Controller$/, '').singularize}Policy"
47
+ else
48
+ "#{klass.name}Policy"
49
+ end
50
+ policy = policy_name.safe_constantize
51
+ return policy if policy && policy_name == policy.name
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IIPolicy
4
+ class Railtie < Rails::Railtie
5
+ ActiveSupport.on_load :action_controller do
6
+ ActionController::Base.send :include, IIPolicy::Controller
7
+ end
8
+
9
+ ActiveSupport.on_load :action_view do
10
+ ActionView::Base.send :include, IIPolicy::Helper
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IIPolicy
4
+ VERSION = '1.0.0'
5
+ end
metadata ADDED
@@ -0,0 +1,154 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ii_policy
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Yoshikazu Kaneta
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-07-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '5.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '5.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '5.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '5.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: sqlite3
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec-rails
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: A base policy to support management of authorization logic
98
+ email:
99
+ - kaneta@sitebridge.co.jp
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".github/workflows/ci.yml"
105
+ - ".gitignore"
106
+ - ".rspec"
107
+ - CHANGELOG.md
108
+ - Gemfile
109
+ - LICENSE
110
+ - README.md
111
+ - Rakefile
112
+ - bin/console
113
+ - bin/setup
114
+ - gemfiles/rails50.gemfile
115
+ - gemfiles/rails51.gemfile
116
+ - gemfiles/rails52.gemfile
117
+ - gemfiles/rails60.gemfile
118
+ - gemfiles/rails61.gemfile
119
+ - ii_policy.gemspec
120
+ - lib/ii_policy.rb
121
+ - lib/ii_policy/base.rb
122
+ - lib/ii_policy/callbacks.rb
123
+ - lib/ii_policy/chain.rb
124
+ - lib/ii_policy/config.rb
125
+ - lib/ii_policy/context.rb
126
+ - lib/ii_policy/controller.rb
127
+ - lib/ii_policy/errors.rb
128
+ - lib/ii_policy/helper.rb
129
+ - lib/ii_policy/lookup.rb
130
+ - lib/ii_policy/railtie.rb
131
+ - lib/ii_policy/version.rb
132
+ homepage: https://github.com/kanety/ii_policy
133
+ licenses: []
134
+ metadata: {}
135
+ post_install_message:
136
+ rdoc_options: []
137
+ require_paths:
138
+ - lib
139
+ required_ruby_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ required_rubygems_version: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ requirements: []
150
+ rubygems_version: 3.1.2
151
+ signing_key:
152
+ specification_version: 4
153
+ summary: A base policy to support management of authorization logic
154
+ test_files: []