Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion api/auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ var urls = require('./urls');
*/
function login(email, password) {
var config = {
url: urls.LOGIN,
url: urls.login(),
body: {
email: email,
password: password
Expand Down
4 changes: 2 additions & 2 deletions api/mosaics.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ var util = require('./util');
function get(id, options) {
options = options || {};
var config = {
url: urls.join(urls.MOSAICS, id),
url: urls.mosaics(id),
terminator: options.terminator
};
return request.get(config).then(function(res) {
Expand All @@ -51,7 +51,7 @@ function get(id, options) {
function search(query, options) {
options = options || {};
var config = {
url: urls.MOSAICS,
url: urls.mosaics(),
query: query,
terminator: options.terminator
};
Expand Down
6 changes: 3 additions & 3 deletions api/quads.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ var util = require('./util');
function get(mosaicId, quadId, options) {
options = options || {};
var config = {
url: urls.join(urls.MOSAICS, mosaicId, 'quads', quadId),
url: urls.mosaics(mosaicId, 'quads', quadId),
terminator: options.terminator
};
return request.get(config).then(function(res) {
Expand Down Expand Up @@ -53,7 +53,7 @@ function get(mosaicId, quadId, options) {
function search(mosaicId, query, options) {
options = options || {};
var config = {
url: urls.join(urls.MOSAICS, mosaicId, 'quads', ''),
url: urls.mosaics(mosaicId, 'quads', ''),
query: query,
terminator: options.terminator
};
Expand Down Expand Up @@ -85,7 +85,7 @@ function search(mosaicId, query, options) {
function scenes(mosaicId, quadId, options) {
options = options || {};
var config = {
url: urls.join(urls.MOSAICS, mosaicId, 'quads', quadId, 'scenes', ''),
url: urls.mosaics(mosaicId, 'quads', quadId, 'scenes', ''),
terminator: options.terminator
};
return request.get(config).then(function(res) {
Expand Down
4 changes: 2 additions & 2 deletions api/scenes.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ function get(scene, options) {
};
}
var config = {
url: urls.join(urls.SCENES, scene.type, scene.id),
url: urls.scenes(scene.type, scene.id),
terminator: options.terminator
};
return request.get(config).then(function(res) {
Expand Down Expand Up @@ -67,7 +67,7 @@ function search(query, options) {
}

var config = {
url: urls.join(urls.SCENES, type, ''),
url: urls.scenes(type, ''),
query: query,
terminator: options.terminator
};
Expand Down
37 changes: 29 additions & 8 deletions api/urls.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,48 @@
* @private
*/

var API = require('./config').API_URL;
var config = require('./config');

/**
* Join multiple URL parts with slashes. Note that any trailing and preceeding
* slashes will be removed from the parts before they are joined.
* A single trailing slash can forced by an empty string as the final vararg.
* @return {string} The joined URL.
*/
function join() {
return Array.prototype.map.call(arguments, function(part) {
var components = Array.prototype.map.call(arguments, function(part) {
if (!(typeof part === 'string' || typeof part === 'number')) {
throw new Error(
'join must be called with strings or numbers, got: ' + part);
}
return String(part).replace(/^\/?(.*?)\/?$/, '$1');
}).join('/');
});

// Preserve trailing slashes but remove every other interstitial.
var lastComponent = components.pop();
return components
.filter(function(el) {
return el !== '';
})
.concat(lastComponent)
.join('/');
}

function rootUrl() {
var baseComponents = Array.prototype.slice.call(arguments);
return function() {
return join.apply(null,
[config.API_URL]
.concat(baseComponents)
.concat(Array.prototype.slice.call(arguments))
);
};
}

exports.API = API;
exports.MOSAICS = join(API, 'mosaics', '');
exports.SCENES = join(API, 'scenes', '');
exports.WORKSPACES = join(API, 'workspaces', '');
exports.LOGIN = join(API, 'auth', 'login');
exports.api = rootUrl();
exports.mosaics = rootUrl('mosaics', '');
exports.scenes = rootUrl('scenes', '');
exports.workspaces = rootUrl('workspaces', '');
exports.login = rootUrl('auth', 'login');

exports.join = join;
4 changes: 2 additions & 2 deletions api/workspaces.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ var request = require('./request');
var urls = require('./urls');

function get(id) {
var url = urls.join(urls.WORKSPACES, id);
var url = urls.workspaces(id);
return request.get(url).then(function(res) {
return res.body;
});
}

function search() {
var url = urls.WORKSPACES;
var url = urls.workspaces();
return request.get(url).then(function(res) {
return res.body;
});
Expand Down
6 changes: 4 additions & 2 deletions test/api/mosaics.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ var mosaics = require('../../api/mosaics');
var urls = require('../../api/urls');
var util = require('../../api/util');

var MOSAICS = 'https://api.planet.com/v0/mosaics/';

describe('api/mosaics', function() {

var mosaic;
Expand Down Expand Up @@ -61,7 +63,7 @@ describe('api/mosaics', function() {
var promise = mosaics.get('one');
assert.lengthOf(calls, 1);
var arg = calls[0];
assert.equal(arg.url, urls.join(urls.MOSAICS, 'one'));
assert.equal(arg.url, urls.join(MOSAICS, 'one'));

promise.then(function(got) {
assert.deepEqual(got, mosaic);
Expand Down Expand Up @@ -130,7 +132,7 @@ describe('api/mosaics', function() {
var promise = mosaics.search(query);

var arg = calls[0];
assert.equal(arg.url, urls.MOSAICS);
assert.equal(arg.url, MOSAICS);
assert.deepEqual(arg.query, query);

promise.then(function(got) {
Expand Down
8 changes: 5 additions & 3 deletions test/api/quads.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ var quads = require('../../api/quads');
var urls = require('../../api/urls');
var util = require('../../api/util');

var MOSAICS = 'https://api.planet.com/v0/mosaics/';

describe('api/mosaics', function() {

var quad;
Expand Down Expand Up @@ -66,7 +68,7 @@ describe('api/mosaics', function() {
assert.lengthOf(calls, 1);
var arg = calls[0];
assert.equal(arg.url,
urls.join(urls.MOSAICS, 'my-mosaic', 'quads', 'my-quad'));
urls.join(MOSAICS, 'my-mosaic', 'quads', 'my-quad'));

promise.then(function(got) {
assert.deepEqual(got, quad);
Expand Down Expand Up @@ -135,7 +137,7 @@ describe('api/mosaics', function() {
var promise = quads.search('my-mosaic', query);

var arg = calls[0];
assert.equal(arg.url, urls.join(urls.MOSAICS, 'my-mosaic', 'quads', ''));
assert.equal(arg.url, urls.join(MOSAICS, 'my-mosaic', 'quads', ''));
assert.deepEqual(arg.query, query);

promise.then(function(got) {
Expand Down Expand Up @@ -226,7 +228,7 @@ describe('api/mosaics', function() {

var arg = calls[0];
assert.equal(arg.url, urls.join(
urls.MOSAICS, 'my-mosaic', 'quads', 'my-quad', 'scenes', ''));
MOSAICS, 'my-mosaic', 'quads', 'my-quad', 'scenes', ''));

promise.then(function(got) {
assert.lengthOf(got.features, 1);
Expand Down
10 changes: 6 additions & 4 deletions test/api/scenes.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ var scenes = require('../../api/scenes');
var urls = require('../../api/urls');
var util = require('../../api/util');

var SCENES = 'https://api.planet.com/v0/scenes/';

describe('api/scenes', function() {

var get = request.get;
Expand Down Expand Up @@ -52,7 +54,7 @@ describe('api/scenes', function() {
var promise = scenes.get({type: 'foo', id: 'bar'});
assert.lengthOf(calls, 1);
var arg = calls[0];
assert.equal(arg.url, urls.join(urls.SCENES, 'foo', 'bar'));
assert.equal(arg.url, urls.join(SCENES, 'foo', 'bar'));

promise.then(function(got) {
assert.deepEqual(got, scene);
Expand All @@ -71,7 +73,7 @@ describe('api/scenes', function() {
};

var promise = scenes.get('bar');
assert.equal(calls[0].url, urls.join(urls.SCENES, 'ortho', 'bar'));
assert.equal(calls[0].url, urls.join(SCENES, 'ortho', 'bar'));

promise.then(function(got) {
assert.deepEqual(got, scene);
Expand Down Expand Up @@ -160,7 +162,7 @@ describe('api/scenes', function() {
var promise = scenes.search(query);

var arg = calls[0];
assert.equal(arg.url, urls.join(urls.SCENES, 'landsat', ''));
assert.equal(arg.url, urls.join(SCENES, 'landsat', ''));
assert.deepEqual(arg.query, query);

promise.then(function(got) {
Expand Down Expand Up @@ -191,7 +193,7 @@ describe('api/scenes', function() {
var promise = scenes.search(query);

var arg = calls[0];
assert.equal(arg.url, urls.join(urls.SCENES, 'ortho', ''));
assert.equal(arg.url, urls.join(SCENES, 'ortho', ''));
assert.deepEqual(arg.query, query);

promise.then(function(got) {
Expand Down
18 changes: 18 additions & 0 deletions test/api/urls.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ describe('api/urls', function() {
}, {
actual: urls.join('http://example.com', 'foo/', '/bar/', 'bam/'),
expected: 'http://example.com/foo/bar/bam'
}, {
actual: urls.join('http://example.com', '', 'foo/', 'bam/', '', ''),
expected: 'http://example.com/foo/bam/'
}];

for (var i = 0, ii = cases.length; i < ii; ++i) {
Expand Down Expand Up @@ -72,6 +75,21 @@ describe('api/urls', function() {
assert.throws(call, Error, 'join must be called with strings or numbers');
});

it('works with degenerate cases', function() {
var cases = [{
actual: urls.join(),
expected: ''
}, {
actual: urls.join('', ''),
expected: ''
}];

for (var i = 0, ii = cases.length; i < ii; ++i) {
var c = cases[i];
assert.deepEqual(c.actual, c.expected, 'case ' + i);
}
});

});

});