Здравствуйте, добро пожаловать в LCBO API?
Если вы задаетесь вопросом: «Что такое LCBO API?», позвольте мне объяснить. В Онтарио, Канада, все продажи алкогольных напитков осуществляются через государственную корпорацию под названием Совет по контролю за спиртными напитками Онтарио (LCBO), которая занимается розничной торговлей и распространением алкогольных напитков по всей провинции. У LCBO есть множество розничных магазинов и веб-сайт, на котором размещен каталог каждого продукта, магазина и даже уровня запасов. Они публикуют сезонный каталог с рецептами, редакционными статьями и другим контентом под названием Food & Drink. Они также ежегодно приносят миллиарды долларов дохода в нашу систему общественного здравоохранения. Если задуматься, это захватывающая ситуация: в других местах есть подобные системы, но, насколько мне известно, ни одна из них не обладает такой широтой и глубиной, как LCBO. Итак, теперь вы знаете, что это такое, довольно круто, а?
Это может быть интересно вам, даже если вы не живете в Онтарио, Канада, если:
На протяжении всего проекта я долго боролся с идеей получения финансовой поддержки. С одной стороны, LCBO API нуждался в этом, с другой — я устал от осложнений, которые это может вызвать. Что ж, теперь у меня есть ИДЕАЛЬНОЕ решение этой проблемы!
Сейчас я прохожу лечение от рака крови, в частности от диффузной крупноклеточной В-клеточной лимфомы. Я собираюсь написать об этом подробнее в другом месте, но за прошедший год люди со всего мира поддерживали меня всеми возможными способами, и это изменило меня. Я хочу, чтобы мы сделали что-то большое, чтобы показать, что нам тоже не все равно!
Если вы когда-либо хотели поддержать этот проект в прошлом, пожалуйста, сделайте пожертвование в пользу Hamilton Health Sciences от имени LCBO API, они спасают мне жизнь.
Пожертвуйте в пользу Hamilton Health Sciences
Я прохожу лечение в Онкологическом центре Юравинского, но на самом деле вы можете выбрать любой вариант или оставить стандартный. Неважно, маленькая сумма или большая, меня уведомят, когда вы сделаете пожертвование. Я составлю список, чтобы отслеживать общую сумму, посмотрим, сколько мы сможем собрать!
Наконец, я хотел бы особо упомянуть мое рабочее место, Crowdmark. Они были невероятно добрыми и понимающими во время всего этого, и без них я бы буквально не смог этого сделать. Мы неустанно работаем над улучшением статус-кво оценивания в высшем образовании. Если вы заботитесь об образовании и обучении, я призываю вас посетить нас.
Осенью 2008 года я был новоиспеченным веб-разработчиком с несколькими годами опыта за плечами. Я жаждал вызовов и некоторого признания. В то время приложения становились все более популярными, и мне очень хотелось их создать. Я решил, что хочу создать такой, который потребует от меня сначала создать этот API. Я никогда не создавал это приложение?
Если вы посмотрите на эту кодовую базу достаточно долго, вы, вероятно, обнаружите моменты разочарования, тупики, запутанную ерунду и т. д. Я очень надеюсь, что вы не зацикливаетесь на этом или на любом негативе, который вы можете найти. Я больше не тот человек, и я не хочу, чтобы ты тоже был этим человеком. Я открытая книга в этом вопросе! Откройте тему и задайте мне вопрос, я буду максимально честен и уважителен, только прошу вас сделать то же самое.
Я выпускаю этот проект под GNU GPLv3, считаю это наиболее справедливым и ответственным вариантом для такого проекта. Если вы считаете иначе, откройте проблему, и мы сможем открыто обсудить ее. Я лишь с уважением прошу вас не использовать брендинг и дизайн повторно. Меня устраивает повторное использование документации, но стиль, фирменный стиль и фирменный стиль необходимо изменить, если вы хотите развернуть собственную изолированную версию этого приложения.
Что, если вместо монолитного приложения, пытающегося сделать все в одном стиле и в одном месте, мы подумали шире? Что, если бы краулер снова был отдельным проектом, отвечающим за сбор и нормализацию данных, другие могли бы создавать узлы API на любых платформах, которые они пожелают, эти узлы регистрировались бы у поставщика данных и получали обновленные данные по мере их доступности и предоставляли эти данные пользователи самых разных типов.
Вместо того, чтобы десятки похожих серверов API пытались делать то же самое, борясь за ресурсы LCBO.com, мы могли бы сосредоточить наши усилия на повышении ценности этих данных, а не на борьбе за право собственности на них. Мы могли бы привлечь другие дисциплины, чтобы создать новую ценность, выходящую за рамки очевидного, привлечь к участию сообщества крафтового пива и вина, развить это и сделать его больше, чем просто Онтарио.
Я не знаю, насколько это осуществимо, но знаю, что если другим будет интересно, я бы с удовольствием поучаствовал в таких обсуждениях.
Кроме того, возможно, нам следует рассмотреть возможность взимания с корпоративных пользователей разумной платы за доступ к узлам API, чтобы эти деньги можно было использовать для финансирования расходов на хостинг, чтобы обеспечить устойчивость ситуации, их также можно было бы использовать для финансирования программ поддержки людей, которые не могут пить. или кто не хочет пить, или кто хочет пить меньше, чтобы принести пользу нашему сообществу и действительно изменить ситуацию.
Но мне нужны другие, которые помогут разделить бремя поддержания и управления всем этим. Здоровье и счастье мое и моей семьи являются приоритетом №1, за ним следует моя карьера, а затем мои друзья и сообщество. Этот проект больше не может быть для меня тратой времени №1, он для меня неустойчив и вреден для здоровья. Но если вас вдохновило это сообщение, пожалуйста, свяжитесь со мной, в идеале открыто, но сначала можно и конфиденциально.
Надеюсь, это вас воодушевит!
Не удержался, подробнее о своих идеях написал по этому поводу: doc/lcboapi-propose.md
Теперь, когда с этим покончено, мы можем начать понимать, для кого я на самом деле это сделал, и что меня воодушевило и вдохновило сделать это в первую очередь: возможность учиться и расти, а также помогать другим делать то же самое. Для тех из вас, кому интересно, давайте посмотрим, к чему это приведет?
Вероятно, вы можете запустить приложение непосредственно в своей хост-среде, оно не требует ничего особенного с точки зрения системных зависимостей. Я занимаюсь разработкой на оборудовании Apple. Если вы тоже это делаете, возможно, вы добьетесь успеха, используя Postgres.app и Homebrew для установки Redis. В противном случае вы можете использовать Docker.
Если у вас есть опыт работы с другой платформой, оставьте заявку или сообщите о проблеме, и мы сможем добавить вашу платформу в README.
Кроме того, если то, что следует здесь, не имеет для вас смысла, откройте проблему, может быть, мы могли бы сделать скринкаст, чтобы продемонстрировать процесс, или, может быть, кто-то, кто хорош в этом, возьмется за это?
То, что я описываю ниже, — это только один из способов настроить среду разработки для запуска LCBO API на вашем компьютере. Если у других есть улучшения (для многих есть место, например, сценарий точки входа для загрузки базы данных разработчиков) или даже другие подходы, такие как использование Vagrant + VirtualBox, открытие проблемы или PR, я буду рад их добавить.
Если вы хотите помочь, я хочу дать вам возможность.
config/secrets.yml
и .env
Во-первых, вам нужно настроить некоторую конфигурацию, которой нет в общедоступном репозитории. Причина, по которой это делается, заключается в защите частных данных, таких как ключи API и секретные токены, а также в том, что некоторые разработчики могут предпочесть немного другие настройки в соответствии со своими личными предпочтениями и тому подобными вещами.
Вам нужно создать пару файлов: config/secrets.yml
и .env
. В репозитории есть версии шаблонов в config/secrets.yml.example
и .env.example
. Вы можете скопировать эти файлы, чтобы начать:
cp config/secrets.yml.example config/secrets.yml
cp .env.example .env
Если вы просто хотите загрузить приложение и получить к нему доступ локально, на этом этапе все будет хорошо. Если вы хотите использовать сканер и сохранить его снимок в Amazon S3, вам необходимо добавить свои учетные данные и корзину AWS в config/secrets.yml
.
Остальные настройки либо имеют значение только в производственной среде, либо фактически не используются, либо имеют значение только в том случае, если вам не нравятся настройки по умолчанию. Как всегда, если вам нужны разъяснения, открывайте и задавайте вопросы, и я буду рад помочь.
Сначала вам необходимо установить клиент Docker для вашей системы, об этом вы можете узнать здесь. После установки Docker вы можете приступить к делу:
Далее вам нужно будет построить контейнеры:
docker-compose build
Когда это будет сделано, вы можете загрузить все это, выполнив:
docker-compose up
На данный момент у вас нет никаких данных в базе данных, поэтому, если вы загрузите приложение http://localhost:3000, оно мало что сделает, в конце концов, оно обслуживает данные, а данных в нем нет. Итак, давайте что-нибудь с этим сделаем.
Идем дальше и закрываем контейнеры:
Ctrl-C
Это означает, что одновременно нажмите клавиши Control
+ C
Вы можете скачать архив последнего дампа производственной базы данных из моей личной учетной записи Amazon S3 здесь. Обратите внимание, что существуют конфиденциальные таблицы (адреса электронной почты, пользователи, ключи) и данные были исключены из этого файла.
Загрузите и распакуйте архив в каталог tmp
этого проекта:
cd tmp
curl -O https://heycarsten.s3.amazonaws.com/lcboapi-2019-01-21.tgz
tar xzf lcboapi-2019-01-21.tgz
cd ..
Размер файла составляет около 300 МБ, поэтому загрузка может занять некоторое время в зависимости от скорости вашего соединения (это происходит в строке, которая начинается с curl
).
После того, как вы загрузили и извлекли файл базы данных, вы можете загрузить данные в базу данных:
docker-compose run --rm app rake db:create
docker-compose run --rm app bash -c 'pv tmp/lcboapi-2019-01-21.sql | psql -q -h db -U $POSTGRES_USER $POSTGRES_DB > /dev/null'
Первая строка, заканчивающаяся на rake db:create
, создаст схемы базы данных в Postgres для разработки и тестирования, вторая строка загрузит дамп базы данных в базу данных разработки. Индикатор выполнения показывает, какой объем данных был передан в базу данных. Как только это завершится, будут построены индексы. Это может занять некоторое время в зависимости от вашего компьютера, это достаточно большой объем данных. Затем вы можете снова запустить приложение:
docker-compose up
На этом этапе вы также можете безопасно удалить архив и извлеченный файл SQL из вашего каталога tmp
.
Если вам утомительно набирать
docker-compose
снова и снова, изучите псевдонимы оболочки.Вы можете добавить строку псевдонима в свой профиль оболочки, например
alias dc=docker-compose
, а затем просто ввестиdc
вместо того, чтобы каждый раз вводитьdocker-compose
. ✅Подумайте о других псевдонимах, которые вы могли бы создать, чтобы еще больше улучшить эту ситуацию?
Теперь перейдите по адресу http://localhost:3000/products/438457.
Бум. На вашем компьютере работает API LCBO! ? ? ?
Когда вы закончите работу над приложением, просто нажмите Ctrl+C
чтобы все закрыть. В следующий раз, когда вам захочется поработать над этим снова, запустите docker-compose up
, и все готово!
Если вы добавите новый драгоценный камень в Gemfile
, вам потребуется переустановить пакеты и обновить зависимости. Docker довольно хорошо справляется с этой задачей: он может определить, когда изменяется Gemfile
, и знает, как пересобрать контейнер app
за вас.
Чтобы запустить консоль Rails и проверить объекты внутри приложения:
docker-compose exec app rails c
Как только это запустится, вы сможете делать такие вещи, как:
Получите первый продукт в базе данных:
Product.first
Найдите розничный магазин LCBO № 25 (мой местный магазин):
Store.find(25)
Если вы измените код в приложении, вам нужно будет выполнить reload!
команда в консоли, чтобы обновить изменения.
Внутри папки spec
вы найдете набор тестов для LCBO API. К сожалению, он не является всеобъемлющим, но и не так уж и плох. Всю свою карьеру я боролся за поддержку наборов тестов, которыми я доволен. Нам следует улучшить эти тесты!
Чтобы запустить набор тестов:
docker-compose exec app rspec
Вы увидите кучу зеленых точек .
, каждый из них представляет собой пройденный тестовый пример. Это хорошо. Если произойдет сбой, вы увидите красную букву F
, это плохо... ШУЧУ! На самом деле это хорошо! Тесты дают вам возможность изменить что-то в существующей кодовой базе и посмотреть, не вызываете ли вы какие-либо регрессии в существующей функциональности. Конечно, нет ничего идеального, но я могу вам сказать без сомнений: по опыту тесты — это хорошо.
По мере того, как приложения становятся все больше и больше и сложнее, отсутствие тестов становится настоящим кошмаром, а изменение вашего приложения и добавление функций становится чрезвычайно хрупким процессом. Такие вещи, как использование языков с системами типов и другие различные парадигмы программирования, также могут во многом помочь в этом, но я придерживаюсь мнения, что на самом деле нет замены, по крайней мере, надежному набору приемочных тестов.
Это часть API LCBO, которая делает все это возможным. Краулеры для сложных веб-сайтов сложно создавать и поддерживать. В первой версии LCBO API был полный набор тестов для сканера, но когда много лет назад все изменилось, я отказался от этой кодовой базы и просто создавал что-то так быстро, как только мог.
Логика сканера находится в lib/crawler.rb
, оттуда вы увидите все различные задачи, которые выполняются последовательно, чтобы обеспечить полное сканирование веб-сайтов LCBO.
Логика синтаксического анализатора находится в lib/lcbo.rb
и всех различных файлах внутри lib/lcbo/*
, включая все различные запросы, которые должны произойти, и код, отвечающий за преобразование данных из этих запросов в структурированные данные. это может в конечном итоге попасть в базу данных.
Я разработал сканер для последовательного выполнения запросов. Это очень хороший подход, когда вы сканируете один веб-сайт. Это просто для того, кто всегда может выбрать лучший маршрут, и это вежливо. Мы могли бы запустить n заданий AWS Lambda и просканировать каждую страницу LCBO.com за несколько секунд, но это было бы грубо, и мы, вероятно, на мгновение сделали бы DDoS-атаку на их веб-сайт, а это нехорошо.
/manager
)Сюда входит приложение Ember: когда вы регистрируетесь/входите в LCBO API и генерируете ключи API, вы взаимодействуете с этим. Это довольно устарело, я не пробовал его создавать. Я использую Ember с самого начала, поэтому, если у вас есть какие-либо вопросы по этому поводу, задавайте вопросы. На самом деле мне было бы очень приятно обсудить эту часть API LCBO и поработать со всеми вами над ее улучшением.
/static
) Здесь содержится сайт Middleman. Когда вы посещаете lcboapi.com, вы смотрите именно на него. Он также содержит очень маленькое (также устаревшее) приложение React — кнопку «Попробуй» в правой части главной страницы. У него есть собственный Gemfile и сценарий сборки static/generate
, при его запуске он создает сайт и синхронизирует изменения в public
папке. В приложениях Rails public
папка служит статическим содержимым.
В этой кодовой базе МНОГО тупиков, ветвей, которые прошли 40-60-80% пути к функции, а затем застопорились, эксперименты и т. д. Как всегда, если вы найдете что-то, что вам понравится? просто сообщите о проблеме, и я отвечу, как только смогу.
Также было бы здорово, если бы мы могли устранить некоторые тупики здесь, мне было бы очень интересно наконец добавить JSON:API и GraphQL. Текущий дизайн ответа API датируется 2008 годом!!! В каком-то смысле я удивлен, что никто никогда не жалуется на это.
Самая востребованная функция №1, которую я никогда не реализовал, - это категории, она вроде как здесь, я забыл, почему я никогда ее не выпускал, я не помню, какие финальные вещи должны были встать на свои места, но, возможно, это было бы неплохо для начала чем заняться? Есть также Producers и Origins, которые так и не завершились.
У меня также есть целая куча других репозиториев и небольших экспериментов, которые я проводил на протяжении многих лет. Меня всегда восхищала идея прогнозирования уровня запасов, где-то есть инструмент анализа дампов набора данных, написанный на Go, для анализа дампов CSV для конкретного запаса продукта. в течение определенного времени. Я был бы рад выпустить и этот материал, если есть интерес.
Я пока оставлю это здесь и подожду вашего ответа. Мне бы хотелось продолжать пополнять эту базу знаний любым способом, который люди хотят видеть (скринкасты, интервью, встроенная документация и т. д.). Я также хочу, чтобы вы делали то же самое, если вы не уверены, спросите. ❤️