==================================
Closure builder zc.buildout recipe
==================================

This is a simple wrapper around the closurebuilder tools from the
Closure project from Google.

Dependencies
============

Setup some JavaScript files.

  >>> import os.path

  >>> os.mkdir(os.path.join(sample_buildout, 'js'))
  >>> write('js/a.js', '''
  ... goog.provide('pwt.provideA');
  ... 
  ... goog.require('pwt.provideB');
  ... ''')

  >>> write('js/b.js', '''
  ... goog.provide('pwt.provideB');
  ... ''')

  >>> mkdir('js/goog')
  >>> write('js/goog/base.js', open(os.path.join(os.path.dirname(__file__), "goog/base.js")).read())

roots
-----

Generate a dependency file specifing where all your JavaScript files are
located within your project.

  >>> write('buildout.cfg', '''
  ... [buildout]
  ... parts = deps.js
  ...
  ... [deps.js]
  ... recipe = pwt.recipe.closurebuilder:dependency
  ... output = %(dir)s/deps.js
  ... roots = %(dir)s/js
  ... ''' %{'dir': sample_buildout})

  >>> print system(buildout)
  Installing deps.js.
  <BLANKLINE>

  >>> cat('deps.js')
  // This file was autogenerated by buildout[deps.js].
  // Please do not edit.
  goog.addDependency('a.js', ['pwt.provideA'], ['pwt.provideB']);
  goog.addDependency('b.js', ['pwt.provideB'], []);
  goog.addDependency('goog/base.js', ['goog'], []);


roots with prefix
-----------------

Generate a dependency file specifing where all your JavaScript files are
located within your project. Sometimes files are served under different
namespaces, then we use the root_with_prefix option.

  >>> write('buildout.cfg', '''
  ... [buildout]
  ... parts = deps.js
  ...
  ... [deps.js]
  ... recipe = pwt.recipe.closurebuilder:dependency
  ... output = %(dir)s/deps.js
  ... root_with_prefix = %(dir)s/js /media
  ... ''' %{'dir': sample_buildout})

  >>> print system(buildout)
  Uninstalling deps.js.
  Installing deps.js.
  <BLANKLINE>

  >>> cat('deps.js')
  // This file was autogenerated by buildout[deps.js].
  // Please do not edit.
  goog.addDependency('/media/a.js', ['pwt.provideA'], ['pwt.provideB']);
  goog.addDependency('/media/b.js', ['pwt.provideB'], []);
  goog.addDependency('/media/goog/base.js', ['goog'], []);


Compile
=======

Using the information above, generate a small minimized version of your
JavaScript application.

  >>> write('buildout.cfg', '''
  ... [buildout]
  ... parts = deps.js compiled.js
  ...
  ... [deps.js]
  ... recipe = pwt.recipe.closurebuilder:dependency
  ... output = %(dir)s/d1.js
  ... roots = %(dir)s/js
  ...
  ... [compiled.js]
  ... recipe = pwt.recipe.closurebuilder:compile
  ... dependency = deps.js
  ... output = %(dir)s
  ... inputs = %(dir)s/js/a.js
  ... ''' %{'dir': sample_buildout})

  >>> output = system(buildout)
  >>> output == '''root: Compiling with the following command: java -jar %(jar)s --js %(dir)s/js/goog/base.js --js %(dir)s/js/b.js --js %(dir)s/js/a.js
  ... Uninstalling deps.js.
  ... Installing deps.js.
  ... Installing compiled.js.
  ... ''' %{'jar': os.path.join(os.path.dirname(__file__), 'compiler-1111.jar'),
  ...       'dir': sample_buildout}
  True

  >>> ls(sample_buildout)
  -  .installed.cfg
  -  0fb0e24aea59f6281f3c615ffe650823.js
  d  bin
  -  buildout.cfg
  -  d1.js
  d  develop-eggs
  d  eggs
  d  js
  d  parts

We can also specify extra files that might not have goog.provide declarations
in them so won't be picked up by the depswriter recipe.

  >>> write('js/c.js', '''
  ... alert('c');
  ... ''')

  >>> write('buildout.cfg', '''
  ... [buildout]
  ... parts = deps.js compiled.js
  ...
  ... [deps.js]
  ... recipe = pwt.recipe.closurebuilder:dependency
  ... output = %(dir)s/d1.js
  ... roots = %(dir)s/js
  ...
  ... [compiled.js]
  ... recipe = pwt.recipe.closurebuilder:compile
  ... dependency = deps.js
  ... output = %(dir)s
  ... inputs = %(dir)s/js/a.js
  ... extra_js = js/c.js
  ... ''' %{'dir': sample_buildout})

  >>> output = system(buildout)
  >>> output == '''root: Compiling with the following command: java -jar %(jar)s --js js/c.js --js %(dir)s/js/goog/base.js --js %(dir)s/js/b.js --js %(dir)s/js/a.js
  ... Uninstalling compiled.js.
  ... Updating deps.js.
  ... Installing compiled.js.
  ... ''' %{'jar': os.path.join(os.path.dirname(__file__), 'compiler-1111.jar'),
  ...       'dir': sample_buildout}
  True

  >>> ls(sample_buildout)
  -  .installed.cfg
  -  b68ab8e7a5aa2b2787d35e9b762fb191.js
  d  bin
  -  buildout.cfg
  -  d1.js
  d  develop-eggs
  d  eggs
  d  js
  d  parts
