The Spox Library is collection of helper methods and classes.
gem install splib
git clone http://github.com/spox/splib.git cd splib gem build *.gemspec gem install ./
rip makes it easy to install directly from a github repository.
This library has been tested on:
-
Ruby 1.8.6-p399
-
Ruby 1.8.7-p249
-
Ruby 1.9.1-p378
-
JRuby 1.4.0
The Spox Library has various things located within it. The Splib#load method will allow you to load individual parts of the library, or the entire thing, into your program. Lets take a quick look at some of the things available from this library.
Access to a variety of URL shortening services
require 'splib' Splib.load :UrlShorteners puts Splib.tiny_url 'www.google.com' puts Splib.trim_url 'www.google.com' puts Splib.isgd_url 'www.google.com' puts Splib.shortest_url 'www.google.com' Results: http://tinyurl.com/2ty http://tr.im/Ig5f http://is.gd/5wmJ1 http://tr.im/Ig5p
Easy conversion for seconds and bytes to something more human readable
require 'splib' Splib.load :Conversions puts Splib.format_seconds 9999999 puts Splib.format_size 9999999999 Results: 3 months 3 weeks 1 day 17 hours 46 minutes 39 seconds 9.31 Gigabytes
Adding a bit of safety and ease of use to exec
require 'splib' Splib.load :Exec begin Splib.exec('echo test', 10, 1) rescue IOError puts 'Exceeded allowed number of returned bytes' end begin Splib.exec('while [ true ]; do true; done;', 1) rescue Timeout::Error puts 'Exceeded allowed running time' end puts Splib.exec('echo "hello world"') Results: Exceeded allowed number of returned bytes Exceeded allowed running time hello world
Find constants easily, especially within loaded modules
require 'splib' Splib.load :Constants mod = Module.new mod.class_eval(" module Fu class Bar end end" ) p Splib.find_const('String') fb = Splib.find_const('Fu::Bar', [mod]).new p fb p Splib.type_of?(fb, 'Fu::Bar') Results: String #<#<Module:0x95f2fd0>::Fu::Bar:0x95f287c> true
Add some logic to item queueing
require 'splib' Splib.load :PriorityQueue queue = Splib::PriorityQueue.new{|s| s == :last } queue.push(:last, 'last') 2.times{ queue.push(:slot1, 'test') } 2.times{ queue.push(:slot2, 'fubar') } until(queue.empty?) puts queue.pop end Results: test fubar test fubar last
Need to know if your float is within a delta?
require 'splib' Splib.load :Float p 4.21.within_delta?(:expected => 4.30, :delta => 0.1) => true
Annoyed that your monitor is generating thread owner errors? This simple monitor does its best to ensure your threads stay where they are supposed.
require 'splib' Splib.load :Monitor output = [] go = false monitor = Splib::Monitor.new t = Thread.new{ monitor.wait_until{go}; output << :foo} Thread.new{ monitor.wait_while{!go}; output << :bar} Thread.new{ monitor.wait; output << :foobar } Thread.pass monitor.broadcast t.wakeup Thread.pass p output go = true monitor.signal Thread.pass p output Thread.pass monitor.broadcast Thread.pass p output Results: [:foobar] [:foobar, :foo] [:foobar, :foo, :bar]
The monitor also provides simple wait timers. See the following code:
require 'splib' Splib.load :Monitor monitor = Splib::Monitor.new a = Queue.new 5.times{ Thread.new{ monitor.wait(0.1); a << 1; } } sleep(0.2) puts "Size: #{a.size}"
Here we have five threads waiting with a timeout. Nicely, the monitor only uses a single thread for timing, instead of generating a new thread for each timeout.
Make getting an actual amount of sleeping a bit easier:
require 'splib' Splib.load :Sleep puts Kernel.sleep(0.01) puts Splib.sleep(0.01) => 0 0.00228595733642578
Easily reload code into a module:
First, assume that file.rb starts out with the following contents:
class Foo def test puts 'Test' end end
Then, after the Splib.load_code call, we modify the file to contain:
class Foo def untest puts 'UnTest' end end
Okay, now we proceed:
require 'splib' Splib.load :CodeReloader, :Constants mod = Splib.load_code('file.rb') foo = Splib.find_const('Foo', [mod]).new p foo.respond_to?(:test) puts foo.test mod = Splib.reload_code(mod) foo = Splib.find_const('Foo', [mod]).new p foo.respond_to?(:test) p foo.respond_to?(:untest) puts foo.untest => true Test false true UnTest
If you find any bugs, please report them through github. If you are in need of any help, you can generally find me on DALnet and Freenode.
Spox Library is licensed under the MIT License Copyright (c) 2009 spox <spox@modspox.com>