cant 0.2.1 → 0.2.2
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.
- 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
|