paint-brush
Trello 보드 관리를 위한 Python CLI 프로그램을 만드는 방법(1부)~에 의해@elainechan01
2,342 판독값
2,342 판독값

Trello 보드 관리를 위한 Python CLI 프로그램을 만드는 방법(1부)

~에 의해 Elaine Yun Ru Chan19m2023/08/15
Read on Terminal Reader
Read this story w/o Javascript

너무 오래; 읽다

Wikipedia에 명시된 바와 같이, "명령줄 인터페이스(CLI)는 사용자 또는 클라이언트의 명령과 장치 또는 프로그램의 응답을 텍스트 줄 형태로 사용하여 장치 또는 컴퓨터 프로그램과 상호 작용하는 수단입니다." 즉, CLI 프로그램은 사용자가 명령줄을 사용하여 실행 지침을 제공함으로써 프로그램과 상호 작용하는 프로그램입니다. 많은 일상적인 소프트웨어가 CLI 프로그램으로 래핑되어 있습니다. vim 텍스트 편집기를 예로 들어 보겠습니다. 이 도구는 UNIX 시스템과 함께 제공되며 터미널에서 vim <FILE>을 실행하여 간단히 활성화할 수 있습니다. Google Cloud CLI와 관련하여 CLI 프로그램의 구조를 자세히 살펴보겠습니다.
featured image - Trello 보드 관리를 위한 Python CLI 프로그램을 만드는 방법(1부)
Elaine Yun Ru Chan HackerNoon profile picture
0-item

고지 사항: 이 튜토리얼에서는 독자가 Python, API, Git 및 단위 테스트에 대한 기본 지식을 가지고 있다고 가정합니다.

저는 가장 멋진 애니메이션이 포함된 다양한 CLI 소프트웨어를 접했고 궁금해졌습니다. '최소한의' 가위바위보 학교 프로젝트를 업그레이드할 수 있을까요?


안녕, 놀자! 당신의 선수를 선택하세요 (바위, 가위, 바위): 바위

CLI 프로그램이란 무엇입니까?

Wikipedia에 명시된 바와 같이, "명령줄 인터페이스(CLI)는 사용자 또는 클라이언트의 명령과 장치 또는 프로그램의 응답을 텍스트 줄 형태로 사용하여 장치 또는 컴퓨터 프로그램과 상호 작용하는 수단입니다."


즉, CLI 프로그램은 사용자가 명령줄을 사용하여 실행 지침을 제공함으로써 프로그램과 상호 작용하는 프로그램입니다.


많은 일상적인 소프트웨어가 CLI 프로그램으로 래핑되어 있습니다. vim 텍스트 편집기를 예로 들어 보겠습니다. 이 도구는 UNIX 시스템과 함께 제공되며 터미널에서 vim <FILE> 실행하여 간단히 활성화할 수 있습니다.


Google Cloud CLI 와 관련하여 CLI 프로그램의 구조를 자세히 살펴보겠습니다.

인수

인수(매개변수)는 프로그램에 제공되는 정보 항목입니다. 위치에 따라 식별되기 때문에 위치 인수라고도 합니다.


예를 들어 핵심 섹션에서 project 속성을 설정하려면 gcloud config set project <PROJECT_ID> 실행합니다.


특히, 우리는 이것을 다음과 같이 번역할 수 있습니다.

논쟁

콘텐츠

인수 0

지클라우드

인수 1

구성

명령

명령은 컴퓨터에 명령을 제공하는 인수 배열입니다.


이전 예시를 기반으로 gcloud config set project <PROJECT_ID> 실행하여 핵심 섹션에서 project 속성을 설정했습니다.


즉, set 은 명령입니다.

선택적 명령

일반적으로 명령이 필요하지만 예외를 만들 수 있습니다. 프로그램의 사용 사례에 따라 선택적 명령을 정의할 수 있습니다.


공식 문서에 명시된 대로 gcloud config 명령어를 다시 참조하면 gcloud config 속성을 수정할 수 있는 명령어 그룹입니다. 사용법은 다음과 같습니다.

 gcloud config GROUP | COMMAND [GCLOUD_WIDE_FLAG … ]

COMMAND는 set , list 등이 될 수 있습니다. (GROUP은 config 입니다.)

옵션

옵션은 명령의 동작을 수정하는 문서화된 매개변수 유형입니다. 이는 '-' 또는 '--'로 표시되는 키-값 쌍입니다.


gcloud config 명령 그룹의 사용법으로 돌아가서 이 경우 옵션은 GCLOUD_WIDE_FLAG 입니다.


예를 들어, 명령어의 자세한 사용법과 설명을 표시하고 싶다면 gcloud config set –help 실행합니다. 즉, --help 가 옵션입니다.


또 다른 예는 특정 프로젝트의 컴퓨팅 섹션에서 영역 속성을 설정하려는 경우 gcloud config set compute <ZONE_NAME> –project=<PROJECT_ID> 실행하는 것입니다. 즉, --project <PROJECT_ID> 값을 보유하는 옵션입니다.


일반적으로 그들의 위치는 중요하지 않다는 점을 기억하는 것도 중요합니다.

필수 옵션

옵션은 이름처럼 일반적으로 선택 사항이지만 필수 항목으로 맞춤화할 수도 있습니다.


예를 들어 dataproc 클러스터를 만들려면 gcloud dataproc clusters create <CLUSTER_NAME> –region=<REGION> 실행합니다. 그리고 사용법 문서에 명시된 대로:

 gcloud dataproc clusters create (CLUSTER: –region=REGION)

--region 플래그는 이전에 구성되지 않은 경우 필수입니다.

매도 옵션과 매수 옵션

짧은 옵션은 - 로 시작하고 그 뒤에 단일 영숫자 문자가 오는 반면, 긴 옵션은 -- 로 시작하고 그 뒤에 여러 문자가 옵니다. 사용자가 원하는 것이 확실할 때 짧은 옵션을 바로가기로 생각하는 반면, 긴 옵션은 더 읽기 쉽습니다.


락을 선택하셨습니다! 이제 컴퓨터가 선택을 하게 됩니다.

이 튜토리얼을 통해 우리는 무엇을 얻을 수 있나요?

그래서 거짓말을 했습니다… 우리는 가위바위보 CLI 프로그램을 업그레이드하려고 시도하지 않을 것입니다.

대신 실제 시나리오를 살펴보겠습니다.

개요 및 목표

귀하의 팀은 Trello를 사용하여 프로젝트의 문제와 진행 상황을 추적합니다. 귀하의 팀은 터미널을 통해 새로운 GitHub 저장소를 생성하는 것과 유사한 보드와 상호 작용하는 보다 간단한 방법을 찾고 있습니다. 팀에서는 보드의 '할 일' 열에 새 카드를 추가할 수 있어야 하는 기본 요구 사항을 갖춘 CLI 프로그램을 만들도록 요청했습니다.


언급된 요구 사항을 기반으로 요구 사항을 정의하여 CLI 프로그램 초안을 작성해 보겠습니다.


기능 요구 사항

  • 사용자는 보드의 열에 새 카드를 추가할 수 있습니다.
    • 필수입력 : 컬럼, 카드명
    • 선택 입력: 카드 설명, 카드 라벨(기존 항목에서 선택)

비기능적 요구사항

  • 사용자에게 Trello 계정에 대한 액세스 권한을 제공하라는 메시지를 표시하는 프로그램(인증)
  • 사용자에게 작업할 Trello 보드를 설정하라는 메시지를 표시하는 프로그램(구성)

선택적 요구사항

  • 사용자는 보드에 새 열을 추가할 수 있습니다.
  • 사용자는 보드에 새 라벨을 추가할 수 있습니다.
  • 사용자는 모든 열에 대한 간략/상세 보기를 볼 수 있습니다.


위 내용을 바탕으로 CLI 프로그램의 명령과 옵션을 다음과 같이 공식화할 수 있습니다.

요구사항에 따른 CLI 구조 상세 표 보기


Ps 마지막 두 열에 대해서는 걱정하지 마세요. 이에 대해서는 나중에 배우겠습니다…


기술 스택에 관해서는 다음을 고수할 것입니다.


단위 테스트

  • 파이테스트
  • pytest-mock
  • CLI 테스트 도우미

트렐로

  • py-trello(Trello SDK용 Python 래퍼)

CLI

  • 타자기
  • 부자
  • 간단한 메뉴

유틸리티(기타)

  • 파이썬-dotenv

타임라인

우리는 이 프로젝트를 부분적으로 다룰 예정이며, 예상할 수 있는 내용은 다음과 같습니다.


1 부

  • py-trello 비즈니스 로직 구현

2 부

  • CLI 비즈니스 로직 구현
  • CLI 프로그램을 패키지로 배포

3부

  • 선택적 기능 요구사항 구현
  • 패키지 업데이트


컴퓨터가 가위를 선택했어요! 이 싸움에서 누가 승리하는지 보자…

시작하자

폴더 구조

목표는 CLI 프로그램을 PyPI 에 패키지로 배포하는 것입니다. 따라서 다음과 같은 설정이 필요합니다.

 trellocli/ __init__.py __main__.py models.py cli.py trelloservice.py tests/ test_cli.py test_trelloservice.py README.md pyproject.toml .env .gitignore


다음은 각 파일 및/또는 디렉터리에 대한 자세한 내용입니다.

  • trellocli : 사용자가 사용할 패키지 이름 역할을 합니다. 예: pip install trellocli
    • __init__.py : 패키지의 루트를 나타내며 폴더를 Python 패키지로 따릅니다.
    • __main__.py : 진입점을 정의하고 사용자가 -m 플래그를 사용하여 파일 경로를 지정하지 않고도 모듈을 실행할 수 있도록 합니다. 예를 들어 python -m <module_name> 사용하여 python -m <parent_folder>/<module_name>.py 를 대체합니다.
    • models.py : 전역적으로 사용되는 클래스(예: API 응답이 준수할 것으로 예상되는 모델)를 저장합니다.
    • cli.py : CLI 명령 및 옵션에 대한 비즈니스 로직을 저장합니다.
    • trelloservice.py : py-trello 와 상호작용하기 위한 비즈니스 로직을 저장합니다.
  • tests : 프로그램에 대한 단위 테스트를 저장합니다.
    • test_cli.py : CLI 구현을 위한 단위 테스트를 저장합니다.
    • test_trelloservice.py : py-trello 와의 상호 작용을 위한 단위 테스트를 저장합니다.
  • README.md : 프로그램에 대한 문서를 저장합니다.
  • pyproject.toml : 패키지의 구성 및 요구 사항을 저장합니다.
  • .env : 환경 변수를 저장합니다.
  • .gitignore : 버전 제어 중에 무시(추적되지 않음)할 파일을 지정합니다.


Python 패키지 게시에 대한 자세한 설명을 보려면 Geir Arne Hjelle의 오픈 소스 Python 패키지를 PyPI에 게시하는 방법을 확인해 보세요.

설정

시작하기 전에 패키지 설정에 대한 기본 내용을 살펴보겠습니다.


앱 이름 및 버전과 같은 패키지 상수 및 변수가 저장되는 패키지의 __init__.py 파일부터 시작합니다. 우리의 경우 다음을 초기화하려고 합니다.

  • 앱 이름
  • 버전
  • SUCCESS 및 ERROR 상수
 # trellocli/__init__.py __app_name__ = "trellocli" __version__ = "0.1.0" ( SUCCESS, TRELLO_WRITE_ERROR, TRELLO_READ_ERROR ) = range(3) ERRORS = { TRELLO_WRITE_ERROR: "Error when writing to Trello", TRELLO_READ_ERROR: "Error when reading from Trello" }


__main__.py 파일로 이동하면 프로그램의 주요 흐름이 여기에 저장되어야 합니다. 이 경우에는 cli.py 에 호출 가능한 함수가 있다고 가정하고 CLI 프로그램 진입점을 저장합니다.

 # trellocli/__main__.py from trellocli import cli def main(): # we'll modify this later - after the implementation of `cli.py` pass if __name__ == "__main__": main()


이제 패키지가 설정되었으므로 README.md 파일(주 문서) 업데이트를 살펴보겠습니다. 따라야 할 특정 구조는 없지만 좋은 README는 다음과 같이 구성됩니다.

  • 개요
  • 설치 및 요구 사항
  • 시작 및 사용법

더 자세히 알아보고 싶다면 읽어볼만한 또 다른 훌륭한 게시물: merlos의 좋은 README 작성 방법


이 프로젝트에 대한 README를 구성하는 방법은 다음과 같습니다.

 <!--- README.md --> # Overview # Getting Started # Usage # Architecture ## Data Flow ## Tech Stack # Running Tests # Next Steps # References


지금은 뼈대를 그대로 두겠습니다. 이에 대해서는 나중에 다시 설명하겠습니다.


계속해서 공식 문서를 기반으로 패키지의 메타데이터를 구성해 보겠습니다.

 # pyproject.toml [project] name = "trellocli_<YOUR_USERNAME>" version = "0.1.0" authors = [ { name = "<YOUR_NAME>", email = "<YOUR_EMAIL>" } ] description = "Program to modify your Trello boards from your computer's command line" readme = "README.md" requires-python = ">=3.7" classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ] dependencies = [] [project.urls] "Homepage" = ""


사용자 이름, 이름 등 수정해야 하는 자리 표시자가 있는지 확인하세요.


참고로 지금은 홈페이지 URL을 비워 두겠습니다. GitHub에 게시한 후 변경하겠습니다. 또한 지금은 종속성 부분을 비워 두고 진행하면서 추가하겠습니다.


다음 목록에는 API 비밀 및 키와 같은 환경 변수를 저장하는 .env 파일이 있습니다. 이 파일에는 민감한 정보가 포함되어 있으므로 Git에서 추적해서는 안 된다는 점을 기억하는 것이 중요합니다.


우리의 경우에는 여기에 Trello 자격 증명을 저장합니다. Trello에서 Power-Up을 생성하려면 이 가이드를 따르십시오. 더 구체적으로 말하면, py-trello 의 사용법을 기반으로 애플리케이션에 OAuth를 사용하려고 하므로 Trello와 상호 작용하려면 다음이 필요합니다.

  • API 키(애플리케이션용)
  • API 비밀(애플리케이션용)
  • 토큰(데이터에 대한 액세스 권한을 부여하는 사용자의 토큰)


API 키와 비밀을 검색한 후에는 이를 .env 파일에 저장하세요.

 # .env TRELLO_API_KEY=<your_api_key> TRELLO_API_SECRET=<your_api_secret>


마지막으로 여기에서 찾을 수 있는 Python .gitignore 템플릿을 사용해 보겠습니다. 이는 .env 파일이 추적되지 않도록 하는 데 매우 중요합니다. 어느 시점에서 .env 파일이 추적되면 이후 단계에서 파일을 제거하더라도 피해가 발생하고 악의적인 행위자가 이전 파일을 추적할 수 있습니다. 민감한 정보에 대한 패치.


이제 설정이 완료되었으므로 변경 사항을 GitHub에 푸시하겠습니다. pyproject.toml 에 지정된 메타데이터에 따라 LICENSE 및 홈페이지 URL을 적절하게 업데이트해야 합니다. 더 나은 커밋을 작성하는 방법에 대한 참고 자료: Write Better Commits, Build Better Projects by Victoria Dye


기타 주목할만한 단계:

단위 테스트

테스트 작성을 시작하기 전에 API로 작업하고 있으므로 API 가동 중지 위험 없이 프로그램을 테스트할 수 있도록 모의 테스트를 구현한다는 점을 기억하는 것이 중요합니다. Real Python의 모의 테스트에 대한 또 다른 훌륭한 기사는 다음과 같습니다: Python에서 외부 API 모의하기


기능적 요구 사항에 따라 우리의 주요 관심사는 사용자가 새 카드를 추가할 수 있도록 하는 것입니다. py-trello : add_card 의 메소드 참조. 그렇게 하려면 List 클래스에서 add_card 메소드를 호출해야 합니다. 이 메소드는 Board 클래스의 get_list 함수에서 검색할 수 있습니다.


요점을 알겠습니다. 최종 목적지에 도달하려면 많은 도우미 메서드가 필요합니다. 이를 말로 표현해 보겠습니다.

  • 클라이언트의 토큰을 검색하는 테스트
  • 보드 검색 테스트
  • 보드 검색 테스트
  • 보드에서 목록을 검색하는 테스트
  • 목록을 검색하는 테스트
  • 보드에서 라벨을 검색하는 테스트
  • 라벨 검색 테스트
  • 카드 추가 테스트
  • 카드에 라벨을 추가하는 테스트


단위 테스트를 작성할 때 테스트가 최대한 광범위해야 한다는 점을 기억하는 것도 중요합니다. 오류를 잘 처리합니까? 우리 프로그램의 모든 측면을 다루고 있나요?


그러나 이 튜토리얼에서는 성공 사례만 확인하여 작업을 단순화하겠습니다.


코드를 살펴보기 전에 단위 테스트 작성/실행에 필요한 종속성을 포함하도록 pyproject.toml 파일을 수정해 보겠습니다.

 # pyproject.toml [project] dependencies = [ "pytest==7.4.0", "pytest-mock==3.11.1" ]


다음으로 virtualenv를 활성화하고 pip install . 종속성을 설치합니다.


완료되면 마지막으로 몇 가지 테스트를 작성해 보겠습니다. 일반적으로 테스트에는 반환될 모의 응답, 모의 응답으로 반환 값을 수정하여 테스트하려는 함수에 대한 패치, 마지막으로 함수 호출이 포함되어야 합니다. 사용자의 액세스 토큰을 검색하는 샘플 테스트는 다음과 같습니다.

 # tests/test_trelloservice.py # module imports from trellocli import SUCCESS from trellocli.trelloservice import TrelloService from trellocli.models import * # dependencies imports # misc imports def test_get_access_token(mocker): """Test to check success retrieval of user's access token""" mock_res = GetOAuthTokenResponse( token="test", token_secret="test", status_code=SUCCESS ) mocker.patch( "trellocli.trelloservice.TrelloService.get_user_oauth_token", return_value=mock_res ) trellojob = TrelloService() res = trellojob.get_user_oauth_token() assert res.status_code == SUCCESS


내 샘플 코드에서 GetOAuthTokenResponse 는 아직 models.py 에 설정되지 않은 모델이라는 점에 유의하세요. 이는 보다 깔끔한 코드 작성을 위한 구조를 제공하며 나중에 실제로 이를 살펴보겠습니다.


테스트를 실행하려면 python -m pytest 실행하세요. 테스트가 어떻게 실패할지 주목하세요. 하지만 괜찮습니다. 결국에는 문제가 해결될 것입니다.


챌린지 코너 💡 직접 더 많은 테스트를 작성해볼 수 있나요?이 패치를 참조하여 내 테스트가 어떤지 확인하세요.


지금은 trelloservice 구축해 보겠습니다. 새로운 종속성을 추가하는 것부터 시작하는 것이 바로 py-trello 래퍼입니다.

 # pyproject.toml dependencies = [ "pytest==7.4.0", "pytest-mock==3.11.1", "py-trello==0.19.0" ]


다시 한 번 pip install . 종속성을 설치합니다.

모델

이제 trelloservice 에서 기대하는 응답을 규제하기 위해 모델을 구축하는 것부터 시작해 보겠습니다. 이 부분에서는 단위 테스트와 py-trello 소스 코드를 참조하여 예상할 수 있는 반환 값 유형을 이해하는 것이 가장 좋습니다.


예를 들어, py-trellocreate_oauth_token 함수( 소스 코드 )를 참조하여 사용자의 액세스 토큰을 검색한다고 가정하면 반환 값은 다음과 같을 것으로 예상됩니다.

 # trellocli/models.py # module imports # dependencies imports # misc imports from typing import NamedTuple class GetOAuthTokenResponse(NamedTuple): token: str token_secret: str status_code: int


반면에 충돌하는 명명 규칙에 유의하세요. 예를 들어, py-trello 모듈에는 List 라는 클래스가 있습니다. 이에 대한 해결 방법은 가져오는 동안 별칭을 제공하는 것입니다.

 # trellocli/models.py # dependencies imports from trello import List as Trellolist


또한 이 기회를 활용하여 프로그램의 요구 사항에 맞게 모델을 맞춤화할 수도 있습니다. 예를 들어, 반환 값에서 하나의 속성만 필요하다고 가정하면, 전체를 저장하는 대신 반환 값에서 해당 값을 추출하도록 모델을 리팩터링할 수 있습니다.

 # trellocli/models.py class GetBoardName(NamedTuple): """Model to store board id Attributes id (str): Extracted board id from Board value type """ id: str


챌린지 코너 💡 직접 더 많은 모델을 작성해볼 수 있나요?이 패치를 참조하여 내 모델이 어떻게 보이는지 확인하세요.

비즈니스 로직

설정

모델을 내려놓고 공식적으로 trelloservice 코딩을 시작하겠습니다. 다시 말하지만, 우리가 만든 단위 테스트를 참조해야 합니다. 현재 테스트 목록이 서비스에 대한 전체 범위를 제공하지 않는다고 가정하고 필요할 때 항상 더 많은 테스트를 반환하고 추가합니다.


평소대로 모든 import 문을 맨 위에 포함합니다. 그런 다음 예상대로 TrelloService 클래스와 자리 표시자 메서드를 만듭니다. 아이디어는 cli.py 에서 서비스의 공유 인스턴스를 초기화하고 그에 따라 해당 메서드를 호출한다는 것입니다. 게다가 우리는 확장성을 목표로 하고 있으므로 광범위한 적용 범위가 필요합니다.

 # trellocli/trelloservice.py # module imports from trellocli import TRELLO_READ_ERROR, TRELLO_WRITE_ERROR, SUCCESS from trellocli.models import * # dependencies imports from trello import TrelloClient # misc imports class TrelloService: """Class to implement the business logic needed to interact with Trello""" def __init__(self) -> None: pass def get_user_oauth_token() -> GetOAuthTokenResponse: pass def get_all_boards() -> GetAllBoardsResponse: pass def get_board() -> GetBoardResponse: pass def get_all_lists() -> GetAllListsResponse: pass def get_list() -> GetListResponse: pass def get_all_labels() -> GetAllLabelsResponse: pass def get_label() -> GetLabelResponse: pass def add_card() -> AddCardResponse: pass


추신: 이번에는 테스트를 실행할 때 테스트가 어떻게 통과되는지 확인하세요. 실제로 이는 우리가 올바른 방향을 고수하는 데 도움이 될 것입니다. 워크플로는 기능을 확장하고, 테스트를 실행하고, 통과/실패를 확인하고 그에 따라 리팩토링하는 것이어야 합니다.

인증 및 TrelloClient 초기화

__init__ 함수부터 시작해 보겠습니다. 여기서 get_user_oauth_token 함수를 호출하고 TrelloClient 를 초기화하는 것이 아이디어입니다. 다시 한번 중요한 정보를 .env 파일에만 저장해야 한다는 점을 강조하면서, 중요한 정보를 검색하기 위해 python-dotenv 종속성을 사용할 것입니다. pyproject.toml 파일을 적절하게 수정한 후 인증 단계 구현을 시작하겠습니다.

 # trellocli/trelloservice.py class TrelloService: """Class to implement the business logic needed to interact with Trello""" def __init__(self) -> None: self.__load_oauth_token_env_var() self.__client = TrelloClient( api_key=os.getenv("TRELLO_API_KEY"), api_secret=os.getenv("TRELLO_API_SECRET"), token=os.getenv("TRELLO_OAUTH_TOKEN") ) def __load_oauth_token_env_var(self) -> None: """Private method to store user's oauth token as an environment variable""" load_dotenv() if not os.getenv("TRELLO_OAUTH_TOKEN"): res = self.get_user_oauth_token() if res.status_code == SUCCESS: dotenv_path = find_dotenv() set_key( dotenv_path=dotenv_path, key_to_set="TRELLO_OAUTH_TOKEN", value_to_set=res.token ) else: print("User denied access.") self.__load_oauth_token_env_var() def get_user_oauth_token(self) -> GetOAuthTokenResponse: """Helper method to retrieve user's oauth token Returns GetOAuthTokenResponse: user's oauth token """ try: res = create_oauth_token() return GetOAuthTokenResponse( token=res["oauth_token"], token_secret=res["oauth_token_secret"], status_code=SUCCESS ) except: return GetOAuthTokenResponse( token="", token_secret="", status_code=TRELLO_AUTHORIZATION_ERROR )


이 구현에서는 사용자가 승인 중에 Deny 클릭하는 경우와 같이 예측 가능한 오류를 처리하기 위한 도우미 메서드를 만들었습니다. 또한 유효한 응답이 반환될 때까지 사용자의 승인을 재귀적으로 요청하도록 설정되어 있습니다. 왜냐하면 사용자가 앱에 계정 데이터에 액세스하도록 승인하지 않으면 계속할 수 없기 때문입니다.


챌린지 코너 💡 알림 TRELLO_AUTHORIZATION_ERROR ? 이 오류를 패키지 상수로 선언할 수 있나요? 자세한 내용은 설정을 참조하세요.

도우미 기능

이제 인증 부분이 완료되었으므로 사용자의 Trello 보드 검색부터 시작하여 도우미 기능으로 넘어가겠습니다.

 # trellocli/trelloservice.py def get_all_boards(self) -> GetAllBoardsResponse: """Method to list all boards from user's account Returns GetAllBoardsResponse: array of user's trello boards """ try: res = self.__client.list_boards() return GetAllBoardsResponse( res=res, status_code=SUCCESS ) except: return GetAllBoardsResponse( res=[], status_code=TRELLO_READ_ERROR ) def get_board(self, board_id: str) -> GetBoardResponse: """Method to retrieve board Required Args board_id (str): board id Returns GetBoardResponse: trello board """ try: res = self.__client.get_board(board_id=board_id) return GetBoardResponse( res=res, status_code=SUCCESS ) except: return GetBoardResponse( res=None, status_code=TRELLO_READ_ERROR )


목록(열)을 검색하려면 py-trelloBoard 클래스를 확인해야 합니다. 즉, Board 값 유형의 새 매개변수를 수락해야 합니다.

 # trellocli/trelloservice.py def get_all_lists(self, board: Board) -> GetAllListsResponse: """Method to list all lists (columns) from the trello board Required Args board (Board): trello board Returns GetAllListsResponse: array of trello lists """ try: res = board.all_lists() return GetAllListsResponse( res=res, status_code=SUCCESS ) except: return GetAllListsResponse( res=[], status_code=TRELLO_READ_ERROR ) def get_list(self, board: Board, list_id: str) -> GetListResponse: """Method to retrieve list (column) from the trello board Required Args board (Board): trello board list_id (str): list id Returns GetListResponse: trello list """ try: res = board.get_list(list_id=list_id) return GetListResponse( res=res, status_code=SUCCESS ) except: return GetListResponse( res=None, status_code=TRELLO_READ_ERROR )


챌린지 코너 💡 get_all_labelsget_label 함수를 직접 구현할 수 있나요? py-trelloBoard 클래스를 수정합니다. 내 구현이 어떻게 보이는지 보려면이 패치를 자유롭게 참조하세요.

새 카드를 추가하는 기능

마지막으로, 우리는 그동안 목표로 삼았던 새 카드 추가에 마침내 도달했습니다. 여기서는 이전에 선언된 모든 함수를 사용하지 않을 것임을 명심하세요. 도우미 함수의 목표는 확장성을 높이는 것입니다.

 # trellocli/trelloservice.py def add_card( self, col: Trellolist, name: str, desc: str = "", labels: List[Label] = [] ) -> AddCardResponse: """Method to add a new card to a list (column) on the trello board Required Args col (Trellolist): trello list name (str): card name Optional Args desc (str): card description labels (List[Label]): list of labels to be added to the card Returns AddCardResponse: newly-added card """ try: # create new card new_card = col.add_card(name=name) # add optional description if desc: new_card.set_description(description=desc) # add optional labels if labels: for label in labels: new_card.add_label(label=label) return AddCardResponse( res=new_card, status_code=SUCCESS ) except: return AddCardResponse( res=new_card, status_code=TRELLO_WRITE_ERROR )


🎉 이제 모든 작업이 완료되었습니다. 이에 따라 README를 업데이트하고 코드를 GitHub에 푸시하세요.


축하해요! 당신이 이겼어요. 다시 플레이하시겠습니까(y/N)?

요약

양해해 주셔서 감사합니다. :) 이 튜토리얼을 통해 단위 테스트 작성 시 모의 구현, 응집성을 위한 구조 모델, 소스 코드를 통해 핵심 기능 찾기, 타사 래퍼를 사용하여 비즈니스 로직 구현 방법을 성공적으로 배웠습니다.


CLI 프로그램 자체 구현에 대해 자세히 알아보는 2부를 주목하세요.


그동안 계속 연락하세요 🙌