pundit 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6dc0e920a5482e8b695a1cc1afd205fdc7752ad2
4
+ data.tar.gz: 1354dab74c79e3673cc034ccccea04688e4cb07a
5
+ SHA512:
6
+ metadata.gz: 0b745c98f6c3aa8376e97f3270ae6f3358339f13eb2fdd57c8adfc0e47f2dee073138866b7df986317d3bd19f6d23c80f7ffb6311a99b97c4f2fe46cb6924e93
7
+ data.tar.gz: bad3e8cb1c9c8888abf4b93521100ae0122eeebb19dbaaf1790e6beb20189dac55a7e60c017bf525ea5b7091ff9c2a07b3126bd928e6f8d22ded5b0b1f3e9ab2
@@ -1,6 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.2
4
3
  - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.0
5
6
  - jruby-19mode
6
- - rbx-19mode
7
+ - rbx-2.2.3
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Pundit
2
2
 
3
3
  [![Build Status](https://secure.travis-ci.org/elabs/pundit.png?branch=master)](https://travis-ci.org/elabs/pundit)
4
+ [![Code Climate](https://codeclimate.com/github/elabs/pundit.png)](https://codeclimate.com/github/elabs/pundit)
4
5
 
5
6
  Pundit provides a set of helpers which guide you in leveraging regular Ruby
6
7
  classes and object oriented design patterns to build a simple, robust and
@@ -28,10 +29,14 @@ with some useful defaults for you:
28
29
  rails g pundit:install
29
30
  ```
30
31
 
32
+ After generating your application policy, restart the Rails server so that Rails
33
+ can pick up any classes in the new `app/policies/` directory.
34
+
31
35
  ## Policies
32
36
 
33
37
  Pundit is focused around the notion of policy classes. We suggest that you put
34
- these classes in `app/policies`. This is a simple example:
38
+ these classes in `app/policies`. This is a simple example that allows updating
39
+ a post if the user is an admin, or if the post is unpublished:
35
40
 
36
41
  ``` ruby
37
42
  class PostPolicy
@@ -42,18 +47,18 @@ class PostPolicy
42
47
  @post = post
43
48
  end
44
49
 
45
- def create?
50
+ def update?
46
51
  user.admin? or not post.published?
47
52
  end
48
53
  end
49
54
  ```
50
55
 
51
56
  As you can see, this is just a plain Ruby class. As a convenience, we can inherit
52
- from Struct:
57
+ from Struct or use Struct.new to define the policy class:
53
58
 
54
59
  ``` ruby
55
- class PostPolicy < Struct.new(:user, :post)
56
- def create?
60
+ PostPolicy = Struct.new(:user, :post) do
61
+ def update?
57
62
  user.admin? or not post.published?
58
63
  end
59
64
  end
@@ -68,7 +73,7 @@ Pundit makes the following assumptions about this class:
68
73
  - The second argument is some kind of model object, whose authorization
69
74
  you want to check. This does not need to be an ActiveRecord or even
70
75
  an ActiveModel object, it can be anything really.
71
- - The class implements some kind of query method, in this case `create?`.
76
+ - The class implements some kind of query method, in this case `update?`.
72
77
  Usually, this will map to the name of a particular controller action.
73
78
 
74
79
  That's it really.
@@ -77,13 +82,13 @@ Supposing that you have an instance of class `Post`, Pundit now lets you do
77
82
  this in your controller:
78
83
 
79
84
  ``` ruby
80
- def create
81
- @post = Post.new(params[:post])
85
+ def update
86
+ @post = Post.find(params[:id])
82
87
  authorize @post
83
- if @post.save
88
+ if @post.update(post_params)
84
89
  redirect_to @post
85
90
  else
86
- render :new
91
+ render :edit
87
92
  end
88
93
  end
89
94
  ```
@@ -91,11 +96,11 @@ end
91
96
  The authorize method automatically infers that `Post` will have a matching
92
97
  `PostPolicy` class, and instantiates this class, handing in the current user
93
98
  and the given record. It then infers from the action name, that it should call
94
- `create?` on this instance of the policy. In this case, you can imagine that
99
+ `update?` on this instance of the policy. In this case, you can imagine that
95
100
  `authorize` would have done something like this:
96
101
 
97
102
  ``` ruby
98
- raise "not authorized" unless PostPolicy.new(current_user, @post).create?
103
+ raise "not authorized" unless PostPolicy.new(current_user, @post).update?
99
104
  ```
100
105
 
101
106
  You can pass a second argument to `authorize` if the name of the permission you
@@ -115,8 +120,8 @@ method in both the view and controller. This is especially useful for
115
120
  conditionally showing links or buttons in the view:
116
121
 
117
122
  ``` erb
118
- <% if policy(@post).create? %>
119
- <%= link_to "New post", new_post_path %>
123
+ <% if policy(@post).update? %>
124
+ <%= link_to "Edit post", edit_post_path(@post) %>
120
125
  <% end %>
121
126
  ```
122
127
 
@@ -124,16 +129,16 @@ conditionally showing links or buttons in the view:
124
129
 
125
130
  Pundit adds a method called `verify_authorized` to your controllers. This
126
131
  method will raise an exception if `authorize` has not yet been called. You
127
- should run this method in an `after_filter` to ensure that you haven't
132
+ should run this method in an `after_action` to ensure that you haven't
128
133
  forgotten to authorize the action. For example:
129
134
 
130
135
  ``` ruby
131
136
  class ApplicationController < ActionController::Base
132
- after_filter :verify_authorized, :except => :index
137
+ after_action :verify_authorized, :except => :index
133
138
  end
134
139
  ```
135
140
 
136
- Likewise, pundit also adds `verify_policy_scoped` to your controller. This
141
+ Likewise, Pundit also adds `verify_policy_scoped` to your controller. This
137
142
  will raise an exception in the vein of `verify_authorized`. However it tracks
138
143
  if `policy_scoped` is used instead of `authorize`. This is mostly useful for
139
144
  controller actions like `index` which find collections with a scope and don't
@@ -141,7 +146,7 @@ authorize individual instances.
141
146
 
142
147
  ``` ruby
143
148
  class ApplicationController < ActionController::Base
144
- after_filter :verify_policy_scoped, :only => :index
149
+ after_action :verify_policy_scoped, :only => :index
145
150
  end
146
151
  ```
147
152
 
@@ -152,18 +157,18 @@ particular user has access to. When using Pundit, you are expected to
152
157
  define a class called a policy scope. It can look something like this:
153
158
 
154
159
  ``` ruby
155
- class PostPolicy < Struct.new(:user, :post)
156
- class Scope < Struct.new(:user, :scope)
160
+ PostPolicy = Struct.new(:user, :post) do
161
+ self::Scope = Struct.new(:user, :scope) do
157
162
  def resolve
158
163
  if user.admin?
159
- scope
164
+ scope.all
160
165
  else
161
166
  scope.where(:published => true)
162
167
  end
163
168
  end
164
169
  end
165
170
 
166
- def create?
171
+ def update?
167
172
  user.admin? or not post.published?
168
173
  end
169
174
  end
@@ -215,7 +220,7 @@ class, instead of letting Pundit infer it. This can be done like so:
215
220
  ``` ruby
216
221
  class Post
217
222
  def self.policy_class
218
- PostablePolicyClass
223
+ PostablePolicy
219
224
  end
220
225
  end
221
226
  ```
@@ -264,6 +269,26 @@ class ApplicationPolicy
264
269
  end
265
270
  ```
266
271
 
272
+ ## Rescuing a denied Authorization in Rails
273
+
274
+ Pundit raises a `Pundit::NotAuthorizedError` you can [rescue_from](http://guides.rubyonrails.org/action_controller_overview.html#rescue-from) in your `ApplicationController`. You can customize the `user_not_authorized` method in every controller.
275
+
276
+ ```ruby
277
+ class ApplicationController < ActionController::Base
278
+ protect_from_forgery
279
+ include Pundit
280
+
281
+ rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
282
+
283
+ private
284
+
285
+ def user_not_authorized
286
+ flash[:error] = "You are not authorized to perform this action."
287
+ redirect_to request.headers["Referer"] || root_path
288
+ end
289
+ end
290
+ ```
291
+
267
292
  ## Manually retrieving policies and scopes
268
293
 
269
294
  Sometimes you want to retrieve a policy for a record outside the controller or
@@ -282,40 +307,62 @@ Pundit.policy_scope(user, Post)
282
307
  The bang methods will raise an exception if the policy does not exist, whereas
283
308
  those without the bang will return nil.
284
309
 
285
- ## Pundit and strong_parameters
310
+ ## Customize Pundit user
286
311
 
287
- In Rails 3 using [strong_parameters](https://github.com/rails/strong_parameters)
288
- or a standard Rails 4 setup, mass-assignment protection is handled in the controller.
289
- Pundit helps you permit different attributes for different users.
312
+ In some cases your controller might not have access to `current_user`, or your
313
+ `current_user` is not the method that should be invoked by Pundit. Simply
314
+ define a method in your controller called `pundit_user`.
290
315
 
291
316
  ```ruby
292
- class PostPolicy < Struct.new(:user, :post)
317
+ def pundit_user
318
+ User.find_by_other_means
319
+ end
320
+ ```
321
+
322
+ ## Strong parameters
323
+
324
+ In Rails 4 (or Rails 3.2 with the
325
+ [strong_parameters](https://github.com/rails/strong_parameters) gem),
326
+ mass-assignment protection is handled in the controller.
327
+ Pundit helps you permit different users to set different attributes. Don't
328
+ forget to provide your policy an instance of object or a class so correct
329
+ permissions could be loaded.
330
+
331
+ ```ruby
332
+ # app/policies/post_policy.rb
333
+ class PostPolicy < ApplicationPolicy
293
334
  def permitted_attributes
294
335
  if user.admin? || user.owner_of?(post)
295
- [:title, :body]
336
+ [:title, :body, :tag_list]
296
337
  else
297
- [:body]
338
+ [:tag_list]
298
339
  end
299
340
  end
300
341
  end
301
342
 
343
+ # app/controllers/posts_controller.rb
302
344
  class PostsController < ApplicationController
303
345
  def update
304
- # ...
305
- if @post.update_attributes(post_attributes)
306
- # ...
346
+ @post = Post.find(params[:id])
347
+ if @post.update(post_params)
348
+ redirect_to @post
349
+ else
350
+ render :edit
351
+ end
307
352
  end
308
353
 
309
354
  private
310
355
 
311
- def post_attributes
312
- params.require(:post).permit(policy(@post).permitted_attributes)
356
+ def post_params
357
+ params.require(:post).permit(*policy(@post || Post).permitted_attributes)
313
358
  end
314
359
  end
315
360
  ```
316
361
 
317
362
  ## RSpec
318
363
 
364
+ ### Policy Specs
365
+
319
366
  Pundit includes a mini-DSL for writing expressive tests for your policies in RSpec.
320
367
  Require `pundit/rspec` in your `spec_helper.rb`:
321
368
 
@@ -329,22 +376,55 @@ Then put your policy specs in `spec/policies`, and make them look somewhat like
329
376
  describe PostPolicy do
330
377
  subject { PostPolicy }
331
378
 
332
- permissions :create? do
379
+ permissions :update? do
333
380
  it "denies access if post is published" do
334
- should_not permit(User.new(:admin => false), Post.new(:published => true))
381
+ expect(subject).not_to permit(User.new(:admin => false), Post.new(:published => true))
335
382
  end
336
383
 
337
384
  it "grants access if post is published and user is an admin" do
338
- should permit(User.new(:admin => true), Post.new(:published => true))
385
+ expect(subject).to permit(User.new(:admin => true), Post.new(:published => true))
339
386
  end
340
387
 
341
388
  it "grants access if post is unpublished" do
342
- should permit(User.new(:admin => false), Post.new(:published => false))
389
+ expect(subject).to permit(User.new(:admin => false), Post.new(:published => false))
343
390
  end
344
391
  end
345
392
  end
346
393
  ```
347
394
 
395
+ An alternative approach to Pundit policy specs is scoping them to a user context as outlined in this
396
+ [excellent post](http://thunderboltlabs.com/blog/2013/03/27/testing-pundit-policies-with-rspec/).
397
+
398
+ ### View Specs
399
+
400
+ When writing view specs, you'll notice that the policy helper is not available
401
+ and views under test that use it will fail. Thankfully, it's very easy to stub
402
+ out the policy to have it return whatever is appropriate for the spec.
403
+
404
+ ``` ruby
405
+ describe "users/show" do
406
+ before(:each) do
407
+ user = assign(:user, build_stubbed(:user))
408
+ controller.stub(:current_user).and_return user
409
+ end
410
+
411
+ it "renders the destroy action" do
412
+ allow(view).to receive(:policy).and_return double(edit?: false, destroy?: true)
413
+
414
+ render
415
+ expect(rendered).to match 'Destroy'
416
+ end
417
+ end
418
+ ```
419
+
420
+ This technique enables easy unit testing of tricky conditionaly view logic
421
+ based on what is or is not authorized.
422
+
423
+ # External Resources
424
+
425
+ - [Migrating to Pundit from CanCan](http://blog.carbonfive.com/2013/10/21/migrating-to-pundit-from-cancan/)
426
+ - [Testing Pundit Policies with RSpec](http://thunderboltlabs.com/blog/2013/03/27/testing-pundit-policies-with-rspec/)
427
+
348
428
  # License
349
429
 
350
430
  Licensed under the MIT license, see the separate LICENSE.txt file.
data/Rakefile CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'rubygems'
2
+ require 'bundler/gem_tasks'
2
3
  require 'rspec/core/rake_task'
3
4
  require 'yard'
4
5
 
@@ -12,8 +12,8 @@ module Pundit
12
12
 
13
13
  class << self
14
14
  def policy_scope(user, scope)
15
- policy = PolicyFinder.new(scope).scope
16
- policy.new(user, scope).resolve if policy
15
+ policy_scope = PolicyFinder.new(scope).scope
16
+ policy_scope.new(user, scope).resolve if policy_scope
17
17
  end
18
18
 
19
19
  def policy_scope!(user, scope)
@@ -21,8 +21,8 @@ module Pundit
21
21
  end
22
22
 
23
23
  def policy(user, record)
24
- scope = PolicyFinder.new(record).policy
25
- scope.new(user, record) if scope
24
+ policy = PolicyFinder.new(record).policy
25
+ policy.new(user, record) if policy
26
26
  end
27
27
 
28
28
  def policy!(user, record)
@@ -34,11 +34,13 @@ module Pundit
34
34
  if respond_to?(:helper_method)
35
35
  helper_method :policy_scope
36
36
  helper_method :policy
37
+ helper_method :pundit_user
37
38
  end
38
39
  if respond_to?(:hide_action)
39
40
  hide_action :authorize
40
41
  hide_action :verify_authorized
41
42
  hide_action :verify_policy_scoped
43
+ hide_action :pundit_user
42
44
  end
43
45
  end
44
46
 
@@ -61,10 +63,16 @@ module Pundit
61
63
 
62
64
  def policy_scope(scope)
63
65
  @_policy_scoped = true
64
- Pundit.policy_scope!(current_user, scope)
66
+ @policy_scope or Pundit.policy_scope!(pundit_user, scope)
65
67
  end
68
+ attr_writer :policy_scope
66
69
 
67
70
  def policy(record)
68
- Pundit.policy!(current_user, record)
71
+ @policy or Pundit.policy!(pundit_user, record)
72
+ end
73
+ attr_writer :policy
74
+
75
+ def pundit_user
76
+ current_user
69
77
  end
70
78
  end
@@ -4,10 +4,14 @@ module Pundit
4
4
  extend ::RSpec::Matchers::DSL
5
5
 
6
6
  matcher :permit do |user, record|
7
- match do |policy|
7
+ match_for_should do |policy|
8
8
  permissions.all? { |permission| policy.new(user, record).public_send(permission) }
9
9
  end
10
10
 
11
+ match_for_should_not do |policy|
12
+ permissions.none? { |permission| policy.new(user, record).public_send(permission) }
13
+ end
14
+
11
15
  failure_message_for_should do |policy|
12
16
  "Expected #{policy} to grant #{permissions.to_sentence} on #{record} but it didn't"
13
17
  end
@@ -1,3 +1,3 @@
1
1
  module Pundit
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
3
3
  end
@@ -10,7 +10,8 @@ Gem::Specification.new do |gem|
10
10
  gem.email = ["jonas.nicklas@gmail.com", "dev@elabs.se"]
11
11
  gem.description = %q{Object oriented authorization for Rails applications}
12
12
  gem.summary = %q{OO authorization for Rails}
13
- gem.homepage = "http://github.com/elabs/pundit"
13
+ gem.homepage = "https://github.com/elabs/pundit"
14
+ gem.license = "MIT"
14
15
 
15
16
  gem.files = `git ls-files`.split($/)
16
17
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -19,6 +20,7 @@ Gem::Specification.new do |gem|
19
20
 
20
21
  gem.add_dependency "activesupport", ">= 3.0.0"
21
22
  gem.add_development_dependency "activerecord", ">= 3.0.0"
23
+ gem.add_development_dependency "bundler", "~> 1.3"
22
24
  gem.add_development_dependency "rspec", "~>2.0"
23
25
  gem.add_development_dependency "pry"
24
26
  gem.add_development_dependency "rake"
@@ -56,11 +56,11 @@ class ArticleTag
56
56
  end
57
57
 
58
58
  describe Pundit do
59
- let(:user) { stub }
59
+ let(:user) { double }
60
60
  let(:post) { Post.new(user) }
61
61
  let(:comment) { Comment.new }
62
62
  let(:article) { Article.new }
63
- let(:controller) { stub(:current_user => user, :params => { :action => "update" }).tap { |c| c.extend(Pundit) } }
63
+ let(:controller) { double(:current_user => user, :params => { :action => "update" }).tap { |c| c.extend(Pundit) } }
64
64
  let(:artificial_blog) { ArtificialBlog.new }
65
65
  let(:article_tag) { ArticleTag.new }
66
66
 
@@ -226,6 +226,12 @@ describe Pundit do
226
226
  end
227
227
  end
228
228
 
229
+ describe "#pundit_user" do
230
+ it 'returns the same thing as current_user' do
231
+ controller.pundit_user.should eq controller.current_user
232
+ end
233
+ end
234
+
229
235
  describe ".policy" do
230
236
  it "returns an instantiated policy" do
231
237
  policy = controller.policy(post)
@@ -236,6 +242,13 @@ describe Pundit do
236
242
  it "throws an exception if the given policy can't be found" do
237
243
  expect { controller.policy(article) }.to raise_error(Pundit::NotDefinedError)
238
244
  end
245
+
246
+ it "allows policy to be injected" do
247
+ new_policy = OpenStruct.new
248
+ controller.policy = new_policy
249
+
250
+ controller.policy(post).should == new_policy
251
+ end
239
252
  end
240
253
 
241
254
  describe ".policy_scope" do
@@ -246,5 +259,12 @@ describe Pundit do
246
259
  it "throws an exception if the given policy can't be found" do
247
260
  expect { controller.policy_scope(Article) }.to raise_error(Pundit::NotDefinedError)
248
261
  end
262
+
263
+ it "allows policy_scope to be injected" do
264
+ new_scope = OpenStruct.new
265
+ controller.policy_scope = new_scope
266
+
267
+ controller.policy_scope(post).should == new_scope
268
+ end
249
269
  end
250
270
  end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pundit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
5
- prerelease:
4
+ version: 0.2.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Jonas Nicklas
@@ -10,44 +9,53 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2013-06-18 00:00:00.000000000 Z
12
+ date: 2014-02-07 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: activesupport
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
- - - ! '>='
18
+ - - '>='
21
19
  - !ruby/object:Gem::Version
22
20
  version: 3.0.0
23
21
  type: :runtime
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
24
  requirements:
28
- - - ! '>='
25
+ - - '>='
29
26
  - !ruby/object:Gem::Version
30
27
  version: 3.0.0
31
28
  - !ruby/object:Gem::Dependency
32
29
  name: activerecord
33
30
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
31
  requirements:
36
- - - ! '>='
32
+ - - '>='
37
33
  - !ruby/object:Gem::Version
38
34
  version: 3.0.0
39
35
  type: :development
40
36
  prerelease: false
41
37
  version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
38
  requirements:
44
- - - ! '>='
39
+ - - '>='
45
40
  - !ruby/object:Gem::Version
46
41
  version: 3.0.0
42
+ - !ruby/object:Gem::Dependency
43
+ name: bundler
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ~>
47
+ - !ruby/object:Gem::Version
48
+ version: '1.3'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: '1.3'
47
56
  - !ruby/object:Gem::Dependency
48
57
  name: rspec
49
58
  requirement: !ruby/object:Gem::Requirement
50
- none: false
51
59
  requirements:
52
60
  - - ~>
53
61
  - !ruby/object:Gem::Version
@@ -55,7 +63,6 @@ dependencies:
55
63
  type: :development
56
64
  prerelease: false
57
65
  version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
66
  requirements:
60
67
  - - ~>
61
68
  - !ruby/object:Gem::Version
@@ -63,49 +70,43 @@ dependencies:
63
70
  - !ruby/object:Gem::Dependency
64
71
  name: pry
65
72
  requirement: !ruby/object:Gem::Requirement
66
- none: false
67
73
  requirements:
68
- - - ! '>='
74
+ - - '>='
69
75
  - !ruby/object:Gem::Version
70
76
  version: '0'
71
77
  type: :development
72
78
  prerelease: false
73
79
  version_requirements: !ruby/object:Gem::Requirement
74
- none: false
75
80
  requirements:
76
- - - ! '>='
81
+ - - '>='
77
82
  - !ruby/object:Gem::Version
78
83
  version: '0'
79
84
  - !ruby/object:Gem::Dependency
80
85
  name: rake
81
86
  requirement: !ruby/object:Gem::Requirement
82
- none: false
83
87
  requirements:
84
- - - ! '>='
88
+ - - '>='
85
89
  - !ruby/object:Gem::Version
86
90
  version: '0'
87
91
  type: :development
88
92
  prerelease: false
89
93
  version_requirements: !ruby/object:Gem::Requirement
90
- none: false
91
94
  requirements:
92
- - - ! '>='
95
+ - - '>='
93
96
  - !ruby/object:Gem::Version
94
97
  version: '0'
95
98
  - !ruby/object:Gem::Dependency
96
99
  name: yard
97
100
  requirement: !ruby/object:Gem::Requirement
98
- none: false
99
101
  requirements:
100
- - - ! '>='
102
+ - - '>='
101
103
  - !ruby/object:Gem::Version
102
104
  version: '0'
103
105
  type: :development
104
106
  prerelease: false
105
107
  version_requirements: !ruby/object:Gem::Requirement
106
- none: false
107
108
  requirements:
108
- - - ! '>='
109
+ - - '>='
109
110
  - !ruby/object:Gem::Version
110
111
  version: '0'
111
112
  description: Object oriented authorization for Rails applications
@@ -134,29 +135,29 @@ files:
134
135
  - lib/pundit/version.rb
135
136
  - pundit.gemspec
136
137
  - spec/pundit_spec.rb
137
- homepage: http://github.com/elabs/pundit
138
- licenses: []
138
+ homepage: https://github.com/elabs/pundit
139
+ licenses:
140
+ - MIT
141
+ metadata: {}
139
142
  post_install_message:
140
143
  rdoc_options: []
141
144
  require_paths:
142
145
  - lib
143
146
  required_ruby_version: !ruby/object:Gem::Requirement
144
- none: false
145
147
  requirements:
146
- - - ! '>='
148
+ - - '>='
147
149
  - !ruby/object:Gem::Version
148
150
  version: '0'
149
151
  required_rubygems_version: !ruby/object:Gem::Requirement
150
- none: false
151
152
  requirements:
152
- - - ! '>='
153
+ - - '>='
153
154
  - !ruby/object:Gem::Version
154
155
  version: '0'
155
156
  requirements: []
156
157
  rubyforge_project:
157
- rubygems_version: 1.8.25
158
+ rubygems_version: 2.0.3
158
159
  signing_key:
159
- specification_version: 3
160
+ specification_version: 4
160
161
  summary: OO authorization for Rails
161
162
  test_files:
162
163
  - spec/pundit_spec.rb