За последние полторы недели, после того, как я наверстал несколько уроков, которые я отложил, я смог начать свою самую первую программу CLI Ruby от начала до конца, и я очень горжусь и добился успеха! В начале 2019 года я пытался самостоятельно научиться программировать, и через 3 месяца у меня ничего не получилось. Спустя чуть более месяца я очень доволен достигнутым прогрессом и тем, что создал свою собственную программу на основе всего, что узнал.

Поскольку я хотел, чтобы мой первый опыт создания программы был веселым, я выбрал тему, которую действительно люблю, — еду! Я создал CLI-программу Top 100 NYC Restaurant, которая показывает 100 лучших ресторанов, рекомендованных Timeout New York, и, когда вы вводите число рядом с интересующим вас рестораном, она возвращает тип еды и отзыв кого-то об их опыте в ресторан, который взят с веб-страницы Timeout о ресторане.

Мне не потребовалось много времени, чтобы застрять и запутаться в том, как запустить мою программу, и меня не успокаивало то, что у меня были проблемы просто с разработкой моей среды и зависимостей. Когда я наконец понял цель наличия централизованной среды, которая загружает все мои зависимости и вызывает их во время каждого класса, который я создал, я понял, что разработка одной среды, к которой вы затем вызываете, значительно упрощает жизнь. Я был в замешательстве относительно того, нужно ли мне требовать nokogiri или pry в определенных файлах, поскольку я буду вызывать методы очистки, но загрузка всего перед рукой просто упростила жизнь.

Затем я начал создавать свою командную строку, так как у меня было общее представление о макете, которому я хотел следовать в своей программе. Мой метод #call собирался пройтись по списку методов, с помощью которых пользователь будет переходить от отображения ресторанов к выходу из программы. Сначала я определил свой метод #scrape_data, который просто собирался вызывать другой класс, который будет отвечать за очистку. Мой метод #menu — это то, с чего начинается самое интересное. После очистки нужных мне данных мне нужно было получить ввод, и мне нужно преобразовать этот ввод в целое число и вернуть соответствующее целое число с информацией о ресторане. Это будет выполнено скребком второго уровня, поэтому я просто вставил свои «путы» для информации, которую я хотел вернуть. Логика, которую он принял, оставила пользователю возможность ввести число от 1 до 100, снова просмотреть список ресторанов или выйти из программы. Все идет нормально!

Не отставая от положительных эмоций и хорошей работы на треке, я перешел к классу ресторана, который будет отвечать за определение информации, которую я получу из царапин. Информация, которую он вернет, будет именем, типом, местоположением, описанием и URL-адресом. Он будет инициализирован с именем и иметь метод для сохранения всего, что он очищает. Просто и чисто.

Мой скребок — это то, на что ушла большая часть моего времени, и не только попытки найти нужные части данных для удаления, но и попытки представить и отобразить информацию таким образом, чтобы она выглядела хорошо для конечного пользователя, все усложняло. Поскольку список 100 лучших тайм-аутов был списком, я знал, что мне нужно будет найти какую-то таблицу, содержащую всю эту информацию. К сожалению, у меня было много проблем с удалением только тех данных, которые мне нужны, потому что было много общих имен классов, которые отвечали за отображение других данных. Были ссылки на другие списки, по которым можно было щелкнуть, и форматирование было таким же, и данные продолжали извлекаться в виде массива. Когда я, наконец, смог сузить эту информацию только до ресторанов, она вернула данные в странном наклонном формате, и у меня не было возможности централизовать их. Я попросил у Ланца (руководителя моей когорты) несколько советов и указал мне на оператор &:text, который помог очистить форматирование.

После этой головной боли мне стало намного проще собирать нужную мне информацию, и я не сталкивался с проблемой форматирования, которая у меня была раньше. Я позаботился о том, чтобы вернуть все свои данные в массив, и как только я получил все свои царапины, я повторил свои данные .with_index, что позволило мне перебрать все данные, которые у меня были, по другим массивам данных. Я обновил свой файл командной строки и после нескольких настроек смог собрать и представить всю необходимую мне информацию!

Моим последним шагом была возможность получить доступ к данным с веб-сайта отдельного ресторана и получить описания и тип еды. Используя парсер URL-адресов, который я получил из списка 100 лучших, я смог очистить код, который управлял всеми отдельными страницами ресторана, поэтому мне просто нужно было соединить их с основным URL-адресом тайм-аута и создать новые парсеры для новых данных. Затем я вызывал этот новый парсер каждый раз, когда вводился правильный ввод, и отправлял обратно соответствующую информацию. Описания следовали той же проблеме с форматированием, но затем я нашел другой удобный оператор, который удалял все пробелы (gsub(/\s+/, " "), но выглядел намного чище. И после большого количества кофеина, тайленола и песка моя первая CLI-программа ожил!

Хотя я действительно думаю, что выбранный мной веб-сайт был проще, поскольку мне не нужно было устанавливать какие-либо API для очистки данных, я доволен достигнутым прогрессом. Там