jueves, 29 de noviembre de 2012

Llenando una encuesta en google docs

Este es un script en ruby para llenar encuestas de opcion unica o multiple, usando la gema mechanize.
require 'mechanize'
def rand_array tam # array random de 0 y 1
num = Proc.new{ rand(100)%2 }
ans = Array.new(tam, &num)
end
100.times do # submit 100 encuestas
agent = Mechanize.new
page = agent.get "http://goo.gl/pJjx6" # Encuesta en google docs
############## Checkboxes y Radiobuttons ########
check_names = page.form.checkboxes.collect{ |c| c.name}.uniq
check_names.each do |name|
boxes = page.form.checkboxes_with(name) # opciones de una preg
numbers = rand_array boxes.length
numbers.each_with_index{|i, index| boxes[index].check if i==1 }# marcando, opcion multiple
end
radio_names = page.form.radiobuttons.collect{ |r| r.name}.uniq
radio_names.each do |name|
radios = page.form.radiobuttons_with(name) # opciones de una preg
number = rand radios.length
page.form.radiobuttons_with(name)[number].check # marcando, opcion unica
end
#################################################
page.form.click_button # submit encuesta
agent = nil
end
view raw filling_poll.rb hosted with ❤ by GitHub

lunes, 5 de marzo de 2012

Kata String Calculator

Tdd kata usando ruby y rspec

Specs en osherove.com/tdd-kata-1

require "sum"
require "spec_helper.rb" # rspec -i
describe 'suma' do
before(:each) do
@sum = Sum.new # Para no hacer sum = Sum.new en cada spec
end
it 'Sumar cadena vacia' do
@sum.add("").should eq(0)
end
it 'Sumar un numero' do
@sum.add("2").should eq(2)
end
it 'Sumar dos numeros' do
@sum.add("2,3").should eq(5)
end
it 'Sumar varios numeros caso 1' do
@sum.add("2,3,5").should == 10
end
it 'Sumar varios numeros caso 1' do
@sum.add("0,3,5,8,1").should == 17
end
it 'Sumar varios numeros caso 3 con delimitador "\n" ' do
@sum.add('1,3\n4,1').should == 9
end
it 'Sumar varios numeros con un diferente delimitador' do
@sum.add('//;\n2;3;5').should == 10
end
it 'Sumar numeros negativos' do
@sum.add('//;\n2;1;-3;-5').should == "negatives not allowed -3 -5"
end
it 'Ignorar numeros > 1000' do
@sum.add('//;\n2;1000;1;2').should == 1005
end
it 'Ignorar numeros > 1000' do
@sum.add('//;\n2;1001;1;2').should == 5
end
it 'Un delimitador con varios caracteres' do
@sum.add('//[***]\n1***2***3').should == 6
end
it 'Muchos delimitadores de un caracter' do
@sum.add('//[*][^]\n1*2^3').should == 6
end
it 'Muchos delimitadores con varios caracteres' do
@sum.add('//[*(*][^)^]\n1*(*2^)^3').should == 6
end
end
view raw add_spec.rb hosted with ❤ by GitHub
class Sum
def add x
del = getDelimitador (x)
suma = 0
#num = x.gsub('\n',del).split(del)
num = mySplit( del, x)
msj = error_message(num)
if (msj != "")
return msj
end
num.each do |n|
suma += n.to_i unless n.to_i > 1000
puts n
end
suma
end
def mySplit( del, x)
temp = ','
#x.gsub!('\n', temp)
del << '\n'
del.each do |d|
x.gsub!(d, temp)
end
x.split(temp)
end
def getDelimitador cadena
del = [',']
if cadena.size > 2 && ( cadena[0..1] == "//")
del << cadena[2]
abierto, cerrado = cadena.index('['), cadena.index(']')
while abierto != nil && cerrado != nil
del << cadena[(abierto + 1)..(cerrado - 1)]
cadena[abierto..cerrado] = ""
abierto, cerrado = cadena.index('['), cadena.index(']')
end
end
del
end
def error_message num
message1 , message2 = "negatives not allowed", ""
num.each do |n|
if n.to_i < 0
message2 = message2 + " " + n
end
end
if message2 != ""
return message1 + message2
end
""
end
end
view raw sum.rb hosted with ❤ by GitHub