diff options
| author | William Boman <william@redwill.se> | 2022-07-16 16:46:23 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-07-16 16:46:23 +0200 |
| commit | f887633842d44307f260d6ea4b99c0ae24994cfb (patch) | |
| tree | a6b40aa4cd451b3000a6aea3d4a678857129c7a7 | |
| parent | docs: updates (#83) (diff) | |
| download | mason-f887633842d44307f260d6ea4b99c0ae24994cfb.tar mason-f887633842d44307f260d6ea4b99c0ae24994cfb.tar.gz mason-f887633842d44307f260d6ea4b99c0ae24994cfb.tar.bz2 mason-f887633842d44307f260d6ea4b99c0ae24994cfb.tar.lz mason-f887633842d44307f260d6ea4b99c0ae24994cfb.tar.xz mason-f887633842d44307f260d6ea4b99c0ae24994cfb.tar.zst mason-f887633842d44307f260d6ea4b99c0ae24994cfb.zip | |
feat(mason-lspconfig): add get_installed_servers() method & add more tests (#84)
| -rw-r--r-- | doc/mason-lspconfig.txt | 17 | ||||
| -rw-r--r-- | doc/mason.txt | 60 | ||||
| -rw-r--r-- | lua/mason-lspconfig/api/command.lua | 55 | ||||
| -rw-r--r-- | lua/mason-lspconfig/init.lua | 15 | ||||
| -rw-r--r-- | tests/mason-lspconfig/api/command_spec.lua | 71 | ||||
| -rw-r--r-- | tests/mason-lspconfig/setup_spec.lua | 45 | ||||
| -rw-r--r-- | tests/mason/setup_spec.lua | 52 | ||||
| -rw-r--r-- | tests/minimal_init.vim | 2 |
8 files changed, 287 insertions, 30 deletions
diff --git a/doc/mason-lspconfig.txt b/doc/mason-lspconfig.txt index ddeda56c..b6c6b415 100644 --- a/doc/mason-lspconfig.txt +++ b/doc/mason-lspconfig.txt @@ -151,5 +151,22 @@ setup_handlers({handlers}) end }) + *mason-lspconfig.get_installed_servers()* +get_installed_servers() + Returns the installed LSP servers supported by lspconfig. + + Note that the strings returned are the lspconfig server names, not the + mason package names. For example, "sumneko_lua" is returned instead of + "lua-language-server". This is useful if you want to loop through the + table and use its values to directly interact with lspconfig (for example + setting up all installed servers). + + Returns: ~ + string[] + + See also: ~ + |mason-registry.get_installed_packages()| + |mason-registry.get_installed_package_names()| + vim:tw=78:ft=help:norl:expandtab:sw=4 diff --git a/doc/mason.txt b/doc/mason.txt index 4221e51d..6037f85c 100644 --- a/doc/mason.txt +++ b/doc/mason.txt @@ -258,5 +258,65 @@ Lua module: mason setup({config}) Sets up mason with the provided {config} (see |mason-settings|). +============================================================================== +Lua module: mason-registry + + *mason-registry.is_installed()* +is_installed({package_name}) + Checks whether the provided package name is installed. In many situations, + this is a more efficient option than the Package:is_installed() method due + to a smaller amount of modules required to load. + + Parameters: ~ + {package_name} - string + + Returns: ~ + boolean + + *mason-registry.get_package()* +get_package({package_name}) + Returns an instance of the Package class if the provided package name + exists. + + This function errors if a package cannot be found. + + Parameters: ~ + {package_name} - string + + Returns: ~ + Package + + *mason-registry.get_installed_packages()* +get_installed_packages() + Returns all installed package instances. This is a slower function that + loads more modules. + + Returns: ~ + Package[] + + *mason-registry.get_installed_package_names()* +get_installed_package_names() + Returns all installed package names. This is a fast function that doesn't + load any extra modules. + + Returns: ~ + string[] + + *mason-registry.get_all_packages()* +get_all_packages() + Returns all package instances. This is a slower function that loads more + modules. + + Returns: ~ + Package[] + + *mason-registry.get_all_package_names()* +get_all_package_names() + Returns all package names. This is a fast function that doesn't load any + extra modules. + + Returns: ~ + string[] + vim:tw=78:ft=help:norl:expandtab:sw=4 diff --git a/lua/mason-lspconfig/api/command.lua b/lua/mason-lspconfig/api/command.lua index 814be0ed..5f0da4bf 100644 --- a/lua/mason-lspconfig/api/command.lua +++ b/lua/mason-lspconfig/api/command.lua @@ -3,8 +3,6 @@ local Optional = require "mason-core.optional" local notify = require "mason-core.notify" local _ = require "mason-core.functional" -local M = {} - ---@async ---@param user_args string[]: The arguments, as provided by the user. local function parse_packages_from_user_args(user_args) @@ -76,37 +74,41 @@ local parse_packages_to_install = _.cond { { _.T, _.always {} }, } -vim.api.nvim_create_user_command( - "LspInstall", - a.scope(function(opts) - local packages_to_install = parse_packages_to_install(opts.fargs) - if #packages_to_install > 0 then - local registry = require "mason-registry" - _.each(function(target) - local pkg = registry.get_package(target.package) - pkg:install { version = target.version } - end, packages_to_install) - require("mason.ui").open() - require("mason.ui").set_view "LSP" - end - end), - { - desc = "Install one or more LSP servers.", - nargs = "*", - complete = "custom,v:lua.mason_lspconfig_completion.available_server_completion", - } -) +local LspInstall = a.scope(function(servers) + local packages_to_install = parse_packages_to_install(servers) + if #packages_to_install > 0 then + local registry = require "mason-registry" + _.each(function(target) + local pkg = registry.get_package(target.package) + pkg:install { version = target.version } + end, packages_to_install) + require("mason.ui").open() + require("mason.ui").set_view "LSP" + end +end) -vim.api.nvim_create_user_command("LspUninstall", function(opts) +vim.api.nvim_create_user_command("LspInstall", function(opts) + LspInstall(opts.fargs) +end, { + desc = "Install one or more LSP servers.", + nargs = "*", + complete = "custom,v:lua.mason_lspconfig_completion.available_server_completion", +}) + +local function LspUninstall(servers) require("mason.ui").open() require("mason.ui").set_view "LSP" local registry = require "mason-registry" local server_mapping = require "mason-lspconfig.mappings.server" - for _, server_specifier in ipairs(opts.fargs) do + for _, server_specifier in ipairs(servers) do local package_name = server_mapping.lspconfig_to_package[server_specifier] local pkg = registry.get_package(package_name) pkg:uninstall() end +end + +vim.api.nvim_create_user_command("LspUninstall", function(opts) + LspUninstall(opts.fargs) end, { desc = "Uninstall one or more LSP servers.", nargs = "+", @@ -138,4 +140,7 @@ _G.mason_lspconfig_completion = { end, } -return M +return { + LspInstall = LspInstall, + LspUninstall = LspUninstall, +} diff --git a/lua/mason-lspconfig/init.lua b/lua/mason-lspconfig/init.lua index 276d41c4..e3c7cc93 100644 --- a/lua/mason-lspconfig/init.lua +++ b/lua/mason-lspconfig/init.lua @@ -10,7 +10,7 @@ local registry = require "mason-registry" local M = {} ---@param lspconfig_server_name string -function M.resolve_package(lspconfig_server_name) +local function resolve_package(lspconfig_server_name) return Optional.of_nilable(server_mapping.lspconfig_to_package[lspconfig_server_name]):map(function(package_name) local ok, pkg = pcall(registry.get_package, package_name) if ok then @@ -20,7 +20,7 @@ function M.resolve_package(lspconfig_server_name) end ---@param lspconfig_server_name string -function M.resolve_server_config_factory(lspconfig_server_name) +local function resolve_server_config_factory(lspconfig_server_name) local ok, server_config = pcall(require, ("mason-lspconfig.server_configurations.%s"):format(lspconfig_server_name)) if ok then return Optional.of(server_config) @@ -67,7 +67,7 @@ local function setup_lspconfig_hook() end if registry.is_installed(pkg_name) then - M.resolve_server_config_factory(config.name):if_present(function(config_factory) + resolve_server_config_factory(config.name):if_present(function(config_factory) merge_in_place(config, config_factory(path.package_prefix(pkg_name))) end) else @@ -82,7 +82,7 @@ end local function ensure_installed() for _, server_identifier in ipairs(settings.current.ensure_installed) do local server_name, version = Package.Parse(server_identifier) - M.resolve_package(server_name):if_present( + resolve_package(server_name):if_present( ---@param pkg Package function(pkg) if not pkg:is_installed() then @@ -154,4 +154,11 @@ function M.setup_handlers(handlers) ) end +---@return string[] +function M.get_installed_servers() + return _.filter_map(function(pkg_name) + return Optional.of_nilable(server_mapping.package_to_lspconfig[pkg_name]) + end, registry.get_installed_package_names()) +end + return M diff --git a/tests/mason-lspconfig/api/command_spec.lua b/tests/mason-lspconfig/api/command_spec.lua new file mode 100644 index 00000000..0551c777 --- /dev/null +++ b/tests/mason-lspconfig/api/command_spec.lua @@ -0,0 +1,71 @@ +local spy = require "luassert.spy" +local stub = require "luassert.stub" +local match = require "luassert.match" + +local server_mappings = require "mason-lspconfig.mappings.server" +local filetype_mappings = require "mason-lspconfig.mappings.filetype" +local api = require "mason-lspconfig.api.command" +local registry = require "mason-registry" +local Pkg = require "mason-core.package" + +describe(":LspInstall", function() + server_mappings.lspconfig_to_package["dummylsp"] = "dummy" + server_mappings.package_to_lspconfig["dummy"] = "dummylsp" + filetype_mappings.dummylang = { "dummylsp" } + + it("should install the provided servers", function() + local dummy = registry.get_package "dummy" + spy.on(Pkg, "install") + api.LspInstall { "dummylsp@1.0.0" } + assert.spy(Pkg.install).was_called(1) + assert.spy(Pkg.install).was_called_with(match.ref(dummy), { + version = "1.0.0", + }) + end) + + it( + "should prompt user for server to install based on filetype", + async_test(function() + local dummy = registry.get_package "dummy" + spy.on(Pkg, "install") + stub(vim.ui, "select") + vim.ui.select.invokes(function(items, opts, callback) + callback "dummylsp" + end) + vim.cmd [[new | setf dummylang]] + api.LspInstall {} + assert.spy(Pkg.install).was_called(1) + assert.spy(Pkg.install).was_called_with(match.ref(dummy), { + version = nil, + }) + assert.spy(vim.ui.select).was_called(1) + assert.spy(vim.ui.select).was_called_with({ "dummylsp" }, match.is_table(), match.is_function()) + end) + ) + + it( + "should not prompt user for server to install if no filetype match exists", + async_test(function() + spy.on(Pkg, "install") + stub(vim.ui, "select") + vim.cmd [[new | setf nolsplang]] + api.LspInstall {} + assert.spy(Pkg.install).was_called(0) + assert.spy(vim.ui.select).was_called(0) + end) + ) +end) + +describe(":LspUninstall", function() + server_mappings.lspconfig_to_package["dummylsp"] = "dummy" + server_mappings.package_to_lspconfig["dummy"] = "dummylsp" + filetype_mappings.dummylang = { "dummylsp" } + + it("should uninstall the provided servers", function() + local dummy = registry.get_package "dummy" + spy.on(Pkg, "uninstall") + api.LspUninstall { "dummylsp" } + assert.spy(Pkg.uninstall).was_called(1) + assert.spy(Pkg.uninstall).was_called_with(match.ref(dummy)) + end) +end) diff --git a/tests/mason-lspconfig/setup_spec.lua b/tests/mason-lspconfig/setup_spec.lua new file mode 100644 index 00000000..39795be4 --- /dev/null +++ b/tests/mason-lspconfig/setup_spec.lua @@ -0,0 +1,45 @@ +local match = require "luassert.match" +local spy = require "luassert.spy" + +local Pkg = require "mason-core.package" +local mason_lspconfig = require "mason-lspconfig" +local server_mappings = require "mason-lspconfig.mappings.server" +local registry = require "mason-registry" +local filetype_mappings = require "mason-lspconfig.mappings.filetype" + +describe("mason-lspconfig setup", function() + server_mappings.lspconfig_to_package["dummylsp"] = "dummy" + server_mappings.package_to_lspconfig["dummy"] = "dummylsp" + filetype_mappings.dummylang = { "dummylsp" } + + it("should set up user commands", function() + mason_lspconfig.setup() + local user_commands = vim.api.nvim_get_commands {} + + assert.is_true(match.tbl_containing { + bang = false, + bar = false, + nargs = "*", + complete = "custom", + definition = "Install one or more LSP servers.", + }(user_commands["LspInstall"])) + + assert.is_true(match.tbl_containing { + bang = false, + bar = false, + definition = "Uninstall one or more LSP servers.", + nargs = "+", + complete = "custom", + }(user_commands["LspUninstall"])) + end) + + it("should install servers listed in ensure_installed", function() + local dummy = registry.get_package "dummy" + spy.on(Pkg, "install") + mason_lspconfig.setup { ensure_installed = { "dummylsp@1.0.0" } } + assert.spy(Pkg.install).was_called(1) + assert.spy(Pkg.install).was_called_with(match.ref(dummy), { + version = "1.0.0", + }) + end) +end) diff --git a/tests/mason/setup_spec.lua b/tests/mason/setup_spec.lua new file mode 100644 index 00000000..f7abf125 --- /dev/null +++ b/tests/mason/setup_spec.lua @@ -0,0 +1,52 @@ +local match = require "luassert.match" +local mason = require "mason" +local path = require "mason-core.path" + +describe("mason setup", function() + it("should enhance the PATH environment", function() + mason.setup() + assert.is_true(vim.startswith(vim.env.PATH, path.bin_prefix())) + end) + + it("should set up user commands", function() + mason.setup() + local user_commands = vim.api.nvim_get_commands {} + + assert.is_true(match.tbl_containing { + bang = false, + bar = false, + nargs = "0", + definition = "Opens mason's UI window.", + }(user_commands["Mason"])) + + assert.is_true(match.tbl_containing { + bang = false, + bar = false, + definition = "Install one or more packages.", + nargs = "+", + complete = "custom", + }(user_commands["MasonInstall"])) + + assert.is_true(match.tbl_containing { + bang = false, + bar = false, + definition = "Uninstall one or more packages.", + nargs = "+", + complete = "custom", + }(user_commands["MasonUninstall"])) + + assert.is_true(match.tbl_containing { + bang = false, + bar = false, + definition = "Uninstall all packages.", + nargs = "0", + }(user_commands["MasonUninstallAll"])) + + assert.is_true(match.tbl_containing { + bang = false, + bar = false, + definition = "Opens the mason.nvim log.", + nargs = "0", + }(user_commands["MasonLog"])) + end) +end) diff --git a/tests/minimal_init.vim b/tests/minimal_init.vim index 1a4bfb31..a42b6f89 100644 --- a/tests/minimal_init.vim +++ b/tests/minimal_init.vim @@ -21,7 +21,7 @@ index["dummy"] = "dummy_package" index["dummy2"] = "dummy_package" require("mason").setup { - install_root_dir = os.getenv("INSTALL_ROOT_DIR"), + install_root_dir = vim.env.INSTALL_ROOT_DIR, } EOF |
