<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>BLUECLOTH-LICENSE</filename>
    </added>
    <added>
      <filename>MIT-LICENSE</filename>
    </added>
    <added>
      <filename>bin/bluecloth</filename>
    </added>
    <added>
      <filename>docs/index.text</filename>
    </added>
    <added>
      <filename>tasks/doc.rake</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,163 +1,378 @@
-&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;
-	&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
-
-&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;
-&lt;head&gt;
-	&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;/&gt;
-	&lt;link rel=&quot;stylesheet&quot; href=&quot;stylesheets/screen.css&quot; type=&quot;text/css&quot; media=&quot;screen&quot; /&gt;
-	&lt;link rel=&quot;stylesheet&quot; href=&quot;stylesheets/SyntaxHighlighter.css&quot; type=&quot;text/css&quot; media=&quot;screen&quot; /&gt;
-	&lt;script src=&quot;javascripts/shCore.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
-	&lt;script src=&quot;javascripts/shBrushRuby.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
-	
-	&lt;title&gt;Integration&lt;/title&gt;
-&lt;/head&gt;
-
-&lt;body&gt;
-&lt;div id=&quot;whole_page_container&quot;&gt;
-	
-	&lt;h1 id=&quot;title&quot;&gt; Integration &lt;/h1&gt;
-	
-	&lt;h1 id=&quot;what&quot;&gt;What&lt;/h1&gt;
-
-	&lt;p&gt;&amp;#8220;The term &lt;strong&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Continuous_integration&quot;&gt;Continuous integration&lt;/a&gt;&lt;/strong&gt; emerged in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Extreme_Programming&quot; title=&quot;Extreme Programming&quot;&gt;Extreme Programming&lt;/a&gt; community. It describes a set of &lt;a href=&quot;http://en.wikipedia.org/wiki/Software_Engineering&quot; title=&quot;Software Engineering&quot;&gt;Software Engineering&lt;/a&gt; practices that speed up the delivery of software by decreasing integration times. &lt;a href=&quot;http://en.wikipedia.org/wiki/Extreme_programming&quot; title=&quot;Extreme programming&quot;&gt;Extreme programming&lt;/a&gt; advocates &lt;a href=&quot;http://en.wikipedia.org/wiki/Martin_Fowler&quot; title=&quot;Martin Fowler&quot;&gt;Martin Fowler&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Kent_Beck&quot; title=&quot;Kent Beck&quot;&gt;Kent Beck&lt;/a&gt; first wrote about &lt;strong&gt;Continuous integration&lt;/strong&gt; near the turn of the millennium: making it part of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Extreme_Programming&quot; title=&quot;Extreme Programming&quot;&gt;Extreme Programming&lt;/a&gt; discipline. Fowler&amp;#8217;s paper is a popular source of information on the subject. Beck&amp;#8217;s book &lt;a href=&quot;http://en.wikipedia.org/wiki/White_Book&quot; title=&quot;White Book&quot;&gt;White Book&lt;/a&gt;, the original reference for &lt;a href=&quot;http://en.wikipedia.org/wiki/Extreme_Programming&quot; title=&quot;Extreme Programming&quot;&gt;Extreme Programming&lt;/a&gt;, also describes the term.&amp;#8221;(&lt;a href=&quot;http://en.wikipedia.org/wiki/Continuous_integration&quot;&gt;wikipedia&lt;/a&gt;)&lt;/p&gt;
-
-	&lt;p&gt;The &lt;a href=&quot;http://rubyforge.org/projects/integration/&quot;&gt;plugin Integration&lt;/a&gt; for &lt;a href=&quot;http://www.rubyonrails.org/&quot;&gt;Ruby on Rails&lt;/a&gt; provides a set of tasks to automatize all steps of the integration process.&lt;/p&gt;
-
-	&lt;h1 id=&quot;minimum_requirements&quot;&gt;Minimum Requirements&lt;/h1&gt;
-
-	&lt;ul&gt;
-	&lt;li&gt;Linux or Mac OS X&lt;/li&gt;
-	&lt;li&gt;&lt;a href=&quot;http://subversion.tigris.org/&quot;&gt;Subversion&lt;/a&gt;&lt;/li&gt;
-	&lt;li&gt;Gem &lt;a href=&quot;http://code.whytheluckystiff.net/hpricot/&quot;&gt;Hpricot&lt;/a&gt;&lt;/li&gt;
-	&lt;li&gt;Gem &lt;a href=&quot;http://eigenclass.org/hiki.rb?rcov&quot;&gt;Rcov&lt;/a&gt;&lt;/li&gt;
-	&lt;li&gt;&lt;a href=&quot;http://selenium-on-rails.openqa.org/&quot;&gt;Selenium on Rails&lt;/a&gt;&lt;/li&gt;
-	&lt;li&gt;&lt;a href=&quot;http://rspec.info/&quot;&gt;Rspec&lt;/a&gt;&lt;/li&gt;
-	&lt;/ul&gt;
-
-	&lt;h1 id=&quot;installing&quot;&gt;Installing&lt;/h1&gt;
-
-	&lt;pre name=&quot;code&quot; class=&quot;ruby&quot;&gt;ruby script/plugin install -x svn://rubyforge.org/var/svn/integration
-	&lt;/pre&gt;
-
-	&lt;p&gt;After that the plugin is ready to be used and you will need to execute only one task.&lt;/p&gt;
-
-	&lt;pre name=&quot;code&quot; class=&quot;ruby&quot;&gt;rake integrate
-	&lt;/pre&gt;
-
-	&lt;h1 id=&quot;how_it_works&quot;&gt;How it works&lt;/h1&gt;
-
-	&lt;p&gt;The integrate task executes many other tasks. It also contains a description which can be seen with &amp;#8216;rake -T&amp;#8217; command.&lt;/p&gt;
-
-	&lt;p&gt;But it is very important that you know the sequence in which the tasks are called and how to skip or add tasks.
-	To customize the integration process you need to create a task file, like integration.rake, in the project rake directory.&lt;/p&gt;
-
-	&lt;ol&gt;
-	&lt;li&gt;svn:status:check&lt;/li&gt;
-	&lt;li&gt;log:clear&lt;/li&gt;
-	&lt;li&gt;tmp:clear&lt;/li&gt;
-	&lt;li&gt;backup:local&lt;/li&gt;
-	&lt;li&gt;svn:update&lt;/li&gt;
-	&lt;li&gt;db:migrate&lt;/li&gt;
-	&lt;li&gt;test:units&lt;/li&gt;
-	&lt;li&gt;test:functionals&lt;/li&gt;
-	&lt;li&gt;test:integration&lt;/li&gt;
-	&lt;li&gt;spec:lib&lt;/li&gt;
-	&lt;li&gt;spec:models&lt;/li&gt;
-	&lt;li&gt;spec:helpers&lt;/li&gt;
-	&lt;li&gt;spec:controllers&lt;/li&gt;
-	&lt;li&gt;spec:views&lt;/li&gt;
-	&lt;li&gt;test:rcov:units&lt;/li&gt;
-	&lt;li&gt;test:rcov:units:verify&lt;/li&gt;
-	&lt;li&gt;test:rcov:functionals&lt;/li&gt;
-	&lt;li&gt;test:rcov:functionals:verify&lt;/li&gt;
-	&lt;li&gt;spec:rcov&lt;/li&gt;
-	&lt;li&gt;spec:rcov:verify&lt;/li&gt;
-	&lt;li&gt;test:plugins:selected&lt;/li&gt;
-	&lt;li&gt;spec:plugins:selected&lt;/li&gt;
-	&lt;li&gt;test:selenium:server:start&lt;/li&gt;
-	&lt;li&gt;test_acceptance&lt;/li&gt;
-	&lt;li&gt;test:selenium:server:stop&lt;/li&gt;
-	&lt;li&gt;svn:commit&lt;/li&gt;
-	&lt;/ol&gt;
-
-	&lt;h3 id=&quot;skipping_tasks&quot;&gt;Skipping tasks.&lt;/h3&gt;
-
-	&lt;p&gt;In your custom integration rake file you need to define the list of tasks that you want to skip thus:&lt;/p&gt;
-
-	&lt;pre name=&quot;code&quot; class=&quot;ruby&quot;&gt;ENV['SKIP_TASKS'] = %w( spec:lib
-	                        spec:models
-	                        spec:helpers
-	                        spec:controllers
-	                        spec:views
-	                        test:rcov:units
-	                        test:rcov:units:verify
-	                        test:rcov:functionals
-	                        test:rcov:functionals:verify
-	                        spec:rcov
-	                        spec:rcov:verify
-	                        test:selenium:server:start
-	                        test_acceptance
-	                        test:selenium:server:stop
-	                        ).join(&quot;,&quot;)
-	&lt;/pre&gt;
-
-	&lt;h3 id=&quot;adding_another_task_to_the_process&quot;&gt;Adding another task to the process.&lt;/h3&gt;
-
-	&lt;p&gt;In your custom integration rake file you need to define the new task and define the position in which to insert in process. See the example below.&lt;/p&gt;
-
-	&lt;pre name=&quot;code&quot; class=&quot;ruby&quot;&gt;namespace :test_acceptance do
-	  desc 'Runs cache sweeper and generate static 500 error page'
-	  task :before do
-	    Rake::Task[&quot;cache:sweeper:start&quot;].invoke 
-	    Rake::Task[&quot;error500&quot;].invoke 
-	  end
 
-	  desc 'Runs cache sweeper'
-	  task :after do
-	    Rake::Task[&quot;cache:sweeper:stop&quot;].invoke 
-	  end
-	end
-	&lt;/pre&gt;
+&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt; 
+      &lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
+    
+  &lt;head&gt;
+        &lt;title&gt;Integration&lt;/title&gt;
+        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;/&gt;
+        &lt;link rel=&quot;stylesheet&quot; href=&quot;stylesheets/screen.css&quot; type=&quot;text/css&quot; media=&quot;screen&quot; /&gt;
+      &lt;/head&gt;
+    
+  &lt;body&gt;
+&lt;h1&gt;Integration&lt;/h1&gt;
 
-	&lt;h3 id=&quot;defining_the_list_of_plugins_in_which_you_want_to_run_tests_or_specs&quot;&gt;Defining the list of plugins in which you want to run tests or specs.&lt;/h3&gt;
+&lt;h2&gt;What&lt;/h2&gt;
 
-	&lt;p&gt;In your custom integration rake file you need to define the list of plugins like this:&lt;/p&gt;
+&lt;p&gt;Integration is a &lt;a href=&quot;http://www.rubyonrails.org&quot;&gt;Ruby on Rails&lt;/a&gt; plugin that provides a set of tasks to automate all steps of a synchronous &lt;a href=&quot;http://en.wikipedia.org/wiki/Continuous_integration&quot;&gt;continuous integration&lt;/a&gt; process.&lt;/p&gt;
 
-	&lt;pre name=&quot;code&quot; class=&quot;ruby&quot;&gt;ENV['PLUGINS_TO_TEST'] = &quot;brazilian_rails, email&quot;
-	ENV['PLUGINS_TO_SPEC'] = &quot;brazilian_rails&quot;
-	&lt;/pre&gt;
-
-	&lt;h3 id=&quot;defining_the_environment_in_which_to_run_the_integration_process&quot;&gt;Defining the environment in which to run the integration process.&lt;/h3&gt;
-
-	&lt;p&gt;In your custom integration rake file insert the following line:&lt;/p&gt;
+&lt;h2&gt;Installing&lt;/h2&gt;
 
-	&lt;pre name=&quot;code&quot; class=&quot;ruby&quot;&gt;ENV['RAILS_ENV'] = 'development_cache'
-	&lt;/pre&gt;
+&lt;pre&gt;&lt;code&gt;ruby script/plugin install -x svn://rubyforge.org/var/svn/integration
+&lt;/code&gt;&lt;/pre&gt;
 
-	&lt;p&gt;The default environment is &amp;#8216;development&amp;#8217;.&lt;/p&gt;
+&lt;p&gt;After installing the plugin is ready to be used and you will need to execute only one task in order to integrate your code safely:&lt;/p&gt;
 
-	&lt;h1 id=&quot;more_examples&quot;&gt;More examples&lt;/h1&gt;
+&lt;pre&gt;&lt;code&gt;rake integrate
+&lt;/code&gt;&lt;/pre&gt;
 
-	&lt;p&gt;You can see more examples in the directory samples.&lt;/p&gt;
-
-	&lt;h1 id=&quot;forum&quot;&gt;Forum&lt;/h1&gt;
-
-	&lt;p&gt;Discussion about the Integration Plugin is on the forum below:&lt;/p&gt;
-
-	&lt;p&gt;http://rubyforge.org/forum/?group_id=4662&lt;/p&gt;
-
-	&lt;h1 id=&quot;license&quot;&gt;License&lt;/h1&gt;
-
-	&lt;p&gt;This code is free to be used under the terms of the MIT license.&lt;/p&gt;
-
-	&lt;h1 id=&quot;contact&quot;&gt;Contact&lt;/h1&gt;
-
-	&lt;p&gt;Comments are welcome. Send your feedback through the forum or to &lt;a href=&quot;http://www.improveit.com.br/contato&quot;&gt;this page&lt;/a&gt;.&lt;/p&gt;
-&lt;/div&gt;
-
-&lt;script language=&quot;javascript&quot;&gt;
-        dp.SyntaxHighlighter.ClipboardSwf = '/flash/clipboard.swf';
-        dp.SyntaxHighlighter.HighlightAll('code', true, false);
-&lt;/script&gt;
-&lt;/body&gt;
+&lt;h2&gt;Dependencies&lt;/h2&gt;
+
+&lt;ul&gt;
+&lt;li&gt;Linux or Mac OS X&lt;/li&gt;
+&lt;li&gt;&lt;a href=&quot;http://subversion.tigris.org&quot;&gt;Subversion&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href=&quot;http://code.whytheluckystiff.net/hpricot&quot;&gt;Hpricot&lt;/a&gt; (optional)&lt;/li&gt;
+&lt;li&gt;&lt;a href=&quot;http://eigenclass.org/hiki.rb?rcov&quot;&gt;Rcov&lt;/a&gt; (optional) &lt;/li&gt;
+&lt;li&gt;&lt;a href=&quot;http://selenium-on-rails.openqa.org&quot;&gt;Selenium on Rails&lt;/a&gt; (optional)&lt;/li&gt;
+&lt;li&gt;&lt;a href=&quot;http://rspec.info&quot;&gt;Rspec&lt;/a&gt; (optional)&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;h2&gt;Integration Steps&lt;/h2&gt;
+
+&lt;p&gt;The integration process is composed of several steps that are explained ahead. It's possible to skip one or more steps and add other steps of your own. This will be demonstrated shortly. The complete set of steps are:&lt;/p&gt;
+
+&lt;ol&gt;
+&lt;li&gt;&lt;p&gt;task svn:status:check  &lt;/p&gt;
+
+&lt;p&gt;Check if all local files are subversion'ed and if no local files have been removed using only rm (file removal should always use svn remove instead).&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;task log:clear  &lt;/p&gt;
+
+&lt;p&gt;Remove log files.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;task tmp:clear  &lt;/p&gt;
+
+&lt;p&gt;Remove temporary files.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;task backup:local  &lt;/p&gt;
+
+&lt;p&gt;Backup files locally. This is done before svn update to create a recovery point should you have problems during svn update. If a file merge creates undesirable effects on the software, you can recover from the backup file.
+Backup file names have a timestamp. By default, the last 30 backups are kept. You may change this as we'll show shortly.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;task svn:update  &lt;/p&gt;
+
+&lt;p&gt;Update files using svn update.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;task db:migrate&lt;/p&gt;
+
+&lt;p&gt;Execute any new database migration created by other team members since the last integration.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;test:units  &lt;/p&gt;
+
+&lt;p&gt;Run all unit tests.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;test:functionals  &lt;/p&gt;
+
+&lt;p&gt;Run all functional tests.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;test:integration  &lt;/p&gt;
+
+&lt;p&gt;Run all integration tests.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;spec:lib  &lt;/p&gt;
+
+&lt;p&gt;Run all lib specs.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;spec:models  &lt;/p&gt;
+
+&lt;p&gt;Run all model specs.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;spec:helpers  &lt;/p&gt;
+
+&lt;p&gt;Run all helper specs.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;spec:controllers  &lt;/p&gt;
+
+&lt;p&gt;Run all controller specs.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;spec:views  &lt;/p&gt;
+
+&lt;p&gt;Run all view specs.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;test:rcov:units  &lt;/p&gt;
+
+&lt;p&gt;Run coverage analysis of the unit tests.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;test:rcov:units:verify  &lt;/p&gt;
+
+&lt;p&gt;Check if unit tests cover 100% of the application code.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;test:rcov:functionals  &lt;/p&gt;
+
+&lt;p&gt;Run coverage analysis of the functional tests.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;test:rcov:functionals:verify  &lt;/p&gt;
+
+&lt;p&gt;Check if functional tests cover 100% of the application code.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;spec:rcov  &lt;/p&gt;
+
+&lt;p&gt;Run coverage analysis of the specs.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;spec:rcov:verify  &lt;/p&gt;
+
+&lt;p&gt;Check if specs cover 100% of the application code.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;test:plugins:selected  &lt;/p&gt;
+
+&lt;p&gt;Run tests on selected plugins. You might want to always run the tests of plugins you created, for example, while ignoring the tests of third party plugins. We'll show below how you can specify the plugins you want to test.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;spec:plugins:selected  &lt;/p&gt;
+
+&lt;p&gt;Same as previous step, but with specs, instead of tests.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;test:selenium:server:start  &lt;/p&gt;
+
+&lt;p&gt;If you use &lt;a href=&quot;http://selenium-on-rails.openqa.org&quot;&gt;Selenium&lt;/a&gt; to test your application, as you certainly should, you'll need to make sure the webserver is up and running before running &lt;a href=&quot;http://selenium-on-rails.openqa.org&quot;&gt;Selenium&lt;/a&gt; tests. That's what this task does.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;test_acceptance&lt;/p&gt;
+
+&lt;p&gt;Run all &lt;a href=&quot;http://selenium-on-rails.openqa.org&quot;&gt;Selenium&lt;/a&gt; tests.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;test:selenium:server:stop&lt;/p&gt;
+
+&lt;p&gt;Stop the webserver.&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;svn:commit&lt;/p&gt;
+
+&lt;p&gt;Commit your changes. If any of the previous tasks break, because one test failed, for instance, the script won't commit. Actually this task runs only if every checking done before work well.&lt;/p&gt;&lt;/li&gt;
+&lt;/ol&gt;
+
+&lt;p&gt;Using this almost paranoid sequence of steps it will be hard to check in bad code in your repository, which is good, very good. The idea is that you should treat your repository as a sacred place, where only good code should ever enter.    &lt;/p&gt;
+
+&lt;h2&gt;Customize the integration process&lt;/h2&gt;
+
+&lt;p&gt;To customize the integration process you need to create a task file in your project, like lib/tasks/integration.rake.&lt;/p&gt;
+
+&lt;h3&gt;Skipping tasks&lt;/h3&gt;
+
+&lt;p&gt;In your custom integration rake file you may define a comma separated list of tasks that you don't want to execute. Let's see some examples:&lt;/p&gt;
+
+&lt;ul&gt;
+&lt;li&gt;&lt;p&gt;Don't execute migrations  &lt;/p&gt;
+
+&lt;pre&gt;&lt;code&gt;ENV['SKIP_TASKS'] = 'db:migrate'
+&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;Don't execute spec coverage, nor spec coverage verification  &lt;/p&gt;
+
+&lt;pre&gt;&lt;code&gt;ENV['SKIP_TASKS'] = 'spec:rcov, spec:rcov:verify'
+&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;Don't execute any tests nor specs at all&lt;/p&gt;
+
+&lt;pre&gt;&lt;code&gt;ENV['SKIP_TASKS'] = %w( 
+                        test:units
+                        test:functionals
+                        test:integration
+                        spec:lib
+                        spec:models
+                        spec:helpers
+                        spec:controllers
+                        spec:views
+                        test:rcov:units
+                        test:rcov:units:verify
+                        test:rcov:functionals
+                        test:rcov:functionals:verify
+                        spec:rcov
+                        spec:rcov:verify
+                        test:selenium:server:start
+                        test_acceptance
+                        test:selenium:server:stop
+                        ).join(&quot;,&quot;)
+&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;p&gt;You can also define SKIP_TASKS when you run the integration process like this:&lt;/p&gt;
+
+&lt;pre&gt;&lt;code&gt;rake integrate SKIP_TASKS=spec:rcov,spec:rcov:verify
+&lt;/code&gt;&lt;/pre&gt;
+
+&lt;h3&gt;Adding other tasks&lt;/h3&gt;
+
+&lt;p&gt;Integration plugin also defines callback tasks that you can use to customize it with your own tasks. You can add other tasks before or after any of the plugin tasks. Let's see an example. Say you want to sweep HTML cache pages after running &lt;a href=&quot;http://selenium-on-rails.openqa.org&quot;&gt;Selenium&lt;/a&gt;. To do that, you've just created a task cache:sweep. Let's configure Integration to run it just after Selenium:&lt;/p&gt;
+
+&lt;pre&gt;&lt;code&gt;    namespace :test_acceptance do
+        desc 'Runs cache sweeper'
+        task :after do
+            Rake::Task[&quot;cache:sweep&quot;].invoke 
+        end
+    end
+&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;A callback task is one that has the same name of a plugin task followed by :before or :after. In this case, the plugin defines a task called test_acceptance. So, you may create test_acceptance:before that will be executed before test_acceptance and test_acceptance:after to execute as soon as test_acceptance finishes. To do that, you will need to use namespaces, like we did in the previous example. Now, let's see a real example from one of our projects:&lt;/p&gt;
+
+&lt;pre&gt;&lt;code&gt;def integration_sweeper
+  sh &quot;script/integration_sweeper&quot;
+end
+
+namespace :svn do
+  namespace :status do
+    namespace :check do
+      task :before do
+        integration_sweeper
+      end
+    end
+  end
+end
+
+desc 'Generates error 500 page'
+task :error500 do
+  `curl http://localhost:4000/server_error -o #{RAILS_ROOT}/public/500.html`
+end
+
+namespace :cache do
+  namespace :sweeper do
+    desc 'Runs cache_sweeper before executing Selenium'
+    task :start do
+      integration_sweeper
+    end
+
+    desc 'Runs cache_sweeper after executing Selenium'
+    task :stop do
+      integration_sweeper
+    end
+  end
+end
+
+namespace :test_acceptance do
+  desc 'Runs cache sweeper and generate static 500 error page'
+  task :before do
+    Rake::Task[&quot;error500&quot;].invoke 
+  end
+
+  desc 'Runs cache sweeper'
+  task :after do
+    Rake::Task[&quot;cache:sweeper:stop&quot;].invoke 
+  end
+end
+&lt;/code&gt;&lt;/pre&gt;
+
+&lt;h3&gt;Defining the list of plugins in which you want to run tests or specs.&lt;/h3&gt;
+
+&lt;p&gt;In your integration process, you may want to run tests or specs for certain plugins. All you need to do is name them, like this:&lt;/p&gt;
+
+&lt;pre&gt;&lt;code&gt;ENV['PLUGINS_TO_TEST'] = &quot;packr, email&quot;
+ENV['PLUGINS_TO_SPEC'] = &quot;brazilian_rails&quot;
+&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;You can also inform these when you run rake integrate:&lt;/p&gt;
+
+&lt;pre&gt;&lt;code&gt;rake integrate PLUGINS_TO_TEST=packr,email PLUGINS_TO_SPEC=brazilian_rails
+&lt;/code&gt;&lt;/pre&gt;
+
+&lt;h3&gt;Defining the environment in which to run the integration process&lt;/h3&gt;
+
+&lt;p&gt;Integration will run against the development environment by default. If you need it to run using another environment, you can do this:&lt;/p&gt;
+
+&lt;pre&gt;&lt;code&gt;ENV['RAILS_ENV'] = 'development_cache'
+&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;Once again, you can also inform this while running rake integrate:&lt;/p&gt;
+
+&lt;pre&gt;&lt;code&gt;rake integrate RAILS_ENV=test
+&lt;/code&gt;&lt;/pre&gt;
+
+&lt;h3&gt;Selenium port&lt;/h3&gt;
+
+&lt;p&gt;When running Selenium, you might need to specify another port other them the default port 4000. That's how you do it:&lt;/p&gt;
+
+&lt;pre&gt;&lt;code&gt;ENV['SELENIUM_PORT'] = 3000
+&lt;/code&gt;&lt;/pre&gt;
+
+&lt;h3&gt;Number of backups to keep&lt;/h3&gt;
+
+&lt;p&gt;If you want to change the number of backups that will be kept, use this:&lt;/p&gt;
+
+&lt;pre&gt;&lt;code&gt;ENV['NUMBER_OF_BACKUPS_TO_KEEP'] = 50
+&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;Backups are store in a sibling directory with the prefix 'backup-'. For instance, suppose you have a project 'amazing' in the projects directory. After the first backup, you will end up with something like this:&lt;/p&gt;
+
+&lt;pre&gt;&lt;code&gt;projects/amazing
+projects/backup-amazing
+projects/backup-amazing/amazing-20080304-104812.zip
+&lt;/code&gt;&lt;/pre&gt;
+
+&lt;h3&gt;More examples&lt;/h3&gt;
+
+&lt;ul&gt;
+&lt;li&gt;&lt;p&gt;Reckless programmer&lt;/p&gt;
+
+&lt;p&gt;So you don't have tests, nor specs but you still want to use the plugin. Besides, you want to keep the log files and prefer not to run migrations. You might get away with this customized lib/tasks/integration.rake:&lt;/p&gt;
+
+&lt;pre&gt;&lt;code&gt;ENV['SKIP_TASKS'] = %w(
+                        log:clear
+                        db:migrate
+                        test:units
+                        test:functionals
+                        test:integration
+                        spec:lib
+                        spec:models
+                        spec:helpers
+                        spec:controllers
+                        spec:views
+                        test:rcov:units
+                        test:rcov:units:verify
+                        test:rcov:functionals
+                        test:rcov:functionals:verify
+                        spec:rcov
+                        spec:rcov:verify
+                        test:plugins:selected
+                        spec:plugins:selected
+                        test:selenium:server:start
+                        test_acceptance
+                        test:selenium:server:stop
+                        ).join(&quot;,&quot;)
+&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;The fact that you can get away with this doesn't mean you should. Don't you think it's already time to grow up and become more professional about software development? I know you believe you have a great excuse to avoid writing those tests or specs. Still it's just an excuse. Write tests or write specs and make a better world!&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;Test conscious programmer&lt;/p&gt;
+
+&lt;p&gt;You haven't jumped on the BDD bandwagon yet. Instead, you write tests, which is good, but they don't cover all of your code yet, which is bad. We believe you will &lt;a href=&quot;http://www.improveit.com.br&quot;&gt;improve it&lt;/a&gt; and make sure your tests cover 100% of your code. In the meantime you might need to skip coverage checkings. Oh, you don't use &lt;a href=&quot;http://selenium-on-rails.openqa.org&quot;&gt;Selenium&lt;/a&gt; either! Shame on you! Try this:&lt;/p&gt;
+
+&lt;pre&gt;&lt;code&gt;ENV['SKIP_TASKS'] = %w( 
+                        spec:lib
+                        spec:models
+                        spec:helpers
+                        spec:controllers
+                        spec:views
+                        test:rcov:units
+                        test:rcov:units:verify
+                        test:rcov:functionals
+                        test:rcov:functionals:verify
+                        spec:rcov
+                        spec:rcov:verify
+                        test:selenium:server:start
+                        test_acceptance
+                        test:selenium:server:stop
+                        ).join(',')
+&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;As a matter of fact, since this might be very common, &lt;strong&gt;we decided to create a lib/tasks/integration.rake for you when the plugin is installed. It has this very configuration and you can use as a base to customize your integration process.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
+&lt;li&gt;&lt;p&gt;Spec infected programmer&lt;/p&gt;
+
+&lt;p&gt;So you used to TDD all around but then someone told you that this is for gramma. The new wave has a name on it: BDD. So, of course, you now have specs covering 100% of your code and doesn't have any more tests. Great! Just do it:&lt;/p&gt;
+
+&lt;pre&gt;&lt;code&gt;ENV['SKIP_TASKS'] = %w(
+                        test:units
+                        test:functionals
+                        test:integration
+                        test:rcov:units
+                        test:rcov:units:verify
+                        test:rcov:functionals
+                        test:rcov:functionals:verify
+                        ).join(&quot;,&quot;)
+&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;p&gt;You can see more examples in the samples directory.&lt;/p&gt;
+
+&lt;h2&gt;Forum&lt;/h2&gt;
+
+&lt;p&gt;Discussion about the Integration Plugin is on the forum below:&lt;/p&gt;
+
+&lt;p&gt;&lt;a href=&quot;http://rubyforge.org/forum/?group_id=4662&quot;&gt;http://rubyforge.org/forum/?group_id=4662&lt;/a&gt;&lt;/p&gt;
+
+&lt;h2&gt;License&lt;/h2&gt;
+
+&lt;p&gt;This code is free to be used under the terms of the &lt;a href=&quot;http://www.opensource.org/licenses/mit-license.php&quot;&gt;MIT license&lt;/a&gt;.&lt;/p&gt;
+
+&lt;h2&gt;Contact&lt;/h2&gt;
+
+&lt;p&gt;Comments are welcome. Send your feedback through the &lt;a href=&quot;http://rubyforge.org/forum/?group_id=4662&quot;&gt;forum&lt;/a&gt; or to &lt;a href=&quot;http://www.improveit.com.br/contato&quot;&gt;this page&lt;/a&gt;.&lt;/p&gt;
+
+&lt;h2&gt;Authors&lt;/h2&gt;
+
+&lt;p&gt;&lt;a href=&quot;http://www.improveit.com.br/tapajos&quot;&gt;Marcos Tapaj&#243;s&lt;/a&gt;&lt;br/&gt;
+&lt;a href=&quot;http://www.improveit.com.br/vinicius&quot;&gt;Vin&#237;cius Teles&lt;/a&gt;&lt;/p&gt;
+
+&lt;h2&gt;Shameless advertisement&lt;/h2&gt;
+
+&lt;p&gt;This plugin is brought to you by &lt;a href=&quot;http://www.improveit.com.br&quot;&gt;Improve It&lt;/a&gt;.&lt;/p&gt;
+
+&lt;p&gt;&lt;a href=&quot;http://www.improveit.com.br&quot;&gt;&lt;img src=&quot;improveit.gif&quot; alt=&quot;Improve It&quot; title=&quot;Improve It&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
+  &lt;/body&gt;
 &lt;/html&gt;</diff>
      <filename>docs/index.html</filename>
    </modified>
    <modified>
      <diff>@@ -1,38 +1,103 @@
+html * {
+    color:                  #222;
+    font:                   normal normal normal 1em/1em &quot;Trebuchet MS&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif;
+	padding:				0;
+	background:				none;
+	border:					none;
+	margin:					0;
+}
+
+html {
+	background:				#CCCCFF;
+}
+
 body {
-	background-color:		#F6F0DB;
+	width:					42.5em;
+	padding:				0 3em 5em 3em;
+	background: 			#FFF;
+	margin:					0 auto;
+	position:				relative;
 }
 
-#whole_page_container {
-	margin:					auto;
+h1, h2, h3 {
+	text-transform:			uppercase;
+	margin:					2em 0 1em 0;
 }
 
-html * {
-    color:                  #555;
-    font:                   normal normal normal 1.1em/1.1em Geneva, Helvetica, &quot;Lucida Grande&quot;, &quot;Trebuchet MS&quot;, Arial, sans-serif;
+h1 {
+	color:					#D74768;
+	font:					normal normal bold 280% &quot;Eurostile&quot;, &quot;Trebuchet MS&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif;
+	padding-top:			130px;
+	background: 			#FFF url(&quot;../continuous_integration.jpg&quot;) no-repeat;
+	margin:					0;
 }
 
-p, li, dd, dt {
-	font-size:				75%;
-	line-height:			1.7em;
+h2 {
+	color:					#660066;
+	font:					normal normal bold 130% Georgia, Times, &quot;Times New Roman&quot;, serif;
+	border-bottom: 			1px solid #686868;
 }
 
-strong {
-    font-weight:            bold;
+h3 {
+	color:					#CC6666;
 }
 
-h1 {
-    color:                  #940029;
-    font-variant:           small-caps;
-    font-size:              200%;
+a {
+	color:					#660066;
 }
 
-h2 {
-    color:                  #7F6B43;
-    font-size:              95%;
+p {
+	font-size:				95%;
+	line-height:			1.3em;
+	text-align:				justify;
+	padding:				0 1.3em;
+	margin:					.5em 0 1em 0;
+}
+
+pre {
+	padding:				1.25em;
+	background-color: 		#E3DEFF;
+	margin:					.5em 0 1em 0;
+	overflow:				auto;
+}
+
+code {
+	color:					#533D2A;
+	font:					normal normal normal 85%/1.2em &quot;Lucida Console&quot;, &quot;Monaco&quot;, serif; 
+}
+
+ul {
+	list-style-type: 		square;
+}
+
+ul, ol {
+	padding:				0 3.1em .5em 3.1em;
+}
+
+ul li, ol li {
+	margin-bottom:			1em;
+}
+
+ul p, ol p {
+	padding:				0;
+	margin:					0 0 .3em 0;
+}
+
+ol p {
+	color:					#533D2A;
+	font:					normal normal normal 90%/1.2em &quot;Lucida Console&quot;, &quot;Monaco&quot;, serif; 
+	padding:				.2em;
+	background-color: 		#E3DEFF;
 }
 
-#title {
-	margin-bottom:			20px;
-	text-align:				center;
+ol p + p {
+	color:					#222;
+    font:                   normal normal normal 85%/1em &quot;Trebuchet MS&quot;, &quot;Lucida Grande&quot;, Helvetica, Arial, sans-serif;
+	background:				none;
 }
 
+img {
+	position:				absolute;
+	bottom:					4.3em;
+	right:					4.3em;
+}
\ No newline at end of file</diff>
      <filename>docs/stylesheets/screen.css</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,4 @@
 require 'find'
-require 'zip/zip'
 
 INTEGRATION_TASKS = %w( 
     svn:status:check</diff>
      <filename>tasks/integrate.rake</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>dd5d595e5524908c0165e422efaaf75bdfb22a84</id>
    </parent>
  </parents>
  <author>
    <name>Vin&#237;cius Teles</name>
    <email>vinicius@improveit.com.br</email>
  </author>
  <url>http://github.com/tapajos/integration/commit/5f4ae9e66296a5c9034ba39387c3b7dcc0775b20</url>
  <id>5f4ae9e66296a5c9034ba39387c3b7dcc0775b20</id>
  <committed-date>2008-03-12T14:16:36-07:00</committed-date>
  <authored-date>2008-03-12T14:16:36-07:00</authored-date>
  <message>Change documentation</message>
  <tree>7081ab5937966beb7aa79dce76c692dd6f2f927c</tree>
  <committer>
    <name>Vin&#237;cius Teles</name>
    <email>vinicius@improveit.com.br</email>
  </committer>
</commit>
