Crearea de bijuterii cu Bundler

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.


Ce construim

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.


Generarea unui schelet

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

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.

bramipsum.gemspec

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:

  • Acesta include comentariul de deschidere Ruby 1.9 care specifică codificarea fișierelor. Acest lucru este important, deoarece unele date din fișier (precum e-mailul sau numele autorului) pot fi un caracter non-ascii.
  • Descriere și rezumat trebuie să fie modificată pentru a fi afișată corect pe Rubygems.
  • Versiunea este definită în interiorul lib / bramipsum / versiune fișier, necesar în partea de sus. Definește VERSIUNE constanta, numita chiar inainte de sfarsitul dosarului.

Dosarul lib

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.


Actualizarea datelor de bază și adăugarea unui cadru de testare

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.


Adăugarea funcționalității

Cum accentul acestui tutorial este crearea unei bijuterii, vom limita cantitatea de funcționalitate pe care o vom adăuga.


Clasa de bază

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.


Clasa de clase

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.


Construirea și distribuirea bijuteriei

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

Concluzie

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:

  • Compatibilitate: poate doriți să sprijiniți și Ruby 1.8. Acest lucru va necesita refactorizarea tuturor require_relative solicită; în plus, va trebui să utilizați Minitest bijuterie, deoarece nu este inclus implicit în Ruby 1.8
  • Integrare continuă: puteți adăuga suport pentru Travis CI și bijuteria dvs. va fi testată în nor față de toate versiunile importante Ruby. Acest lucru va face simplu să vă asigurați că nu există probleme cu schimbări de comportament specifice platformei.
  • Documentație: acest lucru este important, este bine să aveți comentarii RDoc care pot ajuta la generarea documentelor automate și un dosar README bun cu exemple și linii directoare.

Vă mulțumim pentru lectură! Alte intrebari?

Cod