Здружуємо Python та Bash: реліз бібліотек python-shell та smart-env v. 1.0.1

Доброго часу доби всім!

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

Якщо коротко, то серед змін — автодоповнення команд, розширення можливостей із запуску команд, трохи рефакторингу та багфіксів.

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

Що нового в 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.

Про дати наступних релізів буде додатково оголошено у наступних каналах зв'язку:

Джерело: habr.com

Додати коментар або відгук