Problemas com o RedCloth

Usando o helper textilize notei que ele estava tendo um comportamento estranho quando o texto tinha quebras de linha.

Fuçando no wiki descobri que a versão 3.0.4 da gem RedCloth, utilizada pelo helper, tem um bug que não identifica corretamente as quebras de linha como parágrafos.

Como solução, é indicado o downgrade/atualização para as versões 3.0.3 ou 4.0 da gem (ainda em desenvolvimento) ou a utilização do patch abaixo no environment.rb.

class RedCloth
  # Patch for RedCloth.  Fixed in RedCloth r128 but _why hasn't released it yet.
  # http://code.whytheluckystiff.net/redcloth/changeset/128
  def hard_break( text )
    text.gsub!( /(.)\n(?!\n|\Z| *([#*=]+(\s|$)|[{|]))/, "\\1" ) if hard_breaks
  end
end

Usando o Castle ActiveRecord

O Castle ActiveRecord é uma implementação do pattern Active Record desenvolvido em .NET em cima do NHibernate.

Ele faz parte do pacote de frameworks do projeto Castle Projet, e tem forte influencia da implementação do Active Record do framework Ruby On Rails.

Entre as muitas características dele vale destacar, a possibilidade de mapeamento de classes via atributos e não dos famigerados arquivos xml e um mecanismo de validação eficiente e flexível.

Continue reading →

Automatic Properties

No post anterior acabei usando um recurso disponível no C# 3.0 que ficou sem explicação.

O Automatic Properties.

public class Pessoa {
  public string Nome { get; set; }
  public string Email { get; set; }
}

Agora ao encontrar a declaração { get; set; }, o compilador gera automaticamente a variável privada e a implementação necessária para a propriedade.

Também é possível declarar uma propriedade como somente leitura usando o accessor private.

public class Pessoa {
  public int Id { get; private set; }
  public string Nome { get; set; }
  public string Email { get; set; }
}

E caso você precise usar atributos é necessário fazer a declaração da propriedade do modo tradicional.

Object e Collection Initializers

Mais uma novidade do C# 3.0 é a nova sintaxe para a inicialização de objetos e coleções.

Object Initializers

Agora podemos ao instanciar um objeto passar valores para as suas propriedades.

public class Pessoa {
  public string Nome { get; set; }
  public string Email { get; set; }
} 

Pessoa joao = new Pessoa() { Nome = "João", Email = "joao@gmail.com" };
Pessoa maria = new Pessoa() { Nome = "Maria", Email = "maria@gmail.com" };

No exemplo acima, são instanciados dois objetos do tipo Pessoa, chamando o construtor padrão, e em seguida setadas as propriedades Nome e Email.

Tudo em uma única linha de código.

Também é possível passar parâmetros para o construtor, conforme o exemplo a seguir:

public class Pessoa {
  public string Nome { get; set; }
  public string Email { get; set; }
  public int Idade { get; set; }
  public Pessoa(string nome)
  {
    this.Nome = nome;
  }
}
Pessoa pedro = new Pessoa("Pedro") {
  Email = "pedro@gmail.com",
  Idade = 20
};

Collection Initializers

Já nas coleções podemos passar um conjunto de objetos.

No exemplo abaixo a coleção pessoas é instanciada com os objetos joao, maria e pedro como os seus membros.

IList<Pessoa> pessoas = new List<Pessoa>() { joao, maria, pedro }

É aqui uma combinação das duas formas.

IList<Pessoa> pessoas = new List<Pessoa>() {
  joao, maria, pedro,
  new Pessoa() { Nome = "Jose", Email = "jose@gmail.com" }
}

Conclusão

Como vimos nesse segundo post, o C# 3.0 vem trazendo grandes melhorias para a implementação de um código mais legível e bonito.

Muitas dessas melhorias foram influenciadas por dois projetos da Microsoft Research, o F# e o .

Nesse post, Tomas Petricek detalha as novidades incorporadas no C# 3.0 vindas desses dois projetos.

Extension Methods

Umas das novidades do C# 3.0 é a possibilidade de adicionar comportamento a uma classe sem a necessidade da criação de uma subclasse ou da recompilação do código original.

Essa funcionalidade é chamada de Extension Methods.

Criando um Extension Method

Imagine que você precisa validar se uma string é um e-mail válido. A solução mais comum é a definição de um método de validação (estático) em uma classe utilitária (estática).

static class Program
{
  static void Main(string[] args)
  {
    string emailCliente = System.Console.ReadLine();

    if (!Utilidades.IsEmailValido(emailCliente))
      System.Console.WriteLine("E-mail informado inválido.");
  }
}

Usando um Extension Method a solução é parecida, mas a utilização é mais elegante.

if (!emailCliente.IsEmailValido())
  System.Console.WriteLine("E-mail informado inválido.");

A criação do Extension Method se resume a definição de uma classe estática com um método estático.

namespace Utilidades
  public static class Extensoes
  {
    public static bool IsEmailValido(this string email)
    {
      return Regex.IsMatch(email, @"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
    }
  }
}

Notem o keyword this antes da declaração do primeiro parâmetro. Ele é responsável por passar ao compilador que o método IsEmailValido é aplicável a todos os objetos do tipo string.

E para utilizar o extension method basta importar o namespace que contém a classe estática usando o statement using. Sendo que não é necessária a importação caso as classes estejam dentro do mesmo namespace.

using Utilidades;

Passando parâmetros para o Extension Method

namespace Utilidades
  public static class Extensoes
  {
    public static bool IsMaiorQue(this string s, int tamanho)
    {
      return s.Length > tamanho;
    }
  }
}

string nome = "Joao da Silva";

if (nome.IsMaiorQue(10))
  System.Console.WriteLn("Nome só pode ter 10 caracteres");

Com essa introdução dá para ter uma pequena idéia das possibilidades. Vale lembrar que também é possível criar extension methods para interfaces e generics.

Abaixo três boas referências que valem à pena dar uma lida.

Um pouco de mágica

A minha idéia inicial era botar em prática o que tinha visto no screencast do Fábio Akita sobre o plugin resource_controller. Mas já que estava fazendo um dry up no código dos controles fiquei pensando se não conseguia fazer fazer o mesmo com os modelos usando a gem Magic Models do Dr Nic’s.

“A gem Magic Models estende o ActiveRecord permitindo que ele consiga gerar os relacionamentos (belongs e has_many) e validações (presence, length, numericality, inclusion e uniqueless) dos modelos automáticamente a partir da estrutura da base de dados.”

Você pode ver o código no Pastie ou baixar o projeto.

NetBeans interface language

Por padrão o NetBeans usa a linguagem definida no Windows como a padrão para a sua interface.

Uso o Windows XP Professional English com a localidade e configurações regionais definidas para as brasileiras mas a interface do NetBeans sempre ficou em inglês.

Mas depois de ter atualizado ele ontem algumas opções começaram a aparecer em português. De menus até a estrutura do projeto Rails na aba Projects.

Como prefiro a IDE em inglês isso começou a me irritar. Por sorte a solução é bem simples.

Basta editar o arquivo “netbeans.conf”, por padrão em C:\Program Files\NetBeans 6.0.1\etc, e na opção “netbeans_default_options” adicionar ao final da string os parâmetros abaixo:

-J-Duser.language=en -J-Duser.region=US

Referência: http://blogs.sun.com/tao/entry/set_netbeans_user_interface_language

Brincando com o TinyRails

Assim que o Fabio Akita postou sobre o TinyRails fui testar o código. E claro que quebrei a cara já que o thin ainda não roda no Windows.

Como queria testar a idéia e estava com preguiça de instalar o Ubuntu em uma máquina virtual acabei reescrevendo um pedaço do código e mudando do thin para a dupla Mongrel / WEBrick.

Aproveitei o embalo e montei um “SQLite3 resource scaffold”.

Como ainda não configurei direito o Wordpress para postagem de código, coloquei os scripts no Pastie.

http://pastie.caboo.se/155367

UPDATE: Onde tudo começou: Single file Rails Application