diff options
| author | William Boman <william@redwill.se> | 2022-10-14 18:09:36 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-10-14 18:09:36 +0200 |
| commit | a3eb3f0874ee7500915dbcce0beba22d112b15e6 (patch) | |
| tree | b00ad565444183c8880328802014cdd6db4be35f | |
| parent | feat(lemmy-help): use prebuilt binaries from release assets (#555) (diff) | |
| download | mason-a3eb3f0874ee7500915dbcce0beba22d112b15e6.tar mason-a3eb3f0874ee7500915dbcce0beba22d112b15e6.tar.gz mason-a3eb3f0874ee7500915dbcce0beba22d112b15e6.tar.bz2 mason-a3eb3f0874ee7500915dbcce0beba22d112b15e6.tar.lz mason-a3eb3f0874ee7500915dbcce0beba22d112b15e6.tar.xz mason-a3eb3f0874ee7500915dbcce0beba22d112b15e6.tar.zst mason-a3eb3f0874ee7500915dbcce0beba22d112b15e6.zip | |
feat(api): add typed client interface (#556)
| -rw-r--r-- | lua/mason-core/managers/github/client.lua | 6 | ||||
| -rw-r--r-- | lua/mason-core/managers/npm/init.lua | 2 | ||||
| -rw-r--r-- | lua/mason-registry/api.lua | 47 | ||||
| -rw-r--r-- | tests/mason-registry/api_spec.lua | 11 |
4 files changed, 60 insertions, 6 deletions
diff --git a/lua/mason-core/managers/github/client.lua b/lua/mason-core/managers/github/client.lua index 9583ab6d..3ef307c1 100644 --- a/lua/mason-core/managers/github/client.lua +++ b/lua/mason-core/managers/github/client.lua @@ -66,8 +66,7 @@ end ---@return Result # Result<GitHubRelease> function M.fetch_latest_release(repo, opts) opts = opts or { include_prerelease = false } - local path = ("/api/repo/%s/releases/latest"):format(repo) - return api.get(path, { + return api.repo.releases.latest({ repo = repo }, { params = { include_prerelease = opts.include_prerelease and "true" or "false", }, @@ -88,8 +87,7 @@ end ---@param repo string The GitHub repo ("username/repo"). ---@return Result # Result<string> The latest tag name. function M.fetch_latest_tag(repo) - local path = ("/api/repo/%s/tags/latest"):format(repo) - return api.get(path):map(_.prop "tag") + return api.repo.tags.latest({ repo = repo }):map(_.prop "tag") end ---@async diff --git a/lua/mason-core/managers/npm/init.lua b/lua/mason-core/managers/npm/init.lua index 9cfa2be7..61ee4042 100644 --- a/lua/mason-core/managers/npm/init.lua +++ b/lua/mason-core/managers/npm/init.lua @@ -112,7 +112,7 @@ function M.check_outdated_primary_package(receipt, install_dir) local primary_package = receipt.primary_source.package return M.get_installed_primary_package_version(receipt, install_dir) :and_then(function(installed_version) - return api.get(("/api/npm/%s/versions/latest"):format(primary_package)):map(function(response) + return api.npm.versions.latest({ package = primary_package }):map(function(response) return { installed = installed_version, latest = response.version, diff --git a/lua/mason-registry/api.lua b/lua/mason-registry/api.lua index 037d7fd6..b700ba47 100644 --- a/lua/mason-registry/api.lua +++ b/lua/mason-registry/api.lua @@ -8,9 +8,11 @@ local BASE_URL = "https://api.mason-registry.dev" local stringify_params = _.compose(_.join "&", _.map(_.join "="), _.sort_by(_.head), _.to_pairs) +---@alias ApiFetchOpts { params: table<string, any>? } + ---@async ---@param path string ----@param opts { params: table<string, any>? }? +---@param opts ApiFetchOpts? ---@return Result # JSON decoded response. function api.get(path, opts) if opts and opts.params then @@ -24,4 +26,47 @@ function api.get(path, opts) }):map_catching(vim.json.decode) end +---@alias ApiSignature<T> fun(path_params: T, opts?: ApiFetchOpts): Result + +---@param path_template string +local function get(path_template) + ---@param path_params table + ---@param opts ApiFetchOpts? + return function(path_params, opts) + local path = path_template:gsub("{([%w_%.0-9]+)}", function(prop) + return path_params[prop] + end) + -- This is done so that test stubs trigger as expected (you have to explicitly match against nil arguments) + if opts then + return api.get(path, opts) + else + return api.get(path) + end + end +end + +api.repo = { + releases = { + ---@type ApiSignature<{ repo: string }> + latest = get "/api/repo/{repo}/releases/latest", + ---@type ApiSignature<{ repo: string }> + all = get "/api/repo/{repo}/releases/all", + }, + tags = { + ---@type ApiSignature<{ repo: string }> + latest = get "/api/repo/{repo}/tags/latest", + ---@type ApiSignature<{ repo: string }> + all = get "/api/repo/{repo}/tags/all", + }, +} + +api.npm = { + versions = { + ---@type ApiSignature<{ package: string }> + latest = get "/api/npm/{package}/versions/latest", + ---@type ApiSignature<{ package: string }> + all = get "/api/npm/{package}/versions/all", + }, +} + return api diff --git a/tests/mason-registry/api_spec.lua b/tests/mason-registry/api_spec.lua index f7b1bf45..0027e695 100644 --- a/tests/mason-registry/api_spec.lua +++ b/tests/mason-registry/api_spec.lua @@ -1,4 +1,5 @@ local stub = require "luassert.stub" +local match = require "luassert.match" local Result = require "mason-core.result" describe("mason-registry API", function() @@ -38,4 +39,14 @@ describe("mason-registry API", function() assert.same({ field = { "value" } }, result) end) + + it("should interpolate path parameters", function() + fetch.returns(Result.success [[{}]]) + + local result = api.repo.releases.latest { repo = "myrepo/name" } + + assert.is_true(result:is_success()) + assert.spy(fetch).was_called(1) + assert.spy(fetch).was_called_with(match.is_match "/api/repo/myrepo/name/releases/latest$", match.is_table()) + end) end) |
