Vamos criar essa Gem!

Como criar sua Gem - passo a passo

Caio Ergos
Red Academy Journal

--

Com certeza todo Rubista já utilizou uma gem alguma vez em sua vida. Seja para lidar com a autenticação de seu sistema até para rodar tarefas de forma assíncrona. Gems são bibliotecas de código Ruby feitas para serem “encaixadas” em qualquer projeto.

Algum tempo atrás lidei com um problema de autenticação em um projeto: precisava construir uma API. No entanto a gem que utiliza o Devise para autenticação via token, a Devise Token Auth, simplesmente não estava funcionando com MongoDB.

Algumas soluções bem gambiarrosas apareciam em minhas pesquisas, mas aquilo não me agradava nem um pouco. Foi então que decidi criar minha própria gem focada em autenticação via token para projetos que utilizam Mongoid.

A dificuldade inicial que enfrentei e fontes descentralizadas de informação a respeito me inspiraram a estar escrevendo este post neste exato momento. Vamos começar?

Antes de tudo, você irá precisar do Bundler instalado. Para isso, basta rodar o comando:

gem install bundler

Agora vamos gerar o projeto da gem:

bundle gem mygem

O bundler irá lhe fazer algumas algumas perguntas para realizar a configuração inicial da gem e então criar o diretório e seus arquivos para iniciar o desenvolvimento da sua gem.

Agora, abra o arquivo gem.gemspec e dê uma olhada nele. Neste arquivo você colocará informações como descrição , nome e até dependências da gem, tanto em ambiente de desenvolvimento quanto as dependências de teste.

Seu gemspec deve ser parecido com este

Agora já podemos começar a escrever o código de nossa gem.

Caso você também tenha chamado sua gem de mygem, poderá abrir o arquivo lib/mygem.rb e definir um método dentro do módulo.

Iremos definir um método que embaralha um array qualquer, chamado “scramble”. O código ficará assim:

# lib/mygem.rbrequire “mygem/version”module Mygem  def self.scramble(array)    array.shuffle  endend

Agora precisamos “compilar” nossa gem. Para isso, basta rodarmos o comando:

gem build mygem.gemspec

Este comando irá gerar um arquivo .gem. Caso você não tenha alterado em mais nada no código da gem, ele irá se chamar mygem-0.1.0.gem.

Recomendo retirar os arquivos que serão gerados sempre que você compilar sua gem do seu repositório. Para isso, basta fazer:

echo "*.gem" >> .gitignore

Para instalarmos a nossa gem, basta rodarmos o comando:

gem install mygem-0.1.0.gem

Agora é hora da verdade! Vamos “testar” o que fizemos até agora:

irb2.3.3 :001 > require ‘mygem’=> true2.3.3 :002 > Mygem.scramble([1, 2, 3, 4, 5, 6, 7, 8, 9])=> [6, 2, 9, 3, 1, 7, 5, 4, 8]
Voilá!

Temos a nossa primeira gem! Mas, infelizmente, não está completa. Afinal, não sabemos se ela está se comportando da maneira esperada, não é mesmo? Hora de testar nossa de fato.

Ao criar a gem, o bundler nos pergunta qual suíte de teste desejamos utilizar: RSpec ou minitest.

Caso você tenha escolhido minitest, assim como eu, você terá um arquivo chamado tests/mygem_test.rb. Para testar nosso método, basta verificarmos duas coisas:

  1. Nosso output é diferente de nosso input;
  2. Nosso output possui os mesmos elementos do nosso output.

O arquivo de teste ficará assim:

# test/mygem_test.rb
require “test_helper”
class MygemTest < Minitest::Test def test_that_it_has_a_version_number refute_nil ::Mygem::VERSION end
def test_it_scrambles_arrays array = [1, 2, 3, 4, 5] refute Mygem.scramble(array) == array assert (Mygem.scramble(array) — array) == [] endend

Para realizar os testes, basta rodar o seguinte comando:

rake test

Seu output deverá ser algo assim:

Run options: — seed 32122# Running:..Finished in 0.000993s, 2015.0098 runs/s, 3022.5147 assertions/s.2 runs, 3 assertions, 0 failures, 0 errors, 0 skips

Caso você tenha escolhido a suíte de teste RSpec, seu arquivo de testes será spec/mygem_spec.rb.

O teste poderá ser escrito assim:

# spec/mygem_spec.rb# … códigodescribe “#scramble” do  before :each do    @array = [1, 2, 3, 4, 5]  end
it “should return a scrambled array“ do expect(Mygem.scramble(@array)).not_to eq(@array) expect(Mygem.scramble(@array) — @array).to be_empty endend# … código

Agora que nossa gem está pronta e testada, podemos subí-la para o RubyGems!

Primeiramente, precisamos criar uma conta clicando aqui.

Agora, basta rodar o seguinte comando:

gem push mygem-0.1.0.gem

Você terá de inserir suas credenciais do RubyGems pelo terminal e sua gem será enviada!

PS: Esta é a gem que fizemos aqui na RedRocket para autenticação de usuários utilizando Rails e Mongoid: https://github.com/RedRocket/RedTokenAuth.

PS2: Minha versão do Ruby é 2.3.3, minha versão do Bundler é 2.6.12.

Se você gostou deste artigo, por favor recomende e compartilhe.

--

--