/*jslint vars: true, plusplus: true, devel: true, nomen: true, regexp: true, indent: 4, maxerr: 50 */
/*global define, $, brackets */
/**
* Provides the abstract interface for all managers.
* @class Interface
* @classdesc While not strictly an abstract class in the OOP sense it acts as an interface
* between the GUI and manager modules. Managers implement most of the the class methods.
* @todo Dynamically load and add managers
*/
define(function (require, exports, module) {
'use strict';
// Dependencies
var ExtensionUtils = brackets.getModule("utils/ExtensionUtils"),
moduleDirectory = ExtensionUtils.getModulePath(module),
managerDirectory = moduleDirectory + "/managers/",
//Tests directory
// managerDirectory = moduleDirectory + "../tests/managers/",
/**
* @example
*
* Managers are added here by hand currently. Do so by adding the manager file name to the managerModules array.
* Then add a new variable that follows the present pattern.
* TODO Dynamically load managers
*/
/**
* The name of the manager file. Include the .js extension. This should also be the name of the manager within the module.
* @param managerModules
* @type {Array}
*/
// managerModules = ["example.js", "example2.js", "template.js"];
managerModules = ["bower.js"];
/**
* Install package/dependency
* @memberof Interface
* @abstract
* @param {String} managerModule Manager name as defined in the `managerModules` array
* @param {String} packageName Unique package/dependency name
* @return {Status} Deferred* Installed Status object
*/
function install (managerModule, packageName) {
var deferred = $.Deferred();
require([managerDirectory + managerModule], function (manager) {
deferred.resolve( manager.install(packageName) );
});
return deferred.promise();
}
/**
* Uninstall package/dependency
* @memberof Interface
* @abstract
* @param {String} managerModule Manager name as defined in the `managerModules` array
* @param {String} packageName Unique package/dependency name
* @return {Status} Deferred* Uninstalled Status object
*/
function uninstall (managerModule, packageName) {
var deferred = $.Deferred();
require([managerDirectory + managerModule], function (manager) {
deferred.resolve( manager.uninstall(packageName) );
});
return deferred.promise();
}
/**
* Update package/dependency
* @memberof Interface
* @abstract
* @param {String} managerModule Manager name as defined in the `managerModules` array
* @param {String} packageName Unique package/dependency name
* @return {Status} Deferred* Updated Status object
*/
function update (managerModule, packageName) {
var deferred = $.Deferred();
require([managerDirectory + managerModule], function (manager) {
deferred.resolve( manager.update(packageName) );
});
return deferred.promise();
}
/**
* Searches one or more managers for a package
* @memberof Interface
* @abstract
* @param {String} searchManager Manager name as defined in the `managerModules` array. Optional
* @param {String} query Search query
* @return {Array} Deferred* Search result objects
*/
function search () {
// search (searchManager, query)
var searchManager = (arguments.length > 1) ? arguments[0] : undefined,
query = (arguments.length > 1) ? arguments[1]: arguments[0],
results = [];
// search using a single manager
if (searchManager !== undefined) {
var deferred = $.Deferred();
require([managerDirectory + searchManager], function (manager) {
deferred.resolve(manager.search(query));
});
results.push(deferred.promise());
return results;
}
managerModules.forEach(function (managerModule) {
var deferred = $.Deferred();
require([managerDirectory + managerModule], function (manager) {
deferred.resolve(manager.search(query));
});
results.push(deferred.promise());
});
return results;
}
/**
* Returns installed packages/dependencies
* @memberof Interface
* @abstract
* @param {String} managerName Manager name as defined in the `managerModules` array. Optional.
* @return {Array} Deferred* Array of Result objects
*/
function getInstalled () {
// getInstalled (managerName)
var managerName = (arguments.length === 1) ? arguments[0] : undefined,
results = [];
if (managerName !== undefined) {
var deferred = $.Deferred();
require([managerDirectory + managerName], function (manager) {
deferred.resolve(manager.getInstalled());
});
results.push(deferred.promise());
return results;
}
managerModules.forEach(function (managerModule) {
var deferred = $.Deferred();
require([managerDirectory + managerModule], function (manager) {
deferred.resolve(manager.getInstalled());
});
results.push(deferred.promise());
});
return results;
}
// Helper methods
/**
* Returns manager module names added to a static array
* @memberof Interface
* @return {Array} Manager module names
*/
function getManagers () {
return managerModules;
}
/**
* Returns availble managers after a test is performed to ensure the manager is available
* @memberof Interface
* @return {Array} Deferred* Array of manager module names
*/
function getAvailable () {
var available = [];
managerModules.forEach(function (managerModule) {
var deferred = $.Deferred();
require([managerDirectory + managerModule], function (manager) {
deferred.resolve(manager.isAvailable());
});
available.push(deferred.promise());
});
return available;
}
// TODO remove?
// opens readme in default browser
function openReadme (managerModule, packageName) {
var NativeApp = brackets.getModule("utils/NativeApp");
require([managerDirectory + managerModule], function (manager) {
NativeApp.openURLInDefaultBrowser(manager.getReadme(packageName));
});
}
// opens project url in default brwoser
function openUrl (managerModule, packageName) {
var NativeApp = brackets.getModule("utils/NativeApp");
require([managerDirectory + managerModule], function (manager) {
NativeApp.openURLInDefaultBrowser(manager.getUrl(packageName));
});
}
// gets project url
function getUrl (managerModule, packageName) {
var deferred = $.Deferred();
require([managerDirectory + managerModule], function (manager) {
deferred.resolve(manager.getUrl(packageName));
});
return deferred.promise();
}
exports.install = install;
exports.uninstall = uninstall;
exports.update = update;
exports.search = search;
exports.getInstalled = getInstalled;
exports.getManagers = getManagers;
exports.getAvailable = getAvailable;
exports.openReadme = openReadme;
exports.openUrl = openUrl;
exports.getUrl = getUrl;
});
//sdg