Как стать автором
Обновить

Xmenu — маленький «фреймворк» для построения консольных меню

Время на прочтение3 мин
Количество просмотров13K
Доброго времени суток, дорогие хабралюди! Так уж случилось, что по долгу службы выпало мне писать консольное приложение (меню) для решения насущных проблем связанных с миграциями баз данных (да и не только миграциями, но и с другим, разного вида, обслуживанием). Сразу оговорюсь, что о миграцих речь под катом не пойдет! Разработка ведется на языке Python, поэтому далее следует непереводимая игра слов с использованием национальных диалектов.
Текущая поделка сослуживца представляла из себя пластилиновый шарик плотно слепленных и переплетенных друг с другом частей. Поэтому, что-либо изменить, дополнить или на худой конец понять, в том коде я не смог, поэтому решил переписать данную балалайку, предварительно разделив архитектурные компоненты. Пошел в Сеть на поиски python-фреймворка для построения консольных менюшек. Поиски не увенчались успехом — не нашлось просто в Сети фреймворков для построение хотя бы мало-мальски пригодного к использованию меню. Но вот нашел двух " почти кандидатов": cliff не совсем соответствует моим запросам т.к. это не консольное меню, собственно, а просто интерактивный сеанс (командная строка) в которой возможно руками вводить команды и наслаждаться автодополнением. Не то. console совсем не соответствует желаниям т.к. это
тот же сыр, но под другим соусом
Тем более, более чем сырой. Простите за тафталогию.
Начать я, собственно, решил с написания пары классов для отрисовки консольного меню (основу отрисовки услужливо предоставил мне модуль cmd2, который, как следствие требуется для работы с моим маленьким xmenu). Собственно в реализации никаких хитростей нет. Тройка классов, корутина для хранения истории — вот и весь сказ. Получился вот такой мини-фреймворк. Прошу не начинать сразу плеваться, т.к. призываю Вас знать, что это pre-alpha версия. А забрать и посмотреть xmenu можно на гитхабе. А тем, кому не хочется разбираться в отсутствующей докуметации (пока, отсутствующей), опубликую пример клиентского кода вот здесь:
# -*- coding: utf-8 -*-
import sys
from pymenu import Item, Menu, App


class Twitter(Item):
    ''' This is twitter'''

    def __call__(self):
        sys.stdout.write('{0}\n'.format(self.name))


class Multiplier(Item):
    ''' Printing 1. Forever 1.'''

    def __call__(self):
        sys.stdout.write('Lorem ipsum Labor Excepteur ea ut.')


def func():
    ''' I am a function. Tasty and fragrand.'''

    print 'This is it.'


class MyApp(App):
    ''' This is my App'''

    def __init__(self):

        menu = Menu(name='Main menu')
        menu.add(Twitter(name='Project run'), color='red')
        menu.add(Twitter(name='Other'))
        math = Menu(name='Math')
        math.add(Multiplier(name='Multi'), color='underline')
        inc_menu = Menu(name='Database')
        inc_menu.add(math)
        inc_menu.add(Twitter(name='Create'))
        inc_menu.add(Twitter(name='Drop'))
        menu.add(inc_menu)
        functinons = Menu(name='Functinons', doc='Useful functions!')
        functinons.add(func, name='f')
        menu.add(functinons, color='underline')
        super(MyApp, self).__init__(menu=menu, stdout=sys.stdout)


def main():
    MyApp().run()


if __name__ == '__main__':
    main()

Получится вот так:

Это абсолютно хаотичное меню — по наполнению не судите.
Итак, xmenu обеспечивает:
  • Меню бесконечной вложенности (меню вкладываются в меню)
  • Раскрашивание элементов меню
  • Возможность ходить по истории назад (в будущем быть может сделаю хождение и вперед)
  • На пункты меню можно навешивать любые callable-объекты
  • Xmenu автоматически собирает доки со всех объектов и аггрегирует их в одном меню — help.

Я пока не такой активный деятель движения открытого программного обеспечения, но обещаю двигаться в этом направлении, буду развивать и дополнять сей инструмент. Спасибо всем, кто дочитал до этого предложения, и особенное спасибо тем, кто затестил, высказал свои пожелания и осветил мои огрехи. И видит Хабр, быть может я не зря старался, ведь это моя первая статья и я только учусь быть хабрачеловеком.
UPD: версия либы обновилась — спишите видеть на гитхабе
Теги:
Хабы:
Всего голосов 6: ↑5 и ↓1+4
Комментарии11

Публикации

Истории

Работа

Python разработчик
123 вакансии
Data Scientist
76 вакансий

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
19 сентября
CDI Conf 2024
Москва
20 – 22 сентября
BCI Hack Moscow
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
25 сентября
Конференция Yandex Scale 2024
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн