« HE:labs
HE:labs

Criando uma gem configurável

Postado por Francisco Martins em 28/03/2014

Há alguns meses, vi que a Riot estava trabalhando numa API para o League Of Legends e resolvi criar uma gem que serviria de interface para ela a título de prática.

Eu acabei desanimando em continuar quando vi que a API BR estava um pouco atrás da internacional e encontrei um bug (que não foi corrigido até hoje). Mas independentemente disso, a experiência ficou e eu me prometi fazer um post a respeito.

Criando uma gem

A criação de uma gem é bastante simples e o processo está bem documentado aqui.

Uma dica que falta neste guia é que você pode usar o bundler para criar o esqueleto da gem, o que facilita um pouco.

1 $ bundle gem minha_gem

Adicionando suporte às configurações

Você já deve ter percebido que algumas gems possuem opções de configuração, como:

 1 RSpec.configure do |config|
 2   config.fixture_path = "#{::Rails.root}/spec/fixtures"
 3 end
 4 
 5 Devise.setup do |config|
 6   config.mailer_sender = "please-change-me-at-config-initializers-devise@example.com"
 7 end
 8 
 9 Rollbar.configure do |config|
10   config.access_token = ENV['ROLLBAR_ACCESS_TOKEN']
11 end
12 
13 ActiveSupport.on_load(:active_model_serializers) do
14   ActiveModel::Serializer.root = false
15 end

Tornar sua gem configurável permite que ela seja usada em diferentes projetos de forma customizada e é bastante simples. No caso da RiotClient, cada projeto que a utilizasse precisaria ter sua própria ApiKey e seria muito mais elegante fazer dessa forma do que passar como parâmetro cada vez que a classe fosse instanciada.

O primeiro passo é criar uma classe que representará os dados de cofiguração:

1 module MinhaGem
2     class Configuration
3       attr_accessor :value1, :value2
4     end
5   end

E usar isso no arquivo lib/minha_gem.rb:

 1 module MinhaGem
 2     class << self
 3       attr_accessor :configuration
 4 
 5       def configure
 6         self.configuration ||= Configuration.new
 7         yield(configuration)
 8       end
 9     end
10   end

Dica:

1 class << self
2     def configure
3     end
4   end

é o mesmo que

1 def self.configure
2   end

É valido se você for adicionar vários métodos de classe.

Agora, para usar esse bloco de configuração, por exemplo no Rails, é só criar um arquivo na pasta /config/initializers/minha_gem.rb com o conteúdo:

1 MinhaGem.configure do |config|
2     config.value1 = "foo"
3     config.value2 = "bar"
4   end

Se precisar acessar esses valores por algum motivo em algum lugar da aplicação, é simples:

1 $ MinhaGem.configuration.value1
2   => "foo"
3   $ MinhaGem.configuration.value2
4   => "bar"

Gostou da dica?

Tags: ruby gem

Compartilhe

Sabia que nosso blog agora está no Medium? Confira Aqui!