docs: function(uploadUrl, assetName, assetLabel, localFilePath, contentType) {
  		var deferred = Q.defer();
  
  		try {
  			var token = config.token;
  
  			// Remove this from URL: {?name,label}
  			if (uploadUrl.substring(uploadUrl.length - 13) == '{?name,label}'){
  				uploadUrl = uploadUrl.substring(0, uploadUrl.length - 13);
  			}
  
  			// Add name and label to URL
  			uploadUrl += '?name=' + encodeURIComponent(assetName) + '&label=' + encodeURIComponent(assetLabel);
  
  			// Get file contents
  			fs.readFile(localFilePath, function(err, data) {
  				// Check for error
  				if (err) {
  					console.log(err);
  					deferred.reject(err);
  					return;
  				}
  
  				// POST file to github
  				request
  					.post(uploadUrl)
  					.set('Authorization', 'token ' + token)
  					.set('Content-Type', contentType)
  					.send(data)
  					.then(function(res) {
  						logRequestSuccess(res);
  						deferred.resolve(res.body);
  					}, 
  					function(err) {
  						if (err.status == '422'){
  							console.log('Upload failed. Error body: ');
  							console.log(JSON.stringify(err.body, null, 2));
  						}
  						logRequestError(err);
  						deferred.reject(err.message);
  					});
  			});
  		} catch(err) {
  			console.log(err);
  			deferred.reject(err.message);
  		}
  
  		return deferred.promise;
  	}