Skip to content

Commit

Permalink
Merge pull request #732 from OpenFn/add-snapshots-option-cli-pull
Browse files Browse the repository at this point in the history
Add snapshots option to cli pull command
  • Loading branch information
josephjclark authored Jul 17, 2024
2 parents 8c06ddc + 9be9e11 commit 9928992
Show file tree
Hide file tree
Showing 9 changed files with 93 additions and 8 deletions.
11 changes: 11 additions & 0 deletions packages/cli/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
# @openfn/cli

## 1.6.0

### Minor Changes

- 960f293: Add snapshots option to cli pull command

### Patch Changes

- Updated dependencies [960f293]
- @openfn/deploy@0.5.0

## 1.5.0

### Minor Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@openfn/cli",
"version": "1.5.0",
"version": "1.6.0",
"description": "CLI devtools for the openfn toolchain.",
"engines": {
"node": ">=18",
Expand Down
9 changes: 9 additions & 0 deletions packages/cli/src/options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ export type Opts = {
repoDir?: string;
sanitize: 'none' | 'remove' | 'summarize' | 'obfuscate';
skipAdaptorValidation?: boolean;
snapshots?: string[];
specifier?: string; // docgen
start?: string; // workflow start step
statePath?: string;
Expand Down Expand Up @@ -402,6 +403,14 @@ export const skipAdaptorValidation: CLIOption = {
},
};

export const snapshots: CLIOption = {
name: 'snapshots',
yargs: {
description: 'List of snapshot ids to pull',
array: true,
},
};

export const statePath: CLIOption = {
name: 'state-path',
yargs: {
Expand Down
10 changes: 9 additions & 1 deletion packages/cli/src/pull/command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,18 @@ export type PullOptions = Required<
| 'configPath'
| 'projectId'
| 'confirm'
| 'snapshots'
>
>;

const options = [o.statePath, o.projectPath, o.configPath, o.log, o.logJson];
const options = [
o.statePath,
o.projectPath,
o.configPath,
o.log,
o.logJson,
o.snapshots,
];

const pullCommand: yargs.CommandModule<PullOptions> = {
command: 'pull [projectId]',
Expand Down
6 changes: 5 additions & 1 deletion packages/cli/src/pull/handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,11 @@ async function pullHandler(options: PullOptions, logger: Logger) {
);

// Get the project.json from Lightning
const { data: project } = await getProject(config, options.projectId);
const { data: project } = await getProject(
config,
options.projectId,
options.snapshots
);

if (!project) {
logger.error('ERROR: Project not found.');
Expand Down
6 changes: 6 additions & 0 deletions packages/deploy/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# @openfn/deploy

## 0.5.0

### Minor Changes

- 960f293: Add snapshots option to cli pull command

## 0.4.7

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/deploy/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@openfn/deploy",
"version": "0.4.7",
"version": "0.5.0",
"description": "Deploy projects to Lightning instances",
"type": "module",
"exports": {
Expand Down
19 changes: 15 additions & 4 deletions packages/deploy/src/client.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,25 @@
import { DeployConfig, ProjectPayload } from './types';
import { DeployError } from './deployError';

const getLightningUrl = (config: DeployConfig, path: string = '') =>
new URL(`/api/provision/${path}`, config.endpoint);
export const getLightningUrl = (
config: DeployConfig,
path: string = '',
snapshots?: string[]
) => {
const params = new URLSearchParams();
snapshots?.forEach((snapshot) => params.append('snapshots[]', snapshot));
return new URL(
`/api/provision/${path}?${params.toString()}`,
config.endpoint
);
};

export async function getProject(
config: DeployConfig,
projectId: string
projectId: string,
snapshots?: string[]
): Promise<{ data: ProjectPayload | null }> {
const url = getLightningUrl(config, projectId);
const url = getLightningUrl(config, projectId, snapshots);
console.log(`Checking ${url} for existing project.`);

try {
Expand Down
36 changes: 36 additions & 0 deletions packages/deploy/test/index.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { render } from '@inquirer/testing';
import { input } from '@inquirer/prompts';
import test from 'ava';
import { DeployConfig } from '../src/types';
import { getLightningUrl } from '../src/client';

test('renders a confirmation', async (t) => {
const { answer, events, getScreen } = await render(input, {
Expand All @@ -14,3 +16,37 @@ test('renders a confirmation', async (t) => {

t.is(await answer, 'John');
});

test('getLightningUrl adds snapshots correctly to the URL', async (t) => {
const config: DeployConfig = {
endpoint: 'http://localhost',
apiKey: 'test-api-key',
specPath: './project.yaml',
statePath: './state.json',
requireConfirmation: false,
dryRun: false,
};

const projectId = 'test-project';
const snapshots = ['snapshot1', 'snapshot2'];

const expectedUrl =
'http://localhost/api/provision/test-project?snapshots%5B%5D=snapshot1&snapshots%5B%5D=snapshot2';
t.is(getLightningUrl(config, projectId, snapshots).toString(), expectedUrl);
});

test('getLightningUrl returns the correct URL when no snapshot is provided', async (t) => {
const config: DeployConfig = {
endpoint: 'http://localhost',
apiKey: 'test-api-key',
specPath: './project.yaml',
statePath: './state.json',
requireConfirmation: false,
dryRun: false,
};

const projectId = 'test-project';

const expectedUrl = 'http://localhost/api/provision/test-project?';
t.is(getLightningUrl(config, projectId).toString(), expectedUrl);
});

0 comments on commit 9928992

Please sign in to comment.