Project

splib

0.0
No commit activity in last 3 years
No release in over 3 years
The spox library contains various useful tools to help you in your day to day life. Like a trusty pocket knife, only more computery.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies
 Project Readme

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>