
Quer desenvolver sua lógica de Programação e aumentar suas skills? Faça esse exercício de Ruby seguindo as instruções a baixo e depois confira como eu resolvi ele passo a passo.
Se curtir o formato deixe um comentário e compartilhe com outros(as) programadores(as) para que eu traga mais exercícios resolvidos como este, bora codar 🙂
Criar um Script que exiba uma tabela no console com os X últimos valores do Bitcoin.
Formato: Data do registro, valor do Bitcoin, Seta indicando se o valor aumentou ou diminuiu em relação ao anterior!
Exemplo:
Comando: ruby bitcoin.rb -d=”7″
-d: é o parâmetro que diz
Ferramentas
- API para baixar o histórico do Bitcoin: https://www.coindesk.com/coindesk-api
- Gem para conectar com a API: https://github.com/rest-client/rest-client
- Gem para mostrar a tabela: https://github.com/tj/terminal-table
Solução Oficial
Criando a estrutura
1 – Crie um arquivo chamado Gemfile e coloque nele:
1 |
source 'https://rubygems.org' |
2 – Crie o arquivo principal chamado bitcoin.rb:
1 |
touch bitcoin.rb |
Instalando o Rest Client
1 – Instale o rest client:
1 |
gem 'rest-client' |
2 – rode no console:
1 |
bundle install |
3 – Coloque no arquivo bitcoin.rb:
1 2 |
require 'rest-client' require 'json' |
Pegando o parâmetro de entrada (quantidade de dias para mostrar) e montando as datas
1 – Em bitcoin.rb coloque:
1 |
days_to_show = ARGV[0] ? ARGV[0].split("=")[1].to_i : 7 |
Estamos verificando se existe um parâmetro -d e depois estamos pegando a quantidade de dias passada nele (ou a padrão caso ele não exista)
2 – Agora inclua:
1 2 |
end_date = Date.today.strftime("%Y-%m-%d") start_date = (Date.today - days_to_show).strftime("%Y-%m-%d") |
Conectando com a API do Coindesk
1 – Vamos criar uma variável com a url da api do coindesk, coloque no bitcoin.rb:
1 |
url = 'https://api.coindesk.com/v1/bpi/historical/close.json' |
2 – Agora inclua o variável com os parâmetros:
1 |
params = "?start=#{start_date}&end=#{end_date}" |
3 – Vamos fazer a chamada para a API:
1 2 3 4 |
response = RestClient.get "#{url}#{params}", { content_type: :json, accept: :json } |
4 – Apenas para checarmos se deu certo, inclua:
1 |
puts response.body |
5 – Chame no console:
1 2 3 |
ruby bitcoin.rb ruby bitcoin.rb -d="3" ruby bitcoin.rb -d="30" |
Depois de testar pode retirar esses comandos de impressão
Instalando o terminal table
1 – Instale o terminal table:
1 |
gem 'terminal-table' |
2 – rode no console:
1 |
bundle install |
3 – Coloque no arquivo bitcoin.rb:
1 |
require 'rest-client' |
Montando os dados da tabela
1 – Vamos extrair do json retornado o histórico do bitcoin para a data colocando:
1 |
bpi = JSON.parse(response.body)["bpi"] |
2 – Para comparar os preços do bitcoin (para mostrar se houve aumento ou diminuição no valor) vamos precisar pegar as keys do hash com o histórico:
1 |
bpi_keys = bpi.keys |
3 – Para a tabela vamos precisar gerar uma matriz com data do registro, valor do bitcoin na data e uma seta indicando se aumentou ou diminuiu em relação ao registro anterior:
1 2 3 4 5 6 7 |
table_data = bpi.map.with_index do |(data, value), i| [ Date.parse(data).strftime("%d/%m/%y"), "$#{value.to_f}", (i > 0 ? (bpi[bpi_keys[i]] > bpi[bpi_keys[i - 1]] ? "🡅" : "🡇") : "") ] end |
Montando a tabela e exibindo
1 – Para montar a table acrescente:
1 |
table = Terminal::Table.new :headings => ['Data', 'Valor do Bitcoin', '₿'], :rows => table_data |
2 – Para exibir a tabela:
1 |
puts table |
3 – Agora chame:
1 |
ruby bitcoin.rb -d="10" |
Pronto o/
Desafio: Colorindo a saída
Para tornar a analise da tabela mais fácil deixe a seta que aponta para um aumento no valor do bitcoin verde e a seta que aponta para a diminuição do valor vermelha.
Conclusão
Curtiu esse Exercício com resolução?
Deixe um comentário e compartilhe com outros(as) programadores(as) para sabermos que devemos trazer mais exercícios com resolução neste modelo para vocês.
Coloque o seu script no Gist e coloque o link nos comentários para podermos comparar várias soluções e ver o caminho mais eficiente para resolver este desafio.
Te vejo no próximo conteúdo (não se esqueça de se inscrever no nosso canal do Youtube e no nosso Instagram)