bali 2.4.0 → 6.0.0rc1

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.
Files changed (41) hide show
  1. checksums.yaml +5 -13
  2. data/.rspec +1 -0
  3. data/lib/bali.rb +23 -14
  4. data/lib/bali/activerecord.rb +8 -0
  5. data/lib/bali/authorizer.rb +24 -0
  6. data/lib/bali/config.rb +12 -0
  7. data/lib/bali/dsl_error.rb +3 -0
  8. data/lib/bali/{foundations/exceptions/bali_error.rb → error.rb} +0 -0
  9. data/lib/bali/judge.rb +239 -0
  10. data/lib/bali/printer.rb +16 -26
  11. data/lib/bali/railtie.rb +13 -0
  12. data/lib/bali/role.rb +79 -0
  13. data/lib/bali/rule.rb +17 -0
  14. data/lib/bali/ruler.rb +36 -0
  15. data/lib/bali/rules.rb +68 -0
  16. data/lib/bali/tasks/bali/print_rules.rake +9 -0
  17. data/lib/bali/version.rb +1 -1
  18. data/lib/generators/rails/USAGE +8 -0
  19. data/lib/generators/rails/rules_generator.rb +17 -0
  20. data/lib/generators/rails/templates/rules.rb +4 -0
  21. data/lib/generators/rspec/rules_generator.rb +12 -0
  22. data/lib/generators/rspec/templates/rules_spec.rb +7 -0
  23. metadata +104 -47
  24. data/lib/bali/dsl/map_rules_dsl.rb +0 -75
  25. data/lib/bali/dsl/rules_for_dsl.rb +0 -130
  26. data/lib/bali/foundations/all_foundations.rb +0 -17
  27. data/lib/bali/foundations/exceptions/authorization_error.rb +0 -38
  28. data/lib/bali/foundations/exceptions/dsl_error.rb +0 -3
  29. data/lib/bali/foundations/exceptions/objection_error.rb +0 -3
  30. data/lib/bali/foundations/judger/judge.rb +0 -329
  31. data/lib/bali/foundations/judger/negative_judge.rb +0 -40
  32. data/lib/bali/foundations/judger/positive_judge.rb +0 -41
  33. data/lib/bali/foundations/role_extractor.rb +0 -61
  34. data/lib/bali/foundations/rule/rule.rb +0 -55
  35. data/lib/bali/foundations/rule/rule_class.rb +0 -54
  36. data/lib/bali/foundations/rule/rule_group.rb +0 -91
  37. data/lib/bali/integrators/all_integrators.rb +0 -8
  38. data/lib/bali/integrators/rule_class_integrator.rb +0 -27
  39. data/lib/bali/integrators/rule_group_integrator.rb +0 -29
  40. data/lib/bali/integrators/rule_integrator.rb +0 -56
  41. data/lib/bali/objector.rb +0 -173
@@ -0,0 +1,79 @@
1
+ class Bali::Role
2
+ RIGHTS = [
3
+ INHERIT = :inherit,
4
+ DEFAULT_DENY = :default_deny,
5
+ DEFAULT_ALLOW = :default_allow
6
+ ].freeze
7
+
8
+ attr_accessor :subtarget
9
+ attr_accessor :cans, :cants
10
+
11
+ attr_accessor :can_all
12
+ alias :can_all? :can_all
13
+
14
+ attr_accessor :right_level
15
+
16
+ def self.formalize(object)
17
+ case object
18
+ when String then [object]
19
+ when Symbol then [object]
20
+ when NilClass then [object]
21
+ when Array then object
22
+ else
23
+ kls_name = object.class.to_s
24
+ method_name = Bali::TRANSLATED_SUBTARGET_ROLES[kls_name]
25
+ roles = method_name ? formalize(object.send(method_name)) : formalize(nil)
26
+
27
+ roles
28
+ end
29
+ end
30
+
31
+ def initialize(subtarget)
32
+ @subtarget = subtarget&.to_sym
33
+ @right_level = INHERIT
34
+
35
+ @cans = {}
36
+ @cants = {}
37
+ end
38
+
39
+ def can_all?
40
+ right_level == DEFAULT_ALLOW
41
+ end
42
+
43
+ def cant_all?
44
+ right_level == DEFAULT_DENY
45
+ end
46
+
47
+ def can_all=(bool)
48
+ case bool
49
+ when true then @right_level = DEFAULT_ALLOW
50
+ else @right_level = DEFAULT_DENY
51
+ end
52
+ end
53
+
54
+ def << rule
55
+ # operation cant be defined twice
56
+ operation = rule.operation.to_sym
57
+
58
+ return if cants[operation] && cans[operation]
59
+
60
+ if rule.term == :cant
61
+ cants[operation] = rule
62
+ cans.delete operation
63
+ else
64
+ cans[operation] = rule
65
+ cants.delete operation
66
+ end
67
+ end
68
+
69
+ def find_rule(term, operation)
70
+ case term
71
+ when :can then cans[operation.to_sym]
72
+ when :cant then cants[operation.to_sym]
73
+ end
74
+ end
75
+
76
+ def rules
77
+ cans.values + cants.values
78
+ end
79
+ end
@@ -0,0 +1,17 @@
1
+ # This class represents a rule.
2
+ # can :delete
3
+ # A rule can also contains conditional part
4
+ class Bali::Rule
5
+ attr_reader :term
6
+ attr_reader :operation
7
+ attr_accessor :conditional
8
+
9
+ def initialize(term, operation)
10
+ @term = term
11
+ @operation = operation
12
+ end
13
+
14
+ def conditional?
15
+ @is_conditional ||= !!conditional
16
+ end
17
+ end
@@ -0,0 +1,36 @@
1
+ # This class represents all roles, and its rules, for a resource
2
+ class Bali::Ruler
3
+ attr_reader :model_class
4
+ attr_accessor :roles
5
+
6
+ private :model_class
7
+
8
+ def self.for(record_class)
9
+ rule_class = Bali::RULE_CLASS_MAP[record_class.to_s]
10
+
11
+ if rule_class.nil?
12
+ rule_class_maker_str = record_class.to_s + Bali.config.suffix
13
+ rule_class_maker = rule_class_maker_str.safe_constantize
14
+
15
+ if rule_class_maker && rule_class_maker.ancestors.include?(Bali::Rules)
16
+ rule_class = rule_class_maker.ruler
17
+ Bali::RULE_CLASS_MAP[record_class.to_s] = rule_class
18
+ end
19
+ end
20
+
21
+ rule_class
22
+ end
23
+
24
+ def initialize(model_class)
25
+ @model_class = model_class
26
+ @roles = {}
27
+ end
28
+
29
+ def << role
30
+ @roles[role.subtarget] = role
31
+ end
32
+
33
+ def [] role
34
+ @roles[role&.to_sym]
35
+ end
36
+ end
@@ -0,0 +1,68 @@
1
+ class Bali::Rules
2
+ class << self
3
+ attr_writer :current_role
4
+ attr_reader :ruler
5
+ end
6
+
7
+ def self.model_class
8
+ class_name = to_s
9
+ suffix = Bali.config.suffix
10
+ rule_class_maker_str = class_name[0...class_name.length - suffix.length]
11
+ rule_class_maker_str.constantize
12
+ end
13
+
14
+ def self.can(*args, &block)
15
+ add :can, *args, block
16
+ end
17
+
18
+ def self.cant(*args, &block)
19
+ add :cant, *args, block
20
+ end
21
+
22
+ def self.cant_all(*args)
23
+ current_role.can_all = false
24
+ end
25
+
26
+ def self.can_all(*args)
27
+ current_role.can_all = true
28
+ end
29
+
30
+ def self.role(*roles)
31
+ roles.each do |role|
32
+ if Symbol === role || String === role || NilClass === role
33
+ set_role role
34
+ yield
35
+ else
36
+ raise Bali::DslError, "Cannot define role using #{param.class}. " +
37
+ "Please use either a Symbol, a String or nil"
38
+ end
39
+ end
40
+ end
41
+
42
+ def self.current_role
43
+ @current_role ||= set_role nil
44
+ end
45
+
46
+ def self.ruler
47
+ @ruler ||= begin
48
+ rule_class = Bali::Ruler.new(model_class)
49
+ Bali::RULE_CLASS_MAP[model_class.to_s] = rule_class
50
+ rule_class
51
+ end
52
+ end
53
+
54
+ def self.set_role(role)
55
+ role = ruler[role] || Bali::Role.new(role)
56
+ ruler << role
57
+ @current_role = role
58
+ end
59
+
60
+ def self.add(term, *operations, block)
61
+ operations.each do |operation|
62
+ rule = Bali::Rule.new(term, operation)
63
+ rule.conditional = block if block
64
+ current_role << rule
65
+ end
66
+ end
67
+
68
+ end
@@ -0,0 +1,9 @@
1
+ namespace :bali do
2
+ desc "Print all rules nicely"
3
+ task print_rules: :environment do
4
+ rules_path = Bali.config.rules_path
5
+ Dir.glob("#{rules_path}/**/*.rb").each { |f| load f }
6
+
7
+ $stdout.puts Bali::Printer.pretty_print
8
+ end
9
+ end
@@ -1,3 +1,3 @@
1
1
  module Bali
2
- VERSION = "2.4.0"
2
+ VERSION = "6.0.0rc1"
3
3
  end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Stubs out a rule class in app/rules directory.
3
+
4
+ Examples:
5
+ `rails g rules book`
6
+
7
+ This creates:
8
+ app/rules/book_rules.rb
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rails
4
+ module Generators
5
+ class RulesGenerator < NamedBase
6
+ source_root File.expand_path("templates", __dir__)
7
+ check_class_collision suffix: Bali.config.suffix
8
+
9
+ def create_decorator_file
10
+ template "rules.rb",
11
+ File.join(Bali.config.rules_path, "#{file_name}_#{Bali.config.suffix.downcase}.rb")
12
+ end
13
+
14
+ hook_for :test_framework
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_name %><%= Bali.config.suffix %> < Bali::Rules
4
+ end
@@ -0,0 +1,12 @@
1
+ module Rspec
2
+ module Generators
3
+ class RulesGenerator < ::Rails::Generators::NamedBase
4
+ source_root File.expand_path("templates", __dir__)
5
+
6
+ def create_spec_file
7
+ template "rules_spec.rb",
8
+ File.join("spec/rules", class_path, "#{file_name}_#{Bali.config.suffix.downcase}_spec.rb")
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require '<%= File.exists?('spec/rails_helper.rb') ? 'rails_helper' : 'spec_helper' %>'
4
+
5
+ RSpec.describe <%= class_name %><%= Bali.config.suffix %> do
6
+
7
+ end
metadata CHANGED
@@ -1,97 +1,156 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bali
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0
4
+ version: 6.0.0rc1
5
5
  platform: ruby
6
6
  authors:
7
- - Adam Pahlevi
7
+ - Adam Notodikromo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-03-01 00:00:00.000000000 Z
11
+ date: 2020-04-26 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: zeitwerk
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: '2.2'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '2'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '2.2'
33
+ - !ruby/object:Gem::Dependency
34
+ name: rails
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 5.0.0
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 5.0.0
13
47
  - !ruby/object:Gem::Dependency
14
48
  name: bundler
15
49
  requirement: !ruby/object:Gem::Requirement
16
50
  requirements:
17
- - - ~>
51
+ - - ">="
18
52
  - !ruby/object:Gem::Version
19
- version: '1.9'
53
+ version: '0'
20
54
  type: :development
21
55
  prerelease: false
22
56
  version_requirements: !ruby/object:Gem::Requirement
23
57
  requirements:
24
- - - ~>
58
+ - - ">="
25
59
  - !ruby/object:Gem::Version
26
- version: '1.9'
60
+ version: '0'
27
61
  - !ruby/object:Gem::Dependency
28
62
  name: rake
29
63
  requirement: !ruby/object:Gem::Requirement
30
64
  requirements:
31
- - - ~>
65
+ - - "~>"
32
66
  - !ruby/object:Gem::Version
33
67
  version: '10.0'
34
68
  type: :development
35
69
  prerelease: false
36
70
  version_requirements: !ruby/object:Gem::Requirement
37
71
  requirements:
38
- - - ~>
72
+ - - "~>"
39
73
  - !ruby/object:Gem::Version
40
74
  version: '10.0'
41
75
  - !ruby/object:Gem::Dependency
42
76
  name: rspec
43
77
  requirement: !ruby/object:Gem::Requirement
44
78
  requirements:
45
- - - ~>
79
+ - - "~>"
46
80
  - !ruby/object:Gem::Version
47
- version: '3.3'
81
+ version: '3.9'
48
82
  type: :development
49
83
  prerelease: false
50
84
  version_requirements: !ruby/object:Gem::Requirement
51
85
  requirements:
52
- - - ~>
86
+ - - "~>"
53
87
  - !ruby/object:Gem::Version
54
- version: '3.3'
55
- description: ! "Bali (Bulwark Authorization Library) is a universal authorization
56
- library, in the sense that \n it does not assume you to
57
- use specific Ruby library/gem/framework."
88
+ version: '3.9'
89
+ - !ruby/object:Gem::Dependency
90
+ name: pry-byebug
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: simplecov
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ description: Bali (Bulwark Authorization Library) is a to-the-point authorization
118
+ library for Rails.
58
119
  email:
59
- - adam.pahlevi@gmail.com
120
+ - abaihaqi@acm.org
60
121
  executables: []
61
122
  extensions: []
62
123
  extra_rdoc_files: []
63
124
  files:
64
- - .gitignore
65
- - .rspec
66
- - .travis.yml
125
+ - ".gitignore"
126
+ - ".rspec"
127
+ - ".travis.yml"
67
128
  - Gemfile
68
129
  - Rakefile
69
130
  - bali.gemspec
70
131
  - bin/console
71
132
  - bin/setup
72
133
  - lib/bali.rb
73
- - lib/bali/dsl/map_rules_dsl.rb
74
- - lib/bali/dsl/rules_for_dsl.rb
75
- - lib/bali/foundations/all_foundations.rb
76
- - lib/bali/foundations/exceptions/authorization_error.rb
77
- - lib/bali/foundations/exceptions/bali_error.rb
78
- - lib/bali/foundations/exceptions/dsl_error.rb
79
- - lib/bali/foundations/exceptions/objection_error.rb
80
- - lib/bali/foundations/judger/judge.rb
81
- - lib/bali/foundations/judger/negative_judge.rb
82
- - lib/bali/foundations/judger/positive_judge.rb
83
- - lib/bali/foundations/role_extractor.rb
84
- - lib/bali/foundations/rule/rule.rb
85
- - lib/bali/foundations/rule/rule_class.rb
86
- - lib/bali/foundations/rule/rule_group.rb
87
- - lib/bali/integrators/all_integrators.rb
88
- - lib/bali/integrators/rule_class_integrator.rb
89
- - lib/bali/integrators/rule_group_integrator.rb
90
- - lib/bali/integrators/rule_integrator.rb
91
- - lib/bali/objector.rb
134
+ - lib/bali/activerecord.rb
135
+ - lib/bali/authorizer.rb
136
+ - lib/bali/config.rb
137
+ - lib/bali/dsl_error.rb
138
+ - lib/bali/error.rb
139
+ - lib/bali/judge.rb
92
140
  - lib/bali/printer.rb
141
+ - lib/bali/railtie.rb
142
+ - lib/bali/role.rb
143
+ - lib/bali/rule.rb
144
+ - lib/bali/ruler.rb
145
+ - lib/bali/rules.rb
146
+ - lib/bali/tasks/bali/print_rules.rake
93
147
  - lib/bali/version.rb
94
- homepage: https://github.com/saveav/bali
148
+ - lib/generators/rails/USAGE
149
+ - lib/generators/rails/rules_generator.rb
150
+ - lib/generators/rails/templates/rules.rb
151
+ - lib/generators/rspec/rules_generator.rb
152
+ - lib/generators/rspec/templates/rules_spec.rb
153
+ homepage: https://github.com/adamnoto/bali
95
154
  licenses:
96
155
  - MIT
97
156
  metadata: {}
@@ -101,19 +160,17 @@ require_paths:
101
160
  - lib
102
161
  required_ruby_version: !ruby/object:Gem::Requirement
103
162
  requirements:
104
- - - ! '>='
163
+ - - ">="
105
164
  - !ruby/object:Gem::Version
106
165
  version: '0'
107
166
  required_rubygems_version: !ruby/object:Gem::Requirement
108
167
  requirements:
109
- - - ! '>='
168
+ - - ">"
110
169
  - !ruby/object:Gem::Version
111
- version: '0'
170
+ version: 1.3.1
112
171
  requirements: []
113
- rubyforge_project:
114
- rubygems_version: 2.4.8
172
+ rubygems_version: 3.0.3
115
173
  signing_key:
116
174
  specification_version: 4
117
- summary: Bali is a powerful, framework-agnostic, thread-safe Ruby language authorization
118
- library
175
+ summary: A to-the-point authorization library for Rails
119
176
  test_files: []