Dear devs,

The Nitro Development Team is proud to announce new versions of Nitro and Og

homepage: http://www.nitroproject.org
install: gem install nitro
download: http://rubyforge.org/projects/nitro/
trac: http://devlab.oree.ch/trac/nitrohq
irc: irc.freenode.net #nitro
faq: http://oxyliquit.manveru.net
mailing list: http://rubyforge.org/pipermail/nitro-general/


Another pragmatic release. The Nitro development team worked over
the submitted tickets and provided many bug fixes. More over, there
are many small improvements along the codebase and as always
we could not resist adding some cool new features.

Special thanks fly to Bryan Sotto for making this release
possible!

Most notable chages:

* Nitro allows fine grained customization of the compiler
  tranformation pipeline per controller or even per action.
  Here come some examples:

  class MyController
    ann :self, :transformation_pipeline => [MyTransformer, AnotherXForm]

    ...

    def my_action
      ...
    end
    ann :my_action, :transformation_pipeline =>
Compiler.transformation_pipeline.dup.shift(CustomXForm)

    ...
  end

* Nitro automates integration testing by means of the new
  session VCR feature that allows for easy proxy based
  functional testing. A typicall session goes like this:

  Start your app with:

  ruby run.rb --record myfile

  Then use your web browser to 'perform' your testing session.
  You can used multiple browsers, concurrent users and hit all
  the pages in your app. At the end, just stop the server.

  In order to perform regression testing against this recorded
  session just restart the server in playback mode:

  ruby run.rb --playback myfile

  Nitro automatically plays back the recorded session and logs
  any errors or Exceptions.

* Better Global variable implementation works better with
  distributed stores (Drb, Memcached). Notice the new
  Global.init and Global[:key].update { |v| } methods.

* Improved the Router implementation. One notable addition
  is support for global router initialization:

  Router.rules = [
    { :match => /~(.*)/, :controller => IdController, :action =>
:view, :params => [:name] }
  ]

* Cleaned up glue by removing files duplicating functionality
  allready available in Facets. Moreover, we moved several
  generally useful files and methods from Glue to Facets.

* Replaced the old RSSHelper with the new FeedHelper. The new
  implementation provides support for RSS, Atom, OPML. The
  FeedHelper is backwards compatible with the old helper but
  provides even more features.

  class MyController
    helper :feed
  end

* Added Og query by example support. Query the database for an
  entity that matches the example. The example is a hash
  populated with the property values to search for.

  The provided property values are joined with AND to build
  the actual query.

  Article.query_by_example :title => 'IBM%', :hits => 2
  Article.find_with_properties :title => 'IBM%', :hits => 2

* Added type casting support for Og aggregations and
  calculations.

* Greatly improved the configuration system. One noteable
  (and extremely useful) new feature is that you can now
  customize classes before they are even defined:


  Configuration.User.crypt_salt = 'HELLO'
  require 'users'

  in users.rb:

  class User
    setting :crypt_salt, :default => 'DF', :doc => 'The crypt salt'
  end

* Calculate rendering level in actions to allow for conditional
  rendering in top level actions or sub-actions. Some helpers
  are also provided:

  def myaction
    if request.is_top_level?
      ...
    end
  end

* Introduced an alternative more sophisticated (yet intuitive)
  form builder. While this new helper is still under construction,
  it is already very useful. Here come some examples:

  <!-- entity backed form -->

  <div id="myform">
  #{form :object => @owner, :action => :save_profile do |f|
    f.property :name, :editable => false
    f.property :password
    f.br
    f.submit 'Update'
  end}
  </div>

  <!-- form with virtual method (:multipart),
       special controls (:select_file) -->

  <div id="myform">
  #{form :method => :multipart do |f|
    f.p {
      f.label 'Select the new icon filename'
      f.select_file :file, :label => 'Select icon'
    }
    f.p {
      f.submit 'Change'
    }
  end}
  </div>

* More flexible Script generator, the developer can use most of
  its features without a Client subclass.

* Reimplemented session garbage collection.

* Added many more RDoc comments to the source code.

* Many, many bug fixes.

* Updated to latest Facets, Scriptaculous, Prototype.



Nitro provides everything you need to develop professional Web
applications using Ruby and Javascript. Nitro redefines Rapid
Application Development by providing a clean, yet efficient API,
a layer of domain specific languages implemented on top of
Ruby and the most powerful and elegant object relational
mapping solution available everywhere.

Please note that the project home page has been moved to:
http://www.nitroproject.org



have fun,
Nitro Development Team



--
http://www.nitroproject.org