From 4da89f3ab04783da990f9bd40aaa36c22e59375b Mon Sep 17 00:00:00 2001 From: William Boman Date: Fri, 2 May 2025 03:52:10 +0200 Subject: refactor(registry): change lua registries to not instantiate Package themselves Instead of having Lua registries instantiate package instances themselves we now do it in the installer of Lua registry sources. This aligns the behaviour of the Lua registry protocol with the other registry protocols. --- lua/mason-registry/init.lua | 2 + lua/mason-registry/sources/file.lua | 4 -- lua/mason-registry/sources/lua.lua | 53 ++++++++++++++-------- tests/helpers/lua/dummy-registry/dummy.lua | 14 ++++++ tests/helpers/lua/dummy-registry/dummy2.lua | 14 ++++++ .../helpers/lua/dummy-registry/dummy2_package.lua | 17 ------- tests/helpers/lua/dummy-registry/dummy_package.lua | 17 ------- tests/helpers/lua/dummy-registry/index.lua | 6 +-- tests/helpers/lua/dummy-registry/registry.lua | 11 +++++ .../lua/dummy-registry/registry_package.lua | 14 ------ tests/mason-core/installer/context_spec.lua | 5 -- tests/mason-core/installer/linker_spec.lua | 4 -- tests/mason-core/package/package_spec.lua | 4 +- tests/mason-registry/sources/lua_spec.lua | 27 ++++------- tests/minimal_init.vim | 2 + 15 files changed, 92 insertions(+), 102 deletions(-) create mode 100644 tests/helpers/lua/dummy-registry/dummy.lua create mode 100644 tests/helpers/lua/dummy-registry/dummy2.lua delete mode 100644 tests/helpers/lua/dummy-registry/dummy2_package.lua delete mode 100644 tests/helpers/lua/dummy-registry/dummy_package.lua create mode 100644 tests/helpers/lua/dummy-registry/registry.lua delete mode 100644 tests/helpers/lua/dummy-registry/registry_package.lua diff --git a/lua/mason-registry/init.lua b/lua/mason-registry/init.lua index b129380c..713335f0 100644 --- a/lua/mason-registry/init.lua +++ b/lua/mason-registry/init.lua @@ -119,9 +119,11 @@ function Registry.update(callback) Registry:emit("update:progress", finished, all) end) :on_success(function(updated_registries) + log.fmt_debug("Successfully updated %d registries.", #updated_registries) Registry:emit("update:success", updated_registries) end) :on_failure(function(errors) + log.error("Failed to update registries.", errors) Registry:emit("update:failed", errors) end) :get_or_throw() diff --git a/lua/mason-registry/sources/file.lua b/lua/mason-registry/sources/file.lua index 84566479..d81fcc9c 100644 --- a/lua/mason-registry/sources/file.lua +++ b/lua/mason-registry/sources/file.lua @@ -1,8 +1,6 @@ -local Optional = require "mason-core.optional" local Result = require "mason-core.result" local _ = require "mason-core.functional" local a = require "mason-core.async" -local async_control = require "mason-core.async.control" local async_uv = require "mason-core.async.uv" local fs = require "mason-core.fs" local log = require "mason-core.log" @@ -11,8 +9,6 @@ local process = require "mason-core.process" local spawn = require "mason-core.spawn" local util = require "mason-registry.sources.util" -local Channel = async_control.Channel - ---@class FileRegistrySourceSpec ---@field id string ---@field path string diff --git a/lua/mason-registry/sources/lua.lua b/lua/mason-registry/sources/lua.lua index 7fae54fe..e2144a83 100644 --- a/lua/mason-registry/sources/lua.lua +++ b/lua/mason-registry/sources/lua.lua @@ -1,7 +1,6 @@ -local Optional = require "mason-core.optional" local Result = require "mason-core.result" local _ = require "mason-core.functional" -local log = require "mason-core.log" +local util = require "mason-registry.sources.util" ---@class LuaRegistrySourceSpec ---@field id string @@ -9,6 +8,7 @@ local log = require "mason-core.log" ---@class LuaRegistrySource : RegistrySource ---@field private spec LuaRegistrySourceSpec +---@field buffer { specs: RegistryPackageSpec[], instances: table }? local LuaRegistrySource = {} LuaRegistrySource.__index = LuaRegistrySource @@ -25,37 +25,52 @@ end ---@param pkg_name string ---@return Package? function LuaRegistrySource:get_package(pkg_name) - local index = require(self.spec.mod) - if index[pkg_name] then - local ok, mod = pcall(require, index[pkg_name]) - if ok then - return mod - else - log.fmt_warn("Unable to load %s from %s: %s", pkg_name, self, mod) - end - end + return self:get_buffer().instances[pkg_name] +end + +---@param specs RegistryPackageSpec[] +function LuaRegistrySource:reload(specs) + self.buffer = _.assoc("specs", specs, self.buffer or {}) + self.buffer.instances = _.compose( + _.index_by(_.prop "name"), + _.map(util.hydrate_package(self.buffer.instances or {})) + )(self:get_all_package_specs()) + return self.buffer end function LuaRegistrySource:install() - return Result.pcall(require, self.spec.mod) + return Result.try(function(try) + local index = try(Result.pcall(require, self.spec.mod)) + ---@type RegistryPackageSpec[] + local specs = {} + + for _, mod in pairs(index) do + table.insert(specs, try(Result.pcall(require, mod))) + end + + try(Result.pcall(self.reload, self, specs)) + end) end ---@return string[] function LuaRegistrySource:get_all_package_names() - local index = require(self.spec.mod) - return vim.tbl_keys(index) + return _.map(_.prop "name", self:get_all_package_specs()) end ---@return RegistryPackageSpec[] function LuaRegistrySource:get_all_package_specs() - return _.filter_map(function(name) - return Optional.of_nilable(self:get_package(name)):map(_.prop "spec") - end, self:get_all_package_names()) + return _.filter_map(util.map_registry_spec, self:get_buffer().specs) +end + +function LuaRegistrySource:get_buffer() + return self.buffer or { + specs = {}, + instances = {}, + } end function LuaRegistrySource:is_installed() - local ok = pcall(require, self.spec.mod) - return ok + return self.buffer ~= nil end function LuaRegistrySource:get_display_name() diff --git a/tests/helpers/lua/dummy-registry/dummy.lua b/tests/helpers/lua/dummy-registry/dummy.lua new file mode 100644 index 00000000..4b06f4d1 --- /dev/null +++ b/tests/helpers/lua/dummy-registry/dummy.lua @@ -0,0 +1,14 @@ +return { + name = "dummy", + description = [[This is a dummy package.]], + homepage = "https://example.com", + licenses = { "MIT" }, + languages = { "DummyLang" }, + categories = { "LSP" }, + source = { + id = "pkg:mason/dummy@1.0.0", + ---@async + ---@param ctx InstallContext + install = function(ctx) end, + }, +} diff --git a/tests/helpers/lua/dummy-registry/dummy2.lua b/tests/helpers/lua/dummy-registry/dummy2.lua new file mode 100644 index 00000000..8dc26c9f --- /dev/null +++ b/tests/helpers/lua/dummy-registry/dummy2.lua @@ -0,0 +1,14 @@ +return { + name = "dummy2", + description = [[This is a dummy2 package.]], + homepage = "https://example.com", + licenses = { "MIT" }, + languages = { "Dummy2Lang" }, + categories = { "LSP" }, + source = { + id = "pkg:mason/dummy2@1.0.0", + ---@async + ---@param ctx InstallContext + install = function(ctx) end, + }, +} diff --git a/tests/helpers/lua/dummy-registry/dummy2_package.lua b/tests/helpers/lua/dummy-registry/dummy2_package.lua deleted file mode 100644 index 008d27b2..00000000 --- a/tests/helpers/lua/dummy-registry/dummy2_package.lua +++ /dev/null @@ -1,17 +0,0 @@ -local Pkg = require "mason-core.package" - -return Pkg:new { - schema = "registry+v1", - name = "dummy2", - description = [[This is a dummy2 package.]], - homepage = "https://example.com", - licenses = { Pkg.License.MIT }, - languages = { Pkg.Lang.Dummy2Lang }, - categories = { Pkg.Cat.LSP }, - source = { - id = "pkg:mason/dummy2@1.0.0", - ---@async - ---@param ctx InstallContext - install = function(ctx) end, - }, -} diff --git a/tests/helpers/lua/dummy-registry/dummy_package.lua b/tests/helpers/lua/dummy-registry/dummy_package.lua deleted file mode 100644 index 4fbaf44d..00000000 --- a/tests/helpers/lua/dummy-registry/dummy_package.lua +++ /dev/null @@ -1,17 +0,0 @@ -local Pkg = require "mason-core.package" - -return Pkg:new { - schema = "registry+v1", - name = "dummy", - description = [[This is a dummy package.]], - homepage = "https://example.com", - licenses = { Pkg.License.MIT }, - languages = { Pkg.Lang.DummyLang }, - categories = { Pkg.Cat.LSP }, - source = { - id = "pkg:mason/dummy@1.0.0", - ---@async - ---@param ctx InstallContext - install = function(ctx) end, - }, -} diff --git a/tests/helpers/lua/dummy-registry/index.lua b/tests/helpers/lua/dummy-registry/index.lua index 85fe000f..112a2df2 100644 --- a/tests/helpers/lua/dummy-registry/index.lua +++ b/tests/helpers/lua/dummy-registry/index.lua @@ -1,5 +1,5 @@ return { - ["dummy"] = "dummy-registry.dummy_package", - ["dummy2"] = "dummy-registry.dummy2_package", - ["registry"] = "dummy-registry.registry_package", + ["dummy"] = "dummy-registry.dummy", + ["dummy2"] = "dummy-registry.dummy2", + ["registry"] = "dummy-registry.registry", } diff --git a/tests/helpers/lua/dummy-registry/registry.lua b/tests/helpers/lua/dummy-registry/registry.lua new file mode 100644 index 00000000..3cc4858b --- /dev/null +++ b/tests/helpers/lua/dummy-registry/registry.lua @@ -0,0 +1,11 @@ +return { + name = "registry", + description = [[This is a dummy package.]], + homepage = "https://example.com", + licenses = { "MIT" }, + languages = { "DummyLang" }, + categories = { "LSP" }, + source = { + id = "pkg:dummy/registry@1.0.0", + }, +} diff --git a/tests/helpers/lua/dummy-registry/registry_package.lua b/tests/helpers/lua/dummy-registry/registry_package.lua deleted file mode 100644 index 7e5d9fbd..00000000 --- a/tests/helpers/lua/dummy-registry/registry_package.lua +++ /dev/null @@ -1,14 +0,0 @@ -local Pkg = require "mason-core.package" - -return Pkg:new { - schema = "registry+v1", - name = "registry", - description = [[This is a dummy package.]], - homepage = "https://example.com", - licenses = { "MIT" }, - languages = { "DummyLang" }, - categories = { "LSP" }, - source = { - id = "pkg:dummy/registry@1.0.0", - }, -} diff --git a/tests/mason-core/installer/context_spec.lua b/tests/mason-core/installer/context_spec.lua index ad469e08..92ef1c49 100644 --- a/tests/mason-core/installer/context_spec.lua +++ b/tests/mason-core/installer/context_spec.lua @@ -94,7 +94,6 @@ cmd.exe /C echo %GREETING% %*]] it("should write Node exec wrapper", function() local js_rel_path = path.concat { "some", "obscure", "path", "server.js" } - local dummy = registry.get_package "dummy" local ctx = test_helpers.create_context() stub(ctx, "write_shell_exec_wrapper") stub(ctx.fs, "file_exists") @@ -112,7 +111,6 @@ cmd.exe /C echo %GREETING% %*]] it("should write Ruby exec wrapper", function() local js_rel_path = path.concat { "some", "obscure", "path", "server.js" } - local dummy = registry.get_package "dummy" local ctx = test_helpers.create_context() stub(ctx, "write_shell_exec_wrapper") stub(ctx.fs, "file_exists") @@ -147,7 +145,6 @@ cmd.exe /C echo %GREETING% %*]] end) it("should write Python exec wrapper", function() - local dummy = registry.get_package "dummy" local ctx = test_helpers.create_context() stub(ctx.cwd, "get") ctx.cwd.get.returns "/tmp/placeholder" @@ -183,7 +180,6 @@ cmd.exe /C echo %GREETING% %*]] end) it("should write exec wrapper", function() - local dummy = registry.get_package "dummy" local exec_rel_path = path.concat { "obscure", "path", "to", "server" } local ctx = test_helpers.create_context() stub(ctx, "write_shell_exec_wrapper") @@ -219,7 +215,6 @@ cmd.exe /C echo %GREETING% %*]] it("should write PHP exec wrapper", function() local php_rel_path = path.concat { "some", "obscure", "path", "cli.php" } - local dummy = registry.get_package "dummy" local ctx = test_helpers.create_context() stub(ctx, "write_shell_exec_wrapper") stub(ctx.fs, "file_exists") diff --git a/tests/mason-core/installer/linker_spec.lua b/tests/mason-core/installer/linker_spec.lua index 2177f6a3..6bf63a14 100644 --- a/tests/mason-core/installer/linker_spec.lua +++ b/tests/mason-core/installer/linker_spec.lua @@ -40,7 +40,6 @@ describe("linker", function() end) it("should symlink executable on Unix", function() - local dummy = registry.get_package "dummy" local ctx = test_helpers.create_context() stub(fs.async, "file_exists") @@ -70,7 +69,6 @@ describe("linker", function() end) it("should write executable wrapper on Windows", function() - local dummy = registry.get_package "dummy" local ctx = test_helpers.create_context() platform.is.darwin = false @@ -110,7 +108,6 @@ describe("linker", function() end) it("should symlink share files", function() - local dummy = registry.get_package "dummy" local ctx = test_helpers.create_context() stub(fs.async, "mkdirp") @@ -150,7 +147,6 @@ describe("linker", function() end) it("should copy share files on Windows", function() - local dummy = registry.get_package "dummy" local ctx = test_helpers.create_context() platform.is.darwin = false diff --git a/tests/mason-core/package/package_spec.lua b/tests/mason-core/package/package_spec.lua index 5f69ea4e..8d1929d8 100644 --- a/tests/mason-core/package/package_spec.lua +++ b/tests/mason-core/package/package_spec.lua @@ -42,8 +42,8 @@ describe("Package ::", function() name = "Package name", description = "Package description", homepage = "https://example.com", - categories = { Pkg.Cat.LSP }, - languages = { Pkg.Lang.Rust }, + categories = { "LSP" }, + languages = { "Rust" }, licenses = {}, source = { id = "pkg:mason/package@1", diff --git a/tests/mason-registry/sources/lua_spec.lua b/tests/mason-registry/sources/lua_spec.lua index c720ae10..9e3c8450 100644 --- a/tests/mason-registry/sources/lua_spec.lua +++ b/tests/mason-registry/sources/lua_spec.lua @@ -2,44 +2,37 @@ local LuaRegistrySource = require "mason-registry.sources.lua" describe("Lua registry source", function() it("should get package", function() - package.loaded["pkg-index"] = { - ["my-pkg"] = "pkg-index.my-pkg", - } - package.loaded["pkg-index.my-pkg"] = {} local source = LuaRegistrySource:new { - mod = "pkg-index", + mod = "dummy-registry.index", } - assert.is_not_nil(source:get_package "my-pkg") + assert.is_true(source:install():is_success()) + assert.is_not_nil(source:get_package "dummy") assert.is_nil(source:get_package "non-existent") end) it("should get all package names", function() - package.loaded["pkg-index"] = { - ["my-pkg"] = "pkg-index.my-pkg", - ["rust-analyzer"] = "pkg-index.rust-analyzer", - ["typescript-language-server"] = "pkg-index.typescript-language-server", - } local source = LuaRegistrySource:new { - mod = "pkg-index", + mod = "dummy-registry.index", } + assert.is_true(source:install():is_success()) local package_names = source:get_all_package_names() table.sort(package_names) assert.same({ - "my-pkg", - "rust-analyzer", - "typescript-language-server", + "dummy", + "dummy2", + "registry", }, package_names) end) it("should check if is installed", function() - package.loaded["pkg-index"] = {} local installed_source = LuaRegistrySource:new { - mod = "pkg-index", + mod = "dummy-registry.index", } local uninstalled_source = LuaRegistrySource:new { mod = "non-existent", } + assert.is_true(installed_source:install():is_success()) assert.is_true(installed_source:is_installed()) assert.is_false(uninstalled_source:is_installed()) end) diff --git a/tests/minimal_init.vim b/tests/minimal_init.vim index 43e8367f..e573ec1d 100644 --- a/tests/minimal_init.vim +++ b/tests/minimal_init.vim @@ -40,6 +40,8 @@ require("mason").setup { "lua:dummy-registry.index" } } + +require("mason-registry").refresh() EOF function! RunTests() abort -- cgit v1.2.3-70-g09d2