Skip to content

Instantly share code, notes, and snippets.

@RobertoBarros
Created June 6, 2026 21:45
Show Gist options
  • Select an option

  • Save RobertoBarros/472049c22c8bfb4316671bc6cb8fa891 to your computer and use it in GitHub Desktop.

Select an option

Save RobertoBarros/472049c22c8bfb4316671bc6cb8fa891 to your computer and use it in GitHub Desktop.
batch_2302_christmas_list_complete
require "csv"
require 'open-uri'
require 'nokogiri'
require 'colored'
FILEPATH = "gifts.csv"
def add(gifts_list)
#Perguntar qual item o usuário quer adicionar
puts "Qual o nome do presente você gostaria de adicionar?".green_on_yellow
#Ler a resposta do usuário
name = gets.chomp
puts "Qual o preço do presente"
price = gets.chomp.to_i
#Armazenar a resposta
gifts_list << { gift: name, marked: false, price: price}
save_list(gifts_list)
end
def list(gifts_list)
#Listar os itens que estao na lista de presentes do usuario
# item é um hash no formato { gift: "Meia", marked: false }
gifts_list.each_with_index do |item, index|
check = item[:marked] ? "[X]" : "[ ]"
puts "#{index + 1} - #{check} #{item[:gift]} R$ #{item[:price]}"
end
end
def remove(gifts_list)
# Qual o número do item deseja remover?
puts "Qual o número do item deseja remover?"
# Armazenar a resposta
index = gets.chomp.to_i - 1
if index >= 0 && index <= gifts_list.size - 1
# Remover da lista pelo index
gifts_list.delete_at(index)
save_list(gifts_list)
else
puts "Número inválido"
end
end
def mark(gifts_list)
puts "Qual item deseja marcar?"
index = gets.chomp.to_i - 1
if index >= 0 && index <= gifts_list.size - 1
# marcar da lista pelo index
gifts_list[index][:marked] = true
save_list(gifts_list)
else
puts "Número inválido"
end
end
def import(gifts_list)
# Perguntar e armazenar qual produto está procurando
puts "Qual o produto que está procurando?"
product = gets.chomp
# Scrape pelo produto na URL de pesquisa
url = "https://letsy.lewagon.com/products?search=#{product}"
# 1. We get the HTML page content
html_content = URI.parse(url).read
# 2. We build a Nokogiri document from this file
doc = Nokogiri::HTML.parse(html_content)
# Criando uma lista com os produtos encontrados
products = []
doc.search('li.product-card').each do |tag|
products << {
name: tag.search('.title').text,
price: tag.search('.price').text.match(/(?<price>\d*)\./)[:price].to_i
}
end
# Se a lista estiver vazia informar
if products.empty?
puts "Nenhum produto encontrado".red
return
end
# Listar os produtos encontrados no scrape
puts "Produtos encontrados:"
puts "-" * 40
products.each_with_index do |product, index|
puts "#{index + 1} - #{product[:name]} - R$ #{product[:price]}"
end
# Escolher o número de um produto para adicionar na lista de presentes
puts "Qual o número do produto para adicionar?"
index = gets.chomp.to_i - 1
# Adicionar o produto escolhido na lista
gifts_list << {
gift: products[index][:name],
marked: false,
price: products[index][:price]
}
end
def save_list(gifts_list)
CSV.open(FILEPATH, "wb") do |csv|
gifts_list.each do |item|
csv << [item[:gift], item[:marked], item[:price]]
end
end
end
def load_list(gifts_list)
CSV.foreach(FILEPATH) do |row|
gift = row[0]
marked = row[1] == "true"
price = row[2].to_i
gifts_list << { gift:, marked:, price: } # Isso é o mesmo que { gift: gift, marked: marked, price: price}
end
end
# O programa começa a partir daqui:
#Criar a variável da lista de presentes
gifts_list = []
load_list(gifts_list) if File.exist?(FILEPATH)
#Boas-vindas ao usuário
puts "Bem-vind@ à sua lista de presentes de natal!"
#Criar o loop do menu
loop do
#Apresentar o menu
puts "Qual é a sua escolha? [Listar | Adicionar | Excluir | Marcar | Importar | Fechar]"
#Pegar a resposta do usuário
answer = gets.chomp.downcase
#Procurar qual caso/alternativa é
case answer
#Mostrar a lista
when "listar" then list(gifts_list)
#Adicionar itens a lista
when "adicionar" then add(gifts_list)
#Excluir itens da lista
when "excluir" then remove(gifts_list)
# Marcar um item da Lista
when "marcar" then mark(gifts_list)
# Importar item por scrape
when "importar" then import(gifts_list)
#Sair da lista
when "fechar"
break
else
#Caso o usuário escolha uma alternativa não válida
puts "Escolha uma alternativa válida!"
end
#Limpar a tela após cada "escolha"
#print `clear`
#Finalizar o loop
end
#Tchau!
puts "Obrigad@! Volte sempre!"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment