From 784227a0e3456c22108dfb8944a55c835b961bb4 Mon Sep 17 00:00:00 2001 From: Douglas Ludlow Date: Wed, 14 Dec 2016 15:31:18 -0700 Subject: [PATCH 1/3] feat(dateparser): Allow overriding of parsers. --- src/dateparser/dateparser.js | 19 ++++++++++++++++++- src/dateparser/test/dateparser.spec.js | 22 ++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/dateparser/dateparser.js b/src/dateparser/dateparser.js index 51c488b123..d770dff31b 100644 --- a/src/dateparser/dateparser.js +++ b/src/dateparser/dateparser.js @@ -1,6 +1,6 @@ angular.module('ui.bootstrap.dateparser', []) -.service('uibDateParser', ['$log', '$locale', 'dateFilter', 'orderByFilter', function($log, $locale, dateFilter, orderByFilter) { +.service('uibDateParser', ['$log', '$locale', 'dateFilter', 'orderByFilter', 'filterFilter', function($log, $locale, dateFilter, orderByFilter, filterFilter) { // Pulled from https://github.com/mbostock/d3/blob/master/src/format/requote.js var SPECIAL_CHARACTERS_REGEXP = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; @@ -243,6 +243,23 @@ angular.module('ui.bootstrap.dateparser', []) this.init(); + function getFormatCodeToRegex(key) { + return filterFilter(formatCodeToRegex, {key: key}, true)[0]; + } + + this.getParser = function (key) { + var f = getFormatCodeToRegex(key); + return f && f.apply || null; + }; + + this.overrideParser = function (key, parser) { + var f = getFormatCodeToRegex(key); + if (f && angular.isFunction(parser)) { + this.parsers = {}; + f.apply = parser; + } + }.bind(this); + function createParser(format) { var map = [], regex = format.split(''); diff --git a/src/dateparser/test/dateparser.spec.js b/src/dateparser/test/dateparser.spec.js index c3f2c5912f..b9620559c8 100644 --- a/src/dateparser/test/dateparser.spec.js +++ b/src/dateparser/test/dateparser.spec.js @@ -790,5 +790,27 @@ describe('date parser', function() { expect(toWestDate.getTime() - toEastDate.getTime()).toEqual(1000 * 60 * 60 * 12); }); }); + + describe('overrideParser', function() { + it('overrides the parser', function() { + var original = dateParser.getParser('yy'); + try { + expect(dateParser.parse('67', 'yy').getFullYear()).toEqual(2067); + expect(dateParser.parse('68', 'yy').getFullYear()).toEqual(2068); + + dateParser.overrideParser('yy', function (value) { + this.year = +value + (+value > 30 ? 1900 : 2000); + }); + + expect(dateParser.parse('68', 'yy').getFullYear()).toEqual(1968); + expect(dateParser.parse('67', 'yy').getFullYear()).toEqual(1967); + expect(dateParser.parse('31', 'yy').getFullYear()).toEqual(1931); + expect(dateParser.parse('30', 'yy').getFullYear()).toEqual(2030); + } + finally { + dateParser.overrideParser('yy', original); + } + }); + }); }); }); From b02815b446ad03df6eeb8a7ac054b13d9669f579 Mon Sep 17 00:00:00 2001 From: Douglas Ludlow Date: Fri, 16 Dec 2016 11:47:42 -0700 Subject: [PATCH 2/3] feat(dateparser): split into separate tests. --- src/dateparser/test/dateparser.spec.js | 47 +++++++++++++++----------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/src/dateparser/test/dateparser.spec.js b/src/dateparser/test/dateparser.spec.js index b9620559c8..a71628b3ec 100644 --- a/src/dateparser/test/dateparser.spec.js +++ b/src/dateparser/test/dateparser.spec.js @@ -790,27 +790,34 @@ describe('date parser', function() { expect(toWestDate.getTime() - toEastDate.getTime()).toEqual(1000 * 60 * 60 * 12); }); }); + }); - describe('overrideParser', function() { - it('overrides the parser', function() { - var original = dateParser.getParser('yy'); - try { - expect(dateParser.parse('67', 'yy').getFullYear()).toEqual(2067); - expect(dateParser.parse('68', 'yy').getFullYear()).toEqual(2068); - - dateParser.overrideParser('yy', function (value) { - this.year = +value + (+value > 30 ? 1900 : 2000); - }); - - expect(dateParser.parse('68', 'yy').getFullYear()).toEqual(1968); - expect(dateParser.parse('67', 'yy').getFullYear()).toEqual(1967); - expect(dateParser.parse('31', 'yy').getFullYear()).toEqual(1931); - expect(dateParser.parse('30', 'yy').getFullYear()).toEqual(2030); - } - finally { - dateParser.overrideParser('yy', original); - } - }); + describe('overrideParser', function() { + var twoDigitYearParser = function (value) { + this.year = +value + (+value > 30 ? 1900 : 2000); + }; + + it('overrides the parser', function() { + dateParser.overrideParser('yy', twoDigitYearParser); + expect(dateParser.parse('68', 'yy').getFullYear()).toEqual(1968); + expect(dateParser.parse('67', 'yy').getFullYear()).toEqual(1967); + expect(dateParser.parse('31', 'yy').getFullYear()).toEqual(1931); + expect(dateParser.parse('30', 'yy').getFullYear()).toEqual(2030); + }); + + it('clears cached parsers when overridden', function() { + dateParser.parse('68', 'yy'); + expect(Object.keys(dateParser.parsers).length).toBe(1); + dateParser.overrideParser('yy', twoDigitYearParser); + expect(Object.keys(dateParser.parsers).length).toBe(0); + }); + + it('can set a parser back to the original', function() { + var original = dateParser.getParser('yy'); + dateParser.overrideParser('yy', twoDigitYearParser); + expect(dateParser.parse('68', 'yy').getFullYear()).toEqual(1968); + dateParser.overrideParser('yy', original); + expect(dateParser.parse('68', 'yy').getFullYear()).toEqual(2068); }); }); }); From d9f0acc8b5071d4a734563e5aa33560ea1a9f6ec Mon Sep 17 00:00:00 2001 From: Douglas Ludlow Date: Fri, 16 Dec 2016 13:21:26 -0700 Subject: [PATCH 3/3] feat(dateparser): simplify tests. --- src/dateparser/test/dateparser.spec.js | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/dateparser/test/dateparser.spec.js b/src/dateparser/test/dateparser.spec.js index a71628b3ec..70c4b3e4f8 100644 --- a/src/dateparser/test/dateparser.spec.js +++ b/src/dateparser/test/dateparser.spec.js @@ -797,7 +797,11 @@ describe('date parser', function() { this.year = +value + (+value > 30 ? 1900 : 2000); }; - it('overrides the parser', function() { + it('should get the current parser', function() { + expect(dateParser.getParser('yy')).toBeTruthy(); + }); + + it('should override the parser', function() { dateParser.overrideParser('yy', twoDigitYearParser); expect(dateParser.parse('68', 'yy').getFullYear()).toEqual(1968); expect(dateParser.parse('67', 'yy').getFullYear()).toEqual(1967); @@ -805,19 +809,10 @@ describe('date parser', function() { expect(dateParser.parse('30', 'yy').getFullYear()).toEqual(2030); }); - it('clears cached parsers when overridden', function() { - dateParser.parse('68', 'yy'); - expect(Object.keys(dateParser.parsers).length).toBe(1); - dateParser.overrideParser('yy', twoDigitYearParser); - expect(Object.keys(dateParser.parsers).length).toBe(0); - }); - - it('can set a parser back to the original', function() { - var original = dateParser.getParser('yy'); + it('should clear cached parsers', function() { + expect(dateParser.parse('68', 'yy').getFullYear()).toEqual(2068); dateParser.overrideParser('yy', twoDigitYearParser); expect(dateParser.parse('68', 'yy').getFullYear()).toEqual(1968); - dateParser.overrideParser('yy', original); - expect(dateParser.parse('68', 'yy').getFullYear()).toEqual(2068); }); }); });