domingo, 9 de janeiro de 2011

RSpec+Mongo+DatabaseCleaner

0

A algum tempo atrás escrevi sobre RSpec e MongoDB a versão que usei o database cleaner na época era a 0.5.2, a algum tempo atraz saiu a versão 0.6.0, e eu ainda não havia testado, bom as alterações são simples, a principal é que o orm deve vir primeiro, veja abaixo como ficaria o spec_helper.rb

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.orm = :mongoid
    DatabaseCleaner.strategy = :truncation    
    DatabaseCleaner.clean_with(:truncation)
  end  
  config.before(:each) do  
    DatabaseCleaner.start
  end
  config.after(:each) do  
    DatabaseCleaner.clean
  end
end

também foi alterado para o before, iniciar o Cleaner, e o after para limpar. :D

Read more

terça-feira, 28 de dezembro de 2010

Ruby on Rails + JasperReports (IReport)

0

Atualmente aqui na Serhmática, usávamos um sistema interno, uma aplicação "Cobaia" feita em Swing para gerencia de projetos, estávamos a algum tempo estudando o desenvolvimento de uma nova ferramenta WEB, onde nossos clientes pudessem acessar, diminuindo o fluxo de email, e tornando o contato com o cliente mais transparente. Como estamos com muito tempo de sobra, não conseguimos progredir com a aplicação, e procuramos uma solução que pudesse nos atender, eis que encontramos o Redmine, uma aplicação escrita em Ruby on Rails, nossa intenção inicial, era rodar no Glassfish que já tinhamos configurado, porém houve inconsistências, BUGS não explicados pela internet, e partimos a rodar via Mongrel mesmo.

Testamos e gostamos da ferramenta, ainda não está pública para os clientes, mas aos poucos vamos liberando, surgiu um outro problema, precisávamos de alguns relatórios no nosso estilo, que pudesse ser encaminhado aos clientes, a primeira coisa que pensei foi FODEU.


Pesquisei na net e cheguei até um blog brazuca, que tinha um projeto parecido com o que eu queria, testei os códigos desse cara, infelizmente ele não lista os jars que vc precisa, mas vou listar aqui:

  • commons-beanutils
  • commons-collections
  • commons-digester
  • commons-logging
  • commons-logging-api
  • iText
  • jasperreports
  • postgresql


 e tive o primeiro sucesso, e veio o primeiro problema, precisava parametrizar as buscas, não como no modelo do cara, dai resolvi fazer diferente:

1) Criar no relatorio_controller uma action e mapeei ela no routes.rb
2) Criei a tela com form_tag e adicionei os parametros
3) no retorno da action fiz a busca e mandei pro relatório.

Eis que vem o primeiro erro, o JasperReports não conseguiu processar o modelo do Ruby.
Matutei uma solução e encontrei, criei um projeto bem simples, coloquei uma classe la dentro, e adicionei os campos, no IReport criei o relatório com base naqueles campos. A classe ficou mais ou menos como a classe abaixo:

public class Relatorio{
  private Integer issue_id;
  private String issue_subject;
  private String issue_description;
}
criei assim mesmo fora do padrão com os underlines (_) para ser mais facil pro ruby reconhecer.
depois da busca efetuada, percorri o resultado e fui criando novos objetos desse relatorio, passei esse objeto para o model Relatorio e no final converti o Ruby Array em um ArrayList e depois em um JRBeanCollection

@dataSource = JRBeanCollectionDataSource.new(ArrayList.new(dados))

editei tbm o metodo to_pdf e ficou assim:
def to_pdf
    fill = JasperFillManager.fill_report(@modelo, @params, @dataSource)
    pdf = JasperExportManager.export_report_to_pdf(fill)
    return String.from_java_bytes(pdf)
end

e pronto, agora estou com o Redmine rodando no mongrel e gerando relatório em PDF com o JasperReports.

Em tempo: Criei um jasper.rb na pasta config/initializers, ele carrega as libs ao invés de deixar no model.

Tbm alterei os observers e os fiz rodar em um Thread a demora do servidor de email pra responder causava lentidão no sistema, por exemplo o MessageOberver

class MessageObserver < ActiveRecord::Observer
  def after_create(message)
    t = java.lang.Thread.new do
      Mailer.deliver_message_posted(message) if Setting.notified_events.include
    end
    t.start
  end
end

Espero que isso seja util pra mais alguém, qualquer dúvida comenta ai que vejo se posso ajudar.

Read more

quarta-feira, 15 de dezembro de 2010

Days of week in ruby

0

Em português

I don't know why, nobody need it, I searched at the web, and I'm not found a solution for this, by the way, I implement my own solution.

You can see some explain about the method here (in Pt-Br): http://www.arlindo-correia.com/140101.html
But, I converted the javascript code at http://www.profcardy.com/calculadoras/aplicativos.php?calc=4 to ruby

the result is this monkey patch

class Time
  DAYS_OF_WEEK = [
    :saturday, :sunday, :monday, :tuesday, :wednesday, :thursday, :friday
  ]
  def day_of_week
    day = self.day
    month = self.month
    year = self.year
    if month == 1
      month = 13
      year -= 1
    end
    if month == 2
      month = 14
      year -= 1
    end
    phase1 = ((month + 1)*3)/5
    phase2 = (year/4)
    phase3 = (year/100)
    phase4 = (year/400)
    phase5 = day + (month*2)+phase1+year+phase2-phase3+phase4+2
    phase6 = phase5/7
    result = phase5-(phase6*7)
    DAYS_OF_WEEK[result]
  end
end

and some result by irb (I've used the rails console)
irb(main):001:0> t = Time.now
=> Wed Dec 15 22:05:00 -0200 2010
irb(main):002:0> t.day_of_week
=> :wednesday
irb(main):003:0> t.prev_month.day_of_week
=> :monday

If somebody know another way to do it, I'm listening

Read more

Dias da Semana no Ruby

0

Não sei por que ninguem nunca precisou isso no ruby, sei la, procurei na net e não encontrei nada resolvi implementar minha propria solução.

A documentação teorica está aqui: http://www.arlindo-correia.com/140101.html
Porém pra fazer a conversão, converti o codigo desse site http://www.profcardy.com/calculadoras/aplicativos.php?calc=4 do javascript para o ruby

o resultado foi esse monkey patch

class Time
  DAYS_OF_WEEK = [
    :saturday, :sunday, :monday, :tuesday, :wednesday, :thursday, :friday
  ]
  def day_of_week
    day = self.day
    month = self.month
    year = self.year
    if month == 1
      month = 13
      year -= 1
    end
    if month == 2
      month = 14
      year -= 1
    end
    phase1 = ((month + 1)*3)/5
    phase2 = (year/4)
    phase3 = (year/100)
    phase4 = (year/400)
    phase5 = day + (month*2)+phase1+year+phase2-phase3+phase4+2
    phase6 = phase5/7
    result = phase5-(phase6*7)
    DAYS_OF_WEEK[result]
  end
end

E os testes usando irb (na verdade usei o console do rails)
irb(main):001:0> t = Time.now
=> Wed Dec 15 22:05:00 -0200 2010
irb(main):002:0> t.day_of_week
=> :wednesday
irb(main):003:0> t.prev_month.day_of_week
=> :monday

Se alguem souber como recuperar o dia da semana sem o path me avisa ehhee.

Read more

quarta-feira, 8 de dezembro de 2010

Modelos sem tabelas no rails

0

Bah, esse me surgiu esses tempos, e resolvi fazer alguns testes, eu armazeno um objeto em uma sessão com o rails, mas eu não tinha intenção de armazenar essa bagaça na base, somente em memória. sem ideias fui eu pela internet buscar como fazer isso. O Rails 3 modularizou boa parte do rails, um refactoring grande, mas que facilitou muita coisa, como o teste abaixo, por exemplo:

class Person
  attr_accessor :name, :age
end

Ta tio, e se quiser usar as validações e outras coisas do rails? vou ter que fazer tudo no braço? Bom é claro que não né, que puta perca de tempo isso. Veja a adaptação abaixo:

class Person
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :name, :age
  validates :name, :age, :presence => true

  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end  
  
  def persisted?
    false
  end
end

vejam só que maravilha, agora vc pode fazer coisas como essas (irb):

p = Person.new
=> #
p.valid?
=> false
p.errors
=> #["translation missing: br, activemodel, errors, models, person, attributes, age, blank"], :name=>["translation missing: br, activemodel, errors, models, person, attributes, name, blank"]}>

Ooops, falta as traduções, mas isso é dever de casa né ashudahushud.

Read more

quinta-feira, 18 de novembro de 2010

Formulas Matemáticas Em Java

0

Quem nunca precisou usar alguma formula matemática em Java, para efetuar alguma operação?

Existem alguns casos que o usuário quer definir a formula do calculo. Muitas vezes isso é uma comodidade para ele, e um PARTO para os desenvolvedores, algumas metodologias ou bibliotecas resolvem o problema, porém você tem que implementar algo, sempre tem algum ajuste. Precisei usar o Metodo Price em um calculo financeiro, a formula não é complexa, mas como toda a formula matemática, deve se ter cuidado com os parênteses. Eu pensei em fazer algo mais braçal, mas como um bom preguiçoso, resolvi gastar um certo tempo pesquisando algumas maneiras de fazer isso, eis que me surge uma luz no fim do túnel, o Bean Scripting Framework. Linguagens de script são mais flexíveis nesse aspecto que em Java, muitas vezes temos que fazer em alguns casos contornos maiores, como usamos Java 6 para desenvolver, que tem suporte ao ScriptEngine, tudo flui mais fácil, se você usa alguma versão mais antiga, por favor faça um upgrade urgente, quem está perdendo é você.

PS: As bibliotecas são referenciadas via maven, se for usar ANT ou qualquer outra coisa, tem que procurar no Google.

vamos precisar de duas simples bibliotecas o projeto o Bean Scripting Framework (BSF -> bsf:bsf) e o groovy (org.codehaus.groovy:groovy) (você pode usar Jython, JRuby, e qualquer outra coisa que queira), vou usar uma formula simples inventada por mim: x ** 2 + 10

auhsduhahsduas, chega a ser ridículo, mas depois muda isso ai pra testar (o operador ** no groovy representa potenciação)

Olha a trabalheira:

String formula = "x ** 2 + 10";
BSFManager manager = new BSFManager();
manager.declareBean("x", "10", Integer.class);
Double result = (Double) manager.eval("groovy", "myScript.groovy", 0, 0, formula);

Eu fiz um cast pra Double, mas o retorno é um object, pode retornar qualquer coisa.
Mas fácil que isso só dois disso heheh.

Read more

terça-feira, 9 de novembro de 2010

Haml+Rails

2

Haml é uma linguagem de marcação, para renderizar templates HTML, baseada em tags e identação. Sempre gostei muito de usar o HAML nas minhas aplicações Rails 2, pela simplicidade e facilidade na criação. Você se acostuma a identar ao invés de procurar aonde a tag deve ser fechada. O Rails 3 foi modularizado para facilitar a customização. Porém a gem haml, responsável por renderizar os arquivos HAML, não possui generators embutidos para o Rails, procurando na internet encontrei o projeto rails3_haml_scaffold_generator que faz exatamente isso, mas vc precisa executar alguns passos, e eu odeio coisas repetitivas, a primeira coisa que pensei foi procurar se havia alguma gem parecida, e não encontrei.

Resolvi arregaçar as mangas, e fiz minha primeira gem, no caso eu simplesmente movi para o diretório os arquivos como se fossem um gem, e ajustei os diretórios com a ajuda do Jeweller.

O uso dessa gem é bem simples, ela nem tem reação com a gem haml, pois ela consiste somente nos generators.

Adicione ao seu Gemfile as seguintes linhas

gem haml
gem haml_rails

use o bundle install ou uso o gem install para instala-las.

depois só executar o comando

rails g haml_rails:install

ele vai editar seu application.rb e adicionar o haml como seu template engine. vc pode apagar caso prefira usar o ERB.

Por enquanto é isso..

Read more

 
Design by ThemeShift | Bloggerized by Lasantha - Free Blogger Templates | Best Web Hosting