aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2022-05-27 16:23:51 +0200
committerGitHub <noreply@github.com>2022-05-27 16:23:51 +0200
commitb7813e1ac72271edbb78916d2e87d94a6b0f4039 (patch)
tree4132329e3e3fbf1170501234f0048c971c442fd2
parentrun autogen_metadata.lua (diff)
downloadmason-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.md2
-rw-r--r--doc/nvim-lsp-installer.txt1
-rw-r--r--lua/nvim-lsp-installer/_generated/filetype_map.lua1
-rw-r--r--lua/nvim-lsp-installer/_generated/metadata.lua3
-rw-r--r--lua/nvim-lsp-installer/core/functional/init.lua2
-rw-r--r--lua/nvim-lsp-installer/core/functional/list.lua13
-rw-r--r--lua/nvim-lsp-installer/core/functional/string.lua12
-rw-r--r--lua/nvim-lsp-installer/core/managers/luarocks/init.lua128
-rw-r--r--lua/nvim-lsp-installer/core/receipt.lua1
-rw-r--r--lua/nvim-lsp-installer/health/init.lua1
-rw-r--r--lua/nvim-lsp-installer/jobs/outdated-servers/init.lua2
-rw-r--r--lua/nvim-lsp-installer/jobs/version-check/init.lua4
-rw-r--r--lua/nvim-lsp-installer/servers/init.lua1
-rw-r--r--lua/nvim-lsp-installer/servers/teal_ls/init.lua15
-rw-r--r--tests/core/functional/list_spec.lua8
-rw-r--r--tests/core/functional/string_spec.lua5
-rw-r--r--tests/core/managers/luarocks_spec.lua52
17 files changed, 248 insertions, 3 deletions
diff --git a/README.md b/README.md
index 6063c0ce..1a958429 100644
--- a/README.md
+++ b/README.md
@@ -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)