Skip to content

Commit

Permalink
Merge pull request #248 from flopal/dev-features
Browse files Browse the repository at this point in the history
Fix features - dependencies - timezone - variable scope
  • Loading branch information
merencia committed Mar 10, 2021
2 parents 94c139f + a9c0d5b commit 427483c
Show file tree
Hide file tree
Showing 28 changed files with 831 additions and 1,307 deletions.
2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -138,7 +138,7 @@ Arguments:
#### Options

- **scheduled**: A `boolean` to set if the created task is scheduled. Default `true`;
- **timezone**: The timezone that is used for job scheduling. See [tz-offset](https://github.com/node-cron/tz-offset/blob/master/generated/offsets.json) for valid values.
- **timezone**: The timezone that is used for job scheduling. See [moment-timezone](https://momentjs.com/timezone) for valid values.

**Example**:

Expand Down
1,921 changes: 714 additions & 1,207 deletions package-lock.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions package.json
Expand Up @@ -35,6 +35,7 @@
"eslint": "^5.7.0",
"istanbul": "^0.4.2",
"mocha": "^6.1.4",
"moment-timezone": "^0.5.31",
"nyc": "^14.0.0",
"sinon": "^7.3.2"
},
Expand Down
18 changes: 9 additions & 9 deletions src/convert-expression/index.js
@@ -1,10 +1,10 @@
'use strict';

var monthNamesConversion = require('./month-names-conversion');
var weekDayNamesConversion = require('./week-day-names-conversion');
var convertAsterisksToRanges = require('./asterisk-to-range-conversion');
var convertRanges = require('./range-conversion');
var convertSteps = require('./step-values-conversion');
const monthNamesConversion = require('./month-names-conversion');
const weekDayNamesConversion = require('./week-day-names-conversion');
const convertAsterisksToRanges = require('./asterisk-to-range-conversion');
const convertRanges = require('./range-conversion');
const convertSteps = require('./step-values-conversion');

module.exports = (() => {

Expand All @@ -21,9 +21,9 @@ module.exports = (() => {

// Function that takes care of normalization.
function normalizeIntegers(expressions) {
for (var i=0; i < expressions.length; i++){
var numbers = expressions[i].split(',');
for (var j=0; j<numbers.length; j++){
for (let i=0; i < expressions.length; i++){
const numbers = expressions[i].split(',');
for (let j=0; j<numbers.length; j++){
numbers[j] = parseInt(numbers[j]);
}
expressions[i] = numbers;
Expand All @@ -49,7 +49,7 @@ module.exports = (() => {
* - Will be translated to 1,2,3,4,5 * * * *
*/
function interprete(expression){
var expressions = removeSpaces(expression).split(' ');
let expressions = removeSpaces(expression).split(' ');
expressions = appendSeccondExpression(expressions);
expressions[4] = monthNamesConversion(expressions[4]);
expressions[5] = weekDayNamesConversion(expressions[5]);
Expand Down
6 changes: 3 additions & 3 deletions src/convert-expression/month-names-conversion.js
@@ -1,12 +1,12 @@
'use strict';
module.exports = (() => {
var months = ['january','february','march','april','may','june','july',
const months = ['january','february','march','april','may','june','july',
'august','september','october','november','december'];
var shortMonths = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug',
const shortMonths = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug',
'sep', 'oct', 'nov', 'dec'];

function convertMonthName(expression, items){
for(var i = 0; i < items.length; i++){
for(let i = 0; i < items.length; i++){
expression = expression.replace(new RegExp(items[i], 'gi'), parseInt(i, 10) + 1);
}
return expression;
Expand Down
17 changes: 7 additions & 10 deletions src/convert-expression/range-conversion.js
Expand Up @@ -2,25 +2,25 @@
module.exports = ( () => {
function replaceWithRange(expression, text, init, end) {

var numbers = [];
var last = parseInt(end);
var first = parseInt(init);
const numbers = [];
let last = parseInt(end);
let first = parseInt(init);

if(first > last){
last = parseInt(init);
first = parseInt(end);
}

for(var i = first; i <= last; i++) {
for(let i = first; i <= last; i++) {
numbers.push(i);
}

return expression.replace(new RegExp(text, 'gi'), numbers.join());
}

function convertRange(expression){
var rangeRegEx = /(\d+)-(\d+)/;
var match = rangeRegEx.exec(expression);
const rangeRegEx = /(\d+)-(\d+)/;
let match = rangeRegEx.exec(expression);
while(match !== null && match.length > 0){
expression = replaceWithRange(expression, match[0], match[1], match[2]);
match = rangeRegEx.exec(expression);
Expand All @@ -29,14 +29,11 @@ module.exports = ( () => {
}

function convertAllRanges(expressions){
for(var i = 0; i < expressions.length; i++){
for(let i = 0; i < expressions.length; i++){
expressions[i] = convertRange(expressions[i]);
}
return expressions;
}

return convertAllRanges;
})();



23 changes: 11 additions & 12 deletions src/convert-expression/step-values-conversion.js
Expand Up @@ -2,26 +2,25 @@

module.exports = (() => {
function convertSteps(expressions){
var stepValuePattern = /^(.+)\/(\d+)$/;
for(var i = 0; i < expressions.length; i++){
var match = stepValuePattern.exec(expressions[i]);
var isStepValue = match !== null && match.length > 0;
const stepValuePattern = /^(.+)\/(\d+)$/;
for(let i = 0; i < expressions.length; i++){
const match = stepValuePattern.exec(expressions[i]);
const isStepValue = match !== null && match.length > 0;
if(isStepValue){
var values = match[1].split(',');
var setpValues = [];
var divider = parseInt(match[2], 10);
for(var j = 0; j <= values.length; j++){
var value = parseInt(values[j], 10);
const values = match[1].split(',');
const stepValues = [];
const divider = parseInt(match[2], 10);
for(let j = 0; j <= values.length; j++){
const value = parseInt(values[j], 10);
if(value % divider === 0){
setpValues.push(value);
stepValues.push(value);
}
}
expressions[i] = setpValues.join(',');
expressions[i] = stepValues.join(',');
}
}
return expressions;
}

return convertSteps;
})();

6 changes: 3 additions & 3 deletions src/convert-expression/week-day-names-conversion.js
@@ -1,11 +1,11 @@
'use strict';
module.exports = (() => {
var weekDays = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday',
const weekDays = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday',
'friday', 'saturday'];
var shortWeekDays = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
const shortWeekDays = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];

function convertWeekDayName(expression, items){
for(var i = 0; i < items.length; i++){
for(let i = 0; i < items.length; i++){
expression = expression.replace(new RegExp(items[i], 'gi'), parseInt(i, 10));
}
return expression;
Expand Down
3 changes: 1 addition & 2 deletions src/node-cron.js
Expand Up @@ -35,9 +35,8 @@ module.exports = (() => {
function createTask(expression, func, options){
if(typeof func === 'string'){
return new BackgroundScheduledTask(expression, func, options);
} else {
return new ScheduledTask(expression, func, options);
}
return new ScheduledTask(expression, func, options);
}

/**
Expand Down
18 changes: 9 additions & 9 deletions src/pattern-validation.js
@@ -1,15 +1,15 @@
'use strict';

var convertExpression = require('./convert-expression');
const convertExpression = require('./convert-expression');


module.exports = ( () => {
function isValidExpression(expression, min, max){
var options = expression.split(',');
var regexValidation = /^\d+$|^\*$|^\*\/\d+$/;
for(var i = 0; i < options.length; i++){
var option = options[i];
var optionAsInt = parseInt(options[i], 10);
const options = expression.split(',');
const regexValidation = /^\d+$|^\*$|^\*\/\d+$/;
for(let i = 0; i < options.length; i++){
const option = options[i];
const optionAsInt = parseInt(options[i], 10);
if(optionAsInt < min || optionAsInt > max || !regexValidation.test(option)) {
return false;
}
Expand Down Expand Up @@ -72,9 +72,9 @@ module.exports = ( () => {
throw 'pattern must be a string!';
}

var patterns = pattern.split(' ');
var executablePattern = convertExpression(pattern);
var executablePatterns = executablePattern.split(' ');
let patterns = pattern.split(' ');
const executablePattern = convertExpression(pattern);
const executablePatterns = executablePattern.split(' ');

if(patterns.length === 5){
patterns = ['0'].concat(patterns);
Expand Down
15 changes: 8 additions & 7 deletions src/scheduler.js
Expand Up @@ -15,20 +15,21 @@ class Scheduler extends EventEmitter{
this.stop();

let lastCheck = process.hrtime();
let lastExecution = new Date();
let lastExecution = this.timeMatcher.apply(new Date());

var matchTime = () => {
const matchTime = () => {
const delay = 1000;
const elapsedTime = process.hrtime(lastCheck);
const elapsedMs = (elapsedTime[0] * 1e9 + elapsedTime[1]) / 1e6;
const missedExecutions = Math.floor(elapsedMs / 1000);

for(let i = missedExecutions; i >= 0; i--){
var date = new Date(new Date().getTime() - i * 1000);
if(lastExecution.getTime() < date.getTime() && (i === 0 || this.autorecover) && this.timeMatcher.match(date)){
this.emit('scheduled-time-matched', date);
date.setMilliseconds(0);
lastExecution = date;
const date = new Date(new Date().getTime() - i * 1000);
let date_tmp = this.timeMatcher.apply(date);
if(lastExecution.getTime() < date_tmp.getTime() && (i === 0 || this.autorecover) && this.timeMatcher.match(date)){
this.emit('scheduled-time-matched', date_tmp);
date_tmp.setMilliseconds(0);
lastExecution = date_tmp;
}
}
lastCheck = process.hrtime();
Expand Down
29 changes: 18 additions & 11 deletions src/time-matcher.js
@@ -1,10 +1,10 @@
const validatePattern = require('./pattern-validation');
const convertExpression = require('./convert-expression');
const tzOffset = require('tz-offset');
const moment = require('moment-timezone');

function matchPattern(pattern, value){
if( pattern.indexOf(',') !== -1 ){
var patterns = pattern.split(',');
const patterns = pattern.split(',');
return patterns.indexOf(value.toString()) !== -1;
}
return pattern === value.toString();
Expand All @@ -19,18 +19,25 @@ class TimeMatcher{
}

match(date){
if(this.timezone){
date = tzOffset.timeAt(date, this.timezone);
}
var runOnSecond = matchPattern(this.expressions[0], date.getSeconds());
var runOnMinute = matchPattern(this.expressions[1], date.getMinutes());
var runOnHour = matchPattern(this.expressions[2], date.getHours());
var runOnDay = matchPattern(this.expressions[3], date.getDate());
var runOnMonth = matchPattern(this.expressions[4], date.getMonth() + 1);
var runOnWeekDay = matchPattern(this.expressions[5], date.getDay());
date = this.apply(date);

const runOnSecond = matchPattern(this.expressions[0], date.getSeconds());
const runOnMinute = matchPattern(this.expressions[1], date.getMinutes());
const runOnHour = matchPattern(this.expressions[2], date.getHours());
const runOnDay = matchPattern(this.expressions[3], date.getDate());
const runOnMonth = matchPattern(this.expressions[4], date.getMonth() + 1);
const runOnWeekDay = matchPattern(this.expressions[5], date.getDay());

return runOnSecond && runOnMinute && runOnHour && runOnDay && runOnMonth && runOnWeekDay;
}

apply(date){
if(this.timezone){
const tmp = moment.tz(date, this.timezone);
return new Date(tmp.year(), tmp.month(), tmp.date(), tmp.hour(), tmp.minute(), tmp.second(), tmp.millisecond());
}
return date;
}
}

module.exports = TimeMatcher;
6 changes: 3 additions & 3 deletions test/convert-expression/asterisk-to-range-conversion-test.js
@@ -1,12 +1,12 @@
'use strict';

const { expect } = require('chai');
var conversion = require('../../src/convert-expression/asterisk-to-range-conversion');
const conversion = require('../../src/convert-expression/asterisk-to-range-conversion');

describe('asterisk-to-range-conversion.js', () => {
it('shuld convert * to ranges', () => {
var expressions = '* * * * * *'.split(' ');
var expression = conversion(expressions).join(' ');
const expressions = '* * * * * *'.split(' ');
const expression = conversion(expressions).join(' ');
expect(expression).to.equal('0-59 0-59 0-23 1-31 1-12 0-6');
});
});
10 changes: 5 additions & 5 deletions test/convert-expression/convert-expression-test.js
@@ -1,18 +1,18 @@
'use strict';

const { expect } = require('chai');
var conversion = require('../../src/convert-expression');
const conversion = require('../../src/convert-expression');

describe('month-names-conversion.js', () => {
it('shuld convert month names', () => {
var expression = conversion('* * * * January,February *');
var expressions = expression.split(' ');
const expression = conversion('* * * * January,February *');
const expressions = expression.split(' ');
expect(expressions[4]).to.equal('1,2');
});

it('shuld convert week day names', () => {
var expression = conversion('* * * * * Mon,Sun');
var expressions = expression.split(' ');
const expression = conversion('* * * * * Mon,Sun');
const expressions = expression.split(' ');
expect(expressions[5]).to.equal('1,0');
});
});
6 changes: 3 additions & 3 deletions test/convert-expression/month-names-conversion-test.js
@@ -1,16 +1,16 @@
'use strict';

const { expect } = require('chai');
var conversion = require('../../src/convert-expression/month-names-conversion');
const conversion = require('../../src/convert-expression/month-names-conversion');

describe('month-names-conversion.js', () => {
it('shuld convert month names', () => {
var months = conversion('January,February,March,April,May,June,July,August,September,October,November,December');
const months = conversion('January,February,March,April,May,June,July,August,September,October,November,December');
expect(months).to.equal('1,2,3,4,5,6,7,8,9,10,11,12');
});

it('shuld convert month names', () => {
var months = conversion('Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec');
const months = conversion('Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec');
expect(months).to.equal('1,2,3,4,5,6,7,8,9,10,11,12');
});
});
10 changes: 5 additions & 5 deletions test/convert-expression/range-conversion-test.js
@@ -1,18 +1,18 @@
'use strict';

const { expect } = require('chai');
var conversion = require('../../src/convert-expression/range-conversion');
const conversion = require('../../src/convert-expression/range-conversion');

describe('range-conversion.js', () => {
it('shuld convert ranges to numbers', () => {
var expressions = '0-3 0-3 0-2 1-3 1-2 0-3'.split(' ');
var expression = conversion(expressions).join(' ');
const expressions = '0-3 0-3 0-2 1-3 1-2 0-3'.split(' ');
const expression = conversion(expressions).join(' ');
expect(expression).to.equal('0,1,2,3 0,1,2,3 0,1,2 1,2,3 1,2 0,1,2,3');
});

it('shuld convert ranges to numbers', () => {
var expressions = '0-3 0-3 8-10 1-3 1-2 0-3'.split(' ');
var expression = conversion(expressions).join(' ');
const expressions = '0-3 0-3 8-10 1-3 1-2 0-3'.split(' ');
const expression = conversion(expressions).join(' ');
expect(expression).to.equal('0,1,2,3 0,1,2,3 8,9,10 1,2,3 1,2 0,1,2,3');
});
});
4 changes: 2 additions & 2 deletions test/convert-expression/step-values-conversion-test.js
@@ -1,11 +1,11 @@
'use strict';

const { expect } = require('chai');
var conversion = require('../../src/convert-expression/step-values-conversion');
const conversion = require('../../src/convert-expression/step-values-conversion');

describe('step-values-conversion.js', () => {
it('shuld convert step values', () => {
var expressions = '1,2,3,4,5,6,7,8,9,10/2 0,1,2,3,4,5,6,7,8,9/5 * * * *'.split(' ');
let expressions = '1,2,3,4,5,6,7,8,9,10/2 0,1,2,3,4,5,6,7,8,9/5 * * * *'.split(' ');
expressions = conversion(expressions);
expect(expressions[0]).to.equal('2,4,6,8,10');
expect(expressions[1]).to.equal('0,5');
Expand Down

0 comments on commit 427483c

Please sign in to comment.