Class: OllamaChat::Tools::RunTests
- Inherits:
-
Object
- Object
- OllamaChat::Tools::RunTests
- Includes:
- Concern, Utils::PathValidator
- Defined in:
- lib/ollama_chat/tools/run_tests.rb
Overview
Tool for executing RSpec / Test‑Unit test suites.
The tool is registered under the name run_tests and exposes a single
function that accepts a path (file or directory) and an optional
coverage flag. The implementation simply spawns the configured test
runner (RSpec or Minitest) and streams its output back to the caller.
Class Method Summary collapse
-
.register_name ⇒ String
The registered name for this tool.
Instance Method Summary collapse
-
#check_path(path, config) ⇒ Pathname
private
The check_path method determines the appropriate test directory path based on existing directories and validates it against a whitelist.
-
#execute(tool_call, **opts) ⇒ String
Execute the tool with the provided arguments.
-
#execute_test_command(env, cmd) ⇒ String, Boolean
private
Executes the test command in a separate process, streaming output to STDOUT.
-
#run_tests(path, coverage) ⇒ String, Boolean
private
Run the test suite using the configured test runner.
-
#test_runner ⇒ String
private
Resolve the test runner executable from configuration.
-
#tool ⇒ Tool
Build the OpenAI function schema for the tool.
Methods included from Utils::PathValidator
Methods included from Concern
Methods included from Utils::Backup
Methods included from Utils::ValueFormatter
Class Method Details
.register_name ⇒ String
Returns the registered name for this tool.
14 |
# File 'lib/ollama_chat/tools/run_tests.rb', line 14 def self.register_name = 'run_tests' |
Instance Method Details
#check_path(path, config) ⇒ Pathname (private)
The check_path method determines the appropriate test directory path based on existing directories and validates it against a whitelist.
86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/ollama_chat/tools/run_tests.rb', line 86 def check_path(path, config) if path.blank? if File.exist?('./spec') path = './spec' elsif File.exist?('./test') path = './test' elsif File.exist?('./tests') path = './tests' else raise ArgumentError, 'path could not be determined' end end assert_valid_path(path, config.tools.functions.run_tests.allowed?, check: true) end |
#execute(tool_call, **opts) ⇒ String
Execute the tool with the provided arguments.
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/ollama_chat/tools/run_tests.rb', line 53 def execute(tool_call, **opts) config = opts[:chat].config path = tool_call.function.arguments.path coverage = tool_call.function.arguments.coverage || false path = check_path(path, config) output, success = run_tests(path, coverage) = if success "✨ All tests passed successfully in #{path.to_s.inspect}!" else "❌ Some tests failed in #{path.to_s.inspect}. Please check the error messages above." end { success: , path: path.to_s, output: , status: success ? 'passed' : 'failed', message: , }.to_json rescue => e { error: e.class, message: e. }.to_json end |
#execute_test_command(env, cmd) ⇒ String, Boolean (private)
Executes the test command in a separate process, streaming output to STDOUT.
127 128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/ollama_chat/tools/run_tests.rb', line 127 def execute_test_command(env, cmd) output = +'' success = false Open3.popen2e(env, cmd) do |_,io,waiter| while line = io.gets STDOUT.puts line output << line end success = waiter.value.success? end return output, success end |
#run_tests(path, coverage) ⇒ String, Boolean (private)
Run the test suite using the configured test runner.
106 107 108 109 110 111 |
# File 'lib/ollama_chat/tools/run_tests.rb', line 106 def run_tests(path, coverage) env = ENV.to_h | { 'START_SIMPLECOV' => coverage ? '1' : '0' } cmd = [ test_runner, Shellwords.escape(path) ].join(' ') output, success = execute_test_command(env, cmd) return output, success end |
#test_runner ⇒ String (private)
Resolve the test runner executable from configuration.
116 117 118 |
# File 'lib/ollama_chat/tools/run_tests.rb', line 116 def test_runner OC::OLLAMA::CHAT::TOOLS::TEST_RUNNER end |
#tool ⇒ Tool
Build the OpenAI function schema for the tool.
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/ollama_chat/tools/run_tests.rb', line 18 def tool Tool.new( type: 'function', function: Tool::Function.new( name: 'run_tests', description: <<~EOT, Test Runner - Runs all tests/specs under *path* the path were the tests/specs are located. `coverage=false` by default; set to true for a coverage report. Returns JSON with test counts and, if requested, coverage percentage. EOT parameters: Tool::Function::Parameters.new( type: 'object', properties: { path: Tool::Function::Parameters::Property.new( type: 'string', description: 'Path to file or directory to run tests for (path has to be allowed!)' ), coverage: Tool::Function::Parameters::Property.new( type: 'boolean', description: 'True if coverage data should be created, (default: false)' ) }, required: [] ) ) ) end |