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

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

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

Помощь запрашиваетФил ПирожковФил Пирожков Фил Пирожков

Бэк: 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, принести пользу сообществ‎у.

Постановка задачи

Пусть в spec/spec_helper.rb указано:

RSpec.configure do |config|
  config.alias_example_to :story
  config.alias_example_group_to :storybook
  config.alias_it_behaves_like_to :as_in_story
end

В проекте есть спек:

# spec/stories/horror_spec.rb
RSpec.describe Horror do
  storybook "in the woods" do
    story "there was a dark figure" do
      # ...
    end
  end

  context "in the open" do
    story "she appeared out of thin air" do
      # ...
    end
  end

  as_in_story "she stared with her empty eye wells"
end

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

AllCops:
  RSpec:
    ExampleAlias:
      - story
    ExampleGroupAlias:
      - storybook
    ItBehavesLikeAlias:
      - as_in_story
    HookAlias:
      before:
        - setup
    MatcherAlias:
      be_sorted_by: a_list_sorted_by
    NegatedMatcher:
      change: not_change

Это решает реальные задачи, например, проверки спеков Pundit (метод permissions для группы тестов), failed/succeed из Action Policy, setup (псевдоним для before) из RSpec Rails, is_able_to (псевдоним для it_behaves_like) в CanCanCan.

Подробнее ознакомиться с задачей можно здесь и в связанных тикетах.

Советы по реализации

Не делать сразу все конфигурационные опции, начать с какой-то одной, например, HookAlias. Утвердить прототип с мейнтейнерами RuboCop RSpec.

Можно посмотреть в качестве примера на попытку реализации здесь.

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

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

  1. Обсудить задачу, если есть вопросы.
  2. Форкнуть проект RuboCop RSpec на GitHub.
  3. Реализовать необходимый функционал и покрыть его тестами.
  4. Сделать Pull Request.

Присылайте свои решения: