Ruby로 명령행 인터페이스 만들기
7113 단어 cnc2018programmingrubyshowdev
자신의 지도를 그리다
Flatiron School를 통해 루비의 기술을 점차적으로 향상시킨 몇 주 후, 이것은 나의 첫 번째 단독 프로젝트인 명령행 인터페이스 응용 프로그램이다.그 전의 연습에서 통과하거나 실패한 테스트가 있어서 언제 내가 확실히 정확한 방향을 향해 전진하는지 알려주었다.그러나 이번에 저의 유일한 지도는 최종 결과에 대한 소망과 이 프로젝트에 대한 요구입니다.
북방을 찾다
내가 코드를 한 줄 쓸 수 있기 전에, 나는 웹 사이트를 선택해서 긁어야 한다.이것은 내 응용 프로그램이 접근할 데이터 형식, 즉 그 용도를 결정할 것이다.그리고 내가 쉽게 배울 수 있는 것들을 선택해야 한다.
고맙게도 내 뒷주머니에 사이트가 하나 있는데, 나는 그것이 매우 잘 일할 것이라고 의심한다.Hack Design 사이트는 각종 유형의 디자인 과정을 제공한다.그것의 페이지는 필요한 단층 깊이 모델을 제공한다.이것은 정적 HTML을 통해 구현된 것으로 내가 원하는 난이도 범위 내에 있다.명령행의 최소한의 환경에서 이런 경험과 교훈을 얻을 수 있다는 것은 나로 하여금 매우 멋진 생각이라고 느끼게 한다.그래서 내가 필요한 내용을 긁어낼 수 있는지 대충 평가한 후에 한번 해 보기로 했다.
설치
나는 처음부터 내 응용 프로그램을gem와 같은 자체 포함적이고 배달 가능한 형식으로 포장할 수 있기를 희망한다는 것을 알았다.Bundlerscaffold 디렉터리를 사용하기 시작하는 것을 간단하게 합니다.
bundle gem
명령을 처음 실행할 때 CODE_OF_CONDUCT.md
및 LICENSE.txt
을 선택할 수 있습니다.나는 허가증을 선택했다.나는 나의 gm의 상세한 정보로 나의 .gemspec
파일을 업데이트했다. 나의 gm가 무엇을 할 것인지에 대한 간단한 요약과 그것에 대한 더 상세한 설명.내가 그것의 기능을 앞으로 발전시킬 때, 나는 그것의 운행에 의존하는 다른gem를 열거하는 간단한 목록을 추가했다.대상 뷰
나는 사용자 인터페이스를 위해 코드를 작성하기 시작했고, 이 인터페이스는 나의 응용 프로그램의 예상 행위를 모의할 것이다.사용자는 클래스 보기, 과정 보기, 무작위 과정 보기 또는 종료 등 환영 메시지와 옵션을 받을 수 있습니다.나는 아직 어떤 종류나 수업도 없기 때문에 시작할 때 약간의 충전물을 넣었다.이 코드는
lib/hack_design/cli.rb
에 있습니다.나는 bin/hack-design
라는 실행 가능한 파일에서 이 코드를 호출하고 프로그램을 실행할 것이다.나는 어떤 테스트도 하지 않았지만, 나는 나의 코드가 무엇을 해야 하는지 안다.디버깅은 반복적으로 시도하는 문제이며, 나의 성공의 길이다.이 기술은 나로 하여금 응용 프로그램의 개발을 완성하도록 인도할 것이다.
적응 및 시작
나는 데이터를 두 가지 차원으로 나눌 계획이다. 한 과목에서 내용을 제공하고 한 과목에서 수업을 제공할 것이다.제가 구축한 UI에 따라 클래스를 만들어서 a
Category
, 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
Reference
이 문제에 관하여(Ruby로 명령행 인터페이스 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/adjoa/building-a-command-line-interface-with-ruby--370k텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)