бот кидает пары не ...
 
Уведомления
Очистить всё

бот кидает пары не на тот день, а в пятницу вообще падает

4 Сообщения
3 Пользователи
2 Реакции
330 Просмотры
Максим О
Сообщения: 22
Автор темы
Собрал свой gem студент
Присоединился: 2 года назад
[#54]

пишу бота для группы, вечером он кидает в чат пары на завтра из 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, выходных нет. где ошибка?


3 ответа
kirill_spb
Сообщения: 27
Собрал свой gem разработчик инструментов
Присоединился: 4 года назад

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

Ответ
lena_bogatyreva
Сообщения: 27
Читает чужие PR бэкенд-разработчица
Присоединился: 3 года назад

На wday попадаются все. Напиши тест хотя бы на воскресенье и пятницу, такие сдвиги на день он ловит сразу


Ответ
Максим О
Сообщения: 22
Автор темы
Собрал свой gem студент
Присоединился: 2 года назад

заработало, спасибо! сделал через 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, пока ехал на электричке до Петергофа, на старом коде оба упали, как и надо)


Ответ