def process(package, output, dynamic):
            plugin = self.get_plugin(package.name)
            if dynamic:
                plugin_subdir = path("plugins")
                plugin_dir = output_dir / plugin_subdir
                if not plugin_dir.isdir():
                    plugin_dir.makedirs()
                plugin_filename = package.name + ".js"
                plugin_location = plugin_subdir / plugin_filename
                self._created_javascript.add(plugin_location)
                combine_output_path = plugin_dir / plugin_filename
                combine_output = combine_output_path.open("w")
            else:
                plugin_location = None
                combine_output = output

            combiner.write_metadata(output, plugin, plugin_location)

            combiner.combine_files(combine_output,
                                   css_file,
                                   plugin,
                                   plugin.location,
                                   exclude_tests=exclude_tests,
                                   image_path_prepend="resources/%s/" %
                                   plugin.name)
            if dynamic:
                combine_output.write("bespin.tiki.script(%s);" %
                                     dumps(plugin_filename))
        def process(package, output, dynamic):
            plugin = self.get_plugin(package.name)
            if dynamic:
                plugin_subdir = path("plugins")
                plugin_dir = output_dir / plugin_subdir
                if not plugin_dir.isdir():
                    plugin_dir.makedirs()
                plugin_filename = package.name + ".js"
                plugin_location = plugin_subdir / plugin_filename
                self._created_javascript.add(plugin_location)
                combine_output_path = plugin_dir / plugin_filename
                combine_output = combine_output_path.open("w")
            else:
                plugin_location = None
                combine_output = output

            combiner.write_metadata(output, plugin, plugin_location)
            
            combiner.combine_files(combine_output, css_file, plugin,
                                   plugin.location,
                                   exclude_tests=exclude_tests,
                                   image_path_prepend="resources/%s/"
                                                      % plugin.name)
            if dynamic:
                combine_output.write("bespin.tiki.script(%s);" %
                    dumps(plugin_filename))
def main(args=None):
    if args is None:
        args = sys.argv

    print "dryice: the Bespin build tool"
    parser = optparse.OptionParser(
        description="""Builds fast-loading JS and CSS packages.""")
    parser.add_option(
        "-j",
        "--jscompressor",
        dest="jscompressor",
        help="path to Closure Compiler to compress the JS output")
    parser.add_option("-c",
                      "--csscompressor",
                      dest="csscompressor",
                      help="path to YUI Compressor to compress the CSS output")
    parser.add_option(
        "-D",
        "--variable",
        dest="variables",
        action="append",
        help=
        "override values in the manifest (use format KEY=VALUE, where VALUE is JSON)"
    )
    parser.add_option(
        "-s",
        "--server",
        dest="server",
        help="starts a server on [address:]port. example: -s 8080")
    options, args = parser.parse_args(args)

    overrides = {}
    if options.variables:
        for setting in options.variables:
            key, value = setting.split("=")
            overrides[key] = loads(value)

    if len(args) > 1:
        filename = args[1]
    else:
        filename = "manifest.json"

    filename = path(filename)
    if not filename.exists():
        raise BuildError("Build manifest file (%s) does not exist" %
                         (filename))

    print "Using build manifest: ", filename

    if options.server:
        start_server(filename, options, overrides)
    else:
        do_build(filename, options, overrides)
 def compress_css(self, compressor):
     """Compress the CSS using YUI Compressor."""
     print "Compressing CSS with YUI Compressor"
     compressor = path(compressor).abspath()
     subprocess.call("java -jar %s"
         " --type css -o BespinEmbedded.compressed.css"
         " BespinEmbedded.css" % compressor, shell=True,
         cwd=self.output_dir)
     uncompressed = self.output_dir / "BespinEmbedded.css"
     compressed = self.output_dir / "BespinEmbedded.compressed.css"
     if not compressed.exists():
         raise BuildError("Unable to compress the css file at " + uncompressed)
     uncompressed.rename(self.output_dir / "BespinEmbedded.uncompressed.css")
     compressed.rename(uncompressed)
 def compress_css(self, compressor):
     """Compress the CSS using YUI Compressor."""
     print "Compressing CSS with YUI Compressor"
     compressor = path(compressor).abspath()
     subprocess.call("java -jar %s"
                     " --type css -o BespinEmbedded.compressed.css"
                     " BespinEmbedded.css" % compressor,
                     shell=True,
                     cwd=self.output_dir)
     uncompressed = self.output_dir / "BespinEmbedded.css"
     compressed = self.output_dir / "BespinEmbedded.compressed.css"
     if not compressed.exists():
         raise BuildError("Unable to compress the css file at " +
                          uncompressed)
     uncompressed.rename(self.output_dir /
                         "BespinEmbedded.uncompressed.css")
     compressed.rename(uncompressed)
    def _find_plugins(self):
        self._plugin_catalog = dict(
            (p.name, p) for p in plugins.find_plugins(self.search_path))

        if self.jquery == "global":
            self._plugin_catalog['jquery'] = plugins.Plugin(
                "jquery",
                path(__file__).dirname() / "globaljquery.js",
                dict(name="thirdparty"))

        errors = []

        worker_plugins = []

        for plugin in self.dynamic_plugins:
            try:
                plugin_obj = self.get_plugin(plugin)
            except KeyError:
                errors.append("Plugin %s not found" % plugin)
                continue

        # note that we need to copy self.plugins because
        # we're going to be removing items from the list
        for plugin in list(self.plugins):
            try:
                plugin_obj = self.get_plugin(plugin)
            except KeyError:
                errors.append("Plugin %s not found" % plugin)
                continue
            env = plugin_obj.metadata.get("environments")
            if not env:
                continue
            is_worker = env.get("worker", False)
            if is_worker:
                worker_plugins.append(plugin)
                is_main = env.get("main", False)
                if not is_main:
                    self.plugins.remove(plugin)

        self.worker_plugins = worker_plugins
        return errors
def main(args=None):
    if args is None:
        args = sys.argv

    print "dryice: the Bespin build tool"
    parser = optparse.OptionParser(
        description="""Builds fast-loading JS and CSS packages.""")
    parser.add_option("-j", "--jscompressor", dest="jscompressor",
        help="path to Closure Compiler to compress the JS output")
    parser.add_option("-c", "--csscompressor", dest="csscompressor",
        help="path to YUI Compressor to compress the CSS output")
    parser.add_option("-D", "--variable", dest="variables",
        action="append",
        help="override values in the manifest (use format KEY=VALUE, where VALUE is JSON)")
    parser.add_option("-s", "--server", dest="server",
        help="starts a server on [address:]port. example: -s 8080")
    options, args = parser.parse_args(args)

    overrides = {}
    if options.variables:
        for setting in options.variables:
            key, value = setting.split("=")
            overrides[key] = loads(value)

    if len(args) > 1:
        filename = args[1]
    else:
        filename = "manifest.json"

    filename = path(filename)
    if not filename.exists():
        raise BuildError("Build manifest file (%s) does not exist" % (filename))

    print "Using build manifest: ", filename
    
    if options.server:
        start_server(filename, options, overrides)
    else:
        do_build(filename, options, overrides)
    def _find_plugins(self):
        self._plugin_catalog = dict((p.name, p) for p in plugins.find_plugins(self.search_path))
        
        if self.jquery == "global":
            self._plugin_catalog['jquery'] = plugins.Plugin("jquery",
                path(__file__).dirname() / "globaljquery.js",
                dict(name="thirdparty"))

        errors = []
        
        worker_plugins = []
        
        for plugin in self.dynamic_plugins:
            try:
                plugin_obj = self.get_plugin(plugin)
            except KeyError:
                errors.append("Plugin %s not found" % plugin)
                continue
        
        # note that we need to copy self.plugins because
        # we're going to be removing items from the list
        for plugin in list(self.plugins):
            try:
                plugin_obj = self.get_plugin(plugin)
            except KeyError:
                errors.append("Plugin %s not found" % plugin)
                continue
            env = plugin_obj.metadata.get("environments")
            if not env:
                continue
            is_worker = env.get("worker", False)
            if is_worker:
                worker_plugins.append(plugin)
                is_main = env.get("main", False)
                if not is_main:
                    self.plugins.remove(plugin)
        
        self.worker_plugins = worker_plugins
        return errors
    def __init__(self,
                 include_tests=False,
                 plugins=None,
                 dynamic_plugins=None,
                 jquery="builtin",
                 search_path=None,
                 output_dir="build",
                 include_sample=False,
                 boot_file=None,
                 unbundled_plugins=None,
                 preamble=None,
                 loader=None,
                 worker=None,
                 config=None):

        if plugins is None:
            plugins = []

        if dynamic_plugins is None:
            dynamic_plugins = []

        self.include_tests = include_tests
        plugins.insert(0, "bespin")
        self.plugins = plugins
        self.dynamic_plugins = dynamic_plugins

        self.jquery = jquery

        if search_path is not None:
            for i in range(0, len(search_path)):
                name = search_path[i]

                # did we get handed a dict already?
                if not isinstance(name, basestring):
                    continue

                # convert to the dict format that is used by
                # the plugin module
                search_path[i] = dict(name=name, path=path(name))
        else:
            search_path = []

        # add the default plugin directory, if it exists
        plugindir = path("plugins")
        if plugindir.exists():
            for name in plugindir.glob("*"):
                if not name.isdir():
                    continue
                search_path.append(dict(name=name, path=name))

        self.search_path = search_path

        if boot_file:
            self.boot_file = path(boot_file).abspath()
        else:
            self.boot_file = _boot_file

        if not output_dir:
            raise BuildError("""Cannot run unless output_dir is set
(it defaults to 'build'). The contents of the output_dir directory
will be deleted before the build.""")
        self.output_dir = path(output_dir)

        self.include_sample = include_sample

        if unbundled_plugins:
            self.unbundled_plugins = path(unbundled_plugins).abspath()

        self.preamble = path(__file__).dirname() / "preamble.js"

        def location_of(file, default_location):
            if default_location is not None:
                return path(default_location)
            static_path = path("static") / file
            return static_path if static_path.exists() else path("lib") / file

        self.loader = location_of("tiki.js", loader)
        self.worker = location_of("BespinEmbedded.js", worker)

        # this is a bit hacky. Because of the way worker_manager works,
        # the server version of Bespin calls it "BespinEmbedded.js"
        # and the embedded customizable version has a script called
        # (more appropriately) worker.js
        # hopefully, this will clear up in the move to JavaScript tooling
        if not self.worker.exists():
            self.worker = path("lib") / "worker.js"

        self.config = config if config is not None else {}
        self._created_javascript = set()
        self._set_package_lists()
 def location_of(file, default_location):
     if default_location is not None:
         return path(default_location)
     static_path = path("static") / file
     return static_path if static_path.exists() else path("lib") / file
from dryice.path import path

from dryice import plugins, combiner


class BuildError(Exception):
    def __init__(self, message, errors=None):
        if errors:
            message += "\n"
            for e in errors:
                message += "* %s\n" % (e)
        Exception.__init__(self, message)


sample_dir = path(__file__).dirname() / "samples"
_boot_file = path(__file__).dirname() / "boot.js"
_script2loader = path(__file__).dirname() / "script2loader.js"


def ignore_css(src, names):
    return [name for name in names if name.endswith(".css")]


class Manifest(object):
    """A manifest describes what should be built."""

    unbundled_plugins = None

    def __init__(self,
                 include_tests=False,
    def __init__(self, include_tests=False, plugins=None,
        dynamic_plugins=None, jquery="builtin",
        search_path=None, output_dir="build", include_sample=False,
        boot_file=None, unbundled_plugins=None, preamble=None, loader=None,
        worker=None, config=None):
        
        if plugins is None:
            plugins = []
        
        if dynamic_plugins is None:
            dynamic_plugins = []

        self.include_tests = include_tests
        plugins.insert(0, "bespin")
        self.plugins = plugins
        self.dynamic_plugins = dynamic_plugins
        
        self.jquery = jquery

        if search_path is not None:
            for i in range(0, len(search_path)):
                name = search_path[i]

                # did we get handed a dict already?
                if not isinstance(name, basestring):
                    continue

                # convert to the dict format that is used by
                # the plugin module
                search_path[i] = dict(name=name, path=path(name))
        else:
            search_path = []

        # add the default plugin directory, if it exists
        plugindir = path("plugins")
        if plugindir.exists():
            for name in plugindir.glob("*"):
                if not name.isdir():
                    continue
                search_path.append(dict(name=name, path=name))

        self.search_path = search_path

        if boot_file:
            self.boot_file = path(boot_file).abspath()
        else:
            self.boot_file = _boot_file

        if not output_dir:
            raise BuildError("""Cannot run unless output_dir is set
(it defaults to 'build'). The contents of the output_dir directory
will be deleted before the build.""")
        self.output_dir = path(output_dir)

        self.include_sample = include_sample
        
        if unbundled_plugins:
            self.unbundled_plugins = path(unbundled_plugins).abspath()

        self.preamble = path(__file__).dirname() / "preamble.js"

        def location_of(file, default_location):
            if default_location is not None:
                return path(default_location)
            static_path = path("static") / file
            return static_path if static_path.exists() else path("lib") / file

        self.loader = location_of("tiki.js", loader)
        self.worker = location_of("BespinEmbedded.js", worker)
        
        # this is a bit hacky. Because of the way worker_manager works,
        # the server version of Bespin calls it "BespinEmbedded.js"
        # and the embedded customizable version has a script called
        # (more appropriately) worker.js
        # hopefully, this will clear up in the move to JavaScript tooling
        if not self.worker.exists():
            self.worker = path("lib") / "worker.js"
        
        self.config = config if config is not None else {}
        self._created_javascript = set()
        self._set_package_lists()
 def location_of(file, default_location):
     if default_location is not None:
         return path(default_location)
     static_path = path("static") / file
     return static_path if static_path.exists() else path("lib") / file
    from simplejson import loads, dumps

from dryice.path import path

from dryice import plugins, combiner

class BuildError(Exception):
    def __init__(self, message, errors=None):
        if errors:
            message += "\n"
            for e in errors:
                message += "* %s\n" % (e)
        Exception.__init__(self, message)
                

sample_dir = path(__file__).dirname() / "samples"
_boot_file = path(__file__).dirname() / "boot.js"
_script2loader = path(__file__).dirname() / "script2loader.js"

def ignore_css(src, names):
    return [name for name in names if name.endswith(".css")]

class Manifest(object):
    """A manifest describes what should be built."""
    
    unbundled_plugins = None
    
    def __init__(self, include_tests=False, plugins=None,
        dynamic_plugins=None, jquery="builtin",
        search_path=None, output_dir="build", include_sample=False,
        boot_file=None, unbundled_plugins=None, preamble=None, loader=None,
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****

from cStringIO import StringIO
import codecs

from dryice import tool
from dryice.path import path

plugindir = path(__file__).dirname() / "plugindir"
pluginpath = [dict(name="pl", path=plugindir)]

def test_manifest_creation():
    sample = """
    {
        "include_tests": true,
        "plugins": ["text_editor"]
    }
"""
    manifest = tool.Manifest.from_json(sample)
    assert manifest.include_tests
    errors = manifest.errors
    assert errors == []

def test_manifest_overrides():