Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

24.11.2022

😺⭐💎 Через відсутність світла робота не дуже йде. Почав як вправу маленький проєкт, який давно крутився в голові: GitHub Autostar

В чому суть. Всі ми любимо оцінювати проєкти на GitHub за кількістю зірок. Але ж хто ті зірки ставить? Я сам нечасто про це згадую. Тож виходить дивна асиметрична оцінка.

Щоб виправити цю ситуацію, я хочу зробити скрипт, який знаходить в моїх проєктах всі прямі залежності, що є на GitHub, та автоматично проставляє їм зірочки. Це можуть бути Ruby-геми, пакети NPM, модулі Go тощо. Навіть закладки чи нотатки. Так без зайвої ручної праці можна спрямити несправедливість оцінок.

Тепер трохи о реалізації: поки зробив прототип для Ruby. Спочатку ідея була така, щоб застосувати можливості Bundler для інтроспекції залежностей. Головна проблема з цим те, що щоб воно працювало, треба відтворити правильну версію Ruby для кожного проєкту, а також встановити всі залежності. (Також бракує документації по внутрішньому функціоналу Bundler.)

Тому схилився до статичного аналізу. Перша ідея: розбирати Gemfile. Але ж гемфайл — це фактично скрипт на Ruby, та хоч в гемфайлах зазвичай дотримуються визначеного формату, очікувати можна на все. Втім, знайти регулярками рядки вигляду gem "foo" досить просто.

Але потім нарешті роздивився структуру Gemfile.lock і знайшов там розділ, де перелічені прямі залежності проєкту (а саме, DEPENDENCIES.) Цей формат файлів створений для машинної обробки та — хоч він і не стандартний — прочитати його набагато легше, ніж Gemfile. Як результат, в робочих проєктах першим способом знайшлось 146 гемів, а другим - 150.

Після цього залишається звернутись до відкритого API RubyGems - https://rubygems.org/api/v1/gems/#{gem}.json та дізнатись домашню адресу кожного гему. А потім, перевірити, чи спрямована вона на GitHub.

Так отримав 128 репозиторіїв, що, порівняно зі 114 зірочками, що я поставив вручну за довгі роки користування Гітхабом, вже досить багато.

Наступні кроки — реалізація для інших мов, та пошук простого рішення для масової роздачі зірок.