From 7d5ba1019340840eb8d39903a0cba7ac62d9d67b Mon Sep 17 00:00:00 2001 From: Chris Maurer Date: Tue, 15 Apr 2014 10:37:48 -0500 Subject: [PATCH] added pass through path for target builder added tests --- dist/angularjs-graphite.js | 77 ++++--- src/factories/graphite-api-target-factory.js | 53 +++-- test/factories/graphite-api-target-spec.js | 201 ++++++++++++++++++- 3 files changed, 276 insertions(+), 55 deletions(-) diff --git a/dist/angularjs-graphite.js b/dist/angularjs-graphite.js index 536af79..9a55628 100644 --- a/dist/angularjs-graphite.js +++ b/dist/angularjs-graphite.js @@ -1,4 +1,4 @@ -/*! angularjs-graphite - v0.0.0 - 2014-04-10 +/*! angularjs-graphite - v0.0.0 - 2014-04-15 * Copyright (c) 2014 ; Licensed Apache License, v2.0 */ window.ngGraphite = {}; window.ngGraphite.i18n = {}; @@ -190,9 +190,9 @@ ngGraphiteFactories.factory( 'GraphiteDataParser', function () { } ); ngGraphiteFactories.factory( 'GraphiteTargetBuilder', function () { 'use strict'; - var allPatternsRegex = /(\[[0-9a-zA-Z]*\])|(\[([a-zA-Z]*\-[a-zA-z]*)?([0-9]*\-[0-9]*)?\])|\{(.*?)\}/g, + var allPatternsRegex = /(\[[0-9a-zA-Z]*\])|(\[[a-z0-9A-Z].*?\])|\{(.*?)\}/g, characterListRegex = /(\[[0-9a-zA-Z]*\])/g, - characterRangeRegex = /(\[([a-zA-Z]*\-[a-zA-Z]*)?([0-9]*\-[0-9]*)?\])/g, + characterRangeRegex = /(\[[0-9a-zA-Z].*?\])/g, valueListRegex = /\{(.*?)\}/g, alpha = [ 'a', @@ -301,39 +301,48 @@ ngGraphiteFactories.factory( 'GraphiteTargetBuilder', function () { return strs; } - function buildCharacterRange( value ) { - //find start and end position of all brackets '[]' in value - var strs = [], - nums; - value.match( characterRangeRegex ).forEach( function ( match ) { - var range = match.replace( '[', '' ).replace( ']', '' ).split( '-' ); - if ( isNaN( range[ 0 ] ) ) { - //characters - if ( alpha.indexOf( range[ 0 ] ) > -1 ) { - strs.push( { - values: alpha.slice( alpha.indexOf( range[ 0 ] ), alpha.indexOf( range[ 1 ] ) + 1 ), - str: value, - pattern: match - } ); - } else { - strs.push( { - values: ALPHA.slice( ALPHA.indexOf( range[ 0 ] ), ALPHA.indexOf( range[ 1 ] ) + 1 ), - str: value, - pattern: match - } ); - } + function buildRange( value, match, range, strs ) { + if ( isNaN( range[ 0 ] ) ) { + //characters + if ( alpha.indexOf( range[ 0 ] ) > -1 ) { + strs.push( { + values: alpha.slice( alpha.indexOf( range[ 0 ] ), alpha.indexOf( range[ 1 ] ) + 1 ), + str: value, + pattern: match + } ); } else { - //numbers - nums = []; - for ( var i = +range[ 0 ]; i < +range[ 1 ] + 1; i++ ) { - nums.push( i ); - } strs.push( { - values: nums, + values: ALPHA.slice( ALPHA.indexOf( range[ 0 ] ), ALPHA.indexOf( range[ 1 ] ) + 1 ), str: value, pattern: match } ); } + } else { + //numbers + var nums = []; + for ( var i = +range[ 0 ]; i < +range[ 1 ] + 1; i++ ) { + nums.push( i ); + } + strs.push( { + values: nums, + str: value, + pattern: match + } ); + } + } + + function buildCharacterRange( value ) { + //find start and end position of all brackets '[]' in value + var strs = []; + value.match( characterRangeRegex ).forEach( function ( match ) { + if ( match.indexOf( ',' ) > -1 ) { + match.replace( '[', '' ).replace( ']', '' ).split( ',' ).forEach( function ( rge ) { + buildRange( value, match, rge.split( '-' ), strs ); + } ); + } else { + var range = match.replace( '[', '' ).replace( ']', '' ).split( '-' ); + buildRange( value, match, range, strs ); + } } ); return strs; } @@ -372,11 +381,13 @@ ngGraphiteFactories.factory( 'GraphiteTargetBuilder', function () { buildCharacterRange( token ).forEach( addToStrArray ); } else if ( token.match( valueListRegex ) !== null ) { buildValueList( token ).forEach( addToStrArray ); - } else { - console.log( 'token not matched', token ); } } - return buildResult( origValue, strs ); + if ( strs.length === 0 ) { + return [ value ]; + } else { + return buildResult( origValue, strs ); + } }, buildAll: function ( values ) { return []; diff --git a/src/factories/graphite-api-target-factory.js b/src/factories/graphite-api-target-factory.js index a1d785c..f613b19 100644 --- a/src/factories/graphite-api-target-factory.js +++ b/src/factories/graphite-api-target-factory.js @@ -8,9 +8,9 @@ ngGraphiteFactories .factory('GraphiteTargetBuilder', function () { 'use strict'; - var allPatternsRegex = /(\[[0-9a-zA-Z]*\])|(\[([a-zA-Z]*\-[a-zA-z]*)?([0-9]*\-[0-9]*)?\])|\{(.*?)\}/g, + var allPatternsRegex = /(\[[0-9a-zA-Z]*\])|(\[[a-z0-9A-Z].*?\])|\{(.*?)\}/g, characterListRegex = /(\[[0-9a-zA-Z]*\])/g, - characterRangeRegex = /(\[([a-zA-Z]*\-[a-zA-Z]*)?([0-9]*\-[0-9]*)?\])/g, + characterRangeRegex = /(\[[0-9a-zA-Z].*?\])/g, valueListRegex = /\{(.*?)\}/g, alpha = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'], ALPHA = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']; @@ -60,25 +60,35 @@ ngGraphiteFactories return strs; } + function buildRange(value, match, range, strs){ + if(isNaN(range[0])){ + //characters + if(alpha.indexOf(range[0]) > -1){ + strs.push({values: alpha.slice(alpha.indexOf(range[0]), alpha.indexOf(range[1]) + 1), str: value, pattern: match}); + } else { + strs.push({values: ALPHA.slice(ALPHA.indexOf(range[0]), ALPHA.indexOf(range[1]) + 1), str: value, pattern: match}); + } + } else { + //numbers + var nums = []; + for(var i = +range[0]; i < (+range[1] + 1); i++){ + nums.push(i); + } + strs.push({values: nums, str: value, pattern: match}); + } + } + function buildCharacterRange(value){ //find start and end position of all brackets '[]' in value - var strs = [], nums; + var strs = []; value.match(characterRangeRegex).forEach(function(match){ - var range = match.replace('[', '').replace(']', '').split('-'); - if(isNaN(range[0])){ - //characters - if(alpha.indexOf(range[0]) > -1){ - strs.push({values: alpha.slice(alpha.indexOf(range[0]), alpha.indexOf(range[1]) + 1), str: value, pattern: match}); - } else { - strs.push({values: ALPHA.slice(ALPHA.indexOf(range[0]), ALPHA.indexOf(range[1]) + 1), str: value, pattern: match}); - } + if(match.indexOf(',') > -1){ + match.replace('[', '').replace(']', '').split(',').forEach(function(rge){ + buildRange(value, match, rge.split('-'), strs); + }); } else { - //numbers - nums = []; - for(var i = +range[0]; i < (+range[1] + 1); i++){ - nums.push(i); - } - strs.push({values: nums, str: value, pattern: match}); + var range = match.replace('[', '').replace(']', '').split('-'); + buildRange(value, match, range, strs); } }); return strs; @@ -114,12 +124,13 @@ ngGraphiteFactories buildCharacterRange(token).forEach(addToStrArray); } else if (token.match(valueListRegex) !== null) { buildValueList(token).forEach(addToStrArray); - } else { - console.log('token not matched', token); } } - - return buildResult(origValue, strs); + if(strs.length === 0){ + return [value]; + } else { + return buildResult(origValue, strs); + } }, buildAll: function(values){ return []; diff --git a/test/factories/graphite-api-target-spec.js b/test/factories/graphite-api-target-spec.js index 93dbfc3..1a55ba2 100644 --- a/test/factories/graphite-api-target-spec.js +++ b/test/factories/graphite-api-target-spec.js @@ -88,6 +88,26 @@ describe('Graphite Target Factory ', function(){ }); + //sumSeries(foo[a]bar) + it('should create a single metric from a single character list with graphite function.', function(){ + var buildTarget = 'sumSeries(foo[a]bar)', + result = graphiteTargetBuilder.build(buildTarget); + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toEqual(1); + expect(result.indexOf('sumSeries(fooabar)')).toNotEqual(-1); + }); + + //foo[a]bar* + it('should create a single metric from a single character list with wild card character.', function(){ + var buildTarget = 'foo[a]bar*', + result = graphiteTargetBuilder.build(buildTarget); + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toEqual(1); + expect(result.indexOf('fooabar*')).toNotEqual(-1); + }); + }); describe('Character Range ', function(){ @@ -185,6 +205,30 @@ describe('Graphite Target Factory ', function(){ }); + //sumSeries(foo[a-c]bar) + it('should create multiple metrics from a single character range with graphite function.', function(){ + var buildTarget = 'sumSeries(foo[a-c]bar)', + result = graphiteTargetBuilder.build(buildTarget); + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toEqual(3); + expect(result.indexOf('sumSeries(fooabar)')).toNotEqual(-1); + expect(result.indexOf('sumSeries(foobbar)')).toNotEqual(-1); + expect(result.indexOf('sumSeries(foocbar)')).toNotEqual(-1); + }); + + //foo[a-c]bar* + it('should create multiple metrics from a single character range with wildcard.', function(){ + var buildTarget = 'foo[a-c]bar*', + result = graphiteTargetBuilder.build(buildTarget); + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toEqual(3); + expect(result.indexOf('fooabar*')).toNotEqual(-1); + expect(result.indexOf('foobbar*')).toNotEqual(-1); + expect(result.indexOf('foocbar*')).toNotEqual(-1); + }); + }); describe('Number Range ', function(){ @@ -284,6 +328,59 @@ describe('Graphite Target Factory ', function(){ expect(result.indexOf('foo.3.bar.7.ing.8')).toNotEqual(-1); expect(result.indexOf('foo.3.bar.7.ing.9')).toNotEqual(-1); }); + + xit('should create multiple metrics from multi-ranges.', function(){ + var buildTarget = 'foo.[1-3,5-7].bar', + result = graphiteTargetBuilder.build(buildTarget); + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toEqual(6); + expect(result.indexOf('foo.1.bar')).toNotEqual(-1); + expect(result.indexOf('foo.2.bar')).toNotEqual(-1); + expect(result.indexOf('foo.3.bar')).toNotEqual(-1); + expect(result.indexOf('foo.5.bar')).toNotEqual(-1); + expect(result.indexOf('foo.6.bar')).toNotEqual(-1); + expect(result.indexOf('foo.7.bar')).toNotEqual(-1); + }); + + xit('should create multiple metrics from multi-ranges.', function(){ + var buildTarget = 'foo.[a-c,h-j].bar', + result = graphiteTargetBuilder.build(buildTarget); + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toEqual(6); + expect(result.indexOf('foo.a.bar')).toNotEqual(-1); + expect(result.indexOf('foo.b.bar')).toNotEqual(-1); + expect(result.indexOf('foo.c.bar')).toNotEqual(-1); + expect(result.indexOf('foo.h.bar')).toNotEqual(-1); + expect(result.indexOf('foo.i.bar')).toNotEqual(-1); + expect(result.indexOf('foo.j.bar')).toNotEqual(-1); + }); + + //sumSeries(foo[1-3]bar) + it('should create a multiple metrics from a single number range with graphite function.', function(){ + var buildTarget = 'sumSeries(foo[1-3]bar)', + result = graphiteTargetBuilder.build(buildTarget); + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toEqual(3); + expect(result.indexOf('sumSeries(foo1bar)')).toNotEqual(-1); + expect(result.indexOf('sumSeries(foo2bar)')).toNotEqual(-1); + expect(result.indexOf('sumSeries(foo3bar)')).toNotEqual(-1); + }); + + //foo[1-3]bar* + it('should create a multiple metrics from a single number range with wildcard.', function(){ + var buildTarget = 'foo[1-3]bar*', + result = graphiteTargetBuilder.build(buildTarget); + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toEqual(3); + expect(result.indexOf('foo1bar*')).toNotEqual(-1); + expect(result.indexOf('foo2bar*')).toNotEqual(-1); + expect(result.indexOf('foo3bar*')).toNotEqual(-1); + }); + }); describe('Value List ', function(){ @@ -388,6 +485,30 @@ describe('Graphite Target Factory ', function(){ expect(result.indexOf('foobar.two.bfour.d.bar')).toNotEqual(-1); }); + //sumSeries(foobar.{one,two,three}) + it('should create multiple metrics from a value list with graphite function.', function(){ + var buildTarget = 'sumSeries(foobar.{one,two,three})', + result = graphiteTargetBuilder.build(buildTarget); + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toEqual(3); + expect(result.indexOf('sumSeries(foobar.one)')).toNotEqual(-1); + expect(result.indexOf('sumSeries(foobar.two)')).toNotEqual(-1); + expect(result.indexOf('sumSeries(foobar.three)')).toNotEqual(-1); + }); + + //foobar.{one,two,three}* + it('should create multiple metrics from a value list with wildcard.', function(){ + var buildTarget = 'foobar.{one,two,three}*', + result = graphiteTargetBuilder.build(buildTarget); + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toEqual(3); + expect(result.indexOf('foobar.one*')).toNotEqual(-1); + expect(result.indexOf('foobar.two*')).toNotEqual(-1); + expect(result.indexOf('foobar.three*')).toNotEqual(-1); + }); + }); describe('Mixed Cases', function() { @@ -563,7 +684,85 @@ describe('Graphite Target Factory ', function(){ expect(result.indexOf('foobar.39')).toNotEqual(-1); }); + it('should create metrics from a back to back range, value list, wildcard.', function(){ + var buildTarget = 'foobar.[13].*.{6,7,8,9}', + result = graphiteTargetBuilder.build(buildTarget); + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toEqual(8); + expect(result.indexOf('foobar.1.*.6')).toNotEqual(-1); + expect(result.indexOf('foobar.1.*.7')).toNotEqual(-1); + expect(result.indexOf('foobar.1.*.8')).toNotEqual(-1); + expect(result.indexOf('foobar.1.*.9')).toNotEqual(-1); + expect(result.indexOf('foobar.3.*.6')).toNotEqual(-1); + expect(result.indexOf('foobar.3.*.7')).toNotEqual(-1); + expect(result.indexOf('foobar.3.*.8')).toNotEqual(-1); + expect(result.indexOf('foobar.3.*.9')).toNotEqual(-1); + }); + + it('should create metrics from a back to back range, value list, graphite function.', function(){ + var buildTarget = 'sumSeries(foobar.[13].*.{6,7,8,9})', + result = graphiteTargetBuilder.build(buildTarget); + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toEqual(8); + expect(result.indexOf('sumSeries(foobar.1.*.6)')).toNotEqual(-1); + expect(result.indexOf('sumSeries(foobar.1.*.7)')).toNotEqual(-1); + expect(result.indexOf('sumSeries(foobar.1.*.8)')).toNotEqual(-1); + expect(result.indexOf('sumSeries(foobar.1.*.9)')).toNotEqual(-1); + expect(result.indexOf('sumSeries(foobar.3.*.6)')).toNotEqual(-1); + expect(result.indexOf('sumSeries(foobar.3.*.7)')).toNotEqual(-1); + expect(result.indexOf('sumSeries(foobar.3.*.8)')).toNotEqual(-1); + expect(result.indexOf('sumSeries(foobar.3.*.9)')).toNotEqual(-1); + }); + + }); + + describe('Pass Through Tests ', function() { + var graphiteTargetBuilder; + beforeEach(module('ngGraphite.factories')); + beforeEach(inject(function (GraphiteTargetBuilder) { + graphiteTargetBuilder = GraphiteTargetBuilder; + })); + + it('should pass through targets that do not have any patterns', function(){ + var buildTarget = 'foo.1.bar', + result = graphiteTargetBuilder.build(buildTarget); + expect(result).toBeDefined(); + console.log('result', result); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toEqual(1); + expect(result.indexOf('foo.1.bar')).toNotEqual(-1); + }); + + it('should pass through targets that do not have any patterns with graphite functions', function(){ + var buildTarget = 'sumSeries(foo.1.bar)', + result = graphiteTargetBuilder.build(buildTarget); + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toEqual(1); + expect(result.indexOf('sumSeries(foo.1.bar)')).toNotEqual(-1); + }); + + it('should pass through targets that do not have any patterns with wild cards', function(){ + var buildTarget = 'foo.1.bar*', + result = graphiteTargetBuilder.build(buildTarget); + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toEqual(1); + expect(result.indexOf('foo.1.bar*')).toNotEqual(-1); + }); + + it('should pass through targets that do not have any patterns with wild cards, internal', function(){ + var buildTarget = 'foo.1.*.bar', + result = graphiteTargetBuilder.build(buildTarget); + expect(result).toBeDefined(); + expect(Array.isArray(result)).toBe(true); + expect(result.length).toEqual(1); + expect(result.indexOf('foo.1.*.bar')).toNotEqual(-1); + }); + }); -}); + });