Spox Library (splib)¶ ↑
The Spox Library is collection of helper methods and classes.
install (easy):¶ ↑
gem install splib
install (less easy):¶ ↑
git clone http://github.com/spox/splib.git cd splib gem build *.gemspec gem install ./
install (less easy that’s a little easier)¶ ↑
rip makes it easy to install directly from a github repository.
Testing¶ ↑
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
Usage¶ ↑
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.
URL Shorteners¶ ↑
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
Conversions¶ ↑
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
Exec¶ ↑
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
Constants¶ ↑
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
PriorityQueue¶ ↑
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
Float¶ ↑
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
Monitor¶ ↑
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.
Sleep¶ ↑
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
CodeReloader¶ ↑
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
Last remarks¶ ↑
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.
License¶ ↑
Spox Library is licensed under the MIT License Copyright (c) 2009 spox <spox@modspox.com>