ruby-rego 0.1.0
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 +7 -0
- data/.reek.yml +80 -0
- data/.vscode/extensions.json +19 -0
- data/.vscode/launch.json +35 -0
- data/.vscode/settings.json +25 -0
- data/.vscode/tasks.json +117 -0
- data/.yardopts +12 -0
- data/ARCHITECTURE.md +39 -0
- data/CHANGELOG.md +25 -0
- data/CODE_OF_CONDUCT.md +10 -0
- data/LICENSE.txt +21 -0
- data/README.md +183 -0
- data/RELEASING.md +37 -0
- data/Rakefile +38 -0
- data/SECURITY.md +26 -0
- data/Steepfile +10 -0
- data/TODO.md +35 -0
- data/benchmark/builtin_calls.rb +29 -0
- data/benchmark/complex_policy.rb +19 -0
- data/benchmark/comprehensions.rb +19 -0
- data/benchmark/simple_rules.rb +20 -0
- data/examples/README.md +27 -0
- data/examples/sample_config.yaml +2 -0
- data/examples/simple_policy.rego +7 -0
- data/examples/validation_policy.rego +11 -0
- data/exe/rego-validate +6 -0
- data/lib/ruby/rego/ast/base.rb +95 -0
- data/lib/ruby/rego/ast/binary_op.rb +64 -0
- data/lib/ruby/rego/ast/call.rb +27 -0
- data/lib/ruby/rego/ast/composite.rb +48 -0
- data/lib/ruby/rego/ast/comprehension.rb +63 -0
- data/lib/ruby/rego/ast/every.rb +37 -0
- data/lib/ruby/rego/ast/import.rb +32 -0
- data/lib/ruby/rego/ast/literal.rb +70 -0
- data/lib/ruby/rego/ast/module.rb +32 -0
- data/lib/ruby/rego/ast/package.rb +22 -0
- data/lib/ruby/rego/ast/query.rb +63 -0
- data/lib/ruby/rego/ast/reference.rb +58 -0
- data/lib/ruby/rego/ast/rule.rb +114 -0
- data/lib/ruby/rego/ast/unary_op.rb +42 -0
- data/lib/ruby/rego/ast/variable.rb +22 -0
- data/lib/ruby/rego/ast.rb +17 -0
- data/lib/ruby/rego/builtins/aggregates.rb +124 -0
- data/lib/ruby/rego/builtins/base.rb +95 -0
- data/lib/ruby/rego/builtins/collections/array_ops.rb +103 -0
- data/lib/ruby/rego/builtins/collections/object_ops.rb +120 -0
- data/lib/ruby/rego/builtins/collections/set_ops.rb +51 -0
- data/lib/ruby/rego/builtins/collections.rb +137 -0
- data/lib/ruby/rego/builtins/comparisons/casts.rb +139 -0
- data/lib/ruby/rego/builtins/comparisons.rb +84 -0
- data/lib/ruby/rego/builtins/numeric_helpers.rb +56 -0
- data/lib/ruby/rego/builtins/registry.rb +199 -0
- data/lib/ruby/rego/builtins/registry_helpers.rb +27 -0
- data/lib/ruby/rego/builtins/strings/case_ops.rb +22 -0
- data/lib/ruby/rego/builtins/strings/concat.rb +19 -0
- data/lib/ruby/rego/builtins/strings/formatting.rb +35 -0
- data/lib/ruby/rego/builtins/strings/helpers.rb +62 -0
- data/lib/ruby/rego/builtins/strings/number_helpers.rb +48 -0
- data/lib/ruby/rego/builtins/strings/search.rb +63 -0
- data/lib/ruby/rego/builtins/strings/split.rb +19 -0
- data/lib/ruby/rego/builtins/strings/substring.rb +22 -0
- data/lib/ruby/rego/builtins/strings/trim.rb +42 -0
- data/lib/ruby/rego/builtins/strings/trim_helpers.rb +62 -0
- data/lib/ruby/rego/builtins/strings.rb +58 -0
- data/lib/ruby/rego/builtins/types.rb +89 -0
- data/lib/ruby/rego/call_name.rb +55 -0
- data/lib/ruby/rego/cli.rb +1122 -0
- data/lib/ruby/rego/compiled_module.rb +114 -0
- data/lib/ruby/rego/compiler.rb +1097 -0
- data/lib/ruby/rego/environment/overrides.rb +33 -0
- data/lib/ruby/rego/environment/reference_resolution.rb +86 -0
- data/lib/ruby/rego/environment.rb +230 -0
- data/lib/ruby/rego/environment_pool.rb +71 -0
- data/lib/ruby/rego/error_handling.rb +58 -0
- data/lib/ruby/rego/error_payload.rb +34 -0
- data/lib/ruby/rego/errors.rb +196 -0
- data/lib/ruby/rego/evaluator/assignment_support.rb +126 -0
- data/lib/ruby/rego/evaluator/binding_helpers.rb +60 -0
- data/lib/ruby/rego/evaluator/comprehension_evaluator.rb +182 -0
- data/lib/ruby/rego/evaluator/expression_dispatch.rb +45 -0
- data/lib/ruby/rego/evaluator/expression_evaluator.rb +492 -0
- data/lib/ruby/rego/evaluator/object_literal_evaluator.rb +52 -0
- data/lib/ruby/rego/evaluator/operator_evaluator.rb +163 -0
- data/lib/ruby/rego/evaluator/query_node_builder.rb +38 -0
- data/lib/ruby/rego/evaluator/reference_key_resolver.rb +50 -0
- data/lib/ruby/rego/evaluator/reference_resolver.rb +352 -0
- data/lib/ruby/rego/evaluator/rule_evaluator/bindings.rb +70 -0
- data/lib/ruby/rego/evaluator/rule_evaluator.rb +550 -0
- data/lib/ruby/rego/evaluator/rule_value_provider.rb +56 -0
- data/lib/ruby/rego/evaluator/variable_collector.rb +221 -0
- data/lib/ruby/rego/evaluator.rb +174 -0
- data/lib/ruby/rego/lexer/number_reader.rb +68 -0
- data/lib/ruby/rego/lexer/stream.rb +137 -0
- data/lib/ruby/rego/lexer/string_reader.rb +90 -0
- data/lib/ruby/rego/lexer/template_string_reader.rb +62 -0
- data/lib/ruby/rego/lexer.rb +206 -0
- data/lib/ruby/rego/location.rb +73 -0
- data/lib/ruby/rego/memoization.rb +67 -0
- data/lib/ruby/rego/parser/collections.rb +173 -0
- data/lib/ruby/rego/parser/expressions.rb +216 -0
- data/lib/ruby/rego/parser/precedence.rb +42 -0
- data/lib/ruby/rego/parser/query.rb +139 -0
- data/lib/ruby/rego/parser/references.rb +115 -0
- data/lib/ruby/rego/parser/rules.rb +310 -0
- data/lib/ruby/rego/parser.rb +210 -0
- data/lib/ruby/rego/policy.rb +50 -0
- data/lib/ruby/rego/result.rb +91 -0
- data/lib/ruby/rego/token.rb +206 -0
- data/lib/ruby/rego/unifier.rb +451 -0
- data/lib/ruby/rego/value.rb +379 -0
- data/lib/ruby/rego/version.rb +7 -0
- data/lib/ruby/rego/with_modifiers/with_modifier.rb +37 -0
- data/lib/ruby/rego/with_modifiers/with_modifier_applier.rb +48 -0
- data/lib/ruby/rego/with_modifiers/with_modifier_builtin_override.rb +128 -0
- data/lib/ruby/rego/with_modifiers/with_modifier_context.rb +120 -0
- data/lib/ruby/rego/with_modifiers/with_modifier_path_key_resolver.rb +42 -0
- data/lib/ruby/rego/with_modifiers/with_modifier_path_override.rb +99 -0
- data/lib/ruby/rego/with_modifiers/with_modifier_root_scope.rb +58 -0
- data/lib/ruby/rego.rb +72 -0
- data/sig/objspace.rbs +4 -0
- data/sig/psych.rbs +7 -0
- data/sig/rego_validate.rbs +382 -0
- data/sig/ruby/rego.rbs +2150 -0
- metadata +172 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ruby
|
|
4
|
+
module Rego
|
|
5
|
+
# Bundles compiled rule metadata for fast evaluation.
|
|
6
|
+
class CompiledModule
|
|
7
|
+
# Create a compiled module bundle.
|
|
8
|
+
#
|
|
9
|
+
# @param package_path [Array<String>] module package path
|
|
10
|
+
# @param rules_by_name [Hash{String => Array<AST::Rule>}] indexed rules
|
|
11
|
+
# @param imports [Array<AST::Import>] imports from the module
|
|
12
|
+
# @param dependency_graph [Hash{String => Array<String>}] rule dependencies
|
|
13
|
+
def initialize(package_path:, rules_by_name:, imports: [], dependency_graph: {})
|
|
14
|
+
state = {
|
|
15
|
+
package_path: package_path,
|
|
16
|
+
rules_by_name: rules_by_name,
|
|
17
|
+
imports: imports,
|
|
18
|
+
dependency_graph: dependency_graph
|
|
19
|
+
}
|
|
20
|
+
@package_path,
|
|
21
|
+
@rules_by_name,
|
|
22
|
+
@imports,
|
|
23
|
+
@dependency_graph = Normalizer.new(state).normalize
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# The module package path.
|
|
27
|
+
#
|
|
28
|
+
# @return [Array<String>]
|
|
29
|
+
attr_reader :package_path
|
|
30
|
+
|
|
31
|
+
# Rules indexed by name.
|
|
32
|
+
#
|
|
33
|
+
# @return [Hash{String => Array<AST::Rule>}]
|
|
34
|
+
attr_reader :rules_by_name
|
|
35
|
+
|
|
36
|
+
# Import declarations.
|
|
37
|
+
#
|
|
38
|
+
# @return [Array<AST::Import>]
|
|
39
|
+
attr_reader :imports
|
|
40
|
+
|
|
41
|
+
# Dependency graph for rule evaluation ordering.
|
|
42
|
+
#
|
|
43
|
+
# @return [Hash{String => Array<String>}]
|
|
44
|
+
attr_reader :dependency_graph
|
|
45
|
+
|
|
46
|
+
# Fetch rules for a given name.
|
|
47
|
+
#
|
|
48
|
+
# @param name [String, Symbol] rule name
|
|
49
|
+
# @return [Array<AST::Rule>] rules matching the name
|
|
50
|
+
def lookup_rule(name)
|
|
51
|
+
rules_by_name.fetch(name.to_s) { empty_rules }
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# List all rule names.
|
|
55
|
+
#
|
|
56
|
+
# @return [Array<String>]
|
|
57
|
+
def rule_names
|
|
58
|
+
rules_by_name.keys
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Check whether a rule exists.
|
|
62
|
+
#
|
|
63
|
+
# @param name [String, Symbol] rule name
|
|
64
|
+
# @return [Boolean] true when present
|
|
65
|
+
# rubocop:disable Naming/PredicatePrefix
|
|
66
|
+
def has_rule?(name)
|
|
67
|
+
rules_by_name.key?(name.to_s)
|
|
68
|
+
end
|
|
69
|
+
# rubocop:enable Naming/PredicatePrefix
|
|
70
|
+
|
|
71
|
+
# Normalizes compiled module inputs and freezes them for immutability.
|
|
72
|
+
class Normalizer
|
|
73
|
+
def initialize(state)
|
|
74
|
+
@package_path = state.fetch(:package_path)
|
|
75
|
+
@rules_by_name = state.fetch(:rules_by_name)
|
|
76
|
+
@imports = state.fetch(:imports)
|
|
77
|
+
@dependency_graph = state.fetch(:dependency_graph)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def normalize
|
|
81
|
+
[
|
|
82
|
+
package_path.dup.freeze,
|
|
83
|
+
normalize_rules,
|
|
84
|
+
imports.dup.freeze,
|
|
85
|
+
normalize_dependency_graph
|
|
86
|
+
]
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
private
|
|
90
|
+
|
|
91
|
+
attr_reader :package_path, :rules_by_name, :imports, :dependency_graph
|
|
92
|
+
|
|
93
|
+
def normalize_rules
|
|
94
|
+
rules_by_name.transform_values { |rules| rules.dup.freeze }.freeze
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def normalize_dependency_graph
|
|
98
|
+
dependency_graph.transform_values { |deps| deps.dup.freeze }.freeze
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
private
|
|
103
|
+
|
|
104
|
+
def empty_rules
|
|
105
|
+
@empty_rules ||= begin
|
|
106
|
+
empty = [] # @type var empty: Array[AST::Rule]
|
|
107
|
+
empty.freeze
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
private_constant :Normalizer
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|