Construirea unei bijuterii a fost o sarcină complexă, care ar necesita fie o cunoaștere precisă a formatului de bijuterie, fie ea însăși, sau unelte dedicate pentru a genera o boilerplate adecvat. Aceste zile, putem folosi Bundler-ul excelent pentru a elimina această complexitate și pentru a menține cantitatea de cod generat la un nivel minim.
Bijuteria de test pe care o vom construi este un generator de conținut inactiv pe care l-ați putea folosi în timpul dezvoltării. În loc să genereze propoziții "lorem ipsum", folosește Dracula lui Bram Stoker pentru a genera o cantitate arbitrară de propoziții luate din carte. Fluxul nostru de lucru va începe prin generarea bijuteriei, testarea și punerea în aplicare a cantității minime de cod necesare pentru a obține gemul nostru gata, apoi publicarea pe RubyGems.
Voi presupune că aveți un mediu Ruby deja configurat. Pentru acest tutorial, vom folosi Ruby 1.9.3 ca linie de referință. Dacă intenționați, totuși, să dezvoltați o bijuterie reală, ar fi bine să o testați și împotriva lui Ruby 1.8 și a altor interpreți. În acest scop, o unealtă ca Travis CI este o poveste de dragoste; cu o suită de testare solidă, Travis vă va permite să vă testați bijuteria împotriva unei largi varietăți de platforme, fără nici un fel de hassle. Să începem prin generarea scheletului:
bundle gem bramipsum
Îmi pare rău dacă nu vă place numele pe care l-am ales, de fapt, una dintre cele mai grele sarcini în dezvoltarea unei bijuterii este găsirea unui nume potrivit. Comanda va crea un director, numit bramipsum
cu câteva fișiere:
Gemfile este foarte minim:
sursă "http://rubygems.org" # Specificați dependențele dvs. de bijuterie în bramipsum.gemspec gemspec
Rețineți că vă spune în mod clar să vă mutați dependențele de bijuterii bramipsum.gemspec
, pentru a avea toate datele relevante pentru bijuteria dvs. din fișierul care va fi folosit pentru a popula metadatele pe Rubygems.
gemspec
fișier conține o mulțime de informații despre bijuteria noastră; putem vedea că se bazează foarte mult pe ea git pentru a atribui valorile corecte tuturor variabilelor care implică înregistrarea fișierelor.
# - * - codificare: utf-8 - * - necesită File.expand_path ('... / lib / bramipsum / version', __FILE__) Gem :: Specification.new do | gem.authors = ["Claudio Ortolina"] gem.email = ["[email protected]"] gem.description =% q TODO: Scrie o descriere a gemului gem.summary =% q TODO: gem.homepage = "" gem.executables = 'git ls-fișiere - bin / *' împărțit ("\ n") hartă | Fișierul de fișiere.basename (f) gem.files = 'git ls-files'.split ("\ n") gem.test_files =' git ls-files - test, spec, \ n ") gem.name =" bramipsum "gem.require_paths = [" lib "] gem.version = Bramipsum :: VERSION gem.add_development_dependency 'rake' end
În continuare, putem fugi pachet
pentru a instala Rake. Așa cum a fost adăugat ca dependență de dezvoltare, acesta nu va fi instalat de Bundler când cineva folosește bijuteria noastră.
Câteva note interesante despre fișier:
Descriere
și rezumat
trebuie să fie modificată pentru a fi afișată corect pe Rubygems.lib / bramipsum / versiune
fișier, necesar în partea de sus. Definește VERSIUNE
constanta, numita chiar inainte de sfarsitul dosarului. lib
dosarul conține o generică bramipsum.rb
fișier care necesită versiune
modul. Chiar dacă comentariul din fișier sugerează că adăugați cod direct în fișierul însuși, îl vom folosi doar pentru a solicita clasele separate care vor forma micul nostru bijuterie.
Să începem prin actualizarea datelor din bramipsum.gemspec
:
... gem.description =% q Propoziții aleatoare de la Dracula lui Bram Stoker gem.summary =% q Generați una sau mai multe propoziții inanimate luate de la Bram Stoker's Dracula ...
Lucruri foarte simple. Apoi, să adăugăm suport pentru testarea corectă. Noi vom folosi Minitest, așa cum este inclus implicit în Ruby 1.9. Să adăugăm a Test
director:
test mkdir
Apoi, avem nevoie de a test_helper.rb
dosar și un test pentru prezența Bramipsum :: VERSION
constant.
atingeți testul / test_helper.rb mkdir -p test / lib / bramipsum atingeți testul / lib / bramipsum / version_test.rb
Să deschidem test_helper.rb
fișier și adăugați câteva linii:
cereți 'minitest / autorun' necesită 'minitest / pride' necesită File.expand_path ('... / ... /lib/bramipsum.rb', __FILE__)
Aceasta necesită atât Minitest cât și Pride pentru rezultate colorate; atunci este nevoie de fișierul principal bramipsum.
version_test.rb
fișierul trebuie actualizat cu următorul cod:
require_relative "... / ... / test_helper" descrie Bramipsum face "trebuie să fie definit" do Bramipsum :: VERSION.wont_be_nil end end
Folosim formatul așteptărilor pentru testele noastre. Testul în sine este destul de auto-explicativ și poate fi rulat cu ușurință prin tastarea:
testul ruby / lib / bramipsum / version_test.rb
Ar trebui să aveți un test de trecere!
Să actualizăm acum Rakefile
pentru a avea o modalitate mai confortabilă de a rula testele noastre. Ștergeți totul și inserați următorul cod:
#! / usr / bin / env rake necesită "bundler / gem_tasks" necesită rake / testtask Rake :: TestTask.new nu | t | t.libs << 'lib/bramipsum' t.test_files = FileList['test/lib/bramipsum/*_test.rb'] t.verbose = true end task :default => :Test
Acest lucru ne va permite să executăm testele tastând greblă
din dosarul rădăcină bijuterie.
Cum accentul acestui tutorial este crearea unei bijuterii, vom limita cantitatea de funcționalitate pe care o vom adăuga.
Bramipsumul este încă o coajă goală. Întrucât vrem să folosim cartea lui Dracula pentru a genera propoziții, este timpul să îl adăugăm în depozit. Am pregătit o versiune a cărții în care am eliminat orice conținut, cu excepția povestirii în sine: să o adăugăm la proiect.
mkdir -p book curl https://raw.github.com/cloud8421/bundler-gem-tutorial/master/book/dracula.txt -o carte / dracula.txt
Să creăm acum Baza
clasă, unde se vor adăuga toate metodele necesare pentru extragerea datelor din carte.
atingeți lib / bramipsum / base.rb touch test / lib / bramipsum / base_test.rb
Fișierul de testare va avea doar câteva așteptări:
cer_relative '... / ... / test_helper' descrie Bramipsum :: Baza face subiect Bramipsum :: Base descrie "citirea din fișier" face "trebuie să aibă o sursă" do subject.must_respond_to (: source) fișierul ca sursă "nu face subject.source.must_be_instance_of (String) sfârșitul final descrie" împărțirea în linii "face-l" trebuie să împărțiți corect fișierul în linii "face subject.processed_source.must_be_instance_of (Array) sfârșitul" trebuie să eliminați corect linii goale "face subject.processed_source.wont_include (nil) end end end
Alergare greblă
acum va arăta o excepție, ca base.rb
fișierul este încă gol. Baza
va citi pur și simplu conținutul fișierului și va întoarce o serie de linii (eliminând cele goale).
Implementarea este foarte simplă:
modulul Bramipsum de clasă Bază def self.source @source || = auto.read final def self.processed_source @processed_source || = self.source.split ("\ n") uniq final privat def self.read File.read (fișier .expand_path ('book / dracula.txt')) sfârșitul capătului final
Definim o serie de metode de clasă care dețin textul original și o versiune prelucrată, caching-ul rezultatelor după prima rulare.
Apoi trebuie să ne deschidem lib / bramipsum.rb
și adăugați declarația care impune dreptul:
requ_relative "./bramipsum/base"
Dacă salvați și rulați greblă
acum, ar trebui să vedeți toate testele care trec.
Apoi, trebuie să adăugăm o nouă clasă pentru a genera propoziții. O vom numi propoziție
.
atingeți lib / bramipsum / teză touch.rb / lib / bramipsum / sentence_test.rb
Ca și înainte, trebuie să ne deschidem lib / bramipsum.rb
și solicitați fișierul nou creat:
requ_relative "./bramipsum/base" require_relative "./bramipsum/sentence"
Această clasă va moșteni de la Baza
, astfel încât să putem menține implementarea minimă. Testul va necesita doar trei așteptări:
"... / ... / test_helper" descrie Bramipsum :: Propoziția face obiectul Bramipsum :: Sentence trebuie să returneze o propoziție aleatorie "does subject.sentence.must_be_instance_of (String) termină" trebuie să returneze 5 propoziții în mod implicit " .sentences.size.must_equal (5) termină "trebuie să returneze suma specificată a propozițiilor" în subject.sentences (10) .size.must_equal (10) end end
Ideea este că putem apela Bramipsum :: Sentence.sentence
sau Bramipsum :: Sentence.sentences (10)
pentru a genera ceea ce avem nevoie.
Conținutul pentru sentence.rb
este, de asemenea, foarte concis:
modul Bramipsum clasa Propoziție < Base def self.sentence self.processed_source.sample end def self.sentences(n=5) self.processed_source.sample(n) end end end
Pe măsură ce suntem pe Ruby 1.9, putem folosi probă
pentru a returna un element aleator dintr-o matrice.
Încă o dată, alergând greblă
trebuie să afișeze toate încercările care trec.
Dacă alergi bijuterie construi
din linia de comandă, o copie locală a bijuteriei va fi construită și împachetată pentru dvs. Dacă nu aveți nevoie să o distribuiți sau dacă aveți nevoie să o păstrați privată, vă puteți opri aici. Dar dacă este un proiect pe care îl puteți deschide, vă încurajez să faceți acest lucru.
Pasul evident este de a adăuga noua noastră bijuterie la RubyGems.org.
După ce creați un cont pe site, vizitați profilul dvs. Veți găsi o comandă pe care trebuie să o rulați pentru a autoriza computerul. În cazul meu, a fost:
curl -u cloud8421 https://rubygems.org/api/v1/api_key.yaml> ~ / .gem / credentials
Sunteți acum doar un pas pentru a publica bijuteria pe Rubygems, dar nu o faceți decât dacă doriți cu adevărat. Comanda pe care ați rula este:
gem push bramipsum-0.0.1.gem
Felicitări! Știți acum cum să creați o bijuterie de la zero folosind doar Bundler. Există totuși și alte lucruri care trebuie luate în considerare:
require_relative
solicită; în plus, va trebui să utilizați Minitest
bijuterie, deoarece nu este inclus implicit în Ruby 1.8Vă mulțumim pentru lectură! Alte intrebari?