본문 바로가기
카테고리 없음

TDD기반 개발 프로젝트3-2:re모듈을 활용해 패턴 매칭하기

by soypablo 2023. 6. 23.

이제 2. 패턴을 찾아 볼드처리 한다. 을 구현해볼 차례이다.

2. 패턴을 찾아 볼드처리 한다. 을 구현

마찬가지로 테스트를 만들자.

    def test_find_pattern_and_bolding(self):
        assert find_pattern_and_bolding("* 테스트: 테스트입니다.") == "* **테스트**: 테스트입니다."
        assert find_pattern_and_bolding("- 테스트: 테스트입니다.") == "- **테스트**: 테스트입니다."

다음과 같은 테스트 함수를 만들었다.(1번에 대한 테스트이다.)

그리고 다음과 같이 find_pattern_and_bolding라는 함수를 구현했다.

def find_pattern_and_bolding(text:str) -> str:
    pattern = re.compile(r"([\-*] )([^:]+)")
    find = pattern.findall(text)
    result = pattern.sub(r"\1**\2**", text)
    return result

정규표현식에 대해서도 자세히 설명하면 좋을 것 같은데, 너무 내용이 방대해 질 것 같아서 생략하겠다.
정규표현식에 대한 내용은 해당 강의를 추천한다.링크

3. 문자열을 반환 or 파일을 수정한다. 테스트 작성 및 구현

이제 bolding함수의 3. 문자열을 반환 or 파일을 수정한다. 에 대한 테스트를 작성해보자!(이건 좀 코드이해가 어려울수도 있다.)

테스트 코드는 임시 파일을 생성해서, 임시파일에 대해 bolding함수를 실행한 뒤, 볼딩처리가 정상적으로 되었는지 확인하는 것이다.
테스트코드

import os
import tempfile
from pathlib import Path

    def test_return_text_and_sub_file(self):
        assert bolding("* 테스트: 테스트입니다.") == "* **테스트**: 테스트입니다."
        with tempfile.NamedTemporaryFile(delete=False) as tmp:  # 임시파일을 만든다.
            tmp.write('* 테스트: 테스트입니다.'.encode('utf-8'))  # 임시 파일에 테스트할 문자열 쓰기
            tmp.seek(0)#파일의 읽는 위치 제일 위로
            bolding(Path(tmp.name))#bolding을 적용
            tmp.seek(0)
            assert tmp.read().decode('utf-8') == "* **테스트**: 테스트입니다."
            tmp.close()  # 파일을 닫아줍니다.
            os.unlink(tmp.name)  # 테스트 종료 후 파일 삭제

이제 테스트를 만족하는 구현을 해보자.

구현

def bolding(path_or_text: str | Path) -> str:
    """
    markdown형태로 작성된 문자열에서 특정 패턴을 찾아 볼드처리(**)를 자동화하는 함수입니다.

    이 함수는 입력된 문자열 혹은 파일에서 특정 패턴을 찾아 해당 패턴을 볼드 처리(**)합니다.
    패턴은 이 함수의 내부 로직에 의해 결정됩니다.
    문자열 s는 raw string이거나 .md 파일의 경로(Path)일 수 있습니다.
    만약 s가 경로인 경우, 해당 파일을 읽어서 문자열로 변환한 후 볼드 처리를 진행합니다.

    Args:
        path_or_text (str | Path): 볼드처리할 문자열 또는 markdown 파일의 경로.

    Returns:
        str: 볼드처리가 완료된 문자열. 만약 입력이 파일 경로였다면, 이는 볼드 처리가 완료된 파일의 내용을 문자열로 반환합니다.
    """
    # 만약 path_or_text이 Path객체이면, 파일을 읽어온다.
    text = read_file_if_path(path_or_text)
    # 문자열에서 패턴을 찾고, 해당부분에 볼드처리
    text = find_pattern_and_bolding(text)
    #만약 path_or_text가 Path이면 파일을 수정한 뒤 문자열을 리턴한다.
    if isinstance(path_or_text, Path):
        with open(path_or_text, "w", encoding="utf-8") as file:
            text = file.write(text)

    return text

이렇게 함수의 세부기능을 모두 구현했다!

우리는 1번:불릿포인트 이후에 오는 제목(또는 키) 에 대해 볼드처리를 테스트하는 함수를 구현했으니 1번 테스트를 통과하면 된다.
테스트를 해보자.

이렇게 test_final_one 까지 통과한 모습을 볼 수 있다!

그러면 이제 최종테스트를 모두 만족하는 함수를 만들자!