Skip to content

Conversation

@Geckostya
Copy link
Owner

Я рассмотрел 3 варианта библиотек:

  1. https://github.com/Kotlin/kotlinx.cli
  2. https://github.com/xenomachina/kotlin-argparser
  3. https://ajalt.github.io/clikt/

Выбрал вторую, теперь комментарии почему:

  1. Отсутствие документации и описания, как подключить к проекту без скачивания репозитория сразу деморализовало, особенно учитывая, что есть второй вариант.
  2. Наличие документации, пусть и не слишком полной, но понятной. Библиотека удобна в использовании, проста в освоении. Хватает функционала для выполнения задания и последующих возможных расширений.
  3. Овер архитектура(шмархетектура), выглядит слишком сложно и заморочено. Хорошее преимущество - полная поддержка unix стиля, но несмотря на то, что библиотека лучше предыдущих, из-за её сложности использовать её в целях данного проекта нецелесообразно.

Есть ещё JCommander, но на Котлине лучше, по возможности, использовать библиотеки Котлина, чтобы не костылять с джавовской совместимостью, а пользоваться сразу адаптированной библиотекой с кучей синтаксических плюшек.

Copy link

@ArtyomLobanov ArtyomLobanov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

И заберите изменения из ветки bash, пожалуйста. А то без cat, например, грустно

input.forEachLine {
val matchString = if (args.ignoreCase) it.toLowerCase() else it
val matchPattern = if (args.ignoreCase) args.pattern.toLowerCase() else args.pattern
val wordEnd = if (args.wordRegexp) "(\\s|^|\$)" else ""

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Для обозначения концов слова (в человеческом смысле) есть \b. Стандартный grep с ключом -w позволяет матчить слово мир в тексте Привет, мир!, несмотря на знак препинания !.

private fun grep(input: Reader, output: PipedWriter, args: PipedGrepArgs) {
var linesToWrite = 0;
input.forEachLine {
val matchString = if (args.ignoreCase) it.toLowerCase() else it

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нельзя приводить регэксп к нижнему регистру - от этого может поменяться его смысл. Например, \s матчит пробельные символы, а \S - непробельные. Для отключения чувствительности к регистру надо передать соответствующий флаг в Regex

try {
return ArgParser(arr).parseInto(constructor)
} catch (e: ShowHelpException) {
println(e.printUserMessage(output, "grep", 80))

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не надо писать в стандартный поток вывода из глубины проекта. Способ общения с пользователем может ещё 100 раз поменяться. Бросайте исключения

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я не очень понял, почему там вообще println написан, он просто Unit печатает, убрал

# Conflicts:
#	bash/build.gradle
#	bash/src/main/kotlin/hse/nedikov/bash/logic/commands/Echo.kt
@ArtyomLobanov
Copy link

Теперь тесты падают :)
В остальном - ок @yurii-litvinov

Copy link

@yurii-litvinov yurii-litvinov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants