kumi 0.0.9 β†’ 0.0.10

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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/CLAUDE.md +28 -44
  3. data/README.md +187 -120
  4. data/docs/AST.md +1 -1
  5. data/docs/FUNCTIONS.md +52 -8
  6. data/docs/compiler_design_principles.md +86 -0
  7. data/docs/features/README.md +15 -2
  8. data/docs/features/hierarchical-broadcasting.md +349 -0
  9. data/docs/features/javascript-transpiler.md +148 -0
  10. data/docs/features/performance.md +1 -3
  11. data/docs/schema_metadata.md +7 -7
  12. data/examples/game_of_life.rb +2 -4
  13. data/lib/kumi/analyzer.rb +0 -2
  14. data/lib/kumi/compiler.rb +6 -275
  15. data/lib/kumi/core/analyzer/passes/broadcast_detector.rb +600 -42
  16. data/lib/kumi/core/analyzer/passes/input_collector.rb +4 -2
  17. data/lib/kumi/core/analyzer/passes/semantic_constraint_validator.rb +27 -0
  18. data/lib/kumi/core/analyzer/passes/type_checker.rb +6 -2
  19. data/lib/kumi/core/analyzer/passes/unsat_detector.rb +90 -46
  20. data/lib/kumi/core/cascade_executor_builder.rb +132 -0
  21. data/lib/kumi/core/compiler/expression_compiler.rb +146 -0
  22. data/lib/kumi/core/compiler/function_invoker.rb +55 -0
  23. data/lib/kumi/core/compiler/path_traversal_compiler.rb +158 -0
  24. data/lib/kumi/core/compiler/reference_compiler.rb +46 -0
  25. data/lib/kumi/core/compiler_base.rb +137 -0
  26. data/lib/kumi/core/explain.rb +2 -2
  27. data/lib/kumi/core/function_registry/collection_functions.rb +86 -3
  28. data/lib/kumi/core/function_registry/function_builder.rb +5 -3
  29. data/lib/kumi/core/function_registry/logical_functions.rb +171 -1
  30. data/lib/kumi/core/function_registry/stat_functions.rb +156 -0
  31. data/lib/kumi/core/function_registry.rb +32 -10
  32. data/lib/kumi/core/nested_structure_utils.rb +78 -0
  33. data/lib/kumi/core/ruby_parser/dsl_cascade_builder.rb +2 -2
  34. data/lib/kumi/core/ruby_parser/input_builder.rb +61 -8
  35. data/lib/kumi/core/schema_instance.rb +4 -0
  36. data/lib/kumi/core/vectorized_function_builder.rb +88 -0
  37. data/lib/kumi/errors.rb +2 -0
  38. data/lib/kumi/js/compiler.rb +878 -0
  39. data/lib/kumi/js/function_registry.rb +333 -0
  40. data/lib/kumi/js.rb +23 -0
  41. data/lib/kumi/registry.rb +61 -1
  42. data/lib/kumi/schema.rb +1 -1
  43. data/lib/kumi/support/s_expression_printer.rb +16 -15
  44. data/lib/kumi/syntax/array_expression.rb +6 -6
  45. data/lib/kumi/syntax/call_expression.rb +4 -4
  46. data/lib/kumi/syntax/cascade_expression.rb +4 -4
  47. data/lib/kumi/syntax/case_expression.rb +4 -4
  48. data/lib/kumi/syntax/declaration_reference.rb +4 -4
  49. data/lib/kumi/syntax/hash_expression.rb +4 -4
  50. data/lib/kumi/syntax/input_declaration.rb +6 -5
  51. data/lib/kumi/syntax/input_element_reference.rb +5 -5
  52. data/lib/kumi/syntax/input_reference.rb +5 -5
  53. data/lib/kumi/syntax/literal.rb +4 -4
  54. data/lib/kumi/syntax/node.rb +34 -34
  55. data/lib/kumi/syntax/root.rb +6 -6
  56. data/lib/kumi/syntax/trait_declaration.rb +4 -4
  57. data/lib/kumi/syntax/value_declaration.rb +4 -4
  58. data/lib/kumi/version.rb +1 -1
  59. data/lib/kumi.rb +1 -1
  60. data/scripts/analyze_broadcast_methods.rb +68 -0
  61. data/scripts/analyze_cascade_methods.rb +74 -0
  62. data/scripts/check_broadcasting_coverage.rb +51 -0
  63. data/scripts/find_dead_code.rb +114 -0
  64. metadata +20 -4
  65. data/docs/features/array-broadcasting.md +0 -170
  66. data/lib/kumi/cli.rb +0 -449
  67. data/lib/kumi/core/vectorization_metadata.rb +0 -110
@@ -2,11 +2,11 @@
2
2
 
3
3
  module Kumi
4
4
  module Syntax
5
- # For field usage/reference in expressions (input.field_name)
6
- InputElementReference = Struct.new(:path) do
7
- include Node
5
+ # For field usage/reference in expressions (input.field_name)
6
+ InputElementReference = Struct.new(:path) do
7
+ include Node
8
8
 
9
- def children = []
10
- end
9
+ def children = []
10
+ end
11
11
  end
12
12
  end
@@ -2,11 +2,11 @@
2
2
 
3
3
  module Kumi
4
4
  module Syntax
5
- # For field usage/reference in expressions (input.field_name)
6
- InputReference = Struct.new(:name) do
7
- include Node
5
+ # For field usage/reference in expressions (input.field_name)
6
+ InputReference = Struct.new(:name) do
7
+ include Node
8
8
 
9
- def children = []
10
- end
9
+ def children = []
10
+ end
11
11
  end
12
12
  end
@@ -2,10 +2,10 @@
2
2
 
3
3
  module Kumi
4
4
  module Syntax
5
- Literal = Struct.new(:value) do
6
- include Node
5
+ Literal = Struct.new(:value) do
6
+ include Node
7
7
 
8
- def children = []
9
- end
8
+ def children = []
9
+ end
10
10
  end
11
11
  end
@@ -2,45 +2,45 @@
2
2
 
3
3
  module Kumi
4
4
  module Syntax
5
- # A struct to hold standardized source location information.
6
- Location = Struct.new(:file, :line, :column, keyword_init: true)
5
+ # A struct to hold standardized source location information.
6
+ Location = Struct.new(:file, :line, :column, keyword_init: true)
7
7
 
8
- # Base module included by all AST nodes to provide a standard
9
- # interface for accessing source location information..
10
- module Node
11
- attr_accessor :loc
8
+ # Base module included by all AST nodes to provide a standard
9
+ # interface for accessing source location information..
10
+ module Node
11
+ attr_accessor :loc
12
12
 
13
- def initialize(*args, loc: nil, **kwargs)
14
- @loc = loc
15
- super(*args, **kwargs)
16
- freeze
17
- end
13
+ def initialize(*args, loc: nil, **kwargs)
14
+ @loc = loc
15
+ super(*args, **kwargs)
16
+ freeze
17
+ end
18
18
 
19
- def ==(other)
20
- other.is_a?(self.class) &&
21
- # for Struct-based nodes
22
- (if respond_to?(:members)
23
- members.all? { |m| self[m] == other[m] }
24
- else
25
- instance_variables.reject { |iv| iv == :@loc }
26
- .all? do |iv|
27
- instance_variable_get(iv) ==
28
- other.instance_variable_get(iv)
29
- end
19
+ def ==(other)
20
+ other.is_a?(self.class) &&
21
+ # for Struct-based nodes
22
+ (if respond_to?(:members)
23
+ members.all? { |m| self[m] == other[m] }
24
+ else
25
+ instance_variables.reject { |iv| iv == :@loc }
26
+ .all? do |iv|
27
+ instance_variable_get(iv) ==
28
+ other.instance_variable_get(iv)
30
29
  end
31
- )
32
- end
33
- alias eql? ==
30
+ end
31
+ )
32
+ end
33
+ alias eql? ==
34
34
 
35
- def hash
36
- values = if respond_to?(:members)
37
- members.map { |m| self[m] }
38
- else
39
- instance_variables.reject { |iv| iv == :@loc }
40
- .map { |iv| instance_variable_get(iv) }
41
- end
42
- [self.class, *values].hash
43
- end
35
+ def hash
36
+ values = if respond_to?(:members)
37
+ members.map { |m| self[m] }
38
+ else
39
+ instance_variables.reject { |iv| iv == :@loc }
40
+ .map { |iv| instance_variable_get(iv) }
41
+ end
42
+ [self.class, *values].hash
44
43
  end
44
+ end
45
45
  end
46
46
  end
@@ -2,12 +2,12 @@
2
2
 
3
3
  module Kumi
4
4
  module Syntax
5
- # Represents the root of the Abstract Syntax Tree.
6
- # It holds all the top-level declarations parsed from the source.
7
- Root = Struct.new(:inputs, :attributes, :traits) do
8
- include Node
5
+ # Represents the root of the Abstract Syntax Tree.
6
+ # It holds all the top-level declarations parsed from the source.
7
+ Root = Struct.new(:inputs, :attributes, :traits) do
8
+ include Node
9
9
 
10
- def children = [inputs, attributes, traits]
11
- end
10
+ def children = [inputs, attributes, traits]
11
+ end
12
12
  end
13
13
  end
@@ -2,10 +2,10 @@
2
2
 
3
3
  module Kumi
4
4
  module Syntax
5
- TraitDeclaration = Struct.new(:name, :expression) do
6
- include Node
5
+ TraitDeclaration = Struct.new(:name, :expression) do
6
+ include Node
7
7
 
8
- def children = [expression]
9
- end
8
+ def children = [expression]
9
+ end
10
10
  end
11
11
  end
@@ -2,10 +2,10 @@
2
2
 
3
3
  module Kumi
4
4
  module Syntax
5
- ValueDeclaration = Struct.new(:name, :expression) do
6
- include Node
5
+ ValueDeclaration = Struct.new(:name, :expression) do
6
+ include Node
7
7
 
8
- def children = [expression]
9
- end
8
+ def children = [expression]
9
+ end
10
10
  end
11
11
  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.9"
4
+ VERSION = "0.0.10"
5
5
  end
data/lib/kumi.rb CHANGED
@@ -11,7 +11,7 @@ module Kumi
11
11
  extend Schema
12
12
 
13
13
  def self.inspector_from_schema
14
- Inspector.new(@__syntax_tree__, @__analyzer_result__, @__compiled_schema__)
14
+ Schema::Inspector.new(@__syntax_tree__, @__analyzer_result__, @__compiled_schema__)
15
15
  end
16
16
 
17
17
  def self.reset!
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "json"
5
+
6
+ coverage_file = "coverage/.resultset.json"
7
+
8
+ unless File.exist?(coverage_file)
9
+ puts "❌ No coverage data found. Run tests first:"
10
+ puts " COVERAGE=true bundle exec rspec"
11
+ exit 1
12
+ end
13
+
14
+ data = JSON.parse(File.read(coverage_file))
15
+ coverage = data.values.first["coverage"]
16
+
17
+ broadcast_file = coverage.find { |file, _| file.include?("broadcast_detector.rb") }
18
+
19
+ if broadcast_file
20
+ file_path, line_data = broadcast_file
21
+ lines = line_data["lines"]
22
+
23
+ puts "πŸ” BroadcastDetector Coverage Analysis:"
24
+ puts "File: #{File.basename(file_path)}"
25
+
26
+ total_lines = lines.count { |hits| !hits.nil? }
27
+ covered_lines = lines.count { |hits| hits && hits > 0 }
28
+ coverage_percent = (covered_lines.to_f / total_lines * 100).round(1)
29
+
30
+ puts "Coverage: #{coverage_percent}% (#{covered_lines}/#{total_lines} lines)"
31
+
32
+ # Find uncovered method definitions
33
+ file_content = File.read(file_path)
34
+ uncovered_methods = []
35
+ covered_methods = []
36
+
37
+ file_content.lines.each_with_index do |line, i|
38
+ if line.match?(/^\s*def\s+(\w+)/)
39
+ method_name = line.match(/^\s*def\s+(\w+)/)[1]
40
+ line_hits = lines[i]
41
+
42
+ if line_hits.nil?
43
+ # Line not tracked
44
+ elsif line_hits == 0
45
+ uncovered_methods << "#{method_name} (line #{i+1})"
46
+ else
47
+ covered_methods << "#{method_name} (line #{i+1})"
48
+ end
49
+ end
50
+ end
51
+
52
+ puts "\nπŸ“Š Method Coverage Summary:"
53
+ puts " Total methods: #{covered_methods.length + uncovered_methods.length}"
54
+ puts " Covered methods: #{covered_methods.length}"
55
+ puts " Uncovered methods: #{uncovered_methods.length}"
56
+
57
+ if uncovered_methods.any?
58
+ puts "\n🚨 Uncovered methods (potential dead code):"
59
+ uncovered_methods.each { |m| puts " - #{m}" }
60
+ end
61
+
62
+ if covered_methods.any?
63
+ puts "\nβœ… Covered methods:"
64
+ covered_methods.each { |m| puts " - #{m}" }
65
+ end
66
+ else
67
+ puts "❌ BroadcastDetector file not found in coverage data"
68
+ end
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "json"
5
+
6
+ coverage_file = "coverage/.resultset.json"
7
+ target_file = "cascade_executor_builder.rb"
8
+
9
+ unless File.exist?(coverage_file)
10
+ puts "❌ No coverage data found. Run tests first"
11
+ exit 1
12
+ end
13
+
14
+ data = JSON.parse(File.read(coverage_file))
15
+ coverage = data.values.first["coverage"]
16
+
17
+ file_entry = coverage.find { |file, _| file.include?(target_file) }
18
+
19
+ if file_entry
20
+ file_path, line_data = file_entry
21
+ lines = line_data["lines"]
22
+
23
+ puts "πŸ” CascadeExecutorBuilder Method Coverage:"
24
+ puts "=" * 50
25
+
26
+ file_content = File.read(file_path)
27
+ methods = []
28
+
29
+ file_content.lines.each_with_index do |line, i|
30
+ if line.match?(/^\s*def\s+/)
31
+ method_match = line.match(/^\s*def\s+(self\.)?(\w+)/)
32
+ if method_match
33
+ method_name = method_match[2]
34
+ is_class_method = !method_match[1].nil?
35
+ line_hits = lines[i]
36
+
37
+ status = if line_hits.nil?
38
+ "βšͺ NOT TRACKED"
39
+ elsif line_hits == 0
40
+ "🚨 UNCOVERED"
41
+ else
42
+ "βœ… COVERED (#{line_hits} hits)"
43
+ end
44
+
45
+ prefix = is_class_method ? "self." : ""
46
+ methods << {
47
+ name: "#{prefix}#{method_name}",
48
+ line: i + 1,
49
+ hits: line_hits,
50
+ status: status
51
+ }
52
+ end
53
+ end
54
+ end
55
+
56
+ methods.each do |method|
57
+ printf " %-25s (line %3d) %s\n", method[:name], method[:line], method[:status]
58
+ end
59
+
60
+ uncovered = methods.select { |m| m[:hits] == 0 }
61
+ covered = methods.select { |m| m[:hits] && m[:hits] > 0 }
62
+
63
+ puts "\nπŸ“Š Summary:"
64
+ puts " Total methods: #{methods.length}"
65
+ puts " Covered: #{covered.length}"
66
+ puts " Uncovered: #{uncovered.length}"
67
+
68
+ if uncovered.any?
69
+ puts "\n🚨 Uncovered methods (potential dead code):"
70
+ uncovered.each { |m| puts " #{m[:name]} (line #{m[:line]})" }
71
+ end
72
+ else
73
+ puts "❌ #{target_file} not found in coverage data"
74
+ end
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "json"
5
+
6
+ coverage_file = "coverage/.resultset.json"
7
+
8
+ unless File.exist?(coverage_file)
9
+ puts "❌ No coverage data found. Run tests first"
10
+ exit 1
11
+ end
12
+
13
+ data = JSON.parse(File.read(coverage_file))
14
+ coverage = data.values.first["coverage"]
15
+
16
+ broadcasting_files = [
17
+ "cascade_executor_builder.rb",
18
+ "vectorized_function_builder.rb",
19
+ "nested_structure_utils.rb",
20
+ "broadcast_detector.rb"
21
+ ]
22
+
23
+ puts "πŸ” Broadcasting Files Coverage:"
24
+ puts "=" * 60
25
+
26
+ broadcasting_files.each do |filename|
27
+ file_entry = coverage.find { |file, _| file.include?(filename) }
28
+
29
+ if file_entry
30
+ file_path, line_data = file_entry
31
+ lines = line_data["lines"]
32
+
33
+ total_lines = lines.count { |hits| !hits.nil? }
34
+ covered_lines = lines.count { |hits| hits && hits > 0 }
35
+ coverage_percent = total_lines > 0 ? (covered_lines.to_f / total_lines * 100).round(1) : 0
36
+
37
+ status = if coverage_percent == 0
38
+ "🚨 DEAD"
39
+ elsif coverage_percent < 20
40
+ "πŸ”΄ LOW"
41
+ elsif coverage_percent < 50
42
+ "🟑 MEDIUM"
43
+ else
44
+ "βœ… GOOD"
45
+ end
46
+
47
+ printf "%-35s %s %6.1f%% (%d/%d lines)\n", filename, status, coverage_percent, covered_lines, total_lines
48
+ else
49
+ printf "%-35s ❌ NOT FOUND\n", filename
50
+ end
51
+ end
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "json"
5
+
6
+ class SimpleDeadCodeFinder
7
+ COVERAGE_JSON = "coverage/.resultset.json"
8
+
9
+ def run
10
+ unless File.exist?(COVERAGE_JSON)
11
+ puts "❌ No coverage data found. Run tests first:"
12
+ puts " COVERAGE=true bundle exec rspec"
13
+ exit 1
14
+ end
15
+
16
+ puts "πŸ” Analyzing SimpleCov data for dead code..."
17
+
18
+ coverage_data = JSON.parse(File.read(COVERAGE_JSON))
19
+ coverage = coverage_data.values.first["coverage"]
20
+
21
+ find_dead_files(coverage)
22
+ find_low_coverage_files(coverage)
23
+
24
+ puts "\nπŸ’‘ Next steps:"
25
+ puts " 1. Open coverage/index.html to see detailed line-by-line coverage"
26
+ puts " 2. Review uncovered files to see if they can be removed"
27
+ puts " 3. Look at uncovered methods in low-coverage files"
28
+ end
29
+
30
+ private
31
+
32
+ def find_dead_files(coverage)
33
+ puts "\n🚨 COMPLETELY UNCOVERED FILES (potential dead code):"
34
+ puts "=" * 60
35
+
36
+ dead_files = []
37
+
38
+ coverage.each do |file, line_data|
39
+ next unless file.include?("/lib/")
40
+
41
+ # Extract lines array from SimpleCov format
42
+ lines = line_data["lines"]
43
+ next unless lines
44
+
45
+ total_lines = lines.count { |hits| !hits.nil? }
46
+ covered_lines = lines.count { |hits| hits && hits > 0 }
47
+
48
+ if total_lines > 0 && covered_lines == 0
49
+ relative_path = file.sub("#{Dir.pwd}/", "")
50
+ dead_files << relative_path
51
+ end
52
+ end
53
+
54
+ if dead_files.empty?
55
+ puts "βœ… No completely uncovered files found!"
56
+ else
57
+ puts "Found #{dead_files.length} completely uncovered files:"
58
+ dead_files.sort.each { |f| puts " πŸ“„ #{f}" }
59
+
60
+ puts "\n⚠️ These files are candidates for removal, but verify:"
61
+ puts " β€’ Check if they're loaded via autoloading/zeitwerk"
62
+ puts " β€’ Look for usage in examples/ or external code"
63
+ puts " β€’ Consider if they're part of public API"
64
+ end
65
+ end
66
+
67
+ def find_low_coverage_files(coverage)
68
+ puts "\nπŸ” LOW COVERAGE FILES (<20% - check for dead methods):"
69
+ puts "=" * 20
70
+
71
+ low_coverage = []
72
+
73
+ coverage.each do |file, line_data|
74
+ next unless file.include?("/lib/")
75
+
76
+ # Extract lines array from SimpleCov format
77
+ lines = line_data["lines"]
78
+ next unless lines
79
+
80
+ total_lines = lines.count { |hits| !hits.nil? }
81
+ covered_lines = lines.count { |hits| hits && hits > 0 }
82
+
83
+ next if total_lines == 0
84
+
85
+ coverage_percent = (covered_lines.to_f / total_lines * 100)
86
+
87
+ next unless coverage_percent > 0 && coverage_percent < 20
88
+
89
+ relative_path = file.sub("#{Dir.pwd}/", "")
90
+ low_coverage << {
91
+ file: relative_path,
92
+ percent: coverage_percent,
93
+ covered: covered_lines,
94
+ total: total_lines
95
+ }
96
+ end
97
+
98
+ if low_coverage.empty?
99
+ puts "βœ… No files with very low coverage found!"
100
+ else
101
+ low_coverage.sort_by { |f| f[:percent] }.each do |info|
102
+ printf " πŸ“„ %-50s %5.1f%% (%d/%d lines)\n",
103
+ info[:file], info[:percent], info[:covered], info[:total]
104
+ end
105
+
106
+ puts "\nπŸ’‘ These files likely contain dead methods:"
107
+ puts " β€’ Open coverage/index.html and click on these files"
108
+ puts " β€’ Red lines are uncovered - potential dead code"
109
+ puts " β€’ Look for entire uncovered methods/classes"
110
+ end
111
+ end
112
+ end
113
+
114
+ SimpleDeadCodeFinder.new.run if __FILE__ == $0
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kumi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - AndrΓ© Muta
@@ -39,14 +39,16 @@ files:
39
39
  - docs/DSL.md
40
40
  - docs/FUNCTIONS.md
41
41
  - docs/SYNTAX.md
42
+ - docs/compiler_design_principles.md
42
43
  - docs/development/README.md
43
44
  - docs/development/error-reporting.md
44
45
  - docs/features/README.md
45
46
  - docs/features/analysis-cascade-mutual-exclusion.md
46
47
  - docs/features/analysis-type-inference.md
47
48
  - docs/features/analysis-unsat-detection.md
48
- - docs/features/array-broadcasting.md
49
+ - docs/features/hierarchical-broadcasting.md
49
50
  - docs/features/input-declaration-system.md
51
+ - docs/features/javascript-transpiler.md
50
52
  - docs/features/performance.md
51
53
  - docs/features/s-expression-printer.md
52
54
  - docs/schema_metadata.md
@@ -66,7 +68,6 @@ files:
66
68
  - examples/wide_schema_compilation_and_evaluation_benchmark.rb
67
69
  - lib/kumi.rb
68
70
  - lib/kumi/analyzer.rb
69
- - lib/kumi/cli.rb
70
71
  - lib/kumi/compiler.rb
71
72
  - lib/kumi/core/analyzer/analysis_state.rb
72
73
  - lib/kumi/core/analyzer/constant_evaluator.rb
@@ -84,7 +85,13 @@ files:
84
85
  - lib/kumi/core/analyzer/passes/unsat_detector.rb
85
86
  - lib/kumi/core/analyzer/passes/visitor_pass.rb
86
87
  - lib/kumi/core/atom_unsat_solver.rb
88
+ - lib/kumi/core/cascade_executor_builder.rb
87
89
  - lib/kumi/core/compiled_schema.rb
90
+ - lib/kumi/core/compiler/expression_compiler.rb
91
+ - lib/kumi/core/compiler/function_invoker.rb
92
+ - lib/kumi/core/compiler/path_traversal_compiler.rb
93
+ - lib/kumi/core/compiler/reference_compiler.rb
94
+ - lib/kumi/core/compiler_base.rb
88
95
  - lib/kumi/core/constraint_relationship_solver.rb
89
96
  - lib/kumi/core/domain/enum_analyzer.rb
90
97
  - lib/kumi/core/domain/range_analyzer.rb
@@ -109,6 +116,7 @@ files:
109
116
  - lib/kumi/core/function_registry/function_builder.rb
110
117
  - lib/kumi/core/function_registry/logical_functions.rb
111
118
  - lib/kumi/core/function_registry/math_functions.rb
119
+ - lib/kumi/core/function_registry/stat_functions.rb
112
120
  - lib/kumi/core/function_registry/string_functions.rb
113
121
  - lib/kumi/core/function_registry/type_functions.rb
114
122
  - lib/kumi/core/input/type_matcher.rb
@@ -117,6 +125,7 @@ files:
117
125
  - lib/kumi/core/json_schema.rb
118
126
  - lib/kumi/core/json_schema/generator.rb
119
127
  - lib/kumi/core/json_schema/validator.rb
128
+ - lib/kumi/core/nested_structure_utils.rb
120
129
  - lib/kumi/core/ruby_parser.rb
121
130
  - lib/kumi/core/ruby_parser/build_context.rb
122
131
  - lib/kumi/core/ruby_parser/declaration_reference_proxy.rb
@@ -139,8 +148,11 @@ files:
139
148
  - lib/kumi/core/types/inference.rb
140
149
  - lib/kumi/core/types/normalizer.rb
141
150
  - lib/kumi/core/types/validator.rb
142
- - lib/kumi/core/vectorization_metadata.rb
151
+ - lib/kumi/core/vectorized_function_builder.rb
143
152
  - lib/kumi/errors.rb
153
+ - lib/kumi/js.rb
154
+ - lib/kumi/js/compiler.rb
155
+ - lib/kumi/js/function_registry.rb
144
156
  - lib/kumi/registry.rb
145
157
  - lib/kumi/schema.rb
146
158
  - lib/kumi/schema_metadata.rb
@@ -161,6 +173,10 @@ files:
161
173
  - lib/kumi/syntax/value_declaration.rb
162
174
  - lib/kumi/version.rb
163
175
  - migrate_to_core_iterative.rb
176
+ - scripts/analyze_broadcast_methods.rb
177
+ - scripts/analyze_cascade_methods.rb
178
+ - scripts/check_broadcasting_coverage.rb
179
+ - scripts/find_dead_code.rb
164
180
  - scripts/generate_function_docs.rb
165
181
  homepage: https://github.com/amuta/kumi
166
182
  licenses: