From d3def2f5e3429cfabe0ca78671729d5fe6673ad4 Mon Sep 17 00:00:00 2001 From: Satyam Mattoo <96661612+SatyamMattoo@users.noreply.github.com> Date: Mon, 24 Jun 2024 16:17:22 +0530 Subject: [PATCH] CLI: allow file paths for state workflow.json (#715) * CLI: allow file paths for state and data * removing a typo * adding different tests for state and data; removing explicit types * removing a typo * removed fetching for keys inside the state --- packages/cli/src/util/load-plan.ts | 12 ++++++ packages/cli/test/util/load-plan.test.ts | 47 ++++++++++++++++++++---- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/packages/cli/src/util/load-plan.ts b/packages/cli/src/util/load-plan.ts index 9c41550ed..8ba05dc9d 100644 --- a/packages/cli/src/util/load-plan.ts +++ b/packages/cli/src/util/load-plan.ts @@ -203,6 +203,9 @@ const importExpressions = async ( typeof job.expression === 'string' && job.expression?.trim(); const configurationStr = typeof job.configuration === 'string' && job.configuration?.trim(); + const stateStr = + typeof job.state === 'string' && job.state?.trim(); + if (expressionStr && isPath(expressionStr)) { job.expression = await fetchFile( job.id || `${idx}`, @@ -220,6 +223,15 @@ const importExpressions = async ( ); job.configuration = JSON.parse(configString!); } + if (stateStr && isPath(stateStr)) { + const stateString = await fetchFile( + job.id || `${idx}`, + rootDir, + stateStr, + log + ); + job.state = JSON.parse(stateString!); + } } }; diff --git a/packages/cli/test/util/load-plan.test.ts b/packages/cli/test/util/load-plan.test.ts index caadaad71..e2e296e3c 100644 --- a/packages/cli/test/util/load-plan.test.ts +++ b/packages/cli/test/util/load-plan.test.ts @@ -48,7 +48,7 @@ test.serial('expression: load a plan from an expression.js', async (t) => { plan: {}, }; - const plan = await loadPlan(opts as Opts, logger); + const plan = await loadPlan(opts, logger); t.truthy(plan); t.deepEqual(plan.options, {}); @@ -118,7 +118,7 @@ test.serial('xplan: load a plan from workflow path', async (t) => { plan: {}, }; - const plan = await loadPlan(opts as Opts, logger); + const plan = await loadPlan(opts, logger); t.truthy(plan); t.deepEqual(plan, sampleXPlan); @@ -143,7 +143,7 @@ test.serial('xplan: expand adaptors', async (t) => { 'test/wf.json': JSON.stringify(plan), }); - const result = await loadPlan(opts as Opts, logger); + const result = await loadPlan(opts, logger); t.truthy(result); const step = result.workflow.steps[0] as Job; @@ -169,7 +169,7 @@ test.serial('xplan: do not expand adaptors', async (t) => { 'test/wf.json': JSON.stringify(plan), }); - const result = await loadPlan(opts as Opts, logger); + const result = await loadPlan(opts, logger); t.truthy(result); const step = result.workflow.steps[0] as Job; @@ -197,7 +197,7 @@ test.serial('xplan: set timeout from CLI', async (t) => { 'test/wf.json': JSON.stringify(plan), }); - const { options } = await loadPlan(opts as Opts, logger); + const { options } = await loadPlan(opts, logger); t.is(options.timeout, 666); }); @@ -222,7 +222,7 @@ test.serial('xplan: set start from CLI', async (t) => { 'test/wf.json': JSON.stringify(plan), }); - const { options } = await loadPlan(opts as Opts, logger); + const { options } = await loadPlan(opts, logger); t.is(options.start, 'b'); }); @@ -259,7 +259,7 @@ test.serial('old-workflow: load a plan from workflow path', async (t) => { plan: {}, }; - const plan = await loadPlan(opts as Opts, logger); + const plan = await loadPlan(opts, logger); t.deepEqual(plan.options, { start: 'a', @@ -271,3 +271,36 @@ test.serial('old-workflow: load a plan from workflow path', async (t) => { expression: 'x()', }); }); + +test.serial('step: allow file paths for state', async (t) => { + const opts = { + workflowPath: 'test/wf.json', + plan: {}, + }; + + const plan = createPlan([ + { + id: 'a', + expression: '.', + state: './state.json', + }, + ]); + + mock({ + 'test/state.json': JSON.stringify({ + data: { + x: 1 + } + }), + 'test/wf.json': JSON.stringify(plan), + }); + const result = await loadPlan(opts, logger); + t.truthy(result); + + const step = result.workflow.steps[0] as Job; + t.deepEqual(step.state, { + data: { + x: 1 + } + }); +});