aboutsummaryrefslogtreecommitdiffstats
path: root/lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua')
-rw-r--r--lua/mason/providers/client/gh.lua3
-rw-r--r--lua/mason/providers/client/golang.lua20
-rw-r--r--lua/mason/providers/client/init.lua2
-rw-r--r--lua/mason/providers/client/npm.lua6
-rw-r--r--lua/mason/providers/client/pypi.lua5
-rw-r--r--lua/mason/providers/client/rubygems.lua29
6 files changed, 59 insertions, 6 deletions
diff --git a/lua/mason/providers/client/gh.lua b/lua/mason/providers/client/gh.lua
index 25c59d74..bca11460 100644
--- a/lua/mason/providers/client/gh.lua
+++ b/lua/mason/providers/client/gh.lua
@@ -10,9 +10,6 @@ return {
get_all_release_versions = function(repo)
return client.fetch_all_releases(repo):map(_.map(_.prop "tag_name"))
end,
- get_latest_tag = function(repo)
- return Result.failure "Unimplemented"
- end,
get_all_tags = function(repo)
return client.fetch_all_tags(repo):map(_.map(_.compose(_.gsub("^refs/tags/", ""), _.prop "ref")))
end,
diff --git a/lua/mason/providers/client/golang.lua b/lua/mason/providers/client/golang.lua
new file mode 100644
index 00000000..5e473005
--- /dev/null
+++ b/lua/mason/providers/client/golang.lua
@@ -0,0 +1,20 @@
+local _ = require "mason-core.functional"
+local spawn = require "mason-core.spawn"
+
+---@type GolangProvider
+return {
+ get_all_versions = function(pkg)
+ return spawn
+ .go({
+ "list",
+ "-json",
+ "-m",
+ "-versions",
+ pkg,
+ })
+ :map(_.prop "stdout")
+ :map_catching(vim.json.decode)
+ :map(_.prop "Versions")
+ :map(_.reverse)
+ end,
+}
diff --git a/lua/mason/providers/client/init.lua b/lua/mason/providers/client/init.lua
index a32f7017..0bc264fc 100644
--- a/lua/mason/providers/client/init.lua
+++ b/lua/mason/providers/client/init.lua
@@ -3,4 +3,6 @@ return {
github = require "mason.providers.client.gh",
npm = require "mason.providers.client.npm",
pypi = require "mason.providers.client.pypi",
+ rubygems = require "mason.providers.client.rubygems",
+ golang = require "mason.providers.client.golang",
}
diff --git a/lua/mason/providers/client/npm.lua b/lua/mason/providers/client/npm.lua
index 41beb2c2..fc63f5fc 100644
--- a/lua/mason/providers/client/npm.lua
+++ b/lua/mason/providers/client/npm.lua
@@ -11,6 +11,10 @@ return {
:map(_.pick { "name", "version" })
end,
get_all_versions = function(pkg)
- return spawn.npm({ "view", pkg, "versions" }):map(_.prop "stdout"):map_catching(vim.json.decode)
+ return spawn
+ .npm({ "view", "--json", pkg, "versions" })
+ :map(_.prop "stdout")
+ :map_catching(vim.json.decode)
+ :map(_.reverse)
end,
}
diff --git a/lua/mason/providers/client/pypi.lua b/lua/mason/providers/client/pypi.lua
index 975142e6..ecbbfd56 100644
--- a/lua/mason/providers/client/pypi.lua
+++ b/lua/mason/providers/client/pypi.lua
@@ -27,8 +27,9 @@ local function get_all_versions(pkg)
"--use-deprecated=legacy-resolver", -- for pip >= 20.3
("%s=="):format(pkg), -- invalid version specifier to trigger the wanted error message
})
- :map_err(_.compose(_.split ", ", _.head, _.match "%(from versions: (.+)%)", _.prop "stderr"))
- :recover(_.identity)
+ :recover(_.prop "stderr")
+ :map(_.compose(_.split ", ", _.head, _.match "%(from versions: (.+)%)"))
+ :map(_.reverse)
end
---@param pkg string
diff --git a/lua/mason/providers/client/rubygems.lua b/lua/mason/providers/client/rubygems.lua
new file mode 100644
index 00000000..40afbe64
--- /dev/null
+++ b/lua/mason/providers/client/rubygems.lua
@@ -0,0 +1,29 @@
+local Optional = require "mason-core.optional"
+local _ = require "mason-core.functional"
+local spawn = require "mason-core.spawn"
+
+---@param gem string
+---@param output string "$ gem list" output
+local parse_gem_versions = _.curryN(function(gem, output)
+ local lines = _.split("\n", output)
+ return Optional.of_nilable(_.find_first(_.starts_with(gem), lines))
+ :map(_.compose(_.head, _.match "%((.+)%)$"))
+ :map(_.split ", ")
+ :ok_or "Failed to parse gem list output."
+end, 2)
+
+---@async
+---@param gem string
+local function get_all_versions(gem)
+ return spawn.gem({ "list", gem, "--remote", "--all" }):map(_.prop "stdout"):and_then(parse_gem_versions(gem))
+end
+
+---@type RubyGemsProvider
+return {
+ get_latest_version = function(gem)
+ return get_all_versions(gem):map(_.head)
+ end,
+ get_all_versions = function(gem)
+ return get_all_versions(gem)
+ end,
+}