kumi 0.0.0 → 0.0.4
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 +4 -4
- data/.rubocop.yml +113 -3
- data/CHANGELOG.md +21 -1
- data/CLAUDE.md +387 -0
- data/README.md +270 -20
- data/docs/development/README.md +120 -0
- data/docs/development/error-reporting.md +361 -0
- data/documents/AST.md +126 -0
- data/documents/DSL.md +154 -0
- data/documents/FUNCTIONS.md +132 -0
- data/documents/SYNTAX.md +367 -0
- data/examples/deep_schema_compilation_and_evaluation_benchmark.rb +106 -0
- data/examples/federal_tax_calculator_2024.rb +112 -0
- data/examples/wide_schema_compilation_and_evaluation_benchmark.rb +80 -0
- data/lib/generators/trait_engine/templates/schema_spec.rb.erb +27 -0
- data/lib/kumi/analyzer/constant_evaluator.rb +51 -0
- data/lib/kumi/analyzer/passes/definition_validator.rb +42 -0
- data/lib/kumi/analyzer/passes/dependency_resolver.rb +71 -0
- data/lib/kumi/analyzer/passes/input_collector.rb +55 -0
- data/lib/kumi/analyzer/passes/name_indexer.rb +24 -0
- data/lib/kumi/analyzer/passes/pass_base.rb +67 -0
- data/lib/kumi/analyzer/passes/toposorter.rb +72 -0
- data/lib/kumi/analyzer/passes/type_checker.rb +139 -0
- data/lib/kumi/analyzer/passes/type_consistency_checker.rb +45 -0
- data/lib/kumi/analyzer/passes/type_inferencer.rb +125 -0
- data/lib/kumi/analyzer/passes/unsat_detector.rb +107 -0
- data/lib/kumi/analyzer/passes/visitor_pass.rb +41 -0
- data/lib/kumi/analyzer.rb +54 -0
- data/lib/kumi/atom_unsat_solver.rb +349 -0
- data/lib/kumi/compiled_schema.rb +41 -0
- data/lib/kumi/compiler.rb +127 -0
- data/lib/kumi/domain/enum_analyzer.rb +53 -0
- data/lib/kumi/domain/range_analyzer.rb +83 -0
- data/lib/kumi/domain/validator.rb +84 -0
- data/lib/kumi/domain/violation_formatter.rb +40 -0
- data/lib/kumi/domain.rb +8 -0
- data/lib/kumi/error_reporter.rb +164 -0
- data/lib/kumi/error_reporting.rb +95 -0
- data/lib/kumi/errors.rb +116 -0
- data/lib/kumi/evaluation_wrapper.rb +22 -0
- data/lib/kumi/explain.rb +281 -0
- data/lib/kumi/export/deserializer.rb +39 -0
- data/lib/kumi/export/errors.rb +12 -0
- data/lib/kumi/export/node_builders.rb +140 -0
- data/lib/kumi/export/node_registry.rb +38 -0
- data/lib/kumi/export/node_serializers.rb +156 -0
- data/lib/kumi/export/serializer.rb +23 -0
- data/lib/kumi/export.rb +33 -0
- data/lib/kumi/function_registry/collection_functions.rb +92 -0
- data/lib/kumi/function_registry/comparison_functions.rb +31 -0
- data/lib/kumi/function_registry/conditional_functions.rb +36 -0
- data/lib/kumi/function_registry/function_builder.rb +92 -0
- data/lib/kumi/function_registry/logical_functions.rb +42 -0
- data/lib/kumi/function_registry/math_functions.rb +72 -0
- data/lib/kumi/function_registry/string_functions.rb +54 -0
- data/lib/kumi/function_registry/type_functions.rb +51 -0
- data/lib/kumi/function_registry.rb +138 -0
- data/lib/kumi/input/type_matcher.rb +92 -0
- data/lib/kumi/input/validator.rb +52 -0
- data/lib/kumi/input/violation_creator.rb +50 -0
- data/lib/kumi/input.rb +8 -0
- data/lib/kumi/parser/build_context.rb +25 -0
- data/lib/kumi/parser/dsl.rb +12 -0
- data/lib/kumi/parser/dsl_cascade_builder.rb +125 -0
- data/lib/kumi/parser/expression_converter.rb +58 -0
- data/lib/kumi/parser/guard_rails.rb +43 -0
- data/lib/kumi/parser/input_builder.rb +94 -0
- data/lib/kumi/parser/input_proxy.rb +29 -0
- data/lib/kumi/parser/parser.rb +66 -0
- data/lib/kumi/parser/schema_builder.rb +172 -0
- data/lib/kumi/parser/sugar.rb +108 -0
- data/lib/kumi/schema.rb +49 -0
- data/lib/kumi/schema_instance.rb +43 -0
- data/lib/kumi/syntax/declarations.rb +23 -0
- data/lib/kumi/syntax/expressions.rb +30 -0
- data/lib/kumi/syntax/node.rb +46 -0
- data/lib/kumi/syntax/root.rb +12 -0
- data/lib/kumi/syntax/terminal_expressions.rb +27 -0
- data/lib/kumi/syntax.rb +9 -0
- data/lib/kumi/types/builder.rb +21 -0
- data/lib/kumi/types/compatibility.rb +86 -0
- data/lib/kumi/types/formatter.rb +24 -0
- data/lib/kumi/types/inference.rb +40 -0
- data/lib/kumi/types/normalizer.rb +70 -0
- data/lib/kumi/types/validator.rb +35 -0
- data/lib/kumi/types.rb +64 -0
- data/lib/kumi/version.rb +1 -1
- data/lib/kumi.rb +7 -3
- data/scripts/generate_function_docs.rb +59 -0
- data/test_impossible_cascade.rb +51 -0
- metadata +93 -10
- data/sig/kumi.rbs +0 -4
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "date"
|
4
|
+
|
5
|
+
module Kumi
|
6
|
+
module Types
|
7
|
+
# Infers types from Ruby values
|
8
|
+
class Inference
|
9
|
+
def self.infer_from_value(value)
|
10
|
+
case value
|
11
|
+
when String then :string
|
12
|
+
when Integer then :integer
|
13
|
+
when Float then :float
|
14
|
+
when TrueClass, FalseClass then :boolean
|
15
|
+
when Symbol then :symbol
|
16
|
+
when Regexp then :regexp
|
17
|
+
when Time then :time
|
18
|
+
when DateTime then :datetime
|
19
|
+
when Date then :date
|
20
|
+
when Array
|
21
|
+
return Kumi::Types.array(:any) if value.empty?
|
22
|
+
|
23
|
+
# Infer element type from first element (simple heuristic)
|
24
|
+
first_elem_type = infer_from_value(value.first)
|
25
|
+
Kumi::Types.array(first_elem_type)
|
26
|
+
when Hash
|
27
|
+
return Kumi::Types.hash(:any, :any) if value.empty?
|
28
|
+
|
29
|
+
# Infer key/value types from first pair (simple heuristic)
|
30
|
+
first_key, first_value = value.first
|
31
|
+
key_type = infer_from_value(first_key)
|
32
|
+
value_type = infer_from_value(first_value)
|
33
|
+
Kumi::Types.hash(key_type, value_type)
|
34
|
+
else
|
35
|
+
:any
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "date"
|
4
|
+
|
5
|
+
module Kumi
|
6
|
+
module Types
|
7
|
+
# Normalizes different type inputs to canonical forms
|
8
|
+
class Normalizer
|
9
|
+
# Type normalization - convert various inputs to canonical type symbols
|
10
|
+
def self.normalize(type_input)
|
11
|
+
case type_input
|
12
|
+
when Symbol
|
13
|
+
return type_input if Validator.valid_type?(type_input)
|
14
|
+
|
15
|
+
raise ArgumentError, "Invalid type symbol: #{type_input}"
|
16
|
+
when String
|
17
|
+
symbol_type = type_input.to_sym
|
18
|
+
return symbol_type if Validator.valid_type?(symbol_type)
|
19
|
+
|
20
|
+
raise ArgumentError, "Invalid type string: #{type_input}"
|
21
|
+
when Hash
|
22
|
+
return type_input if Validator.valid_type?(type_input)
|
23
|
+
|
24
|
+
raise ArgumentError, "Invalid type hash: #{type_input}"
|
25
|
+
when Class
|
26
|
+
# Handle Ruby class inputs
|
27
|
+
case type_input.name
|
28
|
+
when "Integer" then :integer
|
29
|
+
when "String" then :string
|
30
|
+
when "Float" then :float
|
31
|
+
when "TrueClass", "FalseClass" then :boolean
|
32
|
+
when "Array" then raise ArgumentError, "Use array(:type) helper for array types"
|
33
|
+
when "Hash" then raise ArgumentError, "Use hash(:key_type, :value_type) helper for hash types"
|
34
|
+
else
|
35
|
+
raise ArgumentError, "Unsupported class type: #{type_input}"
|
36
|
+
end
|
37
|
+
else
|
38
|
+
case type_input
|
39
|
+
when Integer, Float, Numeric
|
40
|
+
raise ArgumentError, "Type must be a symbol, got #{type_input} (#{type_input.class})"
|
41
|
+
else
|
42
|
+
raise ArgumentError, "Invalid type input: #{type_input} (#{type_input.class})"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Legacy compatibility - coerce old constants to symbols
|
48
|
+
def self.coerce(type_input)
|
49
|
+
# Handle legacy constant usage
|
50
|
+
return type_input if type_input.is_a?(Symbol) && Validator.valid_type?(type_input)
|
51
|
+
|
52
|
+
# Handle legacy constant objects
|
53
|
+
case type_input
|
54
|
+
when STRING then :string
|
55
|
+
when INT then :integer
|
56
|
+
when FLOAT, NUMERIC then :float # Both FLOAT and NUMERIC map to :float
|
57
|
+
when BOOL then :boolean
|
58
|
+
when ANY then :any
|
59
|
+
when SYMBOL then :symbol
|
60
|
+
when REGEXP then :regexp
|
61
|
+
when TIME then :time
|
62
|
+
when DATE then :date
|
63
|
+
when DATETIME then :datetime
|
64
|
+
else
|
65
|
+
normalize(type_input)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kumi
|
4
|
+
module Types
|
5
|
+
# Validates type definitions and structures
|
6
|
+
class Validator
|
7
|
+
VALID_TYPES = %i[string integer float boolean any symbol regexp time date datetime].freeze
|
8
|
+
|
9
|
+
def self.valid_type?(type)
|
10
|
+
return true if VALID_TYPES.include?(type)
|
11
|
+
return true if array_type?(type)
|
12
|
+
return true if hash_type?(type)
|
13
|
+
|
14
|
+
false
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.array_type?(type)
|
18
|
+
type.is_a?(Hash) && type.keys == [:array] && valid_type?(type[:array])
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.hash_type?(type)
|
22
|
+
type.is_a?(Hash) &&
|
23
|
+
type.keys.sort == [:hash] &&
|
24
|
+
type[:hash].is_a?(Array) &&
|
25
|
+
type[:hash].size == 2 &&
|
26
|
+
valid_type?(type[:hash][0]) &&
|
27
|
+
valid_type?(type[:hash][1])
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.primitive_type?(type)
|
31
|
+
VALID_TYPES.include?(type)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/kumi/types.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kumi
|
4
|
+
module Types
|
5
|
+
# Re-export constants for compatibility
|
6
|
+
VALID_TYPES = Validator::VALID_TYPES
|
7
|
+
|
8
|
+
# Validation methods
|
9
|
+
def self.valid_type?(type)
|
10
|
+
Validator.valid_type?(type)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Type builders
|
14
|
+
def self.array(elem_type)
|
15
|
+
Builder.array(elem_type)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.hash(key_type, val_type)
|
19
|
+
Builder.hash(key_type, val_type)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Normalization
|
23
|
+
def self.normalize(type_input)
|
24
|
+
Normalizer.normalize(type_input)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.coerce(type_input)
|
28
|
+
Normalizer.coerce(type_input)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Compatibility and unification
|
32
|
+
def self.compatible?(type1, type2)
|
33
|
+
Compatibility.compatible?(type1, type2)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.unify(type1, type2)
|
37
|
+
Compatibility.unify(type1, type2)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Type inference
|
41
|
+
def self.infer_from_value(value)
|
42
|
+
Inference.infer_from_value(value)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Formatting
|
46
|
+
def self.type_to_s(type)
|
47
|
+
Formatter.type_to_s(type)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Legacy compatibility constants (will be phased out)
|
51
|
+
# These should be replaced with symbols in user code over time
|
52
|
+
STRING = :string
|
53
|
+
INT = :integer # NOTE: using :integer instead of :int for clarity
|
54
|
+
FLOAT = :float
|
55
|
+
BOOL = :boolean
|
56
|
+
ANY = :any
|
57
|
+
SYMBOL = :symbol
|
58
|
+
REGEXP = :regexp
|
59
|
+
TIME = :time
|
60
|
+
DATE = :date
|
61
|
+
DATETIME = :datetime
|
62
|
+
NUMERIC = :float # Legacy: represents numeric compatibility
|
63
|
+
end
|
64
|
+
end
|
data/lib/kumi/version.rb
CHANGED
data/lib/kumi.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require "zeitwerk"
|
4
|
+
# require "pry" # COMMENT AFTER DEBUGGING
|
5
|
+
|
6
|
+
loader = Zeitwerk::Loader.for_gem
|
7
|
+
loader.ignore("#{__dir__}/kumi-cli")
|
8
|
+
loader.setup
|
4
9
|
|
5
10
|
module Kumi
|
6
|
-
|
7
|
-
# Your code goes here...
|
11
|
+
extend Schema
|
8
12
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# This script loads the Kumi library and introspects the FunctionRegistry
|
5
|
+
# to generate a Markdown reference for the standard function library.
|
6
|
+
|
7
|
+
require "bundler/setup"
|
8
|
+
require "kumi"
|
9
|
+
|
10
|
+
# Helper to format the type information for display.
|
11
|
+
def format_type(type)
|
12
|
+
Kumi::Types.type_to_s(type)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Helper to generate a signature string for a function.
|
16
|
+
def generate_signature(name, signature)
|
17
|
+
params = if signature[:arity].negative?
|
18
|
+
# Variadic function (e.g., add, concat)
|
19
|
+
param_type = format_type(signature[:param_types].first || :any)
|
20
|
+
"#{param_type}1, #{param_type}2, ..."
|
21
|
+
else
|
22
|
+
# Fixed arity function
|
23
|
+
signature[:param_types].map.with_index { |type, i| "#{format_type(type)} arg#{i + 1}" }.join(", ")
|
24
|
+
end
|
25
|
+
|
26
|
+
return_type = format_type(signature[:return_type])
|
27
|
+
"`fn(:#{name}, #{params})` → `#{return_type}`"
|
28
|
+
end
|
29
|
+
|
30
|
+
# Main documentation generation logic.
|
31
|
+
def generate_docs
|
32
|
+
output = []
|
33
|
+
output << "# Kumi Standard Function Library Reference"
|
34
|
+
output << "\nKumi provides a rich library of built-in functions for use within `value` and `trait` expressions via `fn(...)`."
|
35
|
+
|
36
|
+
categories = {
|
37
|
+
"Logical Functions" => Kumi::FunctionRegistry.logical_operations,
|
38
|
+
"Comparison Functions" => Kumi::FunctionRegistry.comparison_operators,
|
39
|
+
"Math Functions" => Kumi::FunctionRegistry.math_operations,
|
40
|
+
"String Functions" => Kumi::FunctionRegistry.string_operations,
|
41
|
+
"Collection Functions" => Kumi::FunctionRegistry.collection_operations,
|
42
|
+
"Conditional Functions" => Kumi::FunctionRegistry.conditional_operations,
|
43
|
+
"Type & Hash Functions" => Kumi::FunctionRegistry.type_operations
|
44
|
+
}
|
45
|
+
|
46
|
+
categories.each do |title, functions|
|
47
|
+
output << "\n## #{title}\n"
|
48
|
+
functions.sort.each do |name|
|
49
|
+
signature = Kumi::FunctionRegistry.signature(name)
|
50
|
+
output << "* **`#{name}`**: #{signature[:description]}"
|
51
|
+
output << " * **Usage**: #{generate_signature(name, signature)}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
output.join("\n")
|
56
|
+
end
|
57
|
+
|
58
|
+
# Execute the script and print the documentation.
|
59
|
+
puts generate_docs
|
@@ -0,0 +1,51 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require_relative "lib/kumi"
|
5
|
+
|
6
|
+
# This test demonstrates that the UnsatDetector still correctly catches
|
7
|
+
# genuinely impossible cascade conditions after our fix
|
8
|
+
|
9
|
+
puts "🧪 Testing UnsatDetector Catches Impossible Cascade Conditions"
|
10
|
+
puts "=" * 60
|
11
|
+
|
12
|
+
begin
|
13
|
+
impossible_schema = Class.new do
|
14
|
+
extend Kumi::Schema
|
15
|
+
|
16
|
+
schema do
|
17
|
+
input do
|
18
|
+
integer :age, domain: 0..150
|
19
|
+
end
|
20
|
+
|
21
|
+
# These traits are individually satisfiable
|
22
|
+
trait :very_young, input.age, :<, 25
|
23
|
+
trait :very_old, input.age, :>, 65
|
24
|
+
|
25
|
+
# This cascade condition combines contradictory traits - should be caught!
|
26
|
+
value :impossible_condition do
|
27
|
+
on :very_young, :very_old, "Impossible: young AND old" # age < 25 AND age > 65
|
28
|
+
base "Normal"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
puts "❌ ERROR: Should have caught impossible cascade condition!"
|
34
|
+
|
35
|
+
rescue Kumi::Errors::SemanticError => e
|
36
|
+
if e.message.include?("conjunction") && e.message.include?("logically impossible")
|
37
|
+
puts "✅ CORRECTLY CAUGHT impossible cascade condition!"
|
38
|
+
puts " Error: #{e.message}"
|
39
|
+
puts
|
40
|
+
puts " This proves the UnsatDetector still works for genuinely impossible conditions"
|
41
|
+
puts " while allowing valid mutually exclusive cascades."
|
42
|
+
else
|
43
|
+
puts "❌ UNEXPECTED ERROR: #{e.message}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
puts
|
48
|
+
puts "🎉 UnsatDetector Fix Validation Complete!"
|
49
|
+
puts " ✅ Valid mutually exclusive cascades: WORK"
|
50
|
+
puts " ✅ Impossible cascade conditions: CAUGHT"
|
51
|
+
puts " ✅ Existing functionality: PRESERVED"
|
metadata
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kumi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- André Muta
|
8
|
-
bindir:
|
8
|
+
bindir: bin
|
9
9
|
cert_chain: []
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
@@ -15,17 +15,14 @@ dependencies:
|
|
15
15
|
requirements:
|
16
16
|
- - "~>"
|
17
17
|
- !ruby/object:Gem::Version
|
18
|
-
version:
|
18
|
+
version: 2.6.0
|
19
19
|
type: :runtime
|
20
20
|
prerelease: false
|
21
21
|
version_requirements: !ruby/object:Gem::Requirement
|
22
22
|
requirements:
|
23
23
|
- - "~>"
|
24
24
|
- !ruby/object:Gem::Version
|
25
|
-
version:
|
26
|
-
description: Kumi replaces nested if/else logic with a concise DSL that maps data
|
27
|
-
sources to derived attributes using reusable traits, functions,
|
28
|
-
and decision tables.
|
25
|
+
version: 2.6.0
|
29
26
|
email:
|
30
27
|
- andremuta@gmail.com
|
31
28
|
executables: []
|
@@ -35,12 +32,95 @@ files:
|
|
35
32
|
- ".rspec"
|
36
33
|
- ".rubocop.yml"
|
37
34
|
- CHANGELOG.md
|
35
|
+
- CLAUDE.md
|
38
36
|
- LICENSE.txt
|
39
37
|
- README.md
|
40
38
|
- Rakefile
|
39
|
+
- docs/development/README.md
|
40
|
+
- docs/development/error-reporting.md
|
41
|
+
- documents/AST.md
|
42
|
+
- documents/DSL.md
|
43
|
+
- documents/FUNCTIONS.md
|
44
|
+
- documents/SYNTAX.md
|
45
|
+
- examples/deep_schema_compilation_and_evaluation_benchmark.rb
|
46
|
+
- examples/federal_tax_calculator_2024.rb
|
47
|
+
- examples/wide_schema_compilation_and_evaluation_benchmark.rb
|
48
|
+
- lib/generators/trait_engine/templates/schema_spec.rb.erb
|
41
49
|
- lib/kumi.rb
|
50
|
+
- lib/kumi/analyzer.rb
|
51
|
+
- lib/kumi/analyzer/constant_evaluator.rb
|
52
|
+
- lib/kumi/analyzer/passes/definition_validator.rb
|
53
|
+
- lib/kumi/analyzer/passes/dependency_resolver.rb
|
54
|
+
- lib/kumi/analyzer/passes/input_collector.rb
|
55
|
+
- lib/kumi/analyzer/passes/name_indexer.rb
|
56
|
+
- lib/kumi/analyzer/passes/pass_base.rb
|
57
|
+
- lib/kumi/analyzer/passes/toposorter.rb
|
58
|
+
- lib/kumi/analyzer/passes/type_checker.rb
|
59
|
+
- lib/kumi/analyzer/passes/type_consistency_checker.rb
|
60
|
+
- lib/kumi/analyzer/passes/type_inferencer.rb
|
61
|
+
- lib/kumi/analyzer/passes/unsat_detector.rb
|
62
|
+
- lib/kumi/analyzer/passes/visitor_pass.rb
|
63
|
+
- lib/kumi/atom_unsat_solver.rb
|
64
|
+
- lib/kumi/compiled_schema.rb
|
65
|
+
- lib/kumi/compiler.rb
|
66
|
+
- lib/kumi/domain.rb
|
67
|
+
- lib/kumi/domain/enum_analyzer.rb
|
68
|
+
- lib/kumi/domain/range_analyzer.rb
|
69
|
+
- lib/kumi/domain/validator.rb
|
70
|
+
- lib/kumi/domain/violation_formatter.rb
|
71
|
+
- lib/kumi/error_reporter.rb
|
72
|
+
- lib/kumi/error_reporting.rb
|
73
|
+
- lib/kumi/errors.rb
|
74
|
+
- lib/kumi/evaluation_wrapper.rb
|
75
|
+
- lib/kumi/explain.rb
|
76
|
+
- lib/kumi/export.rb
|
77
|
+
- lib/kumi/export/deserializer.rb
|
78
|
+
- lib/kumi/export/errors.rb
|
79
|
+
- lib/kumi/export/node_builders.rb
|
80
|
+
- lib/kumi/export/node_registry.rb
|
81
|
+
- lib/kumi/export/node_serializers.rb
|
82
|
+
- lib/kumi/export/serializer.rb
|
83
|
+
- lib/kumi/function_registry.rb
|
84
|
+
- lib/kumi/function_registry/collection_functions.rb
|
85
|
+
- lib/kumi/function_registry/comparison_functions.rb
|
86
|
+
- lib/kumi/function_registry/conditional_functions.rb
|
87
|
+
- lib/kumi/function_registry/function_builder.rb
|
88
|
+
- lib/kumi/function_registry/logical_functions.rb
|
89
|
+
- lib/kumi/function_registry/math_functions.rb
|
90
|
+
- lib/kumi/function_registry/string_functions.rb
|
91
|
+
- lib/kumi/function_registry/type_functions.rb
|
92
|
+
- lib/kumi/input.rb
|
93
|
+
- lib/kumi/input/type_matcher.rb
|
94
|
+
- lib/kumi/input/validator.rb
|
95
|
+
- lib/kumi/input/violation_creator.rb
|
96
|
+
- lib/kumi/parser/build_context.rb
|
97
|
+
- lib/kumi/parser/dsl.rb
|
98
|
+
- lib/kumi/parser/dsl_cascade_builder.rb
|
99
|
+
- lib/kumi/parser/expression_converter.rb
|
100
|
+
- lib/kumi/parser/guard_rails.rb
|
101
|
+
- lib/kumi/parser/input_builder.rb
|
102
|
+
- lib/kumi/parser/input_proxy.rb
|
103
|
+
- lib/kumi/parser/parser.rb
|
104
|
+
- lib/kumi/parser/schema_builder.rb
|
105
|
+
- lib/kumi/parser/sugar.rb
|
106
|
+
- lib/kumi/schema.rb
|
107
|
+
- lib/kumi/schema_instance.rb
|
108
|
+
- lib/kumi/syntax.rb
|
109
|
+
- lib/kumi/syntax/declarations.rb
|
110
|
+
- lib/kumi/syntax/expressions.rb
|
111
|
+
- lib/kumi/syntax/node.rb
|
112
|
+
- lib/kumi/syntax/root.rb
|
113
|
+
- lib/kumi/syntax/terminal_expressions.rb
|
114
|
+
- lib/kumi/types.rb
|
115
|
+
- lib/kumi/types/builder.rb
|
116
|
+
- lib/kumi/types/compatibility.rb
|
117
|
+
- lib/kumi/types/formatter.rb
|
118
|
+
- lib/kumi/types/inference.rb
|
119
|
+
- lib/kumi/types/normalizer.rb
|
120
|
+
- lib/kumi/types/validator.rb
|
42
121
|
- lib/kumi/version.rb
|
43
|
-
-
|
122
|
+
- scripts/generate_function_docs.rb
|
123
|
+
- test_impossible_cascade.rb
|
44
124
|
homepage: https://github.com/amuta/kumi
|
45
125
|
licenses:
|
46
126
|
- MIT
|
@@ -49,6 +129,7 @@ metadata:
|
|
49
129
|
homepage_uri: https://github.com/amuta/kumi
|
50
130
|
source_code_uri: https://github.com/amuta/kumi
|
51
131
|
changelog_uri: https://github.com/amuta/kumi/blob/main/CHANGELOG.md
|
132
|
+
rubygems_mfa_required: 'true'
|
52
133
|
rdoc_options: []
|
53
134
|
require_paths:
|
54
135
|
- lib
|
@@ -63,7 +144,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
63
144
|
- !ruby/object:Gem::Version
|
64
145
|
version: '0'
|
65
146
|
requirements: []
|
66
|
-
rubygems_version: 3.
|
147
|
+
rubygems_version: 3.7.1
|
67
148
|
specification_version: 4
|
68
|
-
summary:
|
149
|
+
summary: A declarative Ruby DSL for defining business rules and calculations with
|
150
|
+
static dependency checks, cycle detection, domain validation, and human‑readable
|
151
|
+
explainability.
|
69
152
|
test_files: []
|
data/sig/kumi.rbs
DELETED