Статьи

Gonssole недель: ой — это рамки

Хотя Eclipse поставляется с комплексным инструментом Git, кажется, что для определенных задач многие разработчики переключаются на командную строку. Это дало мне и Рюдигеру идею начать проект с открытым исходным кодом, чтобы обеспечить полную интеграцию консоли для IDE. То, что произошло до сих пор в течение недель gonsole, можно прочитать в git init gonsole , интеграции eclipse egit и помощи с содержимым для команд git .

Со времени нашего последнего обновления мы были заняты заменой большинства фрагментов исследовательского кода чистыми реализациями, основанными на модульных тестах. Кроме того, архитектура подверглась тщательному пересмотру, что привело к разделению функциональности ядра многократного использования и специфических реализаций gonsole. Хотя это и не было основной целью, доработка привела к API, который позволяет легко реализовывать другие консоли с такими же характеристиками. В этом посте мы расскажем о нескольких шагах, необходимых для написания вашей собственной консоли.

Предположим, что вы хотите создать калькулятор на основе командной строки, который обеспечивает арифметические операции, такие как sum , sub и т. Д. Основной набор функций обеспечивается com.codeaffine.console.core который предоставляет API для предоставления консоли калькулятора.

Прежде всего нам нужен проект плагина, который объявляет необходимый импорт:

калькулятор-проект

В проекте gonsole мы привыкли к вложенному TDD . Вот почему мы хотим начать с написания приемочного теста. К счастью, com.codeaffine.console.core.pdetest экспортирует класс ConsoleBot который позволяет нам удобно создавать такие тесты. Поскольку эти тесты выполняются в среде плагинов, мы поместим их во фрагмент .

калькулятор тест-фрагмент

С этими двумя проектами мы готовы написать наш первый счастливый тест:

калькулятор-конец-в-конец

Как вы можете видеть, ConsoleBot — это Rule JUnit, которое скрывает детали создания консоли, готовой к тестированию. Кроме того, он позволяет имитировать взаимодействие с пользователем, например вводить команды и открывать помощник по содержимому. Для удобной проверки ожидаемого результата есть специальное утверждение AssertJ .

ConsoleBot#open() ожидает реализацию ConsoleConfigurer качестве первого параметра. Просто для того, чтобы получить нашу тестовую компиляцию, следующим шагом является предоставление ее скелетной реализации. Такие конфигурации предоставляют подключаемые части, которые составляют конкретную консольную реализацию. Но прежде чем мы сможем запустить нашу консоль в первый раз, нужно сделать еще одну вещь:

первый запуск

Чтобы подключить консоль к представлению консоли Eclipse, наш плагин должен предоставить расширение для точки расширения org.eclipse.ui.console.consoleFactories . Последний ожидает реализацию IConsoleFactory которая предоставляется нашим консольным API-типом ConsoleFactory . Единственное необходимое кодирование — переопределить ConsoleFactory#getConsoleConfigurer() как показано выше.

Конечно, имея только скаффолд, консоль времени выполнения не делает ничего полезного, и запуск нашего PDETest приводит к красной полосе:

калькулятор-первый отказ

Теперь мы готовы разработать компоненты интерпретатора, контент-ассистента и подсказок для ввода обычным способом TTD. Мы продолжаем делать это, пока наш сквозной тест не станет зеленым. Мы даже столкнулись с тем, что это может быть хорошей отправной точкой для пробного прорыва в случае, если мы не уверены, каким путем идти. Как только сквозные тесты станут зелеными, и мы обретем достаточную уверенность в нашем решении, мы начнем поэтапно заменять взломанные переходы решениями, основанными на тестировании.

Для примера мы взяли хакерский подход:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class CalculatorConsoleCommandInterpreter
  implements ConsoleCommandInterpreter
{
 
  static final String SUM = "sum";
 
  private static final String SUM_RESULT
    = "The sum of %s and %s is %s" + LINE_DELIMITER;
 
  private final ConsoleOutput consoleOutput;
 
  CalculatorConsoleCommandInterpreter( ConsoleOutput consoleOutput ) {
    this.consoleOutput = consoleOutput;
  }
 
  @Override
  public boolean isRecognized( String... commandLine ) {
    return commandLine.length > 0 && SUM.equals( commandLine[ 0 ] );
  }
 
  @Override
  public String execute( String... commandLine ) {
    int sum =   parseInt( commandLine[ 1 ] )
              + parseInt( commandLine[ 2 ] );
    consoleOutput.write( format( SUM_RESULT,
                                 commandLine[ 1 ],
                                 commandLine[ 2 ],
                                 valueOf( sum ) ) );
    return null;
  }
}

Фрагмент делает наш тест счастливым, предоставляя упрощенный ConsoleCommandInterpreter который поддерживает команду sum . Наш калькулятор в действии, дополненный аналогично разработанным ContentProposalProvider теперь выглядит так:

калькулятор-суммы и сумма, содействующие

Хотя о пользовательских реализациях консоли можно сказать гораздо больше, пришло время завершить эту экскурсию. Обратите внимание, что API ядра консоли все еще находится в стадии разработки и может претерпеть существенные изменения. Для тех, кто заинтересован, мы добавили проекты калькулятора в git-репозиторий gonsole и его сборку:

Репозиторий: https://github.com/rherrmann/gonsole

Сборка: https://travis-ci.org/rherrmann/gonsole

Это гарантирует, что пример будет обновляться. И, конечно, для более взрослого решения вы всегда можете взглянуть на реализации gonsole.

Вот и все на сегодня, давайте вернемся к работе. И, может быть, в следующий раз мы действительно сможем показать вам больше функций поддержки контента …

Ссылка: недели gonssole: ой — это фреймворк от нашего партнера JCG Фрэнка Аппеля в блоге Code Affine .