aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2022-07-16 16:46:23 +0200
committerGitHub <noreply@github.com>2022-07-16 16:46:23 +0200
commitf887633842d44307f260d6ea4b99c0ae24994cfb (patch)
treea6b40aa4cd451b3000a6aea3d4a678857129c7a7
parentdocs: updates (#83) (diff)
downloadmason-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.txt17
-rw-r--r--doc/mason.txt60
-rw-r--r--lua/mason-lspconfig/api/command.lua55
-rw-r--r--lua/mason-lspconfig/init.lua15
-rw-r--r--tests/mason-lspconfig/api/command_spec.lua71
-rw-r--r--tests/mason-lspconfig/setup_spec.lua45
-rw-r--r--tests/mason/setup_spec.lua52
-rw-r--r--tests/minimal_init.vim2
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