Нам нужны твои мозги

Хотите расти как разработчик и найти крутую работу? Не протирайте штаны — займитесь Open Source проектами. Так легче всего попасть в лучшие команды разработчиков и положить себе в резюме настоящий проект, вместо нелепых «примеров кода». Но найти подходящий проект для участия сложно. Начинаются лень и отговорки, а за ними — отсутствие профессионального роста, критики по-настоящему крутых программистов, уныние и застой.

На Cult of Martians мы собираем интересные задачи для современных веб-программистов. Можно выбрать подходящую по сложности, продолжительности и специализации. Задачи не выдуманы «из воздуха» — каждая решает насущную проблему, и решить ее можно через создание нового Open Source проекта или улучшение существующего. Решайте задачи, прокачивайтесь, присылайте решение на оценку. Лучших могут пригласить к себе на работу компании, программистам которых понравится ваше решение.

Фронт: Добавить offset в SugarSS

Для новичков, задача на пару дней

PostCSS был переведен c line/column на offset.

Теперь надо такую же задачу сделать для [SugarSS], парсера альтернативного синтаксиса для PostCSS. Этот синтаксис строится на отступах — как Sass в SCSS. Поэтому он имеет другой парсер.

Польза: строка в резюме с PR в популярный проект.

Фронт: Добавить поддержку focusgroup в KeyUX

Для новичков, задача на пару дней

KeyUX — JS-библиотека, которая добавляет хороший UX работы с клавиатуры на сайт.

Один из паттерном — группы фокуса, когда :focus внутри какой-то группы (например, вкладок или меню) перемещается стрелками, а не Tab.

KeyUX добавялет такое поведение смотря на свойство role, но эти роли ограничены и не подходят для всех сценариев. В веб-сообществе есть идея добавить свойство focusgroup в спецификацию HTML для таких вещей.

Задача — добавить ограниченную поддержку focusgroup в дополнение к role.

Польза: строка в резюме, которая показывает знание технологий доступности в веб-разработке.

Фронт: Выводить время с последнего обновления caniuse-lite

Для новичков, задача на пару дней

Browserslist предупреждает, когда caniuse-lite (с базой браузеров) давно не обновляли.

Надо в это предупреждение добавить время с последнего обновления caniuse-lite. За время последнего обновления можно взять время последнего релиза браузера в базе данных.

Browserslist: caniuse-lite is 15 month old. Time to run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme

Польза: строка в резюме с PR в популярный проект.

Фронт: Выводить только часть строки в ошибке PostCSS

Для новичков, задача на пару дней

PostCSS, в случае синтаксической ошибки, показывает строку, где она произошла.

Но если это минифицированный CSS-файл, то всё его содержимое будет в одну строчку и ошибка заполняет весь экран консоли.

В таком случае надо выводить лишь 20 символов до начала ошибки и 20 символов после конца.

Польза: строка в резюме с PR в популярный проект.

Фронт: Попробовать перевести цветовой миксер OKLCH на @texel/color

Для новичков, задача на пару дней

Вышла новая библиотека для работы с цветов в JS.

Нужно попробовать перевести рендер графиков в цветовом миксере OKLCH на неё.

Польза: строка в резюме, которая показывает знание технологий доступности в веб-разработке.

Фронт: Добавить видео-пример в KeyUX

Для новичков, задача на пару дней

KeyUX добавляет на сайт обработку событий с клавиатуры, чтобы пользоваться сайтом с клавиатуры было удобнее.

У нас есть набор функций, но нет видео, которое бы показывало их в действии.

Нужно помочь сделать запись экрана.

Польза: строка в резюме, которая показывает знание технологий доступности в веб-разработке.

Фронт: Добавить историю в OKLCH Color Picker

Для новичков, задача на пару дней

Нужно добавить поддержку ⌘+Z и ⌘+Shift+Z в OKLCH Color Picker. Пользователь должен иметь возможность отменить и повторить последние изменение цвета.

Польза: строка в резюме с PR в популярный проект, которая показывает знание JS.

Фронт: Добавить поддержку Bun в Browserslist

Для новичков, задача на пару дней

Bun — альтернатива Node.js и npm. В том числе, она может устанавливать JS-зависимости, создавая свой собственный bun.lockb файл.

В Browserslist есть скрипт update-browserslist-db, который обновляет caniuse-lite в проекте, чтобы использовалась свежая база данных браузеров.

Сейчас update-browserslist-db поддерживает только npm, pnpm, yarn. Нужно добавить поддержку Bun.

Польза: строка в резюме с PR в популярный проект, которая показывает знание Node.js.

Фронт: Перевести Nano ID на Tinybench

Для новичков, задача на пару дней

Tinybench — минималистичная система бенчмарков для Node.js. Она отлично вписывается в философию Nano ID, так как имеет мало зависимостей.

Нужно попробовать перевести бенчмарк Nano ID с benchmark на tinybench.

Польза: строка в резюме с PR в популярный проект, которая показывает знание Node.js.

Фронт: Добавить поддержку большего количества элементов с role в KeyUX

Для новичков, задача на пару дней

KeyUX добавляет на сайт обработку событий с клавиатуры, чтобы пользоваться сайтом с клавиатуры было удобнее.

Например, он добавляет для списков с role="menu" (табы, меню навигации) навигацию стрелочками. Так, вместо огромного списка для Tab-навигации, у нас выделяются изолированные блоки, между которыми мы перемещаемся Tab-ом, а внутри — стрелочками.

Но такая навигация нужна не только role="menu", но и многим другим role (но у каждой немного отличается поведение, будьте внимательны).

Польза: строка в резюме, которая показывает знание технологий доступности в веб-разработке.

Фронт: Добавить горячий клавиши для списка в KeyUX

Для новичков, задача на пару дней

KeyUX добавляет на сайт обработку событий с клавиатуры, чтобы пользоваться сайтом с клавиатуры было удобнее.

Например, KeyUX автоматически находит, какую кнопку нужно нажать при нажатии горячий клавиши, в зависимости от aria-keyshortcuts у кнопок.

Сейчас KeyUX ищет самую первую кнопку с нужным aria-keyshortcuts, но это не работает для списка, где у каждого элемента своя кнопка с одной и той же горячей клавишей.

<li tabindex="0">
  Item 1
  <button aria-keyshortcuts="v">Validate</button>
</li>
<li tabindex="1">
  Item 1
  <button aria-keyshortcuts="v">Validate</button>
</li>

Польза: строка в резюме, которая показывает знание технологий доступности в веб-разработке.

Фронт: Добавить поиск элемента в KeyUX

Для новичков, задача на пару дней

KeyUX добавляет на сайт обработку событий с клавиатуры, чтобы пользоваться сайтом с клавиатуры было удобнее.

Например, он добавляет для списков с role="menu" (табы, меню навигации) навигацию стрелочками. Так вместо огромного списка для Tab-навигации у нас получается такие изолированные блоки — между которыми мы перемещаемся Tab-ом, а внутри стрелочками.

Но сейчас у нас нет одной удобной функции, которая требуется для role="menu".

Нужно чтобы, когда пользователь начал вводить первые буквы элемента списка, фокус переместился на этот элемент. Примерно, как работает <select> или Ariakit.

Польза: строка в резюме, которая показывает знание технологий доступности.

Фронт: Добавить в postcss-dark-theme-class поддержку light-dark()

Для новичков, задача на пару дней

postcss-dark-theme-class позволяет переключать тему сайта через установку HTML-класса в JS и описывать в CSS темную тему в @media (prefers-color-scheme: dark).

В CSS скоро добавится новый способ указывать варианты для светлой и темной темы через light-dark():

a {
  color: light-dark(black, white);
}

Нужно добавить в плагин поддержку этой новой функции, чтобы плагин генерировал CSS вида:

:where(html.is-dark) a {
  color: black;
}
:where(html.is-dark) a {
  color: white;
}

Польза: строка в резюме с PR в популярный проект.

Фронт: Переписать Size Limit на Vitest и ESM

Для новичков, задача на пару недель

Size Limit — это CLI-приложение для Node.js.

Сейчас оно использует CommonJS с require(). Нужно переписать его на ES-модули с import. Поскольку Jest плохо работает с ESM, нужно будет еще переписать тесты на Vitest.

Польза: строка в резюме, которая показывает знание Node.js.

Фронт: Добавить авто-исправление для ESLint-правила uvu/prefer-is-for-primitives

Для новичков, задача на пару дней

uvu — минималистичная система юнит-тестов для Node.js.

Для нее есть плагин для ESLint — eslint-plugin-uvu/. В этом плагине есть правило uvu/prefer-is-for-primitives; ему нужно добавить возможность авто-исправления кода при запуске eslint --fix.

Польза: строка в резюме, которая показывает знание ESLint.

Фронт: Добавить в eslint-plugin-uvu правило обнаружения забытого test.only

Для новичков, задача на пару дней

uvu — минималистичная система юнит-тестов для Node.js. Самый простой тест в ней выглядит так:

import { test } from 'uvu'

test('something', () => {})

test('another', () => {})

test.run()

Можно заставить uvu выполнять только один тест (например, для целей отладки), заменив test() на test.only(). Но легко потом забыть заменить test.only() на test() обратно.

Надо написать правило в eslint-plugin-uvu, которое будет предупреждать пользователя о забытом test.only(). Правило не надо делать auto-fixable, иначе во время отладки тестов test.only() будет убираться по сохранению файла.

Польза: строка в резюме, которая показывает знание ESLint.

Фронт: Добавить в eslint-plugin-uvu правило, которое будет обнаруживать забытый test.run()

Для новичков, задача на пару дней

uvu — минималистичная система юнит-тестов для Node.js. Самый простой тест в ней выглядит так:

import { test } from 'uvu'

test('something', () => {})

test('another', () => {})

test.run()

В конце каждого файла с тестами нужно писать test.run(), чтобы каждый файл теста был само-исполняемым файлом (node index.test.js). Но test.run() легко забыть.

Надо написать правило в eslint-plugin-uvu, которое будет предупреждать пользователя о забытом test.run().

Польза: строка в резюме, которая показывает знание ESLint.

Фронт: Сделать минималистичный плагин для ESLint для префикса node: в импортах

Для новичков, задача на пару дней

В Node.js можно добавлять node:-префикс, чтобы показать, что мы имеем в виду встроенный в Node.js модуль, а не npm-пакет.

import { writeFileSync } from 'node:fs'

Но при разработке легко забыть добавить этот префикс. Хочется иметь правило в ESLint, которое будет гарантировать, что префикс есть во всех нужных местах.

Такое правило есть в eslint-plugin-unicorn, но этот плагин идет с множеством лишних подзависимостей. Хочется иметь какое-то минималистичное решение.

Польза: строка в резюме, которая показывает знание ESLint.

Фронт: Добавить preferred-color-scheme: light в postcss-dark-theme-class

Для новичков, задача на пару дней

PostCSS-плагин postcss-dark-theme-class позволяет сделать темную и светлую тему для сайта полностью на CSS.

Для этого он копирует содержимое @media (preferred-color-scheme: dark) в html.is-dark.

Нужно добавить поддержку @media (preferred-color-scheme: light).

Польза: строка в резюме с PR в популярный проект.

Фронт: Ускорить OkColor

Для новичков, задача на неделю

OkColor — это Figma-плагин для работы с OKLCH.

Но этот color picker не использует оптимизации color picker’а Марсиан, поэтому работает медленно. В итоге автору пришлось снизить разрешение <canvas>, что заметно.

Нужно перенести оптимизации из color picker’а Марсиан и поднять разрешение.

Польза: строка в резюме, которая покажет знание API Figma и сложных JS-задач.

Фронт: Добавить поддержку BFcache в Nano Stores Persistent

Для уверенных в себе, задача на день

Nano Stores Persistent — умный стор, который синхронизирует данные с localStorage.

В современных браузерах есть Back-Forward Cache, который позволяет восстанавливать страницу из кэша при нажатии кнопок Назад/Вперед. Он сохраняет на диск снимок памяти страницы и при нажатии Назад мгновенно показывает страницу из кэша.

Но если на следующей странице пользователь изменил что-то в localStorage, то при нажатии Назад страница восстановится из кэша, но данные в умном сторе останутся старыми. Нужно добавить среду для тестирования и событие pageshow, которое будет доставать обновление из localStorage.

Польза: строка в резюме, которая доказывает знание продвинутых инструментов TypeScript.

Фронт: Добавить автовыведение типов в Nano Stores I18n

Для уверенных в себе, задача на неделю

Nano Stores I18n имеет функцию param() для создания строк перевода, в которых есть параметры:

export const messages = i18n('post', {
  published: params<{ at: string }>('Was published at {at}')
})

Сейчас нужно явно указывать (через <{ at: string }>), какие параметры есть в строке перевода.

Но новый TypeScript умеет парсить строки и выводить типы из них.

Польза: строка в резюме, которая доказывает знание продвинутых инструментов TypeScript.

Фронт: Починить параллельное выполнение скриптов в pnpm

Для уверенных в себе, задача на неделю

pnpm умеет выполнять скрипты параллельно (и даже дает крутой UI для объединения вывода):

❯ pnpm test
> pnpm run --recursive --include-workspace-root /^test:/

Scope: all 2 workspace projects
. test:js$ eslint .
└─ Running...
. test:styles$ stylelint **/*.css **/*.svelte
└─ Done in 640ms
. test:types$ tsc --noEmit
└─ Done in 72ms
. test:audit$ pnpm audit --prod
│ No known vulnerabilities found
└─ Done in 3s1s
web test:run$ c8 pnpm unit
└─ Done in 3.6s
│ • • • •   (4 / 4)
└─ Done in 3.1s
web test:check$ svelte-check
│ svelte-check found 0 errors and 0 warnings
└─ Done in 1.7s

Этот инструмент создавался в основном с прицелом на запуск одной и той же задачи в нескольких проектах монорепозитория (аргумент --recursive). Однако, его можно использовать и в одном проекте (--parallel), запуская задачи через регулярные выражения (/^test:/).

Не работают две вещи:

Польза: строка в резюме с PR в популярный проект.

Фронт: Обновить генерацию API для postcss.org

Для уверенных в себе, задача на неделю

Сайт PostCSS имеет страницу с API всех классов.

Мы генерируем эту страницу с помощью скрипта из AST TypeDoc. Но, недавно, генерация сломалась после того, как:

  1. Мы перешли на хитрый экспорт типов, чтобы починить TypeScript без breaking change.
  2. В новой версии TypeDoc немного поменялся AST.

Польза: строка в резюме с PR в популярный проект.

Фронт: Добавить линии на месте срезов на 3D-модель в цветовой миксер OKLCH

Для уверенных в себе, задача на неделю

Цветовой миксер OKLCH показывает отдельно 3D-модель цветового пространства и 3 среза. Хотелось бы соединить срезы с 3D-моделью.

Например, можно нарисовать тонкую линию на 3D-модели — там, где находятся текущие срезы.

Польза: строка в резюме с PR в популярный проект.

Фронт: Вернуть OffscreenCanvas в цветовой миксер OKLCH

Для уверенных в себе, задача на неделю

В цветовом миксере OKLCH самая долгая операция — рисование на <canvas>. Сейчас это происходит в том же потоке, в котором работает браузер, поэтому пользователь может видеть «фризы».

Задача состоит в том, чтобы добавить Web Worker и перенести рисование по <canvas> в OffscreenCanvas. Сложность в том, что браузер Safari до сих пор не поддерживает OffscreenCanvas: для него нужно будет сохранить старый подход с главным потоком.

Польза: строка в резюме с PR в популярный проект.

Фронт: Добавить паралелльный рендеринг в цветовой миксер OKLCH

Для уверенных в себе, задача на неделю

В цветовом миксере OKLCH самая долгая операция — рисование на <canvas>. Есть идея, как ее ускорить: несколько веб-воркеров будут генерировать ImageBitmap для своей части графика.

Польза: строка в резюме с PR в популярный проект.

Фронт: Решить проблему ромбовидных зависимостей в Nano Stores

Для уверенных в себе, задача на неделю

«Diamond problem», или проблема ромбовых зависимостей — это непредсказуемое поведение реактивных сторов, у которых зависимости строятся так:

┏━▶ C ━┓
┃      ▼
A      D
┃      ▲
┗━▶ B ━┛

В «правильных» системах, при изменении стора A, сначала пересчитываются сторы B и C, и только потом D.

В Nano Stores обнаружена проблема с тем, что при некоторых ситуациях пересчет идет непредсказуемо. Нужно разобраться и придумать решение.

Польза: строка в резюме с PR в популярный проект.

Фронт: Добавить 3D-версию пространства OKLCH

Для уверенных в себе, задача на неделю

В нашем цветом миксере OKLCH мы показываем цветовое пространство OKLCH в виде 3-х срезов. Но само пространство трехмерное. Хочется добавить 3D-отображение с возможностью покрутить его мышкой.

Польза: строка в резюме с PR в популярный проект.

Бэк: Альтернативная реализация gRPC сервера для AnyCable (PoC)

Для продвинутых, задача на пару дней

AnyCable использует gRPC для коммуникации между сервером веб-сокетов и Ruby приложением. Официальная библиотека для работы с gRPC в Ruby является сложной оберткой над библиотекой на C и имеет проблемы с поддержкой (отставание от версий Ruby, баги, которые медленно закрываются, регрессии производительности).

Компания Cookpad разрабатывает альтернативный SDK для работы с gRPC в Ruby: grpc_kit.

Задача — попробовать переписать RPC сервер AnyCable на grpc_kit.

Польза: познакомиться с AnyCable и gRPC, принести пользу сообществу.

Бэк: Добавить интеграцию с Doppler в Anyway Config

Для новичков, задача на неделю

Gem anyway_config предоставляет единый API для конфигурирования Ruby приложений из разных источников данных (YAML файлы, переменные окружения, Rails Credentials).

Doppler — это сервис для управления секретами, который позволяет командам держать конфигурационные данные в едином (и безопасном) месте.

Задача — добавить возможность загружать данные из Doppler в Anyway Config.

Польза: познакомиться с Anyway Config и Doppler, принести пользу сообществу.

Бэк: Поддержка партиционированных таблиц в Logidze

Для продвинутых, задача на пару дней

Logidze позволяет работать с версиями объектов Active Record моделей и историей их изменений, хранящейся в виде инкрементального лога в отдельной колонке таблицы БД.

Лог изменений генерируется автоматически с помощью триггеров в БД, а конкретно, с помощью BEFORE триггеров. К сожалению, данный тип триггеров не работает для партиционнированных таблиц.

Необходимо добавить альтернативный режим работы Logidze — через AFTER триггеры.

Польза: познакомиться с Logidze, погрузиться в PostgreSQL, принести пользу сообществу.

Бэк: Ruby Next: возможность перезаписывать оригинальный файл

Для новичков, задача на пару дней

Ruby Next — транспайлер для Ruby, который позволяет трансформировать новые синтаксические конструкции языка в совместимые со старыми версиями Ruby и альтерантивными имплементациями.

Один из режимов работы Ruby Next — это создание новых, транспилированных, файлов из исходных кодов с помощью CLI. Например:

$ ruby-next nextify lib/anycable/config.rb --single-version -o tmp/transpiled.rb -V
RubyNext core strategy: refine
RubyNext transpile mode: rewrite
Generated: tmp/transpiled.rb

В некоторых случаях удобнее не создавать новую копию файла, а переписывать оригинал. Необходимо добавить такую возможность.

Польза: познакомиться с Ruby Next, попрактивоваться в написании и тестировании CLI, принести пользу Ruby-сообществу.

Бэк: Добавить интеграцию с ejson в Anyway Config

Для новичков, задача на неделю

Gem anyway_config предоставляет единый API для конфигурирования Ruby приложений из разных источников данных (YAML файлы, переменные окружения, Rails Credentials).

EJSON — это библиотека для хранения конфигурации в зашифрованном виде прямо в репозитории, разрабатываемая Shopify. Функционал похож на Rails Credentials, но имеет важные отличия:

  • библиотека языко-независимая (используется CLI);
  • шифруются только значения, но не ключи; таким образом, уменьшается риск merge конфликтов и повышается читаемость.

Задача — добавить возможность загружать данные из ejson-файла в Anyway Config.

Польза: познакомиться с Anyway Config и EJSON, принести пользу сообществу.

Фронт: Добавить исправление проблем в Browserslist Lint

Для новичков, задача на неделю

Browserslist Lint — инструмент проверки конфига Browserslist на популярные ошибки.

Было бы хорошо добавить автоматическое исправление ошибок в JS API и использовать его на сайте Browserslist.

Как исправлять каждое правило:

  • missedNotDead: добавить not dead в конец запроса.
  • countryWasIgnored: добавить >0.3% в начало (или заменить другой запрос >x%).
  • limitedBrowsers: добавить в конец 2 versions, not dead.
  • alreadyDead: убрать найденные мёртвые браузеры.

Польза: строка в резюме с PR в популярный проект.

Фронт: Скрипт, который находит все указания цвета в CSS и переводит их на oklch()

Для новичков, задача на неделю

Нужно выпустить npm-пакет, который можно будет запустить через npx.

После запуска он будет проходить по всем переданным файлам, искать в них цвета в форматах типа #cc0000, rgb(255, 255, 255), hsl(0 10 10 / 0.2), и заменять их на цвет в формате oklch().

npx convert-to-oklch **/*.css

Польза: получить опыт работы с Node.js.

Фронт: Перевести postcss-load-config на uvu

Для новичков, задача на неделю

postcss-load-config использует Jest для юнит-тестов. Но из-за слабой поддержки ESM в Jest, проект не может добавить поддержку ESM-конфигов.

Нужно перевести проект на uvu.

Польза: строка в резюме с PR в популярный проект.

Фронт: Добавить правило для проверки цветового пространства в Stylelint

Для уверенных в себе, задача на пару недель

В новом CSS для указания цвета есть функции lch(), lab(), oklch() и oklab(). Проблема в том, что в этих функциях можно указать цвет, который не будет виден для глаза или для конкретного монитора. В Stylelint (линтер для CSS) надо добавить новое правило, чтобы предупреждать, что цвет вышел за пределы.

Цвета можно разделить на:

  1. Видимые на sRGB-мониторах (старые обычные цвета).
  2. Видимые на P3-мониторах. Таких мониторах сейчас очень мало. Правила с такими цвета надо оборачивать в @media (color-gamut: p3).
  3. Видимые на Rec2020-мониторах. Таких мониторов пока нет на рынке. Но на будущее их можно указать, обернув правила в @media (color-gamut: rec2020).
  4. Цвета, не видимые глазом человека.

Если цвет в невидимом спектре или вне sRGB, но не обернут в медиа-выражение — правило должно возвращать предупреждение.

Польза: строка в резюме с PR в популярный проект.

Фронт: Добавить automerge в CI node-build

Для новичков, задача на пару недель

node-build — скрипт для сборки версий Node.js. Он используется в разных менеджерах контроля версий Node.js, например, в asdf.

Когда выходит новая версия Node.js, бот nodenv-bot присылает PR в node-build с файлами новой версии. Есть пример такого PR. К сожалению, у мейнтейнеров может ути несколько дней, чтобы вмержить его.

Можно добавить скрипт в GitHub Action CI, который будет автоматически мержить PR от nodenv-bot после прохождения тестов.

Польза: получить опыт работы с CI.

Фронт: Добавить типы в culori

Для уверенных в себе, задача на пару недель

Нужно добавить типы в culori, библиотеку для работы с цветом.

Автор библиотеки хотел бы добавить типы не через .d.ts-файлы, а через JSDoc-комментарии в JS-файлах.

Польза: получить опыт работы с TypeScript.

Помогли
Alexander Baygeldin
 Alexander Baygeldin
Igor Platonov
 Igor Platonov
Maksim Shendrik
 Maksim Shendrik

Бэк: Создать Ruby gem для обнаружения потенциальных распуханий памяти

Для уверенных в себе, задача на неделю

Необходимо написать инструмент для Ruby-стека, который будет обнаруживать участки кода, способные вызвать memory bloat.

Польза: разобраться с тем, как Rails работает с I/O; написать инструмент, которым будет активно пользоваться Ruby-сообщество.

Фронт: Перевести logux.org на Vite

Для уверенных в себе, задача на пару недель

Сейчас logux.org использует Parcel для сборки сайта — он генерирует HTML-шаблон и ассеты, которые потом наполняет другой скрипт.

Нужно перевести проект на Vite — чтобы увеличить скорость сборки и уменьшить размер node_modules.

Польза: получить open source портфолио на Node.js.

Фронт: Перевести postcss.org на Vite

Для уверенных в себе, задача на пару недель

Сейчас postcss.org использует Parcel для сборки сайта — он генерирует HTML-шаблон и ассеты, которые потом наполняет другой скрипт.

Нужно перевести проект на Vite — чтобы увеличить скорость сборки и уменьшить размер node_modules.

Польза: получить open source портфолио на Node.js.

Фронт: Сократить количество зависимостей в Astroturf

Для новичков, задача на неделю

Astroturf страдает от большого количества зависимостей. В node_modules он занимает 18 МБ и загружает под сотню подзависимостей.

Кажется, что их не должно быть сложно почистить.

Польза: получить open source портфолио на Node.js.

Бэк: Поддержка окружений в Anyway Config

Для новичков, задача на пару дней

Альтернативное решение от @deflexor.

Гем anyway_config предоставляет единый API для конфигурирования Ruby приложений из разных источников данных (YAML файлы, переменные окружения, Rails Credentials).

Сейчас в геме есть поддержка окружений (development, production) только для Rails приложений (и только для загрузки данных из YAML файлов).

Однако понятие «окружения» имеет смысл не только в контексте Rails или даже других веб-фреймворков.

Предлагается добавить поддержку окружений в основную часть (а не только в Rails расширение).

Польза: познакомиться с Anyway Config, попробовать поработать с RBS (проект покрыт типами), принести пользу Ruby сообществу.

Бэк: GraphQL RuboCop: добавить коп для обнаружения неиспользуемых аргументов

Для новичков, задача на пару дней

rubocop-graphql — Ruby gem, проверяющий соответствие стилю код, использующий DSL graphql-ruby.

Необходимо реализовать коп UnusedArgument, предотвращающий объявление полей, не используемых в resolve.

Польза: научиться писать копы для rubocop, принести пользу Ruby-сообществу.

Фронт: Перевести Logux Server на pino 7

Для уверенных в себе, задача на пару недель

Нужно обновить pino в Logux Server. Главная проблема в том, что нужно переписать humanFormatter на Pino Transports.

Польза: получить open source портфолио на Node.js.

Фронт: Сделать минималистичный аналог lint-staged

Для новичков, задача на неделю

lint-staged позволяет запускать тесты/форматеры на измененных файлах в pre-commit-хуке.

Это отличный инструмент, но 7 МБ много для ее простой утилитарной функции. Хочется иметь минималистичный аналог, пусть и ценой потери функционала.

Что аналог должен уметь:

  1. Ваш инструмент будет запускать, например, simple-git-hooks.
  2. Инструмент находит, какие файлы изменены в коммите.
  3. Инструмент берет конфиг и получает список команд для паттерна файлов вида "*.js": ["eslint", "prettier"].
  4. Запускает указанные команды.

Чем можно пожертвовать:

  1. Поиском конфига. Пусть путь к конфигу будет указываться в конфиге simple-git-hooks вида "pre-commit": "./node_modules/.bin/nano-staged ./package.json".
  2. Поддержкой частично добавленных файлов, когда коммитят только несколько строк через git add -p — для них можно не запускать скрипты (предупредив об этом в документации и в выводе в консоль при коммите).
  3. Вывод в терминал можно сделать сильно проще.
  4. Можно даже просить пользователя указать прямой путь к исполняемому файла обработчика: "*.js": "./node_modules/.bin/prettier".

Задача — создать новый проект минималистичного аналога lint-staged.

Польза: получить open source портфолио на JS.

Фронт: Добавить частичную загрузку переводов Nano Stores I18n

Для новичков, задача на неделю

Сейчас Nano Stores I18n загружает все переводы для выбранного языка сразу. Разработчик должен передать функцию вида:

get (locale) {
   return fetch(`/translations/${locale}.json`)
}

Но было бы круто иметь тут опциональный аналог tree-shaking, чтобы грузить переводы блоками — только те блоки, который нужны для используемых на странице компонентов.

Например, разработчик может ввести правило давать имена компонентам (которые используются в функции перевода) вида main/post или settings/user. Переводы он тоже будет хранить блоками, объединяя компоненты с одинаковым префиксом: translations/ru/main.json или translations/settings/ru.json.

В get I18n будет передавать имена всех компонентов, для которых не хватает перевода. Тогда разработчик может передать такую функцию:

get (locale, components) {
   return Promise.all(
    components
      .map(name => name.split('/')[0])
      .unique()
      .map(chunk => fetch(`/translations/${locale}/${chunk}.json`))
  )
}

Польза: получить open source портфолио на JS.

Фронт: Добавить прeпроцессоры в Nano Stores I18n

Для новичков, задача на неделю

Nano Stores I18n — библиотека для перевода приложений.

Есть интересная идея: добавить процессоры в переводы. Например, на базе этих препроцессоров можно сделать смену перевода при смене ширины экрана.

// stores/i18n.js
import { atom, onMount } from 'nanostores'
import { createI18n, sizePreprocessor } from '@nanostores/i18n'

const screenSize = atom('big')
onMount(screenSize, () => {
  let media = window.matchMedia('(min-width: 600px)')
  function check () {
    screenSize.set(media.matches ? 'big' : 'small')
  }
  media.addEventListener('change', check)
  () => {
    media.removeEventListener('change', check)
  }
})

size.setSource(screenSize)

export const i18n = createI18n(locale, {
  get:,
  preprocessors: [
    sizePreprocessor
  ]
})

Надо отправить PR в Nano Stores I18n с реализацией препроцессоров.

Польза: получить open source портфолио на JS.

Фронт: Перевести Browserslist с Jest на uvu

Для новичков, задача на неделю

Я медленно начал переводить свои проекты на фреймворк тестов uvu. Предлагается помочь с переходом репозитория Browserslist на uvu.

Польза: строка в резюме с PR в популярный проект.

Фронт: Перевести PostCSS с Jest на uvu

Для новичков, задача на неделю

Я медленно начал переводить свои проекты на фреймворк тестов uvu. Предлагается помочь с переходом репозитория PostCSS на uvu.

Польза: строка в резюме с PR в популярный проект.

Бэк: Поддержка Action Policy для гема ckeditor

Для новичков, задача на пару дней

Гем ckeditor позволяет легко и просто интегрировать популярный WYSIWYG текстовый редактор CKEditor в Ruby on Rails приложения.

Данная интеграция в том числе позволяет прикреплять картинки и произвольные файлы к тексту, что требует установки защиты на стороне сервера — авторизации.

Сейчас гем ckeditor предлагает из коробки интеграции с такими библиотеками, как Pundit и CanCanCan. Помимо них в мире Ruby есть ещё один инструмент для авторизации, который набирает популярность, — Action Policy.

Предлагается добавить поддержку Action Policy в гем ckeditor.

Польза: познакомиться с CKEditor и Action Policy, принести пользу Ruby сообществу.

Фронт: Добавить плагин @size-limit/esbuild

Для новичков, задача на неделю

Когда Size Limit проверяет размер библиотеки, он собирает ее с помощью webpack, чтобы оценить влияние добавления библиотеки на webpack-проект.

Но esbuild становится все популярнее. К тому же, он весит меньше, работает быстрее и позволяет получить оценку размера, которая все равно будет применима и для webpack-проекта (с небольшой погрешностью).

Нужно создать плагин для Size Limit, который будет использовать esbuild вместо webpack.

Польза: строка в резюме с PR в популярный проект.

Фронт: Уменьшить размер @size-limit/webpack

Для новичков, задача на неделю

Сейчас @size-limit/webpack весил 70 МБ. Большая часть размера идет от функций, которые очень редко нужны — опции --why и поддержки CSS.

Нужно вынести их в отдельные плагины @size-limit/webpack-why и @size-limit/webpack-css.

Польза: строка в резюме с PR в популярный проект.

Фронт: Не парсить CSS при «холостом» запуске PostCSS

Для новичков, задача на неделю

Разработчики часто допускают ошибку в настройке сборки и запускают PostCSS без плагинов или опции parser и stringifier. В этом случае PostCSS ничего полезного не делает, но потребляет ресурсы на ненужный парсинг CSS.

Сейчас в таком случае мы предупреждаем разработчиков о ненужной работе. Но они жалуются, что часто ошибку в настройке допустили авторы инструментов, а сами уже не могут ничего исправить.

Мы можем убрать это предупреждение, если ничего не будем делать в этом случае.

Польза: строка в резюме с PR в популярный проект.

Фронт: Добавить цветовое кодирование случайных ID в логах Logux Server

Для новичков, задача на неделю

В логах Logux Server есть много длинных полуслучайных кодов, которые надо между собой сравнивать:

  • ID клиента вида 10:FnXaqDxY.
  • Action ID вида 1487805099387 10:FnXaqDxY 0 (в середине содержит ID клиента).
  • action.id у action с type logux/processed и logux/undo.

Нужно добавить цветовой код (например, 3 цвета на ID клиента и 5 цветов на Action ID), чтобы можно было быстро искать связанные записи в логе.

Задача требует дизайн-похода: не просто реализовать код, а попробовать разные варианты, чтобы найти самый полезный.

Польза: получить open source портфолио на Node.js.

Фронт: Добавить очереди в Logux Server

Для уверенных в себе, задача на пару недель

Logux Server по WebSocket получает набор операций от клиента, и для каждой операции вызывает callback, переданный разработчиком.

Сейчас обработка всех операций идет паралелльно. Но часто операции связаны: например, сначала может быть операция создания пользователя, а потом — операция смены прав у этого же пользователя. При паралелльной обработке операция смены прав может не найти пользователя, так как операция его создания идет паралелльно.

Нужно добавить последовательную обработку операций в виде очереди.

Задача сложная — требует изменить несколько проектов и хорошо продумать все необычные сценарии.

Польза: получить open source портфолио на Node.js.

Фронт: Уменьшить количество зависимостей в yaspeller

Для новичков, задача на неделю

Yaspeller позволяет проверить орфографию в документации проекта через сервисы Яндекса.

Он занимает в node_modules 3,6 МБ, что много для такого простого инструмента.

Кажется, что можно легко уменьшить размер раза в 2, проанализировав зависимости.

Польза: получить open source портфолио на Node.js.

Бэк: k6 jslib: хелперы для Rails

Для новичков, задача на пару дней

k6 – это современный инструмент для нагрузочного тестирования, написанный на Go и использующий JavaScript для описания тестовых сценариев. Из коробки k6 позволяет работать с WebSocket’ами, однако, тестирование Action Cable и AnyCable сценариев получается очень многословным. Для решения этой проблемы было написано расширение xk6-cable.

Однако, далеко не всю функциональность имеет смысл портировать в Go, иногда для тестирования Rails-приложений могут понадобиться простые хелперы. Для распространения JavaScript-хелперов, разработчики k6 используют jslib.k6.io. Мы предлагаем добавить новый пакет с хелперами для jslib.k6.io.

Польза: разобраться в том, как устроен k6 и его экосистема расширений, принести пользу Rails сообществу.

Бэк: xk6-cable: поддержка асинхронных проверок

Для новичков, задача на пару дней

k6 – это современный инструмент для нагрузочного тестирования, написанный на Go и использующий JavaScript для описания тестовых сценариев. Из коробки k6 позволяет работать с WebSocket’ами, однако, тестирование Action Cable и AnyCable сценариев получается очень многословным. Для решения этой проблемы было написано расширение xk6-cable.

Сейчас xk6-cable поддерживает только синхронное тестирование, но иногда асинхронность все же может понадобиться (например для дополнительной проверки сообщений из соседних каналов). Мы предлагаем добавить метод channel.on_message(callback), который добавит callback для асинхронной проверки всех приходящих в канал сообщений.

Польза: получить опыт работы с Go, разобраться в том, как устроен k6 и его экосистема расширений, принести пользу Rails сообществу.

Бэк: Добавить поддержку desc сортировки в Ruby gem graphql-connections

Для новичков, задача на несколько дней

graphql-connections — Ruby gem, расширяющий стандартные имплементации пагинаций GraphQL Ruby.

В текущей версии для пагинации Stable поддерживается только :asc сортировка в режиме :primary_key. Необходимо добавить поддержку :desc сортировки.

Польза: разобраться с устройством graphql-ruby, прокачаться в Ruby, принести пользу сообществу.

Фронт: Исследовать причину двойной загрузки настроек Tailwind с PostCSS

Для новичков, задача на неделю

Если в конфиге PostCSS написать tailwindcss() вместо tailwindcss, то плагин будет инициироваться много раз, что плохо влияет на производительность.

Надо исследовать причину такого поведения и предложить решение.

Польза: строка в резюме с PR в популярный проект.

Бэк: wsdirector: поддержка JSON сценариев

Для новичков, задача на пару дней

WebSocket Director — это инструмент для выполнения сценариев взаимодействия WebSocket-клиентов с сервером.

Сейчас он поддерживает сценарии в только формате YAML, что удобно для работы с небольшими сценариями и при их ручном написании.

Однако YAML имеет несколько недостатков:

  • Автоматическая генерация, как правило, требует использования дополнительных библиотек.
  • Формат плохо подходит для передачи контента в командной строке.

С обеими этими проблемами с лёгкостью справляется JSON.

Предлагается добавить поддержку сценариев в формате JSON, передаваемых как в качестве файлов, так и через опцию CLI.

Польза: поэкспериментировать с вебсокетами и CLI-утилитами, принести пользу Ruby сообществу.

Фронт: AnyCable JS: поддержка тестирования

Для новичков, задача на пару дней

Недавно выпущенная библиотека AnyCable JS является альтернативой стандартному пакету из Rails (@rails/actioncable). Она предоставляет более современный API и новые возможности для написания WebSocket-приложений, использующих Action Cable или AnyCable.

В AnyCable JS понятие канала абстрагировано от транспортного слоя (сокетов), что позволяет рассматривать классы каналов как обычные JS-классы. В свою очередь, это открывает возможности для создания инструментов unit-тестирования каналов — это мы и предлагаем попробовать реализовать.

Польза: получить опыт работы с JS/TS, разобраться в том, как устроены клиентские библиотеки для работы с Action Cable, принести пользу Rails-сообществу.

Бэк: AnyCable Rack: поддержка Protobuf

Для новичков, задача на неделю

AnyCable Rack Server — это реализация AnyCable WebSocket-сервера на Ruby, предназначенная для использования в локальном или тестовом окружении.

Одна из целей создания этого проекта — упростить проведение экспериментов с новым функционалом для AnyCable (так как не требует инфраструктурных изменений и вмешательства в код библиотек на других языках).

Сейчас AnyCable предоставляет большое количество функций помимо стандартного набора из Action Cable. В частности, поддержку бинарных протоколов: Msgpack и Protobuf.

Данные форматы уже поддерживаются [AnyCable Client][] из коробки, однако в AnyCable Rack Server есть только поддержка Msgpack. Требуется добавить поддержку Protobuf.

Польза: получить опыт работы с Google Protocol Buffers в Ruby, узнать получше, как работает AnyCable, принести пользу Ruby сообществу.

Бэк: Ruby Next: поддержка IRB/Pry

Для новичков, задача на неделю

Ruby Next — транспайлер для Ruby, который позволяет трансформировать новые синтаксические конструкции в совместимые со старыми версиями Ruby и альтерантивными имплементациями.

Сейчас Ruby Next позволяет транспилировать синтаксис в двух режимах: в рантайме и используя прекомпилированные файлы. Однако, есть один вариант выполнения Ruby кода, который сейчас не поддерживается — внутри интерактивной консоли (IRB или Pry).

Требуется добавить расширения для IRB и Pry, которые позволят использовать Next синтаксис при выполнении кода внутри консоли.

Польза: узнать, как работают IRB и Pry, познакомиться с миром транспайлеров, принести пользу Ruby-сообществу.

Бэк: wsdirector: поддержка циклов

Для новичков, задача на пару дней

WebSocket Director — это инструмент для выполнения сценариев взаимодействия WebSocket-клиентов с сервером. Он позволяет описывать последовательность действий и ожиданий в текстовом формате (YML), создавать сразу несколько соединений и следить за результатами выполнения. Используется для blackbox-тестирования и в качестве вспомогательного инструмента при разработке.

Зачастую сценарии содержат повторяющиеся шаги: отправить сообщение, получить ответ, отправить еще раз и т.д.

Предлагается добавить новую директиву loop для оптимизации подобных последовательностей.

Польза: поэкспериментировать с вебсокетами и CLI-утилитами, принести пользу Ruby сообществу.

Фронт: Создать проект nanocolors-template

Для новичков, задача на неделю

Надо сделать npm-пакет, который расширяет Nano Colors парсером строки с особым языком для указания цвета:

import { colorize } from "nanocolors-template";

colorize`
CPU: {red ${cpu.totalPercent}%}
RAM: {green ${(ram.used / ram.total) * 100}%}
DISK: {yellow.bold ${(disk.used / disk.total) * 100}%}
`;

Польза: получить open source портфолио на Node.js.

Фронт: Добавить поддержку Yarn 3 в Browserslist

Для новичков, задача на неделю

С Browserslist можно использовать команду команду npx browserslist --update-db, чтобы обновить версию caniuse-lite в текущем проекте. Эта команда не поддерживала Yarn 2.

В Yarn 3 добавили команду yarn up -R caniuse-lite, которая сама может обновить все вложенные зависимости.

Польза: строка в резюме с PR в популярный проект.

Фронт: Починить ::file-selector-button в Autoprefixer

Для новичков, задача на неделю

Autoprefixer неправильно обрабатывает ::file-selector-button. На входящий CSS:

input::file-selector-button {
  color: black;
}

input:hover::file-selector-button {
  color: white;
}

Autoprefixer выдает:

input:hover::-webkit-file-upload-button {
  color: white;
}

input:hover::file-selector-button {
  color: white;
}

input:hover::file-selector-button {
  color: white;
}

Хотя должен:

input::-webkit-file-upload-button {
  color: black;
}

input::file-selector-button {
  color: black;
}

input:hover::file-selector-button {
  color: white;
}

input:hover::file-selector-button {
  color: white;
}

Польза: строка в резюме с PR в популярный проект.

Фронт: Расследовать странную ошибку в PostCSS

Для новичков, задача на неделю

PostCSS 8.1 неправильно обрабатывает CSS:

.stuff {
  .foo {
    svg {
      display: none;
    }
    .bar {
      display: inline;
    }
  }
}

Получается:

.stuff .foo .stuff svg {
  display: none;
}
.stuff .foo .stuff .bar {
  display: inline;
}

А должно:

.stuff .foo svg {
  display: none;
}
.stuff .foo .bar {
  display: inline;
}

Польза: строка в резюме с PR в популярный проект.

Фронт: Уменьшить количество вложенных зависимостей Size Limit

Для новичков, задача на неделю

У Size Limit используется больше 100 под-зависимостей. Согласно npm.anvaka.com, большинство под-зависимостей идут от read-pkg-up и ora, которые не настолько полезны, чтобы мириться с таким их количеством.

Нужно заменить их на аналоги.

Польза: получить open source портфолио на Node.js.

Фронт: Стабилизировать тесты в Nano ID

Для новичков, задача на неделю

Nano ID генерирует случайные ID, поэтому случайность влияет на тесты. В итоге, иногда не вызывается строка 50 в async/index.js, и тесты падают из-за недостаточного покрытия.

Не хочется снижать критерий на покрытие тестами. Лучше подобрать такие параметры длины алфавита, чтобы строка вызывалась чаще.

Польза: получить open source портфолио на Node.js, строка в резюме с PR в популярный проект.

Фронт: Исправить глубокую вложенность в postcss-nested

Для новичков, задача на неделю

postcss-nested неправильно работает с 3-м уровнем вложенности:

.text {
  &:hover {
    border-color: red;
    &:before {
      color: red;
    }
  }
}

Польза: получить open source портфолио на Node.js, строка в резюме с PR в популярный проект.

Фронт: Добавить dir-dependency в postcss-mixins

Для новичков, задача на неделю

Сообщение dir-dependency используется PostCSS-плагинами, чтобы сообщить сборщику о том, что нужно следить за добавлением файлов в папке. Например, потому что плагин читает из папки список миксинов.

result.messages.push({
  type: "dir-dependency",
  plugin: "postcss-import",
  dir: "/imported",
  glob: "**/*.css",
  parent: result.opts.from,
});

Плагин postcss-mixins использует только сообщение depenency для использованных файлов, но не dir-dependency для папок, где он ищет файлы с миксинов.

Польза: получить open source портфолио на Node.js, строка в резюме с PR в популярный проект.

Фронт: Создать webpack-плагин для Web Manifest

Для новичков, задача на неделю

Web Manifest — это JSON-файл, который описывает иконки и настройки для интеграции веб-приложения в браузер и ОС.

Из-за ссылок на иконки, нельзя взять просто статичный JSON-файл — ссылки на иконки надо взять из webpack, чтобы они содержали cache buster и прошли через loader’ы.

Польза: получить open source портфолио на Node.js.

Фронт: Уменьшить размер зависимостей в lint-staged

Для новичков, задача на неделю

lint-staged со всеми зависимостями занимает 21 МБ на диске:

$ mkdir test && cd test
$ yarn add lint-staged
$ du -sh node_modules
21M	node_modules

Главная причина — огромное, глубокое дерево зависимостей.

Задача — заменить зависимости с кучей подзависимостей на минималистичные альтернативы. Совсем простые зависимости реализовать заново в проекте.

Польза: получить open source портфолио на Node.js, строка в резюме с PR в популярный проект.

Фронт: Проверять наличие прямой зависимости postcss в postcss-loader

Для новичков, задача на неделю

В старых версиях postcss-loader, postcss была в зависимостях пакета. Теперь она в peerDependencies — пользователь должен поставить postcss сам в свой проект паралелльно с postcss-loader.

Многие пользователи пропустили это в списке изменений postcss-loader. Из-за особенностей работы npm, у них может устанавливаться postcss неожиданных версий. Часто это оказывается старая PostCSS 7, которая отказывается работать с новыми плагинами и путает пользователей.

Можно улучшить опыт разработчиков с помощью дополнительной проверки:

  1. Если версия postcss().version 7, то пытаемся найти package.json.
  2. package.json можно искать только в текущей папке (process.cwd()).
  3. Если в package.json нет postcss в dependencies или devDependencies, то выводим ошибку, требуя явно установить postcss.
  4. Если postcss в прямых зависимостях есть, то ставим глобальный флаг, чтобы не запускать проверку снова.

Польза: получить open source портфолио на Node.js, строка в резюме с PR в популярный проект.

Фронт: Сгруппировать классы и функции в Logux API по блокам

Для новичков, задача на неделю

На сайте Logux есть раздел с API веб-клиента и node-сервера. Сейчас боковое меню разбито на категории: классы, функции, переменные.

API-страницы можно сделать удобнее для изучения Logux, если сгруппировать классы и функции по смыслу. Например:

  • Node API: Server, Tests, Core, Others.
  • Web API: State, React, Vue, Client, Tests, Core, Others.

Польза: получить open source портфолио на Node.js.

Фронт: Минималистичный npm-пакет для установки precommit-хука

Для новичков, задача на неделю

В сообществе разработчиков есть много инструментов для установки Git-хуков. Хуже и лучше, медленнее и быстрее, некоторые с существенными ограничениями. Например, марсиане создали быстрый и фичастый Lefthook, который мы используем в коммерческих проектах, больших и маленьких.

Возникла идея создать альтернативу средству с максимальными возможностями: микро-менеджер Git-хуков, для «легких» frontend open source проектов. Под капотом — лишь запуск lint-staged. Без парсинга конфигов в рантайме, с минимумом или совсем без зависимостей и лишь парой дополнительных строк в package.json:

  "simple-pre-commit": "npx lint-staged",

Польза: внести вклад в дело уменьшения коллективного размера node_modules. Получить open source портфолио на Node.js.

Фронт: Убрать Yargs из Logux Server

Для новичков, задача на неделю

Сейчас Logux Server использует Yargs, чтобы работать с CLI-аргументами и выводить --help.

Но у Yargs некрасивый вывод --help — хочется, как минимум, разделить блоки цветом.

Кроме CLI-аргументов, Logux Server получает настройки через переменные среды и опции JS API. Хочется упростить код, совместив обработку всех элементов.

Польза: получить open source портфолио на Node.js.

Бэк: Добавить поддержку кэширования AST запроса в Ruby gem graphql-ruby-persisted_queries

Для новичков, задача на несколько дней

graphql-ruby-persisted_queries — реализация механизма persisted queries для graphql-ruby, которая позволяет клиенту отправлять хэш GraphQL запроса вместо его полного текста.

В текущей реализации библиотека кэширует только текст запроса. Необходимо добавить возможность кэширования результата разбора запроса и придумать, как заставить среду исполнения пропустить шаг разбора.

Польза: разобраться с устройством graphql-ruby, прокачаться в Ruby, принести пользу сообществу.

Бэк: Добавить поддержку #read_multi в Ruby gem graphql-ruby-fragment_cache

Для уверенных в себе, задача на неделю

graphql-ruby-fragment_cache — Ruby gem, позволяющий кэшировать части ответа на GraphQL запрос.

В текущей реализации библиотеки чтение из кэша происходит в момент разрешения закэшированного поля. Такой подход не является оптимальным в случаях, когда для выполнения запроса необходимо произвести несколько обращений к кэшу. Вместо этого, стоит объединять все обращения в один запрос.

Польза: разобраться с устройством graphql-ruby, прокачаться в Ruby, принести пользу сообществу.

Фронт: Добавить подсветку .browserslistrc в GitHub

Для новичков, задача на неделю

У Browserslist есть свой конфиг, в файлах  .browserslistrc или browserslist.

Нужно добавить подсветку синтаксиса для этого конфига в GitHub.

# Comment
defaults

# Not keyword
not dead

# Market share with %
> 10%
< 1.5% in US
>= .5%

# Rare queries
maintained node versions
supports es6-module

# Extend keyword
extend @company/browserslist-config

# Direct versions
Chrome 50
Firefox ESR
Safari TP
OperaMini all

# Block header
[production]
# and keyword
Edge > 40 and Edge < 43
# or/, keywords
IE 11 or IE 10, ie 9

Польза: добавить строку в резюме с PR в популярный проект.

Фронт: Добавить подсветку .browserslistrc в VS Code

Для новичков, задача на неделю

У Browserslist есть свой конфиг, в файлах  .browserslistrc или browserslist:

# Comment
defaults

# Not keyword
not dead

# Market share with %
> 10%
< 1.5% in US
>= .5%

# Rare queries
maintained node versions
supports es6-module

# Extend keyword
extend @company/browserslist-config

# Direct versions
Chrome 50
Firefox ESR
Safari TP
OperaMini all

# Block header
[production]
# and keyword
Edge > 40 and Edge < 43
# or/, keywords
IE 11 or IE 10, ie 9

Нужно добавить подсветку синтаксиса для этого конфига для Visual Studio Code. Как минимум, нужно подсветить:

  1. Комментарии (начинаются с #).
  2. Номера версий (включая all, esr и tp).
  3. Проценты (50%, 0.5%, .5%).
  4. Ключевые слова (not, and, or, extends и ,).
  5. Имена браузеров.
  6. Заголовки ([production]).

Задача «творческая»: дополнения к этому списку или другие подходы к подсветке приветствуются.

Польза: получить опыт разработки для VS Code, добавить строку в резюме с инструментом для популярного проекта.

Фронт: Добавить поддержку process.env.NODE_ENV в dual-publish

Для новичков, задача на неделю

Многие JavaScript-библиотеки используют process.env.NODE_ENV, чтобы включать инструменты разработчика или дополнительные проверки на этапе разработки:

if (process.env.NODE_ENV !== "production") {
  heavyArgsCheck(args);
}

Webpack и другие сборщики умеют вырезать такие конструкции в фронтенд-библиотеках. Но новые сборщики созданные с прицелом на ES-модулей полагаются на package.exports.production вместо process.env.NODE_ENV.

Нужно добавить в dual-publish конвертацию process.env.NODE_ENV в package.exports.production.

Польза: расширить open source портфолио в Node.js.

Фронт: Выводить изменения в списке браузеров после browserslist --update-db

Для новичков, задача на неделю

Browserslist использует caniuse-lite как базу данных актуальных браузеров. Эту базу данных надо регулярно обновлять; есть команда npx browserslist --update-db, которая сама обновляет версию базы данных в lock-файле.

Но многие пользователи волнуются о том, как обновление может повлиять на поддержку браузеров. Хочется добавить сравнение «было/стало»:

Current version: 1.0.30001148
New version: 1.0.30001154
Removing old caniuse-lite from lock file
Installing new caniuse-lite version
$ yarn install
caniuse-lite has been successfully updated

Target browser changes:
- chrome 67
+ chrome 80

Польза: расширить open source портфолио в Node.js, добавить строку в резюме с PR в популярный проект.

Фронт: Сохранять порядок правил в postcss-nested

Для новичков, задача на неделю

В экосистеме PostCSS есть плагин postcss-nested для добавления в CSS синтакса вложенных правил (в духе SCSS).

Сейчас postcss-nested некорретно работает, если другие свойства идут после вложенного правила.

.foo {
  a: 1;
  &bar {
    b: 2;
  }
  b: 1;
}
.foo {
  a: 1;
  b: 1;
}
.foobar {
  b: 2;
}

В этом примере b: 1 из .foo после компиляции оказалось выше b: 2 из .foobar.

Правильный результат:

.foo {
  a: 1;
}
.foobar {
  b: 2;
}
.foo {
  b: 1;
}

Польза: получить open source портфолио на Node.js, строка в резюме с PR в популярный проект.

Бэк: GraphQL RuboCop: добавить коп для проверки заполнения описаний типов

Для новичков, задача на пару дней

rubocop-graphql — Ruby gem, проверяющий на соответствие стилю код, использующий DSL graphql-ruby.

Необходимо реализовать коп ObjectDescription, проверяющий, что для всех типов (включая мутации, подписки, резолверы) заполнено описание (метод description).

Польза: научиться писать копы для rubocop, принести пользу Ruby–сообществу.

Бэк: GraphQL RuboCop: добавить коп для проверки использования :hash_key

Для новичков, задача на пару дней

rubocop-graphql — Ruby gem, проверяющий на соответствие стилю код, использующий DSL graphql-ruby.

Необходимо реализовать коп FieldHashKey, проверяющий, что при объявлении поля везде, где возможно, используется опция :hash_key.

Польза: научиться писать копы для rubocop, принести пользу Ruby–сообществу.

Бэк: GraphQL RuboCop: добавить коп для обнаружения полей, которые можно вынести в отдельный тип

Для новичков, задача на неделю

rubocop-graphql — Ruby gem, проверяющий соответствие стилю код, использующий DSL graphql-ruby.

Необходимо реализовать коп ExtractType, предлагающий вынести поля с одинаковым префиксом в отдельный тип.

Польза: научиться писать копы для rubocop, принести пользу Ruby-сообществу.

Бэк: RuboCop RSpec: поддержка сторонних расширений DSL

Для уверенных в себе, задача на неделю

‎RuboCop RSpec — Ruby gem, проверяющий каноничность и соответствие стилю код тестов, написанных с использованием фреймворка RSpec. Многие проверки ориентируются на стандартные методы из RSpec DSL (например, it, context и т.д.). Этого недостаточно, если пользователь определяет псевдонимы (aliases) или использует сторонние гемы, расширяющие базовый функционал RSpec.

Например, если пределить псевдоним к it, story, то RuboCop RSpec может ошибочно определить группу примеров (example group) как не содержащую ни одного теста.

Необходимо добавить возможность расширять набор распознаваемых RuboCop RSpec методов через YML конфигурацию и обновить существующие копы.

Польза: познакомиться с работой расширений RuboCop, прокачаться в Ruby, принести пользу сообществ‎у.

Бэк: Добавить поддержку полиморфных типов в Ruby gem StoreModel

Для уверенных в себе, задача на неделю

StoreModel — Ruby gem, позволяющий работать с JSON-колонками как с объектами, очень похожими на обычные ActiveRecord модели.

Необходимо добавить в StoreModel полиморфные типы, которые будут оборачивать значение из JSON в нужный класс–обертку согласно условиям.

Польза: познакомиться с работой атрибутов в Rails, прокачаться в Ruby, принести пользу сообществу.

Бэк: Lefthook: добавить сегментированный вывод

Для новичков, задача на пару дней

Lefthook — менеджер Git-хуков для проектов на любых языках.

Требуется добавить возможность управлять логом вывода.

В текущей реализации Lefthook не предоставляет возможности пользователю управлять выводом. Для большого числа проверок количество сообщений может быть излишне большим и лог теряет информативность. Хочется через конфиг указать какие сообщения выводить, а какие нет. Например:

output:
  - meta
  - failures
  - success
  - summary

Польза: попрактиковаться с Go, познакомиться с git hooks.

Инструкции по выполнению

  1. Ознакомиться с более подробным обсуждением задачи или предложенной реализацией.
  2. Задать вопросы или попросить уточнения в issue на GitHub.
  3. Форкнуть проект Lefthook на GitHub.
  4. Реализовать необходимый функционал.
  5. Сделать Pull Request.

Бэк: Logidze: создание «слепка» текущего состояния записи вручную

Для новичков, задача на неделю

Logidze позволяет работать с версиями объектов Active Record моделей и историей их изменений, хранящейся в виде инкрементального лога в отдельной колонке таблицы БД.

Лог изменений генерируется автоматически (с помощью триггеров в БД), и, как правило, разработчики в приложении используют его только для чтения. Однако, в некоторых случаях может возникнуть необходимость зафиксировать текущее состояние записи вручную: например, при массовом обновлении или вставке удобно отключать встроенный трекинг (Logidze.without_logging { ... }), что может привести к неконсистентности лога и текущего состояния записей.

Для решения данной проблемы предлагается добавить специальный метод model.fixup_log_data!, который будет добавлять запись в лог, актуализируя его состояние.

Польза: возможность поработать с базой данных на более низком уровне, принести пользу Rails сообществу.

Бэк: Ruby Next: поддержка явного списка преобразований в CLI

Для новичков, задача на неделю

Ruby Next — транспайлер для Ruby, который позволяет трансформировать новые синтаксические конструкции в совместимые со старыми версиями Ruby и альтерантивными имплементациями.

Один из возможных способов сделать это — воспользоваться ruby-next CLI. Текущая версия CLI позволяет указывать версию Ruby, для которой необходимо сгенерировать код (ruby-next nextify --min-version=2.5), что отлично работает для CRuby и совместимых реализаций, но не всегда подходит для таких платформ как mruby, Opal и других.

Требуется расширить функционал CLI и добавить возможность указывать список преобразований явно: ruby-next nextify --rewrite=pattern-matching --rewrite=endless-method.

Польза: попрактиковаться в написании и тестировании CLI на Ruby, познакомиться с миром транспайлеров, принести пользу Rails сообществу.

Фронт: Перевести Logux Server на pino

Для новичков, задача на неделю

Сейчас Logux Server использует Bunyan для записи лога. pino совместим на 90% с Bunyan API, но гораздо быстрее.

Польза: получить open source портфолио на Node.js, научиться работать с Logux.

Бэк: Добавить протокол 3 в Logux Rack (Ruby/Rails)

Для новичков, задача на неделю

Нужно перевести Ruby gem logux-rack на новую версию протокола общения с Logux-сервером. Изменения:

  1. Сейчас logux-rack, в случае ошибки, всегда возвращает ["error", stack]. В новой версии логика сложнее. Если ошибка произошла в момент обработки конкреного action или подписки, сервер должен ответить ["error", meta.id, stack]. В остальных случаях сервер должен ответь HTTP-кодом 500 с текстом ошибки в теле ответа (прекратив обработку остальных команд).
  2. Нужно изменить password на secret в теле запросов от Logux-сервера и запросов к Logux-серверу.
  3. Нужно обновить версию протокола в коде logux-rack.

Польза: получить open source портфолио в Ruby, научиться работать с Logux.

Бэк: Добавить resend в Logux Rails

Для новичков, задача на неделю

У Logux есть WebSocket-сервер, который посылает новые сообщения в Rails-приложение. Сейчас новое сообщение проходит 2 стадии — проверку прав доступа и сохранение данных в БД. Нужно добавить третий шаг — определение того, в какие каналы нужно переслать сообщение.

Обработка сообщений от Logux идет в Logux::ActionController:

module Actions
  class Comment < Logux::ActionController
    def add
      respond :processed
    end
  end
end

Нужно добавить метод resend, который будет принимать хэш:

    def add
      resend channel: 'users'
      respond :processed
    end

Этот метод будет писать в ответ Logux-серверу:

["resend", @meta.id, { "channel": "users" }]

Польза: получить open source портфолио в Ruby, научиться работать с Logux.

Бэк: Добавить send_back в Logux Rails

Для новичков, задача на неделю

У Logux есть WebSocket-сервер, который посылает новые сообщения в Rails-приложение. Обработка всех сообщений от Logux идет в Logux::BaseController (который расширяется в Logux::ActionController и Logux::ChannelController):

module Actions
  class Comment < Logux::ActionController
    def add
      respond :processed
    end
  end
end

Нужно добавить метод send_back(action, meta), который будет ставить meta.clients = [meta.client_id] и вызывать Logux.add(action, meta):

    def add
      send_back(type: 'added')
      respond :processed
    end

Польза: получить open source портфолио в Ruby, научиться работать с Logux.

Фронт: Добавить size-limit --watch

Для новичков, задача на неделю

Нужно добавить новый аргумент: size-limit --watch, который будет следить за изменением файлов и заново запускать Size Limit.

Можно следить только за изменением JS-файлов, package.json и конфига Size Limit, игнорируя node_modules.

Польза: опыт работы с JavaScript в большом опенсорс-проекте.

Фронт: Добавить browserslist --update-db для обновления caniuse-lite

Для новичков, задача на неделю

Browserslist берет данные Can I Use из пакета caniuse-lite. Многие команды его не обновляют и данные last 2 version становятся устаревшими. Сейчас Browserslist определяет, что данные устарели и выводит предупреждение.

К сожалению, npm и Yarn не дают готовые инструменты для обновления версий в глубине дерева зависимостей.

Польза: опыт работы с JavaScript в большом опенсорс-проекте, строка в резюме с PR в известный проект.

Фронт: Перевести токенайзер PostCSS с line, column на offset

Для новичков, задача на неделю

Сейчас PostCSS сохраняет строку и колонку каждого токена. Но команде Sass для совместимости нужна позиция в CSS-строке (offset) вместо строки и колонки. Можно перевести токенайзер на offset, а строку/колонку вычислять. Это упростит токенайзер и уменьшит расход памяти.

Польза: опыт работы с JavaScript в большом опенсорс-проекте, строка в резюме с PR в известный проект.

Фронт: Добавить print-snapshots --watch

Для новичков, задача на неделю

Инструмент print-snapshots печает Jest snapshots.

Нужно добавить два параметра, --update и --watch, для обновления snapshots и запуска обновления snapshots при изменении JS-файлов в проекте.

Польза: опыт работы с JavaScript опенсорс-проекте, опыт работы с инструментами тестирования.

Фронт: Улучшить генерацию префиксов у Autoprefixer внутри @-moz-document

Для новичков, задача на неделю

Надо сделать Autoprefixer умнее и генерировать только -moz- внутри выражения @-moz-document.

  body {
    -webkit-appearance: none;
       -moz-appearance: none;
            appearance: none;
  }

  @-moz-document domain('example.com') {
    body {
-    -webkit-appearance: none;
        -moz-appearance: none;
             appearance: none;
    }
  }

Польза: опыт работы с JavaScript в большом опенсорс-проекте, строка в резюме с PR в известный проект.

Фронт: Добавить скрипты в clean-publish

Для новичков, задача на неделю

clean-publish — CLI-инструмент по очистке npm-пакета от лишних конфигов перед публикацией.

Он берет текущий проект, копирует во временную папку, чистит и вызывает npm publish на очищенную временную папку.

Нужно добавить опцию beforeScript, которая перед вызовом npm publish вызовет какой-то другой скрипт, передав туда путь ко временной папке как аргумент.

"clean-publish": {
  "beforeScript": "esm-compiler"
}

Польза: получить опыт разработки под Node.js.

Фронт: Уменьшить Gitter Sidecar

Для новичков, задача на неделю

Gitter Sidecar — виджет чата для open source-проектов. Его использует PostCSS и Logux.

В виджете оказалось много лишнего кода. 17 KB кода, скорее всего, можно ужать до 5-10 KB.

Польза: опыт улучшения производительности, строка в резюме с PR в известный проект.

Бэк: Реализовать обработку неизвестных атрибутов внутри array-типов StoreModel

Для уверенных в себе, задача на несколько дней

StoreModel — Ruby gem, позволяющий работать с JSON-колонками как с объектами, очень похожими на обычные ActiveRecord модели.

Ранее в StoreModel был добавлен метод #unknown_attributes, возвращающий Hash с атрибутами, присутствующими в колонке БД, но не объявленными в модели (подробнее — в в документации). Однако, он не работает с array-типами:

class Config
  include StoreModel::Model

  attribute :model, :string
end

data = { name: "Apple iPhone" }
config = Config.to_type.cast_value(data)
config.unknown_attributes
# => { name: "Apple iPhone" }

Config.to_array_type.cast_value([data])
# => ActiveModel::UnknownAttributeError

Необходимо дополнить реализацию модуля StoreModel::Types::ArrayType таким образом, чтобы он собирал все неизвестные атрибуты в #unknown_attributes для каждого из объектов списка:

data = { name: "Apple iPhone" }
configs = Config.to_array_type.cast_value([data])
configs.first.unknown_attributes
# => { name: "Apple iPhone" }

Более подробно проблема описана в задаче.

Польза: прокачаться в Ruby, принести пользу сообществу.

Бэк: Добавить ссылку на модель-родитель в StoreModel

Для уверенных в себе, задача на несколько дней

StoreModel — Ruby gem, позволяющий работать с JSON-колонками как с объектами, очень похожими на обычные ActiveRecord модели.

Необходимо добавить в StoreModel возможность установить связь между объектом-оберткой и его родителем — объектом класса ActiveRecord. В результате, у классов, включающих в себя StoreModel::Model, должен появиться метод #parent.

Польза: познакомиться с работой атрибутов в Rails, прокачаться в Ruby, принести пользу сообществу.

Фронт: Исправить поиск Chrome в estimo

Для новичков, задача на неделю

Estimo запускает JS-файл в Puppeteer (Chrome без UI) и сообщает, сколько потребовалось времени на компиляцию и запуск файла. Size Limit использует его для оценки времени выполнения JS-бандла.

Puppeteer очень долго скачивает сборку Chrome. В 1.0 Estimo перешел на Puppeteer Core и самм начал искать и скачивать Chrome. В итоге, если у пользователя уже установлен браузер Chrome, Estimo может использовать его.

Однако, код поиска и скачивания Chrome работает плохо, особенно на Travis CI. Нужно переписать код и исправить ошибки.

Польза: получить глубокий опыт в работе Puppeteer.

Бэк: Store Attribute: поддержка значений по умолчанию

Для уверенных в себе, задача на выходные

Gem store_attribute добавляет возможность приведения типов для атрибутов Active Record моделей, созданных с помощью store_accessor.

Данный gem предоставляет интерфейс (и использует «под капотом») Attributes API, за исключением возможности указания значений по умолчанию.

Необходимо добавить данный функционал в gem.

Польза: узнать, как устроен Attributes API в Active Record, принести пользу Rails сообществу.

Фронт: Добавить в Size Limit опцию --save-bundle

Для новичков, задача на неделю

Size Limit собирает JavaScript-библиотеку с помощью webpack, чтобы потом проверить результирующий размер.

Иногда непонятно, почему получился именно такой размер — хотелось бы посмотреть содержимое сборки. Для этого можно добавить аргумент --save-bundle ./dir в CLI.

Польза: получить опыт в open source проекте и новых синтаксисах JavaScript.

Фронт: Доделать тему documentation-theme-light для Documentation.js

Для новичков, задача на неделю

Documentation.js — прекрасная замена мертвому JSDoc. Но все темы для него довольно плохие.

Самое грустное, что для проекта сделали отличную тему documentation-theme-light, но она не закончена.

Нужно добавить JS-скрипты генерации HTML и, опционально, чуть отполировать тему.

Польза: задача идеальна для CSS-разработчиков, которые хотят прокачаться в JavaScript.

Фронт: Добавить JSON-вывод в Size Limit

Для новичков, задача на неделю

В CLI Size Limit нужно добавить опцию size-limit --json, которая будет менять формат вывода на JSON:

[
  {
    "name": "index.js",
    "passed": true,
    "size": 1024,
    "loading": 0.05,
    "running": 0.1
  }
]

Польза: получить опыт в open source проекте и новых синтаксисах JavaScript.

Бэк: Создание библиотеки Refinement Types на Go (для построения контрактов)

Для продвинутых, задача на неделю

Нужно создать новую библиотеку, которая состоит из:

  • абстракции — Refinement Type;
  • различных способов композиции типов, начиная с их сложения и умножения (см. Algebraic Data Types).

Внутри библиотека:

  1. должна работать по таким же принципам, как blood_contracts-core;
  2. являться органичной для экосистемы Go.

Приведенная на Ruby библиотека используется для создания контрактов в приложении.

Контракт — это набор валидаций (тестов), которые запускаются во время production сессии взаимодействия с внешней системой по API (например, CRM системой или социальными сетями).

Такие валидации решают проблему упрощения отладки и распознавания отклонений в поведении внешних зависимостей.

Польза: создать гибкую и универсальную Go библиотеку, вдохновленную функциональным программированием.

Бэк: Создание библиотеки Refinement Types на Node.js (для построения контрактов)

Для продвинутых, задача на неделю

Нужно создать новую библиотеку, которая состоит из:

  • абстракции — Refinement Type;
  • различных способов композиции типов, начиная с их сложения и умножения (см. Algebraic Data Types).

Внутри библиотека:

  1. должна работать по таким же принципам, как blood_contracts-core;
  2. являться органичной для экосистемы Node.js.

Приведенная на Ruby библиотека используется для создания контрактов в приложении.

Контракт — это набор валидаций (тестов), которые запускаются во время production сессии взаимодействия с внешней системой по API (например, CRM системой или социальными сетями).

Такие валидации решают проблему упрощения отладки и распознавания отклонений в поведении внешних зависимостей.

Польза: создать гибкую и универсальную Node библиотеку, вдохновленную функциональным программированием.

Фронт: Исправить парсинг Custom Properties в PostCSS

Для новичков, задача на неделю

PostCSS парсит значения CSS Custom Properties как обычные значения в CSS-свойствах. Оказалось, что по спецификации там могут быть { и другие символы.

/* Валидный CSS */
html {
  --bracket-block: {1, 2, 3};
  --JSON: [1, "2", {"three": 3}, [4]];
  --javascript: function(rule) { console.log(rule) };
}

Нужно изменить парсер, чтобы правильно обрабатывать CSS Custom Properties.

Польза: получить опыт JavaScript в известном проекте.

Фронт: Переписать Logux Server с Promise на async/wait

Для новичков, задача на неделю

В Logux Server надо провести рефакторинг, переведя код на новый синтаксис JavaScript. Поскольку мы теперь требуем Node.js >= 10, Promise можно заменить на async/await.

Польза: получить опыт в open source проекте и новом синтаксисе JavaScript.

Фронт: Добавить поддержку mask-composite в Autoprefixer

Для новичков, задача на неделю

В Autoprefixer нужно добавить поддержку нового свойства — mask-composite.

Польза: получить опыт JavaScript в известном проекте.

Бэк: Поддержка ассоциаций belongs_to в Ruby gem Clowne

Для новичков, задача на несколько дней

Clowne — это Ruby gem для гибкого клонирования моделей, поддерживающий несколько ORM адаптеров.

На данный момент ActiveRecord адаптер реализует клонирование следующих ассоциаций: has_one, has_many, has_and_belongs_to_many. В первой версии это было сделано специально, чтобы избежать возможных избыточных клонирований и неверного результата в конечном итоге.

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

Для покрытия подобного рода кейсов нужно добавить в gem поддерку belongs_to связей (только для ActiveRecord адаптера).

Польза: прокачаться в Ruby, получить опыт работы со сложными Ruby библиотеками.

Бэк: gem Clowne: коллбек after_clone для обработки собранной модели

Для новичков, задача на несколько дней

Clowne — это Ruby gem для гибкого клонирования моделей.

Начиная с версии 1.0, Clowne поддерживает два коллбека для обработки клонируемой записи:

  • finalize вызывается до сохранения записи в процессе формирования результата клонирования.
  • after_persist вызывается после сохранения записи для уже сформированной записи.

Однако, существуют промежуточные ситуации, когда необходимо обработать собранную, но еще не сохраненную запись.

К примеру, чтобы избежать использования after_persist и дополнительных операций c базой:

class UserCloner < Clowne::Cloner
  # клонируем пользователя и его посты, которые являются черновиками
  include_association :posts, scope: :draft

  after_clone do |_origin, clone, mapper:, **|
    # актуализируем значение атрибута пользователя
    clone.draft_count = clone.posts.count
  end
end

Альтернативным примером использования может послужить проверка собранной записи по некоторой бизнес-логике:

class UserCloner < Clowne::Cloner
  include_association :posts, scope: :draft

  after_clone do |origin, clone, errors:, **|
    errors.unshift("user clone of #{origin.cache_key} is invalid") if clone.posts.empty?
  end
end

errors = []
operation = UserCloner.call(user, errors: errors)

raise errors.join('; ') if errors.any?

Для покрытия подобного рода кейсов мы можно реализовать after_clone коллбек.

Польза: прокачаться в Ruby, получить опыт работы со сложными Ruby библиотеками.

Бэк: AnyCable: Rack-совместимый сервер

Для уверенных в себе, задача на несколько дней

AnyCable позволяет использовать сторонние WebSocket-сервера, более производительные и конкурентно-способные, вместе с Action Cable.

Однако это накладывает определенные ограничения — в том числе, необходимость запускать несколько процессов вместо одного.

И хотя AnyCable предполагает использование стандартного Action Cable сервера при разработке и тестировании, многие разработчики (см. например, статью From Action to Any) предпочитают запускать полноценную конфигурацию локально.

Чтобы упростить локальную разработку, мы предлагаем написать AnyCable-совместимый вебсокет-сервер на Ruby с Rack интерфейсом.

Польза: познакомиться с AnyCable, получить опыт написания конкуретных приложений на Ruby.

Бэк: Yabeda: адаптер для DataDog

Для новичков, задача на два-три дня

Фреймворк yabeda позволяет легко объявлять и собирать метрики о работе Ruby-приложения — и с помощью адаптеров экспортировать их в системы мониторинга. Сейчас есть адаптеры для Prometheus (yabeda-prometheus) и NewRelic (yabeda-newrelic), но это далеко не полный список систем, которых мы хотели бы поддерживать.

Необходимо написать адаптер (Ruby gem) для yabeda, который позволит отправлять кастомные метрики в DataDog.

Польза: познакомиться с работой систем мониторинга изнутри, получить опыт в Ruby open source, принести пользу сообществу.

Решение: победителем признана реализация Дмитрия Швецова на основе Dogstatsd сделанная в соавторстве с Николаем Малининым. Николай начинал решать задачу отдельно, но решил объединить усилия с Дмитрием.

Бэк: GraphQL Ruby: поддержка «внешних» схем

Для уверенных в себе, задача на несколько дней

Gem graphql-ruby предоставляет объектно-ориентированный интерфейс для построения GraphQL API на Ruby.

Одним из преимуществ GraphQL часто называют возможность агрегировать данные из разных источников в одном запросе и прозрачно для клиента.

Отдельно рассматривают случай, когда один провайдер GraphQL API агрегирует данные из других GraphQL API. Этот сценарий носит название schema stitching.

К сожалению, на сегодняшний день поддержка объединения (или сшивания) схем отсутвует в реализации на Ruby.

Необходимо написать плагин (gem) для graphql-ruby, который позволит создавать «внешние» поля в локальную схему.

Польза: познакомиться с GraphQL в Ruby, получить open source опыт Ruby, принести пользу сообществу.

Бэк: GraphQL Ruby: «умная» выборка полей из БД

Для уверенных в себе, задача на несколько дней

Gem graphql-ruby предоставляет объектно-ориентированный интерфейс для построения GraphQL API на Ruby.

Одной из ключевых особенностей GraphQL является возможность запросить клиентом только те данные, которые ему нужны (а не все те, которые предлагает API).

Однако, запросы к БД, которые выполняются при работе, например, с Active Record, не являются оптимальными: используется "SELECT * ..." вместо выборки лишь тех полей, которые необходимы для формирования ответа клиенту.

При большом количестве колонок в таблице или при хранении значений большого размера выгрузка всех полей и инициализация Active Record могут привести к разбуханию памяти или отрицательно повлиять на скорость выполнения запроса.

Необходимо написать плагин (gem) для graphql-ruby, который позволит «помочь» делать более эффективные запросы.

Польза: познакомиться с GraphQL в Ruby, получить опыт в Ruby open source, принести пользу сообществу.

Бэк: Добавить интеграцию с OptionParse в anyway_config

Для новичков, задача на неделю

Gem anyway_config предоставляет единый API для конфигурирования Ruby приложения из разных источников данных (YAML файлы, переменные окружения), позволяя без лишних усилий следовать принципам Twelve-Factor App методологии.

Необходимо добавить возможность использовать аргументы коммандной строки в качестве еще одного источника данных для конфигурации.

Для этого предполагется добавить интеграцию стандартной Ruby библиотеки OptionParse в anyway_config.

Польза: познакомиться с OptionParse в Ruby, принести пользу сообществу.

Бэк: TestProf: добавить улучшенную поддержку сэмплирования тестов

Для уверенных в себе, задача на несколько дней

Gem test-prof включает в себя инструмент для запуска случайного набора тестов (документация).

Текущая реализация имеет ряд ограничений:

  • можно запускать только случайный набор файлов, а не отдельных тестов (из-за этого количество тестов в сэмплах может значительно отличаться);
  • не поддерживает фильтрацию тестов в RSpec (например, по тэгам или по описанию).

Необходимо усовершенстовать поддержку сэмплирования в TestProf.

Польза: узнать, как работают изнутри популярные библиотеки для тестирования в Ruby (RSpec и Minitest), принести пользу сообществу.

Фронт: Написать скрипт подбора правильного порядка букв алфавита Nano ID

Для новичков, задача на день

Nano ID — это очень маленькая библиотека, где идет борьба за каждый байт. Во многих файлах Nano ID есть строка алфавита. Одна из техник оптимизации — менять порядок символов в алфавите так, чтобы он повторял слова из JS-кода. Тогда gzip работает более эффективно.

Нужно написать скрипт, который бы перебирал все варианты порядка символов, чтобы найти оптимальный порядок.

Польза: получить опыт в JavaScript и оптимизации.

Бэк: Добавить API для поддержки различных адаптеров в Ruby gem jwt_sessions

Для уверенных в себе, задача на несколько дней

Альтернативное решение от Леонида Батижевского.

Gem jwt_sessions предоставляет базовый инструментарий для использования JWT для аутентификации пользователей.

Для хранения токенов сейчас используется Redis, и нет простой (то есть, без monkeypatching) возможности использовать другие хранилища — такие, например, как база данных, или память приложения (что может быть полезно в тестовом окружении).

Необходимо в рамках gem’а реализовать интерфейс для написания сторонних адаптеров, реализовать через него существующий Redis адаптер, а также добавить из коробки in-memory адаптер.

Польза: познакомиться поближе c JWT, применить навыки рефакторинга в Ruby, принести пользу сообществу.

Фронт: Управление Grid через комментарии в Autoprefixer

Для новичков, задача на день

Autoprefixer старается конвертировать Grid Layout для Internet Explorer. Эту функцию надо явно активировать, передавая опцию grid: true.

Не у всех пользователей есть возможность выставить опции для Autoprefixer. Надо сделать включение функции с помощью комментария /* autoprefixer grid: on */.

Польза: получить опыт JavaScript в известном проекте.

Фронт: Добавить предупреждения grid-area в Autoprefixer

Для новичков, задача на день

Autoprefixer старается конвертировать Grid Layout для Internet Explorer. Некоторые пользователи делают ошибку и пишут grid-area и grid-row и/или grid-column в одном и том же правиле (это бессмысленно).

Надо показывать предупреждение, если в одном правиле есть grid-area и grid-row или grid-column.

Польза: получить опыт JavaScript в известном проекте.

Фронт: Добавить предупреждения Grid Layout в Autoprefixer

Для новичков, задача на день

Autoprefixer старается конвертировать Grid Layout для Internet Explorer. Однако свойства align-content, align-items, justify-content и justify-items нельзя сконвертировать.

Надо показывать предупреждение, если в одном правиле есть display: grid или display: inline-grid и свойства из списка выше.

Польза: получить опыт JavaScript в известном проекте.

Фронт: Убрать Cairo из postcss-conic-gradient

Для новичков, задача на неделю

postcss-conic-gradient — полифил для конических градиентов в CSS.

Он генерирует SVG-картинку для градиента и вставляет эту каринку в CSS как data:uri. Для генерации изображения он сейчас использует Cairo — бинарную зависимость, которую надо отдельно ставить в систему.

Нужно заменить Cairo на какую-то другую библиотеку на чистом JavaScript или вручную генерировать SVG.

Польза: получить опыт работы с графикой в JavaScript, улучшить очень полезный полифил.

Бэк: Улучшить ответ при ошибке в Logux Rails

Для новичков, задача на несколько дней

Logux Rails — gem, позволяющий связать Logux-сервер и приложение на Ruby on Rails. В каталоге app/logux/ разработчик описывает права доступа и контроллеры для разных типов событий от Redux и подписок.

Сейчас при ошибке gem всегда выдает ['error'] в ответ. Нужно возвращать ['error', meta.id, error_stack] или ['error', auth_id, error_stack].

Польза: получить open source портфолио в Ruby, научиться работать с Logux.

Бэк: Генерировать meta.id в Logux Rails

Для новичков, задача на несколько дней

Logux Rails — gem, позволяющий связать Logux-сервер и приложение на Ruby on Rails. В каталоге app/logux/ разработчик описывает права доступа и контроллеры для разных типов событий от Redux и подписок.

Каждое событие в Logux имеет уникальный ID в meta.id. Но пока Logux Rails не умеет генерировать этот ID.

Польза: получить open source портфолио в Ruby, научиться работать с Logux.

Бэк: Улучшить логер в Logux Rails

Для новичков, задача на несколько дней

Logux Rails — gem, позволяющий связать Logux-сервер и приложение на Ruby on Rails. В каталоге app/logux/ разработчик описывает права доступа и контроллеры для разных типов событий от Redux и подписок.

Нужно улучшить вывод gem’а в консоль согласно списку в issue.

Польза: получить open source портфолио в Ruby, опыт работы с логером в Rails, научиться работать с Logux.

Бэк: Добавить strong params в Logux Rails

Для новичков, задача на несколько дней

Logux Rails — gem, позволяющий связать Logux-сервер и приложение на Ruby on Rails. В каталоге app/logux/ разработчик описывает права доступа и контроллеры для разных типов событий от Redux и подписок.

Нужно, чтобы в Logux::Actions работала та же фильтрация входящих параметров, что и в контроллерах Rails.

Польза: получить open source портфолио в Ruby, научиться работать с Logux.

Бэк: Добавить rake-задачи в Logux Rails

Для новичков, задача на несколько дней

Logux Rails — gem, позволяющий связать Logux-сервер и приложение на Ruby on Rails. В каталоге app/logux/ разработчик описывает права доступа и контроллеры для разных типов событий от Redux и подписок.

Нужно добавить две rake-задачи:

  1. rake logux:actions — чтобы вывести action.type, которые ожидают все обработчики событий из app/logux/actions.
  2. rake logux:channels — чтобы вывести все подписки, которые ожидают обработчики подписок из app/logux/channels.

Польза: получить open source портфолио в Ruby, разобраться с Rake, научиться работать с Logux.

Бэк: Добавить Logux.undo() в Logux Rails

Для новичков, задача на несколько дней

Logux Rails — gem, позволяющий связать Logux-сервер и приложение на Ruby on Rails. В каталоге app/logux/ разработчик описывает права доступа и контроллеры для разных типов событий от Redux и подписок.

Logux умеет откатить любое событие, которое было создано клиентом или отправлено с сервера. Для этого нужно сгенерировать особое событие. Нужно перенести эту логику в Rails в метод Logux.undo().

Польза: получить open source портфолио в Ruby, научиться работать с Logux.

Бэк: Исправить реакцию на неизвестное событие в Logux Rails

Для новичков, задача на несколько дней

Logux Rails — gem, позволяющий связать Logux-сервер и приложение на Ruby on Rails. В каталоге app/logux/ разработчик описывает права доступа и контроллеры для разных типов событий от Redux и подписок.

Если разработчик не создал обработчик для какого-то события или подписки, gem выбросит ошибки NoPolicyError и NoActionError. Вместо этого нужно в ответ выдавать ['unknownAction', meta.id] или ['unknownChannel', meta.id].

Польза: получить open source портфолио в Ruby, научиться работать с Logux.

Фронт: Перезапустить easings.net

Для новичков, задача на несколько недель

Easings.net — каталог easing-функций. Easing-функции — очень важный элемент анимаций, поэтому многие разработчики посещают этот сайт, чтобы правильно подобрать анимацию на веб-странице.

Польза: получить опыт JavaScript-разработки; модернизировать популярную шпаргалку для разработчиков.

Бэк: ActiveRecord: ленивая предзагрузка ассоциаций

Для уверенных в себе, задача на несколько дней

PR в Rails от Глеба Иванова.

В ActiveRecord предусмотрено несколько методов для предварительной загрузки ассоциированных записей (такие как includes, eager_load и другие). Это позволяет выгружать данные, избегая так называемой проблемы N+1 запросов.

В некоторых случаях мы не знаем заранее, какие ассоциации нам понадобятся при выполнении запроса (простой пример — работа с GraphQL).

Приходится либо предзагружать лишние данные (например, указывая все ассоциации в includes), либо использовать альтернативные подходы, такие как batch loading.

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

Польза: детально узнать, как работает Rails и ActiveRecord изнутри, принести пользу Rails-сообществу.

Фронт: Создать nanoid-good, nanoid с фильтром обсценных слов

Для новичков, задача на день

Nano ID генерирует случайные ID. Так как идентификаторы полностью случайные, частью буквенно-цифрового идентификатора может стать обсценное слово.

Нужно создать nanoid-good, который будет проверять ID на плохие слова и, если надо, генерировать ID еще раз.

Польза: получить больше опыта в JavaScript и пополнить open-source портфолио.

Фронт: Предупреждать о конфликте имен областей в Autoprefixer Grid

Для новичков, задача на день

Autoprefixer умеет генерировать префиксы для Grid Layout только если имена областей уникальные. Например, в этом случае сгенерировать префиксы нельзя:

.parent-alpha {
  grid-template-areas: "delta  echo";
}

.parent-beta {
  grid-template-areas: "echo  delta";
}

.grid-cell {
  -ms-grid-column: ???; /* не понятно, от какого родителя брать местоположение */
  arid-area: echo;
}

В этих случаях надо выводить предупреждение.

Польза: указать в резюме коммит в известный проект.

Фронт: Исправить вложенные медиа-выражения в Autoprefixer Grid

Для новичков, задача на день

В некоторых случаях Autoprefixer генерирует вложенные медиа-выражения. В этих случаях надо объединять медиа-выражения в одно.

@media (min-width: 30em) {
  .wrapper {
    display: grid;
    grid-template-areas: "a b";
  }
}

@media (min-width: 60em) {
  .wrapper {
    grid-template-areas: "a b";
  }
}

@media (min-width: 30em) {
  .a {
    grid-area: a;
  }
}

@media (min-width: 30em) {
  .b {
    grid-area: b;
  }
}

Польза: указать в резюме коммит в известный проект.

Фронт: Создать инструмент clean-publish

Для продвинутых, задача на неделю

В современном JavaScript даже у маленького проекта есть куча инструментов разработки — хотя бы линтер и тесты. Для каждого инструмента надо иметь настройки. Иногда настроек получается больше, чем кода самой библиотеки.

Можно держать все эти настройки в отдельных файлах — тогда в папке проекта будет много файлов. Например, из-за длинного списка файлов README на GitHub будет далеко после большого списка файлов.

Можно перенести настройки в package.json, но тогда они окажутся в npm-пакете, что увеличит его размер.

Можно решить проблему, если создать инструмент clean-publish. Он будет копировать файлы проекта во временную папку, убирать лишнее из package.json и вызывать npm publish на временной папке.

Польза: получить больше опыта в JavaScript.

Фронт: Перевести shortid на nanoid

Для новичков, задача на неделю

shortid использует опасные методы генерации ID. К сожалению, его использует уже слишком много проектов. Поэтому надо заменить в нем метод генерации ID, сохранив прежний API.

Польза: получить больше опыта в JS.

Бэк: Гемизация «простейших контрактов» на Ruby

Для продвинутых, задача на неделю

Контракт — это набор валидаций (тестов), которые запускаются во время production сессии взаимодействия с внешней системой по API (например, CRM системой или социальными сетями).

Такие валидации решают проблему упрощения отладки и распознавания отклонений в поведении внешних зависимостей. Пример реализации — poro_contract.

Нужно создать новый gem (назовем его simple_contracts), который:

  1. внутри работает по таким же принципам, как POROContract, или просто оборачивает его в gem;
  2. является самой простой реализацией «контрактов» на Ruby в виде gem с минимумом зависимостей;
  3. обладает способностью прогонять проверку «контракта» параллельно, не влияя на основной поток исполнения (в случае использования IO в теле контракта).

Польза: получить отличный опыт с многопоточным программированием в Ruby; освоить контрактный подход к тестированию API.

Фронт: Перевести yaspeller на cosmiconfig

Для новичков, задача на день

Сейчас yaspeller берет свои настройки только из файла .yaspellerrc. Хотелось бы, чтобы он поддерживал поле "yaspeller" в package.json, как многие остальные инструменты из npm.

Чтобы не писать много кода поиска настроек, можно использовать библиотеку cosmiconfig.

Польза: получить больше опыта в JavaScript.

Фронт: Ускорить токенайзер PostCSS

Для уверенных в себе, задача на неделю

В хороших парсерах разбор разбит на два шага: строка → токены и токены → дерево объектов. Первый шаг называется токенайзер.

Сейчас токенайзер возвращает [token_name, content, start_line, start_column, end_line, end_column]. Есть мнение, что можно сильно ускорить токенайзер, если:

  1. Возвращать Uint32Array(token_code, offset_start, offset_end, start_line, start_column, end_line, end_column). То есть, вместо строки с именем токена использовать цифровой код. А content парсер может взять сам из строки входящего CSS по offset_start и offset_end.
  2. Если токенайзер будет использовать один и тот же экземпляр Uint32Array. В итоге не будет постоянно создаваться больше объектов и вызываться сборщик мусора.

Польза: указать в резюме коммит в известный проект.

Бэк: TestProf: поддержка трейтов в FactoryDefault

Для новичков, задача на день

FactoryDefault – это один из инструментов, входящих в состав TestProf.

Он позволяет переиспользовать уже созданные фабрикой объекты для вложенных ассоциаций, решая таким образом проблему каскадов фабрик.

Необходимо сделать так, чтобы FactoryDefault учитывал используемые при создании ассоциаций трейты.

Польза: узнать, как работает FactoryGirl изнутри, принести пользу сообществу.

Фронт: Исправить логику вставки row/column в Автопрефиксере

Для новичков, задача на неделю

Autoprefixer умеет вставлять префиксы Grid Layout для Internet Explorer. Поддерживается даже grid-template-areas.

Но, в некоторых случаях, префиксы для grid-template-areas в медиа-выражении могут быть вставлены не в том месте. Нужно изменить логику.

Польза: указать в резюме коммит в известный проект.

Фронт: Предупреждать об устаревшем caniuse-lite в Browserslist

Для новичков, задача на неделю

Многие пользователи Autoprefixer и Babel забывают обновлять базу браузеров caniuse-lite. В этой базе есть информация о времени релиза каждой версии браузера. Взяв дату самой свежей версии браузера, можно примерно узнать время релиза caniuse-lite. Если база не обновлялась уже полгода, надо показать предупреждение пользователю.

Польза: указать в резюме коммит в известный проект.

Фронт: Обновить зависимости в cssnano

Для новичков, задача на неделю

cssnano сжимает CSS и используется по умолчанию в webpack. Эта задача поможет с выпуском cssnano 4.

Надо обновить зависимости и API.

Польза: указать в резюме коммит в известный проект.

Фронт: Починить работу со шрифтами в cssnano

Для новичков, задача на неделю

cssnano сжимает CSS и используется по умолчанию в webpack. Эта задача поможет с выпуском cssnano 4.

Нужно разобраться с ошибкой шрифтов.

Польза: указать в резюме коммит в известный проект.

Фронт: Починить работу с initial в cssnano

Для новичков, задача на неделю

cssnano сжимает CSS и используется по умолчанию в webpack. Эта задача поможет с выпуском cssnano 4.

Сейчас cssnano, встретив:

.a {
  all: initial;
  color: red;
}
.b {
  all: initial;
  color: blue;
}

может превратить свойства в:

.a {
  color: red;
}
.a,
.b {
  all: initial;
  color: red;
}
.b {
  color: blue;
}

В итоге правило будет работать неправильно.

Польза: указать в резюме коммит в известный проект.

Фронт: Починить mergeLonghand в cssnano

Для уверенных в себе, задача на неделю

cssnano сжимает CSS и используется по умолчанию в webpack. Эта задача поможет с выпуском cssnano 4.

Правило mergeLonghand иногда работает неправильно. Надо изучить его и починить.

Польза: указать в резюме коммит в известный проект.

Фронт: Починить работу с -ms-input-placeholder в cssnano

Для новичков, задача на неделю

cssnano сжимает CSS и используется по умолчанию в webpack. Эта задача поможет с выпуском cssnano 4.

Сейчас cssnano, встретив :-ms-input-placeholder {} ::-ms-input-placeholder { }, объединит правила в :-ms-input-placeholder, ::-ms-input-placeholder { }. К сожалению, это ломает поддержку Internet Explorer.

Польза: указать в резюме коммит в известный проект.

Фронт: Починить работу со Custom Properties в cssnano

Для новичков, задача на неделю

cssnano сжимает CSS и используется по умолчанию в webpack. Эта задача поможет с выпуском cssnano 4.

Сейчас cssnano, встретив padding: 10px; padding: var(--name), удалит первое свойство. Надо исправить это поведение.

Польза: указать в резюме коммит в известный проект.

Фронт: Добавить postcss-preset-env на сайт PostCSS

Для новичков, задача на неделю

Скоро postcss-preset-env заменит cssnext и станет одним из «главных» плагинов PostCSS. Но на сайте PostCSS мы все еще рекомендуем cssnext.

Задача подойдет, если вы больше фокусируетесь на дизайне и CSS, но хотите получить больше опыта с React.

Польза: указать в резюме коммит в известный проект.

Фронт: Сделать хороший дизайн главной страницы postcss-preset-env

Для новичков, задача на неделю

Скоро postcss-preset-env заменит cssnext и станет одним из «главных» плагинов PostCSS.

У плагина есть сайт, но его главная страница совсем не информативная.

Задача подойдет, если вы больше фокусируетесь на дизайне и CSS.

Польза: указать в резюме коммит в известный проект.

Фронт: Добавить проверку наличия :focus в Stylelint

Для новичков, задача на неделю

Многие пользователи пользуются сайтами с клавиатуры; у некоторых даже нет другой возможности. Но большинство фронтенд-разработчиков забывают указать :focus стили.

Эту проблему можно уменьшить, если добавить в Stylelint правило, которое будет напоминать разработчику писать :focus стиль.

Чтобы понять, каким элементам нужен :focus, можно использовать стили :hover. Можно считать, что всем стилям с :hover, нужен какой-то парный стиль с :focus.

Польза: указать в резюме коммит в известный проект.

Фронт: Добавить правило про reduced-motion в Stylelint

Для новичков, задача на неделю

Некоторым пользователям не нравится, когда на странице много анимаций. В Safari есть специальное медиа-выражение @media (prefers-reduced-motion) { }. Если пользователь не хочет анимаций, Safari будет его применять.

Но большинство фронтенд-разработчиков про него забывают. Эту проблему может решить новое правило для Stylelint.

Польза: указать в резюме коммит в известный проект.

Фронт: Добавить поддержку игнорирования следующей строки в Autoprefixer

Для новичков, задача на неделю

Сейчас Autoprefixer понимает особые комментарии /* autoprefixer: off */ и /* autoprefixer: on */, которые выключают или включают его на весь блок стилей.

Нужно добавить поддержку комментария /* autoprefixer: ignore next */, чтобы Autoprefixer игнорировал только следующее свойство или правило.

Польза: указать в резюме коммит в известный проект.

Фронт: Добавить выбор версий Node.js в Browserslist

Для новичков, задача на неделю

Browserslist — общий конфиг списка браузеров для Autoprefixer, Babel и других front-end инструментов. В конфиге разработчики пишут запросы вида last 2 versions, Browserslist переводит это в список конкретных версий браузеров.

Но для Babel и ESLint нужно указывать не только браузеры, но и версии Node.js.

Польза: указать в резюме коммит в проект с 20 млн. загрузок в месяц.

Фронт: Добавить поддержку color-adjust в Автопрефиксер

Для новичков, задача на неделю

CSS-свойство color-adjust из черновика CSSWD работает в webkit-браузерах через свойство -webkit-print-color-adjust.

Нужно добавить поддержку этого свойства в Автопрефиксер.

Польза: написать в резюме, что сделали минорный релиз Автопрефиксера.

Бэк: Добавить новые источники данных в Ossert: Twitter

Для уверенных в себе, задача на несколько дней

Нужно добавить в Ossert новые источники данных. Отличным кандидадатом с достаточно богатым API является Twitter.

Это позволит измерить еще один важный аспект развития Open-Source библиотек — хайп, реакцию на посты про проект, а также количество заинтересованных проектом.

Польза: возможность научиться работать с API Twitter, написать надежный API клиент и узнать больше о метриках и поведении разработчиков свободного ПО.

Бэк: Добавить поддержку Plezi/Iodine в LiteCable

Для новичков, задача на неделю

LiteCable – это альтернативная реализация фреймворка ActionCable из Rails, совместимая с ActionCable-клиентами, но при этом имеющая минимум зависимостей.

Необходимо добавить в LiteCable интеграцию с Plezi (Iodine) “из коробки” (по аналогии с тем, как это сделано для AnyCable).

Польза: познакомиться и научиться работать с новым веб-сервером для Ruby приложений (Iodine); разобраться во внутреннем устройстве real-time фреймворков.

Фронт: Сделать калькулятор вероятность коллизии NanoID

Для новичков, задача на неделю

NanoID — JavaScript-библиотека для генерации случайных ID. Как и у UUID, есть определенная вероятность того, что будет сгенерированы два одинаковых ID.

Вероятность очень мала; в то же время, у многих пользователей генерируется небольшое количество идентификаторов, так что они могут уменьшить длину желаемого ID без особых рисков. Но чтобы понять, насколько можно уменьшить такую длину, нужно сделать калькулятор.

Польза: получить опыт JS-разработки; получить публичный сайт в свое резюме.

Бэк: Isolator: инструмент для отслеживания побочных эффектов внутри транзакций БД

Для продвинутых, задача на неделю

Необходимо написать инструмент для Ruby-стека, который будет отслеживать выполнение потенциально опасных действий внутри транзакции БД (например, HTTP-запросов или отправки фоновых задач в очередь).

Польза: разобраться в том, как работают популярные ORM и другие библиотеки для работы с «внешним миром»; написать инструмент, которым будет активно пользоваться Ruby-сообщество.

Бэк: Добавить поддержку Chef Client 13 в кукбук для управления БД PostgreSQL: postgresql_lwrp

Для продвинутых, задача на пару дней

postgresql_lwrp — самый удобный и гибкий кукбук для системы управления конфигурациями Chef, обеспечивающий установку и настройку БД PostgreSQL.

Нужно обеспечить его работу в Chef Client версии 13.

Польза: возможность попрактиковаться в написании кукбуков Chef, разобраться в особенностях Chef 13.

Бэк: Поддержка Excon для Sniffer

Для новичков, задача на пару дней

Sniffer – это гем для логирования и анализа HTTP-траффика, который поддерживает большинство ruby-библиотек для работы с HTTP-запросами.

Hеобходимо добавить поддержку Excon.

Польза: получить опыт разработки gem’ов, разобраться в принципах работы с HTTP-запросами в Ruby, помочь полезному проекту

Фронт: Добравить поддержку конфига в Size Limit

Для новичков, задача на неделю

Прямо сейчас Size Limit читает свои настройки из package.json. Но было бы хорошо добавить поддержку отдельного файла настроек, например, .size-limit с JSON внутри.

Польза: получить больше опыта работы с Node.js.

Фронт: Улучшить поддержку Grid Layout от IE в Autoprefixer

Для новичков, задача на неделю

Autoprefixer умеет вставлять -ms- префиксы для CSS Grid Layout, заменяя синтаксис, но эта поддержка очень ограничена. Есть мнение, что ее можно улучшить.

Польза: разобраться в Grid Layout, принять участие в большом open-source проекте.

Фронт: Добравить запрос по году релиза в Browserslist

Для новичков, задача на неделю

Browserslist — инструмент для Autoprefixer и Babel для выбора браузеров, которые нужно поддерживать в проекте.

Есть хорошая идея добавить запрос вида since 2013 для выбора версий браузеров, вышедших с 2003 года.

Польза: принять участие в проекте с 11 млн. загрузок.

Бэк: Active Record JSONB ассоциации

Для продвинутых, задача на неделю

Необходимо реализовать возможность хранить данные для ассоциаций (внешние ключи) в поле колонки типа JSONB (PostgreSQL), сохранив при этом большую часть функционала ассоциаций Active Record.

Польза: возможность научиться работать с внутренностями ActiveRecord и JSONB.

Бэк: Clowne: инструмент для клонирования моделей

Для продвинутых, задача на неделю

Необходимо написать инструмент для клонирования моделей (например, Active Record) с гибкими настройками. Существующие гемы (deep_clonable и amoeba), к сожалению, неудобны при работе со сложной бизнес-логикой и завязаны на ActiveRecord.

Польза: попрактиковаться в написании расширяемого DSL на Ruby и написать инструмент, которым будет активно пользоваться сообщество.

Бэк: OmniAuth-стратегия для входа через новый eBay OAuth API

Для новичков, задача на неделю

Необходимо разработать OmniAuth-стратегию для входа в приложения на Ruby с учетной записью eBay в виде отдельного гема.

Сейчас есть гемы, которые реализуют вход через метод Auth’n’auth (например, подзаброшенный гем omniauth-ebay), а через метод OAuth — нет. (Технически оба метода работают по протоколу OAuth, что вносит путаницу).

Для работы с новыми REST API eBay пользователь должен входить именно через новый метод входа.

Польза: возможность разобраться, как же работает вход через соцсети протокол OAuth и библиотека OmniAuth.

Решение: итоговая реализация основана на решении Игната Закревского, но и Андрей Падерин и Илья Долгирев прислали рабочие решения, за что им выражается благодарность.

Бэк: Интеграция EventProf и Minitest

Для новичков, задача на неделю

EventProf – один из инструментов, входящих в состав TestProf. На данный момент работает “из коробки” только с фреймворком RSpec.

Необходимо реализовать интеграцию Minitest и EventProf.

Польза: узнать, как работают профайлеры кода изнутри, научиться писать расширения для Minitest.

Бэк: Поддержка Fabrication в TestProf

Для новичков, задача на неделю

TestProf – это набор инструментов для профилирования тестов, который включает в себя FactoryProf, анализатор использования фабрик в тестах.

Необходимо добавить поддержку Fabrication (альтернатива FactoryGirl) в FactoryProf: сбор общей статистики по использованию фабрик, построение factory flame графиков.

Польза: узнать, как работают профайлеры кода изнутри, познакомиться с гемом Fabrication.

Фронт: Убрать CoreJS из EmojiMart

Для новичков, задача на неделю

EmojiMart — один из лучших контролов для выбора эмодзи. Сейчас у него в зависимостях есть огромный core-js. Эта зависимость нужна для поддержки ES2016+ в IE. Но, судя по всему, они загружают такую большую зависимость ради пары строк кода.

Нужно убрать core-js и починить работу в IE более простыми способами.

Польза: получить опыт оптимизации размера проекта.

Фронт: Уменьшить размер EmojiMart

Для новичков, задача на неделю

EmojiMart — один из лучших контролов для выбора эмодзи. Но сейчас они собирают всё с помощью webpack. В итоге, если пользователь подключает emoji-mart и core-js, у него в сборке оказывается два core-js — один пользовательский и второй от EmojiMart.

Нужно переделать сборку с webpack на просто Babel, сохраняя древовидную структуру. После чего добавить плагин для вырезания propTypes.

Польза: получить опыт оптимизации размера проекта.

Фронт: Задержка при состоянии connecting в Logux Status

Для новичков, задача на неделю

Logux Status показывает состояние синхронизации. Функция status() является фундаментом, чтобы построить свой UI состояния синхронизации.

Одни из шагов синхронизации — connecting и connectingAfterWait. Они говорят о том, что Logux пытается подключится к серверу.

Когда нет Wi-Fi, состояния connecting и connectingAfterWait отображаются слишком быстро — всего на 1—10 мс. В итоге интерфейс неприятно мигает.

Польза: принять участие в разработке Logux.

Фронт: Опция keepLast для Logux

Для новичков, задача на неделю

Logux хранит события в логе. Чтобы чистить лог, он использует понятие «смысла жизни». У каждого события есть «смысл жизни» — массив строк. В любой момент разработчик может убрать смысл жизни у события. Как только у события не остается смыслов жизни, оно удаляется.

Однако, на практике, часто нужно одно и то же действие — хранить в логе только одно событие какого-то типа. Для этого приходится часто повторять один и тот же код:

log.add({ type: "app/A" }, { reasons: ["app/lastA"] }).then((meta) => {
  log.removeReason("app/lastA", { maxAdded: meta.added - 1 });
});

Этот код добавляет в лог событие со смыслом жизни app/lastA и удаляет этот смысл у всех предыдущих событий.

Код приходится писать слишком часто. Стоит добавить опцию keepLast, которая бы делала то же самое.

log.add({ type: "app/A" }, { keepLast: "app/lastA" });

Польза: принять участие в разработке Logux.

Фронт: Переподключать Logux при появлении связи

Для новичков, задача на неделю

Logux, при разрыве связи, раз в несколько секунд пытается подключиться снова.

Браузеры посылают событие online при появлении связи. Мы можем запускать попытку связи чуть раньше.

Польза: принять участие в разработке Logux; получить опыт работы с редкими API браузера.

Фронт: Делать несколько попыток при ошибке связи в Yaspeller

Для новичков, задача на неделю

Yaspeller — JS-утилита, которая проверяет орфографию, посылая запрос на сервера Яндекса. Интернет не всегда стабилен — иногда запрос заканчивается ошибкой связи.

Нужно исправить Yaspeller, чтобы он, в случае ошибки, делал еще 2 запроса и только потом возвращал ошибку.

Польза: получить опыт разработки под Node.js.

Фронт: Перенести все логи Logux Server на Bunyan

Для новичков, задача на неделю

Сейчас у Logux Server два типа логов — Human и Bunyan. Но можно сильно упростить код, если генерировать формат Human из Bunyan.

Польза: принять участие в разработке Logux; получить опыт разработки на Node.js и Bunyan.

Фронт: Общие тесты для хранилища лога Logux

Для новичков, задача на неделю

Logux может хранить лог в разных хранилищах — в памяти или IndexedDB. На подходе SQL-хранилище.

Сейчас у каждого хранилища свои тесты — много тестов дублируются. Нужно создать общие тесты для всех хранилищ.

Польза: принять участие в разработке Logux; получить опыт тестирования и Promise.

Бэк: Привязка параметров запроса к отчету rspec-sqlimit

Для новичков, задача на день

Необходимо доработать сообщение об ошибке RSpec-матчера exceed_query_limit из гема rspec-sqlimit таким образом, чтобы показывать выполненные SQL запросы вместе с их переменными.

Польза: возможность сделать первый вклад в Open Source проект (особенно если вы не знаете, с чего начать). Попутно можно познакомиться с механизмами ActiveSupport Notifications и Instrumentation, разобраться в устройстве матчеров RSpec.

Фронт: Навигация стрелками на сайте Stylelint

Для новичков, задача на пару дней

У Stylelint есть сайт со списком правил. Они перечисленны списком, но их сложно читать последовательно — нет ссылок на следующее и предыдущее правило.

Польза: получить опыт в JS.

Бэк: Инструмент для создания частичного, анонимизированного дампа базы данных

Для продвинутых, задача на неделю

Необходимо разработать инструмент (gem) для создания частичного, анонимизированного дампа базы данных Rails (ActiveRecord) приложения.

Это позволит нам использовать на тестовых серверах данные, максимально приближенные к боевым, но при этом не делать полный дамп (который может быть очень большим). Дополнительно в целях безопасности мы также хотим анонимизировать часть данных (персональные данные и т.п.).

Польза: возможность познакомиться с внутренностями ActiveRecord, попрактиковаться в написании Ruby gems и написать инструмент, которым будет активно пользоваться сообщество.

Бэк: Утилита для запуска WebSocket-клиентов с поддержкой сценариев

Для новичков, задача на неделю

Необходимо разработать Ruby-инструмент (CLI) для выполнения сценариев взаимодействия WebSocket-клиентов с сервером.

Утилита может быть использована как для blackbox-тестирования (в том числе и нагрузочного) WebSocket-приложений, так и просто в качестве удобного консольного клиента при разработке.

Польза: возможность применить на практике методы многопоточного программирования, попрактиковаться в написании CLI, поближе познакомиться с технологией WebSocket.

Решение: итоговая реализация основана на решениях Кирилла Архипова и Сергея Елушева, за что им выражается особая благодарность.

Бэк: Policy Object Pattern

Для новичков, задача на один-два дня

В GitHub-репозитории tram-policy опубликована документация к gem, реализующему базовый класс для контексто-специфичных валидаторов в Ruby. В описании приводится мотивация, примеры интерфейса и поддерживаемых фич; дан список классов и объектов, составляющих публичный интерфейс. Сейчас репозиторий содержит только документацию без какого-либо кода (помимо тривиальных объявлений).

Задача состоит в том, чтобы полностью разработать gem в соответствии с описанием.

Польза: возможность попрактиковаться в написании gem’ов, реализовать один из базовых паттернов разработки средствами чистого Ruby (попутно сняв «ауру магизма» с валидаторов, как мы привыкли к ним в Rails), познакомиться с классической библиотекой I18n, создать простыми средствами один из базовых компонентов для сложных Rails/PORO приложений.

Решение: Второе и третье места с благодарностью за участие в разработке достаются Анастасии Власовой и Сергею Чечаеву, также предложившим свои решения.

Фронт: Виджет для Logux

Для новичков, задача на неделю

Нужно сверстать виджет статуса синхронизации по макетам Антона Ловчикова.

Польза: принять участие в разработке Logux; получить больше опыта в webpack и создании виджетов.

Фронт: Тесты для Browserslist CLI

Для новичков, задача на пару дней

Browserslist используют Автопрефиксер, ESLint и Babel. У него есть консольный интерфейс. Но он не покрыт тестами — регулярно в нем находят проблемы.

Польза: получить больше опыта в тестировании.

Фронт: Bunyan-формат в Logux Server

Для новичков, задача на пару дней

Bunyan становится форматом логов де-факто в Node.js. Для удобной интеграции с инфраструктурой в Logux Server нужно добавить поддержку этого формата.

Польза: принять участие в разработке Logux; получить больше опыта в JS и построении систем логирования.

Фронт: Генератор настроек Stylelint

Для новичков, задача на пару дней

У CSSComb есть шикарный инструмент для генерации настроек. Он содержит неколько шагов, и на каждом шаге показывает несколько примеров кода. Пользователь выбирает, какой ему больше нравится — и после всех шагов получает готовые настройки для CSSComb.

Надо создать такой же для Stylelint. Только показывать настройки прямо в процессе.

Польза: получить реальный сайт в резюме, получить опыт в JS.

Фронт: Отображать ошибки с Logux-сервера на клиенте

Для новичков, задача на пару дней

Logux-сервер работает с клиентом по веб-сокету. При ошибке сервера, клиент не отобразит страницу с ошибкой, как было бы с PHP или Ruby on Rails.

Поэтому надо добавить способ отображения серверной ошибки к консоли браузера.

Польза: внести свой вклад в протокол Logux; получить больше опыта в JS.

Фронт: Цвета в логере Logux

Для новичков, задача на пару дней

В Logux Status есть log(), который выводит в консоль информацию о том, что происходит с Logux. Вывод идет обычным текстом, хотя Chrome уже поддерживает цветной вывод.

Польза: принять участие в разработке Logux; получить больше опыта в JS и console.

Фронт: Страница тестирования Logux Status

Для новичков, задача на пару дней

Для UI-функций недостаточно модульного тестирования. В Logux Status нужна страница, где можно было бы в реальности посмотреть на все его возможности.

Польза: принять участие в разработке Logux; получить больше опыта в JS и webpack.

Фронт: Добавить ES2015+ в конфиг ESLint для Logux

Для новичков, задача на пару дней

Logux написан на ES5, чтобы работать в браузере без компиляции. Но Logux Server не будет работать в браузере. Минимальной версией node.js будет 4, так что его можно переписать на ES6.

Польза: принять участие в разработке Logux; получить больше опыта в работе с ESLint и ES6.

Фронт: Перевести Logux-сервер на ES6

Для новичков, задача на пару дней

Logux написан на ES5, чтобы работать в браузере без компиляции. Но Logux Server не будет работать в браузере. Минимальной версией node.js будет 4, так что его можно переписать на ES6.

Польза: принять участие в разработке Logux; получить больше опыта в работе с ESLint и ES6.

Фронт: Логер в Logux Status

Для новичков, задача на пару дней

Logux Status — это подборка методов отображения статуса синхронизации в браузере. Нужно добавить вывод процесса синхронизации через console.log.

Польза: принять участие в разработке Logux; получить больше опыта в JS.

Фронт: Перевести Logux-сервер на µWS

Для новичков, задача на пару дней

Logux-сервер сейчас использует пакет ws для работы с веб-сокетами. Но пакет uWebSockets гораздо быстрее.

Польза: принять участие в разработке Logux; получить больше опыта в работе с веб-сокетами.

Фронт: Подтверждения закрытия вкладки в Logux Status

Для новичков, задача на пару дней

Logux Status — это подборка методов отображения статуса синхронизации в браузере. Нужно добавить подтверждение закрытия вкладки при неотправленных событиях в логе.

Польза: принять участие в разработке Logux; получить больше опыта в JS.

Фронт: Смена favicon в Logux Status

Для новичков, задача на пару дней

Logux Status — это подборка методов отображения статуса синхронизации в браузере. Нужно добавить смену favicon при онлайне, офлайне и ошибке.

Польза: принять участие в разработке Logux; получить больше опыта в JS.

Фронт: Привлекать внимание при ошибке в Logux Status

Для новичков, задача на пару дней

Logux Status — это подборка методов отображения статуса синхронизации в браузере. Нужно добавить смену <title> при ошибке, чтобы подсветить вкладку в браузере.

Польза: принять участие в разработке Logux; получить больше опыта в JS.

Бэк: Поддержка ассоциаций в Logidze

Для уверенных в себе, задача на неделю

Библиотека Logidze позволяет работать с версиями объектов ActiveRecord моделей и историей их изменений.

Необходимо расширить эту интеграцию, добавив поддержку ассоциаций.

Польза: возможность познакомиться с внутренностями ActiveRecord и научиться с ними работать.

Фронт: Проверка сообщений в Logux

Для новичков, задача на пару дней

Нужно добавить в Logux Sync код, который будет проверять формат и типы принятых сообщений.

Польза: принять участие в разработке Logux; разобраться с его протоколом.

Фронт: Настройки Logux-сервера через аргументы и переменные среды

Для новичков, задача на пару дней

Сейчас порт, хост и пути к TLS-ключам можно задать только в коде сервера. Нужно добавить в Logux-сервер чтение CLI-аргументов и переменных среды.

Польза: принять участие в разработке Logux; разобраться в Logux-сервере.

Фронт: Понятные ошибки в Logux-сервере

Для новичков, задача на пару дней

Нужно вывести подробное описание по самым распространенным ошибкам запуска Logux-сервера и объяснить что делать, чтобы их исправить.

Польза: принять участие в разработке Logux.

Фронт: Перевести Logux-сервер на снимки Jest

Для новичков, задача на пару дней

Logux-сервер сейчас использует свою систему снимков для тестирования. Но у Jest уже есть хорошая система снимков. Нужно перенести тесты на них.

Польза: принять участие в разработке Logux; получить больше опыта в тестировании.

Фронт: ES5-плагин для ESLint

Для новичков, задача на пару дней

Нужно написать eslint-plugin-es5 с правилами для ESLint для проверки того, что в коде не используется ES2016.

Польза: получить опыт расширения ESLint, поучаствовать в проекте Logux.

Фронт: Перенести проверку протокола в клиент Logux

Для новичков, задача на пару дней

Нужно добавить на клиент предупреждение о нешифрованом веб-сокете в продакшене. Убрать эти ограничения на сервере.

Польза: принять участие в разработке Logux и разобраться с его внутренним устройством.

Фронт: Парсер PostCSS для синтаксиса Sass

Для уверенных в себе, задача на месяц

PostCSS имеет сменные синтаксисы. Это особо полезно для Stylelint, чтобы проверять исходники. Сейчас можно работать с Less и SCSS.

Нужно взять dart-sass и сделать на его основе парсер синтаксиса Sass, который использует отступы.

Польза: познакомиться с командой Sass; многие крупные проекты смогут использовать ваш проект для Stylelint.

Фронт: Добавить кнопку Gitter на postcss.org

Для новичков, задача на пару дней

PostCSS использует чат Gitter для помощи разработчикам. У сервиса появился скрипт для добавления чата на любой сайт. Надо добавить его на postcss.org.

Польза: получить опыт с React и красивую строку в резюме.

Бэк: Поддержка Yarn для npmdc

Для новичков, задача на пару дней

Сейчас gem npmdc проверяет наличие установленных npm-пакетов и соответствие их версий на основе файла package.json.

Нужно добавить поддержку Yarn.

Польза: возможность попрактиковаться в программировании на чистом Ruby и написании gem’ов, помочь полезному проекту, который нужен в каждом современном большом Ruby веб-приложении.

Фронт: Среды в Browserslist

Для новичков, задача на пару дней

Автопрефиксер, Stylelint, babel-preset-env и cssnext используют Browserslist, чтобы пользователь мог разом указывать список браузеров, которые нужно поддерживать в этом проекте.

Нужно доработать Browserslist, чтобы в browserslist можно было указывать отдельный список для production и development среды.

Польза: сделать функцию, которой будут пользоваться многие веб-разработчики. Эта функция будет использоваться в create-react-app Дэна Абрамова.

Фронт: Browserslist и package.json

Для новичков, задача на пару дней

Автопрефиксер, Stylelint, babel-preset-env и cssnext используют Browserslist, чтобы пользователь мог разом указывать список браузеров, которые нужно поддерживать в этом проекте.

Нужно доработать Browserslist, чтобы он смотрел не только в browserslist, но и в ключ browserslist в package.json.

Польза: сделать функцию, которой будут пользоваться многие веб-разработчики. Эта функция будет использоваться в create-react-app Дэна Абрамова.

Фронт: Загрузка статистики для Browserslist

Для новичков, задача на пару дней

Автопрефиксер, Stylelint, babel-preset-env и cssnext используют Browserslist, чтобы пользователь мог разом указывать список браузеров, которые нужно поддерживать в этом проекте.

Browserslist поддерживает указание браузеров по проценту рыночной доли. Можно указывать реальную статистику пользователей сайта, чтобы точнее считать долю.

Нужно добавить поддержку файла browserslist-stats.json для указания статистики сайта.

Польза: сделать функцию, которой будут пользоваться куча веб-разработчиков.

Бэк: Фильтрация полей для версионирования в Logidze

Для новичков, задача на неделю

В библиотеку Logidze нужно добавить функционал фильтрации полей, учитываемых при версионировании.

Это позволит уменьшить размер лога, а значит расход ресурсов и время на обработку.

Польза: возможность поработать с базой данных на более низком уровне, попрактиковаться в написании процедур и разобраться в том, как работают триггеры.

Фронт: SugarSS в Sublime Text

Для новичков, задача на пару дней

Нужно добавить поддержку синтаксиса SugarSS в плагин PostCSS для Sublime Text.

Польза: очень простая задача, чтобы разобраться в опенсорсе; позволит понять, как устроен Sublime Text внутри; попасть в анонсы PostCSS.

Фронт: Событийная архитектура PostCSS

Для продвинутых, задача на месяц

Нужно придумать новый API для плагинов PostCSS — чтобы они все работали вместе, в одном цикле прохода по AST-дереву.

Задание сложное. Оно меньше про код и больше про переговоры, анализ и архитектуру. Но зато дает максимальное количество опыта.

Польза: стать одним из ведущих коммитеров PostCSS, добавить в резюме строку о разработке грамотной архитектуры в мировом проекте.

Бэк: Добавить новые источники данных в Ossert: StackOverflow

Для уверенных в себе, задача на несколько дней

Нужно добавить в Ossert новые источники данных. Отличным кандидадатом с достаточно богатым API является StackOverflow.

Это позволит охватить еще один важный аспект развития Open-Source библиотек — доступность и объем поддержки, а также заинтересованность в них.

Польза: возможность научиться работать с API StackOverflow и узнать больше о метриках и способах измерения зрелости свободного ПО.

Бэк: Инструмент для тестирования совместимости для AnyCable

Для новичков, задача на неделю

Нужно написать скрипт (и упаковать его в гем), который позволит проводить аттестационное тестирование (от англ. “conformance testing”) приложений-серверов для AnyCable.

Это повысит скорость и удобство разработки новых реализаций серверов, а также поможет поддерживать актуальность текущих реализаций.

Польза: возможность подробно изучить ActionCable и AnyCable, попрактиковаться в написании гемов и написать инструмент, которым будет активно пользоваться сообщество.

Бэк: Добавить новые источники данных в Ossert: Reddit

Для уверенных в себе, задача на несколько дней

Нужно добавить в Ossert новые источники данных. Отличным кандидадатом с достаточно богатым API является Reddit.

Это позволит охватить еще один важный аспект развития Open-Source библиотек — доступность и объем поддержки, а также заинтересованность в них.

Польза: возможность научиться работать с API Reddit и узнать больше о метриках и поведении разработчиков свободного ПО.

Бэк: API Endpoint Sampler

Для уверенных в себе, задача на неделю

Пусть существует Rails приложение с некоторым HTTP API. Будем каждый URL этого API считать эндпоинтом, например:

GET /api/v1/projects/:project_id/notes
GET /api/v1/projects/:project_id/notes/:note_id
POST /api/v2/projects
PUT /api/v3/projects/:project_id

Что хочется получить:

Gem для сбора, просмотра и тэгирования проб (пар запрос/ответ) определенных эндпоинтов HTTP API произвольного Rails-приложения. Тэгом считать произвольную строку.

Фронт: Тестирование CSS-минификаторов

Для новичков, задача на неделю

Нужно сделать скрипт, который будет брать пару популярных сайтов (типа GitHub) и на их верстке тестировать все минификаторы с помощью gemini или подобного тестирования по скриншотам. Результатом работы будет HTML страница с результатами каждого минификатора.

Польза: разобраться в тестировании по снимкам; познакомиться со всеми разработчиками CSS-минификаторов; строчка в резюме о том, что на качество всех CSS-минификаторов повлияли лично вы.