diff options
| author | William Boman <william@redwill.se> | 2022-05-27 16:23:51 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-27 16:23:51 +0200 |
| commit | b7813e1ac72271edbb78916d2e87d94a6b0f4039 (patch) | |
| tree | 4132329e3e3fbf1170501234f0048c971c442fd2 | |
| parent | run autogen_metadata.lua (diff) | |
| download | mason-b7813e1ac72271edbb78916d2e87d94a6b0f4039.tar mason-b7813e1ac72271edbb78916d2e87d94a6b0f4039.tar.gz mason-b7813e1ac72271edbb78916d2e87d94a6b0f4039.tar.bz2 mason-b7813e1ac72271edbb78916d2e87d94a6b0f4039.tar.lz mason-b7813e1ac72271edbb78916d2e87d94a6b0f4039.tar.xz mason-b7813e1ac72271edbb78916d2e87d94a6b0f4039.tar.zst mason-b7813e1ac72271edbb78916d2e87d94a6b0f4039.zip | |
feat: add teal_ls (#724)
Closes #723.
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | doc/nvim-lsp-installer.txt | 1 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/_generated/filetype_map.lua | 1 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/_generated/metadata.lua | 3 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/core/functional/init.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/core/functional/list.lua | 13 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/core/functional/string.lua | 12 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/core/managers/luarocks/init.lua | 128 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/core/receipt.lua | 1 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/health/init.lua | 1 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/jobs/outdated-servers/init.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/jobs/version-check/init.lua | 4 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/servers/init.lua | 1 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/servers/teal_ls/init.lua | 15 | ||||
| -rw-r--r-- | tests/core/functional/list_spec.lua | 8 | ||||
| -rw-r--r-- | tests/core/functional/string_spec.lua | 5 | ||||
| -rw-r--r-- | tests/core/managers/luarocks_spec.lua | 52 |
17 files changed, 248 insertions, 3 deletions
@@ -60,6 +60,7 @@ install _all_ servers are: - rebar3 - cargo - ghcup +- luarocks [7zip]: https://www.7-zip.org/ [archiver]: https://github.com/mholt/archiver @@ -288,6 +289,7 @@ require("nvim-lsp-installer").setup({ | SystemVerilog | `verible` | | TOML | `taplo` | | Tailwind CSS | `tailwindcss` | +| Teal | `teal_ls` | | Terraform | `terraformls` | | Terraform [(docs)][tflint] | `tflint` | | TypeScript | `tsserver` | diff --git a/doc/nvim-lsp-installer.txt b/doc/nvim-lsp-installer.txt index 8cc3ad94..4a5d2de2 100644 --- a/doc/nvim-lsp-installer.txt +++ b/doc/nvim-lsp-installer.txt @@ -42,6 +42,7 @@ install _all_ servers are: - rebar3 - cargo - ghcup +- luarocks To write a custom server installer, please refer to the docs at https://github.com/williamboman/nvim-lsp-installer/blob/main/CUSTOM_SERVERS.md. diff --git a/lua/nvim-lsp-installer/_generated/filetype_map.lua b/lua/nvim-lsp-installer/_generated/filetype_map.lua index 9af45af0..24057ae7 100644 --- a/lua/nvim-lsp-installer/_generated/filetype_map.lua +++ b/lua/nvim-lsp-installer/_generated/filetype_map.lua @@ -135,6 +135,7 @@ return { svg = { "lemminx" }, swift = { "sourcekit" }, systemverilog = { "svls", "verible" }, + teal = { "teal_ls" }, terraform = { "terraformls", "tflint" }, tex = { "ltex", "texlab" }, toml = { "taplo" }, diff --git a/lua/nvim-lsp-installer/_generated/metadata.lua b/lua/nvim-lsp-installer/_generated/metadata.lua index dfeecce4..10cddde2 100644 --- a/lua/nvim-lsp-installer/_generated/metadata.lua +++ b/lua/nvim-lsp-installer/_generated/metadata.lua @@ -310,6 +310,9 @@ return { taplo = { filetypes = { "toml" } }, + teal_ls = { + filetypes = { "teal" } + }, terraformls = { filetypes = { "terraform" } }, diff --git a/lua/nvim-lsp-installer/core/functional/init.lua b/lua/nvim-lsp-installer/core/functional/init.lua index 9337ccef..8fb97450 100644 --- a/lua/nvim-lsp-installer/core/functional/init.lua +++ b/lua/nvim-lsp-installer/core/functional/init.lua @@ -29,6 +29,7 @@ _.filter = list.filter _.map = list.map _.each = list.each _.concat = list.concat +_.zip_table = list.zip_table -- relation local relation = require "nvim-lsp-installer.core.functional.relation" @@ -58,6 +59,7 @@ _.dec = number.dec local string = require "nvim-lsp-installer.core.functional.string" _.matches = string.matches _.format = string.format +_.split = string.split -- table local tbl = require "nvim-lsp-installer.core.functional.table" diff --git a/lua/nvim-lsp-installer/core/functional/list.lua b/lua/nvim-lsp-installer/core/functional/list.lua index 11742f1c..1fcfe8c3 100644 --- a/lua/nvim-lsp-installer/core/functional/list.lua +++ b/lua/nvim-lsp-installer/core/functional/list.lua @@ -87,4 +87,17 @@ _.concat = fun.curryN(function(a, b) end end, 2) +---@generic T +---@generic U +---@param keys T[] +---@param values U[] +---@return table<T, U> +_.zip_table = fun.curryN(function(keys, values) + local res = {} + for i, key in ipairs(keys) do + res[key] = values[i] + end + return res +end, 2) + return _ diff --git a/lua/nvim-lsp-installer/core/functional/string.lua b/lua/nvim-lsp-installer/core/functional/string.lua index 0061a33e..3fd3aa03 100644 --- a/lua/nvim-lsp-installer/core/functional/string.lua +++ b/lua/nvim-lsp-installer/core/functional/string.lua @@ -9,9 +9,15 @@ _.matches = fun.curryN(function(pattern, str) end, 2) ---@param template string ----@param string string -_.format = fun.curryN(function(template, string) - return template:format(string) +---@param str string +_.format = fun.curryN(function(template, str) + return template:format(str) +end, 2) + +---@param sep string +---@param str string +_.split = fun.curryN(function(sep, str) + return vim.split(str, sep) end, 2) return _ diff --git a/lua/nvim-lsp-installer/core/managers/luarocks/init.lua b/lua/nvim-lsp-installer/core/managers/luarocks/init.lua new file mode 100644 index 00000000..39a02a7d --- /dev/null +++ b/lua/nvim-lsp-installer/core/managers/luarocks/init.lua @@ -0,0 +1,128 @@ +local installer = require "nvim-lsp-installer.core.installer" +local _ = require "nvim-lsp-installer.core.functional" +local std = require "nvim-lsp-installer.core.managers.std" +local process = require "nvim-lsp-installer.core.process" +local path = require "nvim-lsp-installer.core.path" +local Result = require "nvim-lsp-installer.core.result" +local spawn = require "nvim-lsp-installer.core.spawn" +local Optional = require "nvim-lsp-installer.core.optional" + +local M = {} + +---@param package string +local function with_receipt(package) + return function() + local ctx = installer.context() + ctx.receipt:with_primary_source(ctx.receipt.luarocks(package)) + end +end + +function M.package(package) + return function() + return M.install(package).with_receipt() + end +end + +---@async +---@param package string @The luarock package to install. +function M.install(package) + std.ensure_executable("luarocks", { help_url = "https://luarocks.org/" }) + local ctx = installer.context() + ctx:promote_cwd() + ctx.spawn.luarocks { + "install", + "--dev", + "--tree", + ctx.cwd:get(), + package, + ctx.requested_version:or_else(vim.NIL), + } + return { + with_receipt = with_receipt(package), + } +end + +---@alias InstalledLuarock {package: string, version: string, arch: string, nrepo: string, namespace: string} + +---@type fun(output: string): InstalledLuarock[] +M.parse_installed_rocks = _.compose( + _.map(_.compose( + -- https://github.com/luarocks/luarocks/blob/fbd3566a312e647cde57b5d774533731e1aa844d/src/luarocks/search.lua#L317 + _.zip_table { "package", "version", "arch", "nrepo", "namespace" }, + _.split "\t" + )), + _.split "\n" +) + +---@async +---@param receipt InstallReceipt +---@param install_dir string +function M.get_installed_primary_package_version(receipt, install_dir) + if receipt.primary_source.type ~= "luarocks" then + return Result.failure "Receipt does not have a primary source of type luarocks" + end + local primary_package = receipt.primary_source.package + return spawn.luarocks({ + "list", + "--tree", + install_dir, + "--porcelain", + }):map_catching(function(result) + local luarocks = M.parse_installed_rocks(result.stdout) + return Optional.of_nilable(_.find_first(_.prop_eq("package", primary_package), luarocks)) + :map(_.prop "version") + :or_else_throw() + end) +end + +---@alias OutdatedLuarock {name: string, installed: string, available: string, repo: string} + +---@type fun(output: string): OutdatedLuarock[] +M.parse_outdated_rocks = _.compose( + _.map(_.compose( + -- https://github.com/luarocks/luarocks/blob/fbd3566a312e647cde57b5d774533731e1aa844d/src/luarocks/cmd/list.lua#L59 + _.zip_table { "name", "installed", "available", "repo" }, + _.split "\t" + )), + _.split "\n" +) + +---@async +---@param receipt InstallReceipt +---@param install_dir string +function M.check_outdated_primary_package(receipt, install_dir) + if receipt.primary_source.type ~= "luarocks" then + return Result.failure "Receipt does not have a primary source of type luarocks" + end + local primary_package = receipt.primary_source.package + return spawn.luarocks({ + "list", + "--outdated", + "--tree", + install_dir, + "--porcelain", + }):map_catching(function(result) + local outdated_rocks = M.parse_outdated_rocks(result.stdout) + return Optional.of_nilable(_.find_first(_.prop_eq("name", primary_package), outdated_rocks)) + :map( + ---@param outdated_rock OutdatedLuarock + function(outdated_rock) + return { + name = outdated_rock.name, + current_version = assert(outdated_rock.installed), + latest_version = assert(outdated_rock.available), + } + end + ) + :or_else_throw() + end) +end + +---@param install_dir string +function M.env(install_dir) + return { + PATH = process.extend_path { path.concat { install_dir, "bin" } }, + } +end + +return M diff --git a/lua/nvim-lsp-installer/core/receipt.lua b/lua/nvim-lsp-installer/core/receipt.lua index b2300774..608673a6 100644 --- a/lua/nvim-lsp-installer/core/receipt.lua +++ b/lua/nvim-lsp-installer/core/receipt.lua @@ -123,6 +123,7 @@ InstallReceiptBuilder.cargo = package_source "cargo" InstallReceiptBuilder.composer = package_source "composer" InstallReceiptBuilder.r_package = package_source "r_package" InstallReceiptBuilder.opam = package_source "opam" +InstallReceiptBuilder.luarocks = package_source "luarocks" InstallReceiptBuilder.unmanaged = { type = "unmanaged" } diff --git a/lua/nvim-lsp-installer/health/init.lua b/lua/nvim-lsp-installer/health/init.lua index 5dedbefa..e429185a 100644 --- a/lua/nvim-lsp-installer/health/init.lua +++ b/lua/nvim-lsp-installer/health/init.lua @@ -159,6 +159,7 @@ function M.check() end, }, check { cmd = "cargo", args = { "--version" }, name = "cargo", relaxed = true }, + check { cmd = "luarocks", args = { "--version" }, name = "luarocks", relaxed = true }, check { cmd = "ruby", args = { "--version" }, name = "Ruby", relaxed = true }, check { cmd = gem_cmd, args = { "--version" }, name = "RubyGem", relaxed = true }, check { cmd = composer_cmd, args = { "--version" }, name = "Composer", relaxed = true }, diff --git a/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua b/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua index acb73f13..6e1befa0 100644 --- a/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua +++ b/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua @@ -12,6 +12,7 @@ local cargo = require "nvim-lsp-installer.core.managers.cargo" local github = require "nvim-lsp-installer.core.managers.github" local composer = require "nvim-lsp-installer.core.managers.composer" local jdtls_check = require "nvim-lsp-installer.jobs.outdated-servers.jdtls" +local luarocks = require "nvim-lsp-installer.core.managers.luarocks" local M = {} @@ -28,6 +29,7 @@ local checkers = { ["composer"] = composer.check_outdated_primary_package, ["gem"] = gem.check_outdated_primary_package, ["go"] = go.check_outdated_primary_package, + ["luarocks"] = luarocks.check_outdated_primary_package, ["jdtls"] = jdtls_check, ["github_release_file"] = github.check_outdated_primary_package_release, ["github_release"] = github.check_outdated_primary_package_release, diff --git a/lua/nvim-lsp-installer/jobs/version-check/init.lua b/lua/nvim-lsp-installer/jobs/version-check/init.lua index 827c9fa9..3062bb78 100644 --- a/lua/nvim-lsp-installer/jobs/version-check/init.lua +++ b/lua/nvim-lsp-installer/jobs/version-check/init.lua @@ -4,6 +4,7 @@ local cargo = require "nvim-lsp-installer.core.managers.cargo" local pip3 = require "nvim-lsp-installer.core.managers.pip3" local gem = require "nvim-lsp-installer.core.managers.gem" local go = require "nvim-lsp-installer.core.managers.go" +local luarocks = require "nvim-lsp-installer.core.managers.luarocks" local git = require "nvim-lsp-installer.core.managers.git" local composer = require "nvim-lsp-installer.core.managers.composer" @@ -48,6 +49,9 @@ local version_checker = { ["go"] = function(server, receipt) return go.get_installed_primary_package_version(receipt, server.root_dir) end, + ["luarocks"] = function(server, receipt) + return luarocks.get_installed_primary_package_version(receipt, server.root_dir) + end, ["github_release_file"] = version_in_receipt "release", ["github_release"] = version_in_receipt "release", ["github_tag"] = version_in_receipt "tag", diff --git a/lua/nvim-lsp-installer/servers/init.lua b/lua/nvim-lsp-installer/servers/init.lua index 9d78d651..6c385675 100644 --- a/lua/nvim-lsp-installer/servers/init.lua +++ b/lua/nvim-lsp-installer/servers/init.lua @@ -135,6 +135,7 @@ local CORE_SERVERS = _.set_of { "svls", "tailwindcss", "taplo", + "teal_ls", "terraformls", "texlab", "tflint", diff --git a/lua/nvim-lsp-installer/servers/teal_ls/init.lua b/lua/nvim-lsp-installer/servers/teal_ls/init.lua new file mode 100644 index 00000000..0f372639 --- /dev/null +++ b/lua/nvim-lsp-installer/servers/teal_ls/init.lua @@ -0,0 +1,15 @@ +local server = require "nvim-lsp-installer.server" +local luarocks = require "nvim-lsp-installer.core.managers.luarocks" + +return function(name, root_dir) + return server.Server:new { + name = name, + root_dir = root_dir, + languages = { "teal" }, + homepage = "https://github.com/teal-language/teal-language-server", + installer = luarocks.package "teal-language-server", + default_options = { + cmd_env = luarocks.env(root_dir), + }, + } +end diff --git a/tests/core/functional/list_spec.lua b/tests/core/functional/list_spec.lua index 7fa644f2..5d90650a 100644 --- a/tests/core/functional/list_spec.lua +++ b/tests/core/functional/list_spec.lua @@ -94,4 +94,12 @@ describe("functional: list", function() it("should concat strings", function() assert.equals("FooBar", _.concat("Foo", "Bar")) end) + + it("should zip list into table", function() + local fnkey = function() end + assert.same({ + a = "a", + [fnkey] = 1, + }, _.zip_table({ "a", fnkey }, { "a", 1 })) + end) end) diff --git a/tests/core/functional/string_spec.lua b/tests/core/functional/string_spec.lua index 53575ce4..e24819d9 100644 --- a/tests/core/functional/string_spec.lua +++ b/tests/core/functional/string_spec.lua @@ -14,4 +14,9 @@ describe("functional: string", function() assert.equals("Hello World!", _.format("%s", "Hello World!")) assert.equals("special manouvers", _.format("%s manouvers", "special")) end) + + it("should split strings", function() + assert.same({ "This", "is", "a", "sentence" }, _.split("%s", "This is a sentence")) + assert.same({ "This", "is", "a", "sentence" }, _.split("|", "This|is|a|sentence")) + end) end) diff --git a/tests/core/managers/luarocks_spec.lua b/tests/core/managers/luarocks_spec.lua new file mode 100644 index 00000000..f2836a3f --- /dev/null +++ b/tests/core/managers/luarocks_spec.lua @@ -0,0 +1,52 @@ +local luarocks = require "nvim-lsp-installer.core.managers.luarocks" + +describe("luarocks manager", function() + it("should parse outdated luarocks", function() + assert.same( + { + { + name = "lua-cjson", + installed = "2.1.0-1", + available = "2.1.0.6-1", + repo = "https://luarocks.org", + }, + { + name = "lua-resty-influx-mufanh", + installed = "0.2.1-0", + available = "0.2.1-1", + repo = "https://luarocks.org", + }, + }, + luarocks.parse_outdated_rocks [[lua-cjson 2.1.0-1 2.1.0.6-1 https://luarocks.org +lua-resty-influx-mufanh 0.2.1-0 0.2.1-1 https://luarocks.org]] + ) + end) + + it("should parse listed luarocks", function() + assert.same( + { + { + package = "lua-cjson", + version = "2.1.0-1", + arch = "installed", + nrepo = "/my/luarock/loc", + }, + { + package = "lua-resty-http", + version = "0.17.0.beta.1-0", + arch = "installed", + nrepo = "/my/luarock/loc", + }, + { + package = "lua-resty-influx-mufanh", + version = "0.2.1-0", + arch = "installed", + nrepo = "/my/luarock/loc", + }, + }, + luarocks.parse_installed_rocks [[lua-cjson 2.1.0-1 installed /my/luarock/loc +lua-resty-http 0.17.0.beta.1-0 installed /my/luarock/loc +lua-resty-influx-mufanh 0.2.1-0 installed /my/luarock/loc]] + ) + end) +end) |
