Notes posted to Ruby

RSS feed
November 20, 2008
0 thanks
November 19, 2008
1 thank

Formatting options

Readable strftime

%a - The abbreviated weekday name (``Sun'')

%A - The full weekday name (``Sunday'')

%b - The abbreviated month name (``Jan'')

%B - The full month name (``January'')

%c - The preferred local date and time representation

%d - Day of the month (01..31)

%H - Hour of the day, 24-hour clock (00..23)

%I - Hour of the day, 12-hour clock (01..12)

%j - Day of the year (001..366)

%m - Month of the year (01..12)

%M - Minute of the hour (00..59)

%p - Meridian indicator (``AM'' or ``PM'')

%S - Second of the minute (00..60)

%U - Week number of the current year, starting with the first Sunday as the first day of the first week (00..53)

%W - Week number of the current year, starting with the first Monday as the first day of the first week (00..53)

%w - Day of the week (Sunday is 0, 0..6)

%x - Preferred representation for the date alone, no time

%X - Preferred representation for the time alone, no date

%y - Year without a century (00..99)

%Y - Year with century

%Z - Time zone name %% - Literal ``%’’ character t = Time.now t.strftime("Printed on %m/%d/%Y") #=> "Printed on 04/09/2003" t.strftime("at %I:%M%p") #=> "at 08:56AM"

November 18, 2008
0 thanks

Pop for last, Shift for first

If you want to pop the first element instead of the last one, use shift .

November 6, 2008 - (v1_8_6_287)
0 thanks

Missing Documentation

Returns false if obj <=> min is less than zero or if anObject <=> max is greater than zero, true otherwise.

   3.between?(1, 5)               #=> true
   6.between?(1, 5)               #=> false
   'cat'.between?('ant', 'dog')   #=> true
   'gnu'.between?('ant', 'dog')   #=> false
November 2, 2008 - (v1_8_6_287)
0 thanks

The reverse operation of split is join.

Given that String#split returns an array, its reverse operation is Array#join. Example:

  "life is awesome".split
  =>["life","is","awesome"]

  ["life","is","awesome"].join(" ")
  =>"life is awesome"
October 23, 2008
0 thanks

Mocking puts from RSpec

If you want to mock calls to puts from RSpec, do it from the class/module you are in: module Foo def self.foo puts "hello" end end describe Foo do it "should write 'hello' when foo() is called" do Foo.should_receive(:puts).with("hello") # Kernel and Object don't work in this case... Foo.foo end end
October 17, 2008
0 thanks

Use encode64!

b64encode will print to the commandline, what a useful feature...

October 9, 2008
2 thanks

Works with URLs too!

You can use it for web urls as well:

  path, file = File.split('/uploads/art/2869-speaking-of-pic.jpg')

  p path # => "/uploads/art"

  p file # => "2869-speaking-of-pic.jpg"

And you can also use join, to merge url back from the components:

  path = File.join(["/uploads/art", "2869-speaking-of-pic.jpg"])

  p path # => "/uploads/art/2869-speaking-of-pic.jpg"

Using #join and #split for operations on files and path parts of the URLs is generally better than simply joining/splitting strings by ’/’ symbol. Mostly because of normalization:

  File.split('//tmp///someimage.jpg') # => ["/tmp", "someimage.jpg"]

  '//tmp///someimage.jpg'.split('/') # => ["", "", "tmp", "", "", "someimage.jpg"]

Same thing happens with join.

October 9, 2008
1 thank

Works for URLs too

You can use it for web urls as well:

  path, file = File.split('/uploads/art/2869-speaking-of-pic.jpg')

  p path # => "/uploads/art"

  p file # => "2869-speaking-of-pic.jpg"

And you can also use join, to merge url back from the components:

  path = File.join(["/uploads/art", "2869-speaking-of-pic.jpg"])

  p path # => "/uploads/art/2869-speaking-of-pic.jpg"

Using #join and #split for operations on files and path parts of the URLs is generally better than simply joining/splitting strings by ’/’ symbol. Mostly because of normalization:

  File.split('//tmp///someimage.jpg') # => ["/tmp", "someimage.jpg"]

  '//tmp///someimage.jpg'.split('/') # => ["", "", "tmp", "", "", "someimage.jpg"]

Same thing happens with join.

October 3, 2008
0 thanks

POST DATA

post data should be separed with ’&’ and not ’;’

your example

    req.set_form_data({'from'=>'2005-01-01', 'to'=>'2005-03-31'}, ';')

should be

    req.set_form_data({'from'=>'2005-01-01', 'to'=>'2005-03-31'}, '&')

isnt it?

September 21, 2008
0 thanks

Better Description

This is really a bitshift left.

September 12, 2008
13 thanks

Readable strftime

%a - The abbreviated weekday name (``Sun'')

%A - The full weekday name (``Sunday'')

%b - The abbreviated month name (``Jan'')

%B - The full month name (``January'')

%c - The preferred local date and time representation

%d - Day of the month (01..31) %H - Hour of the day, 24-hour clock (00..23)

%I - Hour of the day, 12-hour clock (01..12)

%j - Day of the year (001..366)

%m - Month of the year (01..12) %M - Minute of the hour (00..59)

%p - Meridian indicator (``AM'' or ``PM'')

%S - Second of the minute (00..60)

%U - Week number of the current year, starting with the first Sunday as the first day of the first week (00..53)

%W - Week number of the current year, starting with the first Monday as the first day of the first week (00..53)

%w - Day of the week (Sunday is 0, 0..6)

%x - Preferred representation for the date alone, no time

%X - Preferred representation for the time alone, no date

%y - Year without a century (00..99) %Y - Year with century

%Z - Time zone name %% - Literal ``%’’ character t = Time.now t.strftime("Printed on %m/%d/%Y") #=> "Printed on 04/09/2003" t.strftime("at %I:%M%p") #=> "at 08:56AM"

September 10, 2008
0 thanks

Actual superclass

This class's actual superclass is Net::HTTPRequest, for some reason that isn't linked in here.

September 5, 2008
1 thank

Require 'strscan'

To use the StringScanner class,

  require 'strscan'
August 27, 2008 - (v1_8_6_287)
2 thanks

Example of raising a custom exception

Create custom exception

 class PersonalException < Exception end 

Raise the exception

 raise
PersonalException.new, "message" 

August 23, 2008
2 thanks

Needs requiring 'enumerator' to work

This method needs that you

  require 'enumerator'

for this method to be available.

August 23, 2008
0 thanks

Needs requiring 'enumerator' to work

This method needs that you

  require 'enumerator'

for this method to be available.

August 23, 2008
0 thanks

Needs requiring 'enumerator' to work

This method needs that you

  require 'enumerator'

for this method to be available.

August 23, 2008
0 thanks

Needs requiring 'enumerator' to work

This method needs that you

  require 'enumerator'

for this method to be available.

August 23, 2008
0 thanks

Needs requiring 'enumerator' to work

This method needs that you

  require 'enumerator'

for this method to be available.

August 23, 2008
0 thanks

Needs requiring 'enumerator' to work

This method needs that you

  require 'enumerator'

for this method to be available.

August 23, 2008
0 thanks

Needs requiring 'enumerator' to work

This method needs that you

  require 'enumerator'

for this method to be available.

August 23, 2008
0 thanks

Adds new methods to Object and Enumerable

For using this class you need

  require 'enumerator'

Which also adds this methods to Object:

  • to_enum
  • enum_for

And this other methods to Enumerable:

  • each_slice
  • enum_slice
  • each_cons
  • enum_cons
  • enum_with_index
August 23, 2008
0 thanks

Some methods listed for this class need require 'enumerator'

The methods:

need that you put this require in your scripts:

  require 'enumerator'
August 18, 2008
0 thanks

Last element of an array alternative

You can also access the last element of an array with -1

 [ "w", "x", "y", "z" ][-1]  #=> "z"
August 17, 2008
1 thank

Re: Convert an Array of Arrays to a Hash using inject

If you're sure you have a two-level array (no other arrays inside the pairs) and exactly two items in each pair, then it's faster and shorter to use this:

  array = [['A', 'a'], ['B', 'b'], ['C', 'c']]
  hash = Hash[*array.flatten]

For more than two-level deep arrays this will give the wrong result or even an error (for some inputs).

  array = [['A', 'a'], ['B', 'b'], ['C', ['a', 'b', 'c']]]
  hash = Hash[*array.flatten]
  # => {"A"=>"a", "B"=>"b", "C"=>"a", "b"=>"c"}

But if you're running Ruby 1.8.7 or greater you can pass an argument to Array#flatten and have it flatten only one level deep:

  # on Ruby 1.8.7+
  hash = Hash[*array.flatten(1)]
  # => {"A"=>"a", "B"=>"b", "C"=>["a", "b", "c"]}
August 17, 2008
3 thanks

Regexes with groups and split

When you use a Regex with capture groups, all capture groups are included in the results (interleaved with the "real" results) but they do not count for the limit argument.

Examples:

  "abc.,cde.,efg.,ghi".split(/.(,)/)
  => ["abc", ",", "cde", ",", "efg", ",", "ghi"]
  "abc.,cde.,efg.,ghi".split(/(.)(,)/)
  => ["abc", ".", ",", "cde", ".", ",", "efg", ".", ",", "ghi"]
  "abc.,cde.,efg.,ghi".split(/(.(,))/)
  => ["abc", ".,", ",", "cde", ".,", ",", "efg", ".,", ",", "ghi"]
  "abc.,cde.,efg.,ghi".split(/(.(,))/, 2)
  => ["abc", ".,", ",", "cde.,efg.,ghi"]
  "abc.,cde.,efg.,ghi".split(/(.(,))/, 3)
  => ["abc", ".,", ",", "cde", ".,", ",", "efg.,ghi"]
August 15, 2008
4 thanks

Cheking if a number is prime?

It's a class for generating an enumerator for prime numbers and traversing over them.

It's really slow and will be replaced in ruby 1.9 with a faster one.

Note: if you just want to test whether a number is prime or not, you can use this piece of code:

  class Fixnum
    def prime?
      ('1' * self) !~ /^1?$|^(11+?)\1+$/
    end
  end

  10.prime?
August 15, 2008
3 thanks

Optional Argument for detect/find [Not Documented]

detect/find’s optional argument lets you specify a proc or lambda whose return value will be the result in cases where no object in the collection matches the criteria.

  classic_rock_bands = ["AC/DC", "Black Sabbath","Queen", "Ted Nugent and the Amboy Dukes","Scorpions", "Van Halen"]
  default_band = Proc.new {"ABBA"}
  classic_rock_bands.find(default_band) {|band| band > "Van Halen"}
  => "ABBA"

or

  random_band = lambda do
    fallback_bands = ["Britney Spears", "Christina Aguilera", "Ashlee Simpson"]
    fallback_bands[rand(fallback_bands.size)]
  end
  classic_rock_bands.find(random_band) {|band| band > "Van Halen"}
  => "Britney Spears"