Skip to content

Instantly share code, notes, and snippets.

@RobertoBarros
Created January 28, 2025 19:00
Show Gist options
  • Save RobertoBarros/acfa37801e1519cd4b11e5d291201dbf to your computer and use it in GitHub Desktop.
Save RobertoBarros/acfa37801e1519cd4b11e5d291201dbf to your computer and use it in GitHub Desktop.
reboot_batch_1925_gifts_list_final
require "csv"
require "open-uri"
require "nokogiri"
require "colored"
FILEPATH = "gifts.csv"
def list(gifts)
puts "Aqui está sua lista:"
# gift é um hash do tipo: {name: "Meia", bought: true}
gifts.each_with_index do |gift, index|
bought = gift[:bought] ? "[X]" : "[ ]"
puts "#{index + 1} - #{bought} - #{gift[:name]}".red_on_yellow
end
end
def add(gifts)
# Perguntar qual o presente para adicionar na lista
puts "Qual presente deseja add na lista?"
name = gets.chomp
# Adicionar na lista de gifts
gifts << {name: name, bought: false}
# Salva os novos presentes no arquivo CSV
save_csv(gifts)
end
def delete(gifts)
# Mostrar os presentes
list(gifts)
# Perguntar qual o número do presente para excluir
puts "Qual Numero do presente deseja deletar?"
index = gets.chomp.to_i - 1
# Verificar se o index é válido
if index >= 0 && index < gifts.size
# Remover de gifts pelo index
gifts.delete_at(index)
# Salva os novos presentes no arquivo CSV
save_csv(gifts)
else
puts "Opção Inválida"
end
end
def mark(gifts)
# Listar os presentes
list(gifts)
# Perguntar qual o número do presente para excluir
puts "Qual Numero do presente deseja marcar?"
index = gets.chomp.to_i - 1
# Verificar se o index é válido
if index >= 0 && index < gifts.size
# Recuperar o gift pelo index
gift = gifts[index] # É o hash do tipo {name: "Meia", bought: false}
gift[:bought] = true
# Salva os novos presentes no arquivo CSV
save_csv(gifts)
else
puts "Opção Inválida"
end
end
def idea(gifts)
# Perguntar qual a ideia de presente
puts "Qual a sua ideia de presente ideal?"
search = gets.chomp
# Montar a url do scrape
url = "https://letsy.lewagon.com/products?search=#{search}"
# Scrape dos presentes pela ideia informada
html = URI.open(url).read
doc = Nokogiri::HTML.parse(html)
products = []
# Iterando pela div com as infos de nome e preço do produto
doc.search('div.title-container').each do |tag|
name = tag.search('h2').text
price = tag.search('span.price').text
products << {name:, price:} # é o mesmo que {name: name, price: price}
end
# Mostrar uma lista de ideias
puts "Escolha uma das ideias para adicionar na sua lista:"
products.each_with_index do |product, index|
puts "#{index + 1} - #{product[:name]} - Valor: #{product[:price]}"
end
# Perguntar qual o número do presente a ser adicionado
puts "Escolha um número:"
index = gets.chomp.to_i - 1
# Adicionar o novo presente na lista
gifts << {name: products[index][:name], bought: false}
# Salva o arquivo de CSV com o novo gift
save_csv(gifts)
end
# Salva o array gifts em um arquivo CSV
def save_csv(gifts)
CSV.open(FILEPATH, "wb") do |csv|
gifts.each do |gift|
csv << [gift[:name], gift[:bought]]
end
end
end
# Retorna um array de strings carregados do CSV
def load_csv(gifts)
CSV.foreach(FILEPATH) do |row|
name = row[0]
bought = row[1] == "true"
gifts << {name: name, bought: bought}
end
end
# ===============================================
# o programa começa a partir daqui
# ===============================================
gifts = []
# Carrega o CSV somente se o arquivo existir
load_csv(gifts) if File.exist?(FILEPATH)
# Mensagem de Boas Vindas
puts "Seja Bem vindo a sua lista"
# LOOP
loop do
# Informar e perguntar qual opção
puts "Which action [list|add|delete|mark|idea|quit]?".green
action = gets.chomp.downcase
#Executar a opção selecionada
case action
when "list"
list(gifts)
when "add"
add(gifts)
when "delete"
delete(gifts)
when "mark"
mark(gifts)
when "idea"
idea(gifts)
when "quit"
# Se for `quit` sai do loop
break
else
puts "Opção inválida".red
end
# FIM DO LOOP
end
# Mensagem de Goodbye
puts "Goodbye"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment