Pull to refresh

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

Reading time3 min
Views13K
Доброго времени суток, дорогие хабралюди! Так уж случилось, что по долгу службы выпало мне писать консольное приложение (меню) для решения насущных проблем связанных с миграциями баз данных (да и не только миграциями, но и с другим, разного вида, обслуживанием). Сразу оговорюсь, что о миграцих речь под катом не пойдет! Разработка ведется на языке 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: версия либы обновилась — спишите видеть на гитхабе
Tags:
Hubs:
Total votes 6: ↑5 and ↓1+4
Comments11

Articles