Ruby로 명령행 인터페이스 만들기

이 글에서 저는 루비를 사용하여 명령행 인터페이스 응용 프로그램을 구축한 경험을 소개할 것입니다.gem 디렉터리를 생성하고 Nokogiri를 사용하여 데이터를 긁어내며 사용자 인터페이스를 통합합니다.

자신의 지도를 그리다


Flatiron School를 통해 루비의 기술을 점차적으로 향상시킨 몇 주 후, 이것은 나의 첫 번째 단독 프로젝트인 명령행 인터페이스 응용 프로그램이다.그 전의 연습에서 통과하거나 실패한 테스트가 있어서 언제 내가 확실히 정확한 방향을 향해 전진하는지 알려주었다.그러나 이번에 저의 유일한 지도는 최종 결과에 대한 소망과 이 프로젝트에 대한 요구입니다.
  • CLI를 제공합니다.
  • CLI는 웹 데이터에 대한 액세스를 제공해야 합니다.
  • 제공된 데이터는 최소한 한 층 깊이 들어가야 하며, 일반적으로 사용자에게 사용 가능한 데이터 목록을 표시한 다음에 특정 항목에 깊이 들어가야 한다.
  • 좋은 대상을 위한 디자인 모델을 사용한다.
  • 북방을 찾다


    내가 코드를 한 줄 쓸 수 있기 전에, 나는 웹 사이트를 선택해서 긁어야 한다.이것은 내 응용 프로그램이 접근할 데이터 형식, 즉 그 용도를 결정할 것이다.그리고 내가 쉽게 배울 수 있는 것들을 선택해야 한다.
    고맙게도 내 뒷주머니에 사이트가 하나 있는데, 나는 그것이 매우 잘 일할 것이라고 의심한다.Hack Design 사이트는 각종 유형의 디자인 과정을 제공한다.그것의 페이지는 필요한 단층 깊이 모델을 제공한다.이것은 정적 HTML을 통해 구현된 것으로 내가 원하는 난이도 범위 내에 있다.명령행의 최소한의 환경에서 이런 경험과 교훈을 얻을 수 있다는 것은 나로 하여금 매우 멋진 생각이라고 느끼게 한다.그래서 내가 필요한 내용을 긁어낼 수 있는지 대충 평가한 후에 한번 해 보기로 했다.

    설치


    나는 처음부터 내 응용 프로그램을gem와 같은 자체 포함적이고 배달 가능한 형식으로 포장할 수 있기를 희망한다는 것을 알았다.Bundlerscaffold 디렉터리를 사용하기 시작하는 것을 간단하게 합니다.
    bundle gem 명령을 처음 실행할 때 CODE_OF_CONDUCT.mdLICENSE.txt 을 선택할 수 있습니다.나는 허가증을 선택했다.나는 나의 gm의 상세한 정보로 나의 .gemspec 파일을 업데이트했다. 나의 gm가 무엇을 할 것인지에 대한 간단한 요약과 그것에 대한 더 상세한 설명.내가 그것의 기능을 앞으로 발전시킬 때, 나는 그것의 운행에 의존하는 다른gem를 열거하는 간단한 목록을 추가했다.

    대상 뷰


    나는 사용자 인터페이스를 위해 코드를 작성하기 시작했고, 이 인터페이스는 나의 응용 프로그램의 예상 행위를 모의할 것이다.사용자는 클래스 보기, 과정 보기, 무작위 과정 보기 또는 종료 등 환영 메시지와 옵션을 받을 수 있습니다.나는 아직 어떤 종류나 수업도 없기 때문에 시작할 때 약간의 충전물을 넣었다.이 코드는 lib/hack_design/cli.rb 에 있습니다.나는 bin/hack-design라는 실행 가능한 파일에서 이 코드를 호출하고 프로그램을 실행할 것이다.
    나는 어떤 테스트도 하지 않았지만, 나는 나의 코드가 무엇을 해야 하는지 안다.디버깅은 반복적으로 시도하는 문제이며, 나의 성공의 길이다.이 기술은 나로 하여금 응용 프로그램의 개발을 완성하도록 인도할 것이다.

    적응 및 시작


    나는 데이터를 두 가지 차원으로 나눌 계획이다. 한 과목에서 내용을 제공하고 한 과목에서 수업을 제공할 것이다.제가 구축한 UI에 따라 클래스를 만들어서 aCategory, aLesson, aExercise와 aScraper를 모델링했습니다.나는 ./bin/console 예상 행위를 찾아 이 과정들을 테스트했다.그러나 내가 Scraper 유형을 찾고 수집하는 방법을 가르치기 시작했을 때 생활은 나에게 곡선구를 주었고 이것은 사실상 나의 진보를 약 2주 동안 정체시켰다.
    내가 돌아왔을 때, 나는 잃어버린 시간에 대해 초조함을 느꼈다.나Scraper의 데이터에 대해 더욱 자세하게 조사한 결과, 모든 종류를 제거하는 것이 내가 처음에 상상했던 것보다 더 어렵다는 것을 곧 발견하였다.그래서 생각해 봤어요.우선, 나는 사용자에게 과정 내용을 제공하고 싶다.분류를 열거하는 것이 응용 프로그램의 목적에 정말 그렇게 중요합니까?나는 이렇게 하지 않기로 결정하고 간소화하기 시작했다.
    나는 Category류와 Exercise류를 버렸다.나머지는 내가 필요로 하는 것이다. 하나Lesson류는 그 대상이 매 수업에 관한 데이터를 조직하고 하나Scraper는 사이트에서 이 데이터를 수집하며 하나CLI는 사용자 인터페이스를 관리한다.이러한 변화를 반영하기 위해 UI를 재구성했습니다.범주가 아닌 선택할 수 있는 강좌가 나열됩니다.그리고 데이터는 현재 한 층의 깊이만 있다.

    데이터 소스 닫기


    내 UI가 시작되고 실행될 때 실제 데이터를 제공할 때가 되었다.나는 몇 번의 시도가 있어야만 검색 조회가 정확해질 수 있다는 것을 안다.이전의 캡처 시도에서 나도 너무 많은 조회가 나를 막을 수 있다는 것을 알았다.스크랩할 페이지를fixtures 폴더로 복사해서 이 문제를 해결하기로 했습니다.이것은 내가 라이브 사이트에 대한 요청을 최소한으로 유지할 수 있도록 할 것이다.
    해커가 설계한 설정 방식에 따라 모든 51개 과정은 한 과정homepage에서 찾을 수 있다.이 페이지에서 각 과정은 자신의 페이지로 연결됩니다.홈 페이지의 소스 코드를 복사하려면 cURL 를 사용하여 HTML을 가져와 새 파일에 넣으면 됩니다.
    curl http://hackdesign.org/lessons/ >> fixtures/site/lessons.html
    
    그러나 다른 51페이지는 더 큰 도전이 될 것이다.모든 페이지를 탐색하고 51개의 단독 파일에 수백 줄의 HTML을 복사할 수 없습니다.나는 그것을 대체하기 위해 작은 Bash 스크립트를 썼다.
    #!/bin/bash
    #get-lesson.sh
    
    typeset -i - END
    let END=50 i=0
    while ((i<=END)); do
      echo “Script starting now…”
      curl https://hackdesign.org/lessons/$i -O
      let i++
    done
    echo “Done”
    

    노코기리와 어깨를 나란히 하고 전진하다


    얼마 지나지 않아 나는 긁어야 할 모든 서류가 생겼다.이 작업에 대해 나는 Nokogiri라는 HTML 해상도를 사용했다.CSS를 사용하여 문서를 검색할 수 있습니다.CSS 선택기를 사용하여 원하는 데이터를 포함하는 HTML 요소를 찾습니다.해커 디자인 사이트의 설정과 일치하기 위해 Scraper 두 가지 방법이 있다.::scrape_lessons_page 수업의 홈페이지를 긁어낸다.모든 과정에 해시를 만들고, 과정 제목과 URL을 해시에 추가한 다음, 해시를 모든 과정의 그룹에 추가합니다.::scrape_lesson 수업의 내용 페이지를 스크랩합니다.이것은 특정 과정의 강사 이름과 다른 내용을 해시에 추가하고 결과를 되돌려줍니다.

    재교정: CLI 반환

    CLI류와 Scraper류가 힘을 합쳐 Lesson대상을 생성하는 곳으로 이런 대상은 내용이 가득한 각 과정을 모델링한다.여기서 산열은 Lesson류와 Scraper류 간의 접착제를 충당하여 데이터를 Lesson에서 Scraper로 전송하여 독립과 집중을 유지하는 동시에 협동적으로 작업할 수 있도록 한다.Lesson 객체를 작성하려면 제목과 URL 하나만 필요합니다.나는 교체 Lesson 의 산열수 그룹을 통해 51개 Lesson 대상을 만들었다.그리고 나는 모든 ::scrape_lessons_page 대상의 URL을 Lesson에 전달하고 이 URL은 산열 데이터를 되돌려준다. 나는 기존의 ::scrape_lesson 대상에 추가할 수 있다.이 과정은...없을 때까지 줄곧 순조롭다.
    그 중 한 페이지가 내 것을 파괴하고 있다Lesson.Pry와 코드에 대한 임시 조정을 사용하면 문제를 일으킨 페이지를 찾을 수 있습니다.결과lesson 41는 한 연습에 목록이 하나 있다.그러나 내 Scraper 연습은 목록 항목으로 식별된다.목록에서 이 목록을 발견하면 목록 항목을 다른 연습으로 분류하고 연습의 전형적인 내용을 찾지 못할 때 붕괴됩니다.그것은 연습과 내용을 구분하는 방법이 필요하다.이를 위해, 나는 CSS 선택기를 좀 더 구체화시켰다.이거 디버깅하는 게 재미있어요.
    완료된 객체 51개Scraper로 사용자 인터페이스 작성이 간단해집니다.나는 모든 Lesson 대상을 훑어보고 그에 상응하는 정보를 표시할 수 있다.목록으로 돌아가지 않고 한 시간의 내용에서 다른 시간의 내용으로 이동할 수 있는 방법을 추가했습니다. 그리고 colorizegem를 사용하여 색을 추가했습니다.그리고 난 끝이야.루비 명령행 응용 프로그램을 만들었습니다!
    마지막으로, 나는 나의 gm를 포장하고 설치하며 테스트했다.Bundler 사용 packaging and releasing your gem 은 시작과 마찬가지로 간단합니다.나는gem를 발표하지 않기로 선택했지만, 로컬에서 그것을 포장하고 설치하는 방법을 포함하고 있습니다.내 코드 보기here.

    달콤한 작별 인사


    이 프로젝트를 완성하는 것은 실패에 대한 두려움에 직면한 연습이다.한 걸음 한 걸음 절대적으로 가치가 있다.나는 이 더욱 간단한 최종 제품에 자부심을 느끼고 다음 제품에 대해 매우 흥분한다.
    시간을 내서 이 글을 읽어 주셔서 감사합니다.다음에 봐요!
    표지 예술: Mayumi Matsumoto

    좋은 웹페이지 즐겨찾기