Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Решение тестового задания Бушковский Иван #38

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
9 changes: 8 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,14 @@ CodeKiller777
Ручной ввод пути к файлу (через консоль, через правку переменной в коде и т.д.) недопустим. Необходимость любых ручных действий с файлами в процессе работы программы будут обнулять решение.

## Автор решения
Бушковский Иван Сергеевич

## Описание реализации

Данный проект обрабатывает файл commit.txt и определяет топ-3 контрибьютера и записывает результат в result.txt
Класс Reader считывает данные из файла и передает их в Service, в котором проверяется строка на корректность с помощью ParseCommit и инкрементируется результат у соответствуюшего контрибьютера с помощью HashMap.
После с помощью ResultMaker определяются топ-3 контрибьютера с последующим выводом в result.txt с помощью Writer
## Инструкция по сборке и запуску решения
Надо сделать Build модуля solution (так внутри solution помимо папки src появится директория target с нужными для запуска .class файлами), после чего можно запустить следующим образом:
java -cp "ПУТЬ ДО РЕПОЗИТОРИЯ В ВАШЕЙ СИСТЕМЕ"/school2024-test-task4/solution/target/classes org.bushkovsky.Main "ПУТЬ ДО РЕПОЗИТОРИЯ В ВАШЕЙ СИСТЕМЕ"
Например:
java -cp /Users/ivanbuskovskij/IdeaProjects/school2024-test-task4/solution/target/classes org.bushkovsky.Main /Users/ivanbuskovskij/IdeaProjects
16 changes: 16 additions & 0 deletions solution/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.bushkovsky</groupId>
<artifactId>solution</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
</properties>


</project>
19 changes: 19 additions & 0 deletions solution/src/main/java/org/bushkovsky/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.bushkovsky;

import org.bushkovsky.Reader.Reader;
import org.bushkovsky.services.Service;
import org.bushkovsky.writers.Writer;


public class Main {

public static void main(String[] args) {
Service service = new Service();
Reader reader = new Reader();
ResultMaker maker = new ResultMaker();
Writer writer = new Writer();

reader.read(args[0], service);
writer.write(args[0], maker.getRank(service));
}
}
33 changes: 33 additions & 0 deletions solution/src/main/java/org/bushkovsky/Reader/Reader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.bushkovsky.Reader;

import org.bushkovsky.paths.Paths;
import org.bushkovsky.services.Service;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;

public class Reader {
private final Paths localPaths = new Paths();
public void read(String path, Service service) {

File file = new File(path + localPaths.getCommits());
try {
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String commit;

while ((commit = bufferedReader.readLine()) != null) {
service.addLine(commit);
}

bufferedReader.close();
} catch (IOException e) {
throw new RuntimeException(e.getMessage());
} catch (ParseException e) {
System.out.println(e.getMessage());
}
}
}
45 changes: 45 additions & 0 deletions solution/src/main/java/org/bushkovsky/ResultMaker.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package org.bushkovsky;

import org.bushkovsky.services.Service;

import java.util.HashMap;
import java.util.Map;

public class ResultMaker {
Integer[] values;

String[] names;

public ResultMaker(){
values = new Integer[]{0, 0, 0};
names = new String[]{"", "", ""};
}


public String getRank(Service service){
String[] result = ranking(service);
return result[0] + "\n" + result[1] + "\n" + result[2];
}

private String[] ranking(Service service){
HashMap<String, Integer> contributorsRating = service.getContributorsRating();
for (Map.Entry<String, Integer> entry : contributorsRating.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();

for (int i = 0; i < 3; i++){
if(maximum(value, values[i])){
values[i] = value;
names[i] = key;
break;
}
}

}
return names;
}

public boolean maximum(int a, int b){
return a > b;
}
}
36 changes: 36 additions & 0 deletions solution/src/main/java/org/bushkovsky/parsers/ParserCommits.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.bushkovsky.parsers;
import java.text.ParseException;
import java.util.HashMap;
import java.util.regex.Matcher;
public class ParserCommits {
private final String USERNAME_REGEX = "^[a-zA-Z][a-zA-Z0-9_]*$";
private final String COMMIT_HASH_REGEX = "^[a-f0-9]{7}$";
private final String DATE_TIME_REGEX = "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$";
public String parse(String line) throws ParseException {
String[] splitLine = line.split(" ");
if (checkLine(splitLine)) {
return splitLine[0];
}
else {
throw new ParseException("Incorrect line " + splitLine[0] + " " + splitLine[1] + " " + splitLine[2] + " " + splitLine.length, 0);
}
}

private boolean checkLine(String[] splitLine){
return splitLine.length == 3 && checkName(splitLine[0]) && checkCommit(splitLine[1])
&& checkDate(splitLine[2]);
}


private boolean checkName(String name) {
return name.matches(USERNAME_REGEX);
}

private boolean checkCommit(String commitHash) {
return commitHash.matches(COMMIT_HASH_REGEX);
}

private boolean checkDate(String dateTime) {
return dateTime.matches(DATE_TIME_REGEX);
}
}
14 changes: 14 additions & 0 deletions solution/src/main/java/org/bushkovsky/paths/Paths.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.bushkovsky.paths;

public class Paths {
final String result = "/school2024-test-task4/solution/src/main/resources/result.txt";
final String commits = "/school2024-test-task4/solution/src/main/resources/commits.txt";

public String getCommits() {
return commits;
}

public String getResult() {
return result;
}
}
31 changes: 31 additions & 0 deletions solution/src/main/java/org/bushkovsky/services/Service.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package org.bushkovsky.services;

import org.bushkovsky.parsers.ParserCommits;

import java.text.ParseException;
import java.util.HashMap;

public class Service {

ParserCommits parserCommits = new ParserCommits();
private final HashMap<String, Integer> contributorsRating = new HashMap<String, Integer>();

public void addLine(String line) throws ParseException {
doCount(parserCommits.parse(line));
}

private void doCount(String name){
if (contributorsRating.containsKey(name)) {
Integer num = contributorsRating.get(name);
num++;
contributorsRating.put(name, num);
}
else {
contributorsRating.put(name, 1);
}
}

public HashMap<String, Integer> getContributorsRating() {
return contributorsRating;
}
}
27 changes: 27 additions & 0 deletions solution/src/main/java/org/bushkovsky/writers/Writer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.bushkovsky.writers;
import org.bushkovsky.paths.Paths;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class Writer {
Paths paths = new Paths();
public void write(String path, String s){
String filePath = path + paths.getResult();
try {
writeToFile(filePath, s);
System.out.println("String was successfully wrote");
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}
}

public static void writeToFile(String filename, String s) throws IOException {
FileWriter fileWriter = new FileWriter(filename);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.write(s);
bufferedWriter.close();
}
}
20 changes: 20 additions & 0 deletions solution/src/main/resources/commits.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
CIvanova 3d5bf7a 2023-10-19T20:10:43
AIvanov 35ca1a8 2023-11-05T09:21:17
EAntonova 6e7d2b1 2023-11-09T15:38:30
CIvanova 4fc2a81 2023-11-15T13:03:05
BPetrov 81c8b99 2023-11-16T01:39:14
BPetrov 97baf6d 2023-11-16T17:29:18
CIvanova 8e9f47e 2023-11-17T09:05:56
DStepanov 2a9b3d5 2023-11-17T15:58:06
CIvanova 7a8942c 2023-11-17T21:42:27
AIvanov 3eac6ba 2023-11-18T15:14:55
CIvanova 4880672 2023-11-18T18:30:20
BPetrov 9d6b82d 2023-11-18T22:09:57
DStepanov 5d73c14 2023-11-19T11:16:10
CIvanova 00e0136 2023-11-19T22:26:34
AIvanov 1d35d96 2023-11-21T09:22:00
BPetrov 2c99749 2023-11-21T18:54:01
BPetrov 26a6d6b 2023-11-22T04:37:49
DStepanov 50bb1fa 2023-11-22T10:05:42
CIvanova 7a8942c 2023-11-22T15:17:19
CIvanova 0637885 2023-11-23T00:51:45
3 changes: 3 additions & 0 deletions solution/src/main/resources/result.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
CIvanova
BPetrov
DStepanov