Yehuda Katz is a member of the Ruby on Rails core team, and lead developer of the Merb project. He is a member of the jQuery Core Team, and a core contributor to DataMapper. He contributes to many open source projects, like Rubinius and Johnson, and works on some he created himself, like Thor.

@gmcintire Passenger may be setting GEM_HOME differently -- can you print out ENV["GEM_HOME"] in passenger?

Archive for December, 2008

Join Me at Merb Training (Early Bird Expires Tonight!)

I just wanted to remind everyone that the Merb training I’m doing in Phoenix with Matt Aimonetti is filling up nicely (with some fresh Rails faces joining the roster post-merger), and that you have but a scant few hours to get in on the deal at early bird rates ($200 discount!).

If you’re working on a Merb app, this’ll give you the opportunity to learn more about the framework and best practices for development. If you’re a Rails guy, this can be your chance to get a jump on some of the ideas and code that will be making their way into Rails3.

Looking forward to seeing everyone there!

Share and Enjoy:
  • Digg
  • Reddit
  • HackerNews
  • Twitter

Rails Refactor Update (and Merb 1.0.7.1)

Over the past few days, I’ve been working on refactoring ActionController and ActionView to clean up the interactions between them. You can follow along on my github fork. Some principles I’m following:

  • ActionController and ActionView should work well standalone
  • All request-related information should be calculated in ActionController and passed through into ActionView
  • ActionView should be responsible for figuring out what path to render; ActionController should pass enough information for ActionView to figure it out.
  • Based on the previous, the information passed from ActionController to ActionView will likely be: template_name, list of acceptable extensions (i.e. [:html, :xml]), prefix (usually the controller name), and partial (a boolean indicating whether the template is a partial). This is not nailed down yet, but it has so far served well.
  • So far, I have unified render(:template), render(:file), and render(:action) to use this new conduit, and will be working on partials tomorrow. Partials are quite complicated so my current plan may have to change slightly when I tackle them.
  • Interesting info: ActionPack has a lot of methods that call each other (somewhat circularly), so it wasn’t really possible to just replace the existing conduit in a straight-forward manner. Instead, I created the new method (currently called find_by_parts, which finds a template based on the components I discussed above) and slowly (very slowly) moved existing callers of find_by_path over to use find_by_parts. Thankfully, the Rails test suite caught the initial errors I made, a huge saving grace of the entire effort.
  • A nice side-effect of moving to a single, clean API between AC and AV is that the final code should be easier to understand. Once I’m further along, I’ll post some details of how exactly the interaction works.

We also released Merb 1.0.7.1 today to fix a few issues that were outstanding as well as a 1.0.7 development mode regression. (In general, we will be using the x.x.x.x moniker for midweek releases and x.x.x for weekly releases). The issues that were fixed:

  • Templates should reload again in development mode
  • An issue in the bundler where gems in your local repository were getting greedily installed is fixed
  • An issue that was preventing bin/thor merb:gem:install use is fixed
  • The error message when gems could not be found was slightly improved

To upgrade:

  • gem install merb (make sure merb-gen 1.0.7.1 is installed)
  • in your app, rm -rf tasks/merb.thor
  • in your app, run merb-gen thor
  • you should receive a prompt asking you to override bin/common.rb. Accept the prompt.
  • you’re done

Happy holidays folks!

Share and Enjoy:
  • Digg
  • Reddit
  • HackerNews
  • Twitter

Another Rails 2.x/3 Update

I didn’t get that much done today on the Rails front as a result of getting Merb 1.0.7 out the door. I did do some more planning about how to clean up and improve the performance of ActionPack, and am really looking forward to diving into the work tomorrow.

Daniel (hassox), Michael (antares), and Carl (carllerche) have been hard at work today:

  • Daniel has been porting over the Merb Bootloader concept into Rails’ initializers. This is a 100% backward-compatible change that will simply make the initialization process easier to hook into (especially for plugins). This is one of the crucial components necessary for good ORM agnosticism. You can follow along at his branch. This turns out to be fairly difficult so kudos to Daniel for picking up this piece of the puzzle and getting right at it.
  • Michael has been going through ActiveSupport and working to make it more modular. His first major achievement is getting a new activesupport/mini.rb file that can be used by other libraries that want extensions, with a guarantee that it won’t pull in any more than is explicitly included. It includes blank?, Object#metaclass, Array extensions, Hash extensions, *attr_accessor, multibyte support, and inflections. Additional components can be required granularly, and of course, each of these components can be included granularly as well. activesupport/mini is intended to be a lightweight starting point (it weighs in at just 2.5MB) for the most common cases. Michael plans to move Templater, which currently uses Extlib, over to AS once 2.3 is released.
  • To quote Michael: 

    On the ActiveSupport front, we separate Rails-specific dependencies from others, so 3rd party applications do not get extra overhead. Right now in 2.2.2 if you do require ‘active_support’, it loads a lot of Rails specific code, like i18n gem, Builder and ActiveSupport::JSON. Since there are Ruby applications that need a convenient support library, but do not deal with the web, JSON and Builder are pure overhead, and should be loaded by the Rails components that use them.

  • In a follow-up to the very simple example I gave yesterday in annotating metaprogramming, Xavier Noria (fxn) went in and annotated all of the metaprogramming in the entire Rails codebase. Holy sh**. Check out the commit. It should make it a *lot* easier to understand the metaprogramming sprinkled throughout the Rails codebase. Thanks to antares for the initial inspiration.
  • Carl has been doing some killer work to make the Merb router more flexible, and capable of handling Merb1, Rails2, and a potential Rails3 syntax with the same backend. It’s going to be really awesome to get the feature-set of the Merb router (optional segments, routing based on arbitrary request elements, inline custom code, etc.) into Rails with a shiny Railsish API. David (dhh) is already doing some killer work on designing an API for the features in the Merb router that aren’t yet in Rails that looks very promising.
  • We’re beginning to see that a large amount of the work that we’re doing is 100% backward compatible and can easily make it into 2.x. There’s a chance there will be a 2.4 release sometime between 2.3 and 3.0 just to roll in compatible features and cleanup, so we don’t dump the entire new feature-set on you in one fell swoop. We’ll see how that goes.
  • I have a small change ready to be merged into rails/master that unifies three places that did content negotiation throughout the Rails codebase. I have more work to be done on this front, but it’s a lot clearer what needs to be done now that the small bit of refactoring is done.  

I hope to have some stuff on ActionPack in tomorrow’s update. I’m really looking forward to my first full work-day on Rails at EY.

See you tomorrow folks!

Share and Enjoy:
  • Digg
  • Reddit
  • HackerNews
  • Twitter

Merb 1.0.7 Release Notes

We just released Merb 1.0.7. Some highlights:

  • merb-action-args doesn’t break when you use a exotic defaults (like [] :P )
  • merb no longer drops a pid except in daemonized or clustered mode. This fixes a bug people were having when running rake tasks or merb -i on production servers
  • fixes a bug where partials with absolute paths were not getting implicit local variables correctly
  • caches _template_for, which should improve performance
  • adds better documentation for the block parameters of the router’s defer_to
  • request() now goes through additional rack middleware, not just the default Merb application
  • fixes generated .gitignore to completely ignore gems/gems and gems/specifications
  • adds datamapper and do_sqlite3 to generated dependencies.rb
  • fixes outdated documentation in merb_mailer for using merb_mailer with TLS (gmail)
  • fixed at least one case where thor bundling was throwing an error related to full_name. If you encounter other errors, please report them immediately on the Merb tracker and tag them “bundling”
  • fixed an issue with merb-helpers where label() was ignoring passed in attributes

This is the first post-merge release of Merb. As you can see, we’re still fixing bugs at a pretty fast clip. We *can* chew gum and walk at the same time!

I hope everyone enjoys the rest of their weekend. I, for one, am looking forward to continuing work this week!

Share and Enjoy:
  • Digg
  • Reddit
  • HackerNews
  • Twitter

A Rails Communique

After staying up until 5am last night, I slept in a bit this morning. I had lunch with Koz, his wife, and Ezra, and we got to talking some more about the issues we’ve been addressing over the past few days (we had a nice discussion about router recognition and generation, and various techniques we’ve both been using to improve performance of large route sets).

  • After lunch, I spent some more time thinking about how to further clean up ActionController and ActionView, and with the help of Josh and Pratik, who both recently did some refactoring work in ActionView, came up with a good plan of attack. I’ll post more details once I have some code to show, but the bottom line is that it should reduce the rendering pipeline down to a few hash lookups and a send. We already got close to this in Merb, but the recent work Josh did on ActionView provides a nice foundation for knocking this one out of the park.
  • Michael has continued his work on ActiveSupport, and is almost finished with a way of requiring ActiveSupport that will include only the barebones so that it can be used for third-party libraries. In particular, he would like to move Templater over from Extlib to ActiveSupport once the minimalist version has been released (the minimalist package now uses less resources than Extlib). Some details from Michael’s testing.
  • Daniel has been working on porting the Merb bootloader system over to Rails’ initializers, which should be 100% backward compatible but more flexible, especially for plugins.

Maybe one of these days we’ll take a day off. I hope to have some exciting code for you tomorrow!

Share and Enjoy:
  • Digg
  • Reddit
  • HackerNews
  • Twitter

Status Memorandum

Today was another great day working on improving Rails. What happened today:

  • I made my first commits to Rails. The commits remove the use of method_missing in respond_to. Effectively, when you did respond_to {|format| format.html }, the format object was a Responder object that collected up the mime types you specified and then followed your instructions. However, the html method was not defined on Responder. Instead, Responder relied on method_missing to determine, on the fly, whether html was a valid mime type. 
  • The fix was to generate methods for all known mime types in advance. In addition, when method_missing is triggered and a valid mime type is detected, Rails now generates a method on the fly (so at maximum single method_missing will be called for a particular method). The main win here is that since the method is generated, it’s not longer necessary to check whether the mime exists every time. If you get to the format.html method, that’s evidence that the mime exists, since it cannot otherwise be generated.
  • The upside: 8% full-stack speed-boost on both MRI and JRuby for a simple case (bringing the full-stack overhead when using respond_to down from 2.5ms to 2.3ms). It may not seem like a lot, but 0.2ms here, 0.2ms there, and pretty soon you’re talking big… amounts of time?
  • I did a lot of benchmarking on BlockAwareEnhancer. It turns out that for JRuby, the <%= form_for %>…<% end =%> syntax  can bring down a page heavy with block helpers (1,000 block helpers to be precise) down from 30ms to 8ms. In MRI, the same technique brings the total time from 80ms to 65ms. (yes, that is a shockingly good result for JRuby… seems like there are very common, expensive operations that JRuby kicks butt on).
  • Carl is working hard on making the router super-easy to hook into with any front-end DSL. This will help us easily maintain backward compatibility with current Merb syntax, while giving us the ability to give Rails all the new features of the Merb router with a familiar syntax.
  • Michael (antares) continues his work on analyzing parts of Extlib that should go in ActiveSupport, comparing the compatibility of the modules, and bringing in new features (LazySet and DeferredModule come to mind). The idea is to make it easier to opt in to small parts of ActiveSupport with the ability to clearly know what will get pulled in as a result.
Share and Enjoy:
  • Digg
  • Reddit
  • HackerNews
  • Twitter

Dispatch from the Front Lines

Hey all,

It’s been a very busy few days, but I’m glad to say that the work on the Rails/Merb merge is going quite smoothly. Some things that have already happened:

  • DHH has posted an outline of our plans to bring display/provides into Rails: http://tinyurl.com/providesinrails. The new API resolves some lingering issues I personally had with the provides/display version, and is still undergoing a bit of change.
  • Michael Klishin (antares) has begun work to merge Extlib into ActiveSupport. There are already some obvious incompatibilities, so we will be doing both cleanup on the differences and selecting the fastest implementations. He has also begun porting LazyArray, the underpinnings of the DataMapper “kicker” technique, to ActiveSupport. I should note that Michael was instrumental in merging Merb and DataMapper’s extensions into Extlib in the first place, so this should work out quite well.
  • As DHH mentioned in his post, some work is also being done to work out a better API for the Merb router. While our API works fine, we’re working together on an even better API for Rails3. One of the great things about working with the Rails team is being able to work with very talented API designers on some hard problems. To be clear, we will still support both Rails2′s API and Merb1′s API, because the Merb router, which is serving as the base for this work, decouples the code generation part from the DSL (so any DSL can be used to generate the structures that the router than converts into its compiled matching method).
  • We have started discussing some other issues that could potentially break back-compat in Rails (like Merb’s BlockAwareEnhancer for helpers that take blocks), and I’m happy to report that the conversations have been very productive. Being able to revisit issues that both groups addressed suboptimally in the past with a larger group is proving to be quite enlightening.
  • I have personally begun work to unify the code in Rails that does content negotiation to always go through a single path. You can follow along at http://github.com/wycats/rails/commits/content_negotiation. I will be rebasing this remote branch against current rails master frequently (to keep it in sync with rails head) so you may need to reclone from time to time.

On the Merb front, we will be releasing 1.0.7 this weekend. Expect the first transitional release (Merb 1.1) in the next month or two. It will probably involve porting over basic configuration to Rails’ style (Merb’s Kernel#* style is pretty icky) and probably starting to create a shim for some of the more obvious differences (before/before_filter comes to mind). It’ll be the first of several releases specifically designed to help you make the transition in an incremental way.

Happy holidays folks!

Share and Enjoy:
  • Digg
  • Reddit
  • HackerNews
  • Twitter

Rails and Merb Merge

Today is a fairly momentous day in the history of Ruby web frameworks. You will probably find the news I’m about to share with you fairly shocking, but I will attempt to explain the situation.

Before talking tech, and even going into the details of the announcement, I want to assure everyone that the incredible members of the thriving Merb community are top priority, and that this could not have been possible without every one of them.

Merb is an open, ever-changing project, and some its best ideas have come from not-core regular-Joe community members. It’s gotten where it has because of the community, and the community will get us even further in the future. Your ideas, feedback and even complaints will be 100% welcome in the future, just as they have been in the past. I believe in the tremendous value an open community and just generally open attitude bring to the table, and am counting on those things to continue ushering in the future of Ruby.

On to the news: beginning today, the Merb team will be working with the Rails core team on a joint project. The plan is to merge in the things that made Merb different. This will make it possible to use Rails 3 for the same sorts of use-cases that were compelling for Merb users. Effectively, Merb 2 is Rails 3.

What does that mean exactly?

  • Rails will become more modular, starting with a rails-core, and including the ability to opt in or out of specific components. We will focus on reducing coupling across Rails, and making it possible to replace parts of Rails without disturbing other parts. This is exactly what Merb means when it touts “modularity”.
  • We will port all of our performance improvements into Rails. This includes architectural decisions that are big performance wins. This project will also include the creation of one or more benchmarking applications, so we can more clearly see what optimizations have real-world impact.
  • As of Rails 3, Rails will have a defined public API with a test suite for that API. This was one of the major differentiators of Merb. This will allow users and plugin developers to have a clearer, more stable API to build against. It should also significantly reduce plugin breakage from release to release.
  • Rails will be retrofitted to make it easy to start with a “core” version of Rails (like Merb’s current core generator), that starts with all modules out, and makes it easy to select just the parts that are important for your app. Of course, Rails will still ship with the “stack” version as the default (just as Merb does since 1.0), but the goal is to make it easy to do with Rails what people do with Merb today.
  • Rails will be modified to more easily support DataMapper or Sequel as first-class ORMs. While ActiveRecord will ship as the default ORM, the plan is to make it drop-dead easy to drop in other ORMs without feature degradation (to the extent possible, of course).
  • Rails will continue their recent embrace of Rack, which is a really exciting development in the Ruby community that Merb got in on early and which we believe will improve the state of modular, sharable logic between applications.
  • In general, we will take a look at features in Merb that are not in Rails (the most obvious example is the more robust router) and find a way to bring them into Rails.

How will we do this?

The plan is to start working on Rails immediately, and to continue fixing bugs and resolving other major issues in Merb in the interim. We will also release versions of Merb specifically designed to help ease the transition to Rails 3.

In particular, we will do Merb releases with deprecation notices and other transitional mechanisms to assist developers in tracking down the changes that will come between Merb 1.x and Rails 3. Expect a number of interim releases that get incrementally closer to Rails 3, and expect parts of Merb (most notably the helpers) to be ported to run on Rails 3 in order to further reduce friction.

To be perfectly clear: we are not abandoning the Merb project. There are many production applications running on Merb that are relying on both timely bug fixes and a clear path to the future. If you’re using Merb today, continue using Merb. If you’re considering using Merb for a project because it works better for your needs, use Merb. You will not be left in the cold and we’re going to do everything to make sure that your applications don’t get stuck in the past.

If you’ve already learned Merb, we will be working hard to make sure that you can parlay that knowledge into Rails 3. At Engine Yard, we fully intend to continue using Merb for our internal apps until Rails 3 is out, but we will be using those (non-trivial) applications to be sure the experience is smooth for everyone. There will be no huge jumps and you will not need to rewrite your application from scratch.

Why!?

As you have probably gathered from the above, there aren’t any clear points that the Merb and Rails team disagree on anymore. Merb has been around for roughly two years now, and we’ve proved out our ideas by use in real-world applications (like Yellow Pages, SproutCore, Powerset, Defensio, etc.). Given this philosophical convergence, it just didn’t seem like there was much to gain by continuing to duplicate effort and spend time and energy fighting each other.

I think it’s important to acknowledge the Merb community for building something super-awesome. I really hope that we’ll all stay in this together, help each other in the coming months and in the transition to Rails 3.

Rails will be putting together a new evangelism team, which will include Matt Aimonetti (Merb core team member and evangelist) and a few other people doing Rails evangelism work. This group will be responsible for, among other things, helping the community get where we’re going. Their job will be to listen to you.

This seems crazy! Has this ever happened before?

Interestingly, yes. A very similar situation confronted the Struts developers several years back. They had built a very popular framework in Struts, but a very active group of developers were really advancing the same ideas in interesting ways in a framework called Webwork. The Webwork developers saw their project as “Struts done right”, just as we believe we’ve improved on the implementation of Rails.

Eventually, the Struts guys and the Webwork guys came to the conclusion that they would be stronger together then apart, and merged the projects. What became Struts 2 was effectively also Webwork 2, but the two communities got together to build something better.

I believe that this merger will get the ideas that gave Merb momentum into the hands of many more people, and that really serves us all. I’m looking forward to the future.

Postscript

  • One of the most personally gratifying parts of working on Merb has been working with alternative Ruby implementations to make Merb run well on them. Fairly early, Merb was running faster on JRuby than MRI, and I’m looking forward to bringing a lot of that insight to Rails, and helping to make Rails to be solidly competitive on the performance front with frameworks in “faster” languages.
  • The Merb Training is very much still on! We’ve spoken with the majority of the attendees, as well as with our partners at Integrum Technologies and they’re all really excited about the merger. That makes this training basically the first training focusing on the future features of Rails 3, and a great way to get ahead of the game. There are still a few seats open, so sign up now if you’d like to join us!
Share and Enjoy:
  • Digg
  • Reddit
  • HackerNews
  • Twitter

Merb 1.0.5 and 1.0.6

Merb 1.0.5 was released yesterday, with a quick release of Merb 1.0.6 to resolve a few issues we found with the new bundler. The release included a number of small fixes as well as a brand new bundler.

  • merb-slices no longer generates code that includes the private load_dependency API
  • Cleaned up the default generated controller
  • Cleaned up merb-slice generator
  • Escape all XML in form helpers to prevent XSS attacks. Merb 1.0.7 will include whitelist sanitization.
  • Remove autoload for merb-core classes to work around threadsafety bug in Ruby autoload
  • Update Merb::Rack::Profile to output the call tree
  • Support dependency “foo”, :require_as => nil for cases where you want to bundle the dependency but don’t want it to be required automatically

The new bundler is very simple. All you need to do is make sure your dependencies.rb lists all gems you wish to bundle, and run thor merb:gem:install. This will install any gems that are missing in your local bundle and uninstall any gems that are in your local bundle but are not present in your dependencies.rb.

Some issues we worked on:

  • Gem dependencies are now specified by a single manifest and thor merb:gem:install keeps gems up to date
  • Only one version of a single gem can be installed at once, which removes the possibility of cryptic runtime failures
  • All gem installation is wrapped in a transaction. Unsuccessful installation (due to dependency conflicts) will trigger a rollback. After successful installation, Merb will attempt to confirm that the configuration is valid by activating all gems. If the activation fails, a warning will be printed and the installation will be rolled back.
  • gems/gem and gems/specifications are now ignored by the default .gitignore that comes with Merb. The only exception to that rule is thor, which allows bin/thor to be run on a new remote machine that has only Ruby and Rubygems installed.
  • The bundler now uses Rubygems proper if appropriate. For instance, Rubygems allows the specification of a bin directory and allows overriding the binary wrapper that is generated. The previous merb.thor did not use this facility but generated a wrapper itself. The new merb.thor uses rubygems itself to generate the wrapper.
  • We have monkey-patched Rubygems in a few places to add additional facilities that will hopefully make it back into Rubygems proper. For instance, Gem::Specification now has recursive_dependencies, which will return a recursive list of all dependencies of the gem. This could potentially be used in rubygems itself to support uninstallation of dependencies that are no longer needed.
  • We have also monkey-patched Rubygems to support prioritized gem repositories. At present, Rubygems only supports one giant gem repository. As a result, bundling in Merb 1.0.4 completely removed the system gem repository (for instance, if you required merb-core >= 1.0.4, had merb-core 1.0.4 in your bundled directory and merb-core 1.0.5 in your system repository, merb-core 1.0.5 would have gotten included, which was undesirable).
  • In a few places, we made Rubygems more conservative about updating existing gems. In particular, if a gem being installed has a loose dependency (e.g. merb-action-args 1.0.4 requires merb-core >= 1.0.4) and the dependency is satisfied (e.g. merb-core 1.0.4 is installed) but a new dependency is available (e.g. merb-core 1.0.5), we retain the old dependency. This is to minimize potential breakage of existing working configurations.
  • We have improved the redeploy task as well. In the new system, the redeploy task simply brings the local gems/gems in sync with gems/cache. This allows you to get a working configuration locally, .gitignore (or svn ignore) gems/gems and gems/specifications, and then keep a remote bundle in sync with the gems/cache. The preferred way to achieve this is by symlinking gems/gems and gems/specifications into your deployed copy of merb.

How to upgrade?

If you generate a new application, everything will just work for you. If you’re running an old application and would like to update the bundling without completely regenerating the app, take the following steps after installing merb:

  1. rm tasks/merb.thor
  2. merb-gen thor
  3. modify .gitignore to ignore gems/gems and gems/specifications

We will be releasing a screencast tonight with more details on how to get up and running, so keep an eye out!

UPDATE: Also, I’d like to thank Jacques Crocker for helping me work out some of the details that broke in the initial 1.0.5 release of Merb. His assistance was invaluable!

UPDATE: We released 1.0.6.1 to deal with a regression in error reporting that crept in between 1.0.4 and 1.0.6. To update from 1.0.6, modify the merb gems version in dependencies.rb to use 1.0.6.1 and run thor merb:gem:install.

Share and Enjoy:
  • Digg
  • Reddit
  • HackerNews
  • Twitter

Merb 1.0.4

Hey guys!

We just released Merb 1.0.4. Some highlights:

  • Update rake install and rake release:merb to work correctly
  • Modify cache README to accurately reflect the best practice for setting up the cache
  • Set the fatal! warning to print out to STDOUT, assuming STDOUT is the terminal (this was previously causing specs that caused a fatal to silently fail, but print the fatal warning to the log)
  • Fix dependencies to remember the backtrace when they were declared, so that failing to load a dependency prints the backtrace at declaration time, rather than printing a backtrace in Merb’s bootloader.
  • A boatload of fixes to begin work to make Merb work on 1.9
  • Fix code reloading in non-forking environments, including correctly loading files that were loaded as the result of requiring the initial file, as well as correctly handling files that were previously required (i.e. don’t re-require files at load, but do on reload).
  • Significantly speed up content negotiation (we were previously using an expensive class-based approach when a simple array approach would do). We have a fairly good test-suite for content-negotiation, but please alert us to any new failures in exotic scenarios.
  • In addition, the most expensive part of content-negotiation is now cached, which requires a cache mutex. Given how expensive it was before caching, we felt that adding a mutex was acceptable. If you find that performance under heavy concurrency has degraded, please let us know.
  • Modify Merb.logger.* to take a block, which defers the evaluation of the thing to print until it is determined that, in fact, the printing needed to happen. For instance, Merb.logger.debug params.some_expensive_operation becomes Merb.logger.debug { params.some_expensive_operation }, so that some_expensive_operation is not run in production mode.
  • last_modified and last_modified= were modified to support DateTimes (coming out of an ORM) in addition to pure times.
  • A bug related to JRuby backtraces was only partially resolved in 1.0.3. It is fully resolved in 1.0.4.
  • The backtrace checkboxes no longer display in :show_exception_details is false.
  • We now support socket files containing %s, which will be replaced with the socket number.
  • merb.visit, merb.click_link, and other Webrat helpers are now available in console mode, if webrat is installed. If it is not, we no longer throw an error in any circumstance, but print a warning about unavailable features.
  • multipart_request now preserves the session, but with an API change. If you would like to opt into the new feature, require “merb-core/two-oh” in your init.rb. The new multipart_request takes a path, params, and the rack environment, but does not take a block. It returns the same object that request() returns and therefore can be used with the be_successful, etc. rspec matchers. You should use multipart_post and multipart_put in most cases.
  • The multipart helper tests were updated to reflect the new changes, and require “merb-core/one-oh”. The specs in spec10 were not modified, and do not opt-in to the new changes.

Merb 1.0.5 will focus exclusively on improving the dependency situation (which we know sucks) and is expected next Monday.

Have a happy week!

Share and Enjoy:
  • Digg
  • Reddit
  • HackerNews
  • Twitter