bali 1.0.0rc2 → 1.0.0rc3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +35 -11
- data/lib/bali.rb +9 -10
- data/lib/bali/objector.rb +9 -0
- data/lib/bali/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 724bb6eef32c67456ef17908c706056bbe650894
|
4
|
+
data.tar.gz: 7db4ffe4112029cf64d89b693f3bb365e720122c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 994dcb6cb86ceba1e4086ba713bf10fe62fb7987e5ba82e63a05f90600c22a4d70ce742a7c52cb39715d6864cad833f565ad079c509a014097c2c8fb2e82fe95
|
7
|
+
data.tar.gz: f3aa272ed470a2ee72d476643f728b5bc8a5e06957ddb306b487ab572710468f5a53f82f70f5ec8c522fad5b5757cd4fe5f14a5dd02ec83cb723e288c4e43dc8
|
data/README.md
CHANGED
@@ -58,40 +58,56 @@ Say:
|
|
58
58
|
|
59
59
|
```ruby
|
60
60
|
class My::Transaction
|
61
|
+
include Bali::Objector
|
62
|
+
|
61
63
|
attr_accessor :is_settled
|
62
64
|
attr_accessor :payment_channel
|
63
65
|
|
64
66
|
alias :is_settled? :is_settled
|
65
67
|
end
|
68
|
+
|
69
|
+
class My::Employee
|
70
|
+
include Bali::Objector
|
71
|
+
|
72
|
+
# working experience in the company
|
73
|
+
attr_accessor :exp_years
|
74
|
+
end
|
66
75
|
```
|
67
76
|
|
68
77
|
Assuming that there exist a variable `transaction` which is an instance of `My::Transaction`, we can query about whether the subtarget is granted to perform certain operation:
|
69
78
|
|
70
79
|
```ruby
|
71
|
-
transaction.cant?(:general_user, :delete)
|
72
|
-
transaction.can("general user", :update)
|
73
|
-
transaction.can?(:finance_user, :delete)
|
74
|
-
transaction.can?(:monitoring_user, :view)
|
75
|
-
transaction.can?("monitoring user", :view)
|
76
|
-
transaction.can?(:admin_user, :cancel)
|
77
|
-
transaction.can?(:supreme_user, :cancel)
|
78
|
-
transaction.can?(:guest, :view)
|
80
|
+
transaction.cant?(:general_user, :delete) # => true
|
81
|
+
transaction.can("general user", :update) # => true
|
82
|
+
transaction.can?(:finance_user, :delete) # depend on context
|
83
|
+
transaction.can?(:monitoring_user, :view) # => true
|
84
|
+
transaction.can?("monitoring user", :view) # => true
|
85
|
+
transaction.can?(:admin_user, :cancel) # depend on context
|
86
|
+
transaction.can?(:supreme_user, :cancel) # => true
|
87
|
+
transaction.can?(:guest, :view) # => false
|
88
|
+
transaction.can?(:undefined_subtarget, :see) # => false
|
89
|
+
transaction.cant?(:undefined_subtarget, :new) # => true
|
79
90
|
```
|
80
91
|
|
81
92
|
If a rule is depending on a certain context, then the context will be evaluated to determine whether the subtarget is authorized or not.
|
82
93
|
|
83
94
|
In the above example, deletion of `transaction` is only allowed if the subtarget is a "finance user" and, the `transaction` itself is already settled.
|
84
95
|
|
85
|
-
|
96
|
+
Also, asking `can?` on which the subtarget is not yet defined will always return `false`. In the example above, as `undefined_subtarget` is by itself has never been defined in `describe` under `My::Transaction` rule class, `can?` for `undefined_subtarget` will always return `false`. But, `cant` on simillar ocassion will return `true`.
|
97
|
+
|
98
|
+
Rule can also be tested on a class:
|
86
99
|
|
87
100
|
```ruby
|
88
101
|
My::Transaction.can?(:supreme_user, :new) # => true
|
89
102
|
My::Transaction.can?(:guest, :view) # => false
|
103
|
+
My::Employee.can?(:undefined_subtarget, :new) # => false, rule class for this is by its own undefined
|
90
104
|
```
|
91
105
|
|
106
|
+
As we have never define the `rules_for` My::Employee before, any attempt to `can?` for `My::Employee` will return `false`, so does any attempt to object `cant?` on which will only return `true` for any given subtarget and operation.
|
107
|
+
|
92
108
|
## Contributing
|
93
109
|
|
94
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
110
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/saveav/bali. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
|
95
111
|
|
96
112
|
|
97
113
|
## License
|
@@ -110,4 +126,12 @@ The gem is available as open source under the terms of the [MIT License](http://
|
|
110
126
|
#### Version 1.0.0rc2
|
111
127
|
1. [Fix bug when class's name, as a constant, is reloaded](http://stackoverflow.com/questions/2509350/rails-class-object-id-changes-after-i-make-a-request) (re-allocated to different address in the memory)
|
112
128
|
2. Allow describing rule for `nil`, useful if user is not authenticated thus role is probably `nil`
|
113
|
-
3. Remove pry from development dependency
|
129
|
+
3. Remove pry from development dependency
|
130
|
+
|
131
|
+
#### Version 1.0.0rc3
|
132
|
+
1. Each target class should includes `Bali::Objector`, for the following reasons:
|
133
|
+
- Makes it clear that class do want to include the Bali::Objector
|
134
|
+
- Transparant, and thus less confusing as to where "can?" and "cant" come from
|
135
|
+
- When ruby re-parse the class's codes for any reasons, parser will be for sure include Bali::Objector
|
136
|
+
2. Return `true` to any `can?` for undefined target/subtarget alike
|
137
|
+
3. Return `false` to any `cant?` for undefined target/subtarget alike
|
data/lib/bali.rb
CHANGED
@@ -28,22 +28,23 @@ module Bali
|
|
28
28
|
def rule_class_for(target)
|
29
29
|
if target.is_a?(Symbol)
|
30
30
|
class_name = ALIASED_RULE_CLASS_MAP[target]
|
31
|
-
|
32
|
-
|
33
|
-
rule_class_for(class_name)
|
31
|
+
return class_name.nil? ? nil : rule_class_for(class_name)
|
34
32
|
else
|
35
33
|
raise Bali::DslError, "Target must be a class" unless target.is_a?(Class)
|
36
34
|
rule_class = RULE_CLASS_MAP[target.to_s]
|
37
|
-
|
38
|
-
rule_class
|
35
|
+
return rule_class.nil? ? nil : rule_class
|
39
36
|
end
|
40
37
|
end
|
41
38
|
|
39
|
+
# attempt to search the rule group, but if not exist, will return nil
|
42
40
|
def rule_group_for(target_class, subtarget)
|
43
41
|
rule_class = Bali.rule_class_for(target_class)
|
44
|
-
|
45
|
-
|
46
|
-
|
42
|
+
if rule_class
|
43
|
+
rule_group = rule_class.rules_for(subtarget)
|
44
|
+
return rule_group
|
45
|
+
else
|
46
|
+
return nil
|
47
|
+
end
|
47
48
|
end
|
48
49
|
|
49
50
|
def add_rule_class(rule_class)
|
@@ -94,8 +95,6 @@ module Bali
|
|
94
95
|
|
95
96
|
# done processing the block, now add the rule class
|
96
97
|
Bali.add_rule_class(self.current_rule_class)
|
97
|
-
|
98
|
-
target_class.include(Bali::Objector) unless target_class.include?(Bali::Objector)
|
99
98
|
end
|
100
99
|
end
|
101
100
|
end
|
data/lib/bali/objector.rb
CHANGED
@@ -24,6 +24,11 @@ module Bali::Objector::Statics
|
|
24
24
|
rule_group = Bali.rule_group_for(self.class, subtarget)
|
25
25
|
end
|
26
26
|
|
27
|
+
# default of can? is false whenever RuleClass for that class is undefined
|
28
|
+
# or RuleGroup for that subtarget is not defined
|
29
|
+
return false if rule_group.nil?
|
30
|
+
|
31
|
+
# get the specific rule
|
27
32
|
rule = rule_group.get_rule(:can, operation)
|
28
33
|
|
29
34
|
# godly subtarget is allowed to do as he wishes
|
@@ -57,6 +62,10 @@ module Bali::Objector::Statics
|
|
57
62
|
rule_group = Bali.rule_group_for(self.class, subtarget)
|
58
63
|
end
|
59
64
|
|
65
|
+
# default of cant? is true whenever RuleClass for that class is undefined
|
66
|
+
# or RuleGroup for that subtarget is not defined
|
67
|
+
return true if rule_group.nil?
|
68
|
+
|
60
69
|
rule = rule_group.get_rule(:cant, operation)
|
61
70
|
|
62
71
|
# godly subtarget is not to be prohibited in his endeavours
|
data/lib/bali/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bali
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.0rc3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Pahlevi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|