Announcing Wee 2.0.0
Around 4 years have passed since the last release of my web framework Wee. Time to release 2.0.0!
What is Wee?
Wee is a web-framework for building highly-dynamic, component-based web-applications inspired by Seaside.
What’s new?
- 100% Rack based
- Support for continuations
- JQuery AJAX support
- Ruby 1.9 ready
Distinctive Features
Wee is not just yet another web framework. It is completely different!
Continuations
You can use continuations to model the page flow of the your application. Example:
# you can write code like this:
if callcc YesNoMessageBox.new('Really?')
# do something
else
# something else
end
Continuations are optional, nothing in Wee depends on them. If you don’t want to use continuations you have to resort to continuation passing style (CPS):
call YesNoMessageBox.new('Really?') do |res|
if res
# do something
else
# something else
end
end
Backtracking
Backtracking means that the user can naturally use the browsers back button despite Wee’s statefulness. This is not taken for granted for stateful web frameworks. Behind the scenes, Wee keeps multiple states of the application around with only little help by the programmer.
Components
Contrary to the widely used model/view/controller (MVC) paradigm, Wee tighly couples the controller and the view within a component. Components itself are highly decoupled from the rest of the application and can be reused to construct more complex applications. The powerful programmatic HTML rendering approach further reduces wasting the programmers mind by avoiding switching files (controller/view) or languages (Ruby/HTML). Therefore in Wee everything is written in Ruby. The programmatic HTML renderer is not just a simple HTML builder, it provides very powerful methods for easily generating HTML constructs and registering callbacks. Example:
#
# Generating a <select> tag
#
# select an object from these items
items = [1, 2, 3, 4]
# the labels shown to the user
labels = items.map {|i| i.to_s}
# render it
r.select_list(items).labels(labels).callback {|choosen| p choosen}
# render a multi-select list, with objects 2 and 4 selected
r.select_list(items).multi.labels(labels).selected([2,4])
Call/Answer mechanism
From callback handlers you can call other components which in turn replace the current components view. The called component can later return (or answer) back to the calling componenent. Example:
class YesNoMessageBox < Wee::Component
def initialize(msg)
super()
@msg = msg
end
def render(r)
r.bold(@msg)
r.form do
r.submit_button.value('YES').callback { answer true }
r.space
r.submit_button.value('No').callback { answer false }
end
end
end
# Use call (or callcc) as in the Continuation section above
# to call a component:
call YesNoMessageBox.new('Really?')
The classical Hello World Example
require 'rubygems' if RUBY_VERSION < "1.9"
require 'wee'
class HelloWorld < Wee::Component
def initialize
super
add_decoration Wee::PageDecoration.new(title="Hello World")
end
def render(r)
r.h1 "Hello World from Wee!"
r.div.onclick_callback { p "clicked" }.with("click here")
end
end
Wee.run(HelloWorld) if __FILE__ == $0
# Now point your browser to http://localhost:2000/
Installation
gem install wee