Skip to content

Commit

Permalink
0.1.8 version update (#21)
Browse files Browse the repository at this point in the history
  • Loading branch information
PENEKhun authored Jan 19, 2024
1 parent c0a6720 commit f7aa2c1
Show file tree
Hide file tree
Showing 30 changed files with 302 additions and 115 deletions.
1 change: 1 addition & 0 deletions .github/workflows/on-pr-main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ on:
pull_request:
branches:
- main
- dev

permissions:
pull-requests: write
Expand Down
2 changes: 1 addition & 1 deletion documentation/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

풀 리퀘스트를 보내실 때, 아래의 사항들을 유의해주세요:

- `main` 브랜치를 기준으로 하여 풀 리퀘스트를 보내주세요.
- `dev` 브랜치를 기준으로 하여 풀 리퀘스트를 보내주세요.
- 변경사항에 대한 명확하고 간결한 설명을 포함해주세요.
- 변경된 코드에 대한 적절한 테스트가 수행되었는지 확인해주세요.

Expand Down
44 changes: 42 additions & 2 deletions documentation/DOCUMENTATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

### 생성되는 소스코드 폴더명 변경하기

config.json의 `srcDirPrefix.value`을 수정하여, 생성되는 소스코드 폴더명의 prefix를 변경할 수 있습니다.
`config.json` `srcDirPrefix.value`을 수정하여, 생성되는 소스코드 폴더명의 `prefix` 변경할 수 있습니다.
예시로 1000번 문제에서 `srcDirPrefix.value``BOJ_`로 설정하면, `BOJ_1000` 폴더가 생성됩니다. 기본 설정 값은 `p`입니다.

```json
Expand Down Expand Up @@ -42,7 +42,7 @@ config.json의 `srcDirPrefix.value`을 수정하여, 생성되는 소스코드
import java.util.Scanner;

/*
BAEKJOON {{number}} {{title}}
BAEKJOON {{number}} {{title}}
https://www.acmicpc.net/problem/{{number}}
*/

Expand Down Expand Up @@ -94,3 +94,43 @@ public class Main {
}
}
```

### 생성되는 README.md 파일의 템플릿 변경하기

`config.json``markdownTemplate.value`을 수정하여, 생성되는 `README.md`의 파일 내용을 변경할 수 있습니다.
기본 설정 값은 아래와 같습니다.

```markdown
# {{title}}

> 문제 번호 : {{number}} <br/>
> 출처 : {{url}}

## 문제 설명

{{description}}
```

#### 예악어

해당 기능에선 네가지 예약어를 지원합니다.

- `{{title}}`: 문제 제목
- `{{number}}`: 문제 번호
- `{{url}}`: 문제 출처 URL
- `{{description}}`: 문제 설명 *(html 태그 포함)*

#### 비활성화 방법

`config.json``enableReadme.value``"true"` 대신 `"false"`로 수정하면, README.md 파일이 생성되지 않습니다. boolean
형태가 아닌 `"`로 감싸진 문자열로 입력해야 합니다.

```json
{
...
"enableReadme": {
"value": "false"
},
...
}
```
16 changes: 11 additions & 5 deletions src/main/java/kr/huni/BojStarter.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package kr.huni;

import java.io.IOException;
import kr.huni.code_generator.CodeGenerator;
import kr.huni.code_generator.FileContentGenerator;
import kr.huni.code_generator.GeneratedCode;
import kr.huni.code_runner.CodeOpenManager;
import kr.huni.file_generator.JavaSourceCodeFile;
import kr.huni.os.OperatingSystem;
import kr.huni.problem_parser.BaekjoonProblemParser;
import kr.huni.problem_parser.Problem;
import kr.huni.user_configuration.UserConfigurationLoader;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

Expand All @@ -17,12 +18,16 @@ public class BojStarter {

private final CodeOpenManager codeOpenManager;
private final JavaSourceCodeFile fileUtil;
private final CodeGenerator codeGenerator;
private final FileContentGenerator codeGenerator;
private final BaekjoonProblemParser problemParser;

public void run(final int problemNumber) {
Problem problem = problemParser.parse(problemNumber);
GeneratedCode generatedCode = codeGenerator.generate(problem);
if (!problem.isExist()) {
log.error("문제를 찾을 수 없습니다.");
return;
}
GeneratedCode generatedCode = codeGenerator.generateCode(problem);

createSrcFile(problem, generatedCode);
openSourceCodeWithIde(problem);
Expand All @@ -37,15 +42,16 @@ private void openSourceCodeWithIde(Problem problem) {
IntelliJ IDEA의 idea 명령어가 설치되어 있지 않습니다.
직접 IntelliJ IDEA를 실행해서 프로젝트를 열어주세요.
생성된 프로젝트 경로 : {}
%n
상세 오류 :
""", problem.getSourceRootDirectory(), e);
}
}

private void createSrcFile(Problem problem, GeneratedCode generatedCode) {
try {
fileUtil.write(problem.getSourceRootDirectory(), generatedCode.mainCode(),
generatedCode.testCode());
generatedCode.testCode(), codeGenerator.generateMarkdown(problem),
UserConfigurationLoader.getInstance().enableReadme.getValue().equals("true"));
} catch (IOException e) {
log.error("소스코드 파일 또는 디렉토리 생성에 실패했습니다.", e);
}
Expand Down
8 changes: 0 additions & 8 deletions src/main/java/kr/huni/code_generator/CodeGenerator.java

This file was deleted.

10 changes: 10 additions & 0 deletions src/main/java/kr/huni/code_generator/FileContentGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package kr.huni.code_generator;

import kr.huni.problem_parser.Problem;

public interface FileContentGenerator {

GeneratedCode generateCode(Problem problem);

String generateMarkdown(Problem problem);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,20 @@
import java.util.List;
import kr.huni.problem_parser.TestCase;

public interface SourceCodeTemplate {
public interface FileContentTemplate {

String TEST_JAVA_FILE = "code_sample/TestHelper.java";
String NO_TEST_JAVA_FILE = "code_sample/NoTestHelper.java";
String REPLACED_NUMBER = "{{number}}";
String REPLACED_TITLE = "{{title}}";
String REPLACED_DESCRIPTION = "{{description}}";
String REPLACED_URL = "{{url}}";
String REPLACED_TEST_CASES = "// {{test_case}}";
String DEFAULT_MAIN_CODE_TEMPLATE = """
import java.util.Scanner;
/*
BAEKJOON {{number}} {{title}}
BAEKJOON {{number}} {{title}}
https://www.acmicpc.net/problem/{{number}}
*/
Expand All @@ -27,6 +29,17 @@ public static void main(String[] args) {
}
}
""";
String DEFAULT_MARKDOWN_TEMPLATE = """
# {{title}}
> 문제 번호 : {{number}} \s
> 출처 : {{url}}
## 문제 설명
{{description}}
""";

/**
* Main.java 소스코드 문자를 생성하고 반환합니다.
Expand All @@ -45,4 +58,6 @@ public static void main(String[] args) {
*/
String getTestCode(List<TestCase> testCases) throws IOException;

String getMarkdownContent(int number, String title, String description);

}
13 changes: 10 additions & 3 deletions src/main/java/kr/huni/code_generator/JavaCodeGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class JavaCodeGenerator implements CodeGenerator {
public class JavaCodeGenerator implements FileContentGenerator {

@Override
public GeneratedCode generate(Problem problem) {
public GeneratedCode generateCode(Problem problem) {
if (problem.getTestCases() == null) {
throw new IllegalArgumentException("테스트는 null이 될 수 없습니다.");
}

try {
SourceCodeTemplateImpl sourceCodeTemplate = new SourceCodeTemplateImpl();
JavaTemplate sourceCodeTemplate = new JavaTemplate();
String mainCode = sourceCodeTemplate.getMainCode(problem.getNumber(), problem.getTitle());
String testCode = sourceCodeTemplate.getTestCode(problem.getTestCases());

Expand All @@ -25,4 +25,11 @@ public GeneratedCode generate(Problem problem) {
}
}

@Override
public String generateMarkdown(Problem problem) {
JavaTemplate markdownTemplate = new JavaTemplate();
return markdownTemplate.getMarkdownContent(problem.getNumber(), problem.getTitle(),
problem.getDescription());
}

}
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package kr.huni.code_generator;

import static kr.huni.problem_parser.BaekjoonProblemParser.PROBLEM_URL;

import java.io.IOException;
import java.util.List;
import kr.huni.file_generator.SourceCodeFile;
import kr.huni.problem_parser.TestCase;
import kr.huni.user_configuration.UserConfigurationField;
import kr.huni.user_configuration.UserConfigurationLoader;

public class SourceCodeTemplateImpl implements SourceCodeTemplate {
public class JavaTemplate implements FileContentTemplate {

public String getMainCode(int number, String title) {
String template = DEFAULT_MAIN_CODE_TEMPLATE;
Expand Down Expand Up @@ -47,4 +49,22 @@ public String getTestCode(List<TestCase> testCases) throws IOException {
String template = SourceCodeFile.readFileFromResource(TEST_JAVA_FILE);
return template.replace(REPLACED_TEST_CASES, testCaseCode.toString());
}

@Override
public String getMarkdownContent(int number, String title, String description) {
String template = DEFAULT_MARKDOWN_TEMPLATE;
UserConfigurationField markdownTemplate =
UserConfigurationLoader.getInstance().markdownTemplate;
boolean useCustomTemplate = markdownTemplate.getValue() != null;

if (useCustomTemplate) {
template = markdownTemplate.getValue();
}

return template
.replace(REPLACED_NUMBER, String.valueOf(number))
.replace(REPLACED_TITLE, title)
.replace(REPLACED_DESCRIPTION, description)
.replace(REPLACED_URL, PROBLEM_URL + number);
}
}
8 changes: 0 additions & 8 deletions src/main/java/kr/huni/code_runner/CodeOpenCommand.java

This file was deleted.

3 changes: 2 additions & 1 deletion src/main/java/kr/huni/code_runner/CodeOpenManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public interface CodeOpenManager {
* @throws IOException 실행 실패
* @implSpec 주어진 codePath를 IDE로 열어준다
*/
void run(String codePath, OperatingSystem operatingSystem) throws IOException;
void run(String codePath, OperatingSystem operatingSystem)
throws IOException;

}
11 changes: 4 additions & 7 deletions src/main/java/kr/huni/code_runner/IdeaCodeOpenManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,11 @@
public class IdeaCodeOpenManager implements CodeOpenManager {

public void run(String codePath, OperatingSystem os) throws IOException {
CodeOpenCommand command = switch (os) {
case WINDOWS -> new CodeOpenCommand("where idea", "idea");
case LINUX, MAC -> new CodeOpenCommand("which idea", "idea");
String command = switch (os) {
case WINDOWS -> "idea.bat";
case LINUX, MAC -> "idea";
};

boolean ideaExist = Runtime.getRuntime().exec(command.ideExistedCommand()).exitValue() == 0;
if (ideaExist) {
Runtime.getRuntime().exec(command.executeCommand() + " " + codePath);
}
Runtime.getRuntime().exec(command + " " + codePath);
}
}
10 changes: 9 additions & 1 deletion src/main/java/kr/huni/file_generator/JavaSourceCodeFile.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
public class JavaSourceCodeFile implements SourceCodeFile {

@Override
public void write(String sourceRootDirectory, String sourceCode, String testCode)
public void write(String sourceRootDirectory, String sourceCode, String testCode, String readme,
boolean enableReadme)
throws IOException {
File srcDir = new File(sourceRootDirectory, "src");

Expand All @@ -18,6 +19,13 @@ public void write(String sourceRootDirectory, String sourceCode, String testCode
log.info("소스코드 디렉토리 생성 완료");
writeToFile(srcDir, "Main.java", sourceCode);
writeToFile(srcDir, "TestHelper.java", testCode);
log.info("소스코드 파일 생성 완료");

if (enableReadme) {
writeToFile(srcDir, "README.md", readme);
log.info("README.md 파일 생성 완료");
}
}


}
19 changes: 10 additions & 9 deletions src/main/java/kr/huni/file_generator/SourceCodeFile.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import java.io.InputStreamReader;
import java.util.Objects;
import java.util.Scanner;
import kr.huni.code_generator.SourceCodeTemplateImpl;
import kr.huni.code_generator.JavaTemplate;

/**
* 소스코드 파일을 생성하고, 내용을 채워주기 위한 인터페이스
Expand All @@ -25,16 +25,18 @@ public interface SourceCodeFile {
* @implSpec 해당 메서드안에서 필요한 하위 폴더를 생성하고, {@link #writeToFile(File, String, String)}를 통해 알고리즘을 구현할
* 소스코드 파일과 테스트 코드 파일을 생성해야합니다.
*/
void write(String directory, String sourceCode, String testCode) throws IOException;
void write(String directory, String sourceCode, String testCode, String readme,
boolean enableReadme)
throws IOException;

/**
* 파일을 생성하고, 내용을 채웁니다.
*
* @param srcDir 소스코드를 저장할 위치가 담긴 객체
* @param fileName 파일 이름
* @param sourceCode 파일 내용
* @param srcDir 소스코드를 저장할 위치가 담긴 객체
* @param fileName 파일 이름
* @param content 파일 내용
*/
default void writeToFile(File srcDir, String fileName, String sourceCode) {
default void writeToFile(File srcDir, String fileName, String content) {
File file = new File(srcDir, fileName);
if (file.exists()) {
System.out.printf("%s/%s가 이미 존재합니다. 새롭게 덮어 씌우시겠습니까? (y, n): ", srcDir.getAbsoluteFile(),
Expand All @@ -50,7 +52,7 @@ default void writeToFile(File srcDir, String fileName, String sourceCode) {
}

try (FileWriter fileWriter = new FileWriter(file)) {
fileWriter.write(sourceCode);
fileWriter.write(content);
} catch (IOException e) {
System.out.println("파일 생성 실패. 프로그램을 종료합니다.");
throw new RuntimeException(e);
Expand All @@ -66,7 +68,7 @@ default void writeToFile(File srcDir, String fileName, String sourceCode) {
*/
static String readFileFromResource(String filePath) throws IOException {
StringBuilder sourceCode = new StringBuilder();
try (InputStream inputStream = SourceCodeTemplateImpl.class.getClassLoader()
try (InputStream inputStream = JavaTemplate.class.getClassLoader()
.getResourceAsStream(filePath);
InputStreamReader inputStreamReader = new InputStreamReader(
Objects.requireNonNull(inputStream));
Expand All @@ -80,5 +82,4 @@ static String readFileFromResource(String filePath) throws IOException {
}
return sourceCode.toString();
}

}
Loading

0 comments on commit f7aa2c1

Please sign in to comment.