From f47327dd236f06725a6e49c1cfe118856d6c4acd Mon Sep 17 00:00:00 2001 From: Sanjula Ganepola Date: Sat, 28 Sep 2024 20:09:38 -0400 Subject: [PATCH] Switch to singleton act instance Signed-off-by: Sanjula Ganepola --- src/act.ts | 31 +++++++++++++------ ...mponentManager.ts => componentsManager.ts} | 18 +++++------ src/extension.ts | 8 +++-- src/settingsManager.ts | 19 ++++++++++++ src/views/components/component.ts | 2 +- .../components/componentsTreeDataProvider.ts | 4 +-- src/views/decorationProvider.ts | 2 +- src/views/workflows/workflow.ts | 2 +- .../workflows/workflowsTreeDataProvider.ts | 12 +++---- ...workflowManager.ts => workflowsManager.ts} | 4 +-- 10 files changed, 68 insertions(+), 34 deletions(-) rename src/{componentManager.ts => componentsManager.ts} (81%) create mode 100644 src/settingsManager.ts rename src/{workflowManager.ts => workflowsManager.ts} (95%) diff --git a/src/act.ts b/src/act.ts index c2c2144..cab63b2 100644 --- a/src/act.ts +++ b/src/act.ts @@ -1,8 +1,9 @@ import * as child_process from 'child_process'; import * as path from "path"; import { commands, CustomExecution, EventEmitter, Pseudoterminal, TaskDefinition, TaskGroup, TaskPanelKind, TaskRevealKind, tasks, TaskScope, TerminalDimensions, window, workspace } from "vscode"; -import { ComponentManager } from "./componentManager"; -import { Workflow } from "./workflowManager"; +import { ComponentsManager } from "./componentsManager"; +import { SettingsManager } from './settingsManager'; +import { Workflow, WorkflowsManager } from "./workflowsManager"; export enum EventTrigger { BranchProtectionRule = 'branch_protection_rule', @@ -41,26 +42,36 @@ export enum EventTrigger { } export enum Option { - Workflows = '-W' + Workflows = '-W', + Variable = '-var' } export class Act { private static base: string = 'act'; + componentsManager: ComponentsManager; + workflowsManager: WorkflowsManager; + settingsManager: SettingsManager; - static async runAllWorkflows() { + constructor() { + this.componentsManager = new ComponentsManager(); + this.workflowsManager = new WorkflowsManager(); + this.settingsManager = new SettingsManager(); + } + + async runAllWorkflows() { // TODO: Implement } - static async runEvent(eventTrigger: EventTrigger) { - // return await Act.runCommand(`${Act.base} ${eventTrigger}`); + async runEvent(eventTrigger: EventTrigger) { + // return await this.runCommand(`${Act.base} ${eventTrigger}`); } - static async runWorkflow(workflow: Workflow) { - return await Act.runCommand(workflow, `${Act.base} ${Option.Workflows} ".github/workflows/${path.parse(workflow.uri.fsPath).base}"`); + async runWorkflow(workflow: Workflow) { + return await this.runCommand(workflow, `${Act.base} ${Option.Workflows} ".github/workflows/${path.parse(workflow.uri.fsPath).base}"`); } - static async runCommand(workflow: Workflow, command: string) { - const unreadyComponents = await ComponentManager.getUnreadyComponents(); + async runCommand(workflow: Workflow, command: string) { + const unreadyComponents = await this.componentsManager.getUnreadyComponents(); if (unreadyComponents.length > 0) { window.showErrorMessage(`The following required components are not ready: ${unreadyComponents.map(component => component.name).join(', ')}`, 'Fix...').then(async value => { if (value === 'Fix...') { diff --git a/src/componentManager.ts b/src/componentsManager.ts similarity index 81% rename from src/componentManager.ts rename to src/componentsManager.ts index 5936e66..7e66408 100644 --- a/src/componentManager.ts +++ b/src/componentsManager.ts @@ -21,11 +21,11 @@ export enum ExtensionStatus { NotActivated = 'Not Activated' } -export class ComponentManager { - static async getComponents(): Promise[]> { +export class ComponentsManager { + async getComponents(): Promise[]> { const components: Component[] = []; - const actCliInfo = await ComponentManager.getCliInfo('act', /act version (.+)/); + const actCliInfo = await this.getCliInfo('act', /act version (.+)/); components.push({ name: 'nektos/act CLI', icon: 'terminal', @@ -47,7 +47,7 @@ export class ComponentManager { required: true }); - const githubActionsInfo = await ComponentManager.getExtensionInfo('github.vscode-github-actions'); + const githubActionsInfo = await this.getExtensionInfo('github.vscode-github-actions'); components.push({ name: 'GitHub Actions Extension', icon: 'extensions', @@ -58,7 +58,7 @@ export class ComponentManager { message: 'GitHub Actions extension is not required, but is recommended to take advantage of workflow editor features.' }); - const githubCliInfo = await ComponentManager.getCliInfo('gh', /gh version (.+)/); + const githubCliInfo = await this.getCliInfo('gh', /gh version (.+)/); components.push({ name: 'GitHub CLI', icon: 'terminal', @@ -72,12 +72,12 @@ export class ComponentManager { return components; } - static async getUnreadyComponents(): Promise[]> { - const components = await ComponentManager.getComponents(); + async getUnreadyComponents(): Promise[]> { + const components = await this.getComponents(); return components.filter(component => component.required && (component.status === CliStatus.NotInstalled || component.status === ExtensionStatus.NotActivated)); } - static async getCliInfo(component: string, versionRegex: RegExp): Promise<{ version?: string, status: CliStatus }> { + async getCliInfo(component: string, versionRegex: RegExp): Promise<{ version?: string, status: CliStatus }> { return new Promise<{ version?: string, status: CliStatus }>((resolve, reject) => { child_process.exec(`${component} --version`, (error, stdout, stderr) => { if (error) { @@ -96,7 +96,7 @@ export class ComponentManager { }); } - static async getExtensionInfo(extensionId: string): Promise<{ version?: string, status: ExtensionStatus }> { + async getExtensionInfo(extensionId: string): Promise<{ version?: string, status: ExtensionStatus }> { const allExtensions = extensions.all; const extension = allExtensions.find(extension => extension.id === extensionId); diff --git a/src/extension.ts b/src/extension.ts index a870ad7..3a1b4a3 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,15 +1,19 @@ import * as vscode from 'vscode'; import { window } from 'vscode'; +import { Act } from './act'; import ComponentsTreeDataProvider from './views/components/componentsTreeDataProvider'; import { DecorationProvider } from './views/decorationProvider'; import SettingsTreeDataProvider from './views/settings/settingsTreeDataProvider'; import WorkflowsTreeDataProvider from './views/workflows/workflowsTreeDataProvider'; +export let act: Act; + export function activate(context: vscode.ExtensionContext) { console.log('Congratulations, your extension "github-local-actions" is now active!'); - - const decorationProvider = new DecorationProvider(); + act = new Act(); + + const decorationProvider = new DecorationProvider(); const componentsTreeDataProvider = new ComponentsTreeDataProvider(context); const componentsTreeView = window.createTreeView(ComponentsTreeDataProvider.VIEW_ID, { treeDataProvider: componentsTreeDataProvider }); const workflowsTreeDataProvider = new WorkflowsTreeDataProvider(context); diff --git a/src/settingsManager.ts b/src/settingsManager.ts new file mode 100644 index 0000000..f532e9c --- /dev/null +++ b/src/settingsManager.ts @@ -0,0 +1,19 @@ +export interface Environment { + +} + +export interface Secret { + key: string, + value?: string +} + +export interface Variable { + key: string, + value?: string +} + +export class SettingsManager { + environments: Environment[] = []; + secrets: Secret[] = []; + variables: Variable[] = []; +} \ No newline at end of file diff --git a/src/views/components/component.ts b/src/views/components/component.ts index 93dc199..433feab 100644 --- a/src/views/components/component.ts +++ b/src/views/components/component.ts @@ -1,5 +1,5 @@ import { ThemeIcon, TreeItem, TreeItemCollapsibleState, Uri } from "vscode"; -import { CliStatus, Component, ExtensionStatus } from "../../componentManager"; +import { CliStatus, Component, ExtensionStatus } from "../../componentsManager"; import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem"; export default class ComponentTreeItem extends TreeItem implements GithubLocalActionsTreeItem { diff --git a/src/views/components/componentsTreeDataProvider.ts b/src/views/components/componentsTreeDataProvider.ts index fac77e4..1f84946 100644 --- a/src/views/components/componentsTreeDataProvider.ts +++ b/src/views/components/componentsTreeDataProvider.ts @@ -1,5 +1,5 @@ import { CancellationToken, commands, env, EventEmitter, ExtensionContext, extensions, TreeDataProvider, TreeItem, Uri } from "vscode"; -import { ComponentManager } from "../../componentManager"; +import { act } from "../../extension"; import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem"; import ComponentTreeItem from "./component"; @@ -43,7 +43,7 @@ export default class ComponentsTreeDataProvider implements TreeDataProvider new ComponentTreeItem(component)); } } diff --git a/src/views/decorationProvider.ts b/src/views/decorationProvider.ts index b5900d7..9e4181c 100644 --- a/src/views/decorationProvider.ts +++ b/src/views/decorationProvider.ts @@ -1,5 +1,5 @@ import { CancellationToken, Event, FileDecoration, FileDecorationProvider, ProviderResult, ThemeColor, Uri } from "vscode"; -import { CliStatus, ExtensionStatus } from "../componentManager"; +import { CliStatus, ExtensionStatus } from "../componentsManager"; import ComponentTreeItem from "./components/component"; import WorkflowTreeItem from "./workflows/workflow"; diff --git a/src/views/workflows/workflow.ts b/src/views/workflows/workflow.ts index 6c18879..4753b1c 100644 --- a/src/views/workflows/workflow.ts +++ b/src/views/workflows/workflow.ts @@ -1,5 +1,5 @@ import { ThemeIcon, TreeItem, TreeItemCollapsibleState, Uri } from "vscode"; -import { Workflow } from "../../workflowManager"; +import { Workflow } from "../../workflowsManager"; import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem"; export default class WorkflowTreeItem extends TreeItem implements GithubLocalActionsTreeItem { diff --git a/src/views/workflows/workflowsTreeDataProvider.ts b/src/views/workflows/workflowsTreeDataProvider.ts index 32a04b1..8634493 100644 --- a/src/views/workflows/workflowsTreeDataProvider.ts +++ b/src/views/workflows/workflowsTreeDataProvider.ts @@ -1,6 +1,6 @@ import { CancellationToken, commands, EventEmitter, ExtensionContext, TreeDataProvider, TreeItem, window, workspace } from "vscode"; -import { Act, EventTrigger } from "../../act"; -import { WorkflowManager } from "../../workflowManager"; +import { EventTrigger } from "../../act"; +import { act } from "../../extension"; import { GithubLocalActionsTreeItem } from "../githubLocalActionsTreeItem"; import WorkflowTreeItem from "./workflow"; @@ -12,7 +12,7 @@ export default class WorkflowsTreeDataProvider implements TreeDataProvider { - await Act.runAllWorkflows(); + await act.runAllWorkflows(); }), commands.registerCommand('githubLocalActions.runEvent', async () => { const event = await window.showQuickPick(Object.values(EventTrigger), { @@ -21,7 +21,7 @@ export default class WorkflowsTreeDataProvider implements TreeDataProvider { @@ -32,7 +32,7 @@ export default class WorkflowsTreeDataProvider implements TreeDataProvider { - await Act.runWorkflow(workflowTreeItem.workflow); + await act.runWorkflow(workflowTreeItem.workflow); }) ); } @@ -57,7 +57,7 @@ export default class WorkflowsTreeDataProvider implements TreeDataProvider new WorkflowTreeItem(workflow)); } } diff --git a/src/workflowManager.ts b/src/workflowsManager.ts similarity index 95% rename from src/workflowManager.ts rename to src/workflowsManager.ts index 173d985..ed27503 100644 --- a/src/workflowManager.ts +++ b/src/workflowsManager.ts @@ -41,14 +41,14 @@ export enum StepStatus { Cancelled = 'cancelled' } -export class WorkflowManager { +export class WorkflowsManager { private workflowLogs: WorkflowLog[] = []; constructor() { } - static async getWorkflows(): Promise { + async getWorkflows(): Promise { const workflows: Workflow[] = []; const workspaceFolders = workspace.workspaceFolders;