W codziennej pracy często zdarza się sytuacja kiedy potrzebujemy informacji odnośnie jakiegoś narzędzia, biblioteki itp. Wtedy ruszamy często do Googla. Lecz można również… oszukiwać (cheat - oszustwo) instalując taki oto przydatny wynalazek ułatwiający nam życie:

$ gem install cheat

i od razu możemy z niego korzystać, powiedzmy że potrzebuję informacji jak używać git’a:

$ cheat git

I dostaniemy taki oto cheatsheet:

git:
  Setup
  -----

  git clone <repo>
    clone the repository specified by <repo>; this is similar to "checkout" in
    some other version control systems such as Subversion and CVS

  Add colors to your ~/.gitconfig file:

    [color]
      ui = auto
    [color "branch"]
      current = yellow reverse
      local = yellow
      remote = green
    [color "diff"]
      meta = yellow bold
      frag = magenta bold
      old = red bold
      new = green bold
    [color "status"]
      added = yellow
      changed = green
      untracked = cyan

  Highlight whitespace in diffs

    [color]
      ui = true
    [color "diff"]
      whitespace = red reverse
    [core]
      whitespace=fix,-indent-with-non-tab,trailing-space,cr-at-eol

  Add aliases to your ~/.gitconfig file:

    [alias]
      st = status
      ci = commit
      br = branch
      co = checkout
      df = diff
      lg = log -p


  Configuration
  -------------

  git config -e [--global]
    edit the .git/config [or ~/.gitconfig] file in your $EDITOR

  git config --global user.name 'John Doe'
  git config --global user.email johndoe@example.com
    sets your name and email for commit messages

  ...

Albo informacji odnośnie np. rspec’a:

$ cheat rspec

I dostaniemy taki oto cheatsheet:

rspec:
  INSTALL
  =======
    INSTALL rspec
    =============
  $ sudo gem install rspec
    OR
  $ ./script/plugin install git://github.com/dchelimsky/rspec.git

    INSTALL rspec_on_rails plugin
    =============================
  $ ./script/plugin install git://github.com/dchelimsky/rspec-rails.git


  BOOTSTRAP THE APP
  =================
  $ ./script/generate rspec
        create  spec
        create  spec/spec_helper.rb
        create  spec/spec.opts
        create  previous_failures.txt
        create  script/spec_server
        create  script/spec



  HOW TO USE
  ==========

    COMMAND LINE
    =============
  spec --color --format specdoc user.rspec

    RAILS
    =============
  ./script/generate rspec_model User
  rake doc:plugins # generates local docs for your app's plugins
  rake -T spec # lists all rspec rake tasks
  rake spec # run all specs
  rake spec SPEC=spec/models/mymodel_spec.rb SPEC_OPTS="-e \"should do
  something\"" #run a single spec




  module UserSpecHelper
    def valid_user_attributes
      { :email => "joe@bloggs.com",
        :username => "joebloggs",
        :password => "abcdefg"}
    end
  end


  describe "A User (in general)" do
    include UserSpecHelper

    before(:each) do
      @user = User.new
    end

    it "should be invalid without a username" do
      pending "some other thing we depend on"
      @user.attributes = valid_user_attributes.except(:username)
      @user.should_not be_valid
      @user.should have(1).error_on(:username)
      @user.errors.on(:username).should == "is required"
      @user.username = "someusername"
      @user.should be_valid
    end
  end

  SHOULDA COULDA WOULDA
  =====================
  target.should satisfy {|arg| ...}
  target.should_not satisfy {|arg| ...}

  target.should equal <value>
  target.should not_equal <value>

  target.should be_close <value>, <tolerance>
  target.should_not be_close <value>, <tolerance>

  target.should be <value>
  target.should_not be <value>

  target.should predicate [optional args]
  target.should be_predicate [optional args]
  target.should_not predicate [optional args]
  target.should_not be_predicate [optional args]

  target.should be < 6
  target.should == 5
  target.should_not == 'Samantha'

  target.should match <regex>
  target.should_not match <regex>

  target.should be_an_instance_of <class>
  target.should_not be_an_instance_of <class>

  target.should be_a_kind_of <class>
  target.should_not be_a_kind_of <class>

  target.should respond_to <symbol>
  target.should_not respond_to <symbol>

  *OLD:*
  proc.should raise <exception>
  proc.should_not raise <exception>
  proc.should_raise <exception> # not available anymore
  *NEW:*
  lambda {a_call}.should raise_error
  lambda {a_call}.should raise_error(<exception> [, message])
  lambda {a_call}.should_not raise_error
  lambda {a_call}.should_not raise_error(<exception> [, message])

  proc.should throw <symbol>
  proc.should_not throw <symbol>

  target.should include <object>
  target.should_not include <object>

  target.should have(<number>).things
  target.should have_at_least(<number>).things
  target.should have_at_most(<number>).things

  target.should have(<number>).errors_on(:field)

  proc { thing.approve! }.should change(thing, :status).
      from(Status::AWAITING_APPROVAL).
      to(Status::APPROVED)

  proc { thing.destroy }.should change(Thing, :count).by(-1)

  Mocks and Stubs
  ===============

  user_mock = mock "User"
  user_mock.should_receive(:authenticate).with("password").and_return(true)
  user_mock.should_receive(:coffee).exactly(3).times.and_return(:americano)

  user_mock.should_receive(:coffee).exactly(5).times.and_raise(NotEnoughCoffeeExc
  ption)

  people_stub = mock "people"
  people_stub.stub!(:each).and_yield(mock_user)
  people_stub.stub!(:bad_method).and_raise(RuntimeError)

  user_stub = mock_model("User", :id => 23, :username => "pat", :email =>
  "pat@example.com")

Prawda że fajnie jest oszukiwać ! ;)

Lektura obowiązkowa: http://cheat.errtheblog.com/

http://andrzejsliwa.com/2010/01/04/oszukiwanie-jest-fajne/

Autor: Andrzej Sliwa

Programista, pasjonat, scrum master, konsultant IT. Pasjonuje się językami dynamicznymi, metodami wytwarzania oprogramowania oraz metodologiami prowadzenia projektów, szczególnie dbający o jakość wytwarzanych rozwiązań. Obecnie koncentruje się na rozwoju w zakresie wykorzystywania frameworka Ruby on Rails, skalowanych rozwiązań, cloud computingu i języków funkcyjnych.