JavaScript and Plane Fumes

Blog / Taffy 1.3, codename: Excelsior

Today I'm happy to officially release version 1.3 of Taffy, continuing my quest to keep to a greatly-reduced release cycle:

Taffy release history

I don't want to release so often it's annoying to have to upgrade, but still often enough to get bug fixes and new features out. How does 2 releases a year sound?

Download Taffy 1.3.0 stable

Here are the release notes for Taffy 1.3.0:

  • Meta / Project Management Changes
    • From this point forward, the master branch will be used for day-to-day development, not just merging in stable releases. Stable releases will still be available for download via the tags page. Should any maintenance releases be necessary, they'll be done in branches created from the applicable release tag.
    • We've had an extensive test suite for a while now, but I've finally setup a Jenkins instance and am doing a bit of continuous integration. You can see the build stats here: and this badge has been added to the ReadMe.
  • Bugs Fixed:
    • #105 - Static URIs that would match dynamic URIs are now allowed (/user/logout would previously conflict with /user/{userId}). Pay special attention to URI Matching Order.
    • #120 - Added support for */* Accept header value. Thanks to Brian Quackenbush for the patch!
    • #124 - Fixed a Railo-specific bug blocking resources from being loaded when the resources folder isn't in the web root. Thanks to Jean-Bernard van Zuylen for the initial bug report and the pull request!
    • #129 - Fixed a bug that MANY people have asked about recently: when you don't supply any form of requested return format (via header or URL "extension"), the dreaded "your default mime type is not implemented" error was returned. Jean-Bernard van Zuylen provided an epic detailed bug report, as well as the pull request that ultimately fixed it. A regular open source hero!
    • #130 - Fixed a regression in changes to the dashboard to use the new endpoint url param. This one was also reported and fixed via pull request by Jean-Bernard van Zuylen.
  • New Features:
    • Added a new queryToArray helper method for transforming query objects into an array of structures, preserving column name case.
    • #91 - A message is now displayed if Taffy can't find any resources.
    • #99 - Show dashboard without the ?dashboard query param (just browse to the root of your API). See deprecations, below.
    • #102 - Added support for DI/1 bean factory. See this example for a sample implementation.
    • #103 - Added environment-based configuration.
    • #108 - Added helper method getBasicAuthCredentials() to api.cfc (so you can use it in your Application.cfc). It returns a structure with keys username and password, and if NO basic auth credentials have been included in the request then both values will be blank.
    • #109 - Added helper method saveLog() to resource classes, which delegates to your configured exception logger. You may now use: saveLog(cfcatch) from inside a resource.
    • #115 - You can now use properties instead of setters to have Taffy autowire dependencies. (Setters are not deprecated; this is just an additional option.)
    • #117 - Added support for endpointURLParam. Thanks Marco Betschart.
    • #122 - Added support for ETag based caching
    • #128 - Now support Access-Control-Allow-Headers to list allowable headers for Cross-Domain requests. Thanks to Marco Betschart for the bug report and the patch!
  • Deprecations:
    • Using ?dashboard to display the dashboard is now deprecated in favor of simply browsing to the root of your API, with or without /index.cfm in the url. E.g. http://api.acme.com/ or http://api.acme.com/index.cfm instead of the old http://api.acme.com/?dashboard

As always, the full changelog history is available on the Release History page of the wiki.