Para los que hablan Ruby (era Re: Syntax highlighting:)

Aldrin Martoq amartoq en dcc.uchile.cl
Vie Mayo 7 21:58:44 CLT 2010


On May 7, 2010, at 4:47 PM, Alvaro Herrera wrote:
> Yo estoy recién empezando a usar Sup desde hace un par de días ...
> ahora tratando de enseñarme un poco de Ruby para hacer hooks decentes.
> Por el momento tengo la siguiente pregunta:
> simple_rules = [
>        { "address" => "@lists.debian.org",             "label" => 'debian' },
>        { "address" => "linux en listas.inf.utfsm.cl",     "label" => 'linux' },
>        { "address" => "pgsql-committers en postgresql.org","label" => 'pg-commiters' },
>        { "address" => "pgsql-hackers en postgresql.org",  "label" => 'pg-hackers' },
>        { "address" => "pgsql-general en postgresql.org",  "label" => 'pg-general' }
> ]       
> message.recipients.each { |rcpt|
>        simple_rules.each { |rule|
>                if rcpt =~ /#{rule["address"]}/
>                        message.add_label rule["label"]
>                        break
>                end     
>        }
> }
> ¿Alguien sabe cómo hacer eso de una forma un poco más elegante?  La verdad
> es que no me gusta mucho que simple_rules tenga que llevar el nombre de las
> etiquetas del hash en cada línea.
> En realidad me gustaría hacer algo así:
> simple_rules.each { |address, label|
> 	if rcpt =~ /#{address}/
> 		message.add_label label
> 		break
> 	end
> }
> 
> Pero no consigo ubicar cómo debo definir simple_rules para que esto funcione.
> ¿Ideas?


No soy experto en ruby, pero hasta donde ví algo mas simple podría ser:

--ini-----
simple_rules = {}
simple_rules["@lists.debian.org"] = "debian"
simple_rules["linux en listas.inf.utfsm.cl"] = "linux"

simple_rules.each { |k, v|
    puts k + " => " + v
}
-----fin--



Lo cual es horrible.. yo lo haría con YAML. Ejemplo:

--ini-----
require 'yaml'
rules = <<-reglas

@lists.debian.org               : debian
linux en listas.inf.utfsm          : linux
pgsql-committers en postgresql.org : pg-commiters

reglas

simple_rules = YAML::load(rules)

simple_rules.each { |k, v|
    puts "YAML: " + k + " => " + v
}
-----fin--

Tampoco es bonito, pero es mas facil escribir las reglas o mejor déjalas en un archivo aparte.

Lo bonito de YAML es que puedes describir cosas muy complejas de manera muy sencilla; lo malo es que ninguna implementación es UTF-8 lo cual es bastante idiota y me hizo volver a XML para un sistema... estos gringos. Por ejemplo:

--ini-----
require 'yaml'
rules = <<-XXX
@lists.debian.org:
  label: debian
linux en listas.inf.utfsm:
  label: linux
  listanegra:
    Aldrin Martoq amartoq en dcc.uchile.cl
    Álvaro Herrera alvherre en alvh.no-ip.org
pgsql-committers en postgresql.org:
  label: pg-commiters
XXX

simple_rules = YAML::load(rules)

puts simple_rules.to_yaml

simple_rules.each { |k, v|
    puts "YAML: " + k + " => " + v.to_s
}
-----fin--



Aldrin Martoq
http://aldrin.martoq.cl/





Más información sobre la lista de distribución Linux