From c0ce6e7a8a85eab5c580ce509132e1cf8fe7d83e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 13 Jun 2016 12:20:56 +0200 Subject: [PATCH 1/6] WIP fixes 478, adds more error information when either analysis or turbo-carto is not well formed. --- lib/cartodb/controllers/base.js | 35 +++++- .../adapter/analysis-mapconfig-adapter.js | 22 +++- .../mapconfig/adapter/turbo-carto-adapter.js | 13 +- test/acceptance/analysis/error-cases.js | 115 ++++++++++++++++++ test/acceptance/turbo-cartocss/error-cases.js | 19 +++ 5 files changed, 192 insertions(+), 12 deletions(-) diff --git a/lib/cartodb/controllers/base.js b/lib/cartodb/controllers/base.js index e5952ff6..8b36c095 100644 --- a/lib/cartodb/controllers/base.js +++ b/lib/cartodb/controllers/base.js @@ -214,15 +214,19 @@ BaseController.prototype.sendError = function(req, res, err, label) { statusCode = 200; } - var errorResponseBody = { errors: allErrors.map(errorMessage) }; + var errorResponseBody = { + errors: allErrors.map(errorMessage) + }; + + var errorsWithContext = allErrors.map(errorMessageWithContext).filter(function (err) { return !!err; }); + if (errorsWithContext.length){ + errorResponseBody.errors_with_context = errorsWithContext; + } this.send(req, res, errorResponseBody, statusCode); }; -function errorMessage(err) { - // See https://github.com/Vizzuality/Windshaft-cartodb/issues/68 - var message = (_.isString(err) ? err : err.message) || 'Unknown error'; - +function stripConnectionInfo(message) { // Strip connection info, if any return message // See https://github.com/CartoDB/Windshaft/issues/173 @@ -230,6 +234,27 @@ function errorMessage(err) { // See https://travis-ci.org/CartoDB/Windshaft/jobs/20703062#L1644 .replace(/is the server.*encountered/im, 'encountered'); } + +function errorMessage(err) { + // See https://github.com/Vizzuality/Windshaft-cartodb/issues/68 + var message = (_.isString(err) ? err : err.message) || 'Unknown error'; + + return stripConnectionInfo(message); + +} + +function errorMessageWithContext(err) { + if (!err.context) { + return; + } + // See https://github.com/Vizzuality/Windshaft-cartodb/issues/68 + var message = (_.isString(err) ? err : err.message) || 'Unknown error'; + + return { + message: stripConnectionInfo(message), + context: err.context + }; +} module.exports.errorMessage = errorMessage; function findStatusCode(err) { diff --git a/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js index 7a7150db..ffbe962b 100644 --- a/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js @@ -58,13 +58,27 @@ AnalysisMapConfigAdapter.prototype.getMapConfig = function(user, requestMapConfi requestMapConfig = appendFiltersToNodes(requestMapConfig, dataviewsFiltersBySourceId); - function createAnalysis(analysisDefinition, done) { - self.analysisBackend.create(analysisConfiguration, analysisDefinition, done); + function createAnalysis(analysisDefinition, index, done) { + self.analysisBackend.create(analysisConfiguration, analysisDefinition, function (err, analysis) { + if (err) { + err.context = { + type: 'camshaft', + analysis: { + index: index, + id: analysisDefinition.id, + type: analysisDefinition.type + } + }; + return done(err); + } + + done(null, analysis); + }); } var analysesQueue = queue(requestMapConfig.analyses.length); - requestMapConfig.analyses.forEach(function(analysis) { - analysesQueue.defer(createAnalysis, analysis); + requestMapConfig.analyses.forEach(function(analysis, index) { + analysesQueue.defer(createAnalysis, analysis, index); }); analysesQueue.awaitAll(function(err, analysesResults) { diff --git a/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js b/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js index 3eb29197..dfdf6414 100644 --- a/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js @@ -22,8 +22,8 @@ TurboCartoAdapter.prototype.getMapConfig = function (user, requestMapConfig, par var parseCartoQueue = queue(layers.length); - layers.forEach(function(layer) { - parseCartoQueue.defer(self._parseCartoCss.bind(self), user, layer); + layers.forEach(function(layer, index) { + parseCartoQueue.defer(self._parseCartoCss.bind(self), user, layer, index); }); parseCartoQueue.awaitAll(function (err, layers) { @@ -51,7 +51,7 @@ var pixelSizeTemplate = dot.template('40075017 * cos(ST_Y(ST_Centroid({{=it._bbo var scaleDenominatorTemplate = dot.template('({{=it._pixelSize}} / 0.00028)::numeric'); -TurboCartoAdapter.prototype._parseCartoCss = function (username, layer, callback) { +TurboCartoAdapter.prototype._parseCartoCss = function (username, layer, index, callback) { if (!shouldParseLayerCartocss(layer)) { return callback(null, layer); } @@ -86,6 +86,13 @@ TurboCartoAdapter.prototype._parseCartoCss = function (username, layer, callback if (err && err.name === 'TurboCartoError') { err = new Error('turbo-carto: ' + err.message); err.http_status = 400; + err.context = { + type: 'turbo-carto', + layer: { + index: index, + type: layer.type + } + }; return callback(err); } diff --git a/test/acceptance/analysis/error-cases.js b/test/acceptance/analysis/error-cases.js index fcfc6f13..4358b1cb 100644 --- a/test/acceptance/analysis/error-cases.js +++ b/test/acceptance/analysis/error-cases.js @@ -20,6 +20,13 @@ describe('analysis-layers error cases', function() { } }; + var AUTH_ERROR_RESPONSE = { + status: 403, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }; + it('should handle missing analysis nodes for layers', function(done) { var mapConfig = createMapConfig( [ @@ -64,4 +71,112 @@ describe('analysis-layers error cases', function() { testClient.drain(done); }); }); + + it('camshaft: should return error missing analysis nodes for layers with some context', function(done) { + var mapConfig = createMapConfig( + [ + { + "type": "cartodb", + "options": { + "source": { + "id": "HEAD" + }, + "cartocss": '#polygons { polygon-fill: red; }', + "cartocss_version": "2.3.0" + } + } + ], + {}, + [ + { + "id": "HEAD", + "type": "buffer", + "params": { + "source": { + "id": "HEAD", + "type": "source", + "params": { + "query": "select * from populated_places_simple_reduced" + } + }, + "radius": 50000 + } + } + ] + ); + + var testClient = new TestClient(mapConfig, 11111); + + testClient.getLayergroup(AUTH_ERROR_RESPONSE, function(err, layergroupResult) { + assert.ok(!err, err); + + assert.equal(layergroupResult.errors.length, 1); + assert.equal( + layergroupResult.errors[0], + 'Analysis requires authentication with API key: permission denied.' + ); + + assert.equal(layergroupResult.errors_with_context[0].context.type, 'camshaft'); + assert.equal(layergroupResult.errors_with_context[0].context.analysis.index, 0); + assert.equal(layergroupResult.errors_with_context[0].context.analysis.id, 'HEAD'); + assert.equal(layergroupResult.errors_with_context[0].context.analysis.type, 'buffer'); + + testClient.drain(done); + }); + }); + + + it('camshaft: should return error: Missing required param "radius"; with context', function(done) { + var mapConfig = createMapConfig( + [ + { + "type": "cartodb", + "options": { + "source": { + "id": "HEAD" + }, + "cartocss": '#polygons { polygon-fill: red; }', + "cartocss_version": "2.3.0" + } + } + ], + {}, + [ + { + "id": "HEAD", + "type": "buffer", + "params": { + "source": { + "id": "HEAD", + "type": "source", + "params": { + "query": "select * from populated_places_simple_reduced" + } + } + } + } + ] + ); + + var testClient = new TestClient(mapConfig, 1234); + + testClient.getLayergroup(ERROR_RESPONSE, function(err, layergroupResult) { + assert.ok(!err, err); + + assert.equal(layergroupResult.errors.length, 1); + assert.equal( + layergroupResult.errors[0], + 'Missing required param "radius"' + ); + + assert.equal(layergroupResult.errors_with_context[0].context.type, 'camshaft'); + assert.equal(layergroupResult.errors_with_context[0].context.analysis.index, 0); + assert.equal(layergroupResult.errors_with_context[0].context.analysis.id, 'HEAD'); + assert.equal(layergroupResult.errors_with_context[0].context.analysis.type, 'buffer'); + + testClient.drain(done); + }); + }); + + }); diff --git a/test/acceptance/turbo-cartocss/error-cases.js b/test/acceptance/turbo-cartocss/error-cases.js index 3967738b..23597dd7 100644 --- a/test/acceptance/turbo-cartocss/error-cases.js +++ b/test/acceptance/turbo-cartocss/error-cases.js @@ -106,4 +106,23 @@ describe('turbo-carto error cases', function() { done(); }); }); + + it('turbo-carto: should return error invalid column from datasource with some context', function(done) { + this.testClient = new TestClient(makeMapconfig(null, 'ramp([wadus_column], (red, green, blue))')); + this.testClient.getLayergroup(ERROR_RESPONSE, function(err, layergroup) { + assert.ok(!err, err); + + assert.ok(layergroup.hasOwnProperty('errors')); + assert.equal(layergroup.errors_with_context.length, 1); + assert.ok(layergroup.errors_with_context[0].message.match(/^turbo-carto/)); + assert.ok(layergroup.errors_with_context[0].message.match(/unable\sto\scompute\sramp/i)); + assert.ok(layergroup.errors_with_context[0].message.match(/wadus_column/)); + + assert.equal(layergroup.errors_with_context[0].context.type, 'turbo-carto'); + assert.equal(layergroup.errors_with_context[0].context.layer.index, 0); + assert.equal(layergroup.errors_with_context[0].context.layer.type, 'mapnik'); + + done(); + }); + }); }); From d9297d54dece7ee1f867de4a2b9f2cba0575e808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 13 Jun 2016 16:14:01 +0200 Subject: [PATCH 2/6] made error_with_context non optional and adapted test's assertion --- lib/cartodb/controllers/base.js | 15 ++++----------- .../mapconfig/adapter/turbo-carto-adapter.js | 18 +++++++++--------- test/acceptance/dataviews/error-cases.js | 4 ++-- test/acceptance/limits.js | 4 ++-- test/acceptance/multilayer_server.js | 6 ++---- test/acceptance/named_layers.js | 9 +++------ test/acceptance/named_maps_authentication.js | 12 ++++++------ test/acceptance/named_maps_cache.js | 4 ++-- test/acceptance/ported/attributes.js | 6 +++++- test/acceptance/ported/blend_http_fallback.js | 8 +++----- test/acceptance/ported/external_resources.js | 7 +++---- .../ported/multilayer_error_cases.js | 15 +++++++++------ test/acceptance/ported/raster.js | 3 +-- test/acceptance/ported/regressions.js | 2 +- test/acceptance/ported/retina.js | 2 +- test/acceptance/ported/server.js | 2 +- test/acceptance/templates.js | 5 ++--- test/acceptance/turbo-cartocss/error-cases.js | 13 ++++++++++++- 18 files changed, 68 insertions(+), 67 deletions(-) diff --git a/lib/cartodb/controllers/base.js b/lib/cartodb/controllers/base.js index 8b36c095..b1b8bf6a 100644 --- a/lib/cartodb/controllers/base.js +++ b/lib/cartodb/controllers/base.js @@ -215,14 +215,10 @@ BaseController.prototype.sendError = function(req, res, err, label) { } var errorResponseBody = { - errors: allErrors.map(errorMessage) + errors: allErrors.map(errorMessage), + errors_with_context: allErrors.map(errorMessageWithContext) }; - var errorsWithContext = allErrors.map(errorMessageWithContext).filter(function (err) { return !!err; }); - if (errorsWithContext.length){ - errorResponseBody.errors_with_context = errorsWithContext; - } - this.send(req, res, errorResponseBody, statusCode); }; @@ -240,19 +236,16 @@ function errorMessage(err) { var message = (_.isString(err) ? err : err.message) || 'Unknown error'; return stripConnectionInfo(message); - } function errorMessageWithContext(err) { - if (!err.context) { - return; - } // See https://github.com/Vizzuality/Windshaft-cartodb/issues/68 var message = (_.isString(err) ? err : err.message) || 'Unknown error'; return { + type: err.type || 'unknown', message: stripConnectionInfo(message), - context: err.context + context: err.context || 'unknown' }; } module.exports.errorMessage = errorMessage; diff --git a/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js b/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js index dfdf6414..2756eb2d 100644 --- a/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/turbo-carto-adapter.js @@ -84,16 +84,16 @@ TurboCartoAdapter.prototype._parseCartoCss = function (username, layer, index, c this.turboCartoParser.process(username, layer.options.cartocss, sql, function (err, cartocss) { // Only return turbo-carto errors if (err && err.name === 'TurboCartoError') { - err = new Error('turbo-carto: ' + err.message); - err.http_status = 400; - err.context = { - type: 'turbo-carto', - layer: { - index: index, - type: layer.type - } + var error = new Error('turbo-carto: ' + err.message); + error.http_status = 400; + error.type = 'turbo-carto'; + error.context = err.context; + error.context.layer = { + index: index, + type: layer.type }; - return callback(err); + + return callback(error); } // Try to continue in the rest of the cases diff --git a/test/acceptance/dataviews/error-cases.js b/test/acceptance/dataviews/error-cases.js index ebbfdc34..7e37e8ee 100644 --- a/test/acceptance/dataviews/error-cases.js +++ b/test/acceptance/dataviews/error-cases.js @@ -54,7 +54,7 @@ describe('histogram-dataview', function() { this.testClient.getLayergroup(ERROR_RESPONSE, function(err, errObj) { assert.ok(!err, err); - assert.deepEqual(errObj, { errors: [ '"dataviews" must be a valid JSON object: "string" type found' ] }); + assert.deepEqual(errObj.errors, [ '"dataviews" must be a valid JSON object: "string" type found' ]); done(); }); @@ -66,7 +66,7 @@ describe('histogram-dataview', function() { this.testClient.getLayergroup(ERROR_RESPONSE, function(err, errObj) { assert.ok(!err, err); - assert.deepEqual(errObj, { errors: [ '"dataviews" must be a valid JSON object: "array" type found' ] }); + assert.deepEqual(errObj.errors, [ '"dataviews" must be a valid JSON object: "array" type found' ]); done(); }); diff --git a/test/acceptance/limits.js b/test/acceptance/limits.js index 30a4e739..d0126623 100644 --- a/test/acceptance/limits.js +++ b/test/acceptance/limits.js @@ -106,7 +106,7 @@ describe('render limits', function() { }, function(res) { var parsed = JSON.parse(res.body); - assert.deepEqual(parsed, { errors: [ 'Render timed out' ] }); + assert.deepEqual(parsed.errors, [ 'Render timed out' ]); done(); } ); @@ -171,7 +171,7 @@ describe('render limits', function() { }, function(res) { var parsed = JSON.parse(res.body); - assert.deepEqual(parsed, { errors: ['Render timed out'] }); + assert.deepEqual(parsed.errors, ['Render timed out']); done(); } ); diff --git a/test/acceptance/multilayer_server.js b/test/acceptance/multilayer_server.js index 251ecc38..e4c13b54 100644 --- a/test/acceptance/multilayer_server.js +++ b/test/acceptance/multilayer_server.js @@ -228,7 +228,7 @@ describe('tests from old api translated to multilayer', function() { }, function(res) { var parsed = JSON.parse(res.body); - assert.deepEqual(parsed, { errors: [ 'Unexpected token W' ] }); + assert.deepEqual(parsed.errors, [ 'Unexpected token W' ]); done(); } @@ -334,9 +334,7 @@ describe('tests from old api translated to multilayer', function() { assert.ok(!res.headers.hasOwnProperty('x-cache-channel')); var parsed = JSON.parse(res.body); - assert.deepEqual(parsed, { - errors: ["fake error message"] - }); + assert.deepEqual(parsed.errors, ["fake error message"]); done(); } diff --git a/test/acceptance/named_layers.js b/test/acceptance/named_layers.js index 8788e5a6..2b1cf4ef 100644 --- a/test/acceptance/named_layers.js +++ b/test/acceptance/named_layers.js @@ -181,7 +181,7 @@ describe('named_layers', function() { } var parsedBody = JSON.parse(response.body); - assert.deepEqual(parsedBody, { errors: ["Template 'nonexistent' of user 'localhost' not found"] }); + assert.deepEqual(parsedBody.errors, ["Template 'nonexistent' of user 'localhost' not found"]); return null; }, @@ -234,10 +234,7 @@ describe('named_layers', function() { } var parsedBody = JSON.parse(response.body); - assert.deepEqual( - parsedBody, - { errors: [ "Unauthorized 'auth_valid_template' template instantiation" ] } - ); + assert.deepEqual(parsedBody.errors, [ "Unauthorized 'auth_valid_template' template instantiation" ]); return null; }, @@ -347,7 +344,7 @@ describe('named_layers', function() { } var parsedBody = JSON.parse(response.body); - assert.deepEqual(parsedBody, { errors: [ 'Nested named layers are not allowed' ] }); + assert.deepEqual(parsedBody.errors, ['Nested named layers are not allowed' ]); return null; }, diff --git a/test/acceptance/named_maps_authentication.js b/test/acceptance/named_maps_authentication.js index f984391c..ba791f37 100644 --- a/test/acceptance/named_maps_authentication.js +++ b/test/acceptance/named_maps_authentication.js @@ -169,8 +169,8 @@ describe('named maps authentication', function() { getNamedTile(nonexistentName, 0, 0, 0, { status: 404 }, function(err, res) { assert.ok(!err); assert.deepEqual( - JSON.parse(res.body), - { errors: ["Template '" + nonexistentName + "' of user '" + username + "' not found"] } + JSON.parse(res.body).errors, + ["Template '" + nonexistentName + "' of user '" + username + "' not found"] ); done(); }); @@ -179,7 +179,7 @@ describe('named maps authentication', function() { it('should return 403 if not properly authorized', function(done) { getNamedTile(tokenAuthTemplateName, 0, 0, 0, { status: 403 }, function(err, res) { assert.ok(!err); - assert.deepEqual(JSON.parse(res.body), { errors: ['Unauthorized template instantiation'] }); + assert.deepEqual(JSON.parse(res.body).errors, ['Unauthorized template instantiation']); done(); }); }); @@ -238,8 +238,8 @@ describe('named maps authentication', function() { getStaticMap(nonexistentName, { status: 404 }, function(err, res) { assert.ok(!err); assert.deepEqual( - JSON.parse(res.body), - { errors: ["Template '" + nonexistentName + "' of user '" + username + "' not found"] } + JSON.parse(res.body).errors, + ["Template '" + nonexistentName + "' of user '" + username + "' not found"] ); done(); }); @@ -248,7 +248,7 @@ describe('named maps authentication', function() { it('should return 403 if not properly authorized', function(done) { getStaticMap(tokenAuthTemplateName, { status: 403 }, function(err, res) { assert.ok(!err); - assert.deepEqual(JSON.parse(res.body), { errors: ['Unauthorized template instantiation'] }); + assert.deepEqual(JSON.parse(res.body).errors, ['Unauthorized template instantiation']); done(); }); }); diff --git a/test/acceptance/named_maps_cache.js b/test/acceptance/named_maps_cache.js index a2f2295e..5d121afa 100644 --- a/test/acceptance/named_maps_cache.js +++ b/test/acceptance/named_maps_cache.js @@ -124,8 +124,8 @@ describe('named maps provider cache', function() { getNamedTile({ statusCode: 404 }, function(err, res) { assert.ok(!err); assert.deepEqual( - JSON.parse(res.body), - { errors: ["Template 'template_with_color' of user 'localhost' not found"] } + JSON.parse(res.body).errors, + ["Template 'template_with_color' of user 'localhost' not found"] ); // add template again so it's clean in afterEach diff --git a/test/acceptance/ported/attributes.js b/test/acceptance/ported/attributes.js index 5151cc09..5478bbb6 100644 --- a/test/acceptance/ported/attributes.js +++ b/test/acceptance/ported/attributes.js @@ -231,7 +231,11 @@ describe('attributes', function() { assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body); assert.equal( res.body, - '/**/ typeof test === \'function\' && test({"errors":["Layer 0 has no exposed attributes"]});' + '/**/ typeof test === \'function\' && ' + + 'test({"errors":["Layer 0 has no exposed attributes"],' + + '"errors_with_context":[{' + + '"type":"unknown","message":"Layer 0 has no exposed attributes","context":"unknown"' + + '}]});' ); return null; }, diff --git a/test/acceptance/ported/blend_http_fallback.js b/test/acceptance/ported/blend_http_fallback.js index 91e832f6..480dc5c0 100644 --- a/test/acceptance/ported/blend_http_fallback.js +++ b/test/acceptance/ported/blend_http_fallback.js @@ -138,11 +138,9 @@ describe('blend http fallback', function() { testClient.getTileLayer(mapConfig, tileRequest, expectedResponse, function(err, res) { assert.ok(!err); var parsedBody = JSON.parse(res.body); - assert.deepEqual(parsedBody, { - errors: [ - "Unable to fetch http tile: http://127.0.0.1:8033/error404/1/0/0.png [404]" - ] - }); + assert.deepEqual(parsedBody.errors, [ + "Unable to fetch http tile: http://127.0.0.1:8033/error404/1/0/0.png [404]" + ]); done(); }); }); diff --git a/test/acceptance/ported/external_resources.js b/test/acceptance/ported/external_resources.js index 6f73b52e..11ad5176 100644 --- a/test/acceptance/ported/external_resources.js +++ b/test/acceptance/ported/external_resources.js @@ -119,12 +119,11 @@ describe('external resources', function() { var mapConfig = testClient.defaultTableMapConfig('test_table_3', style); testClient.createLayergroup(mapConfig, { statusCode: 400 }, function(err, res) { - assert.deepEqual(JSON.parse(res.body), { - errors: ["Unable to download '" + url + "' for 'style0' (server returned 404)"] - }); + assert.deepEqual(JSON.parse(res.body).errors, [ + "Unable to download '" + url + "' for 'style0' (server returned 404)"] + ); done(); }); }); }); - diff --git a/test/acceptance/ported/multilayer_error_cases.js b/test/acceptance/ported/multilayer_error_cases.js index 11c11e63..9d59a5b3 100644 --- a/test/acceptance/ported/multilayer_error_cases.js +++ b/test/acceptance/ported/multilayer_error_cases.js @@ -31,7 +31,7 @@ describe('multilayer error cases', function() { }, {}, function(res) { assert.equal(res.statusCode, 400, res.body); var parsedBody = JSON.parse(res.body); - assert.deepEqual(parsedBody, {"errors":["layergroup POST data must be of type application/json"]}); + assert.deepEqual(parsedBody.errors, ["layergroup POST data must be of type application/json"]); done(); }); }); @@ -44,7 +44,7 @@ describe('multilayer error cases', function() { }, {}, function(res) { assert.equal(res.statusCode, 400, res.body); var parsedBody = JSON.parse(res.body); - assert.deepEqual(parsedBody, {"errors":["Missing layers array from layergroup config"]}); + assert.deepEqual(parsedBody.errors, ["Missing layers array from layergroup config"]); done(); }); }); @@ -58,7 +58,10 @@ describe('multilayer error cases', function() { assert.equal(res.statusCode, 200); assert.equal( res.body, - '/**/ typeof test === \'function\' && test({"errors":["Missing layers array from layergroup config"]});' + '/**/ typeof test === \'function\' && ' + + 'test({"errors":["Missing layers array from layergroup config"],' + + '"errors_with_context":[{"type":"unknown",' + + '"message":"Missing layers array from layergroup config","context":"unknown"}]});' ); done(); }); @@ -83,7 +86,7 @@ describe('multilayer error cases', function() { }, {}, function(res) { assert.equal(res.statusCode, 400, res.body); var parsedBody = JSON.parse(res.body); - assert.deepEqual(parsedBody, {errors:["Missing cartocss_version for layer 0 options"]}); + assert.deepEqual(parsedBody.errors, ["Missing cartocss_version for layer 0 options"]); done(); }); }); @@ -355,7 +358,7 @@ describe('multilayer error cases', function() { var mapConfig = testClient.singleLayerMapConfig('select * from test_table', null, null, 'name'); testClient.getGrid(mapConfig, 1, 13, 4011, 3088, defaultErrorExpectedResponse, function(err, res) { - assert.deepEqual(JSON.parse(res.body), { errors: ["Layer '1' not found in layergroup"] }); + assert.deepEqual(JSON.parse(res.body).errors, ["Layer '1' not found in layergroup"]); done(); }); }); @@ -383,7 +386,7 @@ describe('multilayer error cases', function() { // FIXME: should be 404 assert.equal(res.statusCode, 400, res.statusCode + ':' + res.body); var parsed = JSON.parse(res.body); - assert.deepEqual(parsed, {"errors": ["Invalid or nonexistent map configuration token 'deadbeef'"]}); + assert.deepEqual(parsed.errors, ["Invalid or nonexistent map configuration token 'deadbeef'"]); return null; }, function finish(err) { diff --git a/test/acceptance/ported/raster.js b/test/acceptance/ported/raster.js index 2cea4bf4..fc26661b 100644 --- a/test/acceptance/ported/raster.js +++ b/test/acceptance/ported/raster.js @@ -148,11 +148,10 @@ describe('raster', function() { assert.ok(!err); checkCORSHeaders(res); var parsedBody = JSON.parse(res.body); - assert.deepEqual(parsedBody, { errors: [ 'Mapnik raster layers do not support interactivity' ] }); + assert.deepEqual(parsedBody.errors, [ 'Mapnik raster layers do not support interactivity' ]); done(); } ); }); }); - diff --git a/test/acceptance/ported/regressions.js b/test/acceptance/ported/regressions.js index 66c1262f..2a2188c1 100644 --- a/test/acceptance/ported/regressions.js +++ b/test/acceptance/ported/regressions.js @@ -29,7 +29,7 @@ describe('regressions', function() { contentType: 'application/json; charset=utf-8' }; requestTile('/0/0/0.png?testUnexpectedError=1', options, function(err, res) { - assert.deepEqual(JSON.parse(res.body), { "errors": ["test unexpected error"] }); + assert.deepEqual(JSON.parse(res.body).errors, ["test unexpected error"]); finish(done); }); }); diff --git a/test/acceptance/ported/retina.js b/test/acceptance/ported/retina.js index 1c4b16f1..0962619f 100644 --- a/test/acceptance/ported/retina.js +++ b/test/acceptance/ported/retina.js @@ -129,7 +129,7 @@ describe('retina support', function() { }, function(res, err) { assert.ok(!err, 'Failed to request 0/0/0' + scaleFactor + '.png tile'); - assert.deepEqual(JSON.parse(res.body), { errors: ["Tile with specified resolution not found"] } ); + assert.deepEqual(JSON.parse(res.body).errors, ["Tile with specified resolution not found"]); done(); } diff --git a/test/acceptance/ported/server.js b/test/acceptance/ported/server.js index 7d8f2e73..650cf2c5 100644 --- a/test/acceptance/ported/server.js +++ b/test/acceptance/ported/server.js @@ -112,7 +112,7 @@ describe('server', function() { } }; testClient.getGrid(mapConfig, 0, 13, 4011, 3088, expectedResponse, function(err, res) { - assert.deepEqual(JSON.parse(res.body), {"errors":["Tileset has no interactivity"]}); + assert.deepEqual(JSON.parse(res.body).errors, ["Tileset has no interactivity"]); done(); }); }); diff --git a/test/acceptance/templates.js b/test/acceptance/templates.js index e8e0a2ca..7201b7fb 100644 --- a/test/acceptance/templates.js +++ b/test/acceptance/templates.js @@ -1927,9 +1927,8 @@ describe('template_api', function() { if (err) { return done(err); } - assert.deepEqual(JSON.parse(res.body), { - errors: ["Invalid or nonexistent map configuration token '" + nonexistentToken + "'"] - }); + assert.deepEqual(JSON.parse(res.body).errors, + ["Invalid or nonexistent map configuration token '" + nonexistentToken + "'"]); done(); }; diff --git a/test/acceptance/turbo-cartocss/error-cases.js b/test/acceptance/turbo-cartocss/error-cases.js index 23597dd7..8582d753 100644 --- a/test/acceptance/turbo-cartocss/error-cases.js +++ b/test/acceptance/turbo-cartocss/error-cases.js @@ -114,14 +114,25 @@ describe('turbo-carto error cases', function() { assert.ok(layergroup.hasOwnProperty('errors')); assert.equal(layergroup.errors_with_context.length, 1); + assert.equal(layergroup.errors_with_context[0].type, 'turbo-carto'); assert.ok(layergroup.errors_with_context[0].message.match(/^turbo-carto/)); assert.ok(layergroup.errors_with_context[0].message.match(/unable\sto\scompute\sramp/i)); assert.ok(layergroup.errors_with_context[0].message.match(/wadus_column/)); - assert.equal(layergroup.errors_with_context[0].context.type, 'turbo-carto'); assert.equal(layergroup.errors_with_context[0].context.layer.index, 0); assert.equal(layergroup.errors_with_context[0].context.layer.type, 'mapnik'); + assert.equal(layergroup.errors_with_context[0].context.selector, '#populated_places_simple_reduced'); + assert.deepEqual(layergroup.errors_with_context[0].context.source, { + start: { + line: 10, + column: 3 + }, + end: { + line: 10, + column: 56 + } + }); done(); }); }); From ddc99cebff8165e29be22fec4f16b491d0a3931f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 13 Jun 2016 18:40:14 +0200 Subject: [PATCH 3/6] Upgrades turbo-carto to 0.12.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ab86a089..260941b0 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "request": "~2.62.0", "step": "~0.0.6", "step-profiler": "~0.3.0", - "turbo-carto": "0.11.0", + "turbo-carto": "0.12.0", "underscore": "~1.6.0", "windshaft": "2.3.0" }, From 4854e879a6f436519cc08562239c3db9c12dbcfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 13 Jun 2016 19:49:20 +0200 Subject: [PATCH 4/6] Updated npm-shrinkwrap --- npm-shrinkwrap.json | 560 ++++++++++++++++++++++---------------------- 1 file changed, 280 insertions(+), 280 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 47f5116e..50e6a525 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1257,9 +1257,9 @@ "resolved": "https://registry.npmjs.org/step-profiler/-/step-profiler-0.3.0.tgz" }, "turbo-carto": { - "version": "0.11.0", - "from": "turbo-carto@0.11.0", - "resolved": "https://registry.npmjs.org/turbo-carto/-/turbo-carto-0.11.0.tgz", + "version": "0.12.0", + "from": "turbo-carto@0.12.0", + "resolved": "https://registry.npmjs.org/turbo-carto/-/turbo-carto-0.12.0.tgz", "dependencies": { "colorbrewer": { "version": "1.0.0", @@ -2971,6 +2971,11 @@ "from": "abbrev@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz" }, + "ansi-styles": { + "version": "2.2.1", + "from": "ansi-styles@>=2.2.1 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" + }, "ansi": { "version": "0.3.1", "from": "ansi@>=0.3.1 <0.4.0", @@ -2981,221 +2986,201 @@ "from": "ansi-regex@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" }, - "ansi-styles": { - "version": "2.2.1", - "from": "ansi-styles@>=2.2.1 <3.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" + "async": { + "version": "1.5.2", + "from": "async@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" }, "are-we-there-yet": { "version": "1.1.2", "from": "are-we-there-yet@>=1.1.2 <1.2.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz" }, - "asn1": { - "version": "0.2.3", - "from": "asn1@>=0.2.3 <0.3.0", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" - }, - "assert-plus": { - "version": "0.2.0", - "from": "assert-plus@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" - }, - "async": { - "version": "1.5.2", - "from": "async@>=1.5.2 <2.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" - }, - "aws-sign2": { - "version": "0.6.0", - "from": "aws-sign2@>=0.6.0 <0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" - }, - "aws4": { - "version": "1.4.1", - "from": "aws4@>=1.2.1 <2.0.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz" - }, "balanced-match": { "version": "0.4.1", "from": "balanced-match@>=0.4.1 <0.5.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" }, - "block-stream": { - "version": "0.0.9", - "from": "block-stream@*", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz" - }, "boom": { "version": "2.10.1", "from": "boom@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" }, + "aws-sign2": { + "version": "0.6.0", + "from": "aws-sign2@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" + }, + "asn1": { + "version": "0.2.3", + "from": "asn1@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" + }, + "aws4": { + "version": "1.4.1", + "from": "aws4@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz" + }, "brace-expansion": { "version": "1.1.4", "from": "brace-expansion@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz" }, - "caseless": { - "version": "0.11.0", - "from": "caseless@>=0.11.0 <0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz" - }, - "combined-stream": { - "version": "1.0.5", - "from": "combined-stream@>=1.0.5 <1.1.0", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz" - }, - "commander": { - "version": "2.9.0", - "from": "commander@>=2.9.0 <3.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" - }, - "chalk": { - "version": "1.1.3", - "from": "chalk@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" - }, - "concat-map": { - "version": "0.0.1", - "from": "concat-map@0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - }, - "core-util-is": { - "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" - }, - "cryptiles": { - "version": "2.0.5", - "from": "cryptiles@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" - }, "debug": { "version": "2.2.0", "from": "debug@>=2.2.0 <2.3.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz" }, - "delayed-stream": { - "version": "1.0.0", - "from": "delayed-stream@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + "caseless": { + "version": "0.11.0", + "from": "caseless@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz" }, - "deep-extend": { - "version": "0.4.1", - "from": "deep-extend@>=0.4.0 <0.5.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz" + "block-stream": { + "version": "0.0.9", + "from": "block-stream@*", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz" + }, + "commander": { + "version": "2.9.0", + "from": "commander@>=2.9.0 <3.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" + }, + "cryptiles": { + "version": "2.0.5", + "from": "cryptiles@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" }, "delegates": { "version": "1.0.0", "from": "delegates@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" }, - "ecc-jsbn": { - "version": "0.1.1", - "from": "ecc-jsbn@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz" + "chalk": { + "version": "1.1.3", + "from": "chalk@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" + }, + "combined-stream": { + "version": "1.0.5", + "from": "combined-stream@>=1.0.5 <1.1.0", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz" + }, + "concat-map": { + "version": "0.0.1", + "from": "concat-map@0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + }, + "assert-plus": { + "version": "0.2.0", + "from": "assert-plus@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" }, "escape-string-regexp": { "version": "1.0.5", "from": "escape-string-regexp@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, - "extend": { - "version": "3.0.0", - "from": "extend@>=3.0.0 <3.1.0", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" - }, - "extsprintf": { - "version": "1.0.2", - "from": "extsprintf@1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz" - }, - "form-data": { - "version": "1.0.0-rc4", - "from": "form-data@>=1.0.0-rc3 <1.1.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz" - }, "forever-agent": { "version": "0.6.1", "from": "forever-agent@>=0.6.1 <0.7.0", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" }, - "fstream": { - "version": "1.0.9", - "from": "fstream@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.9.tgz" - }, - "fstream-ignore": { - "version": "1.0.4", - "from": "fstream-ignore@>=1.0.3 <1.1.0", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.4.tgz" - }, "gauge": { "version": "1.2.7", "from": "gauge@>=1.2.5 <1.3.0", "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz" }, - "generate-function": { - "version": "2.0.0", - "from": "generate-function@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" + "core-util-is": { + "version": "1.0.2", + "from": "core-util-is@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, - "generate-object-property": { - "version": "1.2.0", - "from": "generate-object-property@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz" + "ecc-jsbn": { + "version": "0.1.1", + "from": "ecc-jsbn@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz" + }, + "form-data": { + "version": "1.0.0-rc4", + "from": "form-data@>=1.0.0-rc3 <1.1.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz" + }, + "delayed-stream": { + "version": "1.0.0", + "from": "delayed-stream@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + }, + "fstream-ignore": { + "version": "1.0.4", + "from": "fstream-ignore@>=1.0.3 <1.1.0", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.4.tgz" }, "glob": { "version": "7.0.3", "from": "glob@>=7.0.0 <8.0.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz" }, - "graceful-fs": { - "version": "4.1.4", - "from": "graceful-fs@>=4.1.2 <5.0.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz" + "extsprintf": { + "version": "1.0.2", + "from": "extsprintf@1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz" + }, + "deep-extend": { + "version": "0.4.1", + "from": "deep-extend@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz" }, "graceful-readlink": { "version": "1.0.1", "from": "graceful-readlink@>=1.0.0", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" }, + "generate-function": { + "version": "2.0.0", + "from": "generate-function@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" + }, "har-validator": { "version": "2.0.6", "from": "har-validator@>=2.0.6 <2.1.0", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz" }, - "has-ansi": { - "version": "2.0.0", - "from": "has-ansi@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" - }, - "has-unicode": { - "version": "2.0.0", - "from": "has-unicode@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.0.tgz" - }, "hawk": { "version": "3.1.3", "from": "hawk@>=3.1.3 <3.2.0", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz" }, + "generate-object-property": { + "version": "1.2.0", + "from": "generate-object-property@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz" + }, "hoek": { "version": "2.16.3", "from": "hoek@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" }, + "fstream": { + "version": "1.0.9", + "from": "fstream@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.9.tgz" + }, + "graceful-fs": { + "version": "4.1.4", + "from": "graceful-fs@>=4.1.2 <5.0.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz" + }, + "ini": { + "version": "1.3.4", + "from": "ini@>=1.3.0 <1.4.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" + }, "http-signature": { "version": "1.1.1", "from": "http-signature@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz" }, - "inflight": { - "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz" - }, "inherits": { "version": "2.0.1", "from": "inherits@>=2.0.1 <2.1.0", @@ -3206,20 +3191,30 @@ "from": "is-my-json-valid@>=2.12.4 <3.0.0", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz" }, - "is-property": { - "version": "1.0.2", - "from": "is-property@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" + "has-ansi": { + "version": "2.0.0", + "from": "has-ansi@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" + }, + "json-schema": { + "version": "0.2.2", + "from": "json-schema@0.2.2", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz" }, "is-typedarray": { "version": "1.0.0", "from": "is-typedarray@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" }, - "isarray": { - "version": "1.0.0", - "from": "isarray@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + "inflight": { + "version": "1.0.4", + "from": "inflight@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz" + }, + "is-property": { + "version": "1.0.2", + "from": "is-property@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" }, "isstream": { "version": "0.1.2", @@ -3231,21 +3226,16 @@ "from": "jodid25519@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz" }, - "jsbn": { - "version": "0.1.0", - "from": "jsbn@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz" - }, - "json-schema": { - "version": "0.2.2", - "from": "json-schema@0.2.2", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz" - }, "json-stringify-safe": { "version": "5.0.1", "from": "json-stringify-safe@>=5.0.1 <5.1.0", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, + "extend": { + "version": "3.0.0", + "from": "extend@>=3.0.0 <3.1.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" + }, "jsonpointer": { "version": "2.0.0", "from": "jsonpointer@2.0.0", @@ -3256,100 +3246,100 @@ "from": "jsprim@>=1.2.2 <2.0.0", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.2.2.tgz" }, + "isarray": { + "version": "1.0.0", + "from": "isarray@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + }, "lodash._baseslice": { "version": "4.0.0", "from": "lodash._baseslice@>=4.0.0 <4.1.0", "resolved": "https://registry.npmjs.org/lodash._baseslice/-/lodash._baseslice-4.0.0.tgz" }, - "ini": { - "version": "1.3.4", - "from": "ini@>=1.3.0 <1.4.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" - }, "lodash._basetostring": { "version": "4.12.0", "from": "lodash._basetostring@>=4.12.0 <4.13.0", "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz" }, - "lodash.pad": { - "version": "4.4.0", - "from": "lodash.pad@>=4.1.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.4.0.tgz" - }, - "lodash.padend": { - "version": "4.5.0", - "from": "lodash.padend@>=4.1.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.5.0.tgz" - }, "lodash.padstart": { "version": "4.5.0", "from": "lodash.padstart@>=4.1.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.5.0.tgz" }, - "lodash.tostring": { - "version": "4.1.3", - "from": "lodash.tostring@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.tostring/-/lodash.tostring-4.1.3.tgz" + "lodash.pad": { + "version": "4.4.0", + "from": "lodash.pad@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.4.0.tgz" + }, + "has-unicode": { + "version": "2.0.0", + "from": "has-unicode@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.0.tgz" }, "mime-db": { "version": "1.23.0", "from": "mime-db@>=1.23.0 <1.24.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz" }, - "mime-types": { - "version": "2.1.11", - "from": "mime-types@>=2.1.7 <2.2.0", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz" + "jsbn": { + "version": "0.1.0", + "from": "jsbn@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz" }, - "minimatch": { - "version": "3.0.0", - "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz" - }, - "minimist": { - "version": "0.0.8", - "from": "minimist@0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "lodash.tostring": { + "version": "4.1.3", + "from": "lodash.tostring@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.tostring/-/lodash.tostring-4.1.3.tgz" }, "mkdirp": { "version": "0.5.1", "from": "mkdirp@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" }, - "ms": { - "version": "0.7.1", - "from": "ms@0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + "minimatch": { + "version": "3.0.0", + "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz" }, - "node-uuid": { - "version": "1.4.7", - "from": "node-uuid@>=1.4.7 <1.5.0", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" + "lodash.padend": { + "version": "4.5.0", + "from": "lodash.padend@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.5.0.tgz" + }, + "minimist": { + "version": "0.0.8", + "from": "minimist@0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" }, "nopt": { "version": "3.0.6", "from": "nopt@>=3.0.1 <3.1.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" }, + "path-is-absolute": { + "version": "1.0.0", + "from": "path-is-absolute@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" + }, "npmlog": { "version": "2.0.3", "from": "npmlog@>=2.0.0 <2.1.0", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.3.tgz" }, - "oauth-sign": { - "version": "0.8.2", - "from": "oauth-sign@>=0.8.1 <0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz" - }, "once": { "version": "1.3.3", "from": "once@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz" }, - "path-is-absolute": { - "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" + "readable-stream": { + "version": "2.1.2", + "from": "readable-stream@>=2.0.0 <3.0.0||>=1.1.13 <2.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.2.tgz" + }, + "qs": { + "version": "6.1.0", + "from": "qs@>=6.1.0 <6.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.1.0.tgz" }, "pinkie": { "version": "2.0.4", @@ -3361,96 +3351,106 @@ "from": "pinkie-promise@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" }, - "process-nextick-args": { - "version": "1.0.7", - "from": "process-nextick-args@>=1.0.6 <1.1.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" + "oauth-sign": { + "version": "0.8.2", + "from": "oauth-sign@>=0.8.1 <0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz" }, - "qs": { - "version": "6.1.0", - "from": "qs@>=6.1.0 <6.2.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.1.0.tgz" - }, - "readable-stream": { - "version": "2.1.2", - "from": "readable-stream@>=2.0.0 <3.0.0||>=1.1.13 <2.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.2.tgz" + "mime-types": { + "version": "2.1.11", + "from": "mime-types@>=2.1.7 <2.2.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz" }, "request": { "version": "2.72.0", "from": "request@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/request/-/request-2.72.0.tgz" }, - "semver": { - "version": "5.1.0", - "from": "semver@>=5.1.0 <5.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz" + "process-nextick-args": { + "version": "1.0.7", + "from": "process-nextick-args@>=1.0.6 <1.1.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, - "rimraf": { - "version": "2.5.2", - "from": "rimraf@>=2.5.0 <2.6.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz" + "ms": { + "version": "0.7.1", + "from": "ms@0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" }, "sntp": { "version": "1.0.9", "from": "sntp@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" }, - "string_decoder": { - "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + "node-uuid": { + "version": "1.4.7", + "from": "node-uuid@>=1.4.7 <1.5.0", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" }, "stringstream": { "version": "0.0.5", "from": "stringstream@>=0.0.4 <0.1.0", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" }, - "strip-ansi": { - "version": "3.0.1", - "from": "strip-ansi@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - }, - "strip-json-comments": { - "version": "1.0.4", - "from": "strip-json-comments@>=1.0.4 <1.1.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz" - }, - "tar": { - "version": "2.2.1", - "from": "tar@>=2.2.0 <2.3.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz" - }, - "supports-color": { - "version": "2.0.0", - "from": "supports-color@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" - }, - "tough-cookie": { - "version": "2.2.2", - "from": "tough-cookie@>=2.2.0 <2.3.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz" + "semver": { + "version": "5.1.0", + "from": "semver@>=5.1.0 <5.2.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz" }, "tunnel-agent": { "version": "0.4.3", "from": "tunnel-agent@>=0.4.1 <0.5.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz" }, - "tweetnacl": { - "version": "0.13.3", - "from": "tweetnacl@>=0.13.0 <0.14.0", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz" + "supports-color": { + "version": "2.0.0", + "from": "supports-color@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + }, + "strip-json-comments": { + "version": "1.0.4", + "from": "strip-json-comments@>=1.0.4 <1.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz" }, "uid-number": { "version": "0.0.6", "from": "uid-number@>=0.0.6 <0.1.0", "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz" }, + "tough-cookie": { + "version": "2.2.2", + "from": "tough-cookie@>=2.2.0 <2.3.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz" + }, + "tweetnacl": { + "version": "0.13.3", + "from": "tweetnacl@>=0.13.0 <0.14.0", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz" + }, + "rimraf": { + "version": "2.5.2", + "from": "rimraf@>=2.5.0 <2.6.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz" + }, + "strip-ansi": { + "version": "3.0.1", + "from": "strip-ansi@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + }, + "tar": { + "version": "2.2.1", + "from": "tar@>=2.2.0 <2.3.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz" + }, "util-deprecate": { "version": "1.0.2", "from": "util-deprecate@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" }, + "string_decoder": { + "version": "0.10.31", + "from": "string_decoder@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + }, "verror": { "version": "1.3.6", "from": "verror@1.3.6", @@ -3466,18 +3466,6 @@ "from": "xtend@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" }, - "bl": { - "version": "1.1.2", - "from": "bl@>=1.1.2 <1.2.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "from": "readable-stream@>=2.0.5 <2.1.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz" - } - } - }, "dashdash": { "version": "1.13.1", "from": "dashdash@>=1.12.0 <2.0.0", @@ -3490,6 +3478,18 @@ } } }, + "bl": { + "version": "1.1.2", + "from": "bl@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", + "dependencies": { + "readable-stream": { + "version": "2.0.6", + "from": "readable-stream@>=2.0.5 <2.1.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz" + } + } + }, "getpass": { "version": "0.1.6", "from": "getpass@>=0.1.1 <0.2.0", @@ -3502,6 +3502,18 @@ } } }, + "tar-pack": { + "version": "3.1.3", + "from": "tar-pack@>=3.1.0 <3.2.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.3.tgz", + "dependencies": { + "readable-stream": { + "version": "2.0.6", + "from": "readable-stream@>=2.0.4 <2.1.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz" + } + } + }, "rc": { "version": "1.1.6", "from": "rc@>=1.1.0 <1.2.0", @@ -3525,18 +3537,6 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" } } - }, - "tar-pack": { - "version": "3.1.3", - "from": "tar-pack@>=3.1.0 <3.2.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.3.tgz", - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "from": "readable-stream@>=2.0.4 <2.1.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz" - } - } } } }, From 0540696c3ee6768c60e882f55abaed578cdcade5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 14 Jun 2016 10:27:35 +0200 Subject: [PATCH 5/6] Avoid to expose internal naming --- .../models/mapconfig/adapter/analysis-mapconfig-adapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js index ffbe962b..46f5185a 100644 --- a/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/analysis-mapconfig-adapter.js @@ -62,7 +62,7 @@ AnalysisMapConfigAdapter.prototype.getMapConfig = function(user, requestMapConfi self.analysisBackend.create(analysisConfiguration, analysisDefinition, function (err, analysis) { if (err) { err.context = { - type: 'camshaft', + type: 'analysis', analysis: { index: index, id: analysisDefinition.id, From c16d0b86051361428e1a58a7a7a1f46ae2b39181 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 14 Jun 2016 10:50:50 +0200 Subject: [PATCH 6/6] Fixed broken tests --- test/acceptance/analysis/error-cases.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/acceptance/analysis/error-cases.js b/test/acceptance/analysis/error-cases.js index 4358b1cb..c876f147 100644 --- a/test/acceptance/analysis/error-cases.js +++ b/test/acceptance/analysis/error-cases.js @@ -116,7 +116,7 @@ describe('analysis-layers error cases', function() { 'Analysis requires authentication with API key: permission denied.' ); - assert.equal(layergroupResult.errors_with_context[0].context.type, 'camshaft'); + assert.equal(layergroupResult.errors_with_context[0].context.type, 'analysis'); assert.equal(layergroupResult.errors_with_context[0].context.analysis.index, 0); assert.equal(layergroupResult.errors_with_context[0].context.analysis.id, 'HEAD'); assert.equal(layergroupResult.errors_with_context[0].context.analysis.type, 'buffer'); @@ -169,7 +169,7 @@ describe('analysis-layers error cases', function() { 'Missing required param "radius"' ); - assert.equal(layergroupResult.errors_with_context[0].context.type, 'camshaft'); + assert.equal(layergroupResult.errors_with_context[0].context.type, 'analysis'); assert.equal(layergroupResult.errors_with_context[0].context.analysis.index, 0); assert.equal(layergroupResult.errors_with_context[0].context.analysis.id, 'HEAD'); assert.equal(layergroupResult.errors_with_context[0].context.analysis.type, 'buffer');