Доброго времени суток всем!

29 февраля 2020 года состоялся официальный микро-релиз библиотек smart-env и python-shell. Тем, кто не в курсе, предлагаю предварительно прочитать первый пост.

Если вкратце, то среди изменений — автодополнение команд, расширение возможностей по запуску команд, немного рефакторинга и багфиксов.

За деталями прошу под кат.

Что нового в python-shell?


Начну сразу с десерта.

Автодополнение команд


Согласитесь — удобно, когда редактор/IDE/терминал подсказывает название команды, а иногда и параметры вызова? Вот и python-shell понемногу продвигается в обеспечении подобного функционала. В связи с тем, что поля класса Shell под капотом de-facto не являются его полями (вездесущий __getattr__), автодополнение создано также с нуля (перегрузкой, соответственно, метода __dir__). В данный момент автодополнение работает средах BPython и IPython. Конечно, хочется увидеть интеграцию с более маститыми продуктами вроде PyCharm, и в этом направлении идет изучение возможностей реализации.

Добавление свойств


В рамках релиза класс Shell получил новое свойство last_command. Потребность в нем возникла вследствие того, что при генерации исключения ShellException командой с ненулевым кодом возврата объект Command не возвращался из вызова  __call__() объекта команды. Теперь же есть возможность сделать так:

try:
    command = Shell.touch('/foo.txt')
except ShellException:
    command = Shell.last_command

Также расширился список свойств объекта Command. Добавлено поле errors, которое возвращает вывод команды в поток ошибок.

Запуск команд с Python-невалидными именами


Практически в любой системе есть хоть одна программа, название которой не подходит в качестве идентификатора в Python (например, известная утилита 2to3). Вызвать ее с помощью

Shell.2to3()

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

Shell("2to3")  # возвращает объект команды

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

cmd = "python{}".format(sys.version_info[0])
Shell(cmd)(*args, **kwargs)

Мелкие изменения


  • Реализованы методы __repr__() и __str__() объекта класса Command, которые теперь выдают интуитивно понятные значения (команду с параметрами и ее stdout-выхлоп соответственно).
  • Мелкие исправления по коду.
  • Добавление покрытия тестами, а также реорганизация существующих.
  • Добавление классов Subprocess и Process, цель которых — создание дополнительного уровня абстракции при работе с модулем subprocess. По большей части, необходимо для устранения повторений кода при работе с Python 2/3, но потенциально может и дать и другие бонусы.

Что нового в smart-env?


В отличие от python-shell, в библиотеке smart-env изменений произошло меньше. Причина тому простая — нехватка свободного времени, в ходе чего некоторые потенциальные улучшения (например, автодополнение переменных окружения) были перенесены на следующий релиз.

По факту, в библиотеке сделаны следующие изменения:

  • Мелкие исправления по коду.
  • Рефакторинг.
  • Реорганизация и доработка имеющихся тестов.

Планы по следующим релизам


Библиотека python-shell


  • Добавление поддержки неблокирующих вызовов команд (параллелизация выполнения).

Библиотека smart-env


  • Реализация автодополнения переменных окружения в классе ENV.
  • Поддержка оператора in для проверки существования env-переменной.
  • Реализация поддержки функций str() и repr() для класса ENV.

О датах следующих релизов будет дополнительно объявлено в следующих каналах связи: