From fed953d1950b3880bba458b2707b5e19985f225b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 24 Apr 2017 18:55:08 +0200 Subject: [PATCH 01/29] Support mvt tiles --- test/support/test-client.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/test/support/test-client.js b/test/support/test-client.js index 75fa51e0..5998912f 100644 --- a/test/support/test-client.js +++ b/test/support/test-client.js @@ -485,6 +485,13 @@ TestClient.prototype.getTile = function(z, x, y, params, callback) { expectedResponse.headers['Content-Type'] = 'image/png'; } + var isMvt = format.match(/mvt$/); + + if (isMvt) { + request.encoding = 'binary'; + expectedResponse.headers['Content-Type'] = 'application/x-protobuf'; + } + assert.response(server, request, expectedResponse, function(res, err) { assert.ifError(err); @@ -492,7 +499,13 @@ TestClient.prototype.getTile = function(z, x, y, params, callback) { if (isPng) { obj = mapnik.Image.fromBytes(new Buffer(res.body, 'binary')); - } else { + } + else if (isMvt) { + obj = new mapnik.VectorTile(z, x, y); + obj.setDataSync(new Buffer(res.body, 'binary')); + } + + else { obj = JSON.parse(res.body); } From 06353941e6ef6200e7130e2ccf0389b10c098996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 24 Apr 2017 18:56:15 +0200 Subject: [PATCH 02/29] Implement test to exercise buffer-size configuration by format --- test/acceptance/buffer-size-format.js | 124 ++++++++++++++++++ .../tile-7.64.48-buffer-size-1.png | Bin 0 -> 1379 bytes .../tile-7.64.48-buffer-size-128.png | Bin 0 -> 2458 bytes 3 files changed, 124 insertions(+) create mode 100644 test/acceptance/buffer-size-format.js create mode 100644 test/fixtures/buffer-size/tile-7.64.48-buffer-size-1.png create mode 100644 test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.png diff --git a/test/acceptance/buffer-size-format.js b/test/acceptance/buffer-size-format.js new file mode 100644 index 00000000..bbf643bc --- /dev/null +++ b/test/acceptance/buffer-size-format.js @@ -0,0 +1,124 @@ +require('../support/test_helper'); + +var assert = require('../support/assert'); +var TestClient = require('../support/test-client'); +var IMAGE_TOLERANCE_PER_MIL = 20; +var mapnik = require('windshaft').mapnik; + +function createMapConfig (bufferSize) { + return { + version: '1.6.0', + buffersize: bufferSize, + layers: [{ + type: "cartodb", + options: { + sql: [ + 'select', + ' *', + 'from', + ' populated_places_simple_reduced', + ].join('\n'), + cartocss: [ + '#layer {', + ' polygon-fill: #374C70;', + ' polygon-opacity: 0.9;', + ' line-width: 1;', + ' line-color: #FFF;', + ' line-opacity: 0.5;', + '}', + '#layer::labels {', + ' text-name: [name];', + ' text-face-name: \'DejaVu Sans Book\';', + ' text-size: 20;', + ' text-fill: #FFFFFF;', + ' text-label-position-tolerance: 0;', + ' text-halo-radius: 1;', + ' text-halo-fill: #6F808D;', + ' text-dy: -10;', + ' text-allow-overlap: true;', + ' text-placement: point;', + ' text-placement-type: dummy;', + '}' + ].join('\n'), + cartocss_version: '2.3.0', + interactivity: 'cartodb_id' + } + }] + }; +} + +describe.only('buffer size per format', function () { + var testCases = [ + { + desc: 'should get png tile using buffer-size 1', + coords: { z: 7, x: 64, y: 48 }, + format: 'png', + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-1.png', + mapConfig: createMapConfig({ png: 1, 'grid.json': 1 }), + assert: function (tile, callback) { + assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); + } + }, + { + desc: 'should get png tile using buffer-size 128', + coords: { z: 7, x: 64, y: 48 }, + format: 'png', + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.png', + mapConfig: createMapConfig({ png: 128, 'grid.json': 128 }), + assert: function (tile, callback) { + assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); + } + }, + { + desc: 'should get mvt tile using buffer-size 1', + coords: { z: 7, x: 64, y: 48 }, + format: 'mvt', + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-1.png', + mapConfig: createMapConfig({ mvt: 1 }), + assert: function (tile, callback) { + var tileJSON = tile.toJSON(); + var features = tileJSON[0].features; + assert.equal(features.length, 1); + + var map = new mapnik.Map(256, 256); + tile.render(map, new mapnik.Image(256, 256), function (err, image) { + assert.ifError(err); + assert.imageIsSimilarToFile(image, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); + }.bind(this)); + } + }, + { + desc: 'should get mvt tile using buffer-size 128', + coords: { z: 7, x: 64, y: 48 }, + format: 'mvt', + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.png', + mapConfig: createMapConfig({ mvt: 128 }), + assert: function (tile, callback) { + var tileJSON = tile.toJSON(); + var features = tileJSON[0].features + assert.equal(features.length, 9); + + var map = new mapnik.Map(256, 256); + tile.render(map, new mapnik.Image(256, 256), function (err, image) { + assert.ifError(err); + assert.imageIsSimilarToFile(image, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); + }.bind(this)); + } + } + ]; + + testCases.forEach(function (test) { + it(test.desc, function (done) { + var testClient = new TestClient(test.mapConfig, 1234); + var coords = test.coords; + testClient.getTile(coords.z, coords.x, coords.y, { format: test.format }, function (err, res, tile) { + assert.ifError(err); + // To generate images use: + // tile.save(test.fixturePath); + test.assert(tile, function () { + testClient.drain(done); + }); + }); + }); + }); +}); \ No newline at end of file diff --git a/test/fixtures/buffer-size/tile-7.64.48-buffer-size-1.png b/test/fixtures/buffer-size/tile-7.64.48-buffer-size-1.png new file mode 100644 index 0000000000000000000000000000000000000000..798f7ccaf80dc1cf5c2ba2a79ee1827b85156b96 GIT binary patch literal 1379 zcmd7S|2xwO00;2TN1rCz(rtA(GM;187v?B(>hWbd?NQAQHRRLovbj57c3C1~#pBEF zC{Km3_Sq#5GK509jUHEIeK~}*4fhyp8%E_@u6@q^5%)az{^kAt?e*JR5OORCXa0pb z0021J;Xnoefa?&Y*;;+(>%%uP*qS#!;vxjvSyTLYRlhKMmoq0IzIe!18&mxUz-INEbI+{!ZdEO=kB z*fn*P9q~tWgos==qw@C9yg2qwritT>)Nfd4|2G*HJy$H(BQrP>=}w1N1P+dx)q~$S zy7i=g@<@pfN7XTnM%FD|XJq)pk#Vl7g=bn$_g!lqmBsQs!iOja-|9_`IRY5{^;)%z z>x!mLO)tHtbndg9rg-+yFDRZ#*S;MjWrs#_I0&4mx)#ot|Mq22g^gF@-gJvhA#_*U zxngs1Z7)33ler%awY;ryedbmDQeiS#`O#O-FXe?i_DPO2OEHDUKI^>fuq@NQ_lcbHStnP*y+-(+a~` zYBrS83Z*O^4O^7`wVL%9@0Yuc=DgXgI*#@& zmSFeVl=k?2bDv2fExz~B+q0e*X@Jg@dA!x#7;AFSP>KP(k`F%|bGlqM`e06( z7 zvCJ^DkIM3;=1JURV26>AzNAEje*g96T5TE?|3WwB!aSWz@GCLC^Hvm(qwUuDL02*| zc-zGZDun*h-v4Cebi5O&R_<|`ew|JOR)wayeT(-ru#3tFT_Ay6IIfY;sWMnde(W~0 z*Q3^@vGS{|4z%og@O&FJyLupi?A*dX8xOY%D`>J;(lC?WxF)E$FX-oNU!ox*( z)s|HN0O+DzkDLMkkR}BIziMd~-{{Ao000X@9dYu!`bac_4)+V$qW#UAK+6l-D25tb zcMAQ37wpUPU+4Rm4uU|_K|ti@N0WCHPQcoWQ2d^?Fwql2e>&{2FPsx&6(cSIwm^F5M;@Gr(*~*AS^M?OlEZyDw zWHvsfLY(Pc@PsAw8_+wOnU?CQkD11&PiyZh{>X4>#7p8i+t^`ot@&bF10gf*lCZH@ z_Ja%IY^vwHGu%>bWVlEKcNU?5=>z_XhS;gO2LBAFfzREA<4q)abRP7(vWTyLPHR0N zq~}&G+l$U|t!h{XUy+A?yqxqqE5S#?;8@+WBQD1UUee)hrt=8U;JkZ3xrh{MrzUYY z+XP{EkWz(s^h>hhu>K@pYJ{(a!Ee0$=wV;0`i#}VHZ?|Ka3l2c+g-69ZcuYL-b*R| zLw)s%qW2!gArkVOViPYW8CG`rDZ8S1T|22zb;nZMO^7zKks&HP;2)9Ma-!euYd(#sCNiMri2L_)p8GM(eu2758b|*#eNBn0bEo?~WNxw$R6o+SSh{ zQ%8TVUEJP0r2_crMQXMcZ;zE8YORUunu#sVjQh>1i3;2>++Es)`gM>*Ez95kkg_Ly z#+iEa8Eo#RzeXhJO7jnLjD&02O^T9j}q+25-aSgnc+N;xHVX}(LRwwz-D9W%ny_ZxTXRvTu z&8~&@3GXTk2RcV=TXJobze%T3%lRQq@{-GSb(x&d}bVklCgb)o4$Ic9U8?~UD=&vcz~FqX`y z3;H%H1l^10*<(wS&Za6CNK;fDL(SYOqPsACv56w%fXeT`wm+W%#o{oe>nokz*ws$_iW7Yl{1EOyf+7XhB=0{qu7V z@tfxI?PFE9K2Mgv=Twf>#M2SNa-?7VmDx0e;D>9!pG>UMi_10(5Q~ILe_S2IC?K^7 z^!%u^7kTNc{@638xaG<6QH^z2ZW)dPAvQ4=SZFXpz=8tmX@!3Cln5uy6|3*j81YPR zRVJH)0?)ifv|e+G=GFE;V5hwP+HT1;nu!@qi`hL8Ix@kk&IT+?HX9T!39P(i*OrBq zO^DVTb4Xvb!=Lu{9D3cmIA2NMMYy6YW{e|ez_a+H(jqvw11*tNzNvp!Yl0Ss|zr7dA9ik)!9 zCx9eH<22qh{C2UPB7j$|6S6MRwbR*@^^Onb^4NIsC~V@CRk&btA!$$h*dEZ%=aj~) z<>;-3_2Tff{nHuOGqDW|VLqYjGB#@w^2b>*1n`&cP`?FY+!fux$5u5K9BSxXK(+;m z{v(%QHN@>X{dkr_7a8uNK6P+T;aQeceVbq*Hgc`n>7uB}RI)iNjCoe)lGO?fewre; z>6Ggr4?rhUQjq=+e+d_hDQG_2$yYoa@`h_;efsuLtO*Q`oW4ejcIc8lG8<7rmp|xa z#_o@*m@PIXlgC*Dg+T9J{&PDwI`sVt=H!8v!U&SM2lloyz|PvtEp`8!iDR&F-VmPi z$|-*+<&n!Uj+M_2_OXI`H<&^ynh(-JX}hTUQ8T$=vribK-kI#hFH3DXJCl3+`D*B^H?F<8upaSLiaM=AqV2YuJ@VlhWiGO zUh5AohZXe!-wPabEIQ^KbE^5bolS)M2f+FMK5{1^DDYqhUVXC+dYLXg zX6?Q#k5lfZS`A>vvyYP#59w(gd_%()t6$Mxn5G{N8mQ;5yEB*;LcTO{TjqDD&_i}E zVl|$StWc`3qQziKjLDHK`LXeVlE}goY_9FRd*dQvn4+?w=0K-OxaIKLDD<|Xy39>+ zPjOS<-uo2d;$4UsxS49-XnjYeGy6&A`6`mUY()lDu(!WC7YAbAniSFOY+smHed)vK zDjrccWYoA2-7U;kEn-}N`i4_XSFr0m&A`PD@dXb)<4V_hyVem*^`fJIcuO)I)Vw$A zErqz?`t#_;(> Date: Mon, 24 Apr 2017 18:57:20 +0200 Subject: [PATCH 03/29] Remove filter --- test/acceptance/buffer-size-format.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/acceptance/buffer-size-format.js b/test/acceptance/buffer-size-format.js index bbf643bc..b311d01d 100644 --- a/test/acceptance/buffer-size-format.js +++ b/test/acceptance/buffer-size-format.js @@ -47,7 +47,7 @@ function createMapConfig (bufferSize) { }; } -describe.only('buffer size per format', function () { +describe('buffer size per format', function () { var testCases = [ { desc: 'should get png tile using buffer-size 1', From 383a1a330a61a734096b28ae1fed01b4c2ab2184 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 25 Apr 2017 10:43:07 +0200 Subject: [PATCH 04/29] Test with buffer-size 0 --- test/acceptance/buffer-size-format.js | 12 ++++++------ ...er-size-1.png => tile-7.64.48-buffer-size-0.png} | Bin 2 files changed, 6 insertions(+), 6 deletions(-) rename test/fixtures/buffer-size/{tile-7.64.48-buffer-size-1.png => tile-7.64.48-buffer-size-0.png} (100%) diff --git a/test/acceptance/buffer-size-format.js b/test/acceptance/buffer-size-format.js index b311d01d..1e84f417 100644 --- a/test/acceptance/buffer-size-format.js +++ b/test/acceptance/buffer-size-format.js @@ -50,11 +50,11 @@ function createMapConfig (bufferSize) { describe('buffer size per format', function () { var testCases = [ { - desc: 'should get png tile using buffer-size 1', + desc: 'should get png tile using buffer-size 0', coords: { z: 7, x: 64, y: 48 }, format: 'png', - fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-1.png', - mapConfig: createMapConfig({ png: 1, 'grid.json': 1 }), + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png', + mapConfig: createMapConfig({ png: 0, 'grid.json': 0 }), assert: function (tile, callback) { assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); } @@ -70,11 +70,11 @@ describe('buffer size per format', function () { } }, { - desc: 'should get mvt tile using buffer-size 1', + desc: 'should get mvt tile using buffer-size 0', coords: { z: 7, x: 64, y: 48 }, format: 'mvt', - fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-1.png', - mapConfig: createMapConfig({ mvt: 1 }), + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png', + mapConfig: createMapConfig({ mvt: 0 }), assert: function (tile, callback) { var tileJSON = tile.toJSON(); var features = tileJSON[0].features; diff --git a/test/fixtures/buffer-size/tile-7.64.48-buffer-size-1.png b/test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png similarity index 100% rename from test/fixtures/buffer-size/tile-7.64.48-buffer-size-1.png rename to test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png From 0c08713521d615b8183bc1e78e60d3368b3fcc2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 25 Apr 2017 14:34:17 +0200 Subject: [PATCH 05/29] First attempt: support buffer-size configuration for named maps --- lib/cartodb/backends/template_maps.js | 5 + test/acceptance/buffer-size-format.js | 118 ++++++++++++++---- test/support/test-client.js | 165 +++++++++++++++++++++++++- 3 files changed, 261 insertions(+), 27 deletions(-) diff --git a/lib/cartodb/backends/template_maps.js b/lib/cartodb/backends/template_maps.js index bb728181..60a6de2c 100644 --- a/lib/cartodb/backends/template_maps.js +++ b/lib/cartodb/backends/template_maps.js @@ -474,6 +474,11 @@ TemplateMaps.prototype.instance = function(template, params) { // NOTE: we're deep-cloning the layergroup here var layergroup = JSON.parse(JSON.stringify(template.layergroup)); + + if (layergroup.buffersize) { + layergroup.buffersize = _replaceVars(layergroup.buffersize, all_params); + } + for (var i=0; i', + layers: [{ + type: 'cartodb', + options: { + sql: [ + 'select', + ' *', + 'from', + ' populated_places_simple_reduced', + ].join('\n'), + cartocss: cartocss, + cartocss_version: '2.3.0', + interactivity: 'cartodb_id' + } + }] + } + } +} + +describe.only('buffer size per format for named maps', function () { + var testCases = [ + { + desc: 'should get png tile using buffer-size 0', + coords: { z: 7, x: 64, y: 48 }, + format: 'png', + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png', + template: createBufferSizeTemplate('named-buffer-size'), + assert: function (tile, callback) { + assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); + } + } + ]; + + testCases.forEach(function (test) { + it(test.desc, function (done) { + var testClient = new TestClient(undefined, 1234, test.template); + var coords = test.coords; + testClient.getNamedTile(coords.z, coords.x, coords.y, { format: test.format }, function (err, res, tile) { + assert.ifError(err); + // To generate images use: + // tile.save('./test/fixtures/buffer-size/tile-7.64.48-buffer-size-64.png'); + test.assert(tile, function () { + testClient.drain(done); + }); + }); + }); + }); +}); diff --git a/test/support/test-client.js b/test/support/test-client.js index 5998912f..578be296 100644 --- a/test/support/test-client.js +++ b/test/support/test-client.js @@ -16,9 +16,10 @@ var serverOptions = require('../../lib/cartodb/server_options'); serverOptions.analysis.batch.inlineExecution = true; var server = new CartodbWindshaft(serverOptions); -function TestClient(mapConfig, apiKey) { +function TestClient(mapConfig, apiKey, template) { this.mapConfig = mapConfig; this.apiKey = apiKey; + this.template = template; this.keysToDelete = {}; } @@ -696,3 +697,165 @@ module.exports.getStaticMap = function getStaticMap(templateName, params, callba }); }); }; + +TestClient.prototype.getNamedTile = function(z, x, y, params, callback) { + if (!this.template) { + throw new Error('Template is not defined'); + } + + var self = this; + + if (!callback) { + callback = params; + params = {}; + } + + if (!params.placeholders) { + params.placeholder = {}; + } + + var urlNamed = '/api/v1/map/named'; + var url = '/api/v1/map'; + + + if (this.apiKey) { + url += '?' + qs.stringify({api_key: this.apiKey}); + } + + var templateName; + var layergroupId; + step( + function createTemplate () { + var next = this; + console.log(urlNamed + '?' + qs.stringify({api_key: self.apiKey})) + assert.response(server, + { + url: urlNamed + '?' + qs.stringify({api_key: self.apiKey}), + method: 'POST', + headers: { + host: 'localhost', + 'Content-Type': 'application/json' + }, + data: JSON.stringify(self.template) + }, + { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }, + function (res, err) { + if (err) { + return next(err); + } + return next(null, JSON.parse(res.body).template_id); + } + ); + }, + function createLayergroup(err, templateId) { + var next = this; + console.log(urlNamed + '/' + templateId + '?' + qs.stringify({api_key: self.apiKey})) + assert.response(server, + { + url: urlNamed + '/' + templateId + '?' + qs.stringify({api_key: self.apiKey}), + method: 'POST', + headers: { + host: 'localhost', + 'Content-Type': 'application/json' + }, + data: JSON.stringify(params.placeholders) + }, + { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }, + function(res, err) { + if (err) { + return next(err); + } + return next(null, JSON.parse(res.body).layergroupid); + } + ); + }, + function getTileResult(err, _layergroupId) { + assert.ifError(err); + + var next = this; + layergroupId = _layergroupId; + + url = '/api/v1/map/' + layergroupId + '/'; + + var layers = params.layers; + + if (layers !== undefined) { + layers = Array.isArray(layers) ? layers : [layers]; + url += layers.join(',') + '/'; + } + + var format = params.format || 'png'; + + url += [z,x,y].join('/'); + url += '.' + format; + + if (self.apiKey) { + url += '?' + qs.stringify({api_key: self.apiKey}); + } + + var request = { + url: url, + method: 'GET', + headers: { + host: 'localhost' + } + }; + + var expectedResponse = { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }; + + var isPng = format.match(/png$/); + + if (isPng) { + request.encoding = 'binary'; + expectedResponse.headers['Content-Type'] = 'image/png'; + } + + var isMvt = format.match(/mvt$/); + + if (isMvt) { + request.encoding = 'binary'; + expectedResponse.headers['Content-Type'] = 'application/x-protobuf'; + } + + assert.response(server, request, expectedResponse, function(res, err) { + assert.ifError(err); + + var obj; + + if (isPng) { + obj = mapnik.Image.fromBytes(new Buffer(res.body, 'binary')); + } + else if (isMvt) { + obj = new mapnik.VectorTile(z, x, y); + obj.setDataSync(new Buffer(res.body, 'binary')); + } + + else { + obj = JSON.parse(res.body); + } + + next(null, res, obj); + }); + }, + function finish(err, res, image) { + self.keysToDelete['map_cfg|' + LayergroupToken.parse(layergroupId).token] = 0; + self.keysToDelete['user:localhost:mapviews:global'] = 5; + return callback(err, res, image); + } + ); +}; From f29ee1b4aca88f066fd53e2f7d14da363168203a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 25 Apr 2017 15:48:23 +0200 Subject: [PATCH 06/29] Add test to use placeholder buffer-size value --- test/acceptance/buffer-size-format.js | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/test/acceptance/buffer-size-format.js b/test/acceptance/buffer-size-format.js index 82b83fff..6df3914c 100644 --- a/test/acceptance/buffer-size-format.js +++ b/test/acceptance/buffer-size-format.js @@ -118,7 +118,7 @@ describe('buffer size per format', function () { testClient.getTile(coords.z, coords.x, coords.y, { format: test.format }, function (err, res, tile) { assert.ifError(err); // To generate images use: - tile.save(test.fixturePath); + // tile.save(test.fixturePath); test.assert(tile, function () { testClient.drain(done); }); @@ -159,14 +159,25 @@ function createBufferSizeTemplate (name, cartocss) { } } -describe.only('buffer size per format for named maps', function () { +describe('buffer size per format for named maps', function () { var testCases = [ { - desc: 'should get png tile using buffer-size 0', + desc: 'should get png tile using buffer-size 0 (default value in template)', coords: { z: 7, x: 64, y: 48 }, format: 'png', fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png', - template: createBufferSizeTemplate('named-buffer-size'), + template: createBufferSizeTemplate('named-default-buffer-size'), + assert: function (tile, callback) { + assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); + } + }, + { + desc: 'should get png tile using buffer-size 128 (placehoder value)', + coords: { z: 7, x: 64, y: 48 }, + format: 'png', + placeholders: { buffersize: 128 }, + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.png', + template: createBufferSizeTemplate('named-custom-buffer-size'), assert: function (tile, callback) { assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); } @@ -177,7 +188,11 @@ describe.only('buffer size per format for named maps', function () { it(test.desc, function (done) { var testClient = new TestClient(undefined, 1234, test.template); var coords = test.coords; - testClient.getNamedTile(coords.z, coords.x, coords.y, { format: test.format }, function (err, res, tile) { + var options = { + format: test.format, + placeholders: test.placeholders + } + testClient.getNamedTile(coords.z, coords.x, coords.y, options, function (err, res, tile) { assert.ifError(err); // To generate images use: // tile.save('./test/fixtures/buffer-size/tile-7.64.48-buffer-size-64.png'); From 0577fa530821c3d85bda3b61fcba90d86ad40135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 25 Apr 2017 17:54:31 +0200 Subject: [PATCH 07/29] Add test --- test/acceptance/buffer-size-format.js | 65 +++++++++++++++++---------- 1 file changed, 42 insertions(+), 23 deletions(-) diff --git a/test/acceptance/buffer-size-format.js b/test/acceptance/buffer-size-format.js index 6df3914c..80a75a24 100644 --- a/test/acceptance/buffer-size-format.js +++ b/test/acceptance/buffer-size-format.js @@ -26,7 +26,7 @@ var CARTOCSS_LABELS = [ ' text-placement: point;', ' text-placement-type: dummy;', '}' -].join('\n') +].join('\n'); function createMapConfig (bufferSize, cartocss) { cartocss = cartocss || CARTOCSS_LABELS; @@ -99,7 +99,7 @@ describe('buffer size per format', function () { mapConfig: createMapConfig({ mvt: 128 }), assert: function (tile, callback) { var tileJSON = tile.toJSON(); - var features = tileJSON[0].features + var features = tileJSON[0].features; assert.equal(features.length, 9); var map = new mapnik.Map(256, 256); @@ -127,39 +127,23 @@ describe('buffer size per format', function () { }); }); -function createBufferSizeTemplate (name, cartocss) { +function createBufferSizeTemplate (name, buffersize, placeholders, cartocss) { cartocss = cartocss || CARTOCSS_LABELS; + return { "version": "0.0.1", "name": name, - "placeholders": { + "placeholders": placeholders || { "buffersize": { "type": "number", "default": "0" } }, - "layergroup": { - version: '1.6.0', - buffersize: '<%= buffersize %>', - layers: [{ - type: 'cartodb', - options: { - sql: [ - 'select', - ' *', - 'from', - ' populated_places_simple_reduced', - ].join('\n'), - cartocss: cartocss, - cartocss_version: '2.3.0', - interactivity: 'cartodb_id' - } - }] - } + "layergroup": createMapConfig(buffersize) } } -describe('buffer size per format for named maps', function () { +describe.only('buffer size per format for named maps', function () { var testCases = [ { desc: 'should get png tile using buffer-size 0 (default value in template)', @@ -181,6 +165,41 @@ describe('buffer size per format for named maps', function () { assert: function (tile, callback) { assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); } + }, + { + desc: 'should get png tile using buffer-size 0 (default value in template by format)', + coords: { z: 7, x: 64, y: 48 }, + format: 'png', + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png', + template: createBufferSizeTemplate('named-default-buffer-size-by-format', { + png: '<%= buffersize_png %>' + }, { + "buffersize_png": { + "type": "number", + "default": "0" + } + }), + assert: function (tile, callback) { + assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); + } + }, + { + desc: 'should get png tile using buffer-size 128 (placehoder value in template by format)', + coords: { z: 7, x: 64, y: 48 }, + format: 'png', + placeholders: { buffersize: 128 }, + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.png', + template: createBufferSizeTemplate('named-custom-buffer-size-by-format', { + png: '<%= buffersize_png %>' + }, { + "buffersize_png": { + "type": "number", + "default": "0" + } + }), + assert: function (tile, callback) { + assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); + } } ]; From 7ea7a991aa2fc26470e72ead739d27a755a10cc2 Mon Sep 17 00:00:00 2001 From: Mario de Frutos Date: Tue, 25 Apr 2017 19:27:31 +0200 Subject: [PATCH 08/29] Buffersize customizable through named maps' placeholders --- lib/cartodb/backends/template_maps.js | 21 ++++++++++++---- test/acceptance/buffer-size-format.js | 36 ++++++++++++++------------- test/support/test-client.js | 10 ++++---- 3 files changed, 40 insertions(+), 27 deletions(-) diff --git a/lib/cartodb/backends/template_maps.js b/lib/cartodb/backends/template_maps.js index 60a6de2c..5d856976 100644 --- a/lib/cartodb/backends/template_maps.js +++ b/lib/cartodb/backends/template_maps.js @@ -296,7 +296,7 @@ TemplateMaps.prototype.delTemplate = function(owner, tpl_id, callback) { // @param callback function(err) // TemplateMaps.prototype.updTemplate = function(owner, tpl_id, template, callback) { - + var self = this; template = templateDefaults(template); @@ -430,13 +430,15 @@ var _reNumber = /^([-+]?[\d\.]?\d+([eE][+-]?\d+)?)$/, _reCSSColorVal = /^#[0-9a-fA-F]{3,6}$/; function _replaceVars (str, params) { - //return _.template(str, params); // lazy way, possibly dangerous // Construct regular expressions for each param - Object.keys(params).forEach(function(k) { + Object.keys(params).forEach(function(k) { str = str.replace(new RegExp("<%=\\s*" + k + "\\s*%>", "g"), params[k]); }); return str; } +function isDictionary(val) { + return ( _.isObject(val) && !_.isArray(val) && !_.isFunction(val)); +} TemplateMaps.prototype.instance = function(template, params) { var all_params = {}; var phold = template.placeholders || {}; @@ -465,6 +467,11 @@ TemplateMaps.prototype.instance = function(template, params) { throw new Error("Invalid css_color value for template parameter '" + k + "': " + val); } } + else if ( type === 'dictionary' ) { + if (!isDictionary(val)) { + throw new Error("Invalid dictionary value for template parameter '" + k + "': " + val); + } + } else { // NOTE: should be checked at template create/update time throw new Error("Invalid placeholder type '" + type + "'"); @@ -475,8 +482,12 @@ TemplateMaps.prototype.instance = function(template, params) { // NOTE: we're deep-cloning the layergroup here var layergroup = JSON.parse(JSON.stringify(template.layergroup)); - if (layergroup.buffersize) { - layergroup.buffersize = _replaceVars(layergroup.buffersize, all_params); + if (typeof layergroup.buffersize === 'string') { + layergroup.buffersize = Number(_replaceVars(layergroup.buffersize, all_params)); + } else if (isDictionary(layergroup.buffersize)) { + Object.keys(layergroup.buffersize).forEach(function(k) { + layergroup.buffersize[k] = Number(_replaceVars(layergroup.buffersize[k], all_params)); + }); } for (var i=0; i'), assert: function (tile, callback) { assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); } @@ -161,7 +161,7 @@ describe.only('buffer size per format for named maps', function () { format: 'png', placeholders: { buffersize: 128 }, fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.png', - template: createBufferSizeTemplate('named-custom-buffer-size'), + template: createBufferSizeTemplate('named-custom-buffer-size', '<%= buffersize %>'), assert: function (tile, callback) { assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); } @@ -170,9 +170,10 @@ describe.only('buffer size per format for named maps', function () { desc: 'should get png tile using buffer-size 0 (default value in template by format)', coords: { z: 7, x: 64, y: 48 }, format: 'png', + placeholders: { buffersize_png: 0 }, fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png', - template: createBufferSizeTemplate('named-default-buffer-size-by-format', { - png: '<%= buffersize_png %>' + template: createBufferSizeTemplate('named-default-buffer-size-by-format', { + png: '<%= buffersize_png %>' }, { "buffersize_png": { "type": "number", @@ -187,10 +188,10 @@ describe.only('buffer size per format for named maps', function () { desc: 'should get png tile using buffer-size 128 (placehoder value in template by format)', coords: { z: 7, x: 64, y: 48 }, format: 'png', - placeholders: { buffersize: 128 }, + placeholders: { buffersize_png: 128 }, fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.png', - template: createBufferSizeTemplate('named-custom-buffer-size-by-format', { - png: '<%= buffersize_png %>' + template: createBufferSizeTemplate('named-custom-buffer-size-by-format', { + png: '<%= buffersize_png %>' }, { "buffersize_png": { "type": "number", @@ -207,15 +208,16 @@ describe.only('buffer size per format for named maps', function () { it(test.desc, function (done) { var testClient = new TestClient(undefined, 1234, test.template); var coords = test.coords; - var options = { - format: test.format, - placeholders: test.placeholders - } + var options = { + format: test.format, + placeholders: test.placeholders + }; testClient.getNamedTile(coords.z, coords.x, coords.y, options, function (err, res, tile) { assert.ifError(err); // To generate images use: - // tile.save('./test/fixtures/buffer-size/tile-7.64.48-buffer-size-64.png'); - test.assert(tile, function () { + //tile.save('./test/fixtures/buffer-size/tile-7.64.48-buffer-size-0-test.png'); + test.assert(tile, function (err) { + assert.ifError(err); testClient.drain(done); }); }); diff --git a/test/support/test-client.js b/test/support/test-client.js index 578be296..3e3edf55 100644 --- a/test/support/test-client.js +++ b/test/support/test-client.js @@ -504,8 +504,8 @@ TestClient.prototype.getTile = function(z, x, y, params, callback) { else if (isMvt) { obj = new mapnik.VectorTile(z, x, y); obj.setDataSync(new Buffer(res.body, 'binary')); - } - + } + else { obj = JSON.parse(res.body); } @@ -711,7 +711,7 @@ TestClient.prototype.getNamedTile = function(z, x, y, params, callback) { } if (!params.placeholders) { - params.placeholder = {}; + params.placeholders = {}; } var urlNamed = '/api/v1/map/named'; @@ -843,8 +843,8 @@ TestClient.prototype.getNamedTile = function(z, x, y, params, callback) { else if (isMvt) { obj = new mapnik.VectorTile(z, x, y); obj.setDataSync(new Buffer(res.body, 'binary')); - } - + } + else { obj = JSON.parse(res.body); } From 07e507e1aa34311539e2b4e67b185ab683ff8089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 25 Apr 2017 19:40:12 +0200 Subject: [PATCH 09/29] Remove dictionary as placeholder type for named maps --- lib/cartodb/backends/template_maps.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/cartodb/backends/template_maps.js b/lib/cartodb/backends/template_maps.js index 5d856976..812375e6 100644 --- a/lib/cartodb/backends/template_maps.js +++ b/lib/cartodb/backends/template_maps.js @@ -436,9 +436,11 @@ function _replaceVars (str, params) { }); return str; } -function isDictionary(val) { + +function isObject(val) { return ( _.isObject(val) && !_.isArray(val) && !_.isFunction(val)); } + TemplateMaps.prototype.instance = function(template, params) { var all_params = {}; var phold = template.placeholders || {}; @@ -467,11 +469,6 @@ TemplateMaps.prototype.instance = function(template, params) { throw new Error("Invalid css_color value for template parameter '" + k + "': " + val); } } - else if ( type === 'dictionary' ) { - if (!isDictionary(val)) { - throw new Error("Invalid dictionary value for template parameter '" + k + "': " + val); - } - } else { // NOTE: should be checked at template create/update time throw new Error("Invalid placeholder type '" + type + "'"); @@ -484,7 +481,7 @@ TemplateMaps.prototype.instance = function(template, params) { if (typeof layergroup.buffersize === 'string') { layergroup.buffersize = Number(_replaceVars(layergroup.buffersize, all_params)); - } else if (isDictionary(layergroup.buffersize)) { + } else if (isObject(layergroup.buffersize)) { Object.keys(layergroup.buffersize).forEach(function(k) { layergroup.buffersize[k] = Number(_replaceVars(layergroup.buffersize[k], all_params)); }); From 0d840e6dafe6aeef23af579bdcfebabde84590cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 25 Apr 2017 19:41:30 +0200 Subject: [PATCH 10/29] Javascript style typo --- test/acceptance/buffer-size-format.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/acceptance/buffer-size-format.js b/test/acceptance/buffer-size-format.js index 67b1ae09..0780af84 100644 --- a/test/acceptance/buffer-size-format.js +++ b/test/acceptance/buffer-size-format.js @@ -140,7 +140,7 @@ function createBufferSizeTemplate (name, buffersize, placeholders, cartocss) { } }, "layergroup": createMapConfig(buffersize) - } + }; } describe('buffer size per format for named maps', function () { From 40c0e306af86fe91f3afb6d31a94dfc6517db16e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Tue, 25 Apr 2017 20:40:17 +0200 Subject: [PATCH 11/29] Remove invalid assertions --- test/acceptance/buffer-size-format.js | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/test/acceptance/buffer-size-format.js b/test/acceptance/buffer-size-format.js index 0780af84..b8f40766 100644 --- a/test/acceptance/buffer-size-format.js +++ b/test/acceptance/buffer-size-format.js @@ -3,7 +3,6 @@ require('../support/test_helper'); var assert = require('../support/assert'); var TestClient = require('../support/test-client'); var IMAGE_TOLERANCE_PER_MIL = 5; -var mapnik = require('windshaft').mapnik; var CARTOCSS_LABELS = [ '#layer {', @@ -83,12 +82,7 @@ describe('buffer size per format', function () { var tileJSON = tile.toJSON(); var features = tileJSON[0].features; assert.equal(features.length, 1); - - var map = new mapnik.Map(256, 256); - tile.render(map, new mapnik.Image(256, 256), function (err, image) { - assert.ifError(err); - assert.imageIsSimilarToFile(image, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); - }.bind(this)); + callback(); } }, { @@ -101,12 +95,7 @@ describe('buffer size per format', function () { var tileJSON = tile.toJSON(); var features = tileJSON[0].features; assert.equal(features.length, 9); - - var map = new mapnik.Map(256, 256); - tile.render(map, new mapnik.Image(256, 256), function (err, image) { - assert.ifError(err); - assert.imageIsSimilarToFile(image, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); - }.bind(this)); + callback(); } } ]; @@ -119,7 +108,8 @@ describe('buffer size per format', function () { assert.ifError(err); // To generate images use: // tile.save(test.fixturePath); - test.assert(tile, function () { + test.assert(tile, function (err) { + assert.ifError(err); testClient.drain(done); }); }); From c481d6473c1cde702b3ce2d9642fede922918557 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 26 Apr 2017 17:01:21 +0200 Subject: [PATCH 12/29] Use parseInt instead of number constructor --- lib/cartodb/backends/template_maps.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/cartodb/backends/template_maps.js b/lib/cartodb/backends/template_maps.js index 812375e6..66d64dda 100644 --- a/lib/cartodb/backends/template_maps.js +++ b/lib/cartodb/backends/template_maps.js @@ -430,8 +430,8 @@ var _reNumber = /^([-+]?[\d\.]?\d+([eE][+-]?\d+)?)$/, _reCSSColorVal = /^#[0-9a-fA-F]{3,6}$/; function _replaceVars (str, params) { - // Construct regular expressions for each param - Object.keys(params).forEach(function(k) { + // Construct regular expressions for each param + Object.keys(params).forEach(function(k) { str = str.replace(new RegExp("<%=\\s*" + k + "\\s*%>", "g"), params[k]); }); return str; @@ -480,10 +480,10 @@ TemplateMaps.prototype.instance = function(template, params) { var layergroup = JSON.parse(JSON.stringify(template.layergroup)); if (typeof layergroup.buffersize === 'string') { - layergroup.buffersize = Number(_replaceVars(layergroup.buffersize, all_params)); + layergroup.buffersize = parseInt(_replaceVars(layergroup.buffersize, all_params), 10); } else if (isObject(layergroup.buffersize)) { Object.keys(layergroup.buffersize).forEach(function(k) { - layergroup.buffersize[k] = Number(_replaceVars(layergroup.buffersize[k], all_params)); + layergroup.buffersize[k] = parseInt(_replaceVars(layergroup.buffersize[k], all_params), 10); }); } From 2f4e4246a4ba05bda8026086d263d01a16105a41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 26 Apr 2017 18:27:18 +0200 Subject: [PATCH 13/29] Refactor test-client in order to use same interface for named and anonymous maps --- test/acceptance/buffer-size-format.js | 4 +- test/support/test-client.js | 226 +++++++------------------- 2 files changed, 60 insertions(+), 170 deletions(-) diff --git a/test/acceptance/buffer-size-format.js b/test/acceptance/buffer-size-format.js index b8f40766..50a11329 100644 --- a/test/acceptance/buffer-size-format.js +++ b/test/acceptance/buffer-size-format.js @@ -196,13 +196,13 @@ describe('buffer size per format for named maps', function () { testCases.forEach(function (test) { it(test.desc, function (done) { - var testClient = new TestClient(undefined, 1234, test.template); + var testClient = new TestClient(test.template, 1234); var coords = test.coords; var options = { format: test.format, placeholders: test.placeholders }; - testClient.getNamedTile(coords.z, coords.x, coords.y, options, function (err, res, tile) { + testClient.getTile(coords.z, coords.x, coords.y, options, function (err, res, tile) { assert.ifError(err); // To generate images use: //tile.save('./test/fixtures/buffer-size/tile-7.64.48-buffer-size-0-test.png'); diff --git a/test/support/test-client.js b/test/support/test-client.js index 3e3edf55..b2a326b8 100644 --- a/test/support/test-client.js +++ b/test/support/test-client.js @@ -16,15 +16,23 @@ var serverOptions = require('../../lib/cartodb/server_options'); serverOptions.analysis.batch.inlineExecution = true; var server = new CartodbWindshaft(serverOptions); -function TestClient(mapConfig, apiKey, template) { - this.mapConfig = mapConfig; +function TestClient(config, apiKey) { + this.mapConfig = isMapConfig(config) ? config : null; + this.template = isTemplate(config) ? config : null; this.apiKey = apiKey; - this.template = template; this.keysToDelete = {}; } module.exports = TestClient; +function isMapConfig(config) { + return config && config.layers; +} + +function isTemplate(config) { + return config && config.layergroup; +} + module.exports.RESPONSE = { ERROR: { status: 400, @@ -407,6 +415,7 @@ TestClient.prototype.getTile = function(z, x, y, params, callback) { } var url = '/api/v1/map'; + var urlNamed = url + '/named'; if (this.apiKey) { url += '?' + qs.stringify({api_key: this.apiKey}); @@ -414,17 +423,60 @@ TestClient.prototype.getTile = function(z, x, y, params, callback) { var layergroupId; step( - function createLayergroup() { + function createTemplate () { var next = this; + + if (!self.template) { + return next(); + } + + if (!self.apiKey) { + return next(new Error('apiKey param is mandatory to create a new template')); + } + + params.placeholders = params.placeholders || {}; + assert.response(server, { - url: url, + url: urlNamed + '?' + qs.stringify({ api_key: self.apiKey }), method: 'POST', headers: { host: 'localhost', 'Content-Type': 'application/json' }, - data: JSON.stringify(self.mapConfig) + data: JSON.stringify(self.template) + }, + { + status: 200, + headers: { + 'Content-Type': 'application/json; charset=utf-8' + } + }, + function (res, err) { + if (err) { + return next(err); + } + return next(null, JSON.parse(res.body).template_id); + } + ); + }, + function createLayergroup(err, templateId) { + var next = this; + + var data = templateId ? params.placeholders : self.mapConfig + var path = templateId ? + urlNamed + '/' + templateId + '?' + qs.stringify({api_key: self.apiKey}) : + url; + + assert.response(server, + { + url: path, + method: 'POST', + headers: { + host: 'localhost', + 'Content-Type': 'application/json' + }, + data: JSON.stringify(data) }, { status: 200, @@ -697,165 +749,3 @@ module.exports.getStaticMap = function getStaticMap(templateName, params, callba }); }); }; - -TestClient.prototype.getNamedTile = function(z, x, y, params, callback) { - if (!this.template) { - throw new Error('Template is not defined'); - } - - var self = this; - - if (!callback) { - callback = params; - params = {}; - } - - if (!params.placeholders) { - params.placeholders = {}; - } - - var urlNamed = '/api/v1/map/named'; - var url = '/api/v1/map'; - - - if (this.apiKey) { - url += '?' + qs.stringify({api_key: this.apiKey}); - } - - var templateName; - var layergroupId; - step( - function createTemplate () { - var next = this; - console.log(urlNamed + '?' + qs.stringify({api_key: self.apiKey})) - assert.response(server, - { - url: urlNamed + '?' + qs.stringify({api_key: self.apiKey}), - method: 'POST', - headers: { - host: 'localhost', - 'Content-Type': 'application/json' - }, - data: JSON.stringify(self.template) - }, - { - status: 200, - headers: { - 'Content-Type': 'application/json; charset=utf-8' - } - }, - function (res, err) { - if (err) { - return next(err); - } - return next(null, JSON.parse(res.body).template_id); - } - ); - }, - function createLayergroup(err, templateId) { - var next = this; - console.log(urlNamed + '/' + templateId + '?' + qs.stringify({api_key: self.apiKey})) - assert.response(server, - { - url: urlNamed + '/' + templateId + '?' + qs.stringify({api_key: self.apiKey}), - method: 'POST', - headers: { - host: 'localhost', - 'Content-Type': 'application/json' - }, - data: JSON.stringify(params.placeholders) - }, - { - status: 200, - headers: { - 'Content-Type': 'application/json; charset=utf-8' - } - }, - function(res, err) { - if (err) { - return next(err); - } - return next(null, JSON.parse(res.body).layergroupid); - } - ); - }, - function getTileResult(err, _layergroupId) { - assert.ifError(err); - - var next = this; - layergroupId = _layergroupId; - - url = '/api/v1/map/' + layergroupId + '/'; - - var layers = params.layers; - - if (layers !== undefined) { - layers = Array.isArray(layers) ? layers : [layers]; - url += layers.join(',') + '/'; - } - - var format = params.format || 'png'; - - url += [z,x,y].join('/'); - url += '.' + format; - - if (self.apiKey) { - url += '?' + qs.stringify({api_key: self.apiKey}); - } - - var request = { - url: url, - method: 'GET', - headers: { - host: 'localhost' - } - }; - - var expectedResponse = { - status: 200, - headers: { - 'Content-Type': 'application/json; charset=utf-8' - } - }; - - var isPng = format.match(/png$/); - - if (isPng) { - request.encoding = 'binary'; - expectedResponse.headers['Content-Type'] = 'image/png'; - } - - var isMvt = format.match(/mvt$/); - - if (isMvt) { - request.encoding = 'binary'; - expectedResponse.headers['Content-Type'] = 'application/x-protobuf'; - } - - assert.response(server, request, expectedResponse, function(res, err) { - assert.ifError(err); - - var obj; - - if (isPng) { - obj = mapnik.Image.fromBytes(new Buffer(res.body, 'binary')); - } - else if (isMvt) { - obj = new mapnik.VectorTile(z, x, y); - obj.setDataSync(new Buffer(res.body, 'binary')); - } - - else { - obj = JSON.parse(res.body); - } - - next(null, res, obj); - }); - }, - function finish(err, res, image) { - self.keysToDelete['map_cfg|' + LayergroupToken.parse(layergroupId).token] = 0; - self.keysToDelete['user:localhost:mapviews:global'] = 5; - return callback(err, res, image); - } - ); -}; From 332a56b7360324fee3adcb12cf89304db2291a92 Mon Sep 17 00:00:00 2001 From: Mario de Frutos Date: Fri, 28 Apr 2017 14:22:16 +0200 Subject: [PATCH 14/29] Mapconfig only support object for the buffer-size property --- .gitignore | 3 +-- lib/cartodb/backends/template_maps.js | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index b39f2801..83bce537 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,5 @@ tools/munin/windshaft.conf logs/ pids/ redis.pid -test.log -npm-debug.log +*.log coverage/ diff --git a/lib/cartodb/backends/template_maps.js b/lib/cartodb/backends/template_maps.js index 66d64dda..75a482fe 100644 --- a/lib/cartodb/backends/template_maps.js +++ b/lib/cartodb/backends/template_maps.js @@ -479,9 +479,7 @@ TemplateMaps.prototype.instance = function(template, params) { // NOTE: we're deep-cloning the layergroup here var layergroup = JSON.parse(JSON.stringify(template.layergroup)); - if (typeof layergroup.buffersize === 'string') { - layergroup.buffersize = parseInt(_replaceVars(layergroup.buffersize, all_params), 10); - } else if (isObject(layergroup.buffersize)) { + if (layergroup.buffersize && isObject(layergroup.buffersize)) { Object.keys(layergroup.buffersize).forEach(function(k) { layergroup.buffersize[k] = parseInt(_replaceVars(layergroup.buffersize[k], all_params), 10); }); From bfb283c5ba2c5027e2a952b6997df73010212ce3 Mon Sep 17 00:00:00 2001 From: Mario de Frutos Date: Fri, 28 Apr 2017 14:46:36 +0200 Subject: [PATCH 15/29] wip --- .../adapter/mapconfig-named-layers-adapter.js | 1 - .../mapconfig/adapter/mapconfig-named-map-adapter.js | 11 +++++++++++ lib/cartodb/server.js | 1 + test/acceptance/buffer-size-format.js | 2 +- 4 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js index fd00e344..17c2059f 100644 --- a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js @@ -43,7 +43,6 @@ MapConfigNamedLayersAdapter.prototype.getMapConfig = function (user, requestMapC if (nestedNamedLayers.length > 0) { var nestedNamedMapsError = new Error('Nested named layers are not allowed'); - // nestedNamedMapsError.http_status = 400; return done(nestedNamedMapsError); } diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js new file mode 100644 index 00000000..605ea5f5 --- /dev/null +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js @@ -0,0 +1,11 @@ +var queue = require('queue-async'); +var _ = require('underscore'); +var Datasource = require('windshaft').model.Datasource; + +function MapConfigNamedMapAdapter() { +} + +module.exports = MapConfigNamedMapAdapter; + +MapConfigNamedMapAdapter.prototype.getMapConfig = function (user, requestMapConfig, params, context, callback) { +}; diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index b695a367..b04229a1 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -155,6 +155,7 @@ module.exports = function(serverOptions) { var mapConfigAdapter = new MapConfigAdapter( new MapConfigNamedLayersAdapter(templateMaps, pgConnection), + new MapConfigNamedMapAdapter(), new SqlWrapMapConfigAdapter(), new DataviewsWidgetsAdapter(), new AnalysisMapConfigAdapter(analysisBackend), diff --git a/test/acceptance/buffer-size-format.js b/test/acceptance/buffer-size-format.js index 50a11329..d6c44964 100644 --- a/test/acceptance/buffer-size-format.js +++ b/test/acceptance/buffer-size-format.js @@ -140,7 +140,7 @@ describe('buffer size per format for named maps', function () { coords: { z: 7, x: 64, y: 48 }, format: 'png', fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png', - template: createBufferSizeTemplate('named-default-buffer-size', '<%= buffersize %>'), + template: createBufferSizeTemplate('named-default-buffer-size', {png: '<%= buffersize %>'}), assert: function (tile, callback) { assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); } From be58adb1b9f64126e4407a6610a751eab139f55d Mon Sep 17 00:00:00 2001 From: Mario de Frutos Date: Fri, 28 Apr 2017 14:46:36 +0200 Subject: [PATCH 16/29] Be able to override buffer-size configuration without placeholders in named maps --- .../adapter/mapconfig-named-layers-adapter.js | 1 - .../adapter/mapconfig-named-map-adapter.js | 35 ++++ .../mapconfig/provider/named-map-provider.js | 1 + lib/cartodb/server.js | 2 + test/acceptance/buffer-size-format.js | 182 +++++++++++++++++- .../tile-7.64.48-buffer-size-128.geojson | 1 + .../tile-7.64.48-buffer-size-128.grid.json | 1 + ...-grid.json.7.64.48-buffer-size-0.grid.json | 1 + .../tile-mvt-7.64.48-buffer-size-0.geojson | 1 + .../tile-mvt-7.64.48-buffer-size-0.mvt | Bin 0 -> 615 bytes .../tile-mvt-7.64.48-buffer-size-128.mvt | Bin 0 -> 1877 bytes test/support/test-client.js | 15 +- 12 files changed, 234 insertions(+), 6 deletions(-) create mode 100644 lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js create mode 100644 test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.geojson create mode 100644 test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.grid.json create mode 100644 test/fixtures/buffer-size/tile-grid.json.7.64.48-buffer-size-0.grid.json create mode 100644 test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.geojson create mode 100644 test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.mvt create mode 100644 test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-128.mvt diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js index fd00e344..17c2059f 100644 --- a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js @@ -43,7 +43,6 @@ MapConfigNamedLayersAdapter.prototype.getMapConfig = function (user, requestMapC if (nestedNamedLayers.length > 0) { var nestedNamedMapsError = new Error('Nested named layers are not allowed'); - // nestedNamedMapsError.http_status = 400; return done(nestedNamedMapsError); } diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js new file mode 100644 index 00000000..76e8f3f5 --- /dev/null +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js @@ -0,0 +1,35 @@ +var _ = require('underscore'); + +function MapConfigNamedMapAdapter() { +} + +module.exports = MapConfigNamedMapAdapter; + +MapConfigNamedMapAdapter.prototype.getMapConfig = function (user, requestMapConfig, params, context, callback) { + if (context.templateParams && + context.templateParams.buffersize && + isValidBufferSize(context.templateParams.buffersize)) { + requestMapConfig.buffersize = context.templateParams.buffersize; + } + + process.nextTick(function () { + callback(null, requestMapConfig); + }); +}; + +function isValidBufferSize (bufferSize) { + var formats = ['png', 'png32', 'mvt', 'grid.json', 'geojson']; + + if (!_.isObject(bufferSize) || (_.isArray(bufferSize) || _.isFunction(bufferSize))) { + return false; + } + + for (var index = 0; index < formats.length; index++) { + var bufferSizeByFormat = bufferSize[formats[index]]; + if (bufferSizeByFormat && !Number.isFinite(bufferSizeByFormat)) { + return false; + } + } + + return true; +} diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index 2439a650..594ec247 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -90,6 +90,7 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { }, function instantiateTemplate(err, templateParams) { assert.ifError(err); + context.templateParams = templateParams; return self.templateMaps.instance(self.template, templateParams); }, function prepareAdapterMapConfig(err, requestMapConfig) { diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index b695a367..22b14f5b 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -35,6 +35,7 @@ var timeoutErrorTile = require('fs').readFileSync(timeoutErrorTilePath, {encodin var SqlWrapMapConfigAdapter = require('./models/mapconfig/adapter/sql-wrap-mapconfig-adapter'); var MapConfigNamedLayersAdapter = require('./models/mapconfig/adapter/mapconfig-named-layers-adapter'); +var MapConfigNamedMapAdapter = require('./models/mapconfig/adapter/mapconfig-named-map-adapter'); var AnalysisMapConfigAdapter = require('./models/mapconfig/adapter/analysis-mapconfig-adapter'); var MapConfigOverviewsAdapter = require('./models/mapconfig/adapter/mapconfig-overviews-adapter'); var TurboCartoAdapter = require('./models/mapconfig/adapter/turbo-carto-adapter'); @@ -155,6 +156,7 @@ module.exports = function(serverOptions) { var mapConfigAdapter = new MapConfigAdapter( new MapConfigNamedLayersAdapter(templateMaps, pgConnection), + new MapConfigNamedMapAdapter(), new SqlWrapMapConfigAdapter(), new DataviewsWidgetsAdapter(), new AnalysisMapConfigAdapter(analysisBackend), diff --git a/test/acceptance/buffer-size-format.js b/test/acceptance/buffer-size-format.js index 50a11329..8c8f6f7b 100644 --- a/test/acceptance/buffer-size-format.js +++ b/test/acceptance/buffer-size-format.js @@ -1,7 +1,9 @@ require('../support/test_helper'); +var fs = require('fs'); var assert = require('../support/assert'); var TestClient = require('../support/test-client'); +var mapnik = require('windshaft').mapnik; var IMAGE_TOLERANCE_PER_MIL = 5; var CARTOCSS_LABELS = [ @@ -76,7 +78,7 @@ describe('buffer size per format', function () { desc: 'should get mvt tile using buffer-size 0', coords: { z: 7, x: 64, y: 48 }, format: 'mvt', - fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png', + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.mvt', mapConfig: createMapConfig({ mvt: 0 }), assert: function (tile, callback) { var tileJSON = tile.toJSON(); @@ -89,7 +91,7 @@ describe('buffer size per format', function () { desc: 'should get mvt tile using buffer-size 128', coords: { z: 7, x: 64, y: 48 }, format: 'mvt', - fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.png', + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.mvt', mapConfig: createMapConfig({ mvt: 128 }), assert: function (tile, callback) { var tileJSON = tile.toJSON(); @@ -140,7 +142,7 @@ describe('buffer size per format for named maps', function () { coords: { z: 7, x: 64, y: 48 }, format: 'png', fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png', - template: createBufferSizeTemplate('named-default-buffer-size', '<%= buffersize %>'), + template: createBufferSizeTemplate('named-default-buffer-size', {png: '<%= buffersize %>'}), assert: function (tile, callback) { assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); } @@ -151,7 +153,7 @@ describe('buffer size per format for named maps', function () { format: 'png', placeholders: { buffersize: 128 }, fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.png', - template: createBufferSizeTemplate('named-custom-buffer-size', '<%= buffersize %>'), + template: createBufferSizeTemplate('named-custom-buffer-size', { png: '<%= buffersize %>'}), assert: function (tile, callback) { assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); } @@ -214,3 +216,175 @@ describe('buffer size per format for named maps', function () { }); }); }); + + +describe('buffer size per format for named maps w/o placeholders', function () { + var testCases = [ + { + desc: 'should get png tile using buffer-size 0 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'png', + placeholders: { + buffersize: { + png: 0 + } + }, + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png', + template: createBufferSizeTemplate('named-no-buffer-size-png-0', {}, {}), + assert: function (tile, callback) { + assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); + } + }, + { + desc: 'should get png tile using buffer-size 128 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'png', + placeholders: { + buffersize: { + png: 128 + } + }, + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.png', + template: createBufferSizeTemplate('named-no-buffer-size-png-128', {}, {}), + assert: function (tile, callback) { + assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); + } + }, + { + desc: 'should get mvt tile using buffer-size 0 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'mvt', + placeholders: { + buffersize: { + mvt: 0 + } + }, + fixturePath: './test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.mvt', + template: createBufferSizeTemplate('named-no-buffer-size-mvt', {}, {}), + assert: function (tile, callback) { + var tileJSON = tile.toJSON(); + var features = tileJSON[0].features; + + var dataFixture = fs.readFileSync(this.fixturePath); + var vtile = new mapnik.VectorTile(this.coords.z, this.coords.x, this.coords.y); + vtile.setDataSync(dataFixture); + var vtileJSON = vtile.toJSON(); + var vtileFeatures = vtileJSON[0].features; + + assert.equal(features.length, vtileFeatures.length); + callback(); + } + }, + { + desc: 'should get mvt tile using buffer-size 128 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'mvt', + placeholders: { + buffersize: { + mvt: 128 + } + }, + fixturePath: './test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-128.mvt', + template: createBufferSizeTemplate('named-no-buffer-size-mvt-128', {}, {}), + assert: function (tile, callback) { + var tileJSON = tile.toJSON(); + var features = tileJSON[0].features; + + var dataFixture = fs.readFileSync(this.fixturePath); + var vtile = new mapnik.VectorTile(this.coords.z, this.coords.x, this.coords.y); + vtile.setDataSync(dataFixture); + var vtileJSON = vtile.toJSON(); + var vtileFeatures = vtileJSON[0].features; + + assert.equal(features.length, vtileFeatures.length); + callback(); + } + }, + { + desc: 'should get geojson tile using buffer-size 0 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'geojson', + placeholders: { + buffersize: { + geojson: 0 + } + }, + fixturePath: './test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.geojson', + template: createBufferSizeTemplate('named-no-buffer-size-geojson-0', {}, {}), + assert: function (tile, callback) { + var dataFixture = JSON.parse(fs.readFileSync(this.fixturePath)); + assert.equal(tile.features.length, dataFixture.features.length); + callback(); + } + }, + { + desc: 'should get geojson tile using buffer-size 128 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'geojson', + placeholders: { + buffersize: { + geojson: 128 + } + }, + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.geojson', + template: createBufferSizeTemplate('named-no-buffer-size-geojson-128', {}, {}), + assert: function (tile, callback) { + var dataFixture = JSON.parse(fs.readFileSync(this.fixturePath)); + assert.equal(tile.features.length, dataFixture.features.length); + callback(); + } + }, + { + desc: 'should get grid.json tile using buffer-size 0 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'grid.json', + placeholders: { + buffersize: { + 'grid.json': 0 + } + }, + fixturePath: './test/fixtures/buffer-size/tile-grid.json.7.64.48-buffer-size-0.grid.json', + template: createBufferSizeTemplate('named-no-buffer-size-grid-json-0', {}, {}), + assert: function (tile, callback) { + assert.utfgridEqualsFile(tile, this.fixturePath, 2,callback); + } + }, + { + desc: 'should get grid.json tile using buffer-size 128 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'grid.json', + placeholders: { + buffersize: { + 'grid.json': 128 + } + }, + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.grid.json', + template: createBufferSizeTemplate('named-no-buffer-size-grid-json-128', {}, {}), + assert: function (tile, callback) { + assert.utfgridEqualsFile(tile, this.fixturePath, 2, callback); + } + }, + ]; + + testCases.forEach(function (test) { + it(test.desc, function (done) { + var testClient = new TestClient(test.template, 1234); + var coords = test.coords; + var options = { + format: test.format, + placeholders: test.placeholders + }; + testClient.getTile(coords.z, coords.x, coords.y, options, function (err, res, tile) { + assert.ifError(err); + // To generate images use: + //tile.save(test.fixturePath); + // require('fs').writeFileSync(test.fixturePath, JSON.stringify(tile)); + // require('fs').writeFileSync(test.fixturePath, tile.getDataSync()); + test.assert(tile, function (err) { + assert.ifError(err); + testClient.drain(done); + }); + }); + }); + }); +}); diff --git a/test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.geojson b/test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.geojson new file mode 100644 index 00000000..e89c71dd --- /dev/null +++ b/test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.geojson @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53839,4629161]},"properties":{"name":"Alicante","cartodb_id":1200}},{"type":"Feature","geometry":{"type":"Point","coordinates":[242835,5069332]},"properties":{"name":"Barcelona","cartodb_id":5330}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-5567,4861644]},"properties":{"name":"Castello","cartodb_id":1201}},{"type":"Feature","geometry":{"type":"Point","coordinates":[272735,5092314]},"properties":{"name":"Mataro","cartodb_id":615}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-125787,4576600]},"properties":{"name":"Murcia","cartodb_id":952}},{"type":"Feature","geometry":{"type":"Point","coordinates":[295469,4804267]},"properties":{"name":"Palma","cartodb_id":5500}},{"type":"Feature","geometry":{"type":"Point","coordinates":[139148,5030112]},"properties":{"name":"Tarragona","cartodb_id":616}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-44746,4791667]},"properties":{"name":"Valencia","cartodb_id":5942}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-99072,5108695]},"properties":{"name":"Zaragoza","cartodb_id":5932}}]} \ No newline at end of file diff --git a/test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.grid.json b/test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.grid.json new file mode 100644 index 00000000..c06b8d91 --- /dev/null +++ b/test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.grid.json @@ -0,0 +1 @@ +{"grid":[" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," !! ","!!! !!!!! ","!!!!!!! ! ","!!! !!!!! "," !! ! "," "," "," "," "," "," "," "," ### # "," ####### ###"," ####### ## ","$ ## #### ## ","$$ ","$$ ","$$ "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],"keys":["","9","2","1"],"data":{"1":{"cartodb_id":5942},"2":{"cartodb_id":5500},"9":{"cartodb_id":1201}}} \ No newline at end of file diff --git a/test/fixtures/buffer-size/tile-grid.json.7.64.48-buffer-size-0.grid.json b/test/fixtures/buffer-size/tile-grid.json.7.64.48-buffer-size-0.grid.json new file mode 100644 index 00000000..24581bc3 --- /dev/null +++ b/test/fixtures/buffer-size/tile-grid.json.7.64.48-buffer-size-0.grid.json @@ -0,0 +1 @@ +{"grid":[" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," !!! ! "," !!!!!!! !!!"," !!!!!!! !! "," !! !!!! !! "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],"keys":["","1"],"data":{"1":{"cartodb_id":5500}}} \ No newline at end of file diff --git a/test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.geojson b/test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.geojson new file mode 100644 index 00000000..500fb3ea --- /dev/null +++ b/test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.geojson @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[295469,4804267]},"properties":{"name":"Palma","cartodb_id":5500}}]} \ No newline at end of file diff --git a/test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.mvt b/test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.mvt new file mode 100644 index 0000000000000000000000000000000000000000..b87f1b9a6d5d6a4922b1d822d2f71e5e0fcebe85 GIT binary patch literal 615 zcmXw0%We}f6wPGbZkxxX3C#s6%iRDHsD&j63WWt!h)Vr{=yt|Qta|Kd#)W3r?veNb z{(%iYz>)=@zz%)^HY~6w?JPz<=iGabk1zZR&f6rCxa8IDoeK&v7Uk{)AF+`5ua1va zIL8GGhb{X-;&g>2XE6zn7bsLi?KM=7bY9mIYx)8u$BNew*;bSWNRE}!#mPhz%%}hE zL7dM~&3Mtwy?Ev@&rj{xHf=##i0KsTTnI?qQE9{3kPHr1J+#j4d|IJ8eE?+2(VSI0 zm&p30`@ATHy1z%QuP`VfopJ5%W_`n%Rtm8Qg=+D2SD=3tO-#+yq zb*eUVURmPuqa~Wot7H)*wSK=^Tt<3_Ld^jTbX-tx}be(Lhb=JEZy-vTIMT72UZ`d70H~L%IcmSI> Lhqp$zTif1$xTB}x literal 0 HcmV?d00001 diff --git a/test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-128.mvt b/test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-128.mvt new file mode 100644 index 0000000000000000000000000000000000000000..c6e5421217b66b22d078be2ea92910bfda79b91e GIT binary patch literal 1877 zcmYk6Yitx%7>2u-*}1e#x4YAJ=M>5~pil&4TLpzew_PrBlR^;zFYRGwx}7jPvzeV0 zN{j*dp%DoZLuye%3=%Y&0Nx;x*eYtGsDTnCf)e~;M1z`uR2m`powM5s`{Ubl&YV5- zyzl#+MML7|pb)Weui?&^yj4Lg*0VD@ag)jjp#>f7#kq!aDpOqsAH-DIZNotk#3=jG>c( zp>2dygGw3Vb+fx0=QYzrLbrjvf@^3NR;z@{Ry}Ll(~=6DXL{H|e8zCdo8dgBnroDo zpop1wI&q^K7J@*}TX=(Ex!B$a2Zs=6VbAmmx}oy&vu93^ss1FLf<2C%8C^YeXxI2} z`hOgNt@+L@_Ou@OVF0l(qYBFfepFW@;<82tYo^y*9MKJez>RJ|VX}gFQj2OhG9=;< zjJ&)C4#Dv@VslOo-nLl{D}!$(OHG4;Rh$l}Sug7pS!&gf27ak`aaG7)$RSt5Ru<61f)jV(?DREFQp4^HI*vF5U}Kp+?lg~9E$1ruF@jiLSrHvmRS^^8q9j%`HI=o|M3o#vd|iBO*|>lj6~x7P3+I(K(1Bee z51HPaLK|gk3*v}Q+wlywT8O8MF)I{YA>`9xpNHiokc8d)ZEo9F=@blKpKy4^uXC6b zX|8r`Wieu@dzPohg(|wD%r}(f*s>f~!(d)Lc=GeVHBdj@6@|L(r6{aMVoRyc51NM? zxL|BvNv8xlt0Of;XMHUwO;Dw>h(Kvw6%(%;KUS&(rQ>Sr6XRtC-BnTwsi!gYTjAtU z3?hdbiXv0+b!m7W(Qv;0%Js^l^N9wr>5U67ZVIH-3PEVYu4X`g;iL*@_%k@;-Jr@S zg9qU&ti1Ml7u3EFN2!OB`zyGRPpty=gvdmn`ff^nk2ndaCqq6B@dl{@sHfE4o0uw3 zLlu;|hB&s$$e1VJw-p^cE4XkO;myZcz*c&w_4|GwF>|-t2=S`|D*1>f!IJO5JloKCzYy``t4g`0l&I)ftp8DK-LM6S&$WHBnFRPdp&c^gRtJ zzlF(_Zg+A8xR!>ljSTH4n&ylmVT)Y1btW*6S<52Yv@1mQZ6u>efB`pTg` zzmtX9zoQ0Lx!59_{H0kVQI3htE+tPqoK@=Z2Ze_y;cRgZ5H1w*6wZzi;o`)RZ*Ndj|Y{z{{W8PP*s2LDES- oe8!hRb_e#>bG#2if_l;id5VH`id_JL0R&5!f^0}=vOWs(KV!GHW&i*H literal 0 HcmV?d00001 diff --git a/test/support/test-client.js b/test/support/test-client.js index b2a326b8..bbb32c9d 100644 --- a/test/support/test-client.js +++ b/test/support/test-client.js @@ -545,6 +545,20 @@ TestClient.prototype.getTile = function(z, x, y, params, callback) { expectedResponse.headers['Content-Type'] = 'application/x-protobuf'; } + var isGeojson = format.match(/geojson$/); + + if (isGeojson) { + request.encoding = 'utf-8'; + expectedResponse.headers['Content-Type'] = 'application/json; charset=utf-8'; + } + + var isGridJSON = format.match(/grid.json$/); + + if (isGridJSON) { + request.encoding = 'utf-8'; + expectedResponse.headers['Content-Type'] = 'application/json; charset=utf-8'; + } + assert.response(server, request, expectedResponse, function(res, err) { assert.ifError(err); @@ -557,7 +571,6 @@ TestClient.prototype.getTile = function(z, x, y, params, callback) { obj = new mapnik.VectorTile(z, x, y); obj.setDataSync(new Buffer(res.body, 'binary')); } - else { obj = JSON.parse(res.body); } From c9af38ecd0e259e8c35102ea16e1e8436736aef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Fri, 28 Apr 2017 19:21:51 +0200 Subject: [PATCH 17/29] Fix issue when 'grid.json' format is not captured properly due to a weird behaviour in regex --- lib/cartodb/controllers/layergroup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index 79268d6e..fb1aab9b 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -56,7 +56,7 @@ LayergroupController.prototype.register = function(app) { this.tile.bind(this)); app.get(app.base_url_mapconfig + - '/:token/:z/:x/:y.:format', cors(), userMiddleware, + '/:token/:z/:x/:y.(:format)', cors(), userMiddleware, this.tile.bind(this)); app.get(app.base_url_mapconfig + From e97466378ee9ccc57853b208ae978a8bba59c3de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 3 May 2017 11:17:51 +0200 Subject: [PATCH 18/29] Add test for different formats to anonymous maps and named maps with placeholders --- test/acceptance/buffer-size-format.js | 138 ++++++++++++++++++++++++-- 1 file changed, 129 insertions(+), 9 deletions(-) diff --git a/test/acceptance/buffer-size-format.js b/test/acceptance/buffer-size-format.js index 8c8f6f7b..f573057c 100644 --- a/test/acceptance/buffer-size-format.js +++ b/test/acceptance/buffer-size-format.js @@ -99,6 +99,50 @@ describe('buffer size per format', function () { assert.equal(features.length, 9); callback(); } + }, + { + desc: 'should get geojson tile using buffer-size 0 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'geojson', + fixturePath: './test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.geojson', + mapConfig: createMapConfig({ geojson: 0 }), + assert: function (tile, callback) { + var dataFixture = JSON.parse(fs.readFileSync(this.fixturePath)); + assert.equal(tile.features.length, dataFixture.features.length); + callback(); + } + }, + { + desc: 'should get geojson tile using buffer-size 128 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'geojson', + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.geojson', + mapConfig: createMapConfig({ geojson: 128 }), + assert: function (tile, callback) { + var dataFixture = JSON.parse(fs.readFileSync(this.fixturePath)); + assert.equal(tile.features.length, dataFixture.features.length); + callback(); + } + }, + { + desc: 'should get grid.json tile using buffer-size 0 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'grid.json', + fixturePath: './test/fixtures/buffer-size/tile-grid.json.7.64.48-buffer-size-0.grid.json', + mapConfig: createMapConfig({ 'grid.json': 0 }), + assert: function (tile, callback) { + assert.utfgridEqualsFile(tile, this.fixturePath, 2,callback); + } + }, + { + desc: 'should get grid.json tile using buffer-size 128 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'grid.json', + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.grid.json', + mapConfig: createMapConfig({ 'grid.json': 128 }), + assert: function (tile, callback) { + assert.utfgridEqualsFile(tile, this.fixturePath, 2, callback); + } } ]; @@ -193,6 +237,82 @@ describe('buffer size per format for named maps', function () { assert: function (tile, callback) { assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); } + }, + { + desc: 'should get geojson tile using buffer-size 0 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'geojson', + placeholders: { buffersize_geojson: 0 }, + fixturePath: './test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.geojson', + template: createBufferSizeTemplate('named-default-buffer-size-by-format-geojson', { + geojson: '<%= buffersize_geojson %>' + }, { + "buffersize_geojson": { + "type": "number", + "default": "0" + } + }), + assert: function (tile, callback) { + var dataFixture = JSON.parse(fs.readFileSync(this.fixturePath)); + assert.equal(tile.features.length, dataFixture.features.length); + callback(); + } + }, + { + desc: 'should get geojson tile using buffer-size 128 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'geojson', + placeholders: { buffersize_geojson: 128 }, + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.geojson', + template: createBufferSizeTemplate('named-custom-buffer-size-by-format-geojson', { + geojson: '<%= buffersize_geojson %>' + }, { + "buffersize_geojson": { + "type": "number", + "default": "0" + } + }), + assert: function (tile, callback) { + var dataFixture = JSON.parse(fs.readFileSync(this.fixturePath)); + assert.equal(tile.features.length, dataFixture.features.length); + callback(); + } + }, + { + desc: 'should get grid.json tile using buffer-size 0 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'grid.json', + placeholders: { buffersize_gridjson: 0 }, + fixturePath: './test/fixtures/buffer-size/tile-grid.json.7.64.48-buffer-size-0.grid.json', + template: createBufferSizeTemplate('named-default-buffer-size-by-format-gridjson', { + 'grid.json': '<%= buffersize_gridjson %>' + }, { + "buffersize_gridjson": { + "type": "number", + "default": "0" + } + }), + assert: function (tile, callback) { + assert.utfgridEqualsFile(tile, this.fixturePath, 2,callback); + } + }, + { + desc: 'should get grid.json tile using buffer-size 128 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'grid.json', + placeholders: { buffersize_gridjson: 128 }, + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.grid.json', + template: createBufferSizeTemplate('named-custom-buffer-size-by-format-gridjson', { + 'grid.json': '<%= buffersize_gridjson %>' + }, { + "buffersize_gridjson": { + "type": "number", + "default": "0" + } + }), + assert: function (tile, callback) { + assert.utfgridEqualsFile(tile, this.fixturePath, 2, callback); + } } ]; @@ -224,7 +344,7 @@ describe('buffer size per format for named maps w/o placeholders', function () { desc: 'should get png tile using buffer-size 0 overriden by template params', coords: { z: 7, x: 64, y: 48 }, format: 'png', - placeholders: { + placeholders: { buffersize: { png: 0 } @@ -239,7 +359,7 @@ describe('buffer size per format for named maps w/o placeholders', function () { desc: 'should get png tile using buffer-size 128 overriden by template params', coords: { z: 7, x: 64, y: 48 }, format: 'png', - placeholders: { + placeholders: { buffersize: { png: 128 } @@ -254,7 +374,7 @@ describe('buffer size per format for named maps w/o placeholders', function () { desc: 'should get mvt tile using buffer-size 0 overriden by template params', coords: { z: 7, x: 64, y: 48 }, format: 'mvt', - placeholders: { + placeholders: { buffersize: { mvt: 0 } @@ -279,7 +399,7 @@ describe('buffer size per format for named maps w/o placeholders', function () { desc: 'should get mvt tile using buffer-size 128 overriden by template params', coords: { z: 7, x: 64, y: 48 }, format: 'mvt', - placeholders: { + placeholders: { buffersize: { mvt: 128 } @@ -304,7 +424,7 @@ describe('buffer size per format for named maps w/o placeholders', function () { desc: 'should get geojson tile using buffer-size 0 overriden by template params', coords: { z: 7, x: 64, y: 48 }, format: 'geojson', - placeholders: { + placeholders: { buffersize: { geojson: 0 } @@ -321,7 +441,7 @@ describe('buffer size per format for named maps w/o placeholders', function () { desc: 'should get geojson tile using buffer-size 128 overriden by template params', coords: { z: 7, x: 64, y: 48 }, format: 'geojson', - placeholders: { + placeholders: { buffersize: { geojson: 128 } @@ -338,7 +458,7 @@ describe('buffer size per format for named maps w/o placeholders', function () { desc: 'should get grid.json tile using buffer-size 0 overriden by template params', coords: { z: 7, x: 64, y: 48 }, format: 'grid.json', - placeholders: { + placeholders: { buffersize: { 'grid.json': 0 } @@ -353,7 +473,7 @@ describe('buffer size per format for named maps w/o placeholders', function () { desc: 'should get grid.json tile using buffer-size 128 overriden by template params', coords: { z: 7, x: 64, y: 48 }, format: 'grid.json', - placeholders: { + placeholders: { buffersize: { 'grid.json': 128 } @@ -363,7 +483,7 @@ describe('buffer size per format for named maps w/o placeholders', function () { assert: function (tile, callback) { assert.utfgridEqualsFile(tile, this.fixturePath, 2, callback); } - }, + } ]; testCases.forEach(function (test) { From 55a351d7514051d1bb53008485b9f13c267c4aba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 3 May 2017 17:35:55 +0200 Subject: [PATCH 19/29] Point windshaft to a specific buffer-size commit --- package.json | 2 +- yarn.lock | 182 ++++++++++++++++++++++++++++----------------------- 2 files changed, 102 insertions(+), 82 deletions(-) diff --git a/package.json b/package.json index 9a7c5dd0..af824cc4 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "step-profiler": "~0.3.0", "turbo-carto": "0.19.0", "underscore": "~1.6.0", - "windshaft": "3.1.0", + "windshaft": "cartodb/windshaft#548-vector-buffer-size", "yargs": "~5.0.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 9a3c48fe..79f89643 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22,8 +22,8 @@ accepts@~1.2.12: negotiator "0.5.3" ajv@^4.9.1: - version "4.11.5" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.5.tgz#b6ee74657b993a01dce44b7944d56f485828d5bd" + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" dependencies: co "^4.6.0" json-stable-stringify "^1.0.1" @@ -57,11 +57,11 @@ aproba@^1.0.3: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" are-we-there-yet@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" dependencies: delegates "^1.0.0" - readable-stream "^2.0.0 || ^1.1.13" + readable-stream "^2.0.6" argparse@^1.0.7: version "1.0.9" @@ -151,13 +151,13 @@ boom@2.x.x: hoek "2.x.x" brace-expansion@^1.0.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" + version "1.1.7" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" dependencies: balanced-match "^0.4.1" concat-map "0.0.1" -buffer-shims@^1.0.0: +buffer-shims@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" @@ -223,14 +223,6 @@ carto@0.16.3: semver "^5.1.0" yargs "^4.2.0" -carto@CartoDB/carto#0.15.1-cdb1: - version "0.15.1-cdb1" - resolved "https://codeload.github.com/CartoDB/carto/tar.gz/8050ec843f1f32a6469e5d1cf49602773015d398" - dependencies: - mapnik-reference "~6.0.2" - optimist "~0.6.0" - underscore "~1.6.0" - carto@cartodb/carto#0.15.1-cdb3: version "0.15.1-cdb3" resolved "https://codeload.github.com/cartodb/carto/tar.gz/945f5efb74fd1af1f5e1f69f409f9567f94fb5a7" @@ -239,6 +231,14 @@ carto@cartodb/carto#0.15.1-cdb3: optimist "~0.6.0" underscore "1.8.3" +"carto@github:cartodb/carto#0.15.1-cdb1": + version "0.15.1-cdb1" + resolved "https://codeload.github.com/cartodb/carto/tar.gz/8050ec843f1f32a6469e5d1cf49602773015d398" + dependencies: + mapnik-reference "~6.0.2" + optimist "~0.6.0" + underscore "~1.6.0" + cartocolor@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cartocolor/-/cartocolor-4.0.0.tgz#841a3222d8b5b22718d9d545b1e5b972cb26eb36" @@ -612,8 +612,8 @@ express@~4.13.3: vary "~1.0.1" extend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" extsprintf@1.0.2: version "1.0.2" @@ -650,8 +650,8 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" form-data@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" dependencies: asynckit "^0.4.0" combined-stream "^1.0.5" @@ -687,8 +687,8 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: rimraf "2" gauge@~2.7.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.3.tgz#1c23855f962f17b3ad3d0dc7443f304542edfe09" + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -716,9 +716,9 @@ generate-object-property@^1.1.0: dependencies: is-property "^1.0.0" -generic-pool@2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.4.2.tgz#886bc5bf0beb7db96e81bcbba078818de5a62683" +generic-pool@2.4.3, generic-pool@~2.4.0, generic-pool@~2.4.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.4.3.tgz#780c36f69dfad05a5a045dd37be7adca11a4f6ff" generic-pool@~2.1.1: version "2.1.1" @@ -728,21 +728,17 @@ generic-pool@~2.2.0, generic-pool@~2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.2.2.tgz#7a89f491d575b42f9f069a0e8e2c6dbaa3c241be" -generic-pool@~2.4.0, generic-pool@~2.4.1: - version "2.4.6" - resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.4.6.tgz#f1b55e572167dba2fe75d5aa91ebb1e9f72642d7" - get-caller-file@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" getpass@^0.1.1: - version "0.1.6" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" dependencies: assert-plus "^1.0.0" -glob@3.2.3, "glob@~ 3.2.1": +glob@3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.3.tgz#e313eeb249c7affaa5c475286b0e115b59839467" dependencies: @@ -781,6 +777,13 @@ glob@^7.0.5: once "^1.3.0" path-is-absolute "^1.0.0" +"glob@~ 3.2.1": + version "3.2.11" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" + dependencies: + inherits "2" + minimatch "0.3" + graceful-fs@^4.1.2: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -794,8 +797,8 @@ graceful-fs@~2.0.0: resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" grainstore@~1.6.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/grainstore/-/grainstore-1.6.2.tgz#f5d098a8da607f23db08f3263894c8f234a8a59e" + version "1.6.3" + resolved "https://registry.yarnpkg.com/grainstore/-/grainstore-1.6.3.tgz#6900cc811aadc1ed2c00fcd429c672f8b8e1a5cb" dependencies: carto "0.16.3" debug "~2.2.0" @@ -812,8 +815,8 @@ growl@1.8.1: resolved "https://registry.yarnpkg.com/growl/-/growl-1.8.1.tgz#4b2dec8d907e93db336624dcec0183502f8c9428" handlebars@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" + version "4.0.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.8.tgz#22b875cd3f0e6cbea30314f144e82bc7a72ff420" dependencies: async "^1.4.0" optimist "^0.6.1" @@ -876,8 +879,8 @@ hoek@2.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" hosted-git-info@^2.1.4: - version "2.4.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.1.tgz#4b0445e41c004a8bd1337773a4ff790ca40318c8" + version "2.4.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67" htmlparser2@3.8.x: version "3.8.3" @@ -939,7 +942,7 @@ is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" -is-buffer@^1.0.2: +is-buffer@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" @@ -1029,8 +1032,8 @@ js-base64@^2.1.9: resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" js-yaml@3.x, js-yaml@^3.4.6: - version "3.8.2" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.2.tgz#02d3e2c0f6beab20248d412c352203827d786721" + version "3.8.3" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.3.tgz#33a05ec481c850c8875929166fe1beb61c728766" dependencies: argparse "^1.0.7" esprima "^3.1.1" @@ -1084,10 +1087,10 @@ jsprim@^1.2.2: verror "1.3.6" kind-of@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" + version "3.2.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.0.tgz#b58abe4d5c044ad33726a8c1525b48cf891bff07" dependencies: - is-buffer "^1.0.2" + is-buffer "^1.1.5" lazy-cache@^1.0.3: version "1.0.4" @@ -1210,7 +1213,7 @@ mime-db@~1.27.0: version "1.27.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" -mime-types@^2.1.12, mime-types@~2.1.13, mime-types@~2.1.6, mime-types@~2.1.7: +mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.6, mime-types@~2.1.7: version "2.1.15" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" dependencies: @@ -1224,6 +1227,13 @@ mime@~1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" +minimatch@0.3: + version "0.3.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + minimatch@1.0.x: version "1.0.0" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-1.0.0.tgz#e0dd2120b49e1b724ce8d714c520822a9438576d" @@ -1305,14 +1315,18 @@ mv@~2: ncp "~2.0.0" rimraf "~2.4.0" -nan@^2.0.8, nan@^2.3.4, nan@^2.4.0, nan@~2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.1.tgz#d5b01691253326a97a2bbee9e61c55d8d60351e2" +nan@^2.0.8, nan@^2.3.4, nan@^2.4.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" nan@~2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" +nan@~2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.1.tgz#d5b01691253326a97a2bbee9e61c55d8d60351e2" + ncp@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" @@ -1364,8 +1378,8 @@ nopt@^4.0.1: osenv "^0.1.4" normalize-package-data@^2.3.2: - version "2.3.6" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.6.tgz#498fa420c96401f787402ba21e600def9f981fff" + version "2.3.8" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" dependencies: hosted-git-info "^2.1.4" is-builtin-module "^1.0.0" @@ -1493,10 +1507,10 @@ pg-connection-string@0.1.3: resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7" pg-pool@1.*: - version "1.6.0" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-1.6.0.tgz#2e300199927b6d7db6be71e2e3435dddddf07b41" + version "1.7.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-1.7.1.tgz#421105cb7469979dcc48d6fc4fe3fe4659437437" dependencies: - generic-pool "2.4.2" + generic-pool "2.4.3" object-assign "4.1.0" pg-types@1.*: @@ -1509,7 +1523,7 @@ pg-types@1.*: postgres-date "~1.0.0" postgres-interval "~1.0.0" -pg@cartodb/node-postgres#6.1.2-cdb1: +"pg@github:cartodb/node-postgres#6.1.2-cdb1": version "6.1.2" resolved "https://codeload.github.com/cartodb/node-postgres/tar.gz/3c81aea432ce58d20a795786c58bbb14f68f9689" dependencies: @@ -1566,8 +1580,8 @@ postcss@5.0.19: supports-color "^3.1.2" postcss@^5.0.18, postcss@^5.2.5, postcss@~5.2.8: - version "5.2.16" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.16.tgz#732b3100000f9ff8379a48a53839ed097376ad57" + version "5.2.17" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b" dependencies: chalk "^1.1.3" js-base64 "^2.1.9" @@ -1660,8 +1674,8 @@ raw-body@~2.1.5: unpipe "1.0.0" rc@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.7.tgz#c5ea564bb07aff9fd3a5b32e906c1d3a65940fea" + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" dependencies: deep-extend "~0.4.0" ini "~1.3.0" @@ -1692,16 +1706,16 @@ readable-stream@1.1, readable-stream@~1.1.9: isarray "0.0.1" string_decoder "~0.10.x" -"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.1.4: - version "2.2.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.6.tgz#8b43aed76e71483938d12a8d46c6cf1a00b1f816" +readable-stream@^2.0.6, readable-stream@^2.1.4: + version "2.2.9" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" dependencies: - buffer-shims "^1.0.0" + buffer-shims "~1.0.0" core-util-is "~1.0.0" inherits "~2.0.1" isarray "~1.0.0" process-nextick-args "~1.0.6" - string_decoder "~0.10.x" + string_decoder "~1.0.0" util-deprecate "~1.0.1" readable-stream@~1.0.2: @@ -1730,7 +1744,7 @@ repeat-string@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" -request@2.x, request@^2.55.0, request@~2.79.0: +request@2.x, request@^2.55.0, request@^2.69.0, request@~2.79.0: version "2.79.0" resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" dependencies: @@ -1755,7 +1769,7 @@ request@2.x, request@^2.55.0, request@~2.79.0: tunnel-agent "~0.4.1" uuid "^3.0.0" -request@^2.69.0, request@^2.81.0: +request@^2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: @@ -1970,8 +1984,8 @@ srs@1.x: gdal "~0.9.2" sshpk@^1.7.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.11.0.tgz#2d8d5ebb4a6fab28ffba37fa62a90f4a3ea59d77" + version "1.13.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -2018,6 +2032,12 @@ string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" +string_decoder@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667" + dependencies: + buffer-shims "~1.0.0" + stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -2084,17 +2104,17 @@ through@2: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" -tilelive-bridge@cartodb/tilelive-bridge#2.3.1-cdb1: +tilelive-bridge@cartodb/tilelive-bridge#buffer-size: version "2.3.1-cdb1" - resolved "https://codeload.github.com/cartodb/tilelive-bridge/tar.gz/3f76c278c782e93d79045870387a0a06bace720b" + resolved "https://codeload.github.com/cartodb/tilelive-bridge/tar.gz/9df4bde07f3cf9ffbda42657066559e2b8875e1b" dependencies: mapnik "~3.5.0" mapnik-pool "~0.1.3" sphericalmercator "1.0.x" -tilelive-mapnik@cartodb/tilelive-mapnik#0.6.18-cdb1: +tilelive-mapnik@cartodb/tilelive-mapnik#fix-buffer-size-0: version "0.6.18-cdb1" - resolved "https://codeload.github.com/cartodb/tilelive-mapnik/tar.gz/cf7e5b4633db653a889a6c6e6a5ddcbcf4ddc3b5" + resolved "https://codeload.github.com/cartodb/tilelive-mapnik/tar.gz/c67400573572e836609dd75a7acec8f414a50dbe" dependencies: generic-pool "~2.4.0" mapnik "3.5.14" @@ -2163,15 +2183,15 @@ type-detect@^1.0.0: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" type-is@~1.6.10, type-is@~1.6.6: - version "1.6.14" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" + version "1.6.15" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" dependencies: media-typer "0.3.0" - mime-types "~2.1.13" + mime-types "~2.1.15" uglify-js@^2.6: - version "2.8.18" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.18.tgz#925d14bae48ab62d1883b41afe6e2261662adb8e" + version "2.8.22" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.22.tgz#d54934778a8da14903fa29a326fb24c0ab51a1a0" dependencies: source-map "~0.5.1" yargs "~3.10.0" @@ -2255,9 +2275,9 @@ window-size@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" -windshaft@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/windshaft/-/windshaft-3.1.0.tgz#dfac2dd27a2db97e35231510743ad7db574da18f" +windshaft@cartodb/windshaft#548-vector-buffer-size: + version "3.1.1" + resolved "https://codeload.github.com/cartodb/windshaft/tar.gz/09493bfff94371989532bef6dff734e4cd5cf058" dependencies: abaculus cartodb/abaculus#2.0.3-cdb1 canvas cartodb/node-canvas#1.6.2-cdb2 @@ -2274,8 +2294,8 @@ windshaft@3.1.0: sphericalmercator "1.0.4" step "~0.0.6" tilelive "5.12.2" - tilelive-bridge cartodb/tilelive-bridge#2.3.1-cdb1 - tilelive-mapnik cartodb/tilelive-mapnik#0.6.18-cdb1 + tilelive-bridge cartodb/tilelive-bridge#buffer-size + tilelive-mapnik cartodb/tilelive-mapnik#fix-buffer-size-0 torque.js "~2.11.0" underscore "~1.6.0" From 2c9d30e04279f59b0cdb7da03301743f0c6f23db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 10 May 2017 17:49:28 +0200 Subject: [PATCH 20/29] Be more flexible validating buffer-size customization --- .../adapter/mapconfig-named-map-adapter.js | 33 ++++++------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js index 76e8f3f5..3010db4a 100644 --- a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js @@ -1,35 +1,22 @@ -var _ = require('underscore'); - function MapConfigNamedMapAdapter() { } module.exports = MapConfigNamedMapAdapter; +var formats = ['png', 'png32', 'mvt', 'grid.json', 'geojson']; + MapConfigNamedMapAdapter.prototype.getMapConfig = function (user, requestMapConfig, params, context, callback) { - if (context.templateParams && - context.templateParams.buffersize && - isValidBufferSize(context.templateParams.buffersize)) { - requestMapConfig.buffersize = context.templateParams.buffersize; + if (!context.templateParams || !context.templateParams.buffersize) { + return callback(null, requestMapConfig); } + formats.forEach(function (format) { + if (Number.isFinite(context.templateParams.buffersize[format])) { + requestMapConfig.buffersize[format] = context.templateParams.buffersize[format]; + } + }); + process.nextTick(function () { callback(null, requestMapConfig); }); }; - -function isValidBufferSize (bufferSize) { - var formats = ['png', 'png32', 'mvt', 'grid.json', 'geojson']; - - if (!_.isObject(bufferSize) || (_.isArray(bufferSize) || _.isFunction(bufferSize))) { - return false; - } - - for (var index = 0; index < formats.length; index++) { - var bufferSizeByFormat = bufferSize[formats[index]]; - if (bufferSizeByFormat && !Number.isFinite(bufferSizeByFormat)) { - return false; - } - } - - return true; -} From 53d1b2fbbffc7ebf0236f34dcb34109dda29243e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 10 May 2017 18:16:22 +0200 Subject: [PATCH 21/29] Rename mapconfig-named-map-adapter by mapconfig-buffer-size-adapter --- ...amed-map-adapter.js => mapconfig-buffer-size-adapter.js} | 6 +++--- lib/cartodb/server.js | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) rename lib/cartodb/models/mapconfig/adapter/{mapconfig-named-map-adapter.js => mapconfig-buffer-size-adapter.js} (71%) diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-buffer-size-adapter.js similarity index 71% rename from lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js rename to lib/cartodb/models/mapconfig/adapter/mapconfig-buffer-size-adapter.js index 3010db4a..e362375b 100644 --- a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-buffer-size-adapter.js @@ -1,11 +1,11 @@ -function MapConfigNamedMapAdapter() { +function MapConfigBufferSizeAdapter() { } -module.exports = MapConfigNamedMapAdapter; +module.exports = MapConfigBufferSizeAdapter; var formats = ['png', 'png32', 'mvt', 'grid.json', 'geojson']; -MapConfigNamedMapAdapter.prototype.getMapConfig = function (user, requestMapConfig, params, context, callback) { +MapConfigBufferSizeAdapter.prototype.getMapConfig = function (user, requestMapConfig, params, context, callback) { if (!context.templateParams || !context.templateParams.buffersize) { return callback(null, requestMapConfig); } diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 22b14f5b..273f34c1 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -35,7 +35,7 @@ var timeoutErrorTile = require('fs').readFileSync(timeoutErrorTilePath, {encodin var SqlWrapMapConfigAdapter = require('./models/mapconfig/adapter/sql-wrap-mapconfig-adapter'); var MapConfigNamedLayersAdapter = require('./models/mapconfig/adapter/mapconfig-named-layers-adapter'); -var MapConfigNamedMapAdapter = require('./models/mapconfig/adapter/mapconfig-named-map-adapter'); +var MapConfigBufferSizeAdapter = require('./models/mapconfig/adapter/mapconfig-buffer-size-adapter'); var AnalysisMapConfigAdapter = require('./models/mapconfig/adapter/analysis-mapconfig-adapter'); var MapConfigOverviewsAdapter = require('./models/mapconfig/adapter/mapconfig-overviews-adapter'); var TurboCartoAdapter = require('./models/mapconfig/adapter/turbo-carto-adapter'); @@ -156,7 +156,7 @@ module.exports = function(serverOptions) { var mapConfigAdapter = new MapConfigAdapter( new MapConfigNamedLayersAdapter(templateMaps, pgConnection), - new MapConfigNamedMapAdapter(), + new MapConfigBufferSizeAdapter(), new SqlWrapMapConfigAdapter(), new DataviewsWidgetsAdapter(), new AnalysisMapConfigAdapter(analysisBackend), From 5a44d6c5470eee86aa23368a663a9b19d4a495d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 10 May 2017 18:35:30 +0200 Subject: [PATCH 22/29] Drop geojson support for buffersize customization --- .../adapter/mapconfig-buffer-size-adapter.js | 2 +- test/acceptance/buffer-size-format.js | 98 ------------------- 2 files changed, 1 insertion(+), 99 deletions(-) diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-buffer-size-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-buffer-size-adapter.js index e362375b..02ce6443 100644 --- a/lib/cartodb/models/mapconfig/adapter/mapconfig-buffer-size-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-buffer-size-adapter.js @@ -3,7 +3,7 @@ function MapConfigBufferSizeAdapter() { module.exports = MapConfigBufferSizeAdapter; -var formats = ['png', 'png32', 'mvt', 'grid.json', 'geojson']; +var formats = ['png', 'png32', 'mvt', 'grid.json']; MapConfigBufferSizeAdapter.prototype.getMapConfig = function (user, requestMapConfig, params, context, callback) { if (!context.templateParams || !context.templateParams.buffersize) { diff --git a/test/acceptance/buffer-size-format.js b/test/acceptance/buffer-size-format.js index f573057c..e62ee4a3 100644 --- a/test/acceptance/buffer-size-format.js +++ b/test/acceptance/buffer-size-format.js @@ -100,30 +100,6 @@ describe('buffer size per format', function () { callback(); } }, - { - desc: 'should get geojson tile using buffer-size 0 overriden by template params', - coords: { z: 7, x: 64, y: 48 }, - format: 'geojson', - fixturePath: './test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.geojson', - mapConfig: createMapConfig({ geojson: 0 }), - assert: function (tile, callback) { - var dataFixture = JSON.parse(fs.readFileSync(this.fixturePath)); - assert.equal(tile.features.length, dataFixture.features.length); - callback(); - } - }, - { - desc: 'should get geojson tile using buffer-size 128 overriden by template params', - coords: { z: 7, x: 64, y: 48 }, - format: 'geojson', - fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.geojson', - mapConfig: createMapConfig({ geojson: 128 }), - assert: function (tile, callback) { - var dataFixture = JSON.parse(fs.readFileSync(this.fixturePath)); - assert.equal(tile.features.length, dataFixture.features.length); - callback(); - } - }, { desc: 'should get grid.json tile using buffer-size 0 overriden by template params', coords: { z: 7, x: 64, y: 48 }, @@ -238,46 +214,6 @@ describe('buffer size per format for named maps', function () { assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); } }, - { - desc: 'should get geojson tile using buffer-size 0 overriden by template params', - coords: { z: 7, x: 64, y: 48 }, - format: 'geojson', - placeholders: { buffersize_geojson: 0 }, - fixturePath: './test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.geojson', - template: createBufferSizeTemplate('named-default-buffer-size-by-format-geojson', { - geojson: '<%= buffersize_geojson %>' - }, { - "buffersize_geojson": { - "type": "number", - "default": "0" - } - }), - assert: function (tile, callback) { - var dataFixture = JSON.parse(fs.readFileSync(this.fixturePath)); - assert.equal(tile.features.length, dataFixture.features.length); - callback(); - } - }, - { - desc: 'should get geojson tile using buffer-size 128 overriden by template params', - coords: { z: 7, x: 64, y: 48 }, - format: 'geojson', - placeholders: { buffersize_geojson: 128 }, - fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.geojson', - template: createBufferSizeTemplate('named-custom-buffer-size-by-format-geojson', { - geojson: '<%= buffersize_geojson %>' - }, { - "buffersize_geojson": { - "type": "number", - "default": "0" - } - }), - assert: function (tile, callback) { - var dataFixture = JSON.parse(fs.readFileSync(this.fixturePath)); - assert.equal(tile.features.length, dataFixture.features.length); - callback(); - } - }, { desc: 'should get grid.json tile using buffer-size 0 overriden by template params', coords: { z: 7, x: 64, y: 48 }, @@ -420,40 +356,6 @@ describe('buffer size per format for named maps w/o placeholders', function () { callback(); } }, - { - desc: 'should get geojson tile using buffer-size 0 overriden by template params', - coords: { z: 7, x: 64, y: 48 }, - format: 'geojson', - placeholders: { - buffersize: { - geojson: 0 - } - }, - fixturePath: './test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.geojson', - template: createBufferSizeTemplate('named-no-buffer-size-geojson-0', {}, {}), - assert: function (tile, callback) { - var dataFixture = JSON.parse(fs.readFileSync(this.fixturePath)); - assert.equal(tile.features.length, dataFixture.features.length); - callback(); - } - }, - { - desc: 'should get geojson tile using buffer-size 128 overriden by template params', - coords: { z: 7, x: 64, y: 48 }, - format: 'geojson', - placeholders: { - buffersize: { - geojson: 128 - } - }, - fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.geojson', - template: createBufferSizeTemplate('named-no-buffer-size-geojson-128', {}, {}), - assert: function (tile, callback) { - var dataFixture = JSON.parse(fs.readFileSync(this.fixturePath)); - assert.equal(tile.features.length, dataFixture.features.length); - callback(); - } - }, { desc: 'should get grid.json tile using buffer-size 0 overriden by template params', coords: { z: 7, x: 64, y: 48 }, From e13ae8d5aff6faea67c2594021f56ea9c8f8e29a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 17 May 2017 11:40:18 +0200 Subject: [PATCH 23/29] Do not make optional layer param in URL template --- lib/cartodb/controllers/layergroup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index fb1aab9b..79268d6e 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -56,7 +56,7 @@ LayergroupController.prototype.register = function(app) { this.tile.bind(this)); app.get(app.base_url_mapconfig + - '/:token/:z/:x/:y.(:format)', cors(), userMiddleware, + '/:token/:z/:x/:y.:format', cors(), userMiddleware, this.tile.bind(this)); app.get(app.base_url_mapconfig + From 13b1978d49ad5a68c1d683bf65796f1f4aa7d564 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 17 May 2017 11:40:53 +0200 Subject: [PATCH 24/29] Include layer param to reach the right tile for grid.json --- test/acceptance/buffer-size-format.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/test/acceptance/buffer-size-format.js b/test/acceptance/buffer-size-format.js index e62ee4a3..d5157585 100644 --- a/test/acceptance/buffer-size-format.js +++ b/test/acceptance/buffer-size-format.js @@ -104,6 +104,7 @@ describe('buffer size per format', function () { desc: 'should get grid.json tile using buffer-size 0 overriden by template params', coords: { z: 7, x: 64, y: 48 }, format: 'grid.json', + layers: [0], fixturePath: './test/fixtures/buffer-size/tile-grid.json.7.64.48-buffer-size-0.grid.json', mapConfig: createMapConfig({ 'grid.json': 0 }), assert: function (tile, callback) { @@ -114,6 +115,7 @@ describe('buffer size per format', function () { desc: 'should get grid.json tile using buffer-size 128 overriden by template params', coords: { z: 7, x: 64, y: 48 }, format: 'grid.json', + layers: [0], fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.grid.json', mapConfig: createMapConfig({ 'grid.json': 128 }), assert: function (tile, callback) { @@ -126,7 +128,11 @@ describe('buffer size per format', function () { it(test.desc, function (done) { var testClient = new TestClient(test.mapConfig, 1234); var coords = test.coords; - testClient.getTile(coords.z, coords.x, coords.y, { format: test.format }, function (err, res, tile) { + var options = { + format: test.format, + layers: test.layers + }; + testClient.getTile(coords.z, coords.x, coords.y, options, function (err, res, tile) { assert.ifError(err); // To generate images use: // tile.save(test.fixturePath); @@ -218,6 +224,7 @@ describe('buffer size per format for named maps', function () { desc: 'should get grid.json tile using buffer-size 0 overriden by template params', coords: { z: 7, x: 64, y: 48 }, format: 'grid.json', + layers: [0], placeholders: { buffersize_gridjson: 0 }, fixturePath: './test/fixtures/buffer-size/tile-grid.json.7.64.48-buffer-size-0.grid.json', template: createBufferSizeTemplate('named-default-buffer-size-by-format-gridjson', { @@ -236,6 +243,7 @@ describe('buffer size per format for named maps', function () { desc: 'should get grid.json tile using buffer-size 128 overriden by template params', coords: { z: 7, x: 64, y: 48 }, format: 'grid.json', + layers: [0], placeholders: { buffersize_gridjson: 128 }, fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.grid.json', template: createBufferSizeTemplate('named-custom-buffer-size-by-format-gridjson', { @@ -258,7 +266,8 @@ describe('buffer size per format for named maps', function () { var coords = test.coords; var options = { format: test.format, - placeholders: test.placeholders + placeholders: test.placeholders, + layers: test.layers }; testClient.getTile(coords.z, coords.x, coords.y, options, function (err, res, tile) { assert.ifError(err); @@ -360,6 +369,7 @@ describe('buffer size per format for named maps w/o placeholders', function () { desc: 'should get grid.json tile using buffer-size 0 overriden by template params', coords: { z: 7, x: 64, y: 48 }, format: 'grid.json', + layers: [0], placeholders: { buffersize: { 'grid.json': 0 @@ -375,6 +385,7 @@ describe('buffer size per format for named maps w/o placeholders', function () { desc: 'should get grid.json tile using buffer-size 128 overriden by template params', coords: { z: 7, x: 64, y: 48 }, format: 'grid.json', + layers: [0], placeholders: { buffersize: { 'grid.json': 128 @@ -394,7 +405,8 @@ describe('buffer size per format for named maps w/o placeholders', function () { var coords = test.coords; var options = { format: test.format, - placeholders: test.placeholders + placeholders: test.placeholders, + layers: test.layers }; testClient.getTile(coords.z, coords.x, coords.y, options, function (err, res, tile) { assert.ifError(err); From c59996303d056e20cf0924dca1a0654c3cef997c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 17 May 2017 12:04:11 +0200 Subject: [PATCH 25/29] Send stats for mvt tiles --- lib/cartodb/controllers/layergroup.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index 79268d6e..560f4267 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -253,7 +253,8 @@ LayergroupController.prototype.finalizeGetTileOrGrid = function(err, req, res, t grid_json: true, json_torque: true, torque_json: true, - png: true + png: true, + mvt: true }; var formatStat = 'invalid'; From 4602fb3ecfb420f4f7ac5089fbe3be5c200536fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 17 May 2017 12:16:16 +0200 Subject: [PATCH 26/29] Send stats for png32 tiles --- lib/cartodb/controllers/layergroup.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/cartodb/controllers/layergroup.js b/lib/cartodb/controllers/layergroup.js index 560f4267..e0c7a7a3 100644 --- a/lib/cartodb/controllers/layergroup.js +++ b/lib/cartodb/controllers/layergroup.js @@ -254,6 +254,7 @@ LayergroupController.prototype.finalizeGetTileOrGrid = function(err, req, res, t json_torque: true, torque_json: true, png: true, + png32: true, mvt: true }; From 808c729a0e831d10ff8b85cda09ba38f17615e8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 17 May 2017 12:33:41 +0200 Subject: [PATCH 27/29] Now supported formats for buffer-size customization are bound to the adapter --- .../mapconfig/adapter/mapconfig-buffer-size-adapter.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-buffer-size-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-buffer-size-adapter.js index 02ce6443..5b961ac4 100644 --- a/lib/cartodb/models/mapconfig/adapter/mapconfig-buffer-size-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-buffer-size-adapter.js @@ -1,16 +1,15 @@ function MapConfigBufferSizeAdapter() { + this.formats = ['png', 'png32', 'mvt', 'grid.json']; } module.exports = MapConfigBufferSizeAdapter; -var formats = ['png', 'png32', 'mvt', 'grid.json']; - MapConfigBufferSizeAdapter.prototype.getMapConfig = function (user, requestMapConfig, params, context, callback) { if (!context.templateParams || !context.templateParams.buffersize) { return callback(null, requestMapConfig); } - formats.forEach(function (format) { + this.formats.forEach(function (format) { if (Number.isFinite(context.templateParams.buffersize[format])) { requestMapConfig.buffersize[format] = context.templateParams.buffersize[format]; } From fb4ee61b8345519c17c9963222ecc60095604487 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Wed, 17 May 2017 12:55:05 +0200 Subject: [PATCH 28/29] Use setInmmediate vs process.nextTick --- .../models/mapconfig/adapter/mapconfig-buffer-size-adapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-buffer-size-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-buffer-size-adapter.js index 5b961ac4..3296d0ea 100644 --- a/lib/cartodb/models/mapconfig/adapter/mapconfig-buffer-size-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-buffer-size-adapter.js @@ -15,7 +15,7 @@ MapConfigBufferSizeAdapter.prototype.getMapConfig = function (user, requestMapCo } }); - process.nextTick(function () { + setImmediate(function () { callback(null, requestMapConfig); }); }; From fd178bcf71d4ee5b7eee9d1d0f39483192e63ac5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Thu, 18 May 2017 13:14:51 +0200 Subject: [PATCH 29/29] Upgrade windshaft to 3.2.0 --- package.json | 2 +- yarn.lock | 62 ++++++++++++++++++++-------------------------------- 2 files changed, 25 insertions(+), 39 deletions(-) diff --git a/package.json b/package.json index c2a0721f..d33bb526 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "step-profiler": "~0.3.0", "turbo-carto": "0.19.0", "underscore": "~1.6.0", - "windshaft": "cartodb/windshaft#548-vector-buffer-size", + "windshaft": "3.2.0", "yargs": "~5.0.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 8a9fd937..a203d58e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -abaculus@cartodb/abaculus#2.0.3-cdb1: +"abaculus@github:cartodb/abaculus#2.0.3-cdb1": version "2.0.3-cdb1" resolved "https://codeload.github.com/cartodb/abaculus/tar.gz/f5f34e1c80cdd8d49edd1d6fe3b2220ab2e23aaf" dependencies: @@ -205,7 +205,7 @@ camshaft@0.54.4: dot "^1.0.3" request "^2.69.0" -canvas@cartodb/node-canvas#1.6.2-cdb2: +"canvas@github:cartodb/node-canvas#1.6.2-cdb2": version "1.6.2-cdb2" resolved "https://codeload.github.com/cartodb/node-canvas/tar.gz/8acf04557005c633f9e68524488a2657c04f3766" dependencies: @@ -223,7 +223,15 @@ carto@0.16.3: semver "^5.1.0" yargs "^4.2.0" -carto@cartodb/carto#0.15.1-cdb3: +carto@CartoDB/carto#0.15.1-cdb1: + version "0.15.1-cdb1" + resolved "https://codeload.github.com/CartoDB/carto/tar.gz/8050ec843f1f32a6469e5d1cf49602773015d398" + dependencies: + mapnik-reference "~6.0.2" + optimist "~0.6.0" + underscore "~1.6.0" + +"carto@github:cartodb/carto#0.15.1-cdb3": version "0.15.1-cdb3" resolved "https://codeload.github.com/cartodb/carto/tar.gz/945f5efb74fd1af1f5e1f69f409f9567f94fb5a7" dependencies: @@ -231,14 +239,6 @@ carto@cartodb/carto#0.15.1-cdb3: optimist "~0.6.0" underscore "1.8.3" -"carto@github:cartodb/carto#0.15.1-cdb1": - version "0.15.1-cdb1" - resolved "https://codeload.github.com/cartodb/carto/tar.gz/8050ec843f1f32a6469e5d1cf49602773015d398" - dependencies: - mapnik-reference "~6.0.2" - optimist "~0.6.0" - underscore "~1.6.0" - cartocolor@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cartocolor/-/cartocolor-4.0.0.tgz#841a3222d8b5b22718d9d545b1e5b972cb26eb36" @@ -738,7 +738,7 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -glob@3.2.3: +glob@3.2.3, "glob@~ 3.2.1": version "3.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.3.tgz#e313eeb249c7affaa5c475286b0e115b59839467" dependencies: @@ -777,13 +777,6 @@ glob@^7.0.5: once "^1.3.0" path-is-absolute "^1.0.0" -"glob@~ 3.2.1": - version "3.2.11" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" - dependencies: - inherits "2" - minimatch "0.3" - graceful-fs@^4.1.2: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -1227,13 +1220,6 @@ mime@~1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" -minimatch@0.3: - version "0.3.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" - dependencies: - lru-cache "2" - sigmund "~1.0.0" - minimatch@1.0.x: version "1.0.0" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-1.0.0.tgz#e0dd2120b49e1b724ce8d714c520822a9438576d" @@ -1527,7 +1513,7 @@ pg-types@1.*: postgres-date "~1.0.0" postgres-interval "~1.0.0" -"pg@github:cartodb/node-postgres#6.1.2-cdb1": +pg@cartodb/node-postgres#6.1.2-cdb1: version "6.1.2" resolved "https://codeload.github.com/cartodb/node-postgres/tar.gz/3c81aea432ce58d20a795786c58bbb14f68f9689" dependencies: @@ -2108,17 +2094,17 @@ through@2: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" -tilelive-bridge@cartodb/tilelive-bridge#buffer-size: - version "2.3.1-cdb1" - resolved "https://codeload.github.com/cartodb/tilelive-bridge/tar.gz/9df4bde07f3cf9ffbda42657066559e2b8875e1b" +"tilelive-bridge@github:cartodb/tilelive-bridge#2.3.1-cdb2": + version "2.3.1-cdb2" + resolved "https://codeload.github.com/cartodb/tilelive-bridge/tar.gz/0346c634875ac87dbf8316cb81ac46d2c30fe313" dependencies: mapnik "~3.5.0" mapnik-pool "~0.1.3" sphericalmercator "1.0.x" -tilelive-mapnik@cartodb/tilelive-mapnik#fix-buffer-size-0: - version "0.6.18-cdb1" - resolved "https://codeload.github.com/cartodb/tilelive-mapnik/tar.gz/c67400573572e836609dd75a7acec8f414a50dbe" +"tilelive-mapnik@github:cartodb/tilelive-mapnik#0.6.18-cdb2": + version "0.6.18-cdb2" + resolved "https://codeload.github.com/cartodb/tilelive-mapnik/tar.gz/46f1adefee90f3f46c0ede5e0833f8522634a858" dependencies: generic-pool "~2.4.0" mapnik "3.5.14" @@ -2279,9 +2265,9 @@ window-size@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" -windshaft@cartodb/windshaft#548-vector-buffer-size: - version "3.1.1" - resolved "https://codeload.github.com/cartodb/windshaft/tar.gz/09493bfff94371989532bef6dff734e4cd5cf058" +windshaft@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/windshaft/-/windshaft-3.2.0.tgz#c69f8d199bbeccc96e66b8256928e6fa87999803" dependencies: abaculus cartodb/abaculus#2.0.3-cdb1 canvas cartodb/node-canvas#1.6.2-cdb2 @@ -2298,8 +2284,8 @@ windshaft@cartodb/windshaft#548-vector-buffer-size: sphericalmercator "1.0.4" step "~0.0.6" tilelive "5.12.2" - tilelive-bridge cartodb/tilelive-bridge#buffer-size - tilelive-mapnik cartodb/tilelive-mapnik#fix-buffer-size-0 + tilelive-bridge cartodb/tilelive-bridge#2.3.1-cdb2 + tilelive-mapnik cartodb/tilelive-mapnik#0.6.18-cdb2 torque.js "~2.11.0" underscore "~1.6.0"