Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
b455d1d
Update README.md
and-adad Jul 26, 2024
3aa6055
Подготовился к началу урока, заменил все в главном файле на императив…
and-adad Jul 28, 2024
f59ef5f
у автора видео работь продолжает у меня сломалось curry is not defined
and-adad Jul 28, 2024
b46302d
также пока не работает
and-adad Jul 28, 2024
f5c30c8
добавил curry и по прежнему все работает там у автора видео магически…
and-adad Jul 28, 2024
d176c80
Исправил ошибку из за отсутствия строки с импортом
and-adad Jul 28, 2024
d46bbef
произвели некие изменения и по прежнему все работает
and-adad Jul 28, 2024
8f2eec7
то же самое сделаем с красным
and-adad Jul 28, 2024
f4b6231
промежуточный коммит пока все работает также
and-adad Jul 28, 2024
129b816
промежуточный коммит пока все работает также
and-adad Jul 28, 2024
e013ba9
заменил первую регулярку на функцию с понятным названием
and-adad Jul 28, 2024
d89f33d
заменил вторую регулярку на функцию с понятным названием
and-adad Jul 28, 2024
0325c1c
мы написали три функции предиката и две функции геттеры и все по преж…
and-adad Jul 29, 2024
564d5fb
заменил на allPass anyPass блоки кода в которых шло сравнение и все п…
and-adad Jul 29, 2024
90fd294
time type component message в фукции геттеры, которые будут это в себ…
and-adad Jul 29, 2024
2df2245
applySpec и все по прежнему работает
and-adad Jul 29, 2024
1d10f2e
объединим в одну функцию с использованием композиции и все по прежнем…
and-adad Jul 29, 2024
e019ffd
используем частичное применение и все по прежнему работает
and-adad Jul 29, 2024
cc8efb8
и все по прежнему работает
and-adad Jul 29, 2024
f97ef1a
formatLogs и writeErrorLogs перенес повыше все по прежнему работает
and-adad Jul 29, 2024
1309eec
убрал повторяющийся try catch написав функцию высшего порядка все по …
and-adad Jul 29, 2024
7f7db16
объединим в одну функцию все по прежнему работает
and-adad Jul 29, 2024
1b1c12b
готово
and-adad Jul 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Практикум по функциональному программированию ШРИ

Применение приемов функционального программирования, на ральной задаче.
Применение приемов функционального программирования, на реальной задаче.

### Файлы

Expand Down
6 changes: 6 additions & 0 deletions errorsLog.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,11 @@
"type": "ERROR",
"component": "search-interfaces-infra",
"message": "403 Forbidden CI API"
},
{
"time": "2023-07-12 22:14:19,813",
"type": "ERROR",
"component": "search-interfaces-infra",
"message": "403 Forbidden CI API "
}
]
1 change: 1 addition & 0 deletions logs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
2023-07-12 22:14:21,694 (0.005s) INFO (yandex-market) [d08844ba] Running: vim
2023-07-12 22:14:21,701 (0.007s) DEBUG (yandex-market) [d08844ba] PID=2222 OUT=-1 ERR=-1
2023-07-12 22:14:19,813 (0.000s) ERROR (search-interfaces-infra) 403 Forbidden CI API
2023-07-12 22:14:19,813 (0.000s) ERROR (search-interfaces-infra) 403 Forbidden CI API
2023-07-12 22:14:19,813 (0.000s) INFO (test) Switched to subsystem The standard chunk of Lorem Ipsum used since the 1500s.
2023-07-12 22:14:19,813 (0.000s) INFO (test) Switched to subsystem Lorem Ipsum comes from sections 1.10.32 and 1.10.33
2023-07-12 22:14:19,813 (0.000s) INFO (test) generated Lorem Ipsum is therefore always free from repetition
Expand Down
53 changes: 20 additions & 33 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,43 +1,32 @@
import {
allPass,
anyPass,
applySpec,
compose,
curry,
equals,
filter,
map,
match,
nth,
partial,
partialRight,
prop,
tap,
tryCatch,
} from 'ramda';
import { compose, curry, prop, match, equals, anyPass, allPass, nth, applySpec, filter, map, partial, partialRight, tryCatch, tap } from 'ramda';
import { log, readFile, writeFile } from './helpers/index';

console.clear();

const formatLogs = partialRight(JSON.stringify, [null, 2]);
const writeErrorLogs = partial(writeFile,['errorsLog.json', '../']);

const curriedLog = curry(log);
const logRed = curriedLog('red');
const logGreen = curriedLog('green');
const logRed = curriedLog('red');

const logError = logRed('Error');
const logReadFile = logGreen('Read file');
const logWriteFile = logGreen('Write file');

const formatLogs = partialRight(JSON.stringify, [null, 2]);
const writeErrorLogs = partial(writeFile, ['errorsLog.json', '../']);

const getMessage = prop('message');
const getType = prop('type');
const getComponent = prop('component');

const getParsedLogTime = nth(1);
const getParsedLogType = nth(2);
const getParsedLogComponent = nth(3);
const getParsedLogMassage = nth(4);
const getParsedLogMessage = nth(4);

const splitFileByLine = match(/[^\r\n]+/g);

const logErrorMessage = compose(logError, getMessage);
const parseLog = match(/([\d-:,\s]+)\s\(.+\)\s(\w+)\s+\(([^)]+)\)\s(.+)/);

const isError = equals('ERROR');
const isWarn = equals('WARN');
Expand All @@ -46,28 +35,26 @@ const isErrorLog = compose(isError, getType);
const isWarnLog = compose(isWarn, getType);
const isInfraComponentLog = compose(isInfraComponent, getComponent);

const isErrorOrWarnLog = anyPass([isErrorLog, isWarnLog]);
const isErrorOrWarnLog = anyPass([isWarnLog, isErrorLog]);
const isInfraErrorLog = allPass([isErrorOrWarnLog, isInfraComponentLog]);

const splitFileByLine = match(/[^\r\n]+/g);
const parseLog = match(/([\d-:,\s]+)\s\(.+\)\s(\w+)\s+\(([^)]+)\)\s(.+)/);
const getParsedLogInfo = applySpec({
const getLogInfo = applySpec({
time: getParsedLogTime,
type: getParsedLogType,
component: getParsedLogComponent,
message: getParsedLogMassage,
message: getParsedLogMessage,
});

const createSafeFunction = (fn) => tryCatch(fn, logErrorMessage);
const readFileSafe = createSafeFunction(readFile);
const writeErrorLogsSafe = createSafeFunction(writeErrorLogs);

const getInfraErrorsLog = compose(
filter(isInfraErrorLog),
map(getParsedLogInfo),
map(getLogInfo),
map(parseLog),
);

const createSafeFunction = (fn) => tryCatch(fn, logErrorMessage);
const readFileSafe = createSafeFunction(readFile);
const writeErrorLogsSafe = createSafeFunction(writeErrorLogs);

const app = compose(
writeErrorLogsSafe,
tap(logWriteFile),
Expand All @@ -78,4 +65,4 @@ const app = compose(
tap(logReadFile),
);

app(process.env.FILE_PATH);
app(process.env.FILE_PATH)