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.
Files changed (124) hide show
  1. checksums.yaml +7 -0
  2. data/.reek.yml +80 -0
  3. data/.vscode/extensions.json +19 -0
  4. data/.vscode/launch.json +35 -0
  5. data/.vscode/settings.json +25 -0
  6. data/.vscode/tasks.json +117 -0
  7. data/.yardopts +12 -0
  8. data/ARCHITECTURE.md +39 -0
  9. data/CHANGELOG.md +25 -0
  10. data/CODE_OF_CONDUCT.md +10 -0
  11. data/LICENSE.txt +21 -0
  12. data/README.md +183 -0
  13. data/RELEASING.md +37 -0
  14. data/Rakefile +38 -0
  15. data/SECURITY.md +26 -0
  16. data/Steepfile +10 -0
  17. data/TODO.md +35 -0
  18. data/benchmark/builtin_calls.rb +29 -0
  19. data/benchmark/complex_policy.rb +19 -0
  20. data/benchmark/comprehensions.rb +19 -0
  21. data/benchmark/simple_rules.rb +20 -0
  22. data/examples/README.md +27 -0
  23. data/examples/sample_config.yaml +2 -0
  24. data/examples/simple_policy.rego +7 -0
  25. data/examples/validation_policy.rego +11 -0
  26. data/exe/rego-validate +6 -0
  27. data/lib/ruby/rego/ast/base.rb +95 -0
  28. data/lib/ruby/rego/ast/binary_op.rb +64 -0
  29. data/lib/ruby/rego/ast/call.rb +27 -0
  30. data/lib/ruby/rego/ast/composite.rb +48 -0
  31. data/lib/ruby/rego/ast/comprehension.rb +63 -0
  32. data/lib/ruby/rego/ast/every.rb +37 -0
  33. data/lib/ruby/rego/ast/import.rb +32 -0
  34. data/lib/ruby/rego/ast/literal.rb +70 -0
  35. data/lib/ruby/rego/ast/module.rb +32 -0
  36. data/lib/ruby/rego/ast/package.rb +22 -0
  37. data/lib/ruby/rego/ast/query.rb +63 -0
  38. data/lib/ruby/rego/ast/reference.rb +58 -0
  39. data/lib/ruby/rego/ast/rule.rb +114 -0
  40. data/lib/ruby/rego/ast/unary_op.rb +42 -0
  41. data/lib/ruby/rego/ast/variable.rb +22 -0
  42. data/lib/ruby/rego/ast.rb +17 -0
  43. data/lib/ruby/rego/builtins/aggregates.rb +124 -0
  44. data/lib/ruby/rego/builtins/base.rb +95 -0
  45. data/lib/ruby/rego/builtins/collections/array_ops.rb +103 -0
  46. data/lib/ruby/rego/builtins/collections/object_ops.rb +120 -0
  47. data/lib/ruby/rego/builtins/collections/set_ops.rb +51 -0
  48. data/lib/ruby/rego/builtins/collections.rb +137 -0
  49. data/lib/ruby/rego/builtins/comparisons/casts.rb +139 -0
  50. data/lib/ruby/rego/builtins/comparisons.rb +84 -0
  51. data/lib/ruby/rego/builtins/numeric_helpers.rb +56 -0
  52. data/lib/ruby/rego/builtins/registry.rb +199 -0
  53. data/lib/ruby/rego/builtins/registry_helpers.rb +27 -0
  54. data/lib/ruby/rego/builtins/strings/case_ops.rb +22 -0
  55. data/lib/ruby/rego/builtins/strings/concat.rb +19 -0
  56. data/lib/ruby/rego/builtins/strings/formatting.rb +35 -0
  57. data/lib/ruby/rego/builtins/strings/helpers.rb +62 -0
  58. data/lib/ruby/rego/builtins/strings/number_helpers.rb +48 -0
  59. data/lib/ruby/rego/builtins/strings/search.rb +63 -0
  60. data/lib/ruby/rego/builtins/strings/split.rb +19 -0
  61. data/lib/ruby/rego/builtins/strings/substring.rb +22 -0
  62. data/lib/ruby/rego/builtins/strings/trim.rb +42 -0
  63. data/lib/ruby/rego/builtins/strings/trim_helpers.rb +62 -0
  64. data/lib/ruby/rego/builtins/strings.rb +58 -0
  65. data/lib/ruby/rego/builtins/types.rb +89 -0
  66. data/lib/ruby/rego/call_name.rb +55 -0
  67. data/lib/ruby/rego/cli.rb +1122 -0
  68. data/lib/ruby/rego/compiled_module.rb +114 -0
  69. data/lib/ruby/rego/compiler.rb +1097 -0
  70. data/lib/ruby/rego/environment/overrides.rb +33 -0
  71. data/lib/ruby/rego/environment/reference_resolution.rb +86 -0
  72. data/lib/ruby/rego/environment.rb +230 -0
  73. data/lib/ruby/rego/environment_pool.rb +71 -0
  74. data/lib/ruby/rego/error_handling.rb +58 -0
  75. data/lib/ruby/rego/error_payload.rb +34 -0
  76. data/lib/ruby/rego/errors.rb +196 -0
  77. data/lib/ruby/rego/evaluator/assignment_support.rb +126 -0
  78. data/lib/ruby/rego/evaluator/binding_helpers.rb +60 -0
  79. data/lib/ruby/rego/evaluator/comprehension_evaluator.rb +182 -0
  80. data/lib/ruby/rego/evaluator/expression_dispatch.rb +45 -0
  81. data/lib/ruby/rego/evaluator/expression_evaluator.rb +492 -0
  82. data/lib/ruby/rego/evaluator/object_literal_evaluator.rb +52 -0
  83. data/lib/ruby/rego/evaluator/operator_evaluator.rb +163 -0
  84. data/lib/ruby/rego/evaluator/query_node_builder.rb +38 -0
  85. data/lib/ruby/rego/evaluator/reference_key_resolver.rb +50 -0
  86. data/lib/ruby/rego/evaluator/reference_resolver.rb +352 -0
  87. data/lib/ruby/rego/evaluator/rule_evaluator/bindings.rb +70 -0
  88. data/lib/ruby/rego/evaluator/rule_evaluator.rb +550 -0
  89. data/lib/ruby/rego/evaluator/rule_value_provider.rb +56 -0
  90. data/lib/ruby/rego/evaluator/variable_collector.rb +221 -0
  91. data/lib/ruby/rego/evaluator.rb +174 -0
  92. data/lib/ruby/rego/lexer/number_reader.rb +68 -0
  93. data/lib/ruby/rego/lexer/stream.rb +137 -0
  94. data/lib/ruby/rego/lexer/string_reader.rb +90 -0
  95. data/lib/ruby/rego/lexer/template_string_reader.rb +62 -0
  96. data/lib/ruby/rego/lexer.rb +206 -0
  97. data/lib/ruby/rego/location.rb +73 -0
  98. data/lib/ruby/rego/memoization.rb +67 -0
  99. data/lib/ruby/rego/parser/collections.rb +173 -0
  100. data/lib/ruby/rego/parser/expressions.rb +216 -0
  101. data/lib/ruby/rego/parser/precedence.rb +42 -0
  102. data/lib/ruby/rego/parser/query.rb +139 -0
  103. data/lib/ruby/rego/parser/references.rb +115 -0
  104. data/lib/ruby/rego/parser/rules.rb +310 -0
  105. data/lib/ruby/rego/parser.rb +210 -0
  106. data/lib/ruby/rego/policy.rb +50 -0
  107. data/lib/ruby/rego/result.rb +91 -0
  108. data/lib/ruby/rego/token.rb +206 -0
  109. data/lib/ruby/rego/unifier.rb +451 -0
  110. data/lib/ruby/rego/value.rb +379 -0
  111. data/lib/ruby/rego/version.rb +7 -0
  112. data/lib/ruby/rego/with_modifiers/with_modifier.rb +37 -0
  113. data/lib/ruby/rego/with_modifiers/with_modifier_applier.rb +48 -0
  114. data/lib/ruby/rego/with_modifiers/with_modifier_builtin_override.rb +128 -0
  115. data/lib/ruby/rego/with_modifiers/with_modifier_context.rb +120 -0
  116. data/lib/ruby/rego/with_modifiers/with_modifier_path_key_resolver.rb +42 -0
  117. data/lib/ruby/rego/with_modifiers/with_modifier_path_override.rb +99 -0
  118. data/lib/ruby/rego/with_modifiers/with_modifier_root_scope.rb +58 -0
  119. data/lib/ruby/rego.rb +72 -0
  120. data/sig/objspace.rbs +4 -0
  121. data/sig/psych.rbs +7 -0
  122. data/sig/rego_validate.rbs +382 -0
  123. data/sig/ruby/rego.rbs +2150 -0
  124. metadata +172 -0
@@ -0,0 +1,382 @@
1
+ module RegoValidate
2
+ class Options
3
+ attr_accessor policy: String?
4
+ attr_accessor config: String?
5
+ attr_accessor query: String?
6
+ attr_accessor format: String
7
+ attr_accessor help: bool
8
+ attr_accessor yaml_aliases: bool
9
+ attr_accessor profile: bool
10
+
11
+ def initialize: (?policy: String?, ?config: String?, ?query: String?, ?format: String, ?help: bool, ?yaml_aliases: bool, ?profile: bool) -> void
12
+ def help?: () -> bool
13
+ def profile?: () -> bool
14
+ end
15
+
16
+ class ParseResult
17
+ attr_reader options: Options
18
+ attr_reader parser: untyped
19
+ attr_reader error: OptionParser::ParseError?
20
+
21
+ def initialize: (options: Options, parser: untyped, ?error: OptionParser::ParseError?) -> void
22
+ def success?: () -> bool
23
+
24
+ def report_error: (stdout: IO, stderr: IO) -> void
25
+
26
+ private
27
+
28
+ def error_message: () -> String
29
+ end
30
+
31
+ class ConfigLoadResult
32
+ attr_reader value: untyped
33
+ attr_reader success: bool
34
+
35
+ def initialize: (?value: untyped, success: bool) -> void
36
+ def success?: () -> bool
37
+ end
38
+
39
+ class EvaluationResult
40
+ attr_reader outcome: Outcome?
41
+ attr_reader error_message: String?
42
+
43
+ def initialize: (?outcome: Outcome?, ?error_message: String?) -> void
44
+ def success?: () -> bool
45
+ end
46
+
47
+ class Outcome
48
+ attr_reader success: bool
49
+ attr_reader value: untyped
50
+ attr_reader errors: Array[String]
51
+
52
+ def initialize: (success: bool, value: untyped, errors: Array[String]) -> void
53
+ def success?: () -> bool
54
+ end
55
+
56
+ class CLI
57
+ def initialize: (Array[String] argv, ?stdout: IO, ?stderr: IO) -> void
58
+ def run: () -> Integer
59
+
60
+ private
61
+
62
+ attr_reader argv: Array[String]
63
+ attr_reader options: Options
64
+ attr_reader stdout: IO
65
+ attr_reader stderr: IO
66
+ def perform_run: () -> Integer
67
+ def apply_parse_result: (ParseResult parse_result) -> Integer
68
+ def handle_evaluation: (untyped parser) -> Integer
69
+ def emit_outcome: (Outcome outcome) -> Integer
70
+ def handle_parse_error: (ParseResult parse_result) -> Integer
71
+ def required_options_present?: (untyped parser) -> bool
72
+ def evaluate_policy: (untyped parser, ?profiler: Profiler?) -> EvaluationResult
73
+ def report_evaluation_error: (EvaluationResult evaluation, untyped parser) -> void
74
+ def handle_help: (untyped parser) -> Integer
75
+ def handle_rego_error: (Ruby::Rego::Error error) -> Integer
76
+ def handle_unexpected_error: (StandardError error) -> Integer
77
+ def reporter: () -> ErrorReporter
78
+ end
79
+
80
+ class OptionsParser
81
+ VALID_FORMATS: Array[String]
82
+
83
+ def initialize: (Array[String] argv) -> void
84
+ def parse: () -> ParseResult
85
+
86
+ class ParseResultBuilder
87
+ def initialize: (Array[String] argv) -> void
88
+ def call: () -> ParseResult
89
+
90
+ private
91
+
92
+ attr_reader argv: Array[String]
93
+ def parse_with: (Options options) -> ParseResult
94
+ end
95
+
96
+ class OptionDefinitions
97
+ OPTION_BUILDERS: Array[Symbol]
98
+
99
+ def initialize: (Options options) -> void
100
+ def build: () -> OptionParser
101
+
102
+ private
103
+
104
+ attr_reader options: Options
105
+ def apply_options: (OptionParser opts) -> void
106
+ def add_policy_option: (OptionParser opts) -> void
107
+ def add_config_option: (OptionParser opts) -> void
108
+ def add_query_option: (OptionParser opts) -> void
109
+ def add_format_option: (OptionParser opts) -> void
110
+ def add_profile_option: (OptionParser opts) -> void
111
+ def add_yaml_aliases_option: (OptionParser opts) -> void
112
+ def add_help_option: (OptionParser opts) -> void
113
+ end
114
+
115
+ private
116
+
117
+ attr_reader argv: Array[String]
118
+ end
119
+
120
+ class OptionsValidator
121
+ def initialize: (Options options) -> void
122
+ def missing_required: () -> Array[String]
123
+
124
+ private
125
+
126
+ attr_reader options: Options
127
+ end
128
+
129
+ class ConfigLoader
130
+ JSON_EXTENSIONS: Array[String]
131
+
132
+ def initialize: (reporter: ErrorReporter, parser: untyped, yaml_aliases: bool) -> void
133
+ def read_policy: (String path) -> String?
134
+ def read_config: (String path) -> ConfigLoadResult
135
+
136
+ private
137
+
138
+ attr_reader reporter: ErrorReporter
139
+ attr_reader parser: untyped
140
+ attr_reader json_extensions: Array[String]
141
+ attr_reader yaml_aliases: bool
142
+ def read_file: (String path, String label) -> String?
143
+ def parse_config: (String content, String path) -> ConfigLoadResult
144
+ def parse_config_value: (String content, String path) -> untyped
145
+ def report_file_error: (String label, String reason, String path) -> void
146
+ def json_config?: (String path) -> bool
147
+ end
148
+
149
+ class SourceLoader
150
+ def initialize: (options: Options, reporter: ErrorReporter, parser: untyped) -> void
151
+ def load: () -> [String?, ConfigLoadResult]
152
+
153
+ private
154
+
155
+ attr_reader options: Options
156
+ attr_reader loader: ConfigLoader
157
+ def load_policy_source: () -> String?
158
+ def load_config: () -> ConfigLoadResult
159
+ end
160
+
161
+ class DefaultQueryResolver
162
+ DEFAULT_RULE_NAMES: Array[String]
163
+ FALLBACK_RULE_NAMES: Array[String]
164
+
165
+ def initialize: (Ruby::Rego::CompiledModule compiled_module) -> void
166
+ def resolve: () -> String?
167
+
168
+ private
169
+
170
+ attr_reader compiled_module: Ruby::Rego::CompiledModule
171
+ attr_reader rule_names: Array[String]
172
+ def rule_available?: (String name) -> bool
173
+ def package_path: () -> Array[String]
174
+ end
175
+
176
+ class PolicyEvaluator
177
+ def initialize: (String policy_source, untyped input, String? query, ?profiler: Profiler?) -> void
178
+ def evaluate: () -> EvaluationResult
179
+
180
+ private
181
+
182
+ attr_reader policy_source: String
183
+ attr_reader input: untyped
184
+ attr_reader query: String?
185
+ attr_reader profiler: Profiler?
186
+ def resolve_query: (Ruby::Rego::CompiledModule compiled_module) -> String?
187
+ def build_evaluation: (Ruby::Rego::CompiledModule compiled_module, String query_path) -> EvaluationResult
188
+ def evaluate_compiled: (Ruby::Rego::CompiledModule compiled_module, String query_path) -> Ruby::Rego::Result
189
+ def measure: (String label) { () -> untyped } -> untyped
190
+ end
191
+
192
+ class Profiler
193
+ class Sample
194
+ attr_reader label: String
195
+ attr_reader duration_ms: Float
196
+ attr_reader allocations: Integer
197
+ attr_reader memory_bytes: Integer
198
+ attr_reader top_objects: Array[String]
199
+
200
+ def initialize: (label: String, duration_ms: Float, allocations: Integer, memory_bytes: Integer, top_objects: Array[String]) -> void
201
+ def report_line: () -> String
202
+ def top_objects_line: () -> String?
203
+
204
+ private
205
+
206
+ def format_duration: () -> String
207
+ def format_bytes: () -> String
208
+ end
209
+
210
+ class ByteFormatter
211
+ def initialize: (Integer bytes) -> void
212
+ def render: () -> String
213
+
214
+ private
215
+
216
+ attr_reader sign: String
217
+ attr_reader size: Integer
218
+ end
219
+
220
+ class Snapshot
221
+ def self.capture: () -> Snapshot
222
+ def self.capture_before: () -> Snapshot
223
+ def self.capture_after: () -> Snapshot
224
+ def initialize: (allocated: Integer, memsize: Integer, objects: Hash[Symbol, Integer]) -> void
225
+ def delta: (Snapshot other) -> Delta
226
+ attr_reader allocated: Integer
227
+ attr_reader memsize: Integer
228
+ attr_reader objects: Hash[Symbol, Integer]
229
+
230
+ private
231
+
232
+ def self.build_snapshot: (memsize: Integer, objects: Hash[Symbol, Integer]) -> Snapshot
233
+ def self.empty_object_counts: () -> Hash[Symbol, Integer]
234
+
235
+ def object_delta_map: (Hash[Symbol, Integer] after_objects) -> Hash[Symbol, Integer]
236
+ def add_delta: (Hash[Symbol, Integer] deltas, Symbol key, Integer count) -> void
237
+ end
238
+
239
+ class Delta
240
+ SKIP_KEYS: Array[Symbol]
241
+
242
+ def self.skip_key?: (Symbol key) -> bool
243
+ def initialize: (allocations: Integer, memory_bytes: Integer, object_deltas: Hash[Symbol, Integer]) -> void
244
+ def top_objects: (?limit: Integer) -> Array[String]
245
+
246
+ attr_reader allocations: Integer
247
+ attr_reader memory_bytes: Integer
248
+ attr_reader object_deltas: Hash[Symbol, Integer]
249
+ end
250
+
251
+ class Measurement
252
+ def initialize: (label: String, before: Snapshot, start: Float) -> void
253
+ def finish: (after: Snapshot, finish: Float) -> Sample
254
+
255
+ private
256
+
257
+ attr_reader before: Snapshot
258
+ attr_reader label: String
259
+ attr_reader start: Float
260
+ end
261
+
262
+ def initialize: (?stderr: IO) -> void
263
+ def measure: (String label) { () -> untyped } -> untyped
264
+ def report: () -> void
265
+
266
+ private
267
+
268
+ attr_reader clock: untyped
269
+ attr_reader samples: Array[Profiler::Sample]
270
+ attr_reader stderr: IO
271
+ def report_samples: () -> void
272
+ def report_hotspot: () -> void
273
+ def start_measurement: (String label) -> Measurement
274
+ def finish_measurement: (Measurement measurement) -> void
275
+ def clock_time: () -> Float
276
+ end
277
+
278
+ class OutcomeBuilder
279
+ def initialize: (Ruby::Rego::Result result, String query) -> void
280
+ def build: () -> Outcome
281
+
282
+ private
283
+
284
+ attr_reader result: Ruby::Rego::Result
285
+ attr_reader query: String
286
+ def build_defined_outcome: () -> Outcome
287
+ def errors_for: (untyped value) -> Array[String]
288
+ def undefined_outcome: () -> Outcome
289
+ def errors_from_value: (untyped value) -> Array[String]
290
+ def errors_for_non_true: (untyped value) -> Array[String]
291
+ def scalar_error: (untyped value) -> Array[String]
292
+ def collection_errors: (untyped value) -> Array[String]
293
+ def hash_errors: (untyped value) -> Array[String]
294
+ def format_rule_error: (untyped value) -> String
295
+ def rule_name: () -> String
296
+ end
297
+
298
+ class OutcomeEmitter
299
+ def initialize: (IO stdout, ?format: String) -> void
300
+ def emit: (Outcome outcome) -> void
301
+
302
+ class JsonFormatter
303
+ def initialize: (IO stdout) -> void
304
+ def emit: (Outcome outcome) -> void
305
+
306
+ private
307
+
308
+ attr_reader stdout: IO
309
+ end
310
+
311
+ class TextFormatter
312
+ def initialize: (IO stdout) -> void
313
+ def emit: (Outcome outcome) -> void
314
+
315
+ private
316
+
317
+ attr_reader stdout: IO
318
+ end
319
+
320
+ class OutcomePayload
321
+ def initialize: (Outcome outcome) -> void
322
+ def to_h: () -> Hash[Symbol, untyped]
323
+
324
+ private
325
+
326
+ attr_reader outcome: Outcome
327
+ def normalize_json: (untyped value) -> untyped
328
+ def normalize_array: (Array[untyped] values) -> Array[untyped]
329
+ def normalize_hash: (Hash[untyped, untyped] values) -> Hash[untyped, untyped]
330
+ def normalize_set: (Set[untyped] values) -> Array[untyped]
331
+ end
332
+
333
+ FORMATTERS: Hash[String, untyped]
334
+
335
+ private
336
+
337
+ attr_reader formatter: untyped
338
+ end
339
+
340
+ class ErrorReporter
341
+ def initialize: (stdout: IO, stderr: IO, ?format: String) -> void
342
+ def error: (String message, ?untyped parser) -> void
343
+ def rego_error: (Ruby::Rego::Error error) -> void
344
+
345
+ class ErrorPayload
346
+ def self.from_cli_error: (String message) -> ErrorPayload
347
+ def self.from_rego_error: (Ruby::Rego::Error error) -> ErrorPayload
348
+ def initialize: (message: String, type: String, ?location: Ruby::Rego::Location?) -> void
349
+ def to_h: () -> Hash[Symbol, untyped]
350
+
351
+ private
352
+
353
+ attr_reader message: String
354
+ attr_reader type: String
355
+ attr_reader location: Ruby::Rego::Location?
356
+ end
357
+
358
+ class JsonFormatter
359
+ def initialize: (stdout: IO, stderr: IO) -> void
360
+ def error: (String message, ?untyped parser) -> void
361
+ def rego_error: (Ruby::Rego::Error error) -> void
362
+
363
+ private
364
+
365
+ attr_reader stdout: IO
366
+ attr_reader stderr: IO
367
+ end
368
+
369
+ class TextFormatter
370
+ def initialize: (stdout: IO, stderr: IO) -> void
371
+ def error: (String message, ?untyped parser) -> void
372
+ def rego_error: (Ruby::Rego::Error error) -> void
373
+
374
+ private
375
+
376
+ attr_reader stdout: IO
377
+ attr_reader stderr: IO
378
+ end
379
+
380
+ FORMATTERS: Hash[String, untyped]
381
+ end
382
+ end