From 349935b38191c16150538c559ca942e5e1792f3c Mon Sep 17 00:00:00 2001 From: Brandon Liu Date: Wed, 16 Jan 2013 22:32:10 -0800 Subject: [PATCH 1/2] Fix build. --- test/spec/taginfo.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/test/spec/taginfo.js b/test/spec/taginfo.js index b41c760e0..9efe750ea 100644 --- a/test/spec/taginfo.js +++ b/test/spec/taginfo.js @@ -22,13 +22,12 @@ describe("iD.taginfo", function() { server.respondWith("GET", new RegExp("http://taginfo.openstreetmap.org/api/4/keys/all"), [200, { "Content-Type": "application/json" }, - '{"data":[{"count_all":5190337,"key":"amenity"}]}']); + '{"data":[{"count_all":5190337,"key":"amenity","count_undefined_fraction":1}]}']); server.respond(); expect(query(server.requests[0].url)).to.eql( {query: "amen", page: "1", rp: "6", sortname: "count_all", sortorder: "desc"}); - expect(callback).to.have.been.calledWith(null, - {"data":[{"count_all":5190337,"key":"amenity"}]}); + expect(callback).to.have.been.calledWith(null, [{"value":"amenity"}]); }); }); @@ -41,13 +40,12 @@ describe("iD.taginfo", function() { server.respondWith("GET", new RegExp("http://taginfo.openstreetmap.org/api/4/key/values"), [200, { "Content-Type": "application/json" }, - '{"data":[{"value":"parking","description":"A place for parking cars"}]}']); + '{"data":[{"value":"parking","description":"A place for parking cars", "fraction":1}]}']); server.respond(); expect(query(server.requests[0].url)).to.eql( {key: "amenity", query: "par", page: "1", rp: "20", sortname: 'count_all', sortorder: 'desc'}); - expect(callback).to.have.been.calledWith(null, - {"data":[{"value":"parking","description":"A place for parking cars"}]}); + expect(callback).to.have.been.calledWith(null, [{"value":"parking","title":"A place for parking cars"}]); }); }); From 48d93f2f38903364c0b71b37e3027d17d09bda71 Mon Sep 17 00:00:00 2001 From: Brandon Liu Date: Wed, 16 Jan 2013 23:20:56 -0800 Subject: [PATCH 2/2] tag autocomplete can filter keys by element type. --- js/id/services/taginfo.js | 14 ++++++---- test/spec/taginfo.js | 58 ++++++++++++++++++++++++++++++++------- 2 files changed, 57 insertions(+), 15 deletions(-) diff --git a/js/id/services/taginfo.js b/js/id/services/taginfo.js index 3e7de3859..aa89a37fa 100644 --- a/js/id/services/taginfo.js +++ b/js/id/services/taginfo.js @@ -33,12 +33,16 @@ iD.taginfo = function() { return _.omit(parameters, 'geometry'); } - function popular(parameters) { - var pop_field = 'fraction'; - if (parameters) pop_field = 'count_' + parameters.filter + '_fraction'; + function popularKeys(parameters) { + var pop_field = 'count_all_fraction'; + if (parameters.filter) pop_field = 'count_' + parameters.filter + '_fraction'; return function(d) { return parseFloat(d[pop_field]) > 0.01; }; } + function popularValues(parameters) { + return function(d) { return parseFloat(d['fraction']) > 0.01; }; + } + function valKey(d) { return { value: d.key }; } function valKeyDescription(d) { @@ -58,7 +62,7 @@ iD.taginfo = function() { page: 1 }, parameters)), function(err, d) { if (err) return callback(err); - callback(null, d.data.filter(popular(parameters)).map(valKey)); + callback(null, d.data.filter(popularKeys(parameters)).map(valKey)); }); }; @@ -72,7 +76,7 @@ iD.taginfo = function() { page: 1 }, parameters)), function(err, d) { if (err) return callback(err); - callback(null, d.data.filter(popular()).map(valKeyDescription)); + callback(null, d.data.filter(popularValues()).map(valKeyDescription)); }); }; diff --git a/test/spec/taginfo.js b/test/spec/taginfo.js index 9efe750ea..61f7bcea0 100644 --- a/test/spec/taginfo.js +++ b/test/spec/taginfo.js @@ -1,8 +1,9 @@ describe("iD.taginfo", function() { - var server; + var server, taginfo; beforeEach(function() { server = sinon.fakeServer.create(); + taginfo = iD.taginfo(); }); afterEach(function() { @@ -15,44 +16,81 @@ describe("iD.taginfo", function() { describe("#keys", function() { it("calls the given callback with the results of the keys query", function() { - var taginfo = iD.taginfo(), - callback = sinon.spy(); - + var callback = sinon.spy(); taginfo.keys({query: "amen"}, callback); server.respondWith("GET", new RegExp("http://taginfo.openstreetmap.org/api/4/keys/all"), [200, { "Content-Type": "application/json" }, - '{"data":[{"count_all":5190337,"key":"amenity","count_undefined_fraction":1}]}']); + '{"data":[{"count_all":5190337,"key":"amenity","count_all_fraction":1.0}]}']); server.respond(); expect(query(server.requests[0].url)).to.eql( {query: "amen", page: "1", rp: "6", sortname: "count_all", sortorder: "desc"}); expect(callback).to.have.been.calledWith(null, [{"value":"amenity"}]); }); + + it("filters only popular nodes", function() { + var callback = sinon.spy(); + taginfo.keys({query: "amen"}, callback); + + server.respondWith("GET", new RegExp("http://taginfo.openstreetmap.org/api/4/keys/all"), + [200, { "Content-Type": "application/json" }, + '{"data":[{"count_all":5190337,"key":"amenity","count_all_fraction":1.0, "count_nodes_fraction":1.0},\ + {"count_all":1,"key":"amenityother","count_all_fraction":0.0, "count_nodes_fraction":0.0}]}']); + server.respond(); + + expect(callback).to.have.been.calledWith(null, [{"value":"amenity"}]); + }); + + it("filters only popular nodes with an entity type filter", function() { + var callback = sinon.spy(); + + taginfo.keys({query: "amen", filter: "nodes"}, callback); + + server.respondWith("GET", new RegExp("http://taginfo.openstreetmap.org/api/4/keys/all"), + [200, { "Content-Type": "application/json" }, + '{"data":[{"count_all":5190337,"key":"amenity","count_all_fraction":1.0, "count_nodes_fraction":1.0},\ + {"count_all":1,"key":"amenityother","count_all_fraction":0.0, "count_nodes_fraction":1.0}]}']); + server.respond(); + + expect(callback).to.have.been.calledWith(null, [{"value":"amenity"},{"value":"amenityother"}]); + }); }); describe("#values", function() { it("calls the given callback with the results of the values query", function() { - var taginfo = iD.taginfo(), - callback = sinon.spy(); + var callback = sinon.spy(); taginfo.values({key: "amenity", query: "par"}, callback); server.respondWith("GET", new RegExp("http://taginfo.openstreetmap.org/api/4/key/values"), [200, { "Content-Type": "application/json" }, - '{"data":[{"value":"parking","description":"A place for parking cars", "fraction":1}]}']); + '{"data":[{"value":"parking","description":"A place for parking cars", "fraction":0.1}]}']); server.respond(); expect(query(server.requests[0].url)).to.eql( {key: "amenity", query: "par", page: "1", rp: "20", sortname: 'count_all', sortorder: 'desc'}); expect(callback).to.have.been.calledWith(null, [{"value":"parking","title":"A place for parking cars"}]); }); + + it("filters popular values", function() { + var callback = sinon.spy(); + + taginfo.values({key: "amenity", query: "par"}, callback); + + server.respondWith("GET", new RegExp("http://taginfo.openstreetmap.org/api/4/key/values"), + [200, { "Content-Type": "application/json" }, + '{"data":[{"value":"parking","description":"A place for parking cars", "fraction":1.0},\ + {"value":"party","description":"A place for partying", "fraction":0.0}]}']); + server.respond(); + + expect(callback).to.have.been.calledWith(null, [{"value":"parking","title":"A place for parking cars"}]); + }); }); describe("#docs", function() { it("calls the given callback with the results of the docs query", function() { - var taginfo = iD.taginfo(), - callback = sinon.spy(); + var callback = sinon.spy(); taginfo.docs({key: "amenity", value: "parking"}, callback);