
O que vamos aprender?
Criar uma GEM pode ser uma maneira muito eficiente de deixar seu projeto organizado, fácil de ser reutilizado em projetos futuros e possivelmente ajudar a comunidade do Rails divulgando o código da sua Gem (A gente agradece 🙂 ).
Neste tutorial, veremos como criar uma Gem com uso prático e também como utilizá-la dentro de um projeto Rails.
Esse Post é a parte 1 de um tutorial de 2 partes.
Primeiramente, aprenderemos a criar uma Gem para traduzir frases exatamente como o Google Translate faz e depois, no tutorial 2, criaremos um site similar ao Google Translate e usaremos a nossa Gem para traduzir as frases enviadas pelos usuários.
Prepare-se para criar um projeto bem interessante que pode agregar bastante em sua maneira de entender o Ruby On Rails!
Todo o código da Gem criada está no GitHub, baixe-o se desejar clicando aqui! (Aproveite e siga-nos por lá 🙂 )
Ingredientes (Parte 1)
- ● Ruby (2.3.1)
- ● Api da Yandex
- ● Rest Client (gem)
- ● Json (gem)
- ● Rspec (gem)
Objetivos do Tutorial (Parte 1)
- ● Criar uma Gem
- ● Criar os Testes para a nossa Gem (Todos os métodos) usando Rspec
- ● Criar um método para identificar o idioma de uma frase
- ● Criar um método para saber quais os idiomas a Api da Yandex conhece
- ● Criar um método para traduzir uma frase para outro idioma que a Api da Yandex conheça
Mãos à Obra!
Gerando e configurando nossa Gem
- Primeiramente, você precisará ter o Ruby instalado. Caso não o tenha, aprenda como instalar usando o RVM clicando aqui.
- Agora instale o Bundle rodando no console:
1gem install bundle - Vamos gerar a nossa Gem rodando no console:
1bundle gem translate_yandex - Ótimo, nossa Gem foi gerada! Observe na imagem abaixo os diretórios que foram gerados:
- Fica como um exercício para você, pesquisar sobre Versionamento de Gems. 🙂
- Agora vamos configurar a nossa Gem no arquivo “translate_yandex.gemspec”, essa configuração vai ficar visível para as pessoas que encontrarem a nossa Gem no https://rubygems.org/ quando fizermos o upload.
-
- Primeiro você precisa configurar essas linhas:
123456789101112#Nome da Gemspec.name = "translate_yandex"#Nome do Autor da Gemspec.authors = ["Leonardo Scorza"]#Email do autor da Gemspec.email = ["contato@gmail.com"]#Essa é a descrição curta da Gemspec.summary = %q{TODO: Write a short summary, because Rubygems requires one.}#Essa é a descrição Longa da Gemspec.description = %q{TODO: Write a longer description or delete this line.}#Coloque o link para o repositório do Github ou para a Homepage do site onde você vai deixar a documentação da Gemspec.homepage = "TODO: Put your gem's website or public repo URL here.
- Primeiro você precisa configurar essas linhas:
-
- Agora verifique se você encontra essa linha no seu arquivo “translate_yandex.gemspec”:
-
1spec.add_development_dependency "rspec", "~> 3.0"
Caso não exista, insira essa linha e rode:
1bundle installVamos precisar do Rspec para os testes
- Para finalizar insira também essa linha:
1spec.add_development_dependency "rest-client"
e rode:
1bundle installVocê precisará substituir todos os “TODO” das configurações, senão você não conseguirá rodar o Rspec ou instalar a Gem.
Pegando nossa Api Key
Como visto no início do post, para realizar as traduções usaremos a Api da Yandex. Para podermos usar a Api deles, precisaremos de uma chave para receber a autorização durante as chamadas da Api.
- Primeiro acesse esse link!
- Depois de preencher seus dados você deverá entrar nessa tela, basta checar o “User Agreement” e prosseguir:
- Certo, agora você já deve estar na página que mostra sua chave, basta copiá-la para um lugar seguro. Logo iremos usá-la.
Pronto, agora com nossa chave nós podemos finalmente criar os testes.
Criando os Testes para a nossa Gem (TDD)
Seguindo a prática de TDD, começaremos criando os testes antes do código da Gem propriamente dita. Caso queira saber mais sobre essa prática, clique aqui. (caso queira uma explicação sobre TDD e o Rspec neste blog, deixe nos comentários ou mande no Facebook para batermos um papo filipino single women for dating in houston).
Na nossa Gem, queremos criar três métodos principais:
- Um método capaz de traduzir uma frase do idioma X para o idioma Y.
- Um método que retorne todos os idiomas que a API da Yandex conhece.
- Um método capaz de dizer em qual idioma uma frase foi escrita.
Com nossos objetivos em mente, vamos começar.
Inserindo a nossa Chave da Api
Precisamos passar uma chave válida da API para que o Rspec possa usá-la na hora que formos iniciar nossa classe dentro dele.
Para fazer isso, vá até o arquivo “/spec/spec_helper.rb” e cole essa linha no final com a sua chave da API:
1 |
TEST_API_KEY = "SUA_CHAVE_DE_TESTE_AQUI" |
O recomendado é que você crie uma nova chave no site da Yandex apenas para teste e use-a nesse arquivo. (Se você fizer o upload da sua Gem, sua chave será visível para outras pessoas, então se usar sua chave normal outras pessoas terão acesso a ela)
Primeiro Teste
- Copie o código a baixo e cole no seu arquivo “spec/translate_yandex_spec.rb”:
12345678910111213141516171819require "spec_helper"describe "GET api/v1.5/tr.json/translate (Translate)" do# Teste 1 (Translate)it "Api response == 200" dotextPt = "Nós estamos testando o tradutor"yandexApi = TranslateYandex::Yandex.new TEST_API_KEYresponse = yandexApi.translate textPt, "en"expect(response["code"]).to eq(200)endit "translated text match" dotextPt = "Nós estamos testando o tradutor"textEn = "We are testing the translator"yandexApi = TranslateYandex::Yandex.new TEST_API_KEYresponse = yandexApi.translate textPt, "en"expect(response["text"].first).to eq(textEn)endend
Criamos dois testes, o primeiro “Api response == 200” para verificar se a Api retornaria o status de sucesso “200” e o segundo “translatated text match” para verificar se o texto foi traduzido corretamente do português para o inglês. Este teste serve para verificar se estamos chamando a tradução corretamente. Não estamos completamente seguros, porque dependemos do perfeito funcionamento da Api, mas quanto a isso não temos o que fazer. - Agora rode no console:
1bundle exec rspec - Pronto, seu retorno deve ter sido um erro similar a este:
older women seeking men nyFalhou porque nós só temos os testes, não temos ainda o código da Gem :).
Segundo Teste
- Copie para o arquivo “spec/translate_yandex_spec.rb” dentro do bloco “describe TranslateYandex do” este código:
123456789# Teste 2 (supported list of languages)describe "GET api/v1.5/tr.json/getLangs (Supported List)" doit "Api response not equal nil or empty '' " doyandexApi = TranslateYandex::Yandex.new TEST_API_KEYresponse = yandexApi.listexpect(response).not_to eq(nil)expect(response).not_to eq("")endend
Nesse teste, apenas verificamos se a Api não está devolvendo a lista de linguagens que ela suporta vazia ou se o response está vindo ‘nil’. Nós não comparamos com a lista de idiomas porque quando ela sofrer alterações quebrará nossos testes, mas aceitamos contra argumentos sobre isso 🙂 - Rode no Console:
1bundle exec rspec - Você receberá novamente um erro, agora do teste 1 e do teste 2.
Quando criarmos o código os erros desaparecerão :).
Terceiro Teste
- Copie para o arquivo “spec/translate_yandex_spec.rb” dentro do bloco “describe TranslateYandex do” este código:
-
12345678910111213141516# Teste 3 (Language Detect)describe "GET api/v1.5/tr.json/detect (Detect)" doit "Api response == 200" dotextPt = "Nós estamos testando o tradutor"yandexApi = TranslateYandex::Yandex.new TEST_API_KEYresponse = yandexApi.detect textPtexpect(response["code"]).to eq(200)endit "detect language match with right language" dotextPt = "Nós estamos testando o tradutor"yandexApi = TranslateYandex::Yandex.new TEST_API_KEYresponse = yandexApi.detect textPtexpect(response["lang"]).to eq("pt")endend
Dessa vez nós testamos primeiro “Api response == 200”, ou seja, se a Api estava retornando o código de sucesso, e também “detect language match with right language” que verifica se realmente a Api está nos dizendo que o idioma da frase é Português. - Agora rode no console:
1bundle exec rspec - Novamente você receberá uma mensagem de erro, agora para todos os testes que fizemos.
Pronto, nossos testes foram criados. Caso queira saber mais sobre o Rspec, dê uma olhada neste married dating sites
Criando o Core da nossa Gem
Pronto, finalmente criaremos o Core da nossa Gem. Apenas relembrando, nosso objetivo é criar os seguintes métodos:
- Um método capaz de traduzir uma frase do idioma X para o idioma Y.
- Um método que retorne todos os idiomas que a API da Yandex conhece.
- Um método capaz de dizer em qual idioma uma frase foi escrita.
Vá até o arquivo “lib/translate_yandex.rb” e cole o seguinte código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
require "translate_yandex/version" # Dependencia da gem que faz a chamada REST require "rest-client" # Dependencia para parsear o JSON require "json" module TranslateYandex class Yandex # Aqui nós recebemos a chave da Api quando o usuário inicializa a nossa classe def initialize(api_key) @api_key = api_key end # Nosso método de tradução def translate text, language result = RestClient.get 'https://translate.yandex.net/api/v1.5/tr.json/translate', {params: {key: @api_key, text: text, format: 'plain', lang: language}} JSON.parse(result.body) end # Nosso método para receber a lista de idiomas que a API conhece def list result = RestClient.get 'https://translate.yandex.net/api/v1.5/tr.json/getLangs', {params: {key: @api_key}} JSON.parse(result.body) end # Nosso método que identifica o idioma de uma frase def detect text result = RestClient.get 'https://translate.yandex.net/api/v1.5/tr.json/detect', {params: {key: @api_key, text: text}} JSON.parse(result.body) end end end |
Fizemos alguns comentários no código acima para que você possa entender o que foi feito.
Basicamente estamos com a nossa Gem pronta, agora vamos rodar nossos testes e ver se eles funcionam.
1 |
bundle exec rspec |
Se tudo deu certo você deve estar vendo algo semelhante a isso:
https://onebitcode.com/best-sites-for-dating/
\o/ Uau! você acaba de criar a sua primeira Gem e certamente muitas outras virão. Imagine outras funções que possam ser bem atendidas por uma Gem e usando os conhecimentos que você adquiriu aqui, crie-a.
Caso precise de alguma ajuda, deixe nos comentários ou fale conosco https://onebitcode.com/things-you-should-do-while-dating/
Instalando nossa Gem
Para podermos usar a Gem dentro de um projeto Rails, por exemplo, precisaremos instalá-la. Para instalar rode:
1 |
gem build translate_yandex.gemspec |
Agora rode:
1 |
gem install translate_yandex-0.1.0.gem |
\o/ Pronto, sua Gem já está instalada e já pode ser usada dentro de um projeto Rails.
Usando nossa Gem via Console
Vamos testar nossa Gem usando-a via console:
- No seu console rode:
1irb - Você deve estar vendo uma tela como esta:
- Agora rode o seguinte comando:
1require 'translate_yandex' - Vamos criar nosso objeto (substitua com sua api key):
1yandex = TranslateYandex::Yandex.new 'SUA_API_KEY' - Agora vamos pedir para a Gem traduzir a frase “Parabéns por fazer esse tutorial” para Russo:
1yandex.translate "Parabéns por fazer esse tutorial", "ru"
Sucesso, nossa Gem funciona perfeitamente. Caso queira, você pode testar os outros métodos como uma maneira de fixação :).
Publicando nossa Gem
Podemos subir a nossa Gem para o Ruby Gems para que outras pessoas possam usá-la e se beneficiar do nosso trabalho, assim como nós nos beneficiamos do trabalho de tantos outros que fizeram Gems como “paperclip”, “capistrano”, “rspec” etc. (Seja legal com o mundo e compartilhe :)).
Publicar a Gem será uma missão para você fazer sozinho, para que você possa fixar mais o conteúdo.
Mas é claro, aqui está uma referência para você saber como fazer!
Se você precisar de ajuda fale comigo :).
Parte 2 (“Clonando” o Google Translate)
Na segunda parte desse tutorial, aprenderemos a criar um site semelhante ao Google Translate e como usar a Gem que criamos dentro do projeto para identificar o idioma da frase digitada. Veremos também como mostrar a lista de idiomas que podemos traduzir e efetivamente traduzir as frases que o usuário entrar na interface gráfica que criaremos.

Não perca nenhum conteúdo
Receba nosso resumo semanal com os novos posts, cursos, talks e vagas o/
Você está gostando do que estamos produzindo? Deixe nos comentários para que possamos saber. Se puder, compartilhe esse conteúdo, pois isso ajuda bastante a incentivar novos conteúdos. 🙂
Obrigado,
Até o próximo tutorial,
Equipe OneBitCode.
Primeira vez no OneBitCode? Curtiu esse conteúdo?
O OneBitCode tem muito mais para você!
O OneBitCode traz conteúdos de qualidade, e em português, sobre programação com foco em Ruby on Rails e também JavaScript.
Além disso, aqui sempre levamos à você conteúdos valiosos sobre a carreira de programação, dicas sobre currículos, portfólios, perfil profissional, soft skills, enfim, tudo o que você precisa saber para continuar evoluindo como Programador(a)!
Fique por dentro de todos os conteúdos o/
Nossas redes sociais:
📹 • https://youtube.com/Onebitcode [Live todas as terças-feiras às 19h)
💻 • https://linkedin.com/company/onebitcode
🙂 • https://facebook.com/onebitcode
📱 • https://instagram.com/one_bit_code
🐦 • https://twitter.com/onebitcode
Nossos cursos:
🥇 • Programador Full Stack Javascript em 8 Semanas
💎 • Curso Completo de Ruby
⚙ • Minicurso: API Rails 5 Completo
🐞 • Minicurso de Testes para Ruby on Rails com RSpec
Espero que curta nossos conteúdos e sempre que precisar de ajuda, fala com a gente!
Estamos aqui para você 🙂
Bem-vindo à família OneBitCode o/