Module: Ruby::Rego

Defined in:
lib/ruby/rego.rb,
lib/ruby/rego/lexer.rb,
lib/ruby/rego/token.rb,
lib/ruby/rego/value.rb,
lib/ruby/rego/errors.rb,
lib/ruby/rego/number.rb,
lib/ruby/rego/parser.rb,
lib/ruby/rego/policy.rb,
lib/ruby/rego/result.rb,
lib/ruby/rego/unifier.rb,
lib/ruby/rego/version.rb,
lib/ruby/rego/ast/base.rb,
lib/ruby/rego/ast/call.rb,
lib/ruby/rego/ast/rule.rb,
lib/ruby/rego/compiler.rb,
lib/ruby/rego/location.rb,
lib/ruby/rego/ast/every.rb,
lib/ruby/rego/ast/query.rb,
lib/ruby/rego/call_name.rb,
lib/ruby/rego/evaluator.rb,
lib/ruby/rego/ast/import.rb,
lib/ruby/rego/ast/module.rb,
lib/ruby/rego/ast/literal.rb,
lib/ruby/rego/ast/package.rb,
lib/ruby/rego/environment.rb,
lib/ruby/rego/memoization.rb,
lib/ruby/rego/ast/unary_op.rb,
lib/ruby/rego/ast/variable.rb,
lib/ruby/rego/builtins/jwt.rb,
lib/ruby/rego/builtins/net.rb,
lib/ruby/rego/builtins/uri.rb,
lib/ruby/rego/json_decoder.rb,
lib/ruby/rego/lexer/stream.rb,
lib/ruby/rego/parser/query.rb,
lib/ruby/rego/parser/rules.rb,
lib/ruby/rego/ast/binary_op.rb,
lib/ruby/rego/ast/composite.rb,
lib/ruby/rego/ast/reference.rb,
lib/ruby/rego/builtins/base.rb,
lib/ruby/rego/builtins/bits.rb,
lib/ruby/rego/builtins/glob.rb,
lib/ruby/rego/builtins/uuid.rb,
lib/ruby/rego/builtins/yaml.rb,
lib/ruby/rego/error_payload.rb,
lib/ruby/rego/builtins/graph.rb,
lib/ruby/rego/builtins/regex.rb,
lib/ruby/rego/builtins/times.rb,
lib/ruby/rego/builtins/types.rb,
lib/ruby/rego/builtins/units.rb,
lib/ruby/rego/error_handling.rb,
lib/ruby/rego/builtins/codecs.rb,
lib/ruby/rego/builtins/crypto.rb,
lib/ruby/rego/builtins/semver.rb,
lib/ruby/rego/compiled_module.rb,
lib/ruby/rego/compiler/safety.rb,
lib/ruby/rego/unifier/helpers.rb,
lib/ruby/rego/builtins/jwt/jwk.rb,
lib/ruby/rego/builtins/numbers.rb,
lib/ruby/rego/builtins/strings.rb,
lib/ruby/rego/environment_pool.rb,
lib/ruby/rego/go_number_format.rb,
lib/ruby/rego/ast/comprehension.rb,
lib/ruby/rego/builtins/jwt/sign.rb,
lib/ruby/rego/builtins/registry.rb,
lib/ruby/rego/parser/precedence.rb,
lib/ruby/rego/parser/references.rb,
lib/ruby/rego/parser/rule_heads.rb,
lib/ruby/rego/builtins/base64url.rb,
lib/ruby/rego/compiler/rule_head.rb,
lib/ruby/rego/parser/collections.rb,
lib/ruby/rego/parser/expressions.rb,
lib/ruby/rego/parser/rule_bodies.rb,
lib/ruby/rego/builtins/aggregates.rb,
lib/ruby/rego/builtins/json_patch.rb,
lib/ruby/rego/builtins/json_paths.rb,
lib/ruby/rego/builtins/jwt/verify.rb,
lib/ruby/rego/builtins/term_order.rb,
lib/ruby/rego/builtins/times/diff.rb,
lib/ruby/rego/builtins/uri/parser.rb,
lib/ruby/rego/compiled_policy_set.rb,
lib/ruby/rego/compiler/rule_index.rb,
lib/ruby/rego/lexer/number_reader.rb,
lib/ruby/rego/lexer/string_reader.rb,
lib/ruby/rego/builtins/collections.rb,
lib/ruby/rego/builtins/comparisons.rb,
lib/ruby/rego/builtins/crypto/keys.rb,
lib/ruby/rego/builtins/times/parse.rb,
lib/ruby/rego/evaluator/policy_set.rb,
lib/ruby/rego/builtins/strings/trim.rb,
lib/ruby/rego/builtins/yaml/emitter.rb,
lib/ruby/rego/compiler/dependencies.rb,
lib/ruby/rego/environment/overrides.rb,
lib/ruby/rego/builtins/crypto/verify.rb,
lib/ruby/rego/builtins/glob/compiler.rb,
lib/ruby/rego/builtins/providers/aws.rb,
lib/ruby/rego/builtins/regex/replace.rb,
lib/ruby/rego/builtins/strings/split.rb,
lib/ruby/rego/builtins/times/rfc3339.rb,
lib/ruby/rego/unifier/key_candidates.rb,
lib/ruby/rego/builtins/crypto/keypair.rb,
lib/ruby/rego/builtins/net/cidr_merge.rb,
lib/ruby/rego/builtins/regex/matching.rb,
lib/ruby/rego/builtins/regex/template.rb,
lib/ruby/rego/builtins/strings/concat.rb,
lib/ruby/rego/builtins/strings/search.rb,
lib/ruby/rego/builtins/times/duration.rb,
lib/ruby/rego/evaluator/module_wiring.rb,
lib/ruby/rego/evaluator/single_module.rb,
lib/ruby/rego/parser/rule_definitions.rb,
lib/ruby/rego/unifier/object_matching.rb,
lib/ruby/rego/builtins/numeric_helpers.rb,
lib/ruby/rego/builtins/strings/helpers.rb,
lib/ruby/rego/builtins/times/go_layout.rb,
lib/ruby/rego/builtins/uri/parser/host.rb,
lib/ruby/rego/evaluator/result_builder.rb,
lib/ruby/rego/evaluator/rule_evaluator.rb,
lib/ruby/rego/builtins/codecs/url_query.rb,
lib/ruby/rego/builtins/registry_helpers.rb,
lib/ruby/rego/builtins/strings/case_ops.rb,
lib/ruby/rego/builtins/strings/matching.rb,
lib/ruby/rego/builtins/times/arithmetic.rb,
lib/ruby/rego/evaluator/binding_helpers.rb,
lib/ruby/rego/evaluator/local_shadowing.rb,
lib/ruby/rego/parser/rule_head_builders.rb,
lib/ruby/rego/builtins/comparisons/casts.rb,
lib/ruby/rego/builtins/jwt/decode_verify.rb,
lib/ruby/rego/builtins/regex/compilation.rb,
lib/ruby/rego/builtins/regex/go_template.rb,
lib/ruby/rego/builtins/strings/substring.rb,
lib/ruby/rego/builtins/strings/transform.rb,
lib/ruby/rego/builtins/codecs/json_format.rb,
lib/ruby/rego/builtins/codecs/json_schema.rb,
lib/ruby/rego/builtins/strings/formatting.rb,
lib/ruby/rego/builtins/codecs/json_decoder.rb,
lib/ruby/rego/builtins/collections/set_ops.rb,
lib/ruby/rego/builtins/crypto/certificates.rb,
lib/ruby/rego/builtins/uri/parser/escaping.rb,
lib/ruby/rego/evaluator/assignment_support.rb,
lib/ruby/rego/evaluator/operator_evaluator.rb,
lib/ruby/rego/evaluator/query_node_builder.rb,
lib/ruby/rego/evaluator/reference_resolver.rb,
lib/ruby/rego/evaluator/variable_collector.rb,
lib/ruby/rego/lexer/template_string_reader.rb,
lib/ruby/rego/unifier/reference_resolution.rb,
lib/ruby/rego/with_modifiers/with_modifier.rb,
lib/ruby/rego/builtins/net/contains_matches.rb,
lib/ruby/rego/builtins/strings/trim_helpers.rb,
lib/ruby/rego/builtins/uri/parser/serialize.rb,
lib/ruby/rego/builtins/yaml/scalar_resolver.rb,
lib/ruby/rego/evaluator/expression_dispatch.rb,
lib/ruby/rego/evaluator/rule_value_provider.rb,
lib/ruby/rego/builtins/collections/array_ops.rb,
lib/ruby/rego/evaluator/expression_evaluator.rb,
lib/ruby/rego/evaluator/rule_evaluator/query.rb,
lib/ruby/rego/builtins/collections/object_ops.rb,
lib/ruby/rego/builtins/crypto/certificate_uri.rb,
lib/ruby/rego/builtins/strings/number_helpers.rb,
lib/ruby/rego/builtins/times/go_layout/parser.rb,
lib/ruby/rego/builtins/yaml/emitter/key_order.rb,
lib/ruby/rego/builtins/crypto/certificate_name.rb,
lib/ruby/rego/builtins/regex/glob_intersection.rb,
lib/ruby/rego/builtins/times/go_layout/scanner.rb,
lib/ruby/rego/environment/reference_resolution.rb,
lib/ruby/rego/evaluator/reference_key_resolver.rb,
lib/ruby/rego/builtins/codecs/json_schema_email.rb,
lib/ruby/rego/builtins/codecs/json_schema_match.rb,
lib/ruby/rego/evaluator/comprehension_evaluator.rb,
lib/ruby/rego/evaluator/module_context_registry.rb,
lib/ruby/rego/evaluator/rule_evaluator/bindings.rb,
lib/ruby/rego/builtins/crypto/certificate_struct.rb,
lib/ruby/rego/builtins/times/go_layout/formatter.rb,
lib/ruby/rego/builtins/yaml/emitter/float_format.rb,
lib/ruby/rego/builtins/yaml/scalar_resolver/tags.rb,
lib/ruby/rego/evaluator/object_literal_evaluator.rb,
lib/ruby/rego/evaluator/template_value_formatter.rb,
lib/ruby/rego/builtins/codecs/json_schema_formats.rb,
lib/ruby/rego/builtins/crypto/certificate_request.rb,
lib/ruby/rego/evaluator/reference_resolver/caching.rb,
lib/ruby/rego/evaluator/reference_resolver/imports.rb,
lib/ruby/rego/evaluator/rule_evaluator/rule_bodies.rb,
lib/ruby/rego/evaluator/rule_evaluator/rule_values.rb,
lib/ruby/rego/with_modifiers/with_modifier_applier.rb,
lib/ruby/rego/with_modifiers/with_modifier_context.rb,
lib/ruby/rego/builtins/regex/glob_intersection/trim.rb,
lib/ruby/rego/builtins/times/go_layout/parser/zones.rb,
lib/ruby/rego/builtins/yaml/scalar_resolver/numbers.rb,
lib/ruby/rego/builtins/crypto/certificate_extensions.rb,
lib/ruby/rego/builtins/crypto/certificate_public_key.rb,
lib/ruby/rego/builtins/times/go_layout/parser/fields.rb,
lib/ruby/rego/builtins/yaml/scalar_resolver/document.rb,
lib/ruby/rego/evaluator/rule_evaluator/partial_rules.rb,
lib/ruby/rego/builtins/times/go_layout/parser/compose.rb,
lib/ruby/rego/evaluator/rule_evaluator/function_rules.rb,
lib/ruby/rego/with_modifiers/with_modifier_root_scope.rb,
lib/ruby/rego/evaluator/expression_evaluator/operators.rb,
lib/ruby/rego/builtins/times/go_layout/parser/consumers.rb,
lib/ruby/rego/builtins/crypto/certificate_request_struct.rb,
lib/ruby/rego/builtins/regex/glob_intersection/tokenizer.rb,
lib/ruby/rego/evaluator/expression_evaluator/quantifiers.rb,
lib/ruby/rego/evaluator/variable_collector/pattern_names.rb,
lib/ruby/rego/with_modifiers/with_modifier_path_override.rb,
lib/ruby/rego/builtins/regex/glob_intersection/intersector.rb,
lib/ruby/rego/evaluator/reference_resolver/path_resolution.rb,
lib/ruby/rego/evaluator/variable_collector/dispatch_tables.rb,
lib/ruby/rego/with_modifiers/with_modifier_builtin_override.rb,
lib/ruby/rego/evaluator/expression_evaluator/node_evaluation.rb,
lib/ruby/rego/with_modifiers/with_modifier_path_key_resolver.rb,
lib/ruby/rego/evaluator/reference_resolver/static_key_builder.rb,
lib/ruby/rego/evaluator/variable_collector/bound_variable_collector.rb

Overview

Rego compilation helpers.

Defined Under Namespace

Modules: AST, Builtins, CallName, DefaultRuleCallName, EnvironmentOverrides, EnvironmentReferenceResolution, ErrorPayload, GoNumberFormat, Memoization, TokenType, WithModifiers Classes: ArrayValue, BooleanValue, BuiltinArgumentError, CompilationError, CompiledModule, CompiledPolicySet, Compiler, DefaultRuleValidator, Environment, EnvironmentPool, Error, EvaluationError, Evaluator, Lexer, LexerError, Location, NullValue, Number, NumberValue, ObjectKeyConflictError, ObjectValue, Parser, ParserError, Policy, Result, ResultBuilder, SetValue, StringValue, Token, TypeError, UndefinedValue, UnificationError, Unifier, Value

Constant Summary collapse

VERSION =
"0.1.0"
JsonDecoder =

Public, layer-neutral name for the strict number-preserving JSON decoder. The implementation lives under Builtins::Codecs (it is the engine for json.unmarshal / json.is_valid / io.jwt.decode), but the rego-validate CLI loads JSON input/data through it too. The CLI is the application layer and must not reach into a Builtins:: internal path, so it binds to this alias instead — a single point of coupling if the implementation is ever relocated.

Builtins::Codecs::JsonDecoder
DEFAULT_RULE_CHILD_NODE_EXTRACTORS =
{
  AST::BinaryOp => ->(node) { [node.left, node.right] },
  AST::UnaryOp => ->(node) { [node.operand] },
  AST::ArrayLiteral => :elements.to_proc,
  AST::SetLiteral => :elements.to_proc,
  AST::ObjectLiteral => lambda do |node|
    node.pairs.flat_map { |key_node, value_node| [key_node, value_node] }
  end,
  AST::ArrayComprehension => lambda do |node|
    term = node.term
    body = Array(node.body)
    [term] + body
  end,
  AST::SetComprehension => lambda do |node|
    term = node.term
    body = Array(node.body)
    [term] + body
  end,
  AST::ObjectComprehension => lambda do |node|
    key_node, value_node = node.term
    body = Array(node.body)
    [key_node, value_node] + body
  end,
  AST::Call => ->(node) { [node.name] + node.args },
  AST::QueryLiteral => ->(node) { [node.expression] + node.with_modifiers },
  AST::Every => lambda do |node|
    body = Array(node.body)
    [node.key_var, node.value_var, node.domain] + body
  end,
  AST::SomeDecl => ->(node) { node.variables + Array(node.collection) },
  AST::WithModifier => ->(node) { [node.target, node.value] },
  AST::TemplateString => :parts.to_proc
}.freeze

Class Method Summary collapse

Class Method Details

.compile(source) ⇒ CompiledModule

Compile Rego source into an immutable compiled module.

Parameters:

  • source (String)

    Rego source code

Returns:



71
72
73
74
75
# File 'lib/ruby/rego.rb', line 71

def compile(source)
  ErrorHandling.wrap("compilation") do
    Compiler.new.compile(parse(source))
  end
end

.compile_modules(modules) ⇒ CompiledPolicySet

Compile a named set of module sources into a policy set.

Parameters:

  • modules (Hash{String => String})

    map of name => Rego source

Returns:



81
82
83
84
85
# File 'lib/ruby/rego.rb', line 81

def compile_modules(modules)
  ErrorHandling.wrap("compilation") do
    Compiler.new.compile_set(modules)
  end
end

.evaluate(source, input: {}, data: {}, query: nil) ⇒ Result?

Evaluate Rego source against input and data.

:reek:LongParameterList

Parameters:

  • source (String)

    Rego source code

  • input (Object) (defaults to: {})

    input document

  • data (Object) (defaults to: {})

    data document

  • query (Object, nil) (defaults to: nil)

    optional query path

Returns:

  • (Result, nil)

    evaluation result, or nil when a query is undefined



95
96
97
98
# File 'lib/ruby/rego.rb', line 95

def evaluate(source, input: {}, data: {}, query: nil)
  compiled_module = compile(source)
  evaluate_query(query) { Evaluator.new(compiled_module, input: input, data: data) }
end

.evaluate_modules(modules, input: {}, data: {}, query: nil) ⇒ Result?

Evaluate a named set of modules against input and data.

:reek:LongParameterList

Parameters:

  • modules (Hash{String => String})

    map of name => Rego source

  • input (Object) (defaults to: {})

    input document

  • data (Object) (defaults to: {})

    data document

  • query (Object, nil) (defaults to: nil)

    optional query path

Returns:

  • (Result, nil)

    evaluation result, or nil when a query is undefined



108
109
110
111
# File 'lib/ruby/rego.rb', line 108

def evaluate_modules(modules, input: {}, data: {}, query: nil)
  policy_set = compile_modules(modules)
  evaluate_query(query) { Evaluator.for_policy_set(policy_set, input: input, data: data) }
end

.parse(source) ⇒ AST::Module

Parse Rego source into an AST module.

Parameters:

  • source (String)

    Rego source code

Returns:



60
61
62
63
64
65
# File 'lib/ruby/rego.rb', line 60

def parse(source)
  ErrorHandling.wrap("parsing") do
    tokens = Lexer.new(source).tokenize
    Parser.new(tokens).parse
  end
end