Хотите расти как разработчик и найти крутую работу? Не протирайте штаны — займитесь Open Source проектами. Так легче всего попасть в лучшие команды разработчиков и положить себе в резюме настоящий проект, вместо нелепых «примеров кода». Но найти подходящий проект для участия сложно. Начинаются лень и отговорки, а за ними — отсутствие профессионального роста, критики по-настоящему крутых программистов, уныние и застой.
На Cult of Martians мы собираем интересные задачи для современных веб-программистов. Можно выбрать подходящую по сложности, продолжительности и специализации. Задачи не выдуманы «из воздуха» — каждая решает насущную проблему, и решить ее можно через создание нового Open Source проекта или улучшение существующего. Решайте задачи, прокачивайтесь, присылайте решение на оценку. Лучших могут пригласить к себе на работу компании, программистам которых понравится ваше решен ие.
Для новичков, задача на день
Необходимо доработать сообщение об ошибке RSpec-матчера exceed_query_limit
из гема rspec-sqlimit таким образом, чтобы показывать выполненные SQL запросы вместе с их переменными.
Польза: возможность сделать первый вклад в Open Source проект (особенно если вы не знаете, с чего начать). Попутно можно познакомиться с механизмами ActiveSupport Notifications и Instrumentation, разобраться в устройстве матчеров RSpec.
RSpec матчер rspec-sqlimit публикует сообщение об ошибке (превышение лимита SQL запросов) в следующем виде:
require "rspec-sqlimit"
RSpec.describe "N+1 safety" do
it "doesn't send unnecessary requests to db" do
expect { User.create(name: "Joe") }.not_to exceed_query_limit(1)
end
end
Failure/Error: expect { User.create }.not_to exceed_query_limit(0).with(/INSERT/)
Expected to run maximum 0 queries that match (?-mix:INSERT)
The following 1 queries were invoked among others (see mark ->):
1) begin transaction (0.072 ms)
-> 2) INSERT INTO "users" ("name") VALUES (?) (0.368 ms)
3) commit transaction (147.559 ms)
В текстах запросов выше знаком (?)
отмечены непривязанные параметры.
Эти параметры содержатся под ключом :binds
(отдельно от текста запроса) в данных, передаваемом хуком sql.active_record.
Необходимо извлечь параметры запроса из данных и добавить их к сообщению об ошибке, чтобы оно обрело следующий вид:
Failure/Error: expect { User.create }.not_to exceed_query_limit(0).with(/INSERT/)
Expected to run maximum 0 queries that match (?-mix:INSERT)
The following 1 queries were invoked among others (see mark ->):
1) begin transaction (0.072 ms)
-> 2) INSERT INTO "users" ("name") VALUES ("Joe") (0.368 ms)
3) commit transaction (147.559 ms)
Это позволит точнее анализировать, что “пошло не так” при прогоне теста, быстрее находить ошибки, вызывающие лишние запросы к базе данных.
Инструкции по выполнению