From 66aea6b4ae307d3162e6aa1bcf5bc420b1382275 Mon Sep 17 00:00:00 2001 From: theprimeagain Date: Sat, 14 Feb 2026 09:12:21 -0700 Subject: working through this idea of tutorials... --- lua/99/test/test_utils.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'lua/99/test/test_utils.lua') diff --git a/lua/99/test/test_utils.lua b/lua/99/test/test_utils.lua index b3bd7db..29d12d0 100644 --- a/lua/99/test/test_utils.lua +++ b/lua/99/test/test_utils.lua @@ -1,3 +1,4 @@ +local BaseProvider = require("99.providers").BaseProvider local Levels = require("99.logger.level") local M = {} @@ -22,8 +23,7 @@ M.created_files = {} --- @class _99.test.Provider : _99.Providers.BaseProvider --- @field request _99.test.ProviderRequest? -local TestProvider = {} -TestProvider.__index = TestProvider +local TestProvider = setmetatable({}, { __index = BaseProvider }) function TestProvider.new() return setmetatable({}, TestProvider) @@ -109,7 +109,7 @@ end --- @param col number --- @param lang string? --- @return _99.test.Provider, number -function M.fif_setup(content, row, col, lang) +function M.test_setup(content, row, col, lang) assert(lang, "lang must be provided") local provider = M.TestProvider.new() require("99").setup({ -- cgit v1.3-3-g829e From a65a39fc96b004d57a80691e090f8b8e5d6da508 Mon Sep 17 00:00:00 2001 From: theprimeagain Date: Sat, 14 Feb 2026 09:10:13 -0700 Subject: fixed the requesting logic to better use request for state management --- lua/99/providers.lua | 12 +----------- lua/99/request/init.lua | 27 +++++++++++++++++++++++++-- lua/99/test/request_spec.lua | 3 --- lua/99/test/test_utils.lua | 4 +++- 4 files changed, 29 insertions(+), 17 deletions(-) (limited to 'lua/99/test/test_utils.lua') diff --git a/lua/99/providers.lua b/lua/99/providers.lua index 080a909..ff1188b 100644 --- a/lua/99/providers.lua +++ b/lua/99/providers.lua @@ -3,14 +3,6 @@ --- @field on_stderr fun(line: string): nil --- @field on_complete fun(status: _99.Request.ResponseState, res: string): nil ---- @type _99.Providers.Observer -local DevNullObserver = { - name = "DevNullObserver", - on_stdout = function() end, - on_stderr = function() end, - on_complete = function() end, -} - --- @param fn fun(...: any): nil --- @return fun(...: any): nil local function once(fn) @@ -56,17 +48,15 @@ end --- @param query string --- @param request _99.Request ---- @param observer _99.Providers.Observer? +--- @param observer _99.Providers.Observer function BaseProvider:make_request(query, request, observer) local logger = request.logger:set_area(self:_get_provider_name()) logger:debug("make_request", "tmp_file", request.context.tmp_file) - observer = observer or DevNullObserver local once_complete = once( --- @param status "success" | "failed" | "cancelled" ---@param text string function(status, text) - print("setting status", status) request.state = status observer.on_complete(status, text) end diff --git a/lua/99/request/init.lua b/lua/99/request/init.lua index e0e86dd..327aa0f 100644 --- a/lua/99/request/init.lua +++ b/lua/99/request/init.lua @@ -47,7 +47,7 @@ function Request:_set_process(proc) end function Request:cancel() - if self.state == "finished" then + if self.state == "success" then return end @@ -77,6 +77,29 @@ function Request:add_prompt_content(content) return self end +--- @param r _99.Request +--- @param obs _99.Providers.Observer | nil +local function observer_from_request(r, obs) + return { + on_complete = function(status, res) + r.state = status + if obs then + obs.on_complete(status, res) + end + end, + on_stderr = function(line) + if obs then + obs.on_stderr(line) + end + end, + on_stdout = function(line) + if obs then + obs.on_stdout(line) + end + end, + } +end + --- @param observer _99.Providers.Observer? function Request:start(observer) self.logger:assert( @@ -94,7 +117,7 @@ function Request:start(observer) local prompt = table.concat(self._content, "\n") self.context:save_prompt(prompt) self.logger:debug("start", "prompt", prompt) - self.provider:make_request(prompt, self, observer) + self.provider:make_request(prompt, self, observer_from_request(self, observer)) end return Request diff --git a/lua/99/test/request_spec.lua b/lua/99/test/request_spec.lua index 5ad114a..d2e0885 100644 --- a/lua/99/test/request_spec.lua +++ b/lua/99/test/request_spec.lua @@ -38,10 +38,7 @@ describe("request test", function() eq("requesting", request.state) p:resolve("success", " return 'implemented!'") - test_utils.next_frame() - assert.is_true(finished_called) - test_utils.next_frame() eq("success", request.state) eq("success", finished_status) diff --git a/lua/99/test/test_utils.lua b/lua/99/test/test_utils.lua index 29d12d0..8f417d6 100644 --- a/lua/99/test/test_utils.lua +++ b/lua/99/test/test_utils.lua @@ -23,7 +23,8 @@ M.created_files = {} --- @class _99.test.Provider : _99.Providers.BaseProvider --- @field request _99.test.ProviderRequest? -local TestProvider = setmetatable({}, { __index = BaseProvider }) +local TestProvider = {} +TestProvider.__index = TestProvider function TestProvider.new() return setmetatable({}, TestProvider) @@ -48,6 +49,7 @@ end function TestProvider:resolve(status, result) assert(self.request, "you cannot call resolve until make_request is called") local obs = self.request.observer + if obs then --- to match the behavior expected from the OpenCodeProvider if self.request.request:is_cancelled() then -- cgit v1.3-3-g829e From ab095297ecfe6dea1c035ac08f6f6b4eed2c62b5 Mon Sep 17 00:00:00 2001 From: theprimeagain Date: Wed, 18 Feb 2026 07:07:13 -0700 Subject: fixed request spec --- lua/99/test/request_spec.lua | 5 +++++ lua/99/test/test_utils.lua | 40 +++++++++++++++++++++------------------- 2 files changed, 26 insertions(+), 19 deletions(-) (limited to 'lua/99/test/test_utils.lua') diff --git a/lua/99/test/request_spec.lua b/lua/99/test/request_spec.lua index f6ce34d..3c58ecd 100644 --- a/lua/99/test/request_spec.lua +++ b/lua/99/test/request_spec.lua @@ -17,6 +17,7 @@ describe("request test", function() local RequestContext = require("99.request-context") local context = RequestContext.from_current_buffer(state, 100) + context.operation = "test_request" context:finalize() local request = Request.new(context) @@ -28,6 +29,9 @@ describe("request test", function() eq(0, state:active_request_count()) request:start({ + on_start = function() + print("on_start") + end, on_complete = function(status, _) finished_called = true finished_status = status @@ -35,6 +39,7 @@ describe("request test", function() on_stdout = function() end, on_stderr = function() end, }) + test_utils.next_frame() eq(1, state:active_request_count()) eq("requesting", request.state) diff --git a/lua/99/test/test_utils.lua b/lua/99/test/test_utils.lua index 8f417d6..a1459a4 100644 --- a/lua/99/test/test_utils.lua +++ b/lua/99/test/test_utils.lua @@ -1,7 +1,14 @@ -local BaseProvider = require("99.providers").BaseProvider local Levels = require("99.logger.level") local M = {} +--- @type _99.Providers.Observer +local DevNullObserver = { + on_start = function() end, + on_complete = function() end, + on_stderr = function() end, + on_stdout = function() end, +} + function M.next_frame() local next = false vim.schedule(function() @@ -18,7 +25,7 @@ M.created_files = {} --- @class _99.test.ProviderRequest --- @field query string --- @field request _99.Request ---- @field observer _99.Providers.Observer? +--- @field observer _99.Providers.Observer --- @field logger _99.Logger --- @class _99.test.Provider : _99.Providers.BaseProvider @@ -36,6 +43,10 @@ end function TestProvider:make_request(query, request, observer) local logger = request.context.logger:set_area("TestProvider") logger:debug("make_request", "tmp_file", request.context.tmp_file) + + observer = observer or DevNullObserver + observer.on_start() + self.request = { query = query, request = request, @@ -48,35 +59,26 @@ end --- @param result string function TestProvider:resolve(status, result) assert(self.request, "you cannot call resolve until make_request is called") - local obs = self.request.observer - - if obs then - --- to match the behavior expected from the OpenCodeProvider - if self.request.request:is_cancelled() then - obs.on_complete("cancelled", result) - else - obs.on_complete(status, result) - end + + if self.request.request:is_cancelled() then + self.request.observer.on_complete("cancelled", result) + else + self.request.observer.on_complete(status, result) end + self.request = nil end --- @param line string function TestProvider:stdout(line) assert(self.request, "you cannot call stdout until make_request is called") - local obs = self.request.observer - if obs then - obs.on_stdout(line) - end + self.request.observer.on_stdout(line) end --- @param line string function TestProvider:stderr(line) assert(self.request, "you cannot call stderr until make_request is called") - local obs = self.request.observer - if obs then - obs.on_stderr(line) - end + self.request.observer.on_stderr(line) end M.TestProvider = TestProvider -- cgit v1.3-3-g829e