kumi 0.0.0 → 0.0.3

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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +113 -3
  3. data/CHANGELOG.md +21 -1
  4. data/CLAUDE.md +387 -0
  5. data/README.md +257 -20
  6. data/docs/development/README.md +120 -0
  7. data/docs/development/error-reporting.md +361 -0
  8. data/documents/AST.md +126 -0
  9. data/documents/DSL.md +154 -0
  10. data/documents/FUNCTIONS.md +132 -0
  11. data/documents/SYNTAX.md +367 -0
  12. data/examples/deep_schema_compilation_and_evaluation_benchmark.rb +106 -0
  13. data/examples/federal_tax_calculator_2024.rb +112 -0
  14. data/examples/wide_schema_compilation_and_evaluation_benchmark.rb +80 -0
  15. data/lib/generators/trait_engine/templates/schema_spec.rb.erb +27 -0
  16. data/lib/kumi/analyzer/constant_evaluator.rb +51 -0
  17. data/lib/kumi/analyzer/passes/definition_validator.rb +42 -0
  18. data/lib/kumi/analyzer/passes/dependency_resolver.rb +71 -0
  19. data/lib/kumi/analyzer/passes/input_collector.rb +55 -0
  20. data/lib/kumi/analyzer/passes/name_indexer.rb +24 -0
  21. data/lib/kumi/analyzer/passes/pass_base.rb +67 -0
  22. data/lib/kumi/analyzer/passes/toposorter.rb +72 -0
  23. data/lib/kumi/analyzer/passes/type_checker.rb +139 -0
  24. data/lib/kumi/analyzer/passes/type_consistency_checker.rb +45 -0
  25. data/lib/kumi/analyzer/passes/type_inferencer.rb +125 -0
  26. data/lib/kumi/analyzer/passes/unsat_detector.rb +107 -0
  27. data/lib/kumi/analyzer/passes/visitor_pass.rb +41 -0
  28. data/lib/kumi/analyzer.rb +54 -0
  29. data/lib/kumi/atom_unsat_solver.rb +349 -0
  30. data/lib/kumi/compiled_schema.rb +41 -0
  31. data/lib/kumi/compiler.rb +127 -0
  32. data/lib/kumi/domain/enum_analyzer.rb +53 -0
  33. data/lib/kumi/domain/range_analyzer.rb +83 -0
  34. data/lib/kumi/domain/validator.rb +84 -0
  35. data/lib/kumi/domain/violation_formatter.rb +40 -0
  36. data/lib/kumi/domain.rb +8 -0
  37. data/lib/kumi/error_reporter.rb +164 -0
  38. data/lib/kumi/error_reporting.rb +95 -0
  39. data/lib/kumi/errors.rb +116 -0
  40. data/lib/kumi/evaluation_wrapper.rb +20 -0
  41. data/lib/kumi/explain.rb +282 -0
  42. data/lib/kumi/export/deserializer.rb +39 -0
  43. data/lib/kumi/export/errors.rb +12 -0
  44. data/lib/kumi/export/node_builders.rb +140 -0
  45. data/lib/kumi/export/node_registry.rb +38 -0
  46. data/lib/kumi/export/node_serializers.rb +156 -0
  47. data/lib/kumi/export/serializer.rb +23 -0
  48. data/lib/kumi/export.rb +33 -0
  49. data/lib/kumi/function_registry/collection_functions.rb +92 -0
  50. data/lib/kumi/function_registry/comparison_functions.rb +31 -0
  51. data/lib/kumi/function_registry/conditional_functions.rb +36 -0
  52. data/lib/kumi/function_registry/function_builder.rb +92 -0
  53. data/lib/kumi/function_registry/logical_functions.rb +42 -0
  54. data/lib/kumi/function_registry/math_functions.rb +72 -0
  55. data/lib/kumi/function_registry/string_functions.rb +54 -0
  56. data/lib/kumi/function_registry/type_functions.rb +51 -0
  57. data/lib/kumi/function_registry.rb +138 -0
  58. data/lib/kumi/input/type_matcher.rb +92 -0
  59. data/lib/kumi/input/validator.rb +52 -0
  60. data/lib/kumi/input/violation_creator.rb +50 -0
  61. data/lib/kumi/input.rb +8 -0
  62. data/lib/kumi/parser/build_context.rb +25 -0
  63. data/lib/kumi/parser/dsl.rb +12 -0
  64. data/lib/kumi/parser/dsl_cascade_builder.rb +125 -0
  65. data/lib/kumi/parser/expression_converter.rb +58 -0
  66. data/lib/kumi/parser/guard_rails.rb +43 -0
  67. data/lib/kumi/parser/input_builder.rb +94 -0
  68. data/lib/kumi/parser/input_proxy.rb +29 -0
  69. data/lib/kumi/parser/parser.rb +66 -0
  70. data/lib/kumi/parser/schema_builder.rb +172 -0
  71. data/lib/kumi/parser/sugar.rb +108 -0
  72. data/lib/kumi/schema.rb +49 -0
  73. data/lib/kumi/schema_instance.rb +43 -0
  74. data/lib/kumi/syntax/declarations.rb +23 -0
  75. data/lib/kumi/syntax/expressions.rb +30 -0
  76. data/lib/kumi/syntax/node.rb +46 -0
  77. data/lib/kumi/syntax/root.rb +12 -0
  78. data/lib/kumi/syntax/terminal_expressions.rb +27 -0
  79. data/lib/kumi/syntax.rb +9 -0
  80. data/lib/kumi/types/builder.rb +21 -0
  81. data/lib/kumi/types/compatibility.rb +86 -0
  82. data/lib/kumi/types/formatter.rb +24 -0
  83. data/lib/kumi/types/inference.rb +40 -0
  84. data/lib/kumi/types/normalizer.rb +70 -0
  85. data/lib/kumi/types/validator.rb +35 -0
  86. data/lib/kumi/types.rb +64 -0
  87. data/lib/kumi/version.rb +1 -1
  88. data/lib/kumi.rb +7 -3
  89. data/scripts/generate_function_docs.rb +59 -0
  90. data/test_impossible_cascade.rb +51 -0
  91. metadata +93 -10
  92. 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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kumi
4
- VERSION = "0.0.0"
4
+ VERSION = "0.0.3"
5
5
  end
data/lib/kumi.rb CHANGED
@@ -1,8 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "kumi/version"
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
- class Error < StandardError; end
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.0
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - André Muta
8
- bindir: exe
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: '2.6'
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: '2.6'
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
- - sig/kumi.rbs
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.6.9
147
+ rubygems_version: 3.7.1
67
148
  specification_version: 4
68
- summary: Declarative trait-driven attribute mapping DSL for Ruby.
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
@@ -1,4 +0,0 @@
1
- module Kumi
2
- VERSION: String
3
- # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
- end