Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactoring: code organization #30

Merged
merged 1 commit into from
Oct 4, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
177 changes: 0 additions & 177 deletions extension.js

This file was deleted.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"onCommand:extension.elixirRunTestSuite",
"onCommand:extension.elixirRunTestAtCursor"
],
"main": "./extension.js",
"main": "./src/extension.js",
"contributes": {
"commands": [
{
Expand Down
6 changes: 6 additions & 0 deletions src/commands/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const jumpToTest = require("./jumpToTest");
const runTestAtCursor = require("./runTestAtCursor");
const runTestFile = require("./runTestFile");
const runTestSuite = require("./runTestSuite");

module.exports = [jumpToTest, runTestAtCursor, runTestFile, runTestSuite];
102 changes: 102 additions & 0 deletions src/commands/jumpToTest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
const vscode = require("vscode");

function handler() {
const activeFile = vscode.window.activeTextEditor;

if (!activeFile) {
return;
}

const openedFilename = activeFile.document.fileName;
const isCodeFile = /(.*(\/.*\/))(.*)(\.\w+)$/;
const openedFile = openedFilename.match(isCodeFile);

if (!openedFile) {
return;
}

const fullDir = openedFile[1];
const context =
openedFile[2] == "/lib/"
? "/test/"
: openedFile[2].replace("/test/", "/lib/");
const fileName = openedFile[3];
const isTestFile = fileName.includes("_test");

if (isTestFile === true) {
var strippedFileName = fileName.replace("_test", "");
var fileToOpen = `**${context}${strippedFileName}.ex`;
} else {
var fileToOpen = `**${context}${fileName}_test.exs`;
}

vscode.workspace.findFiles(fileToOpen, "**/.elixir_ls/**").then(files => {
if (!files.length) {
let dir = fullDir.replace("lib", "test");
let file = `${fileName}_test.exs`;

askToCreateANewFile(dir, file);
} else {
let file = files[0].fsPath;
openFile(file);
}
});
}

function askToCreateANewFile(dir, file) {
return showConfirmationDialog(
`Create the test file at ${dir}?`,
"Create"
).then(answer => {
if (answer == "Create") {
createNewTestFile(dir, file).then(() => {
openFile(`${dir}${file}`);
});
} else {
return;
}
});
}

function showConfirmationDialog(text, button) {
return vscode.window.showWarningMessage(text, { modal: true }, button);
}

function openFile(file) {
return vscode.workspace
.openTextDocument(vscode.Uri.file(file))
.then(vscode.window.showTextDocument);
}

async function createNewTestFile(dir, file) {
const uriDir = vscode.Uri.file(dir);
const uriFile = vscode.Uri.file(`${dir}${file}`);
const ws = new vscode.WorkspaceEdit();

const originalFile = vscode.window.activeTextEditor.document.fileName;
const originalFileUri = vscode.Uri.file(originalFile);
const moduleName = await getModuleName(originalFileUri);

await vscode.workspace.fs.createDirectory(uriDir);

ws.createFile(uriFile);
ws.insert(
uriFile,
new vscode.Position(0, 0),
`defmodule ${moduleName}Test do\nend`
);

await vscode.workspace.applyEdit(ws);
}

async function getModuleName(uriFile) {
const content = (await vscode.workspace.fs.readFile(uriFile)).toString();
const moduleDefinition = content.match(/defmodule (.*) do/);

return moduleDefinition[1];
}

module.exports = {
name: "extension.elixirJumpToTest",
handler
};
37 changes: 37 additions & 0 deletions src/commands/runTestAtCursor.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
const vscode = require("vscode");

function handler() {
const activeFile = vscode.window.activeTextEditor;
if (!activeFile) {
return;
}

const openedFilename = activeFile.document.fileName;
/*
We do a +1 here because the `line` returned is zero based.
Ref: https://code.visualstudio.com/api/references/vscode-api#Position
*/
const cursorLine = activeFile.selection.active.line + 1;

const isTestFile = openedFilename.includes("_test.exs");
const isUmbrella = openedFilename.includes("/apps/");

if (isTestFile === true) {
const testPathFilter = isUmbrella ? /.*\/(apps\/.*)$/ : /.*\/(test\/.*)$/;
let terminal =
vscode.window.activeTerminal || vscode.window.createTerminal();
terminal.sendText(
`mix test ${openedFilename.match(testPathFilter)[1]}:${cursorLine}`
);
terminal.show();
} else {
vscode.window.showInformationMessage(
`The current file is not a test file.`
);
}
}

module.exports = {
name: "extension.elixirRunTestAtCursor",
handler
};
30 changes: 30 additions & 0 deletions src/commands/runTestFile.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
const vscode = require("vscode");

function handler() {
const activeFile = vscode.window.activeTextEditor;
if (!activeFile) {
return;
}

const openedFilename = activeFile.document.fileName;

const isTestFile = openedFilename.includes("_test.exs");
const isUmbrella = openedFilename.includes("/apps/");

if (isTestFile === true) {
const testPathFilter = isUmbrella ? /.*\/(apps\/.*)$/ : /.*\/(test\/.*)$/;
let terminal =
vscode.window.activeTerminal || vscode.window.createTerminal();
terminal.sendText(`mix test ${openedFilename.match(testPathFilter)[1]}`);
terminal.show();
} else {
vscode.window.showInformationMessage(
`The current file is not a test file.`
);
}
}

module.exports = {
name: "extension.elixirRunTestFile",
handler
};
12 changes: 12 additions & 0 deletions src/commands/runTestSuite.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
const vscode = require("vscode");

function handler() {
let terminal = vscode.window.activeTerminal || vscode.window.createTerminal();
terminal.sendText(`mix test`);
terminal.show();
}

module.exports = {
name: "extension.elixirRunTestSuite",
handler
};
19 changes: 19 additions & 0 deletions src/extension.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
const vscode = require("vscode");
const commands = require("./commands");

function activate(context) {
commands.forEach(command => {
const disposable = vscode.commands.registerCommand(
command.name,
command.handler
);
context.subscriptions.push(disposable);
});
}

function deactivate() {}

module.exports = {
activate,
deactivate
};