пишу бота для группы, вечером он кидает в чат пары на завтра из yaml. в воскресенье прислал пары вторника, а в пятницу упал с KeyError. ruby 3.3
require "yaml"
require "date"
DAYS = %w[mon tue wed thu fri sat sun]
schedule = YAML.load_file("schedule.yml")
tomorrow = Date.today + 1
day = DAYS[tomorrow.wday]
pairs = schedule.fetch(day)
pairs.each { |p| puts "#{p["time"]} #{p["title"]} (#{p["room"]})" }
в yaml ключи mon, tue и дальше до fri, выходных нет. где ошибка?
wday считает от воскресенья: 0 это воскресенье, 1 понедельник. А массив у тебя с понедельника, отсюда сдвиг на день, и в пятницу ты попадаешь в "sun", которого нет в yaml. Проще вообще без массива, ключи и так совпадают с strftime("%a"):
day = tomorrow.strftime("%a").downcase # "mon", "tue", ...
pairs = schedule.fetch(day, [])
if pairs.empty?
puts "завтра пар нет"
else
pairs.each { |p| puts "#{p["time"]} #{p["title"]} (#{p["room"]})" }
end
На wday попадаются все. Напиши тест хотя бы на воскресенье и пятницу, такие сдвиги на день он ловит сразу
заработало, спасибо! сделал через strftime, массив убрал. и раз уж полез, добавил чётность недели, у нас пары через неделю меняются, отсчёт от 2 сентября:
SEMESTER_START = Date.new(2024, 9, 2)
def week_type(date)
week = (date - SEMESTER_START).to_i / 7 + 1
week.odd? ? "odd" : "even"
end
тесты на воскресенье и пятницу написал на minitest, пока ехал на электричке до Петергофа, на старом коде оба упали, как и надо)