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

—

от автора

Доброго времени суток, дорогие хабралюди! Так уж случилось, что по долгу службы выпало мне писать консольное приложение (меню) для решения насущных проблем связанных с миграциями баз данных (да и не только миграциями, но и с другим, разного вида, обслуживанием). Сразу оговорюсь, что о миграцих речь под катом не пойдет! Разработка ведется на языке 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.

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

ссылка на оригинал статьи http://habrahabr.ru/post/178819/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *