know_it_all 0.1.4 → 0.1.5
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 +4 -4
- data/CHANGELOG.md +31 -0
- data/README.md +72 -10
- data/lib/generators/know_it_all/install/USAGE +11 -0
- data/lib/generators/know_it_all/install/install_generator.rb +18 -0
- data/lib/generators/know_it_all/install/templates/application_policy.rb +2 -0
- data/lib/generators/know_it_all/policy/USAGE +9 -0
- data/lib/generators/know_it_all/policy/policy_generator.rb +29 -0
- data/lib/generators/know_it_all/policy/templates/module.rb +4 -0
- data/lib/generators/know_it_all/policy/templates/policy.rb +4 -0
- data/lib/know_it_all/base.rb +7 -1
- data/lib/know_it_all/version.rb +1 -1
- metadata +10 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f2c9d3f6e989ec8e15956f85a2734e15ce858a7b
|
4
|
+
data.tar.gz: 1e7194c8936f99fcecbd5c543855c69bdc5577e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8efd4ad6004315675decbf3038628d5178319e5895c7d0d2a7e80df15984dce504d5c315d33893b6988ced57d63fafbc65e66bba58ebe10a0caf10cb36884ac3
|
7
|
+
data.tar.gz: 26183fd792e49f71e69bed56a522648a5fc0854500f72823223dd127c162b314b1462a46a9f1f8f63f7114cd0858913f0e7dc05c857c09a98df7daa0ff67322a
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# Change Log
|
2
|
+
|
3
|
+
## [v0.1.5](https://github.com/mrodrigues/know_it_all/tree/v0.1.5) (2016-08-17)
|
4
|
+
[Full Changelog](https://github.com/mrodrigues/know_it_all/compare/v0.1.4...v0.1.5)
|
5
|
+
|
6
|
+
- Add Rails generators for installing the gem and creating policies
|
7
|
+
- Deprecating `assert` in favor of `validate`
|
8
|
+
|
9
|
+
## [v0.1.4](https://github.com/mrodrigues/know_it_all/tree/v0.1.4) (2016-07-03)
|
10
|
+
[Full Changelog](https://github.com/mrodrigues/know_it_all/compare/v0.1.3...v0.1.4)
|
11
|
+
|
12
|
+
- Add support to define error message with a block
|
13
|
+
|
14
|
+
## [v0.1.3](https://github.com/mrodrigues/know_it_all/tree/v0.1.3) (2016-07-03)
|
15
|
+
[Full Changelog](https://github.com/mrodrigues/know_it_all/compare/v0.1.2...v0.1.3)
|
16
|
+
|
17
|
+
- Remove ActiveSupport dependency [\#3](https://github.com/mrodrigues/know_it_all/issues/3)
|
18
|
+
|
19
|
+
## [v0.1.2](https://github.com/mrodrigues/know_it_all/tree/v0.1.2) (2016-06-30)
|
20
|
+
[Full Changelog](https://github.com/mrodrigues/know_it_all/compare/v0.1.1...v0.1.2)
|
21
|
+
|
22
|
+
- Add support to inheritance chain of `KnowItAll::Base`
|
23
|
+
|
24
|
+
## [v0.1.1](https://github.com/mrodrigues/know_it_all/tree/v0.1.1) (2016-06-30)
|
25
|
+
[Full Changelog](https://github.com/mrodrigues/know_it_all/compare/v0.1.0...v0.1.1)
|
26
|
+
|
27
|
+
- Fix bug when extending `KnowItAll::Base` with more than one class
|
28
|
+
|
29
|
+
## [v0.1.0](https://github.com/mrodrigues/know_it_all/tree/v0.1.0) (2016-06-29)
|
30
|
+
|
31
|
+
- Initial release
|
data/README.md
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
|
5
5
|
[](https://badge.fury.io/rb/know_it_all)
|
6
6
|
[](https://gitter.im/mrodrigues/know_it_all?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
7
|
+
[](https://twitter.com/know_it_all_gem)
|
7
8
|
|
8
9
|
KnowItAll is a small, object-oriented approach to authorization. It knows everything about your application!
|
9
10
|
|
@@ -18,6 +19,9 @@ Table of Contents
|
|
18
19
|
* [Why?](#why)
|
19
20
|
* [Why not just Pundit?](#why-not-just-pundit)
|
20
21
|
* [Installation](#installation)
|
22
|
+
* [Generators](#generators)
|
23
|
+
* [Install](#install)
|
24
|
+
* [Policy](#policy)
|
21
25
|
* [Usage](#usage)
|
22
26
|
* [Creating policies](#creating-policies)
|
23
27
|
* [Naming convention](#naming-convention)
|
@@ -28,6 +32,8 @@ Table of Contents
|
|
28
32
|
* [Avoiding conflicts in the controller](#avoiding-conflicts-in-the-controller)
|
29
33
|
* [Overrides](#overrides)
|
30
34
|
* [Enforcing authorization checks](#enforcing-authorization-checks)
|
35
|
+
* [Get help](#get-help)
|
36
|
+
* [Alternatives](#alternatives)
|
31
37
|
* [Development](#development)
|
32
38
|
* [Contributing](#contributing)
|
33
39
|
* [License](#license)
|
@@ -112,17 +118,47 @@ Or install it yourself as:
|
|
112
118
|
|
113
119
|
$ gem install know_it_all
|
114
120
|
|
121
|
+
Then include `KnowItAll` in your application controller:
|
122
|
+
|
123
|
+
```ruby
|
124
|
+
class ApplicationController < ActionController::Base
|
125
|
+
include KnowItAll
|
126
|
+
end
|
127
|
+
```
|
128
|
+
|
129
|
+
### Generators
|
130
|
+
|
131
|
+
#### Install
|
132
|
+
|
133
|
+
When adding the gem to your application, you can optionally run:
|
134
|
+
|
135
|
+
```bash
|
136
|
+
rails generate know_it_all:install
|
137
|
+
```
|
138
|
+
|
139
|
+
This will include the `KnowItAll` module in your application controller and create a `ApplicationPolicy`, which you can use to define some defaults for your policies.
|
140
|
+
|
141
|
+
#### Policy
|
142
|
+
|
143
|
+
To create a new policy, you can use the following generator:
|
144
|
+
|
145
|
+
```bash
|
146
|
+
rails generate know_it_all:policy orders index create update destroy
|
147
|
+
```
|
148
|
+
|
149
|
+
This will create, in addition to one policy file for each action (`app/policies/orders_policies/index.rb`, `app/policies/orders_policies/create.rb`, etc.), a `app/policies/stores_policy.rb` file containing both the `StoresPolicies` module declaration and a `StoresPolicies::Base` class to share common behaviors specific to that controller's policies.
|
150
|
+
|
115
151
|
## Usage
|
116
152
|
|
117
153
|
There are two steps to using this gem: creating and using policies:
|
118
154
|
|
119
155
|
### Creating policies
|
120
156
|
|
121
|
-
|
157
|
+
The core of this gem, policies are regular Ruby classes that perform some validation and obey some rules:
|
122
158
|
|
123
159
|
* It is initialized with the same arguments that are passed to the `authorize`, `authorize!` and `authorize?` methods in the controller;
|
124
160
|
* It responds to a method `errors`;
|
125
|
-
* Calling `errors` returns an object that responds to the method `empty?` and is serializable. It's usually an array, but it could easily be an `ActiveModel::Errors`.
|
161
|
+
* Calling `errors` returns an object that responds to the method `empty?` and is serializable (so you can render it as the response to the request). It's usually an array of `String`s, but it could easily be an `ActiveModel::Errors`.
|
126
162
|
|
127
163
|
Here's an example:
|
128
164
|
|
@@ -148,7 +184,7 @@ module OrdersPolicies
|
|
148
184
|
end
|
149
185
|
```
|
150
186
|
|
151
|
-
|
187
|
+
Notice that I didn't include any module or extend from any class here. `KnowItAll` will simply infer the name of the class (based on the [Naming convention](#naming-convention)) and instantiate it, even if it's a PORO. Now, using `ActiveModel::Validations`:
|
152
188
|
|
153
189
|
```ruby
|
154
190
|
module OrdersPolicies
|
@@ -189,12 +225,12 @@ If you don't want to write your own policy from the scratch, I've also provided
|
|
189
225
|
```ruby
|
190
226
|
module OrdersPolicies
|
191
227
|
class Create < KnowItAll::Base
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
228
|
+
validate :user_signed_in?, "User must be signed in"
|
229
|
+
validate :address_present?, "User must have a registered address"
|
230
|
+
validate :address_in_range?, "Registered address is outside the range"
|
231
|
+
validate :cart_has_minimum?, "Cart must contain at least $10 in items"
|
232
|
+
validate :items_available?, "Some of the items are not available"
|
233
|
+
validate :store_open?, "The store is closed"
|
198
234
|
|
199
235
|
def initialize(current_user, cart, store)
|
200
236
|
@current_user = current_user
|
@@ -205,7 +241,25 @@ module OrdersPolicies
|
|
205
241
|
end
|
206
242
|
```
|
207
243
|
|
208
|
-
The class method `
|
244
|
+
The class method `validate` expects a `Symbol` representing the name of a predicate and a `String` containing the error message in case the predicate fails. The default `errors` method returns an array containing the messages for all the validations that didn't pass.
|
245
|
+
|
246
|
+
In case you need to define dynamically the error message (e.g. for internationalization), the `validate` method also accepts any object that responds to `call`, as a lambda. It'll pass the policy itself as an argument:
|
247
|
+
|
248
|
+
```ruby
|
249
|
+
module OrdersPolicies
|
250
|
+
class Create < KnowItAll::Base
|
251
|
+
attr_reader :cart
|
252
|
+
|
253
|
+
validate :cart_has_minimum?, -> (policy) {
|
254
|
+
I18n.t(:cart_minimum_total_error, total: policy.cart.total)
|
255
|
+
}
|
256
|
+
|
257
|
+
def initialize(cart)
|
258
|
+
@cart = cart
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
```
|
209
263
|
|
210
264
|
### Using policies
|
211
265
|
|
@@ -390,6 +444,14 @@ class ApplicationController < ActionController::Base
|
|
390
444
|
end
|
391
445
|
```
|
392
446
|
|
447
|
+
## Get help
|
448
|
+
|
449
|
+
Follow me on [Twitter](https://twitter.com/know_it_all_gem) or chat with me on [Gitter](https://gitter.im/mrodrigues/know_it_all)! :)
|
450
|
+
|
451
|
+
## Alternatives
|
452
|
+
|
453
|
+
As I said in the beginning, this project is heavily inspired by [Pundit](https://github.com/elabs/pundit), so obviously it is an excellent alternative. I've also used for several years the [CanCan](https://github.com/ryanb/cancan) gem, but it's been abandoned since then; the [CanCanCan](https://github.com/CanCanCommunity/cancancan) gem is a continuation that seems to be thriving. For more alternatives, check [The Ruby Toolbox](https://www.ruby-toolbox.com/categories/rails_authorization) page.
|
454
|
+
|
393
455
|
## Development
|
394
456
|
|
395
457
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module KnowItAll
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < ::Rails::Generators::Base
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
5
|
+
|
6
|
+
def add_module_to_application_controller
|
7
|
+
inject_into_file "app/controllers/application_controller.rb",
|
8
|
+
after: "class ApplicationController < ActionController::Base\n" do
|
9
|
+
" include KnowItAll\n"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_application_policy_file
|
14
|
+
template "application_policy.rb", "app/policies/application_policy.rb"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Description:
|
2
|
+
Generates a new policy
|
3
|
+
|
4
|
+
Example:
|
5
|
+
rails generate know_it_all:policy controller_name action_name [first_validation first_message second_validation second_message...]
|
6
|
+
|
7
|
+
This will create:
|
8
|
+
app/policies/controller_name_policies.rb
|
9
|
+
app/policies/controller_name_policies/action_name.rb
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'pry'
|
2
|
+
|
3
|
+
module KnowItAll
|
4
|
+
module Generators
|
5
|
+
class PolicyGenerator < ::Rails::Generators::Base
|
6
|
+
source_root File.expand_path('../templates', __FILE__)
|
7
|
+
|
8
|
+
argument :controller_name, type: :string
|
9
|
+
argument :action_names, type: :array
|
10
|
+
|
11
|
+
def create_policy_file
|
12
|
+
unless File.exists?("app/policies/#{module_name}.rb")
|
13
|
+
template 'module.rb', "app/policies/#{module_name}.rb"
|
14
|
+
end
|
15
|
+
|
16
|
+
action_names.each do |action_name|
|
17
|
+
@action_name = action_name
|
18
|
+
template 'policy.rb', "app/policies/#{module_name}/#{action_name}.rb"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def module_name
|
25
|
+
"#{controller_name}_policies"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/know_it_all/base.rb
CHANGED
@@ -12,7 +12,13 @@ module KnowItAll
|
|
12
12
|
subclass.validations = validations.dup
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
# <b>DEPRECATED:</b> Please use <tt>validate</tt> instead.
|
16
|
+
def self.assert(*args)
|
17
|
+
warn "[DEPRECATION] `assert` is deprecated. Please use `validate` instead."
|
18
|
+
validate(*args)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.validate(method_name, message)
|
16
22
|
validations[method_name] = message
|
17
23
|
end
|
18
24
|
|
data/lib/know_it_all/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: know_it_all
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mrodrigues
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -89,6 +89,7 @@ extra_rdoc_files: []
|
|
89
89
|
files:
|
90
90
|
- ".gitignore"
|
91
91
|
- ".travis.yml"
|
92
|
+
- CHANGELOG.md
|
92
93
|
- CODE_OF_CONDUCT.md
|
93
94
|
- Gemfile
|
94
95
|
- LICENSE.txt
|
@@ -97,6 +98,13 @@ files:
|
|
97
98
|
- bin/console
|
98
99
|
- bin/setup
|
99
100
|
- know_it_all.gemspec
|
101
|
+
- lib/generators/know_it_all/install/USAGE
|
102
|
+
- lib/generators/know_it_all/install/install_generator.rb
|
103
|
+
- lib/generators/know_it_all/install/templates/application_policy.rb
|
104
|
+
- lib/generators/know_it_all/policy/USAGE
|
105
|
+
- lib/generators/know_it_all/policy/policy_generator.rb
|
106
|
+
- lib/generators/know_it_all/policy/templates/module.rb
|
107
|
+
- lib/generators/know_it_all/policy/templates/policy.rb
|
100
108
|
- lib/know_it_all.rb
|
101
109
|
- lib/know_it_all/authorizer.rb
|
102
110
|
- lib/know_it_all/base.rb
|
@@ -127,4 +135,3 @@ signing_key:
|
|
127
135
|
specification_version: 4
|
128
136
|
summary: OO authorization for APIs
|
129
137
|
test_files: []
|
130
|
-
has_rdoc:
|