== Version 0.23.0 The summer vacations are over and there is a brand new Nitro release. There is a preview of the new Scaffolder (also handles Og relations), support for Tagging (folksonomy), lots of small features and improvements and many bug fixes. Additionally, the code has been restructured to utilize the excellent Nano and Mega support libraries. Most notable additions: * Scaffolding reloaded. The scaffolding infrastructure is reimplemented to generate more flexible code. The automatically generated forms allow for visualization and editing of Og relations such as HasMany and BelongsTo. For example when rendering a BelongsTo relation all possible parents are presented with a select element. When rendering a HasMany relation a list of all children is presented. Moreover, an experimental admin component is provided. Just add the line: require 'part/admin' and surf http://www.mysite.com/admin To enter a simple administration screen. WARNING: This feature is considered a preview and will be improved in a future version. * Major cleanup in the Glue subproject. Some files are moved to the nano/mega project. Nano/Mega is now used throughout Nitro and really makes development so much easier. * Introduced Og Taggable mixin. It was never easier to add tagging to your application. class Article include Og::Taggable .. end article.tag('navel', 'gmosx', 'nitro') article.tags article.tag_names Article.find_with_tags('navel', 'gmosx') Article.find_with_any_tag('name', 'gmosx') t = Article::Tag.find_by_name('ruby') t.articles t.articles.count For an example usage of this Mixin, consult the Spark sources. * Added support for relative and absolute URLs in redirects and renders. This feature simplifies the creation of reusable components. * Support for assigning compound objects from the request. Here is an example: class Article property :title, String property :body, String end
article = request.assign('article') Alternatively you can use the article[title] article[body] notation. * Added simple Benchmarking mixin. * Added support for 'evolving' a single Og managed class. Useful when you are in development mode and change your schema. * Added support for session garbage collection. * Many many small bug fixes in Og and Nitro. == Version 0.22.0 A snapshot of the latest developments. Many requested features where implemented, and many reported bugs fixed. * The much requested Og 'reverse mode' is implemented. Og's domain specific language and API is extended to allow fine-grained customization of the schema-to-objects mapping. Og can now handle most of the legacy schemas you can throw at it. Here is an example: class User property :name, String, :field => :thename, :uniq => true property :password, String property :age, Fixnum, :field => :age3 has_many Comment, :foreign_field => :user set_table :my_users set_primary_key :name, String end class Comment property :cid, Fixnum property :body, String belongs_to User, :field => :user set_table :my_comments set_primary_key :cid end As you can see, even relation fields can be customized. For higher level customization you can overload methods like #table, #field_for_property etc. * Og now handles multiple connections to multiple stores even in thread safe mode. This means you can now have objects serialized in different RDBM systems in the same application. Or you can have some objects managed by an RDBMS store and others by a FAST in-memory store. You can still have relations between objects in different stores. An example: mysql = Og.setup(:store => :mysql, ..) psql = Og.setup(:store => :psql, ..) class User has_many Comment end class Comment belongs_to User end mysql.manage_class User psql.manage_class Comment user.comments << comment * Greatly improved support for testing and test-driven-development. A reworked testing infrastructure for controllers is in place. Moreover, support for Og fixtures and automatic test database setup is provided. Fixtures can be defined with yml or csv files. For an example of the testing infrastructure check out the Spark 0.4.0 sources. Spark is a Wiki powered by Nitro. * Reworked mailer implementation. The new mailer allows for incoming email handling. Here is an example: class Mailman < Glue::Mailer def receive(mail) article = Article.new(mail.subject, mail.body) article.category = Category.find_by_name(mail.to.split('@').first) article.save end end * Added script/runner in proto as a convenience to running ruby code in your application environment. * Many fixes in the caching infrastructure. * Many fixes in the XMLRPC service infrastructure. * Many smaller changes and feature implementations that make development with Nitro so much more pleasurable. == Version 0.21.2 This is mainly a bug fix release. Some minor features are implemented: * Pluggable dispatchers. A new dispatcher that implicitly handles nice urls is enabled by default. You can easily change to the old general dispatcher though. * Better markup setup. * Cookie Helpers. * Important bug fixes in Og. == Version 0.21.0 was released on 25-07-2005 Nitro goes from strength to strength as the community gets bigger. Great new features were introduced and a lot of effort was spend on cleaning up Nitro's implementation and polishing 'little things'. Many patches were contributed by the community to make this is a release you will love! Some notable changes: * New compiler pipeline replaces the obscure shader mechanism. A compiler object is responsible for transforming a controller action and or the associated xhtml templates to a special ruby method that will respond to given urls with the action output. Using the aspect oriented features of Nitro or the specialized pipeline setup method a developer can easily customize the compilation stage to meet his needs. Here are some examples: Compiler.setup_template_transformation do |template| template = Elements.transform(template) template = Localization.transform(template) template = Markup.transform(template) template = Template.transform(template) end or Compiler.before "puts 'Compiling'", :on => :compile Compiler.after "puts 'Template processed'", :on => :transform_template Compiler.wrap Benchmark, :on => compile Compiler.before :my_method, :on => compile Special rendering effects where never easier. If you need run time effects, just intercept the Render object. * Integrated the new configuration system that was previewed in the last release. All the configuration settings are now accessible either through the owner class or from the global Configuration variable using Ruby's metaprogramming features. Moreover, Nitro now dynamically decides the configuration mode (debug, stage, live/production) from environment variables or command line arguments so depolying your application is easier than ever: just run svn update on the live server, the application will grab the correct configuration parameters automatically. Of course you can use svn's advanced features to rollback to earlier versions if you experience problems. The mode specific configuration settings are defined either on ruby files or yaml files or both. Point your browser to http:://my.app.com/settings to browse the settings for your application. * Og dynamic queries. You can inject caclulated or join attributes to your objects. Here is an example: class Item property :quantity, Fixnum property :unit_price, Float def initialize(quantity, unit_price) @quantity = quantity @unit_price = unit_price end end Item.create 2, 3.0 item = Item.find_one :select => 'quantity*unit_price as total_price' item.total_price # => 6.0 Please note that total_price is a dynamically injected attribute. Now you can combine SQL's powerful query features with the simplicity and elegance of Og. * Og customized join tables allows you to use any Ruby object as the join relation between other objects. Here comes an example: class Category property :title, String end class Article property :title, String end class ArticleToCategory property :rate, Float has_one Article has_one Category end c1 = Category.create c2 = Category.create a = Article.create a.categories.add(c1, :rate => 2.3) a.categories.add(c2, :rate => 1.2) for c in a.categories p a.category_join_data(c).rate end * Og collections size() is now optimized. * Og join code support refactoring. The new code is easier to read, more customizable and generates more efficient code by default. * Nitro automatically assings reasonable template_roots on Controllers based on mount points. Moreover, the template_root overloading feature was improved. If you cant to reuse an existing controller but customize the view rendering by using different templates for some actions, just assign a different template root for this controller, and put the custom templates inside that dir. The custom templates 'override' the templates of the parent controller (templates for non customized actions come from the parent's controller template_root). Creating a library of reusable controllers (parts) was never easier. * Major cleanup of the nitro source code, removed many files. * Greatly improved Wee integration makes Nitro the premium container for Wee components. Have a look at the updated wee example. * Improved builder mechanism for programmatic rendering. The new builder resuses the controller helper mixins thanks to extensive refactoring of the implementation. Here is an example: class MyController def index build do labels = ['George', 'Stella', 'Renos'] html { head { title 'A simple test' } body { 10.times { strong 'Hello World' i 'Hello World222' } select(:id => 'names') { options :labels => labels, :selected => 1 } } } end end * Improved helper integration. Helpers are now accessed either as mixins or through the builder mechanism. #{form entity} #{options :labels => [..], :values => [..], :selected => 1} or #{emit :form entity} #{emit :options :labels => [..] ...} * Reimplemented the markup mixin to make this more flexible. You can easily customize the markup logic that is applied by the markup macros. * Updated the documentation. * Fixed all reported or discovered bugs, many smaller improvements. == Version 0.20.0 was released on 12-07-2005 Another superb release! State of the art AJAX/Javascript support, Wee components / programmatic renderer integration, a beginners tutorial, self documenting configuration and many important bug fixes. Don't forget to check out our new community site at http://www.nitrohq.com Some notable changes: * Ajax is THE buzzword at the moment, and Nitro provides the best support you can find. Nitro fully separates the behaviour from the template using the behaviour.js library and allowing for dynamic injection of ajax functionality. The generated code contains clean html and all the javascript organized in a single See how a normal tag is converted transparently to an Ajax request. The prototype, scriptacoulous and behaviour js libraries are used. The ajax support in this release is a PREVIEW. Stay tuned for major improvements (and some surprises) in the next version. * Wee Components integration. Nitro now transparently integrates Wee components. This is truly a win-win situation. Wee applications can use Nitro's infrastructure. Nitro applications can use extremely reusable, stateful Components. For a demonstration check out the new Wee example in the examples distribution! Wee 0.9.0 is needed! Even better interoperability with Wee is coming soon. Nitro plays well with the others, and always provides more options. * Mixins are modules of functionality that can be mixed into Controllers. The developer can explicitly include Mixins or use Nitro conventions to have helper Mixins automatically included: class MyController .. end module MyControlllerMixin # gets automatically mixed in end This works just like Og Mixins. * Brand new, self-documenting configuration system. There is a new keyword for defining configuration settings: Here is an example: class Render setting :template_extension, :default => 'xhtml', :doc => 'The default template extension' end class Session setting :store, :default => 'memory', :doc => 'The session store' end You can configure the Application using ruby code or yaml files: Render.template_extension = 'xhtml' Session.store = 'drb' or Render: template_extension: xhtml Session: store: drb You can access all defined settings: Configuration.settings.each { |s| ... } You can view the settings of the application along with documentation on the following url: www.myapp.com/settings This feature is also a PREVIEW. Will be used a lot more in the next release. * CherryPy style published objects. Nitro allows you to publish any Ruby object. Here is the new hello world example: class HelloWorld def index print 'Hello World' end def add(val) print "added: #{val + 2}" end end App.start(HelloWorld) Now, point your browser to localhost:/ or localhost/add?val=2 If you need the advanced controller functionality just extend your published object from the Controller base class. The normal heuristics to decide which method is safe to publish are aplied. * CherryPy-style dispatcher configuration, provides another way to define mounting points for Controllers and published objects. Here is an example: server = Server.new server.root = MainController # / server.root.fora = ForaController # /fora server.root.wiki = WikiController # /wiki server.root.really.deep = DeepController # /really/deap * Improved pager interface. Thanks to the new PagerMixin, presenting paged lists is easier (and as efficient) than ever: items, pager = paginate(Article, :per_page => 5, :order => 'date DESC') * Added better sql injection protection in Og sql stores. * Fixed Mysql store reconnect bug. * Og falls back to pure ruby adapters for Mysql and Postgres, to make it easier to run out of the box. Please, don't forget to switch to the natively compiled adapters for production sites. * This is surely the most request feature: Nitro Step by Step by James Britt, a beginers guide to Nitro. Available in the brand-new, Nitro-powered, www.nitrohq.com Community wiki. * New examples: The totaly recoded and ultra cool ajax example, a Wee/Nitro example and the new Hello world example. * Cleaned up a lot of source files. * Many, many, many bug fixes and small improvements. This release fixes all reported bugs in the spirit of out zero-bug tolerance philosophy. == Version 0.19.0 Og reloaded part 2: Another superb release introducing a balanced mix of innovative new features, common but useful stuff and bug fixes. Some notable changes: * Og polymorphic relations. A groundbreaking feature made possible by Og's unique design and Ruby's power. Let's use an example to explain the concept: class Comment ... belongs_to Object # polymorphic marker end class User ... has_many Comment end class Article ... has_many Comment end u = User.new u.comments << User::Comment('Hello') a = Article.new a.comments << Article::Comment('Wow!') User::Comment and Article::Comment where automatically created by Og and are serialized in different tables (also automatically created by Og). This is the next step in DRY! * Og now supports inheritance using the well known Single Table Inheritance pattern. Thanks to Og's advanced design the pattern is fully encapsulated: class Document ... schema_inheritance end class Article < Document .. end class Photo < Document .. end Document.all # => includes Articles and Photos Article.all # => only Articles User.documents # => Articles and Photos User.documents(:type => Photo) # => only photos. Btw, this feature is orthogonal to the polymorphic relations feature just described, giving the developer great flexibility. * Added SUPERB support for auto reloading, the new system can detect source changes everywhere! Based on original code by Michael Neumann. * Introduced the concept of Flash, a temporal store where objects that should be kept alive for the next request are saved. * Recoded the Blog example to use the Elements system for shading instead of XSLT. The new code runs easier under Windows (so the no_xsl_blog example is now removed). Here comes an example: Please login as an author by entering the blog password.
The password is: #{Blog.password}.
#@error ...
The tag is supported by the Page Ruby class to do the programmatic rendering of templates or logic code: class Page def render ... end end This system can be used to create a library of useful components to abstract common tasks. * The updated Blog example demonstrates how easy it is to write webservices using Nitro and the experimental Service feature. The code is so short, so lets paste it here: module BloggerApi SBlog = Struct.new(:url, :blogid, :blogName) def blogger__getUsersBlogs(appkey, username, password) Blog.all.collect { |b| SBlog.new('http://www.gmosx.com', b.oid, b.title) } end end module MetaWeblogApi def metaWeblog__newPost(blogid, username, password, content, publish) entry = BlogEntry.new(content['title'], content['description']) entry.blog = Blog[blogid] entry.save entry.oid end end module MovableTypeApi SCategory = Struct.new(:categoryId, :categoryName) def mt__getCategoryList(blogid, username, password) blog = Blog[blogid] blog.categories.collect { |c| SCategory.new(c.oid, c.title) } end def mt__setPostCategories(postid, username, password, categories) cid = categories.first['categoryId'] BlogEntry.update(postid, "category_oid=#{cid}") true end end class ApiController < Nitro::XmlRpcService include BloggerApi include MovableTypeApi include MetaWeblogApi end That's all! * Integrated an SQLite3 patch by Ghislain Mary. * Integrated PostgreSQL binary data patch by Michael Neumann. * Fixed all reported bugs. == Version 0.18.0 was released on 01/06/2005. Mainly a bug fix release. Many small improvements were implemented. All reported bugs were fixed, as well as bugs found during the deployment of a live application. For more information consult the detailed changelog. Thanks to Julien Perrot for small patches. Some notable changes: * Some changes to make Webrick a valid solution for powering a production server. The full page output caching was improved and support for daemonizing the server was added. Support for running as a proxy target (behind an apache server) was also added. * Thread safe mode was added again in Og. This works nice with the Webrick server. * New order macro in Og to set default ordering for each entity. The has_many collections respects the order setting. * Improved error reporting. * Support for template_root overloading. Lets say you have the following Controller hierarchy: Controller > MyController > SpecificController. The template roots of the 3 controller are searched in reverse order. So by adding a template file in the SpecificController template root you can override a default action in the base Controller. For convienience the base Controller points to the Proto directory. This is experimental. * Provide the examples as a separate distribution to make it easier for Ruby newbies to find them. * Bug fixes in the Elements system. * Improved the nitrogen generator command. Just run nitrogen app ~/the/target/path to create a skeleton application. * Cleaned up some source files. == Version 0.17.0 was released on 16/05/2005. The biggest release yet, featuring the brand new implementation of Og. Due to the many changes this should be considered a preview release, a stabilized version is expected shortly. Bug reports and comments on the new features are especially appreciated. Many thanks to Michael Neumann, Dan Yoder and other hackers on the mailing list for ideas and suggestions that made this version possible. Most notable Og additions: * Extremely clean source code. Better names are used thorougout. Extra care was taken to make all features more orthogonal. * Brand new relation mechanism. The 'enchanting' of entities (managed classes) happens in multiple passes to be more flexible. Totaly separated graph/metadata creation and serialization code generation. The Graph metadata can be used for advanced scaffolding, testing and more. * Support for fully customizable primary keys. You are no longer forced to use xxx_oid primary keys. Appart from the extra flexibility this feature provides, this is an essential step towards the planed 'reverse engineering' mode that will allow the use of existing schemas with Og. * More elegant inspection mechanism. Example: Article.relation(:user) # => Og::BelongsTo(...) Article.relations # => [...] Article.properties # => [...] * Joins_many relation, as an alias for one way, join table relations. * Support for 'active' collections. Active collection are synchronized with the backend Store and provide a more elegant interface and the opportunity for 'session' caching: article.comments << Comment.new instead of article.add_comment(Comment.new) # this is also allowed though. p article.comments p article.comments.size # the results of the first query is cached * Eager relations. comments = Article.comments(:include => User) for comment in comments p comment.user.name end Elegantly solves the N+1 query problem by using one join query. * No need for forward references when defining relations. Now, the following code magically works: class User has_many Comment # works even though Comment is not defined! end class Comment belongs_to User end * Use inflection where possible to infer missing configuration options. For example class Article belongs_to User # infects relation name :user ... * New, lean and mean Store interface. The code needed to teach Og how to serialize objects to backend store is dramatically reduced. The new interface is SQL agnostic, so non SQL-RDBM's stores are possible. * SQL agnostic querying interface, compatible with non-sql Stores. Here is an example: Article.find( :condition => 'hits > 2 AND rate > 3', :order => 'title', :offset => 30, :limit => 10 ) * More elegant (and non-sql store compatible) way for selective updates: article.title = 'Changed' article.hits += 1 article.update(:title, :hits) * New, in-memory store that support all features. This is a pure ruby solution useful for experimentation. It will also serve as the base for the forthcoming madeleine Store implementation. * Allow for multiple stores in one application. A great example, mysql_to_psql is provided. This example uses Og's powerfull features to automatically convert a Mysql database to a PostgreSQL database. Database migration was never easier. * Uses the excellent Facets utility collection to further clenup and minimize the code. * Managed classes or Entities should include the EntityMixin or extend the Entity class. Example: class Article < Entity .. end class Article include EntityMixin end This is done to avoid the Module module like in earlier versions of Og. However, Og is can infer the need to include the Managed mixin in typical cases: class Article property :title, String # when a property is defined Og automatically converts the # class to an Entity end class Article < AnExistingManagedEntity # also includes the mixin ... class Article include AModuleThatDefinesProperties ... * Improved support for og_delete interception. * Support for nested transactions. Check out the file test/og/tc_store.rb for a demonstration of the new features. And some Nitro additions: * Integrated the Facets library, and started donating some Glue code to this project. * Integrated the Prototype object oriented javascript library. * Included a preview implementation of the new tag library system, called Elements. This is based on an original idea by Dan Yoder. This feature is expected to change substantially in the next version. In the meantime here is an example: Here is a nice page.
This is #{variable}. hello admin
The tags and automatically instantiate objects of class Page and Box that handle the rendering. This is an alternative to the XSLT templating system and can also be used to implement some reusable components. The hierarchical structure of the elements is available to each object to facilitate advanced rendering tricks. Just like the XSLT shader the Elements transformation is preapplied to the page to avoid the overhead at runtime. * Fixed many reported bugs. == Version 0.16.0 was released on 16/04/2005. A snapshot of the latest developments. Many, many subtle improvements, new features and a major cleanup of the source code. Thanks to James Britt for significantly contributing to this release. Most notable additions: * Aspect Oriented Programming support. This new system is used to reimplement features such as Controller filters, Og callbacks and Og observers. By using this unified system you can now add Observers to controllers and use a metalanguage for wraping Og object callbacks: class Controller pre :force_login, :where => :prepend wrap Benchmark, :on => :index post :taraa, :on => login end module Timestamped pre :on => :og_insert { |this| this.create_time = Time.now } pre :on => :og_update { |this| this.update_time = Time.now } pre :on => [:og_insert, :og_update] { |this| this.create_time = Time.now } end This feature will be used extensivelly in future versions to improve logging, the shaders and more. * Added support for Test Driven Development. Many helpers and utility methods are added to the standard TestCase class, more will come in a future version: handle( '/login', request = { 'password' => Blog.password } ) assert_redirect assert_session_has(:owner) assert_session_equal(:username, 'George Moschovitis') assert_has_cookie('nauth') assert_has_no_cookie('wow') assert_cookie_equal('nauth', 'just an example, not used :)') * CGI adapter (by James Britt) * Major cleanup of the source. Converted the N namespace to Nitro, to be more compatible with other Ruby projects. * Add Og Timestamped mixin. * Og improvements. * Improved runner helper. * Improved reloading support. * Improved the Gem installation process. * Fixed all reported bugs. == Version 0.15.0 was released on 04/04/2005. A great release. Many cool new features and tons of subtle improvements. We also welcome a new core developer, Anastastios Koutoumanos, who's first contribution is the new SqlServer adapter. Most notable additions: * Advanced localization support: locale_en = { 'See you' => 'See you', :long_paragraph => 'The best new books, up to 30% reduced price', :price => 'Price: %d %s', :proc_price => proc { |value, cur| "Price: #{value} #{cur}" } } locale_de = { 'See you' => 'Auf wieder sehen', ... } lc = Localization.get lc['See you'] -> See you lc[:price, 100, 'euro'] -> Price: 100 euro lc = Localization.get[:de] lc['See you'] -> Auf wiedersehen Using the LocalizationShader you can have templates like this:

[[This is a localized]] String

do you [[:like]] this?

All strings enclosed in [[ ]] are replaced with localized versions (honouring the session locale). Check out the updated blog example. * Dynamic/Parametrised mixins. A great extension to Ruby's mixin feature. The Og::list implementation is replaced with the new Orderable dynamic mixin, here is an example: class Comment property :body, String belongs_to :article, Article include Orderable, :scope => article end c.move_higher The Orderable mixin uses the :scope parameter to dynamically alter the methods appended to the Comment class. This new feature will be used throughout the platform. * NestedSets mixin: class Comment include NestedSets end or class Comment include Hierarchical, :method => :nested_sets end c.add_comment(child_comment) c.full_children c.direct_children c.children this is a reimplementation of the SqlTraversable mixin available in older versions. * Improved templating system. Now allows <% %> intrerpolators and provides a number of html morphing effects:
admin interface
  • #{u.first_name} #{u.last_name}
and more... * Og provides an SqlServer adapter out of the box. * Improved scaffolding code (still a lot more to come). * Build default environment, introduced nitro and nitrogen commands to help new users. * Many, many small improvements and fixes. == Version 0.14.0 was released on 28/03/2005. This release fixes *important* bugs amd improves various aspects of the platform. Moreover, we included some great *new* features for your pleasure. Most notable additions: * Fixed IMPORTANT bug in property inheritance. * Fine grained caching. Nitro allows you to cache whole pages (output caching), actions and fine-grained fragments. class MyController < Controller cache_output :my_action def my_action end end Stores the whole page created by the my_action method to the disk to be displayed by the web server thus completely Nitro and Ruby. or Here is some cached code
  • #{a.title}: #{a.body}
or Another one session[:admin]) do ?> ... Cached fragments can be stored in memory, filesystem. While this feature is fully operational, the API will be finalised in the next version. * Introduced support for Og mixins. In this version a List mixin is provided: class Article has_many :comments, Comment, :order => 'position DESC' end class Comment belongs_to :article, Article acts_as_list :scope => :article end An AR compatible API is provided. An alternative API is planned for the near future to give you more choice. * Reimplemented filtering infrastructure, allows for inheritance, conditional application of filters (:only/:except) modifiers, more performant Filters as Strings and more. * Fixed multipart support in fastcgi, added file upload example (tiny example). * The webrick adapter reuses the fastcgi infrastructure, making the adapters more compatible with each other. * Added many useful Og enchant methods. * Cleaned up configuration files for lighttpd/apache. * More compatible with win32. * Fixed examples and all reported bugs. == Version 0.13.0 was released on 17/03/2005. A snapshot of the latest code. The Nitro project is now split in three gems (nitro, og, glue) and the code is better separated. Many changes were made to make programming with Nitro more similar to Rails, to make the platform more accessible to newcomers. A conversion of ActionMailer and an AJAX example are also included. * Introduced Mailer subsystem: class MyMailer < Mailer def registration_email(to, username, password) @from = 'system@navel.gr' @to = to @subject = 'Registration information' @body.username = username @body.password = password end end the tempate (registration_email.xhtml): Hello #{username} Thanks for registering, your password is '#{password}' Then use it like this: MyMailer.deliver_registration_email('gmosx@navel.gr', 'gmosx', 'rulez') For more information, check out the updated blog example. * AJAX example, demonstrates how to use ajax techniques with Nitro. A simple Google Suggest style UI is implemented. * Use a Rails compatible directory structure. Check out the updated blog example. Please note that Nitro does not force a directory structure (see an alternative structure in the no_xsl_blog example). * Optional separate template_root/public_root for extra security. * Further code cleanup and bug fixes. == Version 0.12.0 was released on 07/03/2005. A careful blend of new features and subtle improvements to the existing infrastructure. Some important bugs where fixed aswell. Most notable additions: * Nitro allows the definition of metadata for each action. Routing (rewrite) rules, parameter constrains, hierarchy information and custom data can easily be attached to actions: def view @entry = Article[@oid] end action :view, :route => /view\/(.*)/, 'oid' => 1 just browse view/1 and @oid is automatically initialized with request['oid'] Browse the source to see how to add additional constrains, more is comming in the next version. This feature replaces the non portable ParseTree implementation. The scaffolder is updated to generate routings for nice urls. * Og automatically generates finders for all properties, for even easier (and portable) querying: class Article property :title, :body, String property :hits, Fixnum property :create_time, Time end you get the finders: Article.find_by_title Article.find_by_body Article.find_by_hits Article.find_by_create_time The finders take into account the unique constrain, to return an array or just an object as needed. * Og introduces lifecycle observers to avoid 'poluting' the model objects with excess functionality. You can use every object as observer (duck typing) or extend from an AR style Observer class. The observer callbacks are precompiled in the lifecycle methods only if defined, so the perfomance is not affected in the general case. * Factored out templating engine, can now be used in stand-alone mode. Usefull for example to render email templates etc: template = %q{ Hello #{user} dont forget the following facts:
  • #{item}
  • } user = 'gmosx' items = %w{ nitro is really great } out = '' # the rendered template comes here. Template.process(template, :out, binding) * New options in the default runner: --render crawls a web application and renders all pages as static html files. Allows you to leverage Nitro's advanced templating features to generate static sites. --crawl spiders the application, useful for testing. * Better error page, with more information (see blog example). * Fixed Og bug: multiple many_to_many relations with the same target class. * further code cleanup, improved examples and more. == Version 0.11.0 was released on 28/02/2005. The platform continues to evolve and now supports the Apache web server and the Oracle database out of the box. This version features improved documentation, important bug fixes and many subtle improvements to make programming even more enjoyable. Many thanks to Matt Bowen for his help with this release. Most notable additions: * Configuration files for Apache/FastCGI. * Og documentation (doc/og_tutorial.txt, doc/og_config.txt) * Actions with parameters: def list(username, oid) ... end http://www.mysite.com/list?username=tml;oid=2 calls list() with the correct parameters, no need to use request['oid'], just use oid. def list(username, oid) puts oid # oid == request['oid'] end WARNING: this feature requires the ParseTree library which is not compatible with Windows. For the moment, this feature is dissabled by default. To enable this feature, set Nitro.resolve_action_arguments = true. * New session store system, DRb sessions (stored in an independent DRb server) are reimplemented. Session.store_type = :drb * TableBuilder helps in creating html tables. * Integrated builders with the programmatic render. For example:
    #{o.build_table(:id => 'my_tab', :headers => headers, :values => values)
    or

    Object Form #{o.build_form(obj)}

    * Og Oracle adapter. * Og provides advanced metadata for the managed objects class Article property :title, String property :body, String has_many :comments, Comment end par = Article.properties_and_relations => [Property(:title), Property(:body), Og::HasMany(:comments)] par[2].klass => Comment par[2].meta[:linkback] => :article_oid * Og Typemacros, here is an example: def VarChar(size) return String, :sql => "NOT NULL VARCHAR(#{size})" end property :title, VarChar(30) * Option for faster startup, skip schema check. * Many small Og improvements and fixes. * FastCGI adapter bug fixes. * New example, why's wiki, from a cool post at http://redhanded.hobix.com * IMPORTANT security fixes. == Version 0.10.0 was released on 15/02/2005. Another strong release featuring a completely recoded Og implementation and redesigned Og adapter (formely backend) system. An SQLite3 adapter is also provided. Moreover the Nitro installation process is improved, and many small changes make the framework more elegant and easier to use: the updated examples reflect this! Most notable additions: * Improved Og implementation (cleaner code) and new Og adapter subsystem. * New SQLite3 Og adapter, improvements in MySQL and PostgreSQL adapters (WARNING: needs version 1.1.0 of Sqlite3-Ruby). * Added install.rb for easier installation of the tar.gz distribution. * Better GemSpec for easier installation by RubyGems. * Action/template/xsl auto-reloading system in debug mode, new implementation, works again. * New Nitro configuration system, with rational default parameters. * --console option attaches an irb session to a running instace of an application (works again). * Og supports optional typechecking by using property metadata. * request alias for context to be compatible with older versions of nitro and Webrick/jsp and other frameworks. * Improved the examples, cleaner code, work from any directory. * Removed more obsolete code and improved directory structure. * and many more smaller fixes. WARNING: If you used an earlier version of Og you may need to drop your database and let Og recreated it automatically. == Version 0.9.5 was released on 04/02/2005. A bug fix release. * Fixed nasty Windows deadlock bug. * Experimental Wee-style example (will be updated in the next version). * Changed default port to 8069 (8080 was to common). * Small fixes and improvements. == Version 0.9.3 was released on 01/02/2005. A *very* important release. A new abstract rendering pipeline is introduced. This pipeline allows for multiple adaptors (WEBrick, fastcgi are included). Many classes have be rewritten using *clean* code, and the directory structure has improved again. All unused and obsolete files have been removed. A new version of the Blog example was included. This version does not use XSLT and runs on Windows. If you havent seen Nitro or you had problems with an earlier version, this is the time to revisit this project! Most notable additions: * Drastically improved source code readability. * New abstract rendering pipeline. Benefits: * multiple adaptors. * better unit tests. * optimized memory allocation. * more modular desing. * FastCGI support (tested with Lighttpd). * no_xsl_blog example. This new example is easier to setup, even on Windows. This also demonstrates that Nitro does NOT force the use of XSLT. * No global variables used for nitro configuration. * Updated the docs to better reflect the rappidly evolving codebase. * Og metalanguage relations insert metadata into the target class, useful for advanced scaffolders. * Og refer_to meta-language command. * Many bug fixes and small optimizations. The next version will stabilize the Nitro api. == Version 0.8 was released on 12/01/2005. A snapshot of the latest code. Cool new features, many fixes and improvements in older features. Many thanks to Michael Neumann for giving intelligent suggestions and finding small bugs. Most notable additions: * New automatic validation system: class User prop_accessor :name, :password, String validate_confirmation :password validate_length :name, :range => 2..12 end u = User.new(...) unless u.valid? p u.errors.on(:name) p u.errors[:password] end * Programmatic xhtml rendering. This is an alternative method of rendering that is usefull in building components and helpers. This is a preview implementation. options = ['Male', 'Female'] o.select(:name => 'sex') { o.options(options, selected = 1) } options = { 'Male' => 'm', 'Female' => 'f' } o.select(:name => 'sex') { o.options(options, selected = 1) } o.html { o.p(:class => 'header') { o.b('Hello') } } * No global variables in Og. * Recoded Og to allow for future support of multiple databases (even on different RDBMS systems) on a single application. * Improved Blog example demonstrates latest advancements. (You have to drop the database of earlier versions!) * More unit tests. * Supports Ruby 1.8.2 * Integrated extensions/dev-utils by Gavin Sinclair. * Integrated blankslate by Jim Weirich. * And many IMPORTANT bug fixes. == Version 0.7 was released on 27/12/2004. A snapshot of the latest code. Many fixes and new features result in a more mature product. Many thanks to the ruby hackers that sent suggestions and patches used in this release! Most notable additions: * Improved win32 compatibility (Tiny example runs out of the box). * Binary content example (Flash, needs ruby-ming installed to run). * Totaly recoded prop_accessor mechanism, avoids polution of the Module class. * prop_accessors for Modules, allows synthesizing of managed objects from Mixins. * new automatically generated methods in Og. * MockDatabase leverages the FlexMock object for easier unit testing. * Integrated the cool Breakpointer library by Florian Gross. * Markup mixin to automatically expand/compact generalized markup code. * new_form wizard. * Statically (compile time) included subscripts. * Important bug fix in redirects. and many many bugfixes! :) == Version 0.6 was released on 13/12/2004. This is a preview release, the api for the new features is not finalized. This early release gives other developers to offer suggestions on the final form of those features. Most notable additions: * Og many_to_many relations with auto generation of the join table. * Og has_one relation. * PHP-style nested output buffering. * Rails-style Filters. * autoreload services. * complile time evaluation of ruby code in templates. * improved pager ui. * initial version of FormBuilder. * initial version of new_app wizard. * Improved Blog example. and... the nitro logo :) == Version 0.5 was released on 23/11/2004. Many new features: * Stand-alone Og distribution. * Scaffolding. * Og RDBMS index support (works again). * improved render/dispatcher. * REST/XML dspatcher. * RssBuilder. * Improved BLOG example. * Many fixes. == Version 0.4.1 was released on 15/11/2004. A MAJOR revision! The rendering engine was recoded from scratch and now features Rails-style actions. Some older features are not yet converted to the new engine though. Other new stuff includes a fully working / cool looking Blog example, a programmable shader pipeline, automatic object manager in Og, improved directory structure, bug fixes, many changes to make it easier to switch from Rails, and many many more cool improvements for you to find out in the detailed ChangeLog. == Version 0.3.0 was released on 01/11/2004. An important revision! Nitro now includes the first version of a brand new ObjectRelational mapping library called Og (ObjectGraph) that combines the best features of Active Record and NDB. A fully working MySQL adapter is also provided. Moreover the code base is further cleaned up. Small improvements to the application configuration system. == Version 0.2.0 was released on 25/10/2004. Greatly improved RDoc documentation. Cleaned up many source files, and improved the directory structure to be more compatible with other Ruby projects. Introduced a test suite. Important bug fixes in NDB. Tiny example no longer requires apache so should run out of the box. == Version 0.1.2 was released on 21/10/2004. The first public version. Features 2 examples and limited documentation. The aim of this release is to make the project known to the Ruby Community. We hope that the Ruby hackers will respond with valueable suggestions and ideas.