Merge pull request #343 from actions/improve-string-split

Improve string split to handle whitespace
This commit is contained in:
David Hadka 2020-06-02 17:41:04 -05:00 committed by GitHub
commit ff937cc950
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 95 additions and 27 deletions

View file

@ -2,9 +2,16 @@ import * as core from "@actions/core";
import { Events, Outputs, RefKey, State } from "../src/constants"; import { Events, Outputs, RefKey, State } from "../src/constants";
import * as actionUtils from "../src/utils/actionUtils"; import * as actionUtils from "../src/utils/actionUtils";
import * as testUtils from "../src/utils/testUtils";
jest.mock("@actions/core"); jest.mock("@actions/core");
beforeAll(() => {
jest.spyOn(core, "getInput").mockImplementation((name, options) => {
return jest.requireActual("@actions/core").getInput(name, options);
});
});
afterEach(() => { afterEach(() => {
delete process.env[Events.Key]; delete process.env[Events.Key];
delete process.env[RefKey]; delete process.env[RefKey];
@ -157,3 +164,33 @@ test("isValidEvent returns true for event that has a ref", () => {
expect(isValidEvent).toBe(true); expect(isValidEvent).toBe(true);
}); });
test("getInputAsArray returns empty array if not required and missing", () => {
expect(actionUtils.getInputAsArray("foo")).toEqual([]);
});
test("getInputAsArray throws error if required and missing", () => {
expect(() =>
actionUtils.getInputAsArray("foo", { required: true })
).toThrowError();
});
test("getInputAsArray handles single line correctly", () => {
testUtils.setInput("foo", "bar");
expect(actionUtils.getInputAsArray("foo")).toEqual(["bar"]);
});
test("getInputAsArray handles multiple lines correctly", () => {
testUtils.setInput("foo", "bar\nbaz");
expect(actionUtils.getInputAsArray("foo")).toEqual(["bar", "baz"]);
});
test("getInputAsArray handles different new lines correctly", () => {
testUtils.setInput("foo", "bar\r\nbaz");
expect(actionUtils.getInputAsArray("foo")).toEqual(["bar", "baz"]);
});
test("getInputAsArray handles empty lines correctly", () => {
testUtils.setInput("foo", "\n\nbar\n\nbaz\n\n");
expect(actionUtils.getInputAsArray("foo")).toEqual(["bar", "baz"]);
});

View file

@ -20,6 +20,13 @@ beforeAll(() => {
const actualUtils = jest.requireActual("../src/utils/actionUtils"); const actualUtils = jest.requireActual("../src/utils/actionUtils");
return actualUtils.isValidEvent(); return actualUtils.isValidEvent();
}); });
jest.spyOn(actionUtils, "getInputAsArray").mockImplementation(
(name, options) => {
const actualUtils = jest.requireActual("../src/utils/actionUtils");
return actualUtils.getInputAsArray(name, options);
}
);
}); });
beforeEach(() => { beforeEach(() => {

View file

@ -19,6 +19,14 @@ beforeAll(() => {
return jest.requireActual("../src/utils/actionUtils").getCacheState(); return jest.requireActual("../src/utils/actionUtils").getCacheState();
}); });
jest.spyOn(actionUtils, "getInputAsArray").mockImplementation(
(name, options) => {
return jest
.requireActual("../src/utils/actionUtils")
.getInputAsArray(name, options);
}
);
jest.spyOn(actionUtils, "isExactKeyMatch").mockImplementation( jest.spyOn(actionUtils, "isExactKeyMatch").mockImplementation(
(key, cacheResult) => { (key, cacheResult) => {
return jest return jest

22
dist/restore/index.js vendored
View file

@ -5306,7 +5306,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
return result; return result;
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.isValidEvent = exports.logWarning = exports.getCacheState = exports.setOutputAndState = exports.setCacheHitOutput = exports.setCacheState = exports.isExactKeyMatch = void 0; exports.getInputAsArray = exports.isValidEvent = exports.logWarning = exports.getCacheState = exports.setOutputAndState = exports.setCacheHitOutput = exports.setCacheState = exports.isExactKeyMatch = void 0;
const core = __importStar(__webpack_require__(470)); const core = __importStar(__webpack_require__(470));
const constants_1 = __webpack_require__(694); const constants_1 = __webpack_require__(694);
function isExactKeyMatch(key, cacheKey) { function isExactKeyMatch(key, cacheKey) {
@ -5350,6 +5350,14 @@ function isValidEvent() {
return constants_1.RefKey in process.env && Boolean(process.env[constants_1.RefKey]); return constants_1.RefKey in process.env && Boolean(process.env[constants_1.RefKey]);
} }
exports.isValidEvent = isValidEvent; exports.isValidEvent = isValidEvent;
function getInputAsArray(name, options) {
return core
.getInput(name, options)
.split("\n")
.map(s => s.trim())
.filter(x => x !== "");
}
exports.getInputAsArray = getInputAsArray;
/***/ }), /***/ }),
@ -6835,14 +6843,10 @@ function run() {
} }
const primaryKey = core.getInput(constants_1.Inputs.Key, { required: true }); const primaryKey = core.getInput(constants_1.Inputs.Key, { required: true });
core.saveState(constants_1.State.CachePrimaryKey, primaryKey); core.saveState(constants_1.State.CachePrimaryKey, primaryKey);
const restoreKeys = core const restoreKeys = utils.getInputAsArray(constants_1.Inputs.RestoreKeys);
.getInput(constants_1.Inputs.RestoreKeys) const cachePaths = utils.getInputAsArray(constants_1.Inputs.Path, {
.split("\n") required: true
.filter(x => x !== ""); });
const cachePaths = core
.getInput(constants_1.Inputs.Path, { required: true })
.split("\n")
.filter(x => x !== "");
try { try {
const cacheKey = yield cache.restoreCache(cachePaths, primaryKey, restoreKeys); const cacheKey = yield cache.restoreCache(cachePaths, primaryKey, restoreKeys);
if (!cacheKey) { if (!cacheKey) {

17
dist/save/index.js vendored
View file

@ -5306,7 +5306,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
return result; return result;
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.isValidEvent = exports.logWarning = exports.getCacheState = exports.setOutputAndState = exports.setCacheHitOutput = exports.setCacheState = exports.isExactKeyMatch = void 0; exports.getInputAsArray = exports.isValidEvent = exports.logWarning = exports.getCacheState = exports.setOutputAndState = exports.setCacheHitOutput = exports.setCacheState = exports.isExactKeyMatch = void 0;
const core = __importStar(__webpack_require__(470)); const core = __importStar(__webpack_require__(470));
const constants_1 = __webpack_require__(694); const constants_1 = __webpack_require__(694);
function isExactKeyMatch(key, cacheKey) { function isExactKeyMatch(key, cacheKey) {
@ -5350,6 +5350,14 @@ function isValidEvent() {
return constants_1.RefKey in process.env && Boolean(process.env[constants_1.RefKey]); return constants_1.RefKey in process.env && Boolean(process.env[constants_1.RefKey]);
} }
exports.isValidEvent = isValidEvent; exports.isValidEvent = isValidEvent;
function getInputAsArray(name, options) {
return core
.getInput(name, options)
.split("\n")
.map(s => s.trim())
.filter(x => x !== "");
}
exports.getInputAsArray = getInputAsArray;
/***/ }), /***/ }),
@ -6600,10 +6608,9 @@ function run() {
core.info(`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`); core.info(`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`);
return; return;
} }
const cachePaths = core const cachePaths = utils.getInputAsArray(constants_1.Inputs.Path, {
.getInput(constants_1.Inputs.Path, { required: true }) required: true
.split("\n") });
.filter(x => x !== "");
try { try {
yield cache.saveCache(cachePaths, primaryKey); yield cache.saveCache(cachePaths, primaryKey);
} }

View file

@ -19,15 +19,10 @@ async function run(): Promise<void> {
const primaryKey = core.getInput(Inputs.Key, { required: true }); const primaryKey = core.getInput(Inputs.Key, { required: true });
core.saveState(State.CachePrimaryKey, primaryKey); core.saveState(State.CachePrimaryKey, primaryKey);
const restoreKeys = core const restoreKeys = utils.getInputAsArray(Inputs.RestoreKeys);
.getInput(Inputs.RestoreKeys) const cachePaths = utils.getInputAsArray(Inputs.Path, {
.split("\n") required: true
.filter(x => x !== ""); });
const cachePaths = core
.getInput(Inputs.Path, { required: true })
.split("\n")
.filter(x => x !== "");
try { try {
const cacheKey = await cache.restoreCache( const cacheKey = await cache.restoreCache(

View file

@ -31,10 +31,9 @@ async function run(): Promise<void> {
return; return;
} }
const cachePaths = core const cachePaths = utils.getInputAsArray(Inputs.Path, {
.getInput(Inputs.Path, { required: true }) required: true
.split("\n") });
.filter(x => x !== "");
try { try {
await cache.saveCache(cachePaths, primaryKey); await cache.saveCache(cachePaths, primaryKey);

View file

@ -45,3 +45,14 @@ export function logWarning(message: string): void {
export function isValidEvent(): boolean { export function isValidEvent(): boolean {
return RefKey in process.env && Boolean(process.env[RefKey]); return RefKey in process.env && Boolean(process.env[RefKey]);
} }
export function getInputAsArray(
name: string,
options?: core.InputOptions
): string[] {
return core
.getInput(name, options)
.split("\n")
.map(s => s.trim())
.filter(x => x !== "");
}