Рубрики
Без рубрики

Улучшение кода Python постепенно

Как использовать темнее, чтобы переформатировать только модифицированные регионы в коде Python. Теги с python, pteest, черный.

Фото: Matěj Baťha. / CC-BY-SA 2.5

Многие из нас приняли инструменты для улучшения качества кода, как

  • Код форматировац,
  • ЛИНТЕРЫ И.
  • Измерение охвата теста.

Для Python такие инструменты включают например:

  • Черный (Форматирование кода)
  • Исторт (Импортная сортировка и форматирование)
  • Пилинт (качество кода)
  • Flake8 (Стиль кода)
  • Marpy (статическая набравка)
  • Coverage.py (тестовое покрытие)

Для новых и небольших проектов простым применять такие автоматические модификации кода и проверки качества для всей базы кодовой базы. Это может быть сделано локально с Git крючки, а также в трубопроводе CI.

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

Одним из веских причин не переформатировать кодовую базу в одном Go – это то, что информация о авторстве теряется для всех переформатированных линий, которые могут создавать сотрудничество по ошибкам и функциям сложнее. В то время как Git –ignore-rev Предлагает одно решение для этой проблемы, этот блог Post представляет еще одну альтернативу.

Идея позади Темнее это переформатировать код, используя Черный (и необязательно isort ), но примените только новые форматирование в регионы, которые были изменены разработчиком.

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

Темнее Может также проводить проверки качества. Нарушения отфильтрованы, поэтому вы видите только те, которые касаются вновь модифицированных регионов.

Наконец, Pтойцы-темнее Плагин интегрирует все это с Питиш Таким образом, переформатирование и проверки работают вместе с модульными тестами.

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

Я также покажу, как интегрировать это с помощью тестового набора, используя Pтойцы-темнее плагин.

Давайте сначала клонировать DateutiL упаковка:

$ git clone https://github.com/dateutil/dateutil.git
$ cd dateutil

В январе 2020 года был крошечный филиал функции, которую мы можем использовать в качестве морской свинки для Темнее (см. DateutiL/DateutiL # 993 ):

$ export GIT_PAGER=cat

$ git log --graph --oneline a332879..6edfecd
* 6edfecd Update documentation links
*   110a09b Merge pull request #993 from pganssle/parsererror_repr
|\  
| * ea7f441 Fix custom repr for ParserError
|/  
* 21fe6e9 Merge pull request #987 from eastface/issue_981

Теперь мы можем воссоздать ситуацию до pganssle/parsererror_repr Филиал был объединен, сброс Мастер вернуться до ветки …

$ git reset --hard 21fe6e9
HEAD is now at 21fe6e9 Merge pull request #987 from eastface/issue_981

… и воссоздание pganssle/parsererror_repr Ветвь в точке до того, как слияние было сделано:

$ git checkout -b pganssle/parsererror_repr ea7f441
Switched to a new branch 'pganssle/parsererror_repr'

Наш репозиторий в настоящее время в аналогичном состоянии, как до того, как ветвь была объединена:

$ git log --graph --oneline master^..
* ea7f441 (HEAD -> pganssle/parsererror_repr) Fix custom repr for ParserError
* 21fe6e9 (master) Merge pull request #987 from eastface/issue_981
* a332879 Added Mark Bailey to AUTHORS file
* 79d2e48 Fix TypeError in parser wrapper logic

Изменения, представленные pganssle/parsererror_repr Филиал:

$ git diff -U0 master
diff --git a/changelog.d/991.bugfix.rst b/changelog.d/991.bugfix.rst
new file mode 100644
index 0000000..473082e
--- /dev/null
+++ b/changelog.d/991.bugfix.rst
@@ -0,0 +1 @@
+Fixed the custom ``repr`` for ``dateutil.parser.ParserError``, which was not defined due to an indentation error. (gh issue #991, gh pr #993)
diff --git a/dateutil/parser/_parser.py b/dateutil/parser/_parser.py
index 7fcfa54..8d67584 100644
--- a/dateutil/parser/_parser.py
+++ b/dateutil/parser/_parser.py
@@ -1603,2 +1603,3 @@ class ParserError(ValueError):
-        def __repr__(self):
-            return "%s(%s)" % (self.__class__.__name__, str(self))
+    def __repr__(self):
+        args = ", ".join("'%s'" % arg for arg in self.args)
+        return "%s(%s)" % (self.__class__.__name__, args)
diff --git a/dateutil/test/test_parser.py b/dateutil/test/test_parser.py
index 605705e..cfa4bbb 100644
--- a/dateutil/test/test_parser.py
+++ b/dateutil/test/test_parser.py
@@ -945,0 +946,9 @@ def test_decimal_error(value):
+
+def test_parsererror_repr():
+    # GH 991 — the __repr__ was not properly indented and so was never defined.
+    # This tests the current behavior of the ParserError __repr__, but the
+    # precise format is not guaranteed to be stable and may change even in
+    # minor versions. This test exists to avoid regressions.
+    s = repr(ParserError("Problem with string: %s", "2019-01-01"))
+
+    assert s == "ParserError('Problem with string: %s', '2019-01-01')"

На поверхности все изменения выглядят Черный Соответствует. Если вся база кода в Мастер Был уже Черный отформатирован, мы могли бы просто запустить Черный чтобы увидеть, если мы что-нибудь пропустили в pganssle/parsererror_repr филиал. Но увы:

$ pip install -q black

$ black --diff .
### ... LOTS of output redacted ...
All done! ✨ 🍰 ✨
35 files would be reformatted, 3 files would be left unchanged.

Хорошо, спасибо Черный , но нас интересуют только изменения в Это Филиал хорошо отформатирован.

К сожалению Черный не предлагает эту функциональность из коробки. Вместо этого мы будем использовать Темнее :

$ pip install -q darker

$ darker --diff --revision master... .
--- dateutil/test/test_parser.py
+++ dateutil/test/test_parser.py
@@ -944,6 +944,7 @@
     with pytest.raises(ParserError):
         parse(value)

+
 def test_parsererror_repr():
     # GH 991 — the __repr__ was not properly indented and so was never defined.
     # This tests the current behavior of the ParserError __repr__, but the

ДА! Таким образом, мы пропустили одну новую линию до определения функции!

Теперь мы можем просто запустить Темнее Без - Дейфф Флаг, так что на самом деле пишет это изменение в исходный код:

$ darker --revision master... . 

$ git diff -U1
diff --git a/dateutil/test/test_parser.py b/dateutil/test/test_parser.py
index cfa4bbb..53a02de 100644
--- a/dateutil/test/test_parser.py
+++ b/dateutil/test/test_parser.py
@@ -946,2 +946,3 @@ def test_decimal_error(value):

+
 def test_parsererror_repr():

Теперь мы можем установить Pтойцы-темнее :

$ pip install -q pytest-darker

Мы настроим Темнее Так что он всегда проверяет, но не изменяет исходные файлы. Это сделано в pyproject.toml файл:

[tool.darker]
src = [
    "."
]
check = true
diff = true
revision = "master..."

Теперь мы можем запустить тестовый набор и проверить форматирование филиала функции:

$ pip install --quiet --requirement requirement-dev.txt
$ pytest --darker
====================== test session starts =======================
# ... lots of output ...
dateutil/test/test_parser.py F............................ [ 38%]
.......................................................... [ 40%]
.......................................................... [ 43%]
.......................................................... [ 46%]
...................xxxxxxxxxxxxx..........                 [ 48%]
# ... more output ...
============================ FAILURES ============================
______________________ Darker format check _______________________
Edited lines are not Black formatted
---------------------- Captured stdout call ----------------------
--- dateutil/test/test_parser.py
+++ dateutil/test/test_parser.py
@@ -944,6 +944,7 @@
     with pytest.raises(ParserError):
         parse(value)

+
 def test_parsererror_repr():
     # GH 991 — the __repr__ was not properly indented and so was never defined.
     # This tests the current behavior of the ParserError __repr__, but the
==================== short test summary info =====================
FAILED dateutil/test/test_parser.py::DARKER
===== 1 failed, 2012 passed, 84 skipped, 19 xfailed in 7.12s =====

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

  • направлять вас интегрировать Темнее с IDE,
  • Покажите, как быть Трэвис CI на Github Run. Темнее , и
  • Объясните загадочный - Известный хозяин ... Вариант командной строки.
  • Покажите, как сортировать импорт и выполнять подцингирование кода через Темнее

Мы маленькая счастливая куча разработчиков, способствующих Темнее на его репозиторий Github – Снимите, скажите HELLO и протянули вашу передачу рук и отправляя запросы на потяну и отчеты об ошибках! У нас тоже иногда есть Виртуальные встречи Распонницы континенты и часовые пояса, и мы рады видеть вас там!

Оригинал: “https://dev.to/akaihola/improving-python-code-incrementally-3f7a”