• 3.1
  • 3.2
  • 6.1
  • Версия документации: 5.0

Отправка кода

Мы всегда благодарны за вклад в код Django. Действительно, отчеты об ошибках с сопутствующими патчами будут исправлены гораздо быстрее, чем те, у которых нет решения.

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

Если вы исправляете действительно тривиальную проблему, например, меняете слово в документации, предпочтительный способ предоставить исправление — использовать пул-реквесты в GitHub без тикета в Trac.

Более подробную информацию о пул-реквестах см. в Работа с Git и GitHub.

«Получение» тикетов

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

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

Если вы определили, какой вклад вы хотите внести, и вы способны выполнить задачу (что измеряется вашими способностями к кодингу, знанием внутренних компонентов Django и наличием времени), заявите о нем, выполнив следующие шаги:

  • Войдите, используя свою учетную запись GitHub или создайте учетную запись в нашей системе тикетов. Если у вас есть учетная запись, но вы забыли пароль, вы можете сбросить ее, используя страницу сброса пароля.

  • Если тикета по этой проблеме еще нет, создайте его в нашем тикет трекере.

  • Если тикет по этой проблеме уже существует, убедитесь, что никто другой не его не забрал. Для этого посмотрите раздел «Owned by» тикета. Если он назначен «nobody», то его можно забрать. В противном случае, кто-то другой может работать над этим тикетом. Либо найдите другую ошибку/функцию, над которой нужно поработать, либо свяжитесь с разработчиком, работающим над тикетом, чтобы предложить свою помощь. Если тикет был назначен на несколько недель или месяцев без какой-либо активности, вероятно, безопасно переназначить его себе.

  • Войдите в свою учетную запись, если вы еще этого не сделали, нажав «GitHub Login» или «DjangoProject Login» в левом верхнем углу страницы тикета. После входа в систему вы можете нажать кнопку «Modify Ticket» в нижней части страницы.

  • Примите тикет, нажав кнопку-переключатель «assign to» в разделе «Action». Ваше имя пользователя будет указано в текстовом поле по умолчанию.

  • Наконец, нажмите кнопку «Submit changes» внизу, чтобы сохранить изменения.

Примечание

Django Software Foundation просит всех, кто вносит более чем тривиальное изменение в Django, подписывать и отправлять Лицензионное соглашение участника, это гарантирует, что Django Software Foundation имеет лицензию на все вклады, что позволяет всем пользователям иметь лицензию.

Ответственность заявителей за тикеты

Приняв тикет, вы берете на себя обязанность поработать над этим тикетом в разумные сроки. Если у вас нет времени поработать над ним, либо отмените его, либо не назначайте себе его вообще!

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

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

Как всегда, больше общения лучше, чем меньше общения!

Какие тикеты следует брать?

В некоторых случаях прохождение всех этапов получения тикетов оказывается излишним.

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

Всегда приемлемо, независимо от того, заявил ли кто-то об этом или нет, привязывать предложения к тикету, если у вас есть готовые изменения.

Стиль вклада

Убедитесь, что любой ваш вклад соответствует следующим требованиям:

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

  • Если код добавляет новую функцию или изменяет поведение существующей функции, изменение также должно содержать документацию.

Когда вы считаете, что ваша работа готова к проверке, отправьте пул реквест GitHub. Если вы не можете отправить пул реквест по какой-либо причине, вы также можете использовать патчи в Trac. При использовании этого стиля следуйте этим рекомендациям.

  • Отправляйте патчи в формате, возвращаемом командой git diff.

  • Прикрепите исправления к тикету в трекере тикетов, используя кнопку «attach file». Пожалуйста, не помещайте исправление в описание тикета или комментарий, если это не исправление в одну строку.

  • Назовите файл исправления расширением .diff; это позволит системе отслеживания тикетов применить правильную подсветку синтаксиса, что весьма полезно.

Независимо от того, каким способом вы отправите свою работу, следуйте этим шагам.

  • Убедитесь, что ваш код соответствует требованиям в нашем контрольном списке.

  • Установите флажок «Has patch» в тикете и убедитесь, что флажки «Needs documentation», «Needs tests» и «Patch needs improvement» не отмечены. Это приведет к тому, что тикет появится в очереди «Patches needing review» на Панели управления разработкой.

Вклады, требующие обратной связи от сообщества

Требуется более широкое обсуждение в сообществе, когда патч вводит новую функциональность Django и принимает какое-либо решение по дизайну. Это особенно важно, если подход подразумевает депрекацию или вносит критические изменения.

Ниже приведены различные подходы к получению отзывов от сообщества.

Форум Django

Вы можете предложить изменение на Форуме Django. Вам следует объяснить необходимость изменения, подробно рассмотреть подход и обсудить альтернативы.

Пожалуйста, включите ссылку на такие обсуждения в ваши сообщения.

Пакет сторонних разработчиков

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

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

Как только этот пакет станет стабильным и появятся явные преимущества от включения его функционала в ядро ​​Django, следующим шагом будет начало обсуждения на Форуме Django.

Предложение по улучшению Django (DEP - Django Enhancement Proposal)

Подобно PEP в Python, Django имеет Предложения по улучшению Django или DEP. DEP — это проектный документ, который предоставляет информацию сообществу Django или описывает новую функцию или процесс для Django. Они предоставляют краткие технические спецификации функций вместе с обоснованиями. DEP также являются основным механизмом для предложения и сбора отзывов сообщества о важных новых функциях.

Прежде чем рассматривать возможность написания DEP, рекомендуется сначала открыть обсуждение на Форуме Django. Это позволяет сообществу предоставить отзывы и помогает доработать предложение. Как только DEP будет готов, Руководящий совет голосует за его принятие.

Некоторые примеры DEP, которые были одобрены и полностью реализованы:

Депрекация функции

Есть несколько причин, по которым код в Django может быть признан устаревшим:

  • Если функция была улучшена или изменена способом, несовместимым с предыдущими версиями, старая функция или поведение будут упразднены.

  • Иногда Django включает в себя бэкпорт библиотеки Python, которая не включена в версию Python, которую Django в настоящее время поддерживает. Когда Django больше не нужно поддерживать старую версию Python, которая не включает в себя библиотеку, библиотека будет объявлена ​​устаревшей в Django.

Как описывает политика устаревания первый выпуск Django, в котором устаревает функция (A.B) должен вызывать RemovedInDjangoXXWarning (где XX - это версия Django, в которой функция будет удалена) при вызове устаревшей функции. Предполагая, что у нас хорошее тестовое покрытие, эти предупреждения преобразуются в ошибки при запуске набора тестов с включенными предупреждениями python -Wa runtests.py. Таким образом, при добавлении RemovedInDjangoXXWarning вам необходимо устранить или отключить любые предупреждения, генерируемые при запуске тестов.

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

  1. В конкретном тесте:

    from django.test import ignore_warnings
    from django.utils.deprecation import RemovedInDjangoXXWarning
    
    
    @ignore_warnings(category=RemovedInDjangoXXWarning)
    def test_foo(self): ...
    
  2. Для всего тест кейса:

    from django.test import ignore_warnings
    from django.utils.deprecation import RemovedInDjangoXXWarning
    
    
    @ignore_warnings(category=RemovedInDjangoXXWarning)
    class MyDeprecatedTests(unittest.TestCase): ...
    

Вам также следует добавить тест на предупреждение об устаревании:

from django.utils.deprecation import RemovedInDjangoXXWarning


def test_foo_deprecation_warning(self):
    msg = "Expected deprecation message"
    with self.assertWarnsMessage(RemovedInDjangoXXWarning, msg) as ctx:
        # invoke deprecated behavior
        ...
    self.assertEqual(ctx.filename, __file__)

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

import warnings
from django.utils.deprecation import RemovedInDjangoXXWarning


# RemovedInDjangoXXWarning.
def old_private_helper():
    # Helper function that is only used in foo().
    pass


def foo():
    warnings.warn(
        "foo() is deprecated.",
        category=RemovedInDjangoXXWarning,
        stacklevel=2,
    )
    old_private_helper()
    ...

Наконец, необходимо внести несколько обновлений в документацию Django:

  1. Если существующая функция задокументирована, отметьте ее как устаревшую в документации, используя аннотацию .. deprecated:: A.B. Включите краткое описание и примечание о пути обновления, если применимо.

  2. Добавьте описание устаревшего поведения и способ обновления, если он применимв текущие заметки о выпуске (docs/releases/A.B.txt) под заголовком «Функции, устаревшие в A.B».

  3. Добавьте запись в шкалу времени депрекации (docs/internals/deprecation.txt) под соответствующей версией, описывающую, какой код будет удален.

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

Изменения в JavaScript

Информацию о написании JavaScript см. в документации Патчи JavaScript.

Патчи оптимизации

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

Тесты django-asv

django-asv отслеживает производительность кода Django с течением времени. Эти тесты можно запустить в запросе на извлечение, пометив запрос на извлечение как benchmark. Добавление к этим тестам настоятельно рекомендуется.

Чеклист внесения изменений

Используйте этот контрольный список для проверки пул реквеста. Если вы проверяете пул реквест, который не принадлежит вам и соответствует всем критериям ниже, пожалуйста, установите «Triage Stage» в соответствующем тикете Trac на «Ready for checkin». Если вы оставили комментарии для улучшения запроса на включение, пожалуйста, отметьте соответствующие флажки в тикете Trac на основе результатов вашего обзора: «Patch needs improvement», «Needs documentation» и/или «Needs tests». По мере того, как позволяет время и интерес, мерджеры проводят окончательные проверки тикетов «Ready for checkin» и либо фиксируют изменения, либо возвращают их на уровень «Accepted», если требуется дополнительная работа. Если вы хотите стать мерджером, проведение тщательных проверок вкладов — отличный способ заслужить доверие.

Ищете патч для обзора? Ознакомьтесь с разделом «Patches needing review» на Панели управления разработкой Django.

Хотите, чтобы ваш запрос на извлечение был рассмотрен? Убедитесь, что флаги Trac в тикете установлены так, чтобы тикет появился в этой очереди.

Документация

Баги

  • Есть ли надлежащий регрессионный тест (тест должен быть неудачным, прежде чем исправление будет применено)?

  • Если это ошибка, которая подходит для бэкпорта в стабильную версию Django, есть ли примечание к выпуску в docs/releases/A.B.C.txt? Исправления ошибок, которые будут применены только к основной ветке, не нуждаются в примечании к выпуску.

Новые функции

Депрекация функции

См. руководство Депрекация функции.

Все изменения кода

  • Соответствует ли стиль кода нашим рекомендациям? Есть ли какие-либо ошибки black, blacken-docs, flake8 или isort? Вы можете установить хуки pre-commit, чтобы автоматически перехватывать эти ошибки.

  • Если изменение обратно несовместимо, есть ли примечание в заметках о выпуске (docs/releases/A.B.txt)?

  • Завершается ли набор тестов Django успешно?

Все тикеты

Back to Top