<?xml version="1.0" encoding="UTF-8"?>
<tickets type="array">
  <ticket>
    <assigned-user-id type="integer" nil="true"></assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">false</closed>
    <created-at type="datetime">2009-07-14T20:31:52-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">213</number>
    <permalink>help-for-common-errors</permalink>
    <priority type="integer">126089</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>new</state>
    <tag nil="true"></tag>
    <title>Help for common errors</title>
    <updated-at type="datetime">2009-07-14T20:31:57-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/213</url>
    <original-body>At the topmost level of run, common errors need to be caught and help given to clarify what exactly is going on.

Validation Errors
------------------------------

Example:

@@@ ruby
  # Example::task
  class Example &lt; Tap::Task
    config :a, 1, &amp;c.integer
  end
@@@
  
    % rap example --a blue
    expected [Integer] but was: String

This cannot be caught easily elsewhere.  It's not a config parser issue, it happens afterwards during task initialization.  You want to be able to see the full backtrace on debug.  As a result, the best place to catch/override is right at the top.</original-body>
    <latest-body>At the topmost level of run, common errors need to be caught and help given to clarify what exactly is going on.

Validation Errors
------------------------------

Example:

@@@ ruby
  # Example::task
  class Example &lt; Tap::Task
    config :a, 1, &amp;c.integer
  end
@@@
  
    % rap example --a blue
    expected [Integer] but was: String

This cannot be caught easily elsewhere.  It's not a config parser issue, it happens afterwards during task initialization.  You want to be able to see the full backtrace on debug.  As a result, the best place to catch/override is right at the top.</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;At the topmost level of run, common errors need to be caught and
help given to clarify what exactly is going on.&lt;/p&gt;
&lt;h2&gt;Validation Errors&lt;/h2&gt;
&lt;p&gt;Example:&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
  # Example::task
  class Example &amp;lt; Tap::Task
    config :a, 1, &amp;amp;c.integer
  end
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;
&lt;code&gt;% rap example --a blue
expected [[Integer]](/projects/9908/changesets/Integer &quot;Changeset 'Integer'&quot;) but was: String
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;This cannot be caught easily elsewhere. It's not a config parser
issue, it happens afterwards during task initialization. You want
to be able to see the full backtrace on debug. As a result, the
best place to catch/override is right at the top.&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer" nil="true"></assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">false</closed>
    <created-at type="datetime">2009-07-10T13:22:21-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">212</number>
    <permalink>make-default-shell-test-pattern</permalink>
    <priority type="integer">125546</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>new</state>
    <tag nil="true"></tag>
    <title>Make default shell test pattern '% '</title>
    <updated-at type="datetime">2009-07-10T13:22:29-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/212</url>
    <original-body>That way you can take the standard tap notation directly.

    % tap ...

Becomes

    tap

and

    % ruby

becomes

    ruby</original-body>
    <latest-body>That way you can take the standard tap notation directly.

    % tap ...

Becomes

    tap

and

    % ruby

becomes

    ruby</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;That way you can take the standard tap notation directly.&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;% tap ...
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Becomes&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;tap
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;% ruby
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;becomes&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;ruby
&lt;/code&gt;
&lt;/pre&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer" nil="true"></assigned-user-id>
    <attachments-count type="integer">1</attachments-count>
    <closed type="boolean">false</closed>
    <created-at type="datetime">2009-05-03T09:13:46-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">206</number>
    <permalink>schema-cleanup</permalink>
    <priority type="integer">104002</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>new</state>
    <tag nil="true"></tag>
    <title>Schema Cleanup</title>
    <updated-at type="datetime">2009-07-10T11:11:48-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/206</url>
    <original-body>The build on schema can be cleaned up significantly.

* consider extracting errors into a variable
* methods to instantiate a node/join
* long debug where the node/join metadata is printed

In the future (possibly):

* checking of join signatures</original-body>
    <latest-body>The build on schema can be cleaned up significantly.

* consider extracting errors into a variable
* methods to instantiate a node/join
* long debug where the node/join metadata is printed

In the future (possibly):

* checking of join signatures</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;The build on schema can be cleaned up significantly.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;consider extracting errors into a variable&lt;/li&gt;
&lt;li&gt;methods to instantiate a node/join&lt;/li&gt;
&lt;li&gt;long debug where the node/join metadata is printed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the future (possibly):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;checking of join signatures&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer" nil="true"></assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">false</closed>
    <created-at type="datetime">2009-07-09T12:08:26-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">211</number>
    <permalink>add-a-template-file-server-module</permalink>
    <priority type="integer">125369</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>new</state>
    <tag nil="true"></tag>
    <title>Add a template file server module</title>
    <updated-at type="datetime">2009-07-09T12:08:31-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/211</url>
    <original-body>This will be nice to add templated documentation to controllers.  Example:

      nest :tutorial, Tap::Controller do
        def dispatch(route)
          if route == nil || route.empty?
            route = &quot;index&quot;
          end
          
          if path = module_path(&quot;#{route}.erb&quot;)
            render :file =&gt; path
          else
            raise ServerError.new(&quot;404 Error: page not found #{route}&quot;, 404)
          end
        end
      end</original-body>
    <latest-body>This will be nice to add templated documentation to controllers.  Example:

      nest :tutorial, Tap::Controller do
        def dispatch(route)
          if route == nil || route.empty?
            route = &quot;index&quot;
          end
          
          if path = module_path(&quot;#{route}.erb&quot;)
            render :file =&gt; path
          else
            raise ServerError.new(&quot;404 Error: page not found #{route}&quot;, 404)
          end
        end
      end</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;This will be nice to add templated documentation to controllers.
Example:&lt;/p&gt;
&lt;pre&gt;
&lt;code&gt;  nest :tutorial, Tap::Controller do
    def dispatch(route)
      if route == nil || route.empty?
        route = &quot;index&quot;
      end

      if path = module_path(&quot;#{route}.erb&quot;)
        render :file =&amp;gt; path
      else
        raise ServerError.new(&quot;404 Error: page not found #{route}&quot;, 404)
      end
    end
  end
&lt;/code&gt;
&lt;/pre&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer" nil="true"></assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">false</closed>
    <created-at type="datetime">2009-03-22T09:47:16-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">194</number>
    <permalink>audit-cachestore-ie-replay-and-recovery</permalink>
    <priority type="integer">93249</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>new</state>
    <tag nil="true"></tag>
    <title>Audit Cache/Store (ie Replay and Recovery)</title>
    <updated-at type="datetime">2009-06-01T12:14:50-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/194</url>
    <original-body>Been considering how to do error recovery.  Unwinding a workflow is now possible, in many cases, since Joins can store state as full-fledged objects (although if joins are blocks this isn't true... procs don't serialize).  However, when you unwind a partially-run workflow you can lose information that is within some types of joins, like a theoretical counter, or in the current Join running in no-stack mode.

Once you unwind back to app.run, you will have audits of all the results.  That suggests a replay is possible but you need something that a given task can query for cached results.  Then, in replay mode, you load a clean workflow, load the audits into the cache, and run the tasks so they use the cached results when possible.

This should quickly re-create the state at the time of crash, without re-running upstream tasks.  Notes:

* Tasks cannot have side-effect in this case.  Result is the only meaningful output of executing with inputs.
* A clean, new workflow must be made.  This allows joins to have 'side effects' like counters and such.

Note after unwinding you will also have (via join.inputs/join.outputs) a full representation of the workflow, but this may be 'polluted' in the sense that there may be state changes.  This is useful for inspection during debugging, and potentially for restart.

For restart:

* Joins would have to track their state explicitly, ie with @_results and @index so that a dump has a handle on results and where to restart.</original-body>
    <latest-body>Been considering how to do error recovery.  Unwinding a workflow is now possible, in many cases, since Joins can store state as full-fledged objects (although if joins are blocks this isn't true... procs don't serialize).  However, when you unwind a partially-run workflow you can lose information that is within some types of joins, like a theoretical counter, or in the current Join running in no-stack mode.

Once you unwind back to app.run, you will have audits of all the results.  That suggests a replay is possible but you need something that a given task can query for cached results.  Then, in replay mode, you load a clean workflow, load the audits into the cache, and run the tasks so they use the cached results when possible.

This should quickly re-create the state at the time of crash, without re-running upstream tasks.  Notes:

* Tasks cannot have side-effect in this case.  Result is the only meaningful output of executing with inputs.
* A clean, new workflow must be made.  This allows joins to have 'side effects' like counters and such.

Note after unwinding you will also have (via join.inputs/join.outputs) a full representation of the workflow, but this may be 'polluted' in the sense that there may be state changes.  This is useful for inspection during debugging, and potentially for restart.

For restart:

* Joins would have to track their state explicitly, ie with @_results and @index so that a dump has a handle on results and where to restart.</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;Been considering how to do error recovery. Unwinding a workflow
is now possible, in many cases, since Joins can store state as
full-fledged objects (although if joins are blocks this isn't
true... procs don't serialize). However, when you unwind a
partially-run workflow you can lose information that is within some
types of joins, like a theoretical counter, or in the current Join
running in no-stack mode.&lt;/p&gt;
&lt;p&gt;Once you unwind back to app.run, you will have audits of all the
results. That suggests a replay is possible but you need something
that a given task can query for cached results. Then, in replay
mode, you load a clean workflow, load the audits into the cache,
and run the tasks so they use the cached results when possible.&lt;/p&gt;
&lt;p&gt;This should quickly re-create the state at the time of crash,
without re-running upstream tasks. Notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tasks cannot have side-effect in this case. Result is the only
meaningful output of executing with inputs.&lt;/li&gt;
&lt;li&gt;A clean, new workflow must be made. This allows joins to have
'side effects' like counters and such.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note after unwinding you will also have (via
join.inputs/join.outputs) a full representation of the workflow,
but this may be 'polluted' in the sense that there may be state
changes. This is useful for inspection during debugging, and
potentially for restart.&lt;/p&gt;
&lt;p&gt;For restart:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Joins would have to track their state explicitly, ie with
@_results and @index so that a dump has a handle on results and
where to restart.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer" nil="true"></assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">false</closed>
    <created-at type="datetime">2009-05-25T12:33:11-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">210</number>
    <permalink>env-context-sharing</permalink>
    <priority type="integer">110790</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>new</state>
    <tag nil="true"></tag>
    <title>Env context sharing</title>
    <updated-at type="datetime">2009-05-25T12:33:15-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/210</url>
    <original-body>In cases like this:

@@@ ruby
      # add the tap env if necessary
      unless exe.any? {|env| env.root.root == TAP_HOME }
        exe.push Env.new(TAP_HOME, exe.context) 
      end
@@@

Really it's a shame exe.context needs to be provided beforehand.  Perhaps a global context?  Or perhaps merge contexts?</original-body>
    <latest-body>In cases like this:

@@@ ruby
      # add the tap env if necessary
      unless exe.any? {|env| env.root.root == TAP_HOME }
        exe.push Env.new(TAP_HOME, exe.context) 
      end
@@@

Really it's a shame exe.context needs to be provided beforehand.  Perhaps a global context?  Or perhaps merge contexts?</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;In cases like this:&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
      # add the tap env if necessary
      unless exe.any? {|env| env.root.root == TAP_HOME }
        exe.push Env.new(TAP_HOME, exe.context) 
      end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Really it's a shame exe.context needs to be provided beforehand.
Perhaps a global context? Or perhaps merge contexts?&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer">17257</assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2008-08-06T10:11:57-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime">2008-10-22T00:00:00-06:00</milestone-due-on>
    <milestone-id type="integer">10299</milestone-id>
    <number type="integer">71</number>
    <permalink>env</permalink>
    <priority type="integer">11951</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>resolved</state>
    <tag>bug tap</tag>
    <title>Env ==</title>
    <updated-at type="datetime">2009-05-25T12:32:08-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <assigned-user-name>bahuvrihi</assigned-user-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/71</url>
    <milestone-title>Tap-1.0.0</milestone-title>
    <original-body>Should Env perform some equality check based on Env#root.root?  If two envs are somehow loaded in (ex when tap.yml for a gem sets root = &quot;.&quot;), then this can cause a manifest error, and duplication.

The current scheme searches for envs that are included in the flat_envs target... but at preset == must be checking object_id, and not just contents.</original-body>
    <latest-body>Should Env perform some equality check based on Env#root.root?  If two envs are somehow loaded in (ex when tap.yml for a gem sets root = &quot;.&quot;), then this can cause a manifest error, and duplication.

The current scheme searches for envs that are included in the flat_envs target... but at preset == must be checking object_id, and not just contents.</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;
Should Env perform some equality check based on Env#root.root?  If two envs are somehow loaded in (ex when tap.yml for a gem sets root = &quot;.&quot;), then this can cause a manifest error, and duplication.
&lt;/p&gt;&lt;p&gt;
The current scheme searches for envs that are included in the flat_envs target... but at preset == must be checking object_id, and not just contents.
&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer" nil="true"></assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2008-04-17T18:46:28-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime">2008-10-22T00:00:00-06:00</milestone-due-on>
    <milestone-id type="integer">10299</milestone-id>
    <number type="integer">5</number>
    <permalink>config-editing</permalink>
    <priority type="integer">11915</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>invalid</state>
    <tag>feature tap</tag>
    <title>Config Editing</title>
    <updated-at type="datetime">2009-05-25T12:31:10-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/5</url>
    <milestone-title>Tap-1.0.0</milestone-title>
    <original-body>Add the ability to load/change the tap.yml file configs, a-la git

tap config gems blah blah blah
tap config gems.add blah blah blah

The notation uses .method to call a method on the configuration, where some sort of push or set is assumed.  To print out the current setting:

tap config gems</original-body>
    <latest-body>Add the ability to load/change the tap.yml file configs, a-la git

tap config gems blah blah blah
tap config gems.add blah blah blah

The notation uses .method to call a method on the configuration, where some sort of push or set is assumed.  To print out the current setting:

tap config gems</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;
Add the ability to load/change the tap.yml file configs, a-la git
&lt;/p&gt;&lt;p&gt;
tap config gems blah blah blah
&lt;/p&gt;&lt;p&gt;
tap config gems.add blah blah blah
&lt;/p&gt;&lt;p&gt;
The notation uses .method to call a method on the configuration, where some sort of push or set is assumed.  To print out the current setting:
&lt;/p&gt;&lt;p&gt;
tap config gems
&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer">17257</assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2008-08-07T14:42:27-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime">2008-10-22T00:00:00-06:00</milestone-due-on>
    <milestone-id type="integer">10299</milestone-id>
    <number type="integer">73</number>
    <permalink>console-requires</permalink>
    <priority type="integer">11930</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>resolved</state>
    <tag>feature tap</tag>
    <title>console requires</title>
    <updated-at type="datetime">2009-05-25T12:30:10-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <assigned-user-name>bahuvrihi</assigned-user-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/73</url>
    <milestone-title>Tap-1.0.0</milestone-title>
    <original-body>Add some mechanism to easily find/require task files, especially the tapfile.rb files.</original-body>
    <latest-body>Add some mechanism to easily find/require task files, especially the tapfile.rb files.</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;Add some mechanism to easily find/require task files, especially the tapfile.rb files.&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer">17257</assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2008-08-11T19:27:31-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime">2008-10-22T00:00:00-06:00</milestone-due-on>
    <milestone-id type="integer">10299</milestone-id>
    <number type="integer">81</number>
    <permalink>check-tap-yml-gem-configurations-on-gem</permalink>
    <priority type="integer">11938</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>invalid</state>
    <tag>fix tap</tag>
    <title>check tap.yml gem configurations on gem</title>
    <updated-at type="datetime">2009-05-25T12:28:31-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <assigned-user-name>bahuvrihi</assigned-user-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/81</url>
    <milestone-title>Tap-1.0.0</milestone-title>
    <original-body>A configuration error results when a gem is installed with a tap.yml that specifies uninstalled gems.  Obviously the best solution is to make the installed gem specify the other gems as dependencies.  Add a rake task to execute before :gem to check:

@@@ ruby

task :check_tap_configuration do 
  if File.exists?(&quot;tap.yml&quot;)
    require 'yaml'
    if (hash = YAML.load_file(&quot;tap.yml&quot;)).kind_of?(Hash)
      gemspec.dependencies.collect {|d| d.name }
      ...
    end
  end
end

task :gem =&gt; [:check_tap_configuration]

@@@</original-body>
    <latest-body>A configuration error results when a gem is installed with a tap.yml that specifies uninstalled gems.  Obviously the best solution is to make the installed gem specify the other gems as dependencies.  Add a rake task to execute before :gem to check:

@@@ ruby

task :check_tap_configuration do 
  if File.exists?(&quot;tap.yml&quot;)
    require 'yaml'
    if (hash = YAML.load_file(&quot;tap.yml&quot;)).kind_of?(Hash)
      gemspec.dependencies.collect {|d| d.name }
      ...
    end
  end
end

task :gem =&gt; [:check_tap_configuration]

@@@</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;A configuration error results when a gem is installed with a tap.yml that specifies uninstalled gems.  Obviously the best solution is to make the installed gem specify the other gems as dependencies.  Add a rake task to execute before :gem to check:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;

task :check_tap_configuration do
  if File.exists?(&amp;quot;tap.yml&amp;quot;)
    require 'yaml'
    if (hash = YAML.load_file(&amp;quot;tap.yml&amp;quot;)).kind_of?(Hash)
      gemspec.dependencies.collect {|d| d.name }
      ...
    end
  end
end

task :gem =&amp;gt; [:check_tap_configuration]

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer">17257</assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2008-09-10T10:16:31-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime">2008-10-22T00:00:00-06:00</milestone-due-on>
    <milestone-id type="integer">10299</milestone-id>
    <number type="integer">104</number>
    <permalink>test-cmdline-workflows-that-use-tasks-from-multiple-gems</permalink>
    <priority type="integer">11953</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>resolved</state>
    <tag>tap testing</tag>
    <title>test cmdline workflows that use tasks from multiple gems</title>
    <updated-at type="datetime">2009-05-25T12:24:15-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <assigned-user-name>bahuvrihi</assigned-user-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/104</url>
    <milestone-title>Tap-1.0.0</milestone-title>
    <original-body>Naturally, multiple gem versions will not work (or SHOULD NOT at any rate) but tasks from multiple gems should be used with ease.</original-body>
    <latest-body>Naturally, multiple gem versions will not work (or SHOULD NOT at any rate) but tasks from multiple gems should be used with ease.</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;Naturally, multiple gem versions will not work (or SHOULD NOT at
any rate) but tasks from multiple gems should be used with
ease.&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer">17257</assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2008-12-31T11:00:45-07:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">135</number>
    <permalink>add-switch-turning-off-automatic-inference-of-config_file</permalink>
    <priority type="integer">52200</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>invalid</state>
    <tag nil="true"></tag>
    <title>Add switch turning off automatic inference of config_file</title>
    <updated-at type="datetime">2009-05-25T12:22:56-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <assigned-user-name>bahuvrihi</assigned-user-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/135</url>
    <original-body>In Task.parse

@@@ ruby
        # load configurations
        if app.inference
          config_path ||= app.filepath('config', &quot;#{name}.yml&quot;)
        end
@@@</original-body>
    <latest-body>In Task.parse

@@@ ruby
        # load configurations
        if app.inference
          config_path ||= app.filepath('config', &quot;#{name}.yml&quot;)
        end
@@@</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;In Task.parse&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
        # load configurations
        if app.inference
          config_path ||= app.filepath('config', &amp;quot;#{name}.yml&amp;quot;)
        end
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer">17257</assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2009-02-11T17:14:18-07:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">150</number>
    <permalink>appcontrollerrunstopterminate-activate-on-get</permalink>
    <priority type="integer">70298</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>resolved</state>
    <tag>server</tag>
    <title>AppController.run/stop/terminate activate on get</title>
    <updated-at type="datetime">2009-05-25T12:21:32-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <assigned-user-name>bahuvrihi</assigned-user-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/150</url>
    <original-body>These calls modify the state of the server and should be post-only.  Does there need to be a way to terminate an app with a get request?</original-body>
    <latest-body>These calls modify the state of the server and should be post-only.  Does there need to be a way to terminate an app with a get request?</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;These calls modify the state of the server and should be
post-only. Does there need to be a way to terminate an app with a
get request?&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer">17257</assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2009-02-11T17:09:35-07:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">149</number>
    <permalink>schemacontrollerrun-threading-model-is-brittle</permalink>
    <priority type="integer">70293</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>invalid</state>
    <tag>server</tag>
    <title>Server.run threading model is brittle</title>
    <updated-at type="datetime">2009-05-25T12:21:06-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <assigned-user-name>bahuvrihi</assigned-user-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/149</url>
    <original-body>As written, it suffers the following:

* no assurance rounds will be enqued and executed one after the other
* rounds from other threads may be interleaved
* no assurance the queue is empty when a new round is added 
* suffers from the same stop/start flub as Exe http://bahuvrihi.lighthouseapp.com/projects/9908-tap-task-application/tickets/148-exerun-flubs-stopterminate

(at least)</original-body>
    <latest-body>As written, it suffers the following:

* no assurance rounds will be enqued and executed one after the other
* rounds from other threads may be interleaved
* no assurance the queue is empty when a new round is added 
* suffers from the same stop/start flub as Exe http://bahuvrihi.lighthouseapp.com/projects/9908-tap-task-application/tickets/148-exerun-flubs-stopterminate

(at least)</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;As written, it suffers the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;no assurance rounds will be enqued and executed one after the
other&lt;/li&gt;
&lt;li&gt;rounds from other threads may be interleaved&lt;/li&gt;
&lt;li&gt;no assurance the queue is empty when a new round is added&lt;/li&gt;
&lt;li&gt;suffers from the same stop/start flub as Exe &lt;a href=&quot;http://bahuvrihi.lighthouseapp.com/projects/9908-tap-task-application/tickets/148-exerun-flubs-stopterminate&quot;&gt;
http://bahuvrihi.lighthouseapp.c...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(at least)&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer">17257</assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2009-02-18T08:06:21-07:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">171</number>
    <permalink>extload-task</permalink>
    <priority type="integer">72563</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>invalid</state>
    <tag>tap-tasks</tag>
    <title>ExtLoad task</title>
    <updated-at type="datetime">2009-05-25T12:20:15-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <assigned-user-name>bahuvrihi</assigned-user-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/171</url>
    <original-body>Tap-Tasks should have an ExtLoad baseclass for loading using External.  Dumps naturally become ExternalArchives.</original-body>
    <latest-body>Tap-Tasks should have an ExtLoad baseclass for loading using External.  Dumps naturally become ExternalArchives.</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;Tap-Tasks should have an ExtLoad baseclass for loading using
External. Dumps naturally become ExternalArchives.&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer" nil="true"></assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2009-04-03T11:49:58-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">201</number>
    <permalink>app-needs-to-own-tasks</permalink>
    <priority type="integer">97118</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>invalid</state>
    <tag>threading</tag>
    <title>App needs to own tasks?</title>
    <updated-at type="datetime">2009-05-25T12:19:16-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/201</url>
    <original-body>Tasks refer back to an app, but to for easier thread safety, tasks need to only execute on a singly thread at a given time.

Model.  Within a workflow:

### nothing touches a task outside of process ##

No looking up tasks that aren't defined for an instance and messing with them.  In short stay away from the app queue, dependencies, etc.  

### apps only execute a task on a single thread ###

While in process, an app owns the task.  Outside of process, set the app to nil.

Together this means that while an app owns the task, the task may change.  When an app doesn't own the task, the task will not change.  This prevents synchronization to be implemented per task.  

But it also prevents thread-safe tasks from running in multiple places... Not a solution.

What brings this up is workflows that my have to coordinate the inputs/configs for a particular task, for example tasks that use an io config for input/output. Maybe the problem is simply that mutable configs are getting used.</original-body>
    <latest-body>Tasks refer back to an app, but to for easier thread safety, tasks need to only execute on a singly thread at a given time.

Model.  Within a workflow:

### nothing touches a task outside of process ##

No looking up tasks that aren't defined for an instance and messing with them.  In short stay away from the app queue, dependencies, etc.  

### apps only execute a task on a single thread ###

While in process, an app owns the task.  Outside of process, set the app to nil.

Together this means that while an app owns the task, the task may change.  When an app doesn't own the task, the task will not change.  This prevents synchronization to be implemented per task.  

But it also prevents thread-safe tasks from running in multiple places... Not a solution.

What brings this up is workflows that my have to coordinate the inputs/configs for a particular task, for example tasks that use an io config for input/output. Maybe the problem is simply that mutable configs are getting used.</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;Tasks refer back to an app, but to for easier thread safety,
tasks need to only execute on a singly thread at a given time.&lt;/p&gt;
&lt;p&gt;Model. Within a workflow:&lt;/p&gt;
&lt;h3&gt;nothing touches a task outside of process&lt;/h3&gt;
&lt;p&gt;No looking up tasks that aren't defined for an instance and
messing with them. In short stay away from the app queue,
dependencies, etc.&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;apps only execute a task on a single thread&lt;/h3&gt;
&lt;p&gt;While in process, an app owns the task. Outside of process, set
the app to nil.&lt;/p&gt;
&lt;p&gt;Together this means that while an app owns the task, the task
may change. When an app doesn't own the task, the task will not
change. This prevents synchronization to be implemented per
task.&lt;br&gt;&lt;/p&gt;
&lt;p&gt;But it also prevents thread-safe tasks from running in multiple
places... Not a solution.&lt;/p&gt;
&lt;p&gt;What brings this up is workflows that my have to coordinate the
inputs/configs for a particular task, for example tasks that use an
io config for input/output. Maybe the problem is simply that
mutable configs are getting used.&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer">17257</assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2009-03-08T09:54:24-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">184</number>
    <permalink>controller-shortcut-to-find-minipath-for-self</permalink>
    <priority type="integer">89742</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>resolved</state>
    <tag>server</tag>
    <title>Controller shortcut to find minipath for self</title>
    <updated-at type="datetime">2009-05-25T12:18:03-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <assigned-user-name>bahuvrihi</assigned-user-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/184</url>
    <original-body>That way it will be easier and more robust to write links to oneself:

@@@ html
 &lt;a href=&quot;tap-ubiquity%3Atap%2Fubiquity%2Fserver/shutdown&quot;&gt;&lt;/a&gt;
@@@</original-body>
    <latest-body>That way it will be easier and more robust to write links to oneself:

@@@ html
 &lt;a href=&quot;tap-ubiquity%3Atap%2Fubiquity%2Fserver/shutdown&quot;&gt;&lt;/a&gt;
@@@</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;That way it will be easier and more robust to write links to
oneself:&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;
 &amp;lt;a href=&amp;quot;tap-ubiquity%3Atap%2Fubiquity%2Fserver/shutdown&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer">17257</assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2009-02-12T08:28:59-07:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">152</number>
    <permalink>tap-server-threading</permalink>
    <priority type="integer">70433</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>invalid</state>
    <tag>threading</tag>
    <title>Tap-Server Threading</title>
    <updated-at type="datetime">2009-05-25T12:16:40-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <assigned-user-name>bahuvrihi</assigned-user-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/152</url>
    <original-body>The server ideally will accept requests, return quickly, and then do work.  To do so requires some sort of threading... but of course it's hard to guarantee all tasks may be threaded.  I propose a three-mode model:

* blocking - Each app runs on main thread preventing return of current request and handling of new requests
* threaded - Only one app may execute on one execution thread at a time.  All other apps block until the current app is done.  This could be implemented with a queue so that a request may return and the app will wait it's turn to produce results.
* multi-threaded - Each app runs on it's own thread.

# blocking #

No attention to threading required.

# threaded #

Threading requires each app is self-contained: all objects used by the app are it's own (queue, tasks, dependencies, etc).  This is almost the case, although there are some outlying (bugs)[http://bahuvrihi.lighthouseapp.com/projects/9908-tap-task-application/tickets?q=tagged%3A%22threading%22].

Threading is less save than blocking but should not be dangerous provided no apps run off-queue.  Effectively there are only two threads:

* The server thread which utilizes env, interacts with the user, but does not work with apps or tasks (this could be an issue with globals).
* The application thread which runs apps, but does not interact with the user or utilize env.

# multithreaded #

Multithreading also requires each app is self-contained.</original-body>
    <latest-body>The server ideally will accept requests, return quickly, and then do work.  To do so requires some sort of threading... but of course it's hard to guarantee all tasks may be threaded.  I propose a three-mode model:

* blocking - Each app runs on main thread preventing return of current request and handling of new requests
* threaded - Only one app may execute on one execution thread at a time.  All other apps block until the current app is done.  This could be implemented with a queue so that a request may return and the app will wait it's turn to produce results.
* multi-threaded - Each app runs on it's own thread.

# blocking #

No attention to threading required.

# threaded #

Threading requires each app is self-contained: all objects used by the app are it's own (queue, tasks, dependencies, etc).  This is almost the case, although there are some outlying (bugs)[http://bahuvrihi.lighthouseapp.com/projects/9908-tap-task-application/tickets?q=tagged%3A%22threading%22].

Threading is less save than blocking but should not be dangerous provided no apps run off-queue.  Effectively there are only two threads:

* The server thread which utilizes env, interacts with the user, but does not work with apps or tasks (this could be an issue with globals).
* The application thread which runs apps, but does not interact with the user or utilize env.

# multithreaded #

Multithreading also requires each app is self-contained.</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;The server ideally will accept requests, return quickly, and
then do work. To do so requires some sort of threading... but of
course it's hard to guarantee all tasks may be threaded. I propose
a three-mode model:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;blocking - Each app runs on main thread preventing return of
current request and handling of new requests&lt;/li&gt;
&lt;li&gt;threaded - Only one app may execute on one execution thread at
a time. All other apps block until the current app is done. This
could be implemented with a queue so that a request may return and
the app will wait it's turn to produce results.&lt;/li&gt;
&lt;li&gt;multi-threaded - Each app runs on it's own thread.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;blocking&lt;/h1&gt;
&lt;p&gt;No attention to threading required.&lt;/p&gt;
&lt;h1&gt;threaded&lt;/h1&gt;
&lt;p&gt;Threading requires each app is self-contained: all objects used
by the app are it's own (queue, tasks, dependencies, etc). This is
almost the case, although there are some outlying (bugs)[&lt;a href=&quot;http://bahuvrihi.lighthouseapp.com/projects/9908-tap-task-application/tickets?q=tagged%3A%22threading%22&quot;&gt;http://bahuvrihi.lighthouseapp.c...&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;Threading is less save than blocking but should not be dangerous
provided no apps run off-queue. Effectively there are only two
threads:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The server thread which utilizes env, interacts with the user,
but does not work with apps or tasks (this could be an issue with
globals).&lt;/li&gt;
&lt;li&gt;The application thread which runs apps, but does not interact
with the user or utilize env.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;multithreaded&lt;/h1&gt;
&lt;p&gt;Multithreading also requires each app is self-contained.&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer" nil="true"></assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">false</closed>
    <created-at type="datetime">2009-02-18T08:05:29-07:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">170</number>
    <permalink>ruby-options-for-raptap</permalink>
    <priority type="integer">72272</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>new</state>
    <tag nil="true"></tag>
    <title>Ruby options for rap/tap</title>
    <updated-at type="datetime">2009-05-25T12:15:09-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/170</url>
    <original-body>It would be nice if various ruby options (esp -I) were available from the command line.  Equally useful, and a viable alternative, would be env configurations.</original-body>
    <latest-body>It would be nice if various ruby options (esp -I) were available from the command line.  Equally useful, and a viable alternative, would be env configurations.</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;It would be nice if various ruby options (esp -I) were available
from the command line. Equally useful, and a viable alternative,
would be env configurations.&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer">17257</assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2009-01-25T18:06:32-07:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">140</number>
    <permalink>executablequeue-rounds</permalink>
    <priority type="integer">63689</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>invalid</state>
    <tag nil="true"></tag>
    <title>ExecutableQueue rounds</title>
    <updated-at type="datetime">2009-05-25T12:12:43-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <assigned-user-name>bahuvrihi</assigned-user-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/140</url>
    <original-body>ExecutableQueue should be able to store rounds that effectively get appended when the current round expires.  This will more closely emulate schema and solve some problems in Server.</original-body>
    <latest-body>ExecutableQueue should be able to store rounds that effectively get appended when the current round expires.  This will more closely emulate schema and solve some problems in Server.</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;ExecutableQueue should be able to store rounds that effectively
get appended when the current round expires. This will more closely
emulate schema and solve some problems in Server.&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer">17257</assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2009-02-21T23:14:11-07:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">175</number>
    <permalink>revisit-aggregate-join-logic</permalink>
    <priority type="integer">80615</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>invalid</state>
    <tag nil="true"></tag>
    <title>Revisit aggregate join logic</title>
    <updated-at type="datetime">2009-05-25T12:10:30-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <assigned-user-name>bahuvrihi</assigned-user-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/175</url>
    <original-body>Not efficient or useful for any other purpose.

@@@ ruby
      
      #--
      # TODO -- consider is there a better way to optimize this?
      # currently this method is only used by an aggregate join
      def has?(entry) # :nodoc:
        synchronize do
          entry_id = entry.object_id
          
          @rounds.each do |round|
            round.each do |enqued_entry|
              return true if entry_id == enqued_entry.object_id
            end
          end
          false
        end
      end
@@@</original-body>
    <latest-body>Not efficient or useful for any other purpose.

@@@ ruby
      
      #--
      # TODO -- consider is there a better way to optimize this?
      # currently this method is only used by an aggregate join
      def has?(entry) # :nodoc:
        synchronize do
          entry_id = entry.object_id
          
          @rounds.each do |round|
            round.each do |enqued_entry|
              return true if entry_id == enqued_entry.object_id
            end
          end
          false
        end
      end
@@@</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;Not efficient or useful for any other purpose.&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
      
      #--
      # TODO -- consider is there a better way to optimize this?
      # currently this method is only used by an aggregate join
      def has?(entry) # :nodoc:
        synchronize do
          entry_id = entry.object_id
          
          @rounds.each do |round|
            round.each do |enqued_entry|
              return true if entry_id == enqued_entry.object_id
            end
          end
          false
        end
      end
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer">17257</assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2009-03-01T08:05:38-07:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">178</number>
    <permalink>add-collect-option-on-join</permalink>
    <priority type="integer">87673</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>invalid</state>
    <tag nil="true"></tag>
    <title>Add collect option on Join</title>
    <updated-at type="datetime">2009-05-25T12:09:09-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <assigned-user-name>bahuvrihi</assigned-user-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/178</url>
    <original-body>Collect would do the same thing as aggregate, but enque the task to the current round.</original-body>
    <latest-body>Collect would do the same thing as aggregate, but enque the task to the current round.</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;Collect would do the same thing as aggregate, but enque the task
to the current round.&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer">17257</assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2009-03-02T16:39:36-07:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">180</number>
    <permalink>argv-to-workflow-in-run</permalink>
    <priority type="integer">88097</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>invalid</state>
    <tag nil="true"></tag>
    <title>Argv to workflow in run</title>
    <updated-at type="datetime">2009-05-25T12:07:30-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <assigned-user-name>bahuvrihi</assigned-user-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/180</url>
    <original-body>Static workflows are great, but they need a way to receive arguments.  One option is to hack into the schema, only allow one file in run and then tack on the args:

@@@ text
  % tap run workflow.yml a b c
@@@

Another option is to implement a workflow task:

@@@ text
  % tap run -- workflow workflow.yml a b c
@@@

(wap?) Which then makes a pass-through workflow and enques the inputs to node 0, and completes to the result of node -1.  The workflow task would be a baseclass for more complicated pass-through workflows.  You could make a generator that takes a workflow.yml as an input and builds a stub workflow task!</original-body>
    <latest-body>Static workflows are great, but they need a way to receive arguments.  One option is to hack into the schema, only allow one file in run and then tack on the args:

@@@ text
  % tap run workflow.yml a b c
@@@

Another option is to implement a workflow task:

@@@ text
  % tap run -- workflow workflow.yml a b c
@@@

(wap?) Which then makes a pass-through workflow and enques the inputs to node 0, and completes to the result of node -1.  The workflow task would be a baseclass for more complicated pass-through workflows.  You could make a generator that takes a workflow.yml as an input and builds a stub workflow task!</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;Static workflows are great, but they need a way to receive
arguments. One option is to hack into the schema, only allow one
file in run and then tack on the args:&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;
  % tap run workflow.yml a b c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Another option is to implement a workflow task:&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;
  % tap run -- workflow workflow.yml a b c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(wap?) Which then makes a pass-through workflow and enques the
inputs to node 0, and completes to the result of node -1. The
workflow task would be a baseclass for more complicated
pass-through workflows. You could make a generator that takes a
workflow.yml as an input and builds a stub workflow task!&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer" nil="true"></assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">false</closed>
    <created-at type="datetime">2009-03-16T10:33:25-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">191</number>
    <permalink>env-aggregate</permalink>
    <priority type="integer">91713</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>new</state>
    <tag nil="true"></tag>
    <title>Env aggregate</title>
    <updated-at type="datetime">2009-05-25T12:06:34-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/191</url>
    <original-body>Envs make it seem like the files of nested environments are all in the same directory.  Why not make a method that actually collects the nested environments into one place.  This would facilitate freezing a development structure, and a variety of distribution models.</original-body>
    <latest-body>Envs make it seem like the files of nested environments are all in the same directory.  Why not make a method that actually collects the nested environments into one place.  This would facilitate freezing a development structure, and a variety of distribution models.</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;Envs make it seem like the files of nested environments are all
in the same directory. Why not make a method that actually collects
the nested environments into one place. This would facilitate
freezing a development structure, and a variety of distribution
models.&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer" nil="true"></assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2009-02-16T08:35:52-07:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">160</number>
    <permalink>server-routing</permalink>
    <priority type="integer">70847</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>invalid</state>
    <tag>server</tag>
    <title>Server Routing</title>
    <updated-at type="datetime">2009-05-25T11:58:14-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/160</url>
    <original-body>Routing currently does something like:

@@@ text
  /:controller(_controller)/:action
@@@

Update this to:

@@@ text
  /:controller_key/:action
@@@

Such that using escapes you can specify a minikey for any constant.

@@@ text
  /app/:action                # =&gt; App
  /tap-server%3aapp/:action   # =&gt; [tap-server] App
  /tap-server%3apath%2Fto%2Fapp/:action   # =&gt; [tap-server] Path::To::App
@@@

In this case env.controllers can become a 'standard' manifest and controllers can be put anywhere and marked by a '::controller' const_attr.  What's more this makes view paths simpler with a single rule:  'views/path/to/const'</original-body>
    <latest-body>Routing currently does something like:

@@@ text
  /:controller(_controller)/:action
@@@

Update this to:

@@@ text
  /:controller_key/:action
@@@

Such that using escapes you can specify a minikey for any constant.

@@@ text
  /app/:action                # =&gt; App
  /tap-server%3aapp/:action   # =&gt; [tap-server] App
  /tap-server%3apath%2Fto%2Fapp/:action   # =&gt; [tap-server] Path::To::App
@@@

In this case env.controllers can become a 'standard' manifest and controllers can be put anywhere and marked by a '::controller' const_attr.  What's more this makes view paths simpler with a single rule:  'views/path/to/const'</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;Routing currently does something like:&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;
  /:controller(_controller)/:action
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Update this to:&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;
  /:controller_key/:action
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Such that using escapes you can specify a minikey for any
constant.&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;text&quot;&gt;
  /app/:action                # =&amp;gt; App
  /tap-server%3aapp/:action   # =&amp;gt; [tap-server] App
  /tap-server%3apath%2Fto%2Fapp/:action   # =&amp;gt; [tap-server] Path::To::App
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this case env.controllers can become a 'standard' manifest
and controllers can be put anywhere and marked by a '::controller'
const_attr. What's more this makes view paths simpler with a single
rule: 'views/path/to/const'&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer" nil="true"></assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">false</closed>
    <created-at type="datetime">2009-05-23T09:19:04-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">209</number>
    <permalink>indifferent-access-in-env-config</permalink>
    <priority type="integer">110491</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>new</state>
    <tag nil="true"></tag>
    <title>Indifferent access in Env config</title>
    <updated-at type="datetime">2009-05-23T09:19:09-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/209</url>
    <original-body>Certain parts of env configuration is currently tied to symbols or strings.  (strings for tap.yml files, for example).  

This should have indifferent access, in from_gemspec

@@@ ruby
        config = {
          'root' =&gt; path,
          'gems' =&gt; dependencies,
          'load_paths' =&gt; spec.require_paths,
          'set_load_paths' =&gt; false
        }
@@@</original-body>
    <latest-body>Certain parts of env configuration is currently tied to symbols or strings.  (strings for tap.yml files, for example).  

This should have indifferent access, in from_gemspec

@@@ ruby
        config = {
          'root' =&gt; path,
          'gems' =&gt; dependencies,
          'load_paths' =&gt; spec.require_paths,
          'set_load_paths' =&gt; false
        }
@@@</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;Certain parts of env configuration is currently tied to symbols
or strings. (strings for tap.yml files, for example).&lt;br&gt;&lt;/p&gt;
&lt;p&gt;This should have indifferent access, in from_gemspec&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
        config = {
          'root' =&amp;gt; path,
          'gems' =&amp;gt; dependencies,
          'load_paths' =&amp;gt; spec.require_paths,
          'set_load_paths' =&amp;gt; false
        }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer" nil="true"></assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">false</closed>
    <created-at type="datetime">2009-05-17T11:25:14-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">208</number>
    <permalink>help-registry</permalink>
    <priority type="integer">107479</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>new</state>
    <tag nil="true"></tag>
    <title>Help registry</title>
    <updated-at type="datetime">2009-05-17T11:25:16-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/208</url>
    <original-body>Command line apps like tap could really benefit from a help registry so that certain errors can be supplemented with user help.

@@@ ruby
begin
  # ...
rescue
  raise if $DEBUG
  puts $!.message

  # replace this with a help registry
  if $!.message == &quot;no nodes specified&quot; &amp;&amp; !ARGV.empty?
    puts &quot;(did you mean 'tap run -- #{ARGV.join(' ')}'?)&quot;
  end
  exit(1)
end

exit(0)
@@@</original-body>
    <latest-body>Command line apps like tap could really benefit from a help registry so that certain errors can be supplemented with user help.

@@@ ruby
begin
  # ...
rescue
  raise if $DEBUG
  puts $!.message

  # replace this with a help registry
  if $!.message == &quot;no nodes specified&quot; &amp;&amp; !ARGV.empty?
    puts &quot;(did you mean 'tap run -- #{ARGV.join(' ')}'?)&quot;
  end
  exit(1)
end

exit(0)
@@@</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;Command line apps like tap could really benefit from a help
registry so that certain errors can be supplemented with user
help.&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
begin
  # ...
rescue
  raise if $DEBUG
  puts $!.message

  # replace this with a help registry
  if $!.message == &amp;quot;no nodes specified&amp;quot; &amp;amp;&amp;amp; !ARGV.empty?
    puts &amp;quot;(did you mean 'tap run -- #{ARGV.join(' ')}'?)&amp;quot;
  end
  exit(1)
end

exit(0)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer" nil="true"></assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">false</closed>
    <created-at type="datetime">2009-05-05T22:35:26-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">207</number>
    <permalink>show-inheritance-hierarchy-in-help</permalink>
    <priority type="integer">104706</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>new</state>
    <tag nil="true"></tag>
    <title>Show inheritance hierarchy in help</title>
    <updated-at type="datetime">2009-05-05T22:35:31-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/207</url>
    <original-body></original-body>
    <latest-body></latest-body>
    <original-body-html></original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer">17257</assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2009-03-31T14:19:23-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">196</number>
    <permalink>expand-root-generator-configs</permalink>
    <priority type="integer">96532</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>resolved</state>
    <tag nil="true"></tag>
    <title>Expand Root Generator configs</title>
    <updated-at type="datetime">2009-05-05T14:13:54-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <assigned-user-name>bahuvrihi</assigned-user-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/196</url>
    <original-body>Root Generator could also specify things like:

* name
* email
* rubyforge-project
* etc

The basic gemspec inputs.  This could be especially helpful if there is a static, global config file as well.</original-body>
    <latest-body>Root Generator could also specify things like:

* name
* email
* rubyforge-project
* etc

The basic gemspec inputs.  This could be especially helpful if there is a static, global config file as well.</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;Root Generator could also specify things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;name&lt;/li&gt;
&lt;li&gt;email&lt;/li&gt;
&lt;li&gt;rubyforge-project&lt;/li&gt;
&lt;li&gt;etc&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The basic gemspec inputs. This could be especially helpful if
there is a static, global config file as well.&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
  <ticket>
    <assigned-user-id type="integer">17257</assigned-user-id>
    <attachments-count type="integer">0</attachments-count>
    <closed type="boolean">true</closed>
    <created-at type="datetime">2009-03-24T13:27:26-06:00</created-at>
    <creator-id type="integer">17257</creator-id>
    <milestone-due-on type="datetime" nil="true"></milestone-due-on>
    <milestone-id type="integer" nil="true"></milestone-id>
    <number type="integer">195</number>
    <permalink>additional-root-generator-update</permalink>
    <priority type="integer">94436</priority>
    <project-id type="integer">9908</project-id>
    <raw-data type="binary" nil="true" encoding="base64"></raw-data>
    <state>invalid</state>
    <tag nil="true"></tag>
    <title>Additional Root Generator update</title>
    <updated-at type="datetime">2009-05-05T13:56:17-06:00</updated-at>
    <user-id type="integer">17257</user-id>
    <user-name>bahuvrihi</user-name>
    <creator-name>bahuvrihi</creator-name>
    <assigned-user-name>bahuvrihi</assigned-user-name>
    <url>http://bahuvrihi.lighthouseapp.com/projects/9908/tickets/195</url>
    <original-body>Yuck:

@@@ ruby
s.rdoc_options.concat %W{--main README -S -N --title Batch-search-paper}
@@@

Capitalize doesn't exactly work, does is?</original-body>
    <latest-body>Yuck:

@@@ ruby
s.rdoc_options.concat %W{--main README -S -N --title Batch-search-paper}
@@@

Capitalize doesn't exactly work, does is?</latest-body>
    <original-body-html>&lt;div&gt;&lt;p&gt;Yuck:&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
s.rdoc_options.concat %W{--main README -S -N --title Batch-search-paper}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Capitalize doesn't exactly work, does is?&lt;/p&gt;&lt;/div&gt;</original-body-html>
  </ticket>
</tickets>
