DSL em Ruby

Senhores,

Criei uma pequena DSL em Ruby para lidar com eventos que acontecem com determinada frequencia.

Coloquei no github e é possivel instalar via gem (frequency-dsl)

[code] require 'rubygems’
require ‘frequency’

    include Frequency

    sometimes do
      puts "sometimes you can see this times, sometimes not"
    end

    never do
      puts "this line never will be print"
    end

    rarely :with_probability => 0.01 do
      puts "ok, its very rare... 1% of chance"
    end

    normally :with_probability => '24%' do
      puts "you can use strings instead float numbers"
    end

    always do
      puts "bye"
    end[/code]

É bem simples, always e never são bem claros até certo ponto mas quero documentar melhor.

sometimes, normally e rarely executam o bloco de codigo passado com 50%, 75% e 25% de chance (valores que podem ser alterados)

Imagino que um dos usos pode ser uma aplicação que em dada configuração pode fazer sempre, nunca ou com determinada probabilidade.

Fiz para exercitar a criação de gems e para brincar mesmo, ficou bacana e legivel.

Sugestões?

Para que serve ? :oops:

Boa pergunta.

Imagina que vc quer fazer algo com uma dada porcentagem de chance, tipo 10%

Onde vc gostaria de fazer isso… imagine que vc quer testar uma nova funcionalidade mas vc não quer que todo mundo seja beta-tester, apenas 10% da galera (que é um numero arbitrario). Baseado no feedback desses 10% vc pode decidir por habilitar isso pra todo mundo ou não.

Seria algo como

[code]sometimes :with_probability => ‘10%’ do

meu codigo

end[/code]

Pensei em usar de forma que vc leia de um arquivo de configuração se determinadas funcionalidades devem ser sempre (always), nunca (never) ou raramente (rarely).

Normalmente a gente faz o que quando precisa fazer isso?

[code]if Kernel.rand() < 0.50 then

meu codigo

end[/code]

Porem este código não é semantico o suficiente se vc não tiver uma base adequada de matematica (e saber como o Kernel.rand() funciona, o que retorna, et). Isto

[code]maybe do

codigo

end[/code]

É um pouco mais legivel. O objetivo das DSLs é diminuir o ruido no código de forma que vc leia e seja mais proximo de uma linguagem natural – o rails, o rspec e outros frameworks como o Sinatra abusam de DSLs.

Eu acho que o fabiokung uma vez mostrou uma DSL em Ruby para vc gerar html, semelhante a mostrada aqui:
/manifestonaweb.wordpress.com/2009/05/26/o-estado-da-arte-da-dsl-em-ruby/

Ideia legal peczenyj!

Clonei seu repositório e coloquei em um gist uma outra versão da sua DSL, com algumas sugestões. Os specs ainda estão passando. :wink:

Uma dica para deixar o output do seus specs mais legíveis é colocar um arquivo spec.opts dentro do diretório spec com opcoes para o formato do output. Eu gosto de deixar o meu assim:

--color
--format specdoc