Jon Dahl has a great write-up on Rail Spikes comparing Pivotal Tracker to just about every bug tracking application out there.
http://railspikes.com/2009/2/2/pivotal-tracker-bug-trackers
He hasn't had a chance to try it out on longer projects yet, but we use it everyday on projects (like tracker itself) that have been years in development and refinement.
Thanks, Jon, for the thoughtful exploration of the product!
Interesting Things
- Neat Plugin: Caio Chassot suggested a patch to rails that makes rails template finder traverse the controller inheritance chain when looking for templates. This would make the view system work "correctly" with inheritance, which one of our projects needed. The patch wasn't applied, but the code was released as a plugin called inheritable_templates, which we are now using and enjoying.
- What's the opposite of
{:a => 1, :b => 2}.to_a? It'sHash[:a, 1, :b, 2]. - Rails 2.3 is going to be awesome! We're most looking forward to
- Nested model assignment and views
- Nested transactions, even on MySQL!
- Default Scopes, no more adding
:order => "position"on everyacts_as_listmodel - Smarter rendering of partials
- Rack support
- Bringing of Engines back. Pivotal is still going to support Desert at this time. Desert is similar to engines, but loads every class that matches in the load path, not just the first one. This allows you to build plugins that extend previous plugins. Using engines, however, we are hoping to make the source code for desert even more trivial.
It's getting hard to keep up with all the Remix activity.
Matt Williams has put together a PHP library for Remix.
Code sample:
require_once 'BestBuy/Service/Remix.php';
$apiKey = '12345678'; // Your API key
$remix = new BestBuy_Service_Remix($apiKey);
// Retrieve a list of stores within 10 miles of a zip code
$result = $remix->stores(array('area(10006,10)'))->query();
// Result objects may be implicitly cast as strings
echo $result;
// Retrieve a list of Movies containing the text "Bat"
$result = $remix->products(array('name=bat*','type=Movie'))->query();
if(!$result->isError())
{
echo $result;
}
else if(403 != $result->http_code)
{
// API errors result in an error document with detailed info
echo current($result->toSimpleXml()->xpath('/error/message'));
}
else
{
// 403 errors do not contain a full error document, only an h1 message
echo $result->data;
}
// Retrieve fields from a list of Movies starting with "Bat" in JSON format
$result = $remix->products(array('type=Movie', 'name=bat*'))
->show(array('name','regularPrice','url', 'sku'))
->format('json')
->query();
echo $result;
// Check for store availability of a Playstation 3 in a given area
$result = $remix->stores(array('area(10006,10)'))
->products(array('sku=8982988'))
->sort('distance')
->query();
echo $result;
Other articles:
