diff --git a/.github/ workflows/test.yml b/.github/ workflows/test.yml new file mode 100644 index 0000000..9910f05 --- /dev/null +++ b/.github/ workflows/test.yml @@ -0,0 +1,35 @@ +name: CI + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [16.x] + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + + - name: Install dependencies + run: npm install + + - name: Compile the extension + run: npm run compile + + - name: Run tests + run: npm test diff --git a/.gitignore b/.gitignore index ecefd94..cb1dd8c 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ logs/ # VS Code .vscode/ +.vscode-test/ +out/ # Build directories dist/ diff --git a/.vscodeignore b/.vscodeignore index d255964..1b5d86d 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -12,3 +12,4 @@ vsc-extension-quickstart.md **/*.map **/*.ts **/.vscode-test.* +.trunk/** diff --git a/CHANGELOG.md b/CHANGELOG.md index 204eded..8effc13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,20 @@ Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how ## [Unreleased] -## [1.6.0] - 2023-10-07 +## [1.7.0] - 2024-12-08 + +### Added + +- Added a right click context menu to delete report files +- Added tests to check the extension features automaticly + +### Changed + +- Changed `README.md` with latest features +- Changed Extension Logo +- Changed Changelog Dates for 1.6.0 Release Date + +## [1.6.0] - 2024-12-07 ### Added diff --git a/README.md b/README.md index 8c75123..2674aea 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ The Magento Log Viewer extension for Visual Studio Code provides a convenient wa - Status bar showing total log entries - Real-time log file monitoring - Badge in the tree view showing the total number of log entries +- Improved report file titles by parsing content for better readability ## Setup diff --git a/package.json b/package.json index 5ee0cb0..258c613 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "magento-log-viewer", "displayName": "Magento Log Viewer", "description": "A Visual Studio Code extension to view and manage Magento log files.", - "version": "1.6.0", + "version": "1.7.0", "publisher": "MathiasElle", "icon": "resources/logo.png", "repository": { @@ -39,6 +39,11 @@ "command": "magento-log-viewer.refreshReportFiles", "title": "Refresh Report Files", "icon": "$(refresh)" + }, + { + "command": "magento-log-viewer.deleteReportFile", + "title": "Delete Report File", + "icon": "$(trash)" } ], "configuration": { @@ -47,7 +52,11 @@ "properties": { "magentoLogViewer.isMagentoProject": { "type": "string", - "enum": ["Yes", "No", "Please select"], + "enum": [ + "Yes", + "No", + "Please select" + ], "default": "Please select", "description": "This is a Magento project", "scope": "resource" @@ -113,6 +122,13 @@ "when": "view == reportFiles && magentoLogViewer.hasMagentoRoot", "group": "navigation" } + ], + "view/item/context": [ + { + "command": "magento-log-viewer.deleteReportFile", + "when": "view == reportFiles && viewItem == reportItem", + "group": "navigation" + } ] } }, diff --git a/resources/logo.png b/resources/logo.png index 719daac..5ea9ba1 100644 Binary files a/resources/logo.png and b/resources/logo.png differ diff --git a/src/extension.ts b/src/extension.ts index f7860f2..0369a84 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,5 +1,6 @@ import * as vscode from 'vscode'; -import { promptMagentoProjectSelection, showErrorMessage, activateExtension, isValidPath } from './helpers'; +import { promptMagentoProjectSelection, showErrorMessage, activateExtension, isValidPath, deleteReportFile } from './helpers'; +import { LogItem, ReportViewerProvider } from './logViewer'; export function activate(context: vscode.ExtensionContext): void { const config = vscode.workspace.getConfiguration(); @@ -13,7 +14,18 @@ export function activate(context: vscode.ExtensionContext): void { showErrorMessage('Magento root path is not set or is not a directory.'); return; } - activateExtension(context, magentoRoot); + const reportViewerProvider = new ReportViewerProvider(magentoRoot); + activateExtension(context, magentoRoot, reportViewerProvider); + + vscode.commands.registerCommand('magento-log-viewer.deleteReportFile', (logItem: LogItem) => { + if (logItem && logItem.command && logItem.command.arguments && logItem.command.arguments[0]) { + const filePath = logItem.command.arguments[0]; + deleteReportFile(filePath); + reportViewerProvider.refresh(); + } else { + showErrorMessage('Failed to delete report file: Invalid file path.'); + } + }); } } diff --git a/src/helpers.ts b/src/helpers.ts index cfd6b4c..4bb6b59 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -25,7 +25,7 @@ export function selectMagentoRootFolder(config: vscode.WorkspaceConfiguration, c updateConfig(config, 'magentoLogViewer.magentoRoot', folderUri[0].fsPath).then(() => { showInformationMessage('Magento root folder successfully saved!'); updateConfig(config, 'magentoLogViewer.isMagentoProject', 'Yes'); - activateExtension(context, folderUri[0].fsPath); + activateExtension(context, folderUri[0].fsPath, new ReportViewerProvider(folderUri[0].fsPath)); }); } }); @@ -57,9 +57,8 @@ export function showErrorMessage(message: string): void { } // Activates the extension by setting up the log viewer and file system watcher. -export function activateExtension(context: vscode.ExtensionContext, magentoRoot: string): void { +export function activateExtension(context: vscode.ExtensionContext, magentoRoot: string, reportViewerProvider: ReportViewerProvider): void { const logViewerProvider = new LogViewerProvider(magentoRoot); - const reportViewerProvider = new ReportViewerProvider(magentoRoot); const logTreeView = vscode.window.createTreeView('logFiles', { treeDataProvider: logViewerProvider }); const reportTreeView = vscode.window.createTreeView('reportFiles', { treeDataProvider: reportViewerProvider }); @@ -127,6 +126,16 @@ export function clearAllLogFiles(logViewerProvider: LogViewerProvider, magentoRo }); } +// Deletes a report file. +export function deleteReportFile(filePath: string): void { + try { + fs.unlinkSync(filePath); + showInformationMessage(`Report file ${filePath} deleted successfully.`); + } catch (error) { + showErrorMessage(`Failed to delete report file ${filePath}: ${error instanceof Error ? error.message : String(error)}`); + } +} + // Updates the badge count for the tree view based on the number of log entries. export function updateBadge(treeView: vscode.TreeView, logViewerProvider: LogViewerProvider, reportViewerProvider: ReportViewerProvider, magentoRoot: string): void { const updateBadgeCount = () => { diff --git a/src/logViewer.ts b/src/logViewer.ts index a5333cf..52d562b 100644 --- a/src/logViewer.ts +++ b/src/logViewer.ts @@ -235,7 +235,10 @@ export class ReportViewerProvider implements vscode.TreeDataProvider, v } private getLogItems(dir: string, label: string): LogItem[] { - return getLogItems(dir, parseReportTitle, getIconForReport); + return getLogItems(dir, parseReportTitle, getIconForReport).map(item => { + item.contextValue = 'reportItem'; + return item; + }); } getLogFilesWithoutUpdatingBadge(dir: string): LogItem[] { diff --git a/src/test/extension.test.ts b/src/test/extension.test.ts index 4ca0ab4..c593c58 100644 --- a/src/test/extension.test.ts +++ b/src/test/extension.test.ts @@ -5,11 +5,49 @@ import * as assert from 'assert'; import * as vscode from 'vscode'; // import * as myExtension from '../../extension'; +const extensionId = 'MathiasElle.magento-log-viewer'; + suite('Extension Test Suite', () => { vscode.window.showInformationMessage('Start all tests.'); - test('Sample test', () => { - assert.strictEqual(-1, [1, 2, 3].indexOf(5)); - assert.strictEqual(-1, [1, 2, 3].indexOf(0)); + test('Extension should be present', () => { + const extension = vscode.extensions.getExtension(extensionId); + assert.ok(extension, "Extension is not installed"); + }); + + test('Extension should activate', async () => { + const extension = vscode.extensions.getExtension(extensionId); + if (extension) { + await extension.activate(); + assert.ok(extension.isActive, "Extension is not active"); + } + }); + + test('Extension should start', async () => { + const extension = vscode.extensions.getExtension(extensionId); + if (extension) { + await extension.activate(); + assert.ok(extension.isActive, "Extension did not start"); + } + }); + + test('Extension should add settings section', () => { + const configuration = vscode.workspace.getConfiguration('magentoLogViewer'); + const isMagentoProject = configuration.get('isMagentoProject'); + assert.notStrictEqual(isMagentoProject, undefined, "Settings section 'magentoLogViewer' is not added"); + }); + + test('Extension should prompt if it is a Magento project', async () => { + const configuration = vscode.workspace.getConfiguration('magentoLogViewer'); + const isMagentoProject = configuration.get('isMagentoProject'); + assert.strictEqual(isMagentoProject, 'Please select', "Extension did not prompt if it is a Magento project"); }); + + test('Extension should have logo in activity bar', async () => { + const activityBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100); + activityBarItem.text = '$(magento-logfile-viewer-logo)'; + activityBarItem.show(); + assert.strictEqual(activityBarItem.text, '$(magento-logfile-viewer-logo)', "Logo is not present in the activity bar"); + }); + });