Designing a RESTful api for YaST
16 years ago
................ ................. ......... ...... ..... .... ... .. . . .
rp5 run samples/jwishy.rb
RubyGlobal.java:135:in `createGlobals': java.lang.ExceptionInInitializerError
from Ruby.java:939:in `init'
from Ruby.java:172:in `newInstance'
from Main.java:199:in `run'
from Main.java:110:in `run'
from Main.java:94:in `main'
... the culprit was the alternative version of the JRE I was using (OpenJDK). After swtiching to the standard Sun JDK everything worked fine.
Following a frustrating week with the acts_as_state_machine/AASM plugin, I ended up writing my own finite state machine library for Ruby.
It's called Golem, and it's now on Github, here: http://github.com/zuk/golem_statemachine/tree/master
The code is cleaner than AASM's (or at least I think so), which should make debugging less frustrating. There's also a nice DSL for defining the state machine.
For example, to implement this statemachine:
You would define it like so:
define_statemachine do
initial_state :HUNGRY
state :HUNGRY do
on :eat do
transition :to => :SATIATED, :if => :likes?
transition do
action do |monster|
puts "#{monster} says BLAH!!"
end
end
end
end
state :SATIATED do
enter do |monster|
puts "#{monster} says BURP!!!"
end
end
end
The state machine definition goes inside your Ruby class (or ActiveRecord model), endowing the class with finite state machine behavior:
require 'golem'
class Monster
include Golem
attr_accessor :state
def initialize(name)
@name = name
end
def to_s
@name
end
def likes?(food)
food.kind_of?(String)
end
define_statemachine do
# ...
end
end
m = Monster.new("Stringosaurus")
puts m.current_state # ==> :HUNGRY
m.eat(12345) # ==> "Stringosaurus says BLAH!!"
puts m.current_state # ==> :HUNGRY
m.eat("abcde") # ==> "Stringosaurus says BURP!!"
puts m.current_state # ==> :SATIATED
Failed to load application: No module named ext... can be easily addressed by:
sudo apt-get install python-xml export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.5/site-packages/oldxmlThis caused me a good few hours' grief earlier today.