Skip to content

Commit

Permalink
feat: add excludeLabels option (#8)
Browse files Browse the repository at this point in the history
  • Loading branch information
ookami-kb authored Dec 21, 2022
1 parent fe82d77 commit 5ec20fd
Show file tree
Hide file tree
Showing 7 changed files with 12,414 additions and 36 deletions.
13 changes: 12 additions & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
name: "build-test"
on: [pull_request]
on:
pull_request:
types:
- opened
- reopened
- edited
- synchronize
- labeled
- unlabeled

jobs:
test:
Expand All @@ -12,3 +20,6 @@ jobs:
excludePaths: |
dist/**
README.md
package-lock.json
excludeLabels: |
skip-size-check
91 changes: 74 additions & 17 deletions __tests__/main.test.ts
Original file line number Diff line number Diff line change
@@ -1,57 +1,113 @@
import {Checker, Result} from "../src/checker";
import {Checker, Result} from '../src/checker'

test('skips validation if excludeTitle matches', () => {
const excludeTitle = new RegExp('Skip')
const checker = new Checker({errorSize: 20, warningSize: 10, excludeTitle})
const result = checker.check({title: 'Skip PR size check', files: [{additions: 100, filename: '1.txt'}]})
const result = checker.check({
title: 'Skip PR size check',
files: [{additions: 100, filename: '1.txt'}],
labels: []
})
expect(result).toBe(Result.ok)
});
})

test('does validation if excludeTitle not matches', () => {
const excludeTitle = new RegExp('NO_VALIDATION')
const checker = new Checker({errorSize: 20, warningSize: 10, excludeTitle})
const result = checker.check({title: 'Skip PR size check', files: [{additions: 100, filename: '1.txt'}]})
const result = checker.check({
title: 'Skip PR size check',
files: [{additions: 100, filename: '1.txt'}],
labels: []
})
expect(result).toBe(Result.error)
})

test('does validation if excludeLabels not matches', () => {
const excludeTitle = new RegExp('NO_VALIDATION')
const excludeLabels = ['skip']
const checker = new Checker({errorSize: 20, warningSize: 10, excludeTitle, excludeLabels})
const result = checker.check({
title: 'Skip PR size check',
files: [{additions: 100, filename: '1.txt'}],
labels: ['no-skip']
})
expect(result).toBe(Result.error)
});
})

test('does validation if excludeTitle is undefined', () => {
const checker = new Checker({errorSize: 20, warningSize: 10})
const result = checker.check({title: 'Skip PR size check', files: [{additions: 100, filename: '1.txt'}]})
const result = checker.check({
title: 'Skip PR size check',
files: [{additions: 100, filename: '1.txt'}],
labels: []
})
expect(result).toBe(Result.error)
});
})

test('returns warning', () => {
const checker = new Checker({errorSize: 20, warningSize: 10})
const result = checker.check({
title: 'PR',
files: [{additions: 10, filename: '1.txt'}, {additions: 5, filename: '2.txt'}]
files: [
{additions: 10, filename: '1.txt'},
{additions: 5, filename: '2.txt'}
],
labels: []
})
expect(result).toBe(Result.warning)
});
})

test('returns errors', () => {
const checker = new Checker({errorSize: 20, warningSize: 10})
const result = checker.check({
title: 'PR',
files: [{additions: 10, filename: '1.txt'}, {additions: 15, filename: '2.txt'}]
files: [
{additions: 10, filename: '1.txt'},
{additions: 15, filename: '2.txt'}
],
labels: []
})
expect(result).toBe(Result.error)
});
})

test('returns OK', () => {
const checker = new Checker({errorSize: 100, warningSize: 50})
const result = checker.check({
title: 'PR',
files: [{additions: 10, filename: '1.txt'}, {additions: 15, filename: '2.txt'}]
files: [
{additions: 10, filename: '1.txt'},
{additions: 15, filename: '2.txt'}
],
labels: []
})
expect(result).toBe(Result.ok)
});
})

test('skips files matching excludePath', () => {
const checker = new Checker({
errorSize: 40,
warningSize: 30,
excludePaths: ['**/test/**', 'README.md', '**/resources/**/*.json'],
excludePaths: ['**/test/**', 'README.md', '**/resources/**/*.json']
})
const result = checker.check({
title: 'PR',
files: [
{additions: 10, filename: '1.txt'},
{additions: 15, filename: '2.txt'},
{additions: 100, filename: 'some/test/file.txt'},
{additions: 100, filename: 'README.md'},
{additions: 100, filename: 'resources/1.json'}
],
labels: []
})
expect(result).toBe(Result.ok)
})

test('skips files matching excludeLabels', () => {
const checker = new Checker({
errorSize: 40,
warningSize: 30,
excludeLabels: ['skip']
})
const result = checker.check({
title: 'PR',
Expand All @@ -60,8 +116,9 @@ test('skips files matching excludePath', () => {
{additions: 15, filename: '2.txt'},
{additions: 100, filename: 'some/test/file.txt'},
{additions: 100, filename: 'README.md'},
{additions: 100, filename: 'resources/1.json'},
]
{additions: 100, filename: 'resources/1.json'}
],
labels: ['skip']
})
expect(result).toBe(Result.ok)
});
})
5 changes: 5 additions & 0 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ inputs:
File paths that should be excluded from size calculation.
default: ""
required: false
excludeLabels:
description: >
Labels that should be excluded from size calculation.
default: ""
required: false
runs:
using: "node16"
main: "dist/index.js"
22 changes: 15 additions & 7 deletions dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4466,16 +4466,22 @@ function run() {
const warningMessage = core.getInput('warningMessage');
const excludeTitle = core.getInput('excludeTitle');
const excludePaths = utils_1.getInputAsArray('excludePaths');
const excludeLabels = utils_1.getInputAsArray('excludeLabels');
const checker = new checker_1.Checker({
errorSize,
warningSize,
excludeTitle: excludeTitle.length === 0 ? undefined : new RegExp(excludeTitle),
excludePaths
excludePaths,
excludeLabels
});
const prParams = Object.assign(Object.assign({}, github_1.context.repo), { pull_number: pr.number });
const response = yield gitHub.pulls.listFiles(prParams);
const pullRequest = yield gitHub.pulls.get(prParams);
const result = checker.check({ title: pullRequest.data.title, files: response.data });
const result = checker.check({
title: pullRequest.data.title,
files: response.data,
labels: pullRequest.data.labels.map(it => it.name)
});
switch (result) {
case checker_1.Result.ok:
break;
Expand Down Expand Up @@ -4534,7 +4540,7 @@ exports.getUserAgent = getUserAgent;
/***/ 215:
/***/ (function(module) {

module.exports = {"_from":"@octokit/rest@^16.43.1","_id":"@octokit/[email protected]","_inBundle":false,"_integrity":"sha512-gfFKwRT/wFxq5qlNjnW2dh+qh74XgTQ2B179UX5K1HYCluioWj8Ndbgqw2PVqa1NnVJkGHp2ovMpVn/DImlmkw==","_location":"/@octokit/rest","_phantomChildren":{"@octokit/types":"2.12.1","deprecation":"2.3.1","once":"1.4.0"},"_requested":{"type":"range","registry":true,"raw":"@octokit/rest@^16.43.1","name":"@octokit/rest","escapedName":"@octokit%2frest","scope":"@octokit","rawSpec":"^16.43.1","saveSpec":null,"fetchSpec":"^16.43.1"},"_requiredBy":["/@actions/github"],"_resolved":"https://registry.npmjs.org/@octokit/rest/-/rest-16.43.1.tgz","_shasum":"3b11e7d1b1ac2bbeeb23b08a17df0b20947eda6b","_spec":"@octokit/rest@^16.43.1","_where":"/Users/ookami/projects/devops/gh-pr-size-watcher/node_modules/@actions/github","author":{"name":"Gregor Martynus","url":"https://github.com/gr2m"},"bugs":{"url":"https://github.com/octokit/rest.js/issues"},"bundleDependencies":false,"bundlesize":[{"path":"./dist/octokit-rest.min.js.gz","maxSize":"33 kB"}],"contributors":[{"name":"Mike de Boer","email":"[email protected]"},{"name":"Fabian Jakobs","email":"[email protected]"},{"name":"Joe Gallo","email":"[email protected]"},{"name":"Gregor Martynus","url":"https://github.com/gr2m"}],"dependencies":{"@octokit/auth-token":"^2.4.0","@octokit/plugin-paginate-rest":"^1.1.1","@octokit/plugin-request-log":"^1.0.0","@octokit/plugin-rest-endpoint-methods":"2.4.0","@octokit/request":"^5.2.0","@octokit/request-error":"^1.0.2","atob-lite":"^2.0.0","before-after-hook":"^2.0.0","btoa-lite":"^1.0.0","deprecation":"^2.0.0","lodash.get":"^4.4.2","lodash.set":"^4.3.2","lodash.uniq":"^4.5.0","octokit-pagination-methods":"^1.1.0","once":"^1.4.0","universal-user-agent":"^4.0.0"},"deprecated":false,"description":"GitHub REST API client for Node.js","devDependencies":{"@gimenete/type-writer":"^0.1.3","@octokit/auth":"^1.1.1","@octokit/fixtures-server":"^5.0.6","@octokit/graphql":"^4.2.0","@types/node":"^13.1.0","bundlesize":"^0.18.0","chai":"^4.1.2","compression-webpack-plugin":"^3.1.0","cypress":"^3.0.0","glob":"^7.1.2","http-proxy-agent":"^4.0.0","lodash.camelcase":"^4.3.0","lodash.merge":"^4.6.1","lodash.upperfirst":"^4.3.1","lolex":"^5.1.2","mkdirp":"^1.0.0","mocha":"^7.0.1","mustache":"^4.0.0","nock":"^11.3.3","npm-run-all":"^4.1.2","nyc":"^15.0.0","prettier":"^1.14.2","proxy":"^1.0.0","semantic-release":"^17.0.0","sinon":"^8.0.0","sinon-chai":"^3.0.0","sort-keys":"^4.0.0","string-to-arraybuffer":"^1.0.0","string-to-jsdoc-comment":"^1.0.0","typescript":"^3.3.1","webpack":"^4.0.0","webpack-bundle-analyzer":"^3.0.0","webpack-cli":"^3.0.0"},"files":["index.js","index.d.ts","lib","plugins"],"homepage":"https://github.com/octokit/rest.js#readme","keywords":["octokit","github","rest","api-client"],"license":"MIT","name":"@octokit/rest","nyc":{"ignore":["test"]},"publishConfig":{"access":"public"},"release":{"publish":["@semantic-release/npm",{"path":"@semantic-release/github","assets":["dist/*","!dist/*.map.gz"]}]},"repository":{"type":"git","url":"git+https://github.com/octokit/rest.js.git"},"scripts":{"build":"npm-run-all build:*","build:browser":"npm-run-all build:browser:*","build:browser:development":"webpack --mode development --entry . --output-library=Octokit --output=./dist/octokit-rest.js --profile --json > dist/bundle-stats.json","build:browser:production":"webpack --mode production --entry . --plugin=compression-webpack-plugin --output-library=Octokit --output-path=./dist --output-filename=octokit-rest.min.js --devtool source-map","build:ts":"npm run -s update-endpoints:typescript","coverage":"nyc report --reporter=html && open coverage/index.html","generate-bundle-report":"webpack-bundle-analyzer dist/bundle-stats.json --mode=static --no-open --report dist/bundle-report.html","lint":"prettier --check '{lib,plugins,scripts,test}/**/*.{js,json,ts}' 'docs/*.{js,json}' 'docs/src/**/*' index.js README.md package.json","lint:fix":"prettier --write '{lib,plugins,scripts,test}/**/*.{js,json,ts}' 'docs/*.{js,json}' 'docs/src/**/*' index.js README.md package.json","postvalidate:ts":"tsc --noEmit --target es6 test/typescript-validate.ts","prebuild:browser":"mkdirp dist/","pretest":"npm run -s lint","prevalidate:ts":"npm run -s build:ts","start-fixtures-server":"octokit-fixtures-server","test":"nyc mocha test/mocha-node-setup.js \"test/*/**/*-test.js\"","test:browser":"cypress run --browser chrome","update-endpoints":"npm-run-all update-endpoints:*","update-endpoints:fetch-json":"node scripts/update-endpoints/fetch-json","update-endpoints:typescript":"node scripts/update-endpoints/typescript","validate:ts":"tsc --target es6 --noImplicitAny index.d.ts"},"types":"index.d.ts","version":"16.43.1"};
module.exports = {"name":"@octokit/rest","version":"16.43.1","publishConfig":{"access":"public"},"description":"GitHub REST API client for Node.js","keywords":["octokit","github","rest","api-client"],"author":"Gregor Martynus (https://github.com/gr2m)","contributors":[{"name":"Mike de Boer","email":"[email protected]"},{"name":"Fabian Jakobs","email":"[email protected]"},{"name":"Joe Gallo","email":"[email protected]"},{"name":"Gregor Martynus","url":"https://github.com/gr2m"}],"repository":"https://github.com/octokit/rest.js","dependencies":{"@octokit/auth-token":"^2.4.0","@octokit/plugin-paginate-rest":"^1.1.1","@octokit/plugin-request-log":"^1.0.0","@octokit/plugin-rest-endpoint-methods":"2.4.0","@octokit/request":"^5.2.0","@octokit/request-error":"^1.0.2","atob-lite":"^2.0.0","before-after-hook":"^2.0.0","btoa-lite":"^1.0.0","deprecation":"^2.0.0","lodash.get":"^4.4.2","lodash.set":"^4.3.2","lodash.uniq":"^4.5.0","octokit-pagination-methods":"^1.1.0","once":"^1.4.0","universal-user-agent":"^4.0.0"},"devDependencies":{"@gimenete/type-writer":"^0.1.3","@octokit/auth":"^1.1.1","@octokit/fixtures-server":"^5.0.6","@octokit/graphql":"^4.2.0","@types/node":"^13.1.0","bundlesize":"^0.18.0","chai":"^4.1.2","compression-webpack-plugin":"^3.1.0","cypress":"^3.0.0","glob":"^7.1.2","http-proxy-agent":"^4.0.0","lodash.camelcase":"^4.3.0","lodash.merge":"^4.6.1","lodash.upperfirst":"^4.3.1","lolex":"^5.1.2","mkdirp":"^1.0.0","mocha":"^7.0.1","mustache":"^4.0.0","nock":"^11.3.3","npm-run-all":"^4.1.2","nyc":"^15.0.0","prettier":"^1.14.2","proxy":"^1.0.0","semantic-release":"^17.0.0","sinon":"^8.0.0","sinon-chai":"^3.0.0","sort-keys":"^4.0.0","string-to-arraybuffer":"^1.0.0","string-to-jsdoc-comment":"^1.0.0","typescript":"^3.3.1","webpack":"^4.0.0","webpack-bundle-analyzer":"^3.0.0","webpack-cli":"^3.0.0"},"types":"index.d.ts","scripts":{"coverage":"nyc report --reporter=html && open coverage/index.html","lint":"prettier --check '{lib,plugins,scripts,test}/**/*.{js,json,ts}' 'docs/*.{js,json}' 'docs/src/**/*' index.js README.md package.json","lint:fix":"prettier --write '{lib,plugins,scripts,test}/**/*.{js,json,ts}' 'docs/*.{js,json}' 'docs/src/**/*' index.js README.md package.json","pretest":"npm run -s lint","test":"nyc mocha test/mocha-node-setup.js \"test/*/**/*-test.js\"","test:browser":"cypress run --browser chrome","build":"npm-run-all build:*","build:ts":"npm run -s update-endpoints:typescript","prebuild:browser":"mkdirp dist/","build:browser":"npm-run-all build:browser:*","build:browser:development":"webpack --mode development --entry . --output-library=Octokit --output=./dist/octokit-rest.js --profile --json > dist/bundle-stats.json","build:browser:production":"webpack --mode production --entry . --plugin=compression-webpack-plugin --output-library=Octokit --output-path=./dist --output-filename=octokit-rest.min.js --devtool source-map","generate-bundle-report":"webpack-bundle-analyzer dist/bundle-stats.json --mode=static --no-open --report dist/bundle-report.html","update-endpoints":"npm-run-all update-endpoints:*","update-endpoints:fetch-json":"node scripts/update-endpoints/fetch-json","update-endpoints:typescript":"node scripts/update-endpoints/typescript","prevalidate:ts":"npm run -s build:ts","validate:ts":"tsc --target es6 --noImplicitAny index.d.ts","postvalidate:ts":"tsc --noEmit --target es6 test/typescript-validate.ts","start-fixtures-server":"octokit-fixtures-server"},"license":"MIT","files":["index.js","index.d.ts","lib","plugins"],"nyc":{"ignore":["test"]},"release":{"publish":["@semantic-release/npm",{"path":"@semantic-release/github","assets":["dist/*","!dist/*.map.gz"]}]},"bundlesize":[{"path":"./dist/octokit-rest.min.js.gz","maxSize":"33 kB"}]};

/***/ }),

Expand Down Expand Up @@ -10404,15 +10410,17 @@ var Result;
})(Result = exports.Result || (exports.Result = {}));
class Checker {
constructor(params) {
var _a;
var _a, _b;
this.errorSize = params.errorSize;
this.warningSize = params.warningSize;
this.excludeTitle = params.excludeTitle;
this.excludePaths = (_a = params.excludePaths, (_a !== null && _a !== void 0 ? _a : []));
this.excludeLabels = (_b = params.excludeLabels, (_b !== null && _b !== void 0 ? _b : []));
}
check(pr) {
core.debug(`PR title: ${pr.title}`);
if (this.shouldSkip(pr.title))
core.debug(`PR labels: ${pr.labels.join(', ')}`);
if (this.shouldSkip(pr.title, pr.labels))
return Result.ok;
const files = pr.files.filter(f => !this.excludePaths.some(p => minimatch_1.default(f.filename, p)));
if (core.isDebug()) {
Expand All @@ -10426,9 +10434,9 @@ class Checker {
return Result.warning;
return Result.ok;
}
shouldSkip(title) {
shouldSkip(title, labels) {
var _a, _b;
return _b = (_a = this.excludeTitle) === null || _a === void 0 ? void 0 : _a.test(title), (_b !== null && _b !== void 0 ? _b : false);
return (_b = (_a = this.excludeTitle) === null || _a === void 0 ? void 0 : _a.test(title), (_b !== null && _b !== void 0 ? _b : labels.filter(it => this.excludeLabels.includes(it)).length > 0));
}
static getAdditions(data) {
return data.map(v => v.additions).reduce((acc, v) => acc + v, 0);
Expand Down
Loading

0 comments on commit 5ec20fd

Please sign in to comment.