bali 1.0.0 → 1.1.0rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d3659e22b543ed6745c0ad17dcef288a207732cd
4
- data.tar.gz: ac39f8b6657b207d2d43e8acf8db06444e25d9f2
3
+ metadata.gz: 340aadebc55874ca95a0b864e0117d2d93e798c3
4
+ data.tar.gz: 7019bbc158e229ff267012ae472e6969fa03f5ef
5
5
  SHA512:
6
- metadata.gz: f1ccdb82747ee1fbc4231d7c920f515682730d143db26ae6f8c75eb7e7e593616f8298eac0e2a883cd05e197aba92c72049429e5e725b365654fec5be5f7f7eb
7
- data.tar.gz: b7f6f688501324e3766aba44d0e9e08e02a46d1c0663355b924ac694e218c7b1c762d39db04015d90f6de5968615183b178f10b316142f1f699bc44b0f1d505d
6
+ metadata.gz: 0a88ac2145d2c73d087b286e3046b30a839b50bb5564b2747b4a60822a571db72b5fe8de53d4eb7b97debb1f93b40a5220b2d4471bd6b696649d9440b112f879
7
+ data.tar.gz: 6be3dcc843c90c4c08e07303d863c7ae43550951980b1e28b86994c8432f26a1420011cd3efdccb494077cdac473360ba0654ca3bebe2e69c0e5340ab1581f42
data/.gitignore CHANGED
@@ -7,3 +7,8 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+
11
+ *.swp
12
+ *.swo
13
+ *.gemspec
14
+ *.gem
data/README.md CHANGED
@@ -43,6 +43,7 @@ Rule in Bali is the law determining whether a user (called `subtarget`) can do o
43
43
  describe "finance user" do
44
44
  can :update, :delete, :edit
45
45
  can :delete, if: proc { |record| record.is_settled? }
46
+ can :cancel, unless: proc { |record| record.is_settled? }
46
47
  end # finance_user description
47
48
  describe :guest { cant_all }
48
49
  describe nil { cant_all }
@@ -137,3 +138,9 @@ Bali is proudly available as open source under the terms of the [MIT License](ht
137
138
 
138
139
  #### Version 1.0.0
139
140
  1. Released the stable version of this gem
141
+
142
+ #### Version 1.1.0rc1
143
+ 1. Ability for rule class to be parsed later by parsing later: true to rule class definition
144
+ 2. Add `Bali.parse` and `Bali.parse!` (Bali.parse! executes "later"-tagged rule class, Bali.parse executes automatically after all rules are defined)
145
+ 3. Added more thorough testing specs
146
+ 4. Proc can be served under `unless` for defining the rule's decider
data/bali.gemspec CHANGED
@@ -23,5 +23,6 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "bundler", "~> 1.9"
24
24
  spec.add_development_dependency "rake", "~> 10.0"
25
25
  spec.add_development_dependency "rspec", "~> 3.3"
26
+ spec.add_development_dependency "pry"
26
27
 
27
28
  end
data/lib/bali.rb CHANGED
@@ -1,12 +1,20 @@
1
1
  require_relative "bali/version"
2
- require_relative "bali/rule_class"
3
- require_relative "bali/rule_group"
4
- require_relative "bali/rule"
2
+
3
+ # foundations, onto which good-purposed gem is developed upon
4
+ require_relative "bali/foundations/bali_statics"
5
+ require_relative "bali/foundations/rule_class"
6
+ require_relative "bali/foundations/rule_group"
7
+ require_relative "bali/foundations/rule"
8
+
9
+ # load the DSL syntax maker definition, ordered by proper order of invocation
10
+ require_relative "bali/dsl/map_rules_dsl.rb"
11
+ require_relative "bali/dsl/rules_for_dsl.rb"
5
12
 
6
13
  require_relative "bali/objector"
7
14
 
8
15
  # exception classes
9
16
  require_relative "bali/exceptions/dsl_error"
17
+
10
18
  module Bali
11
19
  # mapping class to a RuleClass
12
20
  RULE_CLASS_MAP = {}
@@ -18,177 +26,6 @@ module Bali
18
26
  REVERSE_ALIASED_RULE_CLASS_MAP = {}
19
27
  end
20
28
 
21
- module Bali
22
- extend self
23
-
24
- def rule_classes
25
- RULE_CLASS_MAP
26
- end
27
-
28
- def rule_class_for(target)
29
- if target.is_a?(Symbol)
30
- class_name = ALIASED_RULE_CLASS_MAP[target]
31
- return class_name.nil? ? nil : rule_class_for(class_name)
32
- else
33
- raise Bali::DslError, "Target must be a class" unless target.is_a?(Class)
34
- rule_class = RULE_CLASS_MAP[target.to_s]
35
- return rule_class.nil? ? nil : rule_class
36
- end
37
- end
38
-
39
- # attempt to search the rule group, but if not exist, will return nil
40
- def rule_group_for(target_class, subtarget)
41
- rule_class = Bali.rule_class_for(target_class)
42
- if rule_class
43
- rule_group = rule_class.rules_for(subtarget)
44
- return rule_group
45
- else
46
- return nil
47
- end
48
- end
49
-
50
- def add_rule_class(rule_class)
51
- if rule_class.is_a?(Bali::RuleClass)
52
- target = rule_class.target_class
53
- alias_target = rule_class.alias_name
54
-
55
- raise Bali::DslError, "Target must be a class" unless target.is_a?(Class)
56
-
57
- # remove any previous association of rule
58
- begin
59
- last_associated_alias = Bali::REVERSE_ALIASED_RULE_CLASS_MAP[target]
60
- if last_associated_alias
61
- Bali::ALIASED_RULE_CLASS_MAP.delete(last_associated_alias)
62
- Bali::REVERSE_ALIASED_RULE_CLASS_MAP.delete(target)
63
- Bali::RULE_CLASS_MAP.delete(target)
64
- end
65
- end
66
-
67
- # if "as" is present
68
- if alias_target.is_a?(Symbol)
69
- Bali::ALIASED_RULE_CLASS_MAP[alias_target] = target
70
- Bali::REVERSE_ALIASED_RULE_CLASS_MAP[target] = alias_target
71
- end
72
-
73
- Bali::RULE_CLASS_MAP[target.to_s] = rule_class
74
- rule_class
75
- else
76
- raise Bali::DslError, "Only allow instance of Bali::RuleClass"
77
- end
78
- end # add_rule_class
79
- end
80
-
81
- module Bali
82
- class Bali::MapRulesDsl
83
- attr_accessor :current_rule_class
84
-
85
- def initialize
86
- @@lock = Mutex.new
87
- end
88
-
89
- def rules_for(target_class, target_alias_hash = {}, &block)
90
- @@lock.synchronize do
91
- self.current_rule_class = Bali::RuleClass.new(target_class)
92
- self.current_rule_class.alias_name = target_alias_hash[:as] || target_alias_hash["as"]
93
-
94
- Bali::MapRulesRulesForDsl.new(self).instance_eval(&block)
95
-
96
- # done processing the block, now add the rule class
97
- Bali.add_rule_class(self.current_rule_class)
98
- end
99
- end
100
- end
101
- end
102
-
103
- module Bali
104
- class Bali::MapRulesRulesForDsl
105
- attr_accessor :map_rules_dsl
106
- attr_accessor :current_rule_group
107
-
108
- def initialize(map_rules_dsl)
109
- @@lock = Mutex.new
110
- self.map_rules_dsl = map_rules_dsl
111
- end
112
-
113
- def describe(subtarget, rules = {})
114
- target_class = self.map_rules_dsl.current_rule_class.target_class
115
- target_alias = self.map_rules_dsl.current_rule_class.alias_name
116
- @@lock.synchronize do
117
- rule_group = Bali::RuleGroup.new(target_class, target_alias, subtarget)
118
- self.current_rule_group = rule_group
119
-
120
- if block_given?
121
- the_object = Object.new
122
- # the_object would be the record, or the object of class as specified
123
- # in rules_for
124
- yield the_object
125
- else
126
- # auth_val is either can or cant
127
- rules.each do |auth_val, operations|
128
- if operations.is_a?(Array)
129
- operations.each do |op|
130
- rule = Bali::Rule.new(auth_val, op)
131
- rule_group.add_rule(rule)
132
- end
133
- else
134
- operation = operations # well, basically is 1 only
135
- rule = Bali::Rule.new(auth_val, operation)
136
- rule_group.add_rule(rule)
137
- end
138
- end # each rules
139
- end # block_given?
140
-
141
- # add current_rule_group
142
- self.map_rules_dsl.current_rule_class.add_rule_group(rule_group)
143
- end # mutex synchronize
144
- end # describe
145
-
146
-
147
- def process_auth_rules(auth_val, operations)
148
- conditional_hash = nil
149
-
150
- # scan opreation for hash
151
- operations.each do |elm|
152
- if elm.is_a?(Hash)
153
- conditional_hash = elm
154
- end
155
- end
156
-
157
- if conditional_hash
158
- op = operations[0]
159
- rule = Bali::Rule.new(auth_val, op)
160
- rule.decider = conditional_hash[:if] || conditional_hash["if"]
161
- self.current_rule_group.add_rule(rule)
162
- else
163
- # no conditional hash, proceed adding operations one by one
164
- operations.each do |op|
165
- rule = Bali::Rule.new(auth_val, op)
166
- self.current_rule_group.add_rule(rule)
167
- end
168
- end
169
- end # process_auth_rules
170
-
171
- def can(*operations)
172
- process_auth_rules(:can, operations)
173
- end
174
-
175
- def cant(*operations)
176
- process_auth_rules(:cant, operations)
177
- end
178
-
179
- def can_all
180
- self.current_rule_group.zeus = true
181
- self.current_rule_group.plant = false
182
- end
183
-
184
- def cant_all
185
- self.current_rule_group.plant = true
186
- self.current_rule_group.zeus = false
187
- end
188
-
189
- end # class
190
- end # module
191
-
192
29
  module Bali
193
30
  extend self
194
31
  def map_rules(&block)
@@ -0,0 +1,20 @@
1
+ # grand scheme of things begin here
2
+ class Bali::MapRulesDsl
3
+ attr_accessor :current_rule_class
4
+
5
+ def initialize
6
+ @@lock = Mutex.new
7
+ end
8
+
9
+ def rules_for(target_class, target_alias_hash = {}, &block)
10
+ @@lock.synchronize do
11
+ self.current_rule_class = Bali::RuleClass.new(target_class)
12
+ self.current_rule_class.alias_name = target_alias_hash[:as] || target_alias_hash["as"]
13
+
14
+ Bali::RulesForDsl.new(self).instance_eval(&block)
15
+
16
+ # done processing the block, now add the rule class
17
+ Bali.add_rule_class(self.current_rule_class)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,94 @@
1
+ # this class is used to define DSL after rules_for is invoked.
2
+ # @author Adam Pahlevi Baihaqi
3
+ class Bali::RulesForDsl
4
+ attr_accessor :map_rules_dsl
5
+ attr_accessor :current_rule_group
6
+
7
+ def initialize(map_rules_dsl)
8
+ @@lock = Mutex.new
9
+ self.map_rules_dsl = map_rules_dsl
10
+ end
11
+
12
+ def describe(subtarget, rules = {})
13
+ target_class = self.map_rules_dsl.current_rule_class.target_class
14
+ target_alias = self.map_rules_dsl.current_rule_class.alias_name
15
+
16
+ @@lock.synchronize do
17
+ rule_group = Bali::RuleGroup.new(target_class, target_alias, subtarget)
18
+ self.current_rule_group = rule_group
19
+
20
+ if block_given?
21
+ the_object = Object.new
22
+ # the_object would be the record, or the object of class as specified
23
+ # in rules_for
24
+ yield the_object
25
+ else
26
+ # auth_val is either can or cant
27
+ rules.each do |auth_val, operations|
28
+ if operations.is_a?(Array)
29
+ operations.each do |op|
30
+ rule = Bali::Rule.new(auth_val, op)
31
+ rule_group.add_rule(rule)
32
+ end
33
+ else
34
+ operation = operations # well, basically is 1 only
35
+ rule = Bali::Rule.new(auth_val, operation)
36
+ rule_group.add_rule(rule)
37
+ end
38
+ end # each rules
39
+ end # block_given?
40
+
41
+ # add current_rule_group
42
+ self.map_rules_dsl.current_rule_class.add_rule_group(rule_group)
43
+ end # mutex synchronize
44
+ end # describe
45
+
46
+ # to define can and cant is basically using this method
47
+ def process_auth_rules(auth_val, operations)
48
+ conditional_hash = nil
49
+
50
+ # scan operations for options
51
+ operations.each do |elm|
52
+ if elm.is_a?(Hash)
53
+ conditional_hash = elm
54
+ end
55
+ end
56
+
57
+ if conditional_hash
58
+ op = operations[0]
59
+ rule = Bali::Rule.new(auth_val, op)
60
+ if conditional_hash[:if] || conditional_hash["if"]
61
+ rule.decider = conditional_hash[:if] || conditional_hash["if"]
62
+ rule.decider_type = :if
63
+ elsif conditional_hash[:unless] || conditional_hash[:unless]
64
+ rule.decider = conditional_hash[:unless] || conditional_hash["unless"]
65
+ rule.decider_type = :unless
66
+ end
67
+ self.current_rule_group.add_rule(rule)
68
+ else
69
+ # no conditional hash, proceed adding operations one by one
70
+ operations.each do |op|
71
+ rule = Bali::Rule.new(auth_val, op)
72
+ self.current_rule_group.add_rule(rule)
73
+ end
74
+ end
75
+ end # process_auth_rules
76
+
77
+ def can(*operations)
78
+ process_auth_rules(:can, operations)
79
+ end
80
+
81
+ def cant(*operations)
82
+ process_auth_rules(:cant, operations)
83
+ end
84
+
85
+ def can_all
86
+ self.current_rule_group.zeus = true
87
+ self.current_rule_group.plant = false
88
+ end
89
+
90
+ def cant_all
91
+ self.current_rule_group.plant = true
92
+ self.current_rule_group.zeus = false
93
+ end
94
+ end # class
@@ -0,0 +1,59 @@
1
+ module Bali
2
+ extend self
3
+
4
+ def rule_classes
5
+ Bali::RULE_CLASS_MAP
6
+ end
7
+
8
+ def rule_class_for(target)
9
+ if target.is_a?(Symbol)
10
+ class_name = Bali::ALIASED_RULE_CLASS_MAP[target]
11
+ return class_name.nil? ? nil : rule_class_for(class_name)
12
+ else
13
+ raise Bali::DslError, "Target must be a class" unless target.is_a?(Class)
14
+ rule_class = Bali::RULE_CLASS_MAP[target.to_s]
15
+ return rule_class.nil? ? nil : rule_class
16
+ end
17
+ end
18
+
19
+ # attempt to search the rule group, but if not exist, will return nil
20
+ def rule_group_for(target_class, subtarget)
21
+ rule_class = Bali.rule_class_for(target_class)
22
+ if rule_class
23
+ rule_group = rule_class.rules_for(subtarget)
24
+ return rule_group
25
+ else
26
+ return nil
27
+ end
28
+ end
29
+
30
+ def add_rule_class(rule_class)
31
+ if rule_class.is_a?(Bali::RuleClass)
32
+ target = rule_class.target_class
33
+ alias_target = rule_class.alias_name
34
+
35
+ raise Bali::DslError, "Target must be a class" unless target.is_a?(Class)
36
+
37
+ # remove any previous association of rule
38
+ begin
39
+ last_associated_alias = Bali::REVERSE_ALIASED_RULE_CLASS_MAP[target]
40
+ if last_associated_alias
41
+ Bali::ALIASED_RULE_CLASS_MAP.delete(last_associated_alias)
42
+ Bali::REVERSE_ALIASED_RULE_CLASS_MAP.delete(target)
43
+ Bali::RULE_CLASS_MAP.delete(target)
44
+ end
45
+ end
46
+
47
+ # if "as" is present
48
+ if alias_target.is_a?(Symbol)
49
+ Bali::ALIASED_RULE_CLASS_MAP[alias_target] = target
50
+ Bali::REVERSE_ALIASED_RULE_CLASS_MAP[target] = alias_target
51
+ end
52
+
53
+ Bali::RULE_CLASS_MAP[target.to_s] = rule_class
54
+ rule_class
55
+ else
56
+ raise Bali::DslError, "Only allow instance of Bali::RuleClass"
57
+ end
58
+ end # add_rule_class
59
+ end
@@ -1,4 +1,4 @@
1
- # for internal use, representing rule
1
+ # for internal use, representing one, single, atomic rule
2
2
  class Bali::Rule
3
3
  # auth_val is either :can or :cant
4
4
  attr_reader :auth_val
@@ -8,6 +8,8 @@ class Bali::Rule
8
8
 
9
9
  # if decider is defined, a rule is executed only if decider evaluates to true
10
10
  attr_accessor :decider
11
+ # either unless or if
12
+ attr_reader :decider_type
11
13
 
12
14
  def initialize(auth_val, operation)
13
15
  self.auth_val = auth_val
@@ -23,11 +25,20 @@ class Bali::Rule
23
25
  end
24
26
  end
25
27
 
28
+ def decider_type=(dectype)
29
+ if dectype == :if || dectype == :unless
30
+ @decider_type = dectype
31
+ else
32
+ raise Bali::DslError, "decider type can only be either if or unless"
33
+ end
34
+ end
35
+
26
36
  def is_discouragement?
27
37
  self.auth_val == :cant
28
38
  end
29
39
 
30
40
  def has_decider?
41
+ raise Bali::DslError, "has decider but not sure if it is if or unless type decider" if self.decider.is_a?(Proc) && self.decider_type.nil?
31
42
  self.decider.is_a?(Proc)
32
43
  end
33
44
  end
data/lib/bali/objector.rb CHANGED
@@ -10,12 +10,12 @@ module Bali::Objector
10
10
  end
11
11
 
12
12
  def cant?(subtarget, operation)
13
- self.class.can?(subtarget, operation, self)
13
+ self.class.cant?(subtarget, operation, self)
14
14
  end
15
15
  end
16
16
 
17
17
  module Bali::Objector::Statics
18
- def can?(subtarget, operation, record = self)
18
+ def can?(subtarget, operation, record = self, options = {})
19
19
  # if performed on a class-level, don't call its class or it will return
20
20
  # Class. That's not what is expected.
21
21
  if self.is_a?(Class)
@@ -31,31 +31,46 @@ module Bali::Objector::Statics
31
31
  # get the specific rule
32
32
  rule = rule_group.get_rule(:can, operation)
33
33
 
34
- # godly subtarget is allowed to do as he wishes
35
- # so long that the rule is not specificly defined
36
- return true if rule_group.zeus? && rule.nil?
37
-
38
34
  # plan subtarget is not allowed unless spesificly defined
39
35
  return false if rule_group.plant? && rule.nil?
40
36
 
41
- # default to false when asked about can? but no rule to be found
42
- return false if rule.nil?
43
-
44
- if rule.has_decider?
45
- # must test first
46
- decider = rule.decider
47
- if decider.arity == 0
48
- decider.() == true
49
- else
50
- decider.(record) == true
37
+ # godly subtarget is allowed to do as he wishes
38
+ # so long that the rule is not specificly defined
39
+ # or overwritten by subsequent rule
40
+ if rule_group.zeus?
41
+ if rule.nil?
42
+ # check further whether cant is defined to overwrite this can_all
43
+ if self.cant?(subtarget, operation, record, cross_check: true)
44
+ return false
45
+ else
46
+ return true
47
+ end
51
48
  end
49
+ end
50
+
51
+ if rule.nil?
52
+ # default if can? for undefined rule is false, after related clause
53
+ # cannot be found in cant?
54
+ return false if options[:cross_check]
55
+ return !self.cant?(subtarget, operation, record, cross_check: true)
52
56
  else
53
- # rule is properly defined
54
- return true
57
+ if rule.has_decider?
58
+ # must test first
59
+ decider = rule.decider
60
+ if decider.arity == 0
61
+ return (rule.decider_type == :if) ? decider.() == true : decider.() == false
62
+ else
63
+ return (rule.decider_type == :if) ? decider.(record) == true : decider.(record) == false
64
+ end
65
+ else
66
+ # rule is properly defined
67
+ return true
68
+ end
55
69
  end
70
+
56
71
  end
57
72
 
58
- def cant?(subtarget, operation, record = self)
73
+ def cant?(subtarget, operation, record = self, options = {})
59
74
  if self.is_a?(Class)
60
75
  rule_group = Bali.rule_group_for(self, subtarget)
61
76
  else
@@ -73,18 +88,35 @@ module Bali::Objector::Statics
73
88
  return false if rule_group.zeus? && rule.nil?
74
89
 
75
90
  # plant subtarget is not allowed to do things unless specificly defined
76
- return true if rule_group.plant? && rule.nil?
77
-
78
- # default to true when asked about cant? but no rule to be found
79
- return true if rule.nil?
80
-
81
- if rule.has_decider?
82
- decider = rule.decider
83
- if decider.arity == 0
84
- decider.() == true
85
- else
86
- decider.(record) == true
91
+ if rule_group.plant?
92
+ if rule.nil?
93
+ # check further whether defined in can?
94
+ if self.can?(subtarget, operation, record, cross_check: true)
95
+ return false # well, it is defined in can, so it must overwrite this cant_all rule
96
+ else
97
+ # plant, and then rule is not defined for further inspection. stright
98
+ # is not allowed to do this thing
99
+ return true
100
+ end
87
101
  end
88
102
  end
103
+
104
+ # if rule cannot be found, then true is returned for cant? unless
105
+ # can? is defined exactly for the same target, and subtarget, and record (if given)
106
+ if rule.nil?
107
+ return true if options[:cross_check]
108
+ return !self.can?(subtarget, operation, record, cross_check: true)
109
+ else
110
+ if rule.has_decider?
111
+ decider = rule.decider
112
+ if decider.arity == 0
113
+ return (rule.decider_type == :if) ? decider.() == true : decider.() == false
114
+ else
115
+ return (rule.decider_type == :if) ? decider.(record) == true : decider.(record) == false
116
+ end
117
+ else
118
+ return true # rule is properly defined
119
+ end # if rule has decider
120
+ end # if rule is nil
89
121
  end
90
122
  end
data/lib/bali/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Bali
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0rc1"
3
3
  end
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.0
4
+ version: 1.1.0rc1
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-20 00:00:00.000000000 Z
11
+ date: 2015-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: "Bali (Bulwark Authorization Library) is a universal authorization library,
56
70
  in the sense that \n it does not assume you to use specific
57
71
  Ruby library/gem/framework."
@@ -73,11 +87,14 @@ files:
73
87
  - bin/console
74
88
  - bin/setup
75
89
  - lib/bali.rb
90
+ - lib/bali/dsl/map_rules_dsl.rb
91
+ - lib/bali/dsl/rules_for_dsl.rb
76
92
  - lib/bali/exceptions/dsl_error.rb
93
+ - lib/bali/foundations/bali_statics.rb
94
+ - lib/bali/foundations/rule.rb
95
+ - lib/bali/foundations/rule_class.rb
96
+ - lib/bali/foundations/rule_group.rb
77
97
  - lib/bali/objector.rb
78
- - lib/bali/rule.rb
79
- - lib/bali/rule_class.rb
80
- - lib/bali/rule_group.rb
81
98
  - lib/bali/version.rb
82
99
  homepage: https://github.com/saveav/bali
83
100
  licenses:
@@ -94,9 +111,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
94
111
  version: '0'
95
112
  required_rubygems_version: !ruby/object:Gem::Requirement
96
113
  requirements:
97
- - - ">="
114
+ - - ">"
98
115
  - !ruby/object:Gem::Version
99
- version: '0'
116
+ version: 1.3.1
100
117
  requirements: []
101
118
  rubyforge_project:
102
119
  rubygems_version: 2.4.5