class Rantly
Constants
- INTEGER_MAX
wanna avoid going into Bignum when calling range with these.
- INTEGER_MIN
Attributes
default_size[W]
classifiers[RW]
Public Class Methods
default_size()
click to toggle source
# File lib/rantly/generator.rb, line 10 def default_size @default_size || 6 end
each(n,limit=10,&block)
click to toggle source
# File lib/rantly/generator.rb, line 14 def each(n,limit=10,&block) gen.each(n,limit,&block) end
gen()
click to toggle source
# File lib/rantly/generator.rb, line 26 def gen self.singleton end
map(n,limit=10,&block)
click to toggle source
# File lib/rantly/generator.rb, line 18 def map(n,limit=10,&block) gen.map(n,limit,&block) end
new()
click to toggle source
# File lib/rantly/generator.rb, line 89 def initialize reset end
singleton()
click to toggle source
# File lib/rantly/generator.rb, line 5 def singleton @singleton ||= Rantly.new @singleton end
value(limit=10,&block)
click to toggle source
# File lib/rantly/generator.rb, line 22 def value(limit=10,&block) gen.value(limit,&block) end
Public Instance Methods
array(n=self.size,&block)
click to toggle source
# File lib/rantly/generator.rb, line 210 def array(n=self.size,&block) n.times.map { self.instance_eval(&block) } end
boolean()
click to toggle source
# File lib/rantly/generator.rb, line 180 def boolean range(0,1) == 0 ? true : false end
branch(*gens)
click to toggle source
# File lib/rantly/generator.rb, line 168 def branch(*gens) self.call(choose(*gens)) end
call(gen,*args)
click to toggle source
# File lib/rantly/generator.rb, line 154 def call(gen,*args) case gen when Symbol return self.send(gen,*args) when Array raise "empty array" if gen.empty? return self.send(gen[0],*gen[1..-1]) when Proc return self.instance_eval(&gen) else raise "don't know how to call type: #{gen}" end end
choose(*vals)
click to toggle source
# File lib/rantly/generator.rb, line 172 def choose(*vals) vals[range(0,vals.length-1)] end
classify(classifier)
click to toggle source
# File lib/rantly/generator.rb, line 98 def classify(classifier) @classifiers[classifier] += 1 end
dict(n=self.size,&block)
click to toggle source
# File lib/rantly/generator.rb, line 214 def dict(n=self.size,&block) h = {} each(n) do k,v = instance_eval(&block) h[k] = v if guard(!h.has_key?(k)) end h end
each(n,limit=10,&block)
click to toggle source
limit attempts to 10 times of how many things we want to generate
# File lib/rantly/generator.rb, line 50 def each(n,limit=10,&block) generate(n,limit,block) end
float()
click to toggle source
# File lib/rantly/generator.rb, line 144 def float rand end
freq(*pairs)
click to toggle source
# File lib/rantly/generator.rb, line 184 def freq(*pairs) pairs = pairs.map do |pair| case pair when Symbol, String, Proc [1,pair] when Array unless pair.first.is_a?(Integer) [1] + pair else pair end end end total = pairs.inject(0) { |sum,p| sum + p.first } raise(RuntimeError, "Illegal frequency:#{pairs.inspect}") if total == 0 pos = range(1,total) pairs.each do |p| weight, gen, *args = p if pos <= p[0] return self.call(gen,*args) else pos -= weight end end end
generate(n,limit_arg,gen_block,&handler)
click to toggle source
# File lib/rantly/generator.rb, line 68 def generate(n,limit_arg,gen_block,&handler) limit = n * limit_arg nfailed = 0 nsuccess = 0 while nsuccess < n raise TooManyTries.new(limit_arg*n,nfailed) if limit < 0 begin val = self.instance_eval(&gen_block) rescue GuardFailure nfailed += 1 limit -= 1 next end nsuccess += 1 limit -= 1 handler.call(val) if handler end end
guard(test)
click to toggle source
# File lib/rantly/generator.rb, line 102 def guard(test) unless test raise GuardFailure.new else true end end
integer(limit=nil)
click to toggle source
# File lib/rantly/generator.rb, line 126 def integer(limit=nil) case limit when Range hi = limit.end lo = limit.begin when Integer raise "n should be greater than zero" if limit < 0 hi, lo = limit, -limit else hi, lo = INTEGER_MAX, INTEGER_MIN end range(lo,hi) end
literal(value)
click to toggle source
# File lib/rantly/generator.rb, line 176 def literal(value) value end
map(n,limit=10,&block)
click to toggle source
# File lib/rantly/generator.rb, line 54 def map(n,limit=10,&block) acc = [] generate(n,limit,block) do |val| acc << val end acc end
positive_integer()
click to toggle source
# File lib/rantly/generator.rb, line 140 def positive_integer range(0) end
range(lo=nil,hi=nil)
click to toggle source
# File lib/rantly/generator.rb, line 148 def range(lo=nil,hi=nil) lo ||= INTEGER_MIN hi ||= INTEGER_MAX rand(hi+1-lo) + lo end
reset()
click to toggle source
# File lib/rantly/generator.rb, line 93 def reset @size = nil @classifiers = Hash.new(0) end
size()
click to toggle source
# File lib/rantly/generator.rb, line 110 def size @size || Rantly.default_size end
sized(n,&block)
click to toggle source
# File lib/rantly/generator.rb, line 114 def sized(n,&block) raise "size needs to be greater than zero" if n < 0 old_size = @size @size = n r = self.instance_eval(&block) @size = old_size return r end
string(char_class=:print)
click to toggle source
# File lib/rantly/generator.rb, line 266 def string(char_class=:print) chars = case char_class when Regexp Chars.of(char_class) when Symbol Chars::CLASSES[char_class] end raise "bad arg" unless chars char_strings = chars.map { |c| c.chr } str = Array.new(size) current_index = 0 while current_index < size str[current_index] = char_strings.sample current_index += 1 end str.join end
value(limit=10,&block)
click to toggle source
# File lib/rantly/generator.rb, line 62 def value(limit=10,&block) generate(1,limit,block) do |val| return val end end