Ruby: how to restric what methods of children classes can do
March 26, 2008
In a scenario similar to this; a base class, Animal with generic method move which is specialized in descendant classes, with real functionality.
# Overwrite this in your animals.
def move;end
end
class Bird < Animal
def move
fly
end
def fly
puts ‘flap_wings’
end
end
Certain conditions have to be enforced before an animal (any of them) can move. For instance, no one wants a bunch of zombie animals moving around. I had to make sure every animal instance will only move if it is alive. The straight forward way to do this is: raise an exception in the specialized method.
def move
raise ‘Zombies do not exists!’ unless alive?
fly
end
def fly
puts ‘flap_wings’
end
end
That will work, however as you can see it’s not very ( if at all) DRY.
Using some meta-programming in the base class, it is possible to maintain a syntactically generic method (eg. move), and enforce some restrictions before the children class specific logic is called.
def initialize
# reopen the class in the constructor
class << self
# Alias the existent move method
alias :unrestricted_move :move
# define a new move method appliying restrictions
define_method(:move) do
raise ‘Die zombie die!’ unless alive?
unrestricted_move
end
end
# Overwrite this in your animals.
def move; end
end
Now you won’t have anymore death animals moving around and you can still safely call move in any class descendant of Animal.
Posted by geekvicious at 8:29pm
No Comments »
Hands-off my global namespace.
March 20, 2008
We’ve using merb + datamapper lately at work. Since data mapper 0.3.0 was released recently I decided to upgrade my own branch today. After updating the gem I ran my tests…just to get some very strange behavior. NoMethodError exceptions from trying to access the method ’suit’ in classes that had nothing to do with my tests nor the classes I was testing (testees?).
After hours minutes of frustration, I tracked down the exception to ruby’s Test::Unit::Collector, which relies on the standard behavior of the < operator between classes (A < B if A child of B). It turned out that data mapper 0.3.0 monkey patches Class, mixing-in Comparable and overwriting <=>, as a side effect Test::Unit becomes clueless about which classes are tests and which are not and starts calling ‘.suit’ in every single class in the ObjectSpace.
Well, after all monkey patching might be destroying ruby.
Posted by geekvicious at 12:03am
3 Comments »
Presenting PyDefensio
December 06, 2007
PyDefensio is small python module, that brings all the Defensio spam-filterig power to your python applications. Don’t forget to read Defensio’s api documentation first, more about PyDefensio, and download here.
Posted by admin at 12:10am
7 Comments »
Onliner bash ‘random’ number generator
October 23, 2007
This won’t give you a real random, but will do when you need a not trivially predictable number:
~$ expr $(date +%S) % 10
Posted by geekvicious at 1:45pm
2 Comments »
Gvim + Rails
August 29, 2007
I’ve been using aptana’s RadRails Eclipse plug- in to develop RoR apps for over a year, it has lots of nice features and has been working fine for me, however it is resources consuming, and heavy. in one phrase: RadRails is a nice IDE although far from perfect.
Probably, because of its architecture Eclipse is not very compatible with the Unix and Rails approach: ” Do one thing and do it right” , instead it does everything, and works well most of the time but, still feels awkward when developing rails.
Lately I rediscovered Vim probably the best Unix editor ever ( no matter what emacs fans would say ) and a really nice and small plug-in , that makes rails integration immediate and unobtrusive. It includes syntax highlighting, auto completion, easy rails navigation, Rake integration… and some more features.
Posted by geekvicious at 3:58am
3 Comments »
Yet another autotest desktop notifier … OSD
August 23, 2007
Being a big KDE fan I was glad when the people from snailbyte came up with KDE desktop notifier for autotest. Even though KDE is by far my favorite desktop environment, knofity has a big drawback; it is not possible to choose the color, for the notifications. So based in the growl autotest notifier, I wrote a version for osdsh an X OSD manager, it is not as pretty as growl ;)… but it gives me colorized desktop notifications on linux.
To use it just make sure you have installed osdsh, and it is running:
me@my_machine$ osdsh
Then put this in your .autotest file:
module OSD
def self.osd msg, color
system "osdctl -e \"dset(C,#{color})\""
system "osdctl -s '#{msg}' "
end
Autotest.add_hook :red do |at|
res = at.results[/d+ tests.*$/]
osd res, 'red'
end
Autotest.add_hook :green do |at|
res = at.results[/d+ tests.*$/]
osd res , 'green'
end
end
Posted by geekvicious at 2:54pm
1 Comment »
Painless skype in 64 bits (K)ubuntu
August 21, 2007
I recently got a new laptop , a dell Inspiron 1501. Having a 64 bits processor, it seemed to me kind of wasteful to use a 32 bit OS, so I took the easiest road, a 64 bits Kubuntu install; all the hardware worked out of the box except for the expected Broadcom’s wi-fi problem.
But when it came to install Skype, well not so painless. I need to use Skype for various personal reasons, so I *had* to install it.
First I tried using linux32 and the debian package provided by the Skype’s download page, it just wouldn’t… since Skype 1.4beta uses QT4. Then I tried with the static version, same story, it kept complaining about libsigc2 not being found even after I installed all the versions reported by aptitude.
After some hours of frustration I found getlibs a little application that did everything for me in one command
getlibs skype_static-1.4.0.74/skype
and voila.. it just worked!
Posted by geekvicious at 3:30am
No Comments »
Wikinquisition
August 18, 2007
There aren’t many more experienced censors than our good old catholic friends, for centuries the Holy Inquisition burned at the stake whitches and heretics in order to purify the faith.
They also occupied a good deal of their time controlling the public opinion, baning and burning impious books. Thankfully except for the most backwards societies they can’t do that anymore; however they still try to manipulate the public opinion as much as they can.
Their last attempt: wikipedia , a usual they blame everything on some “bad guys” using the Vatican’s computers. Hard to believe knowing who is in charge now.
Posted by geekvicious at 6:22pm
No Comments »
Debuggin RoR.. the rails way
August 17, 2007
For those who are developing web apps using RoR, debugging has always been a pain . It is much more easier now using the ruby-debug gem.
- Just gem install ruby-debug
- require it in your environment.rb
- Insert debugger in your code wherever you want the app to sop
The real guide here
Posted by geekvicious at 1:58am
No Comments »