From 67dd1971f7c5495a042cc5ea8b5cb8df69b81257 Mon Sep 17 00:00:00 2001 From: Cedric van Putten Date: Thu, 7 Feb 2019 22:59:15 +0100 Subject: [PATCH 1/3] test(ensure): add failing subject-slash scenario for sentence-case --- @commitlint/ensure/src/case.test.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/@commitlint/ensure/src/case.test.js b/@commitlint/ensure/src/case.test.js index b3e1cb04a2..63d5ba7a8a 100644 --- a/@commitlint/ensure/src/case.test.js +++ b/@commitlint/ensure/src/case.test.js @@ -324,3 +324,7 @@ test('true for numeric on sentencecase', t => { test('true for numeric on lowercase', t => { t.true(ensure('1.0.0', 'lowercase')); }); + +test(`true for subject-slash on sentence-case`, t => { + t.true(ensure('chore: Update @angular/core', 'sentence-case')); +}); From 18e241ce5933f6e79c2b047b4ffc244681c73803 Mon Sep 17 00:00:00 2001 From: Cedric van Putten Date: Sat, 9 Feb 2019 14:08:20 +0100 Subject: [PATCH 2/3] refactor(ensure): remove special slash delimiter code --- @commitlint/ensure/src/case.js | 8 +------- @commitlint/ensure/src/case.test.js | 9 --------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/@commitlint/ensure/src/case.js b/@commitlint/ensure/src/case.js index 6de9e889b2..fdb51e83b4 100644 --- a/@commitlint/ensure/src/case.js +++ b/@commitlint/ensure/src/case.js @@ -9,13 +9,7 @@ function ensureCase(raw = '', target = 'lowercase') { .replace(/`.*?`|".*?"|'.*?'/g, '') .trim(); - const delimiters = /(\/|\\)/g; - const transformed = input - .split(delimiters) - .map(segment => - delimiters.test(segment) ? segment : toCase(segment, target) - ) - .join(''); + const transformed = toCase(input, target); if (transformed === '' || transformed.match(/^\d/)) { return true; diff --git a/@commitlint/ensure/src/case.test.js b/@commitlint/ensure/src/case.test.js index 63d5ba7a8a..f04fccc0d1 100644 --- a/@commitlint/ensure/src/case.test.js +++ b/@commitlint/ensure/src/case.test.js @@ -110,11 +110,6 @@ test('true for * on pascal-case', t => { t.is(actual, true); }); -test('true for Modules/Graph on pascal-case', t => { - const actual = ensure('Modules/Graph', 'pascal-case'); - t.is(actual, true); -}); - test('true for * on start-case', t => { const actual = ensure('*', 'start-case'); t.is(actual, true); @@ -324,7 +319,3 @@ test('true for numeric on sentencecase', t => { test('true for numeric on lowercase', t => { t.true(ensure('1.0.0', 'lowercase')); }); - -test(`true for subject-slash on sentence-case`, t => { - t.true(ensure('chore: Update @angular/core', 'sentence-case')); -}); From cd711b1d4b5ac357b7f9152c6058b265a33197b4 Mon Sep 17 00:00:00 2001 From: Cedric van Putten Date: Sat, 9 Feb 2019 14:08:57 +0100 Subject: [PATCH 3/3] feat(rules): add special scope segments to scope case rule --- @commitlint/rules/src/scope-case.js | 10 +++++++++- @commitlint/rules/src/scope-case.test.js | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/@commitlint/rules/src/scope-case.js b/@commitlint/rules/src/scope-case.js index a7fa546474..b74e9a66d2 100644 --- a/@commitlint/rules/src/scope-case.js +++ b/@commitlint/rules/src/scope-case.js @@ -20,8 +20,16 @@ export default (parsed, when, value) => { return check; }); + // Scopes may contain slash-delimiters to separate them and mark them as individual segments. + // This means that each of these segments should be tested separately with `ensure`. + const delimiters = /(\/|\\)/g; + const scopeSegments = scope.split(delimiters); + const result = checks.some(check => { - const r = ensure.case(scope, check.case); + const r = scopeSegments.every( + segment => delimiters.test(segment) || ensure.case(segment, check.case) + ); + return negated(check.when) ? !r : r; }); diff --git a/@commitlint/rules/src/scope-case.test.js b/@commitlint/rules/src/scope-case.test.js index 8499357c57..e75b9310eb 100644 --- a/@commitlint/rules/src/scope-case.test.js +++ b/@commitlint/rules/src/scope-case.test.js @@ -308,3 +308,17 @@ test('with uppercase scope should fail for "never [uppercase, lowercase]"', asyn const expected = false; t.is(actual, expected); }); + +test('with slash in scope should succeed for "always pascal-case"', async t => { + const commit = await parse('feat(Modules/Graph): add Pie Chart'); + const [actual] = scopeCase(commit, 'always', 'pascal-case'); + const expected = true; + t.is(actual, expected); +}); + +test('with slash in subject should succeed for "always sentence case"', async t => { + const commit = await parse('chore: Update @angular/core'); + const [actual] = scopeCase(commit, 'always', 'sentencecase'); + const expected = true; + t.is(actual, expected); +});