Salah satu keunggulan ruby adalah ruby memiliki banyak sekali library yang bisa kita pakai sesuai kebutuhan kita. Standar distribusi library di ruby adalah dengan menggunakan format yang bernama gem.
Sebuah gem adalah suatu kumpulan file library beserta metadatanya yang
dikompresi dengan gzip, biasanya dengan ekstensi .gem.
Untuk menginstall suatu library menggunakan gem, kita menggunakan
perintah
$ gem install <nama gem>
contoh, kita akan menginstall builder, library untuk membuat dokumen xml:
$ gem install builder
Untuk menggunakan library, baik yang bawaan ruby maupun yang diinstall
menggunakan gem, kita menggunakan method require "<nama file>".
require"rubygems"# tidak dibutuhkan untuk ruby 1.9 ke atasrequire"builder"xml=Builder::XmlMarkup.newxml.persondoxml.name"Slamet Riyadi"xml.location"Indonesia"endUntuk memanage library-library yang digunakan pada suatu project, kita dapat menggunakan bundler.
Pada root directory suatu project, kita mencatat semua library yang kita gunakan beserta versi masing-masing pada file dengan nama Gemfile.
mkdir my_project
cd my_project
touch Gemfile
# Gemfilesource'http://rubygems.org'gem'rails','3.2.3'gem"authlogic"gem'will_paginate',:git=>"git://github.com/bukalapak/will_paginate.git"gem"simple_form","~> 2.0"gem"whenever",:require=>falseUntuk menginstall library yang dibutuhkan, kita menggunakan perintah bundle install.
Bundler kemudian akan membuat file dengan nama Gemfile.lock yang mencatat versi
library yang digunakan saat ini, sehingga ketika kita menjalankan bundle install
pada lain waktu, kita akan mendapatkan library dengan versi yang sama.
Kemudian pada project kita, kita me-load library menggunakan bundler sebagai berikut:
require"rubygems"require"bundler/setup"require"authlogic"Untuk membuat kode kita menjadi gem, kita akan menggunakan bundler untuk menyiapkan package dan strukturnya, sebagai berikut:
bundle gem namagem
yang akan menghasilkan struktur direktori di mana kita bisa meletakkan file-file library kita. Kemudian kita edit file namagem.gemspec dengan data yang sesuai:
# -*- encoding: utf-8 -*-
$:.pushFile.expand_path("../lib",__FILE__)require"namagem/version"Gem::Specification.newdo |s|
s.name="namagem"s.version=Namagem::VERSIONs.platform=Gem::Platform::RUBYs.authors=["Nugroho Herucahyono"]s.email=["xinuc@xinuc.org"]s.homepage=""s.summary=%q{Gem tanpa fitur}s.description=%q{Gem tanpa fitur.}s.add_development_dependency"rspec"s.rubyforge_project="namagem"s.files=`git ls-files`.split("\n")s.test_files=`git ls-files -- {test,spec,features}/*`.split("\n")s.executables=`git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f)}s.require_paths=["lib"]endSelanjutnya kita dapat melakukan build gem tersebut.
gem build namagem.gemspec
Pada umumnya, library ruby opensource dipublish oleh penulisnya ke rubygems.org, sehingga siapapun dapat menginstall dan menggunakannya dengan mudah. Kita dapat mempublish gem kita dengan perintah sebagai berikut:
gem push namagem-0.0.1.gem
Testing merupakan aspek yang sangat penting dalam programming. Testing dapat digunakan untuk memastikan apakah kode yang kita tulis bekerja sesuai dengan yang kita harapkan.
Di ruby, ada banyak sekali testing framework yang tersedia. Diantaranya: test-unit, minitest, rspec, shoulda dan lain-lain. Pada sesi ini, kita akan membahas unit testing dengan menggunakan minitest, yang merupakan test framework bawaan ruby (>= 1.9).
Untuk menggunakan minitest, kita cukup me-require library tersebut dengan
require 'minitest/autorun' dan membuat testcase untuk mengetes kode yang
kita buat dengan assertion.
# person.rbclassPersondefinitialize(first_name,last_name)@first_name=first_name@last_name=last_nameenddeffullname@first_name + " " + @last_nameendend# person_test.rbrequire'./person'require'minitest/autorun'classPersonTest < MiniTest::Unit::TestCasedefsetup@person=Person.new"John","Smith"enddeftest_create_a_correct_fullnameassert_equal"John Smith",@person.fullnameendendatau kita dapat menuliskan test dengan gaya rspec:
# person_test.rbrequire'./person'require'minitest/autorun'describePersondobeforedo@person=Person.new"John","Smith"endit"should create a correct fullname"do@person.fullname.must_equal"John Smith"endendkemudian kita jalankan dengan ruby person_test.rb, yang akan
menghasilkan
Run options: --seed 6446
# Running tests:
.
Finished tests in 0.000741s, 1349.7900 tests/s, 1349.7900 assertions/s.
1 tests, 1 assertions, 0 failures, 0 errors, 0 skips
yang berarti bahwa ada 1 test yang dijalankan tanpa failure.
TDD (test driven development) adalah metode pembuatan software dengan menuliskan test terlebih dahulu, baru kemudian menulis kode implementasinya. Setelah kode implementasi memenuhi testnya, kode kemudian di refactor ke dalam bentuk yang lebih modular.
Misalnya kita akan menulis kode untuk mengubah besaran temperatur dari celsius ke fahrenheit dan sebaliknya. Pertama, kita akan membuat list fitur dari kode tersebut, yaitu:
- dapat mengubah temperatur dari celsius ke fahrenheit
- dapat mengubah temperatur dari fahrenheit ke celsius
kemudian, kita buat test case nya terlebih dahulu, sebagai berikut:
# temperature_converter_test.rbrequire'minitest/autorun'describeTemperatureConverterdoit"can convert temperature from celsius to fahrenheit"doTemperatureConverter.new(10).celsius_to_fahrenheit.must_equal50endit"can convert temperature from fahrenheit to celsius"doTemperatureConverter.new(50).fahrenheit_to_celsius.must_equal10endendJika kita jalankan test ini, maka tentu akan gagal. Baru kemudian kita buat implementasinya sampai testnya berhasil.
# temperature_converter.rbclassTemperatureConverterdefinitialize(temp)@temp=tempenddefcelsius_to_fahrenheit@temp * 9 / 5 + 32enddeffahrenheit_to_celsius(@temp - 32) * 5 / 9endend