Created
January 28, 2025 19:00
-
-
Save RobertoBarros/acfa37801e1519cd4b11e5d291201dbf to your computer and use it in GitHub Desktop.
reboot_batch_1925_gifts_list_final
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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