bali 1.0.0rc2 → 1.0.0rc3
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/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
|