Gustavo에 플래그 지원 추가

6936 단어 pythonopensource
저는 URL에 대한 소스 파일을 검색하고 해당 상태에 대한 보고서를 생성하는 명령줄 도구를 사용해 왔습니다.


슬레이트레이터 / 구스타보


파일에 있는 모든 HTTP URL의 컬러 보고서를 인쇄합니다.






Gus는 add windows & unix style command line arguments에게 최근 PR을 받았습니다. 이 PR이 병합되면 Gus는 다음을 승인하고 수행할 수 있습니다.

$ python gus.py -f some.file  // checks the URLs in some.file
$ python gus.py -v            // shows version info 
$ python gus.py -h            // shows usage instructions
--file , --version--help도 작동합니다.

훌륭한 시작인데 왜 거기서 멈추나요? Gus가 더 많은 인수를 처리하기를 원했기 때문에 일련의 조건문을 통해 문자열을 확인sys.argv하는 것은 더 이상 의미가 없습니다. 나는 이 무거운 짐을 들어주기 위해 argparse을 수입하기로 결정했습니다.

가장 먼저 한 일은 프로그램의 기본 출력을 변경하는 것이었습니다. 서식 있는 텍스트 파일을 자동으로 생성하는 대신 콘솔에 대한 출력이 표준이 됩니다. 사용자가 리치 텍스트 파일을 출력으로 원하는 경우 Gus를 전달할 수 있습니다.-r 또는 --rtf 명령줄에서.

다음으로 요청에 대해 http.client 라이브러리를 교체하여 검사기 기능을 업데이트했습니다. 코드와 설명을 사전으로 반환하므로 get_status_code()get_status()로 이름을 변경했습니다. 출력 형식(콘솔 또는 RTF)을 결정할 때 이것이 도움이 될 것이라고 생각했습니다.

def get_status(url):
  try:
    conn = requests.head(url, timeout=2.5)
    code = conn.status_code
    series = str(code)[0]
    desc = 'UNKN'
    if series == '2':
      desc = 'GOOD'
    elif series == '4':
      desc = 'FAIL'
    return {'code':code, 'desc':desc}
  except:       # all exceptions default to status == 400
    return {'code':400, 'desc':'FAIL'}

계속 진행하기 전에 지적하고 싶은 한 가지는... 모든 예외가 status == 400 로 기본 설정되는 방식에 주목하십시오. 저는 이것이 마음에 들지 않아서 new issue to improve exception handling 을(를) 열었습니다. 가까운 장래에 저(또는 다른 사람 🤞)가 이 작업을 할 시간이 있기를 바랍니다.

사용자가 어떤 출력 형식을 선택하든 모든 URL을 확인한 후에 표시하거나 생성하기로 결정했습니다. Gus는 아직 스레딩을 활용하지 않기 때문에 다소 시간이 걸릴 수 있습니다. Gus가 오래 걸리는 경우 진행 상황을 보여줌으로써 모든 것이 괜찮다는 것을 사용자에게 보여주고 싶었습니다. 약간의 연구 끝에 나는 다음을 생각해 냈습니다.

print(f'\r Checking URL {list.index(string)} of {len(list)}', end="\r")

for 루프에 위의 인쇄 문을 넣으면 각 반복이 자신을 덮어쓰고 한 줄의 진행률 업데이트를 사용자에게 제공합니다.

모든 것이 예상대로 작동하면 두 가지 새로운 기능을 개발하기 위해 두 개의 새 분기를 만들었습니다.
  • Support --json flag
  • Support --all, --good, and --bad flags

  • 이 시점에서 저는 argparse이 탑승하게 되어 매우 기뻤습니다. Argparse가 이미 문자열 매개변수output를 기본 함수로 보내고 있었습니다. output의 값은 "std"또는 "rtf"일 수 있으며 "json"을 믹스에 추가하는 것은 쉬웠습니다.
    --all , --good--bad 플래그를 지원하기 위해 argparse는 목록 매개변수wanted를 기본 함수에 보내야 했습니다. 기본적으로 wanted 목록은 다음과 같습니다.

    ['GOOD','FAIL', 'UNKN']
    
    --good 또는 --bad를 전달하면 그에 따라 위 목록의 값이 제한됩니다. 모든 경우에 wanted의 값은 get_status()에서 반환된 사전과 비교하여 확인되며 일치하는 항목이 있으면 나중에 출력할 수 있도록 형식이 지정된 문자열이 저장됩니다.

    많은 함수가 사용자의 출력 선택이 무엇인지 알아야 하므로 함수에서 함수로 전달하는 대신 전역 변수로 만들기로 했습니다. 이것이 잘못된 형식인지는 확실하지 않지만 코드가 꽤 깨끗해 보이고 모든 것이 의도한 대로 작동했습니다.

    현재까지 Gus의 모든 옵션은 다음과 같습니다.


    명령줄 인수
    설명


    -f 파일 이름, --파일 파일 이름
    확인할 소스 파일의 위치

    -a, --모두
    출력에는 모든 결과가 포함됩니다(기본값).

    -g, --좋음
    출력에는 [GOOD] 결과만 포함됩니다.

    -b, --나쁜
    출력에는 [FAIL] 결과만 포함됩니다.

    -r, --rtf
    채색된 리치 텍스트 파일로 출력

    -j, --json
    JSON으로 출력

    -h, --도움말
    도구 사용 방법에 대한 정보 표시 및 종료

    -v, --버전
    프로그램의 버전 번호를 표시하고 종료


    어려운 부분은 두 가지를 병합하는 것이었습니다. 재귀적 3자 머지를 하려고 했는데 결국 개밥이 되었네요... 머징을 망친건 확실한데 제가 원하는 코드가 깃헙에 올라와 있어서 하소연을 못하겠네요. Gus에 대해 두 가지 기능이 더 계획되어 있으므로 곧 다시 분기를 병합하려고 합니다.

    좋은 웹페이지 즐겨찾기