diff options
| -rw-r--r-- | lua/mason-registry/init.lua | 2 | ||||
| -rw-r--r-- | lua/mason-registry/sources/file.lua | 4 | ||||
| -rw-r--r-- | lua/mason-registry/sources/lua.lua | 53 | ||||
| -rw-r--r-- | tests/helpers/lua/dummy-registry/dummy.lua (renamed from tests/helpers/lua/dummy-registry/dummy_package.lua) | 11 | ||||
| -rw-r--r-- | tests/helpers/lua/dummy-registry/dummy2.lua (renamed from tests/helpers/lua/dummy-registry/dummy2_package.lua) | 11 | ||||
| -rw-r--r-- | tests/helpers/lua/dummy-registry/index.lua | 6 | ||||
| -rw-r--r-- | tests/helpers/lua/dummy-registry/registry.lua (renamed from tests/helpers/lua/dummy-registry/registry_package.lua) | 5 | ||||
| -rw-r--r-- | tests/mason-core/installer/context_spec.lua | 5 | ||||
| -rw-r--r-- | tests/mason-core/installer/linker_spec.lua | 4 | ||||
| -rw-r--r-- | tests/mason-core/package/package_spec.lua | 4 | ||||
| -rw-r--r-- | tests/mason-registry/sources/lua_spec.lua | 27 | ||||
| -rw-r--r-- | tests/minimal_init.vim | 2 |
12 files changed, 62 insertions, 72 deletions
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<string, Package> }? 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_package.lua b/tests/helpers/lua/dummy-registry/dummy.lua index 4fbaf44d..4b06f4d1 100644 --- a/tests/helpers/lua/dummy-registry/dummy_package.lua +++ b/tests/helpers/lua/dummy-registry/dummy.lua @@ -1,13 +1,10 @@ -local Pkg = require "mason-core.package" - -return Pkg:new { - schema = "registry+v1", +return { name = "dummy", description = [[This is a dummy package.]], homepage = "https://example.com", - licenses = { Pkg.License.MIT }, - languages = { Pkg.Lang.DummyLang }, - categories = { Pkg.Cat.LSP }, + licenses = { "MIT" }, + languages = { "DummyLang" }, + categories = { "LSP" }, source = { id = "pkg:mason/dummy@1.0.0", ---@async diff --git a/tests/helpers/lua/dummy-registry/dummy2_package.lua b/tests/helpers/lua/dummy-registry/dummy2.lua index 008d27b2..8dc26c9f 100644 --- a/tests/helpers/lua/dummy-registry/dummy2_package.lua +++ b/tests/helpers/lua/dummy-registry/dummy2.lua @@ -1,13 +1,10 @@ -local Pkg = require "mason-core.package" - -return Pkg:new { - schema = "registry+v1", +return { name = "dummy2", description = [[This is a dummy2 package.]], homepage = "https://example.com", - licenses = { Pkg.License.MIT }, - languages = { Pkg.Lang.Dummy2Lang }, - categories = { Pkg.Cat.LSP }, + licenses = { "MIT" }, + languages = { "Dummy2Lang" }, + categories = { "LSP" }, source = { id = "pkg:mason/dummy2@1.0.0", ---@async 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_package.lua b/tests/helpers/lua/dummy-registry/registry.lua index 7e5d9fbd..3cc4858b 100644 --- a/tests/helpers/lua/dummy-registry/registry_package.lua +++ b/tests/helpers/lua/dummy-registry/registry.lua @@ -1,7 +1,4 @@ -local Pkg = require "mason-core.package" - -return Pkg:new { - schema = "registry+v1", +return { name = "registry", description = [[This is a dummy package.]], homepage = "https://example.com", 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 |
