aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lua/mason-core/installer/registry/init.lua10
-rw-r--r--lua/mason-core/installer/registry/providers/cargo.lua16
-rw-r--r--lua/mason-core/installer/registry/providers/composer.lua9
-rw-r--r--lua/mason-core/installer/registry/providers/gem.lua13
-rw-r--r--lua/mason-core/installer/registry/providers/github/release.lua5
-rw-r--r--lua/mason-core/installer/registry/providers/golang.lua12
-rw-r--r--lua/mason-core/installer/registry/providers/npm.lua5
-rw-r--r--lua/mason-core/installer/registry/providers/pypi.lua4
-rw-r--r--lua/mason-core/installer/registry/util.lua2
-rw-r--r--tests/mason-core/installer/registry/installer_spec.lua95
-rw-r--r--tests/mason-core/installer/registry/providers/cargo_spec.lua24
-rw-r--r--tests/mason-core/installer/registry/providers/composer_spec.lua21
-rw-r--r--tests/mason-core/installer/registry/providers/gem_spec.lua21
-rw-r--r--tests/mason-core/installer/registry/providers/github/release_spec.lua29
-rw-r--r--tests/mason-core/installer/registry/providers/golang_spec.lua21
-rw-r--r--tests/mason-core/installer/registry/providers/npm_spec.lua23
-rw-r--r--tests/mason-core/installer/registry/providers/pypi_spec.lua28
17 files changed, 110 insertions, 228 deletions
diff --git a/lua/mason-core/installer/registry/init.lua b/lua/mason-core/installer/registry/init.lua
index 27a7da2a..6b03296f 100644
--- a/lua/mason-core/installer/registry/init.lua
+++ b/lua/mason-core/installer/registry/init.lua
@@ -6,6 +6,7 @@ local a = require "mason-core.async"
local link = require "mason-core.installer.registry.link"
local log = require "mason-core.log"
local schemas = require "mason-core.installer.registry.schemas"
+local util = require "mason-core.installer.registry.util"
local M = {}
@@ -132,6 +133,7 @@ function M.parse(spec, opts)
return {
provider = provider,
source = parsed_source,
+ raw_source = source,
purl = purl,
}
end):on_failure(function(err)
@@ -162,13 +164,19 @@ function M.compile(spec, opts)
{ _.T, _.identity },
}
- ---@type { purl: Purl, provider: InstallerProvider, source: ParsedPackageSource }
+ ---@type { purl: Purl, provider: InstallerProvider, source: ParsedPackageSource, raw_source: RegistryPackageSource }
local parsed = try(M.parse(spec, opts):map_err(map_parse_err))
---@async
---@param ctx InstallContext
return function(ctx)
return Result.try(function(try)
+ if ctx.opts.version then
+ try(util.ensure_valid_version(function()
+ return parsed.provider.get_versions(parsed.purl, parsed.raw_source)
+ end))
+ end
+
-- Run installer
try(parsed.provider.install(ctx, parsed.source, parsed.purl))
diff --git a/lua/mason-core/installer/registry/providers/cargo.lua b/lua/mason-core/installer/registry/providers/cargo.lua
index 464fba5b..312a2938 100644
--- a/lua/mason-core/installer/registry/providers/cargo.lua
+++ b/lua/mason-core/installer/registry/providers/cargo.lua
@@ -48,17 +48,11 @@ end
function M.install(ctx, source)
local cargo = require "mason-core.installer.managers.cargo"
- return Result.try(function(try)
- try(util.ensure_valid_version(function()
- return providers.crates.get_all_versions(source.crate)
- end))
-
- try(cargo.install(source.crate, source.version, {
- git = source.git,
- features = source.features,
- locked = source.locked,
- }))
- end)
+ return cargo.install(source.crate, source.version, {
+ git = source.git,
+ features = source.features,
+ locked = source.locked,
+ })
end
---@async
diff --git a/lua/mason-core/installer/registry/providers/composer.lua b/lua/mason-core/installer/registry/providers/composer.lua
index 7cc03ed8..d85dd2ba 100644
--- a/lua/mason-core/installer/registry/providers/composer.lua
+++ b/lua/mason-core/installer/registry/providers/composer.lua
@@ -21,14 +21,7 @@ end
---@param source ParsedComposerSource
function M.install(ctx, source)
local composer = require "mason-core.installer.managers.composer"
-
- return Result.try(function(try)
- try(util.ensure_valid_version(function()
- return providers.packagist.get_all_versions(source.package)
- end))
-
- try(composer.install(source.package, source.version))
- end)
+ return composer.install(source.package, source.version)
end
---@async
diff --git a/lua/mason-core/installer/registry/providers/gem.lua b/lua/mason-core/installer/registry/providers/gem.lua
index 100046d9..9653f116 100644
--- a/lua/mason-core/installer/registry/providers/gem.lua
+++ b/lua/mason-core/installer/registry/providers/gem.lua
@@ -32,16 +32,9 @@ end
---@param source ParsedGemSource
function M.install(ctx, source)
local gem = require "mason-core.installer.managers.gem"
-
- return Result.try(function(try)
- try(util.ensure_valid_version(function()
- return providers.rubygems.get_all_versions(source.package)
- end))
-
- try(gem.install(source.package, source.version, {
- extra_packages = source.extra_packages,
- }))
- end)
+ return gem.install(source.package, source.version, {
+ extra_packages = source.extra_packages,
+ })
end
---@async
diff --git a/lua/mason-core/installer/registry/providers/github/release.lua b/lua/mason-core/installer/registry/providers/github/release.lua
index 9d01ba32..5fe95cab 100644
--- a/lua/mason-core/installer/registry/providers/github/release.lua
+++ b/lua/mason-core/installer/registry/providers/github/release.lua
@@ -88,13 +88,8 @@ end
---@param source ParsedGitHubReleaseSource
function M.install(ctx, source)
local std = require "mason-core.installer.managers.std"
- local providers = require "mason-core.providers"
return Result.try(function(try)
- try(util.ensure_valid_version(function()
- return providers.github.get_all_release_versions(source.repo)
- end))
-
for __, download in ipairs(source.downloads) do
a.scheduler()
local out_dir = vim.fn.fnamemodify(download.out_file, ":h")
diff --git a/lua/mason-core/installer/registry/providers/golang.lua b/lua/mason-core/installer/registry/providers/golang.lua
index f8e68bab..40327bb2 100644
--- a/lua/mason-core/installer/registry/providers/golang.lua
+++ b/lua/mason-core/installer/registry/providers/golang.lua
@@ -36,15 +36,9 @@ end
function M.install(ctx, source)
local golang = require "mason-core.installer.managers.golang"
- return Result.try(function(try)
- try(util.ensure_valid_version(function()
- return providers.golang.get_all_versions(source.package)
- end))
-
- try(golang.install(source.package, source.version, {
- extra_packages = source.extra_packages,
- }))
- end)
+ return golang.install(source.package, source.version, {
+ extra_packages = source.extra_packages,
+ })
end
---@async
diff --git a/lua/mason-core/installer/registry/providers/npm.lua b/lua/mason-core/installer/registry/providers/npm.lua
index 85b204c8..d1865b96 100644
--- a/lua/mason-core/installer/registry/providers/npm.lua
+++ b/lua/mason-core/installer/registry/providers/npm.lua
@@ -35,13 +35,8 @@ end
---@param source ParsedNpmSource
function M.install(ctx, source)
local npm = require "mason-core.installer.managers.npm"
- local providers = require "mason-core.providers"
return Result.try(function(try)
- try(util.ensure_valid_version(function()
- return providers.npm.get_all_versions(source.package)
- end))
-
try(npm.init())
try(npm.install(source.package, source.version, {
extra_packages = source.extra_packages,
diff --git a/lua/mason-core/installer/registry/providers/pypi.lua b/lua/mason-core/installer/registry/providers/pypi.lua
index 6efb9730..c162c120 100644
--- a/lua/mason-core/installer/registry/providers/pypi.lua
+++ b/lua/mason-core/installer/registry/providers/pypi.lua
@@ -41,10 +41,6 @@ function M.install(ctx, source)
local pypi = require "mason-core.installer.managers.pypi"
return Result.try(function(try)
- try(util.ensure_valid_version(function()
- return providers.pypi.get_all_versions(source.package)
- end))
-
try(pypi.init {
upgrade_pip = source.pip.upgrade,
install_extra_args = source.pip.extra_args,
diff --git a/lua/mason-core/installer/registry/util.lua b/lua/mason-core/installer/registry/util.lua
index ed98b738..04492bbf 100644
--- a/lua/mason-core/installer/registry/util.lua
+++ b/lua/mason-core/installer/registry/util.lua
@@ -38,7 +38,7 @@ end
---Checks whether a custom version of a package installation corresponds to a valid version.
---@async
----@param versions_thunk async fun(): Result Result<string>
+---@param versions_thunk async fun(): Result Result<string[]>
function M.ensure_valid_version(versions_thunk)
local ctx = installer.context()
local version = ctx.opts.version
diff --git a/tests/mason-core/installer/registry/installer_spec.lua b/tests/mason-core/installer/registry/installer_spec.lua
index 3559c3b9..6ac25da9 100644
--- a/tests/mason-core/installer/registry/installer_spec.lua
+++ b/tests/mason-core/installer/registry/installer_spec.lua
@@ -1,6 +1,7 @@
local Result = require "mason-core.result"
local installer = require "mason-core.installer.registry"
local match = require "luassert.match"
+local spy = require "luassert.spy"
local stub = require "luassert.stub"
local util = require "mason-core.installer.registry.util"
@@ -28,6 +29,9 @@ local dummy_provider = {
return Result.success()
end
end,
+ get_versions = function()
+ return Result.success { "v1.0.0", "v2.0.0" }
+ end,
}
describe("registry installer :: parsing", function()
@@ -125,37 +129,112 @@ end)
describe("registry installer :: compiling", function()
it("should run compiled installer function successfully", function()
installer.register_provider("dummy", dummy_provider)
+ spy.on(dummy_provider, "get_versions")
+
+ ---@type PackageInstallOpts
+ local opts = {}
local result = installer.compile({
schema = "registry+v1",
source = {
id = "pkg:dummy/package-name@v1.2.3",
},
- }, {})
+ }, opts)
assert.is_true(result:is_success())
- local installer_fn = result:get_or_nil()
+ local installer_fn = result:get_or_throw()
- local ctx = create_dummy_context()
+ local ctx = create_dummy_context(opts)
local installer_result = require("mason-core.installer").exec_in_context(ctx, installer_fn)
+
assert.same(Result.success(), installer_result)
+ assert.spy(dummy_provider.get_versions).was_not_called()
+ end)
+
+ it("should ensure valid version", function()
+ installer.register_provider("dummy", dummy_provider)
+ spy.on(dummy_provider, "get_versions")
+
+ ---@type PackageInstallOpts
+ local opts = { version = "v2.0.0" }
+
+ local result = installer.compile({
+ schema = "registry+v1",
+ source = {
+ id = "pkg:dummy/package-name@v1.2.3",
+ },
+ }, opts)
+
+ assert.is_true(result:is_success())
+ local installer_fn = result:get_or_throw()
+
+ local ctx = create_dummy_context(opts)
+ local installer_result = require("mason-core.installer").exec_in_context(ctx, installer_fn)
+ assert.same(Result.success(), installer_result)
+
+ assert.spy(dummy_provider.get_versions).was_called(1)
+ assert.spy(dummy_provider.get_versions).was_called_with({
+ name = "package-name",
+ scheme = "pkg",
+ type = "dummy",
+ version = "v2.0.0",
+ }, {
+ id = "pkg:dummy/package-name@v1.2.3",
+ })
+ end)
+
+ it("should reject invalid version", function()
+ installer.register_provider("dummy", dummy_provider)
+ spy.on(dummy_provider, "get_versions")
+
+ ---@type PackageInstallOpts
+ local opts = { version = "v13.3.7" }
+
+ local result = installer.compile({
+ schema = "registry+v1",
+ source = {
+ id = "pkg:dummy/package-name@v1.2.3",
+ },
+ }, opts)
+
+ assert.is_true(result:is_success())
+ local installer_fn = result:get_or_throw()
+
+ local ctx = create_dummy_context(opts)
+ local err = assert.has_error(function()
+ require("mason-core.installer").exec_in_context(ctx, installer_fn)
+ end)
+
+ assert.equals([[Version "v13.3.7" is not available.]], err)
+ assert.spy(dummy_provider.get_versions).was_called(1)
+ assert.spy(dummy_provider.get_versions).was_called_with({
+ name = "package-name",
+ scheme = "pkg",
+ type = "dummy",
+ version = "v13.3.7",
+ }, {
+ id = "pkg:dummy/package-name@v1.2.3",
+ })
end)
it("should raise errors upon installer failures", function()
installer.register_provider("dummy", dummy_provider)
+ ---@type PackageInstallOpts
+ local opts = {}
+
local result = installer.compile({
schema = "registry+v1",
source = {
id = "pkg:dummy/package-name@v1.2.3",
should_fail = true,
},
- }, {})
+ }, opts)
assert.is_true(result:is_success())
local installer_fn = result:get_or_nil()
- local ctx = create_dummy_context()
+ local ctx = create_dummy_context(opts)
local err = assert.has_error(function()
require("mason-core.installer").exec_in_context(ctx, installer_fn)
end)
@@ -178,13 +257,15 @@ describe("registry installer :: compiling", function()
opt = { ["opt/"] = "opt/" },
share = { ["share/"] = "share/" },
}
+ ---@type PackageInstallOpts
+ local opts = {}
- local result = installer.compile(spec, {})
+ local result = installer.compile(spec, opts)
assert.is_true(result:is_success())
local installer_fn = result:get_or_nil()
- local ctx = create_dummy_context()
+ local ctx = create_dummy_context(opts)
local installer_result = require("mason-core.installer").exec_in_context(ctx, installer_fn)
assert.is_true(installer_result:is_success())
diff --git a/tests/mason-core/installer/registry/providers/cargo_spec.lua b/tests/mason-core/installer/registry/providers/cargo_spec.lua
index 61cbd6c0..674164c2 100644
--- a/tests/mason-core/installer/registry/providers/cargo_spec.lua
+++ b/tests/mason-core/installer/registry/providers/cargo_spec.lua
@@ -116,28 +116,4 @@ describe("cargo provider :: installing", function()
locked = true,
})
end)
-
- it("should ensure valid version", function()
- local ctx = create_dummy_context {
- version = "1.10.0",
- }
- local manager = require "mason-core.installer.managers.cargo"
- local providers = require "mason-core.providers"
- stub(providers.crates, "get_all_versions", mockx.returns(Result.success { "1.0.0" }))
- stub(manager, "install", mockx.returns(Result.success()))
-
- local result = installer.exec_in_context(ctx, function()
- return cargo.install(ctx, {
- crate = "crate-name",
- version = "1.10.0",
- features = nil,
- locked = true,
- git = nil,
- })
- end)
-
- assert.is_true(result:is_failure())
- assert.same(Result.failure [[Version "1.10.0" is not available.]], result)
- assert.spy(manager.install).was_called(0)
- end)
end)
diff --git a/tests/mason-core/installer/registry/providers/composer_spec.lua b/tests/mason-core/installer/registry/providers/composer_spec.lua
index a8c29d59..8b771ff9 100644
--- a/tests/mason-core/installer/registry/providers/composer_spec.lua
+++ b/tests/mason-core/installer/registry/providers/composer_spec.lua
@@ -42,25 +42,4 @@ describe("composer provider :: installing", function()
assert.spy(manager.install).was_called(1)
assert.spy(manager.install).was_called_with("vendor/package", "1.2.0")
end)
-
- it("should ensure valid version", function()
- local ctx = create_dummy_context {
- version = "1.10.0",
- }
- local manager = require "mason-core.installer.managers.composer"
- local providers = require "mason-core.providers"
- stub(providers.packagist, "get_all_versions", mockx.returns(Result.success { "1.0.0" }))
- stub(manager, "install", mockx.returns(Result.success()))
-
- local result = installer.exec_in_context(ctx, function()
- return composer.install(ctx, {
- package = "vendor/package",
- version = "1.10.0",
- })
- end)
-
- assert.is_true(result:is_failure())
- assert.same(Result.failure [[Version "1.10.0" is not available.]], result)
- assert.spy(manager.install).was_called(0)
- end)
end)
diff --git a/tests/mason-core/installer/registry/providers/gem_spec.lua b/tests/mason-core/installer/registry/providers/gem_spec.lua
index 0ddfdcc1..965cdbe8 100644
--- a/tests/mason-core/installer/registry/providers/gem_spec.lua
+++ b/tests/mason-core/installer/registry/providers/gem_spec.lua
@@ -48,25 +48,4 @@ describe("gem provider :: installing", function()
assert.spy(manager.install).was_called(1)
assert.spy(manager.install).was_called_with("package", "5.2.0", { extra_packages = { "extra" } })
end)
-
- it("should ensure valid version", function()
- local ctx = create_dummy_context {
- version = "1.10.0",
- }
- local manager = require "mason-core.installer.managers.gem"
- local providers = require "mason-core.providers"
- stub(providers.rubygems, "get_all_versions", mockx.returns(Result.success { "1.0.0" }))
- stub(manager, "install", mockx.returns(Result.success()))
-
- local result = installer.exec_in_context(ctx, function()
- return gem.install(ctx, {
- package = "package",
- version = "1.10.0",
- })
- end)
-
- assert.is_true(result:is_failure())
- assert.same(Result.failure [[Version "1.10.0" is not available.]], result)
- assert.spy(manager.install).was_called(0)
- end)
end)
diff --git a/tests/mason-core/installer/registry/providers/github/release_spec.lua b/tests/mason-core/installer/registry/providers/github/release_spec.lua
index 6d0ff5df..47ac47c8 100644
--- a/tests/mason-core/installer/registry/providers/github/release_spec.lua
+++ b/tests/mason-core/installer/registry/providers/github/release_spec.lua
@@ -352,33 +352,4 @@ describe("github provider :: release :: installing", function()
assert.is_true(match.matches "out/dir$"(unpack_cwd))
assert.spy(std.unpack).was_called_with "file.zip"
end)
-
- it("should install ensure valid version when installing release asset", function()
- local ctx = create_dummy_context {
- version = "1.42.0",
- }
- local std = require "mason-core.installer.managers.std"
- local providers = require "mason-core.providers"
- stub(std, "download_file")
- stub(providers.github, "get_all_release_versions", mockx.returns(Result.success { "2023-03-09" }))
-
- local result = installer.exec_in_context(ctx, function()
- return github.install(ctx, {
- repo = "namespace/name",
- asset = {
- file = "file.zip",
- },
- downloads = {
- {
- out_file = "out/dir/file.zip",
- download_url = "https://github.com/namespace/name/releases/download/2023-03-09/file.zip",
- },
- },
- })
- end)
-
- assert.is_true(result:is_failure())
- assert.same(Result.failure [[Version "1.42.0" is not available.]], result)
- assert.spy(std.download_file).was_called(0)
- end)
end)
diff --git a/tests/mason-core/installer/registry/providers/golang_spec.lua b/tests/mason-core/installer/registry/providers/golang_spec.lua
index 696c257e..6ba57272 100644
--- a/tests/mason-core/installer/registry/providers/golang_spec.lua
+++ b/tests/mason-core/installer/registry/providers/golang_spec.lua
@@ -44,25 +44,4 @@ describe("golang provider :: installing", function()
assert.spy(manager.install).was_called(1)
assert.spy(manager.install).was_called_with("namespace/package", "v1.5.0", { extra_packages = { "extra" } })
end)
-
- it("should ensure valid version", function()
- local ctx = create_dummy_context {
- version = "1.10.0",
- }
- local manager = require "mason-core.installer.managers.golang"
- local providers = require "mason-core.providers"
- stub(providers.golang, "get_all_versions", mockx.returns(Result.success { "1.0.0" }))
- stub(manager, "install", mockx.returns(Result.success()))
-
- local result = installer.exec_in_context(ctx, function()
- return golang.install(ctx, {
- package = "package",
- version = "1.10.0",
- })
- end)
-
- assert.is_true(result:is_failure())
- assert.same(Result.failure [[Version "1.10.0" is not available.]], result)
- assert.spy(manager.install).was_called(0)
- end)
end)
diff --git a/tests/mason-core/installer/registry/providers/npm_spec.lua b/tests/mason-core/installer/registry/providers/npm_spec.lua
index ce968d43..b39d092a 100644
--- a/tests/mason-core/installer/registry/providers/npm_spec.lua
+++ b/tests/mason-core/installer/registry/providers/npm_spec.lua
@@ -46,27 +46,4 @@ describe("npm provider :: installing", function()
assert.spy(manager.install).was_called(1)
assert.spy(manager.install).was_called_with("@namespace/package", "v1.5.0", { extra_packages = { "extra" } })
end)
-
- it("should ensure valid version", function()
- local ctx = create_dummy_context {
- version = "1.10.0",
- }
- local manager = require "mason-core.installer.managers.npm"
- local providers = require "mason-core.providers"
- stub(providers.npm, "get_all_versions", mockx.returns(Result.success { "1.0.0" }))
- stub(manager, "init", mockx.returns(Result.success()))
- stub(manager, "install", mockx.returns(Result.success()))
-
- local result = installer.exec_in_context(ctx, function()
- return npm.install(ctx, {
- package = "package",
- version = "1.10.0",
- })
- end)
-
- assert.is_true(result:is_failure())
- assert.same(Result.failure [[Version "1.10.0" is not available.]], result)
- assert.spy(manager.init).was_called(0)
- assert.spy(manager.install).was_called(0)
- end)
end)
diff --git a/tests/mason-core/installer/registry/providers/pypi_spec.lua b/tests/mason-core/installer/registry/providers/pypi_spec.lua
index f6f4c5c3..5ba9609b 100644
--- a/tests/mason-core/installer/registry/providers/pypi_spec.lua
+++ b/tests/mason-core/installer/registry/providers/pypi_spec.lua
@@ -83,32 +83,4 @@ describe("pypi provider :: installing", function()
)
settings.set(settings._DEFAULT_SETTINGS)
end)
-
- it("should ensure valid version", function()
- local ctx = create_dummy_context {
- version = "1.10.0",
- }
- local manager = require "mason-core.installer.managers.pypi"
- local providers = require "mason-core.providers"
- stub(providers.pypi, "get_all_versions", mockx.returns(Result.success { "1.0.0" }))
- stub(manager, "init", mockx.returns(Result.success()))
- stub(manager, "install", mockx.returns(Result.success()))
-
- local result = installer.exec_in_context(ctx, function()
- return pypi.install(ctx, {
- package = "package",
- version = "1.5.0",
- extra_packages = {},
- pip = {
- upgrade = true,
- extra_args = { "--proxy", "http://localghost" },
- },
- })
- end)
-
- assert.is_true(result:is_failure())
- assert.same(Result.failure [[Version "1.10.0" is not available.]], result)
- assert.spy(manager.init).was_called(0)
- assert.spy(manager.install).was_called(0)
- end)
end)