Skip to content

Commit

Permalink
feat: isolate todo-statistic task
Browse files Browse the repository at this point in the history
  • Loading branch information
nulladdict committed Sep 20, 2020
1 parent c2032ad commit 8465fca
Show file tree
Hide file tree
Showing 323 changed files with 228 additions and 46,825 deletions.
111 changes: 100 additions & 11 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,15 +1,104 @@
### VisualStudioCode template
.vscode/*
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*

### macOS template
# General
.DS_Store
.AppleDouble
.LSOverride
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

# Thumbnails
._*
# Runtime data
pids
*.pid
*.seed
*.pid.lock

.idea
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

node_modules/
# Coverage directory used by tools like istanbul
coverage
*.lcov

# nyc test coverage
.nyc_output

# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# TypeScript v1 declaration files
typings/

# TypeScript cache
*.tsbuildinfo

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variables file
.env
.env.test

# parcel-bundler cache (https://parceljs.org/)
.cache

# Next.js build output
.next

# Nuxt.js build / generate output
.nuxt
dist

# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and *not* Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public

# vuepress build output
.vuepress/dist

# Serverless directories
.serverless/

# FuseBox cache
.fusebox/

# DynamoDB Local files
.dynamodb/

# TernJS port file
.tern-port
128 changes: 128 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
Задача сделать консольную утилиту для фронтендера.

Утилита будет брать все файлы с расширением `.js` в текущей директории, находить в них все комментарии с `TODO`. Искать по ним, фильтровать, сортировать.

Мы уже написали за тебя метод для работы с консолью и методы для чтения из файлов. Осталось написать остальное =)

Для запуска используй команду `node index.js` При запуске специальный код ждет команды из консоли.

Сейчас он знает только команду `exit`, остальные нужно дописать тебе.

1. Получи из всех файлов все однострочные комментарии, начинающиеся с `TODO`. Все комментарии имеют одинаковое начало: два слеша, пробел, слово `TODO` капсом, снова пробел и дальше текст комментария. Например:

```
// TODO Переделать это!
```

2. Сейчас метод `processCommand` обрабатывает только команду `exit` и завершает процесс в node. Научись обрабатывать еще одну команду из консоли:

```
show : показать все todo
```

Выводить нужно стандартным выводом в консоль `console.log`. Можешь выводить как угодно твоим эстетическим чувствам: можно выводить просто массив в консоль, можно каждый элемент на новой строчке.

3. В комментарии может присутствовать восклицательный знак (!), что означает, что это задача с высоким приоритетом. Научись обрабатывать команду из консоли:

```
important : показывать только todo, в которых есть восклицательный знак
```

4. Текст в todo может быть представлен обычным текстом.
Или же использовать специальную разметку: `// TODO {Имя автора}; {Дата комментария}; {текст комментария}`
После имени и даты обязательно ставится точка с запятой, а вот пробел между ними не обязателен.
Научись обрабатывать еще одну команду из консоли:

```
user {username} : показывать только комментарии от указанного пользователя
```

Причем имя пользователя должно быть регистронезависимо.
Пример команды: `user veronika`

5. Научись обрабатывать команды

```
sort {importance | user | date} : выводит отсортированные todo
```

Если аргумент `importance`, то сначала выводятся комментарии с восклицательными знаками, потом все остальные.

Чем больше восклицательных знаков, тем выше приоритет и тем выше в списке этот комментарий.

Если аргумент `user`, то выводятся задачи сгрупированные по пользователям, а в конце безымянные.

Если аргумент `date`, то выводятся сначала самые новые, потом постарше, потом без дат.

Примеры команд: `sort importance`, `sort user`, `sort date`

6. \* Научись обрабатывать команду:

```
date {yyyy[-mm[-dd]]}: показывает все комментарии, созданные после переданной даты.
```

Датой может быть только год, год с месяцем (через дефис) или год с месяцем и днем.

Примеры команд: `date 2015`, `date 2016-02`, `date 2018-03-02`.

7. \* Научись выводить результаты в консоль в виде таблицы:

- каждая строка отображает один комментарий
- у таблицы должно быть четыре колонки: важность, пользователь, дата, комментарий
- между ячейками должен быть разделитель — вертикальная черта (|). А от вертикальной черты до текста должно быть минимум два пробела отступа. Вот так:

```
! | pe | 2018-03-02 | sdkhsdfsdf
| pe | 2018-03-02 | sdkhsdfsdf
```

- если в комментарии есть восклицательные знаки, то в первой колонке нужно поставить символ !, в остальных случаях ничего не ставить
- ширина колонок (не считая отступ до вертикальных черт): 1, 10, 10, 50. При необходимости обрезай значение, поставив в конце многоточие (...), но учти, что обрезанный текст вместе с многоточием должен влезть в максимальную ширину колонки.
- вывод комментариев в командах `show`, `important`, `user {username}`, `sort {type}` и `date {date}` должен отображаться в виде этой таблички.

Для этой задачи тебе может пригодиться метод [padEnd](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd)

8. \* Научись подбирать ширину колонкам по самому длинному значению. Вот так:

```
корова | семья
я | лук
солнце | нехороший человек
```

Ограничения ширины из прошлого пункта (1, 10, 10, 50) считай за максимум возможной ширины.

9. \* Добавь таблице заголовок из 4 колонок:

```
! | user | date | comment
```

- ширина клеток заголовка тоже должна подбираться по самому длинному значению в этом столбце
- от остальной таблицы заголовок отделяется строкой со знаками минус (-) нужной длины. Должно получиться как-то так:

```
! | user | date | comment
---------------------------------
| pe | 2012 | dddlsl
| pe | 2012 | dddlsl
```

- для создания заголовка переиспользуй уже написанный код для остальных строк таблицы. Если нужно выделить новый метод — делай это.

- добавь строку из минусов еще и в конце таблицы.

Для этой задачи может пригодиться метод [repeat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat)

10. \* Выводи в таблицах кроме информации из todo еще и имя файла, в котором этот todo найден. Чтобы выделить имя файла из пути можно воспользоваться модулем [path](https://nodejs.org/api/path.html#path_path_basename_path_ext) из Node.js:

11. \* По условиям задачи все todo имеют вид:
```
// TODO Переделать это
```
Но между слешами и todo может не быть пробела, после todo может быть двоеточие и отсутствовать пробел, todo может быть написан в любом регистре и даже в camelCase.

Чтобы учесть все эти вариации, тебе помогут регулярные выражения.

Прочитай про метод [match](http://learn.javascript.ru/regexp-methods) у строк и сделай поиск TODO более универсальным.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Loading

0 comments on commit 8465fca

Please sign in to comment.