Source: modules/Interface.js

/*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
Copyright © Kyle Hornberg 2014
Documentation generated by JSDoc 3.2.2 on Thu Apr 03 2014 13:07:00 GMT-0500 (CDT) using the DocStrap template.