Skip to content

Commit c646a60

Browse files
authored
fix(rules): respect keyword setting for scope-empty (#11)
* add related regression tests * default to "never" keyword * correctly negate rule result and message for "always" closes #10
1 parent 40583dd commit c646a60

File tree

3 files changed

+80
-5
lines changed

3 files changed

+80
-5
lines changed

package.json

+6-1
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,16 @@
1717
"commitmsg": "node distribution/cli.js --edit",
1818
"changelog": "conventional-changelog --preset angular --infile changelog.md --same-file --output-unreleased",
1919
"push": "git push && git push --tags && hub release create \"v$npm_package_version\" --message=\"v$npm_package_version\n$(conventional-changelog -p angular)\" && npm publish",
20-
"test": "eslint *.js && jsonlint-cli *.json && node distribution/cli.js --from=HEAD~1",
20+
"test": "eslint *.js && jsonlint-cli *.json && node distribution/cli.js --from=HEAD~1 && ava",
2121
"preversion": "npm run build && npm test",
2222
"release": "npm version --no-git-tag-version $(conventional-recommended-bump -p angular)",
2323
"version": "npm run changelog && git add .",
2424
"postversion": "git commit -m \"chore(release): v$npm_package_version\n$(conventional-changelog -p angular)\" && git tag -a v$npm_package_version -m \"$(conventional-changelog -p angular)\""
2525
},
26+
"ava": {
27+
"babel": "inherit",
28+
"require": ["babel-register"]
29+
},
2630
"config": {
2731
"commitizen": {
2832
"path": "cz-conventional-changelog-lint"
@@ -50,6 +54,7 @@
5054
},
5155
"license": "MIT",
5256
"devDependencies": {
57+
"ava": "0.15.2",
5358
"babel": "6.5.1",
5459
"babel-cli": "6.4.0",
5560
"babel-eslint": "5.0.0",

source/rules/scope-empty.js

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import ensureNotEmpty from '../library/ensure-not-empty';
22

3-
export default (parsed, when) => {
4-
const negated = when === 'never';
3+
export default (parsed, when = 'never') => {
4+
const negated = when === 'always';
5+
const result = ensureNotEmpty(parsed.scope);
56
return [
6-
ensureNotEmpty(parsed.scope),
7+
negated ? !result : result,
78
[
89
'scope',
9-
negated ? 'may not' : 'must',
10+
negated ? 'must' : 'may not',
1011
'be empty'
1112
]
1213
.filter(Boolean)

test/rules/scope-empty.js

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import test from 'ava';
2+
import scopeEmpty from '../../source/rules/scope-empty';
3+
import {sync as parse} from 'conventional-commits-parser';
4+
5+
const messages = {
6+
plain: 'foo(bar): baz',
7+
superfluous: 'foo(): baz',
8+
empty: 'foo: baz'
9+
};
10+
11+
const parsed = {
12+
plain: parse(messages.plain),
13+
superfluous: parse(messages.superfluous),
14+
empty: parse(messages.empty)
15+
};
16+
17+
test('scope-empty with plain message', t => {
18+
const [actual] = scopeEmpty(parsed.plain);
19+
const expected = true;
20+
t.deepEqual(actual, expected, 'it should succeed for empty keyword');
21+
});
22+
23+
test('scope-empty with plain message', t => {
24+
const [actual] = scopeEmpty(parsed.plain, 'never');
25+
const expected = true;
26+
t.deepEqual(actual, expected, 'it should succeed for "never"');
27+
});
28+
29+
test('scope-empty with plain message', t => {
30+
const [actual] = scopeEmpty(parsed.plain, 'always');
31+
const expected = false;
32+
t.deepEqual(actual, expected, 'it should fail for "always"');
33+
});
34+
35+
test('scope-empty with superfluous message', t => {
36+
const [actual] = scopeEmpty(parsed.superfluous);
37+
const expected = false;
38+
t.deepEqual(actual, expected, 'it should fail for empty keyword');
39+
});
40+
41+
test('scope-empty with superfluous message', t => {
42+
const [actual] = scopeEmpty(parsed.superfluous, 'never');
43+
const expected = false;
44+
t.deepEqual(actual, expected, 'it should fail for "never"');
45+
});
46+
47+
test('scope-empty with superfluous message', t => {
48+
const [actual] = scopeEmpty(parsed.superfluous, 'always');
49+
const expected = true;
50+
t.deepEqual(actual, expected, 'it should fail for "always"');
51+
});
52+
53+
test('scope-empty with empty message', t => {
54+
const [actual] = scopeEmpty(parsed.empty);
55+
const expected = false;
56+
t.deepEqual(actual, expected, 'it should fail for empty keyword');
57+
});
58+
59+
test('scope-empty with empty message', t => {
60+
const [actual] = scopeEmpty(parsed.empty, 'never');
61+
const expected = false;
62+
t.deepEqual(actual, expected, 'it should fail for "never"');
63+
});
64+
65+
test('scope-empty with empty message', t => {
66+
const [actual] = scopeEmpty(parsed.empty, 'always');
67+
const expected = true;
68+
t.deepEqual(actual, expected, 'it should fail for "always"');
69+
});

0 commit comments

Comments
 (0)