diff --git a/lua/elixir/utils.lua b/lua/elixir/utils.lua index bfa43954..90a6bb83 100644 --- a/lua/elixir/utils.lua +++ b/lua/elixir/utils.lua @@ -16,20 +16,10 @@ function M.root_dir(fname) fname = vim.fn.getcwd() end - local child_or_root_path = - vim.fs.dirname(vim.fs.find({ "mix.exs", ".git" }, { upward = true, path = fname })[1]) - local maybe_umbrella_path = - vim.fs.dirname(vim.fs.find({ "mix.exs" }, { upward = true, path = child_or_root_path })[1]) + local matches = vim.fs.find({ "mix.exs" }, { upward = true, limit = 2, path = fname }) + local child_or_root_path, maybe_umbrella_path = unpack(matches) - if maybe_umbrella_path then - if not vim.startswith(child_or_root_path, Path:joinpath(maybe_umbrella_path, "apps"):absolute()) then - maybe_umbrella_path = nil - end - end - - local path = maybe_umbrella_path or child_or_root_path or vim.loop.os_homedir() - - return path + return vim.fs.dirname(maybe_umbrella_path or child_or_root_path) end return M diff --git a/tests/fixtures/project_a/lib/module.ex b/tests/fixtures/project_a/lib/module.ex new file mode 100644 index 00000000..e3e27993 --- /dev/null +++ b/tests/fixtures/project_a/lib/module.ex @@ -0,0 +1,3 @@ +defmodule ProjectA.Module do + +end diff --git a/tests/fixtures/project_a/mix.exs b/tests/fixtures/project_a/mix.exs new file mode 100644 index 00000000..7bc0c368 --- /dev/null +++ b/tests/fixtures/project_a/mix.exs @@ -0,0 +1,4 @@ +defmodule ProjectA.MixProject do + +end + diff --git a/tests/fixtures/project_b/apps/app_a/lib/module.ex b/tests/fixtures/project_b/apps/app_a/lib/module.ex new file mode 100644 index 00000000..c683d2d9 --- /dev/null +++ b/tests/fixtures/project_b/apps/app_a/lib/module.ex @@ -0,0 +1,3 @@ +defmodule AppA.Module do + +end diff --git a/tests/fixtures/project_b/apps/app_a/mix.exs b/tests/fixtures/project_b/apps/app_a/mix.exs new file mode 100644 index 00000000..35d9ed61 --- /dev/null +++ b/tests/fixtures/project_b/apps/app_a/mix.exs @@ -0,0 +1,4 @@ +defmodule AppA.MixProject do + +end + diff --git a/tests/fixtures/project_b/mix.exs b/tests/fixtures/project_b/mix.exs new file mode 100644 index 00000000..7055246f --- /dev/null +++ b/tests/fixtures/project_b/mix.exs @@ -0,0 +1,4 @@ +defmodule ProjectB.MixProject do + +end + diff --git a/tests/utils_spec.lua b/tests/utils_spec.lua new file mode 100644 index 00000000..3b8da7aa --- /dev/null +++ b/tests/utils_spec.lua @@ -0,0 +1,44 @@ +local root_dir = vim.fn.getcwd() +local utils = require("elixir.utils") + +describe("utils", function() + + after_each(function() + vim.api.nvim_command("cd " .. root_dir) + end) + + describe("root_dir", function() + + it("finds elixir project root dir without a filename", function() + + local project_dir = root_dir .. "/tests/fixtures/project_a" + + vim.api.nvim_command("cd " .. project_dir) + local result = utils.root_dir() + + assert.are.equal(project_dir, result) + end) + + it("finds elixir project root dir", function() + local project_dir = root_dir .. "/tests/fixtures/project_a" + local result = utils.root_dir(project_dir .. "/lib/module.ex") + + assert.are.equal(project_dir, result) + end) + + it("finds elixir umbrella project root dir", function() + local project_dir = root_dir .. "/tests/fixtures/project_b" + local result = utils.root_dir(project_dir .. "/apps/app_a/lib/module.ex") + + assert.are.equal(project_dir, result) + end) + + it("returns nil if no elixir project root dir is found", function() + local result = utils.root_dir() + + assert.are.equal(nil, result) + end) + + end) +end) +