Easy Resolution of Before/After Relations For Ruby

Depression resolves before/after relations by forming a graph of them and flattening it. It supports simple before/after as well as "greedy" relations.

Getting Started

$ gem install depression

After installation the first steps are really easy. You simply need a bunch of objects that respond to #name as well as #relations and return something more or less unique and a hash, resp.

require "depression"

Item = Struct.new(:name, :relations)
items = [
  Item.new(:foo, {}),
  Item.new(:bar, :before => [:foo]),
  Item.new(:baz, :after => [:foo])

sorted = Depression.process(items)
puts sorted.map {|i| i.name }.join(",")
# bar,foo,baz

Greedy Relations


Resolving Conflicts


Resolving Circular Relations



Runs fine on Ruby 1.9.2 and JRuby 1.5.6.

To do & Ideas

  • Gracefully drop greedy relations if they conflict with normal relations
  • Implement a "friendly" mode that simply drops "older" relations until a circular relation is resolved
  • Visualize various stages of relation resolution (probably via GraphViz)
  • Maybe switch to TSort


  1. Fork at github.com/lgierth/depression
  2. Create a new branch
  3. Commit, commit, commit!
  4. Open a Pull Request

You can also open an issue for discussion first, if you want.


Depression is subject to an MIT-style license that can be found in the LICENSE file.