From 76ba630d59517002581865393264318173048784 Mon Sep 17 00:00:00 2001 From: sw5678 <151949597+sw5678@users.noreply.github.com> Date: Wed, 13 Dec 2023 09:19:16 +0000 Subject: [PATCH 1/2] Added file tree functionality --- src/core/config/Categories.json | 3 +- src/core/operations/FileTree.mjs | 100 ++++++++++++++++++++++++++++ tests/operations/tests/FileTree.mjs | 21 ++++++ 3 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 src/core/operations/FileTree.mjs create mode 100644 tests/operations/tests/FileTree.mjs diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json index cf4d91be..b76b93ac 100644 --- a/src/core/config/Categories.json +++ b/src/core/config/Categories.json @@ -294,7 +294,8 @@ "Escape string", "Unescape string", "Pseudo-Random Number Generator", - "Sleep" + "Sleep", + "File Tree" ] }, { diff --git a/src/core/operations/FileTree.mjs b/src/core/operations/FileTree.mjs new file mode 100644 index 00000000..c13b9d1a --- /dev/null +++ b/src/core/operations/FileTree.mjs @@ -0,0 +1,100 @@ +/** + * @author sw5678 + * @copyright Crown Copyright 2016 + * @license Apache-2.0 + */ + +import Operation from "../Operation.mjs"; +import Utils from "../Utils.mjs"; +import {INPUT_DELIM_OPTIONS} from "../lib/Delim.mjs"; + +/** + * Unique operation + */ +class FileTree extends Operation { + + /** + * Unique constructor + */ + constructor() { + super(); + + this.name = "File Tree"; + this.module = "Default"; + this.description = "Creates file tree from list of file paths (Similar too tree linux command)"; + this.inputType = "string"; + this.outputType = "string"; + this.args = [ + { + name: "File Path Delimiter", + type: "binaryString", + value: "/" + }, + { + name: "Delimiter", + type: "option", + value: INPUT_DELIM_OPTIONS + } + ]; + } + + /** + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + run(input, args) { + + // Set up arrow and pipe for nice output display + const ARROW = '|---'; + const PIPE = '| '; + + // Get args from input + const file_delim = args[0]; + const entry_delim = Utils.charRep(args[1]); + + // Store path to print + let completed_list = []; + let print_list = []; + + // Loop through all entries + const file_paths = input.split(entry_delim).unique().sort(); + for (var i = 0; i < file_paths.length; i++) + { + // Split by file delimiter + let path = file_paths[i].split(file_delim); + + if (path[0] == '') + { + path = path.slice(1, path.length); + } + + for (var j = 0; j < path.length; j++) + { + let print_line; + let key; + if (j == 0) + { + print_line = path[j]; + key = path[j]; + } + else + { + print_line = PIPE.repeat(j-1) + ARROW + path[j] + key = path.slice(0, j+1).join("/"); + } + + // Check to see we have already added that path + if (!completed_list.includes(key)) + { + completed_list.push(key); + print_list.push(print_line); + } + } + } + return print_list.join("\n"); + } + +} + +export default FileTree; diff --git a/tests/operations/tests/FileTree.mjs b/tests/operations/tests/FileTree.mjs new file mode 100644 index 00000000..34249e3c --- /dev/null +++ b/tests/operations/tests/FileTree.mjs @@ -0,0 +1,21 @@ +/** + * @author sw5678 + * @copyright Crown Copyright 2023 + * @license Apache-2.0 + */ +import TestRegister from "../../lib/TestRegister.mjs"; + +TestRegister.addTests([ + { + "name": "Swap Case: basic example", + "input": "/test_dir1/test_file1.txt\n/test_dir1/test_file2.txt\n/test_dir2/test_file1.txt", + "expectedOutput": "test_dir1\n|---test_file1.txt\n|---test_file2.txt\ntest_dir2\n|---test_file1.txt", + "recipeConfig": [ + { + "op": "File Tree", + "args": [ + ], + }, + ], + } +]); From ac18b74e66612a3fe003bc10f3050a20f6bcaefc Mon Sep 17 00:00:00 2001 From: sw5678 <151949597+sw5678@users.noreply.github.com> Date: Wed, 13 Dec 2023 09:38:26 +0000 Subject: [PATCH 2/2] Fixed linting issues --- src/core/operations/FileTree.mjs | 49 ++++++++++++++------------------ 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/src/core/operations/FileTree.mjs b/src/core/operations/FileTree.mjs index c13b9d1a..c01401c6 100644 --- a/src/core/operations/FileTree.mjs +++ b/src/core/operations/FileTree.mjs @@ -46,53 +46,46 @@ class FileTree extends Operation { run(input, args) { // Set up arrow and pipe for nice output display - const ARROW = '|---'; - const PIPE = '| '; + const ARROW = "|---"; + const PIPE = "| "; // Get args from input - const file_delim = args[0]; - const entry_delim = Utils.charRep(args[1]); + const fileDelim = args[0]; + const entryDelim = Utils.charRep(args[1]); // Store path to print - let completed_list = []; - let print_list = []; + const completedList = []; + const printList = []; // Loop through all entries - const file_paths = input.split(entry_delim).unique().sort(); - for (var i = 0; i < file_paths.length; i++) - { + const filePaths = input.split(entryDelim).unique().sort(); + for (let i = 0; i < filePaths.length; i++) { // Split by file delimiter - let path = file_paths[i].split(file_delim); + let path = filePaths[i].split(fileDelim); - if (path[0] == '') - { - path = path.slice(1, path.length); + if (path[0] === "") { + path = path.slice(1, path.length); } - for (var j = 0; j < path.length; j++) - { - let print_line; + for (let j = 0; j < path.length; j++) { + let printLine; let key; - if (j == 0) - { - print_line = path[j]; + if (j === 0) { + printLine = path[j]; key = path[j]; - } - else - { - print_line = PIPE.repeat(j-1) + ARROW + path[j] + } else { + printLine = PIPE.repeat(j-1) + ARROW + path[j]; key = path.slice(0, j+1).join("/"); } // Check to see we have already added that path - if (!completed_list.includes(key)) - { - completed_list.push(key); - print_list.push(print_line); + if (!completedList.includes(key)) { + completedList.push(key); + printList.push(printLine); } } } - return print_list.join("\n"); + return printList.join("\n"); } }