И онда орач рече, “Реци нам о раду.”* или .rvmrc

Овај чланак је инспирисан:

Често изађу нове алатке и ако нису приказане на повољан начин, могу лако да мимоиђу потенционалне кориснике. Тако сам чуо за RVM у пролазу и дуго времена нисам обраћао пажњу на њега. Тек касније сам почео да га користим.

Сада бих да опишем врло сажето корисне делове горе поменуте алатке, јер сматрам да сам сајт то не ради довољно добро, али више то радим из љутње што ја нисам почео да користим све могућности овог пројекта. Па да спречим да се то не деси другима.

Увод

Шта је RVM? Само име говори шта ради: Ruby Version Manager, омогућава више верзија рубија да функционишу на једној машини. Али не само то, интересантан део је да уз верзије рубија, омогућава и опстанак “џемова” за сваку верзију. Но може још и нешто да омогући: посебну инсталацију “џемова” за сваки пројекат на вашој машини.

И сада, најбољи део, то све може да се активира аутоматски, за сваки пројекат чим се нађете у самом директоријому пројекта. И за све је заслужан само један фајл: .rvmrc.

Како?

RVM је скуп скрипти написаних у bash-у, које створе .rvm у вашем $HOME директоријому, где стави све жељене верзије рубија и њихове “џемове”.

Ви онда можете да бирате коју верзију рубија желите овако:

$ rvm list
    rvm rubies

   ruby-1.9.2-p136 [ x86_64 ]
=> ruby-1.8.7-p330 [ x86_64 ]

$rvm use 1.9.2

што ће да пређе са верзије 1.8.7 на верзију 1.9.2.

Зимница

То је прилично једноставно, али како шта је са “џемовима”? И они могу да се инсталирају исто као и пре:

$ gem install bundler

али овако је још и лакше пошто ће све бити инсталирано у вашем радном простору, тј. $HOME/.rvm.

То је практично, али посебно интересанто је то што можете да правите посебне скупове “џемова” који одговарају само одређеним пројектима. На следећи начин:

$ rvm gemset create moj-izbor

Пребаците се у тај нови скуп:

$ rvm ruby-1.9.2-p136@moj-izbor

И онда инсталирате пожељне “џемове”.

Информације

Путем rvm info можете да видите више детаља о тренутном стању вашег RVM окружења. На пример, да видите где су тренутно инсталирани “џемови” које користите:

$ rvm info|egrep "GEM_(HOME|PATH)"
    GEM_HOME:     "/home/taliban/.rvm/gems/ruby-1.9.2-p136"
    GEM_PATH:     "/home/taliban/.rvm/gems/ruby-1.9.2-p136:/home/taliban/.rvm/gems/ruby-1.9.2-p136@moj-izbor"
#
# пази ово ------------------------------------------------------------------------------------^^^^^^^^^

Аутомата

Прилично једноставно, али може бити још и лакше, нарочито ако радите на више пројеката или ако тестирате један пројекат на разне начине. Створите фајл .rvmrc у самом директоријуму пројекта са:

 rvm ruby-1.9.2

тако да не морате ручно да мењате ваше окружење, већ ће RVM то радити аутоматски од тада чим уђете у тај пројекат.

* део из књиге “Пророк” од Халила Џибрана

(слика преузета са pressonline.rs)

Блог у синатри, епизода трећа

А шта ако setup.yaml нема title дефинисан? Или ако нема setup.yaml ништа у себи?

Отворим нови огранак:

$ git checkout -b extra_checks

и ту почнем да пишем тестове у spec/config_spec.rb:

context "when the title is blank" do
  it "should return nothing" do
    YAML.stub!(:load_file).with("setup.yaml").and_return({"title" => ""}) 
    Config.title.should match("")
  end
end

Пробам:

$ bundle exec rspec spec/config_spec.rb

Тест прође. Онда додам други:

context "when the title is missing" do
  it "should return nil" do
    YAML.stub!(:load_file).with("setup.yaml").and_return({}) 
    Config.title.should be_nil
  end
end

И он прође. Онда пробам све тестове заједно:

$ bundle exec rake

Config
  .title
    should return value
  when the title is blank
    should return nothing
  when the title is missing
    should return nil

blurgh
  should respond to /
  should have a title

Finished in 0.01154 seconds
5 examples, 0 failures

Сви пролазе. Онда додам напредак у гит и све ставим у главно стабло:

$ git add spec/config_spec.rb
$ git commit -m "још тестова за Config.title" 
$ git checkout master
$ git merge extra_checks

Блог систем у синатри, епизода прва

Идеја овог чланка је писање апликације у синатри, са тестирањем и гитом. Предходно знање ових технологија/апликација није потребно.

Блог систем треба да има YAML фајл у коме се убаци наслов, и место где ће да се држе чланци.

Од самог почетка користићу тестирање:

$ mkdir blurgh
$ cd blurgh 
$ emacs Gemfile

и додам:

source 'http://rubygems.org'

gem 'sinatra'
gem 'rack-test'
gem 'rspec'
gem 'rake'

онда инсталирам:

$ gem install -r bundle 
$ bundle install    

Да би омогућио да RSpec функционше, требам да направим следеће фајлове:

$ mkdir spec
$ emacs spec/spec_helper.rb

И додам следеће:

require File.join(File.dirname(__FILE__), '..', 'blurgh')

require 'sinatra'
require 'rack/test'
require 'rspec'


# set test environment
set :environment, :test
set :run, false
set :raise_errors, true
set :logging, false


RSpec.configure do |c|
  c.include Rack::Test::Methods
end    

Кључни део овде је додавање: Rack::Test::Methods. То омогућава тестирање уз помоћ rack.

Онда направим први тест:

$ emacs spec/blurgh_spec.rb

и напишем први тест:

require 'spec_helper'

describe "blurgh" do

  def app
    @app ||= Sinatra::Application
  end

  it "should respond to /" do
    get '/'
    last_response.should be_ok
  end
end

да покренем тај тест:

$ bundle exec rspec spec/blurgh_spec.rb

он наравно неће да прође јер још увек нема главне апликације, зато

$ emacs blurgh.rb

и додам следеће:

#!/usr/bin/env ruby

require 'sinatra'

get '/' do
end

поново покренем тестирање:

$ bundle exec rspec spec/blurgh_spec.rb

и избаци следеће резултате:

$ bundle exec rspec spec/blurgh_spec.rb 
.

Finished in 0.01479 seconds
1 example, 0 failures

да би то било мало разговетније, покренем тестирање са “документационом” опцијом и бојом, овако:

$ bundle exec rspec -f doc --colour spec/blurgh_spec.rb 

blurgh
  should respond to /

Finished in 0.01517 seconds
1 example, 0 failures

То је добар почетак, и то ћу да убацим у гит:

$ git init
$ emacs .gitignore

и ту ставим следеће:

Gemfile.lock

## Mac OS
.DS_Store

## Textmate
*.tmproj
tmtags

## Emacs
*~
\#*
.\#*

## Vim
*.swp

додам фајлове у гит:

$ git add .
$ git status

који врати следеће:

# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   .gitignore
#   new file:   Gemfile
#   new file:   blurgh.rb
#   new file:   spec/blurgh_spec.rb
#   new file:   spec/spec_helper.rb
#

онда упишем те промене фајлове:

$ git commit -m "сам почетак"

што испише следеће резултате

[master (root-commit) ea5dd64] сам почетак
 5 files changed, 58 insertions(+), 0 deletions(-)
 create mode 100644 .gitignore
 create mode 100644 Gemfile
 create mode 100755 blurgh.rb
 create mode 100644 spec/blurgh_spec.rb
 create mode 100644 spec/spec_helper.rb

Али пошто је то досадно да се стално куца, користићу rake да то аутоматизујем:

$ emacs Rakefile

у коју додам ово:

require 'rspec/core/rake_task'

RSpec::Core::RakeTask.new do |t|
  t.rspec_opts = ["-r ./spec/spec_helper.rb"]
  t.pattern = 'spec/**/*_spec.rb'
end

то омогућује RSpec да покреће тестове када се укуца:

$ bundle exec rake spec 

Али пошто ће то бити честа радња, да омогућим да куцам што мање, додајем и ово:

task :default => "spec"

Тако да могу да укуцам само:

$ bundle exec rake 

Да би имао боју и опис тестова, отворим нови фајл .rspec и у њега убацим:

--colour --format doc

Сада резултат изгледа боље:

$ bundle exec rake 

blurgh
  should respond to /

Finished in 0.0092 seconds
1 example, 0 failures

То сада може да се дода у гит:

$ git status

ми покаже који су нови фајлови које могу да додам:

$ git add Rakefile .rspec
$ git commit -m "додајем Rakefile и .rspec"

Опис књиге: Rails 3 in Action

Књиге које описују неку тренутну технологију или “алат” брзо остаре и њихов значај губи смисао, зато што касни за технологијом коју описује. Није много другачије што се тиче “Шина” (или ти Rails). Штавише, мислим да су књиге које описују Rails, кад се издају, већ “бајате” и говоре о томе како се радило јуче.

“Rails 3 in Action” покушава да то мало измени, тако што почиње да учи читаоца како се ради са Rails-ом почевши са методологијама где се пишу тестови прво, па тек онда сам програм. За то је аутор књиге изабрао Cucumber и RSpec. Све то је праћено коришћењем Git система за одржавање кода.

Аутор то ради тако што да мали увод у све технологије, али да би то најбоље дочарао прави апликацију и објашњава кораке. На тај начин доступа читаоцу не само да види како се тренутно пишу апликације са тестирањем, него како и он сам ради.

Моје разумевање “краставца” је да он треба да опише систем. Технологија коју он тестира може да се замени а да features и steps (делови који сачињавају краставац) могу да остану идентични. Начин на који аутор то приказује, није могуће. Модели скоро да нису тестирани, али зато контролери јесу.

Књига наводи два аутора: Јехуду Кетца и Рајана А. Бига. Али заправо Рајан је пише сам. Но то не значи ништа негативно, књига служи као добра референца.

Други разлог зашто наводим ауторе је JavaScript, и баш специфично jQuery. Иако је Јехуда један од главних програмера на Rails и jQuery пројектима (или барем је био до издања Rails верзије 3), jQuery се и не помиње. Има један део где се говори о Prototype, али то је само мали пример.

Да ли бих препоручио ову књигу? Моје мишљење је да не постоји један извор информација, без обзира на област. Тако да сматрам да је књига само још један начин на који можете видети нови приступ. Ја сам купио ову књигу, у MEAP* издању, и неки пут погледам како је аутор радио или применио нешто. Али читање блогова и праћење пројекта, не само Rails, већ Cucumber, RSpec и других је потребно. Али ако нисте пре користили Rails, и желите да научите како да развијате пројекат тако што пишете прво тестове па програм, књига је добар увод.

Rails 3 In Action - издавачева страница

Пројекат коришћен у књизи се налази овде на github-у.

* MEAP - електронско издање, где се добија приступ књизи док се још пише, поглавље по поглавље (Manning Early Access Program)

(текст је преправљан 13. априла 2011)