AMIR BARYLKO
                    IRON RUBY AND .NET
                      A MATCH MADE IN
                          HEAVEN
                                    CODEMASH
                                     JAN 2011




Amir Barylko - Iron Ruby and .NET               MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
WHO AM I?

   • Architect

   • Developer

   • Mentor

   • Great        cook

   • The      one who’s entertaining you for the next while!



Amir Barylko - Iron Ruby and .NET                          MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
CONTACT AND MATERIALS
   • Contact          me: amir@barylko.com, @abarylko

   • Download: http://www.orthocoders.com/presentations.




Amir Barylko - Iron Ruby and .NET                       MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
RUBY INTRO
                                     Dynamic languages
                                         Testing
                                           IRB
                                        Constructs




Amir Barylko - Iron Ruby and .NET                        MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
DYNAMIC LANGUAGES

          High level
          Dynamically typed
          Runtime over compile time
          Closures
          Reflection
          Platform independent

Amir Barylko - Iron Ruby and .NET      MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
.NET CLR


           Iron Ruby                   DLR           CLR




Amir Barylko - Iron Ruby and .NET              MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
DEVELOPERS TOOLBOX
   • Make        your toolbox grow!

   • The      right tool for the job

   • Not       a replacement

   • Combine             strengths

   • Problem           solving



Amir Barylko - Iron Ruby and .NET      MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
WELCOME TO RUBY

          Created in mid-90s by          Several implementations:
           “Matz” Matsumoto in Japan       MRI, YARB, JRuby
          Smalltalk, Perl influences      Totally free!!
          Dynamic typing
          Object Oriented
          Automatic memory
           management

Amir Barylko - Iron Ruby and .NET                           MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
RUBY FEATURES

          Everything is an expression      Operator overloading,
                                             flexible syntax
          Metaprogramming
                                            Powerful standard library
          Closures
          Garbage collection
          Exceptions



Amir Barylko - Iron Ruby and .NET                         MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
RUBY SUPPORT

          Hundreds of books              Lots of great web sites:
                                           basecamp, twitter, 43
          User conferences all over       things, hulu, scribd,
           the world                       slideshare, Justin.tv
          Active community (you can      Lots of web frameworks
           create a conf in your own       inspired by Ruby on Rails
           city and top Ruby coders
           will go there to teach
           others, invite them and
           see)

Amir Barylko - Iron Ruby and .NET                        MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
SET UP

          Download IronRuby installer
          Put the bin folder on the path
          That’s it!




Amir Barylko - Iron Ruby and .NET            MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
INTERACTIVE
                             IRON RUBY SHELL
      c:> ir.exe

      > puts “hello”                   > x = 1.upto(5).to_a
      hello                            => [1, 2, 3, 4, 5]
      => nil
                                       > x.join
      > "Hello World! " * 2            => "12345"
      => "Hello World! Hello World!"
                                       > (1..10).inject([]) { |a, i| a << i      }
      > ((1 + 5) * 3) ** 2             => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      => 324




Amir Barylko - Iron Ruby and .NET                              MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
BASIC TYPES
        Numbers
          1.class => Fixnum
          1.1.class => Float
          (120**100).class => Bignum
          3.times {puts “he “}




Amir Barylko - Iron Ruby and .NET                 MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
BASIC TYPES II
   • Strings

      'he ' + 'he' => he he
      “That's right” => That's right
      'He said “hi”' => He said “hi”
      “He said “hi”” => He said “hi”
      “1 + 1 is #{1+1}” => 1 + 1 is 2
      "#{'Ho! '*3}Merry Christmas" =>Ho! Ho! Ho! Merry
      Christmas



Amir Barylko - Iron Ruby and .NET                    MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
BASIC TYPES III
      Arrays
       a = [1, 5.5, “nice!”]
       1 == a.first
       1 == a[0]
       nil == a[10]
       a[1] = 3.14
       a.each {|elem| puts elem}
       a.sort



Amir Barylko - Iron Ruby and .NET                     MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
BASIC TYPES IV
   • Hashes
      h = {“one” => 1, 1 => “one”}
      h[“one”] == 1
      h[1] == “one”
      h[“two”] == nil
      h.keys == [“one”, 1] (or is it [1, “one”] ?)
      h.values == [“one”, 1] (or is it [1, “one”] ?)
      h[“one”] = 1.0



Amir Barylko - Iron Ruby and .NET                MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
BASIC TYPES V
       Symbols: constant names. No need to declare, guaranteed
        uniqueness, fast comparison

   :apple == :apple
   :orange != :banana
   [:all, :those, :symbols]
   {:ca => “Canada”, :ar => “Argentina”, :es => “Spain”}




Amir Barylko - Iron Ruby and .NET                      MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
CONTROL STRUCTURES
          if
           if count < 20
             puts “need more”
           elsif count < 40
             puts “perfect”
           else
             puts “too many”
           end
          while
            while count < 100 && need_more
                buy(1)
            end
Amir Barylko - Iron Ruby and .NET            MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
CONTROL STRUCTURES II
        Statement modifiers
         buy while need_more?

         buy(5) if need_more?

         buy until left == 0

         buy unless left < 5




Amir Barylko - Iron Ruby and .NET   MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
CONTROL STRUCTURES III
   • Case
       case left
            when 0..5
              dont_buy_more
            when 6..10
              buy(1)
            when 10..100
              buy(5)
       end

Amir Barylko - Iron Ruby and .NET   MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
METHODS
        Simple
          def play(movie_path)
          ....
          end

        Default arguments
          def play(movie_path, auto_start = true, wrap = false)
          ....
          end




Amir Barylko - Iron Ruby and .NET                     MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
METHODS II
        Return value: the last expression evaluated, no need for
         explicit return
         def votes(voted, num_votes)
           voted && num_votes || nil
         end

        No need for parenthesis on call without arguments (same
         syntax to call a method and a field)
         buy() == buy
         movie.play() == movie.play

Amir Barylko - Iron Ruby and .NET                         MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
METHODS III
       No need also with arguments (but careful!! only if you know
        what you are doing)

         movie.play “Pulp fiction”, false, true




Amir Barylko - Iron Ruby and .NET                       MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
RUBY INTRO II
                                          Classes
                                           Mixin
                                        Enumerable




Amir Barylko - Iron Ruby and .NET                    MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
CLASSES & OBJECTS

       Initializer and instance variables
         class Movie
           def initialize(name)
             @name = name
           end

           def play
             puts %Q{Playing “#{@name}”. Enjoy!}
           end
         end

         m = Movie.new(“Pulp fiction”)
         m.play

         => Playing “Pulp fiction”. Enjoy!


Amir Barylko - Iron Ruby and .NET                  MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
CLASSES & OBJECTS II
        Attributes
     class Movie
       def initialize(name)
         @name = name
       end



                                                           }
         def name                   # attr_reader :name
           @name
         end                                                   # attr_accessor :name

         def name=(value)           # attr_writter :name
           @name = value
         end

     end

     m = Movie.new('Brazil').name = “Pulp fiction”



Amir Barylko - Iron Ruby and .NET                                    MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
CODE ORGANIZATION
        Code in files with .rb extension
        Require 'movie' will read movie.rb file and make its methods
         available to the current file
        Require 'media/movie' will read file from media dir relative
         to the current working dir
            $LOAD_PATH << 'media'
            require 'movie'




Amir Barylko - Iron Ruby and .NET                        MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
CODE ORGANIZATION II
       Relative to this file:
         require File.join(File.dirname(__FILE__), 'media/movie')




Amir Barylko - Iron Ruby and .NET                    MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
MIXINS
        What about module “instance methods”?
        One of the greatest Ruby features!
        You can define functions in Modules, and get them added to
         your classes.
             Great code reuse,
             Multiple inheritance alternative.
             Code organization


Amir Barylko - Iron Ruby and .NET                      MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
ENUMERABLE
        Enumerable mixin, from the standard library documentation:


            The Enumerable mixin provides collection
            classes with several traversal and
            searching methods, and with the ability to
            sort. The class must provide a method each,
            which yields successive members of the
            collection


Amir Barylko - Iron Ruby and .NET                     MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
ENUMERABLE II
       It provides useful methods such as:

             map

             to_a

             take_while

             count

             inject


Amir Barylko - Iron Ruby and .NET              MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
EXAMPLES
                                          rSpec
                                    Enumerable Mixin
                                     missing_method
                                          Sinatra
                                     BDD Cucumber
                                           DSL

Amir Barylko - Iron Ruby and .NET                      MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
RSPEC TESTING LIBRARY
      require File.dirname(__FILE__) + "/../main/MavenThought.MovieLibrary/bin/Debug/MavenThought.MovieLibrary.dll"
      require 'rubygems'
      require 'spec'
      include MavenThought::MovieLibrary

      describe Library do
      	

      it "should be created empty" do
      	

      	

    lib = Library.new
      	

      	

    lib.contents.should be_empty
      	

      end

      	

      it "should add an element" do
      	

      	

    lib = Library.new
      	

      	

    m = Movie.new 'Blazing Saddles'
      	

      	

    lib.add m
      	

      	

    lib.contents.should include(m)
      	

      	

    lib.contents.count.should == 1
      	

      end
      	

      end


Amir Barylko - Iron Ruby and .NET                                                               MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
EXTEND LIBRARY
                 WITH METHOD MISSING
      require File.dirname(__FILE__) + "/../main/MavenThought.MovieLibrary/bin/Debug/MavenThought.MovieLibrary.dll"

      require 'rubygems'

      include MavenThought::MovieLibrary

      # Extend library to use method missing to add find_by
      class Library

      	

        def method_missing(m, *args)
      	

        	

    if m.id2name.include?( "find_by" )
      	

        	

    	

      field = m.id2name.sub /find_by_/, ""
      	

        	

    	

      contents.find_all( lambda{ |m| m.send(field) == args[0] } )
      	

        	

    else
      	

        	

    	

      super
      	

        	

    end
      	

        end
      	

      end


      l = Library.new

      l.add Movie.new('Blazing Saddles', System::DateTime.new(1972, 1, 1))
      l.add Movie.new('Spaceballs', System::DateTime.new(1984, 1, 1))

      puts "Found the movie #{l.find_by_title 'Spaceballs'}"
      puts "Found the movie #{l.find_by_release_date System::DateTime.new(1972, 1, 1)}"



Amir Barylko - Iron Ruby and .NET                                                                                     MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
SIMPLE WEB WITH SINATRA
      require 'rubygems'
      require 'sinatra'
      require 'haml'
      require 'singleton'

      require File.dirname(__FILE__) + "/../main/MavenThought.MovieLibrary/bin/Debug/MavenThought.MovieLibrary.dll"
      include MavenThought::MovieLibrary

      class Library
          include Singleton
      end

      # index
      get '/' do
       @movies = Library.instance.contents
       haml :index
      end

      # create
      post '/' do
       m = Movie.new(params[:title])
       Library.instance.add m
       redirect '/'
      end



Amir Barylko - Iron Ruby and .NET                                                                               MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
BDD WITH CUCUMBER
      Feature: Addition
      	

    In order to make my library grow
      	

    As a registered user
      	

    I want to add movies to the library

      	

      Scenario: Add a movie
      	

      	

 Given I have an empty library
      	

      	

 When I add the following movies:
                              |   title                |   release_date   |
                              |   Blazing Saddles      |   Feb 7, 1974    |
                              |   Young Frankenstein   |   Dec 15, 1974   |
                              |   Spaceballs           |   Jun 24, 1987   |
      	

      	

   Then    The library should have 3 movies
      	

      	

   And     "Blazing Saddles" should be in the list with release date "Feb 7, 1974"
      	

      	

   And     "Young Frankenstein" should be in the list with release date "Dec 15, 1974"
      	

      	

   And     "Spaceballs" should be in the list with release date "Jun 24, 1987"


Amir Barylko - Iron Ruby and .NET                                                   MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
CUCUMBER STEPS
      require File.dirname(__FILE__) + "/../../main/MavenThought.MovieLibrary/bin/Debug/MavenThought.MovieLibrary.dll"

      include MavenThought::MovieLibrary

      Given /^I have an empty library$/ do
       @lib = Library.new
      end

      When /^I add the following movies:$/ do |table|
          table.hashes.each do |row|
            movie = Movie.new row[:title], System::DateTime.parse(row[:release_date])
      	

          @lib.add movie
          end
      end

      Then /^The library should have (.*) movies$/ do |count|
       @lib.contents.count.should == count.to_i
      end

      Then /^"([^"]*)" should be in the list with release date "([^"]*)"$/ do |title, release|
       @lib.contents.find( lambda { |m| m.title == title and m.release_date == System::DateTime.parse(release) } ).should_not be_nil
      end



Amir Barylko - Iron Ruby and .NET                                                                          MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
DSL I
                                    RAKE
   desc "Builds the project"
   task :build do
   	

 call_target msbuild_cmd, :build
   end

   desc "Rebuild the application by cleaning and then building"
   task :rebuild => [:clean, :build]

   desc "Runs all the tests"
   task :test => ["test:all"]


Amir Barylko - Iron Ruby and .NET                                 MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
DSL II
                        CRON - WHENEVER
    every 10.minutes do
       runner "MyModel.some_process"
       rake "my:rake:task"
       command "/usr/bin/my_great_command"
    end


    every 2.days, :at => '4:30am' do
       command "/usr/bin/my_great_command"
    end




Amir Barylko - Iron Ruby and .NET            MavenThought Inc. - Jan 2011
Thursday, January 13, 2011
QUESTIONS?




                               (Don’t be shy)




Thursday, January 13, 2011
CONTACT AND MATERIALS

   •   Contact me: amir@barylko.com, @abarylko

   •   Download: http://www.orthocoders.com/presentations.




Amir Barylko - RoR Training                         MavenThought Inc. - June 2010
Thursday, January 13, 2011
ONLINE RESOURCES
        IronRuby: http://ironruby.net/
        The Ruby Bible (a.k.a. Pickaxe): http://ruby-doc.org/docs/ProgrammingRuby/
        Ruby language site: http://www.ruby-lang.org
        rSpec: http://rspec.info/
        Sinatra: http://www.sinatrarb.com/
        Cucumber: http://cukes.info/
        Rake: http://rake.rubyforge.org/
Amir Barylko - Iron Ruby and .NET                                        MavenThought Inc. - Jan 2011
Thursday, January 13, 2011

Codemash-iron-ruby-match-made-in-heaven

  • 1.
    AMIR BARYLKO IRON RUBY AND .NET A MATCH MADE IN HEAVEN CODEMASH JAN 2011 Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 2.
    WHO AM I? • Architect • Developer • Mentor • Great cook • The one who’s entertaining you for the next while! Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 3.
    CONTACT AND MATERIALS • Contact me: amir@barylko.com, @abarylko • Download: http://www.orthocoders.com/presentations. Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 4.
    RUBY INTRO Dynamic languages Testing IRB Constructs Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 5.
    DYNAMIC LANGUAGES  High level  Dynamically typed  Runtime over compile time  Closures  Reflection  Platform independent Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 6.
    .NET CLR Iron Ruby DLR CLR Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 7.
    DEVELOPERS TOOLBOX • Make your toolbox grow! • The right tool for the job • Not a replacement • Combine strengths • Problem solving Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 8.
    WELCOME TO RUBY  Created in mid-90s by  Several implementations: “Matz” Matsumoto in Japan MRI, YARB, JRuby  Smalltalk, Perl influences  Totally free!!  Dynamic typing  Object Oriented  Automatic memory management Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 9.
    RUBY FEATURES  Everything is an expression  Operator overloading, flexible syntax  Metaprogramming  Powerful standard library  Closures  Garbage collection  Exceptions Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 10.
    RUBY SUPPORT  Hundreds of books  Lots of great web sites: basecamp, twitter, 43  User conferences all over things, hulu, scribd, the world slideshare, Justin.tv  Active community (you can  Lots of web frameworks create a conf in your own inspired by Ruby on Rails city and top Ruby coders will go there to teach others, invite them and see) Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 11.
    SET UP  Download IronRuby installer  Put the bin folder on the path  That’s it! Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 12.
    INTERACTIVE IRON RUBY SHELL c:> ir.exe > puts “hello” > x = 1.upto(5).to_a hello => [1, 2, 3, 4, 5] => nil > x.join > "Hello World! " * 2 => "12345" => "Hello World! Hello World!" > (1..10).inject([]) { |a, i| a << i } > ((1 + 5) * 3) ** 2 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] => 324 Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 13.
    BASIC TYPES  Numbers 1.class => Fixnum 1.1.class => Float (120**100).class => Bignum 3.times {puts “he “} Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 14.
    BASIC TYPES II • Strings 'he ' + 'he' => he he “That's right” => That's right 'He said “hi”' => He said “hi” “He said “hi”” => He said “hi” “1 + 1 is #{1+1}” => 1 + 1 is 2 "#{'Ho! '*3}Merry Christmas" =>Ho! Ho! Ho! Merry Christmas Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 15.
    BASIC TYPES III  Arrays a = [1, 5.5, “nice!”] 1 == a.first 1 == a[0] nil == a[10] a[1] = 3.14 a.each {|elem| puts elem} a.sort Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 16.
    BASIC TYPES IV • Hashes h = {“one” => 1, 1 => “one”} h[“one”] == 1 h[1] == “one” h[“two”] == nil h.keys == [“one”, 1] (or is it [1, “one”] ?) h.values == [“one”, 1] (or is it [1, “one”] ?) h[“one”] = 1.0 Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 17.
    BASIC TYPES V  Symbols: constant names. No need to declare, guaranteed uniqueness, fast comparison :apple == :apple :orange != :banana [:all, :those, :symbols] {:ca => “Canada”, :ar => “Argentina”, :es => “Spain”} Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 18.
    CONTROL STRUCTURES  if if count < 20 puts “need more” elsif count < 40 puts “perfect” else puts “too many” end  while while count < 100 && need_more buy(1) end Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 19.
    CONTROL STRUCTURES II  Statement modifiers buy while need_more? buy(5) if need_more? buy until left == 0 buy unless left < 5 Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 20.
    CONTROL STRUCTURES III • Case case left when 0..5 dont_buy_more when 6..10 buy(1) when 10..100 buy(5) end Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 21.
    METHODS  Simple def play(movie_path) .... end  Default arguments def play(movie_path, auto_start = true, wrap = false) .... end Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 22.
    METHODS II  Return value: the last expression evaluated, no need for explicit return def votes(voted, num_votes) voted && num_votes || nil end  No need for parenthesis on call without arguments (same syntax to call a method and a field) buy() == buy movie.play() == movie.play Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 23.
    METHODS III  No need also with arguments (but careful!! only if you know what you are doing) movie.play “Pulp fiction”, false, true Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 24.
    RUBY INTRO II Classes Mixin Enumerable Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 25.
    CLASSES & OBJECTS  Initializer and instance variables class Movie def initialize(name) @name = name end def play puts %Q{Playing “#{@name}”. Enjoy!} end end m = Movie.new(“Pulp fiction”) m.play => Playing “Pulp fiction”. Enjoy! Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 26.
    CLASSES & OBJECTSII  Attributes class Movie def initialize(name) @name = name end } def name # attr_reader :name @name end # attr_accessor :name def name=(value) # attr_writter :name @name = value end end m = Movie.new('Brazil').name = “Pulp fiction” Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 27.
    CODE ORGANIZATION  Code in files with .rb extension  Require 'movie' will read movie.rb file and make its methods available to the current file  Require 'media/movie' will read file from media dir relative to the current working dir $LOAD_PATH << 'media' require 'movie' Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 28.
    CODE ORGANIZATION II  Relative to this file: require File.join(File.dirname(__FILE__), 'media/movie') Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 29.
    MIXINS  What about module “instance methods”?  One of the greatest Ruby features!  You can define functions in Modules, and get them added to your classes.  Great code reuse,  Multiple inheritance alternative.  Code organization Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 30.
    ENUMERABLE  Enumerable mixin, from the standard library documentation: The Enumerable mixin provides collection classes with several traversal and searching methods, and with the ability to sort. The class must provide a method each, which yields successive members of the collection Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 31.
    ENUMERABLE II  It provides useful methods such as:  map  to_a  take_while  count  inject Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 32.
    EXAMPLES rSpec Enumerable Mixin missing_method Sinatra BDD Cucumber DSL Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 33.
    RSPEC TESTING LIBRARY require File.dirname(__FILE__) + "/../main/MavenThought.MovieLibrary/bin/Debug/MavenThought.MovieLibrary.dll" require 'rubygems' require 'spec' include MavenThought::MovieLibrary describe Library do it "should be created empty" do lib = Library.new lib.contents.should be_empty end it "should add an element" do lib = Library.new m = Movie.new 'Blazing Saddles' lib.add m lib.contents.should include(m) lib.contents.count.should == 1 end end Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 34.
    EXTEND LIBRARY WITH METHOD MISSING require File.dirname(__FILE__) + "/../main/MavenThought.MovieLibrary/bin/Debug/MavenThought.MovieLibrary.dll" require 'rubygems' include MavenThought::MovieLibrary # Extend library to use method missing to add find_by class Library def method_missing(m, *args) if m.id2name.include?( "find_by" ) field = m.id2name.sub /find_by_/, "" contents.find_all( lambda{ |m| m.send(field) == args[0] } ) else super end end end l = Library.new l.add Movie.new('Blazing Saddles', System::DateTime.new(1972, 1, 1)) l.add Movie.new('Spaceballs', System::DateTime.new(1984, 1, 1)) puts "Found the movie #{l.find_by_title 'Spaceballs'}" puts "Found the movie #{l.find_by_release_date System::DateTime.new(1972, 1, 1)}" Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 35.
    SIMPLE WEB WITHSINATRA require 'rubygems' require 'sinatra' require 'haml' require 'singleton' require File.dirname(__FILE__) + "/../main/MavenThought.MovieLibrary/bin/Debug/MavenThought.MovieLibrary.dll" include MavenThought::MovieLibrary class Library include Singleton end # index get '/' do @movies = Library.instance.contents haml :index end # create post '/' do m = Movie.new(params[:title]) Library.instance.add m redirect '/' end Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 36.
    BDD WITH CUCUMBER Feature: Addition In order to make my library grow As a registered user I want to add movies to the library Scenario: Add a movie Given I have an empty library When I add the following movies: | title | release_date | | Blazing Saddles | Feb 7, 1974 | | Young Frankenstein | Dec 15, 1974 | | Spaceballs | Jun 24, 1987 | Then The library should have 3 movies And "Blazing Saddles" should be in the list with release date "Feb 7, 1974" And "Young Frankenstein" should be in the list with release date "Dec 15, 1974" And "Spaceballs" should be in the list with release date "Jun 24, 1987" Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 37.
    CUCUMBER STEPS require File.dirname(__FILE__) + "/../../main/MavenThought.MovieLibrary/bin/Debug/MavenThought.MovieLibrary.dll" include MavenThought::MovieLibrary Given /^I have an empty library$/ do @lib = Library.new end When /^I add the following movies:$/ do |table| table.hashes.each do |row| movie = Movie.new row[:title], System::DateTime.parse(row[:release_date]) @lib.add movie end end Then /^The library should have (.*) movies$/ do |count| @lib.contents.count.should == count.to_i end Then /^"([^"]*)" should be in the list with release date "([^"]*)"$/ do |title, release| @lib.contents.find( lambda { |m| m.title == title and m.release_date == System::DateTime.parse(release) } ).should_not be_nil end Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 38.
    DSL I RAKE desc "Builds the project" task :build do call_target msbuild_cmd, :build end desc "Rebuild the application by cleaning and then building" task :rebuild => [:clean, :build] desc "Runs all the tests" task :test => ["test:all"] Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 39.
    DSL II CRON - WHENEVER every 10.minutes do runner "MyModel.some_process" rake "my:rake:task" command "/usr/bin/my_great_command" end every 2.days, :at => '4:30am' do command "/usr/bin/my_great_command" end Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011
  • 40.
    QUESTIONS? (Don’t be shy) Thursday, January 13, 2011
  • 41.
    CONTACT AND MATERIALS • Contact me: amir@barylko.com, @abarylko • Download: http://www.orthocoders.com/presentations. Amir Barylko - RoR Training MavenThought Inc. - June 2010 Thursday, January 13, 2011
  • 42.
    ONLINE RESOURCES  IronRuby: http://ironruby.net/  The Ruby Bible (a.k.a. Pickaxe): http://ruby-doc.org/docs/ProgrammingRuby/  Ruby language site: http://www.ruby-lang.org  rSpec: http://rspec.info/  Sinatra: http://www.sinatrarb.com/  Cucumber: http://cukes.info/  Rake: http://rake.rubyforge.org/ Amir Barylko - Iron Ruby and .NET MavenThought Inc. - Jan 2011 Thursday, January 13, 2011