cant 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +0 -2
- data/Gemfile.lock +3 -3
- data/{LICENSE.mit → MIT-LICENSE} +0 -0
- data/README.markdown +23 -31
- data/lib/cant/engine.rb +19 -8
- data/lib/cant/version.rb +1 -1
- metadata +4 -4
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/{LICENSE.mit → MIT-LICENSE}
RENAMED
File without changes
|
data/README.markdown
CHANGED
@@ -1,21 +1,15 @@
|
|
1
1
|
Intent
|
2
2
|
======
|
3
|
-
|
4
3
|
Lightweight authorization library, that let you choose where and how you write your rules
|
5
4
|
|
6
|
-
Cant is
|
5
|
+
Cant is simple : you can use it in any existing or future framework (provided names don't clash)
|
7
6
|
|
8
|
-
Cant is small
|
7
|
+
Cant is small : around 120 lines of code, has no dependencies but for testing
|
9
8
|
|
10
9
|
Cant can be configured at class level, and support basic configuration inheritance
|
11
10
|
|
12
|
-
|
13
11
|
What does it look like ?
|
14
12
|
========================
|
15
|
-
|
16
|
-
Examples
|
17
|
-
--------
|
18
|
-
|
19
13
|
* in an existing model
|
20
14
|
|
21
15
|
class User
|
@@ -64,17 +58,15 @@ Examples
|
|
64
58
|
* in a rack middleware ... I have not experimented yet ...
|
65
59
|
|
66
60
|
breaking authorization into small independent pieces is valuable, and you do not need a library for that, though using Cant::Editable and Cant::Questionable mixins can help you do that
|
67
|
-
|
68
|
-
|
61
|
+
|
69
62
|
|
70
63
|
Concepts
|
71
64
|
========
|
72
|
-
|
73
65
|
Cant is simply put a reduce (or [fold](http://learnyousomeerlang.com/higher-order-functions)) on a list of Rules.
|
74
66
|
|
75
67
|
* __Rule__
|
76
68
|
|
77
|
-
a tuple of functions
|
69
|
+
a tuple of functions __predicate__, __die__
|
78
70
|
|
79
71
|
* __rules__
|
80
72
|
|
@@ -104,7 +96,6 @@ Cant is simply put a reduce (or [fold](http://learnyousomeerlang.com/higher-orde
|
|
104
96
|
|
105
97
|
How do I define rules ?
|
106
98
|
=======================
|
107
|
-
|
108
99
|
First, choose where you want to define your list, and what information a Rule will need
|
109
100
|
|
110
101
|
The point of cant is to define a lists of similar rules together, so that they will require similar informations
|
@@ -118,16 +109,14 @@ Then there is one list of rules for any instance of this class, and instance eva
|
|
118
109
|
|
119
110
|
Note that a list of rules can be shared by many inquirers, either explicitly or by using class instance variable inheritance feature
|
120
111
|
|
121
|
-
Default Values
|
122
|
-
|
123
|
-
|
112
|
+
Default Values for module configuration
|
113
|
+
---------------------------------------
|
124
114
|
__Cant__ module has "reasonable" default values for __fold__, __die__, __rules__
|
125
115
|
|
126
116
|
The Cant::Editable module gather methods to configure a Cant engine (fold, die, rules), and defaults to Cant module values
|
127
117
|
|
128
118
|
Inheritance
|
129
119
|
-----------
|
130
|
-
|
131
120
|
Cant support _basic_ inheritance functionality for configuration with the Cant::Embeddable module ...
|
132
121
|
Ouch what that means ?
|
133
122
|
|
@@ -139,7 +128,6 @@ Well, have a look at read documentation and source code embeddable.rb if you are
|
|
139
128
|
|
140
129
|
What is the arity of a __predicate__ function ?
|
141
130
|
-----------------------------------------------
|
142
|
-
|
143
131
|
You are free to pick one that suit your needs
|
144
132
|
|
145
133
|
There are a couple of things to drive your choice :
|
@@ -162,7 +150,6 @@ So pick your own semantic, or grow an existing one
|
|
162
150
|
|
163
151
|
How do I verify authorization ?
|
164
152
|
===============================
|
165
|
-
|
166
153
|
Cant very meaning is : you can unless you cant, and you define what you cant
|
167
154
|
|
168
155
|
Defining _not_ or _negative_ ability require some thinking, and I believe we can do it :)
|
@@ -171,34 +158,39 @@ Use __cant?__ method to check
|
|
171
158
|
|
172
159
|
Use __die\_if\_cant!__ method to check and run __die__ code
|
173
160
|
|
174
|
-
When you check, provide the list of parameters you specified in
|
161
|
+
When you check, provide the list of parameters you specified in the list of rules you want to verify
|
175
162
|
|
176
163
|
Inspired from
|
177
164
|
=============
|
178
|
-
|
179
165
|
* [cancan](https://github.com/ryanb/cancan), as I started with it and saw that it did not functioned in presence of mongoid as of < 1.5 ... so I planned to do something no dependent of a model implementation
|
180
166
|
|
181
|
-
* [learn you some erlang?](http://learnyousomeerlang.com/higher-order-functions#maps-filters-folds), for the fold illustrations
|
167
|
+
* [learn you some erlang?](http://learnyousomeerlang.com/higher-order-functions#maps-filters-folds), for the fold illustrations had great impact
|
182
168
|
|
183
169
|
* [Howard](http://rubyquiz.com/quiz67.html) and [Nunemaker](http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/) for inheritable class instance variables
|
184
170
|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
171
|
+
Does it work on my interpreter?
|
172
|
+
===============================
|
173
|
+
rspec
|
174
|
+
-----
|
189
175
|
specs are green on mri : [1.9.2-p0, 1.8.7-p302]
|
190
176
|
|
191
|
-
|
192
|
-
|
193
|
-
There is few lines of code as concept is simple : fold a list of functions...
|
177
|
+
There is few lines of code and concept is simple : fold a list of functions...
|
194
178
|
Though, we can make it better and lesser, cant we ?
|
195
179
|
|
180
|
+
1.9.2 coverage
|
181
|
+
--------------
|
182
|
+
can be ran with
|
183
|
+
|
184
|
+
COVERAGE=true rspec /spec
|
185
|
+
|
186
|
+
Licence
|
187
|
+
=======
|
188
|
+
Is MIT, available in source code
|
196
189
|
|
197
190
|
Help|Contribute
|
198
191
|
===============
|
199
|
-
|
200
192
|
Fill an item in tracker
|
201
193
|
|
202
194
|
Add a page on wiki
|
203
195
|
|
204
|
-
Add a spec, open a pull request on topic branch, commit granted on first accepted patch
|
196
|
+
Add a spec, open a pull request on topic branch, commit granted on first accepted patch
|
data/lib/cant/engine.rb
CHANGED
@@ -83,19 +83,29 @@ module Cant
|
|
83
83
|
|
84
84
|
# questionable interface
|
85
85
|
module Questionable
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
#
|
86
|
+
# Public : verify whether you cant
|
87
|
+
#
|
88
|
+
# *args - list of params to pass to rules
|
89
|
+
#
|
90
|
+
# Returns : a rule that cant, according rules folding, or nil
|
91
91
|
def cant?(*args)
|
92
92
|
cantfiguration.fold.call(cantfiguration.rules, self, *args)
|
93
93
|
end
|
94
|
-
#
|
94
|
+
# Public : run die code if you cant
|
95
|
+
#
|
96
|
+
# *args - list of params to pass to rules and die function
|
97
|
+
#
|
98
|
+
# Returns : die result or nil if it can
|
95
99
|
def die_if_cant!(*args)
|
96
100
|
rule = cant?(*args)
|
97
101
|
rule.die!(*args) if rule
|
98
102
|
end
|
103
|
+
|
104
|
+
attr_writer :cantfiguration
|
105
|
+
protected
|
106
|
+
def cantfiguration
|
107
|
+
@cantfiguration ||= Object.new.extend(Editable)
|
108
|
+
end
|
99
109
|
end
|
100
110
|
|
101
111
|
# standalone engine
|
@@ -112,8 +122,9 @@ module Cant
|
|
112
122
|
# - die(*args), that cant raise if convenient
|
113
123
|
#
|
114
124
|
# this class could have been:
|
115
|
-
# -spared
|
116
|
-
# -an Array, with an optional syntactic sugar
|
125
|
+
# - spared
|
126
|
+
# - an Array, with an optional syntactic sugar
|
127
|
+
# - a property list in erlang
|
117
128
|
class Rule
|
118
129
|
# a new rule with a predicate and response function
|
119
130
|
def initialize(predicate=nil, die=Cant.die)
|
data/lib/cant/version.rb
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
version: 0.2.
|
8
|
+
- 2
|
9
|
+
version: 0.2.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- thierry.henrio
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-01-
|
17
|
+
date: 2011-01-14 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -59,7 +59,7 @@ files:
|
|
59
59
|
- Gemfile
|
60
60
|
- Gemfile.lock
|
61
61
|
- Guardfile
|
62
|
-
- LICENSE
|
62
|
+
- MIT-LICENSE
|
63
63
|
- README.markdown
|
64
64
|
- Rakefile
|
65
65
|
- cant.gemspec
|