SlideShare a Scribd company logo
1 of 121
Portrait of the Artist
as a Young Gem
Author
Matt Yoho
@mattyoho
RUBYGEMS 101
           MATT YOHO
RUBYGEMS 101
           MATT YOHO




              Weā€™re going to
               talk about
RUBYGEMS 101
           MATT YOHO




                       RubyGems
RUBYGEMS 101
           MATT YOHO




            What, why, how
RUBYGEMS 101
           MATT YOHO




                       guidelines
RUBYGEMS 101
           MATT YOHO




                   In the beginning...
RUBYGEMS 101
           MATT YOHO




                   In the beginning...
                         (Roughly
                          1995.)
RUBYGEMS 101
           MATT YOHO




                       ...Matz created Ruby.
RUBYGEMS 101
           MATT YOHO




                       And it was good.
RUBYGEMS 101
           MATT YOHO




                        It was also
                       interpreted.
RUBYGEMS 101
           MATT YOHO




                        No .so,
                       no .class,
                        no .o,
                        no .dll
                         etc...
RUBYGEMS 101
           MATT YOHO




      load './foo/bar/paperclip.rb'

      require './foo/bar/paperclip'
RUBYGEMS 101
           MATT YOHO




            require works based on what is
             available in Rubyā€™s load path


                       $LOAD_PATH or $:
RUBYGEMS 101
           MATT YOHO




 āš” matt $ irb
>> $:
=> ["/Library/Ruby/Gems/1.8/gems/open_gem-1.4.0/bin", "/Library/Ruby/Gems/
1.8/gems/open_gem-1.4.0/lib", "/Library/Ruby/Site/1.8", "/Library/Ruby/Site/1.8/
powerpc-darwin10.0", "/Library/Ruby/Site/1.8/universal-darwin10.0", "/Library/
Ruby/Site", "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/
ruby/vendor_ruby/1.8", "/System/Library/Frameworks/Ruby.framework/Versions/
1.8/usr/lib/ruby/vendor_ruby/1.8/universal-darwin10.0", "/System/Library/
Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/vendor_ruby", "/System/
Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8", "/System/
Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/powerpc-
darwin10.0", "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/
ruby/1.8/universal-darwin10.0", "."]
>>
RUBYGEMS 101
           MATT YOHO




               require will load a path only
                            once
RUBYGEMS 101
           MATT YOHO




                   however...
                   it does not expand
                   paths
RUBYGEMS 101
           MATT YOHO




      require '/matt/foo/bar/ļ¬le'

      require './foo/bar/ļ¬le'
RUBYGEMS 101
           MATT YOHO




                 Code shared at the source
                          level.
RUBYGEMS 101
           MATT YOHO




   Wild
   West
RUBYGEMS 101
           MATT YOHO




                        Package
                       Management
RUBYGEMS 101
           MATT YOHO




                       Along came
                       RubyGems
RUBYGEMS 101
           MATT YOHO




                       Along came
                       RubyGems
                       eventually.
RUBYGEMS 101
           MATT YOHO




                       RubyConf 2003
RUBYGEMS 101
           MATT YOHO




                       Jim Weirich
                       Chad Fowler
                       Rich Kilmer
                       David Black
RUBYGEMS 101
           MATT YOHO




                 Packaging standard

         Library repository/server
RUBYGEMS 101
           MATT YOHO




                       gem server
RUBYGEMS 101
           MATT YOHO




       Eric Hodel
       @drbrain
       Seattle.rb
RUBYGEMS 101
           MATT YOHO




                    RubyGems -
                  How does it work?!
RUBYGEMS 101
           MATT YOHO




            Duck
            Punch
RUBYGEMS 101
           MATT YOHO




                         āš” matt $ irb
                       ruby-1.8.7-p249 > require 'foo'
                       LoadError: no such ļ¬le to load -- foo
                       
     from (irb):1:in `require'
                       
     from (irb):1
RUBYGEMS 101
           MATT YOHO




    āš” matt $ irb -rubygems
  ruby-1.8.7-p249 > require 'foo'
  LoadError: no such ļ¬le to load -- foo
  
     from /Users/matt/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
  
     from /Users/matt/ruby/1.8/rubygems/custom_require.rb:31:in `require'
  
     from (irb):1
RUBYGEMS 101
           MATT YOHO




    āš” matt $ irb
   ruby-1.8.7-p249 > require 'foo'
   LoadError: no such ļ¬le to load -- foo
   
 from (irb):1:in `require'
   
 from (irb):1
RUBYGEMS 101
           MATT YOHO




    āš” matt $ irb
   ruby-1.8.7-p249 > require 'foo'
   LoadError: no such ļ¬le to load -- foo
   
 from (irb):1:in `require'
   
 from (irb):1
RUBYGEMS 101
           MATT YOHO




    āš” matt $ irb -rubygems
   ruby-1.8.7-p249 > require 'foo'
   LoadError: no such ļ¬le to load -- foo
   
 from /Users/matt/ruby/1.8/rubygems/
   custom_require.rb:31:in `gem_original_require'
   
 from /Users/matt/ruby/1.8/rubygems/
   custom_require.rb:31:in `require'
   
 from (irb):1
RUBYGEMS 101
           MATT YOHO




    āš” matt $ irb -rubygems
   ruby-1.8.7-p249 > require 'foo'
   LoadError: no such ļ¬le to load -- foo
   
 from /Users/matt/ruby/1.8/rubygems/
   custom_require.rb:31:in `gem_original_require'
   
 from /Users/matt/ruby/1.8/rubygems/
   custom_require.rb:31:in `require'
   
 from (irb):1
RUBYGEMS 101
           MATT YOHO




    āš” matt $ irb -rubygems
   ruby-1.8.7-p249 > require 'foo'
   LoadError: no such ļ¬le to load -- foo
   
 from /Users/matt/ruby/1.8/rubygems/
   custom_require.rb:31:in `gem_original_require'
   
 from /Users/matt/ruby/1.8/rubygems/
   custom_require.rb:31:in `require'
   
 from (irb):1
RUBYGEMS 101
           MATT YOHO




 āš” matt $ irb
>> $:
=> ["/Library/Ruby/Gems/1.8/gems/open_gem-1.4.0/bin", "/Library/Ruby/Gems/
1.8/gems/open_gem-1.4.0/lib", "/Library/Ruby/Site/1.8", "/Library/Ruby/Site/1.8/
powerpc-darwin10.0", "/Library/Ruby/Site/1.8/universal-darwin10.0", "/Library/
Ruby/Site", "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/
ruby/vendor_ruby/1.8", "/System/Library/Frameworks/Ruby.framework/Versions/
1.8/usr/lib/ruby/vendor_ruby/1.8/universal-darwin10.0", "/System/Library/
Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/vendor_ruby", "/System/
Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8", "/System/
Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/powerpc-
darwin10.0", "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/
ruby/1.8/universal-darwin10.0", "."]
>>
RUBYGEMS 101
           MATT YOHO




 āš” matt $ irb
>> require ā€˜nokogiriā€™
=> true
>> $:
=> ["/Library/Ruby/Gems/1.8/gems/open_gem-1.4.0/bin", "/Library/Ruby/Gems/
1.8/gems/open_gem-1.4.0/lib", "/Library/Ruby/Gems/1.8/gems/nokogiri-1.3.3/
bin", "/Library/Ruby/Gems/1.8/gems/nokogiri-1.3.3/lib", "/Library/Ruby/Gems/
1.8/gems/nokogiri-1.3.3/ext", "/Library/Ruby/Site/1.8", "/Library/Ruby/Site/1.8/
powerpc-darwin10.0", "/Library/Ruby/Site/1.8/universal-darwin10.0", "/Library/
Ruby/Site", "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/
ruby/vendor_ruby/1.8", "/System/Library/Frameworks/Ruby.framework/Versions/
1.8/usr/lib/ruby/vendor_ruby/1.8/universal-darwin10.0", "/System/Library/
Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/vendor_ruby", "/System/
Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8", "/System/
Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/powerpc-
darwin10.0", "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/
ruby/1.8/universal-darwin10.0", "."]
>>
RUBYGEMS 101
           MATT YOHO




 āš” matt $ irb
>> require ā€˜nokogiriā€™
=> true
>> $:
=> ["/Library/Ruby/Gems/1.8/gems/open_gem-1.4.0/bin", "/Library/Ruby/Gems/
1.8/gems/open_gem-1.4.0/lib", "/Library/Ruby/Gems/1.8/gems/nokogiri-1.3.3/
bin", "/Library/Ruby/Gems/1.8/gems/nokogiri-1.3.3/lib", "/Library/Ruby/Gems/
1.8/gems/nokogiri-1.3.3/ext", "/Library/Ruby/Site/1.8", "/Library/Ruby/Site/1.8/
powerpc-darwin10.0", "/Library/Ruby/Site/1.8/universal-darwin10.0", "/Library/
Ruby/Site", "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/
ruby/vendor_ruby/1.8", "/System/Library/Frameworks/Ruby.framework/Versions/
1.8/usr/lib/ruby/vendor_ruby/1.8/universal-darwin10.0", "/System/Library/
Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/vendor_ruby", "/System/
Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8", "/System/
Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/powerpc-
darwin10.0", "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/
ruby/1.8/universal-darwin10.0", "."]
>>
RUBYGEMS 101
           MATT YOHO




                       Gemspec
RUBYGEMS 101
            MATT YOHO



version = File.read(File.expand_path('../../RAILS_VERSION', __FILE__)).strip

Gem::Specification.new do |s|
Ā Ā s.platform    = Gem::Platform::RUBY
Ā Ā s.name        = 'activemodel'
Ā Ā s.version     = version
Ā Ā s.summary     = 'A toolkit for building modeling frameworks.'
Ā Ā s.description = 'A toolkit for building modeling frameworks.'

Ā Ā s.required_ruby_version = '>= 1.8.7'

Ā Ā s.author              =   'David Heinemeier Hansson'
Ā Ā s.email               =   'david@loudthinking.com'
Ā Ā s.homepage            =   'http://www.rubyonrails.org'
Ā Ā s.rubyforge_project   =   'activemodel'

Ā Ā s.files        = Dir['CHANGELOG', 'MIT-LICENSE', 'README.rdoc', 'lib/**/
*']
Ā Ā s.require_path = 'lib'

Ā Ā s.has_rdoc = true

Ā Ā s.add_dependency('activesupport', version)
Ā Ā s.add_dependency('builder',       '~> 2.1.2')
Ā Ā s.add_dependency('i18n',          '~> 0.4.1')
end
RUBYGEMS 101
           MATT YOHO


version = File.read(File.expand_path("../RAILS_VERSION",__FILE__)).strip

Gem::Specification.new do |s|
Ā Ā s.platform    = Gem::Platform::RUBY
Ā Ā s.name        = 'rails'
Ā Ā s.version     = version
Ā Ā s.summary     = 'Full-stack web application framework.'
Ā Ā s.description = 'Ruby on Rails is awesome.'

Ā Ā s.required_ruby_version     = '>= 1.8.7'
Ā Ā s.required_rubygems_version = ">= 1.3.6"

Ā Ā s.author             = 'David Heinemeier Hansson'
Ā Ā s.email              = 'david@loudthinking.com'
Ā Ā s.homepage           = 'http://www.rubyonrails.org'

Ā Ā s.bindir              = 'bin'
Ā Ā s.executables         = ['rails']

Ā Ā s.add_dependency('activesupport',    version)
Ā Ā s.add_dependency('actionpack',       version)
Ā Ā s.add_dependency('activerecord',     version)
Ā Ā s.add_dependency('activeresource',   version)
Ā Ā s.add_dependency('actionmailer',     version)
Ā Ā s.add_dependency('railties',         version)
Ā Ā s.add_dependency('bundler',          '~> 1.0.0')
end
RUBYGEMS 101
           MATT YOHO




 Structure
RUBYGEMS 101
           MATT YOHO
RUBYGEMS 101
           MATT YOHO
RUBYGEMS 101
           MATT YOHO
RUBYGEMS 101
           MATT YOHO
RUBYGEMS 101
            MATT YOHO




#!/usr/local/bin/ruby
#
# This ļ¬le was generated by RubyGems.
#
# The application 'thin' is installed as part of a gem, and
# this ļ¬le is here to facilitate running it.
#

require 'rubygems'

version = ">= 0"

if ARGV.ļ¬rst =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
  version = $1
  ARGV.shift
end

gem 'thin', version
load 'thin'
RUBYGEMS 101
           MATT YOHO




       Rake
RUBYGEMS 101
           MATT YOHO




                       Rake tasks make a
                        gem authorā€™s life
                             easier.
RUBYGEMS 101
           MATT YOHO




namespace :gem do
 desc 'Builds the gem from the gemspec'
 task :build do
  sh 'mkdir -p ./pkg'
  sh 'gem build ./basic_assumption.gemspec'
  sh 'mv ./basic_assumption-*.gem ./pkg/basic_assumption-EDGE.gem'
 end
 desc 'Installs the built gem'
 task :install => :build do
  sh 'gem install ./pkg/basic_assumption-EDGE.gem'
 end
end


task :default => [:spec, :cucumber]
RUBYGEMS 101
           MATT YOHO




 āš” basic_assumption (master)$ rake -T
(in /Users/matt/projects/basic_assumption)
rake bundle:install      # Installs the dependencies listed in Gemļ¬le
rake clobber            # Remove generated code
rake clobber:app          # Remove generated Rails app
rake cucumber             # Run Cucumber features
rake gem:build           # Builds the gem from the gemspec
rake gem:install         # Installs the built gem
rake generate:app          # Generate Rails app for integ tests
rake generate:custom         # Generate scaffolds, etc
rake init            # Set up gem, runs the specs and cukes
rake setup             # Sets up the environment for cukes
rake spec             # Run specs
rake spec_with_rcov        # Run specs with rcov
RUBYGEMS 101
           MATT YOHO




                       Documentation
RUBYGEMS 101
           MATT YOHO




RDoc
RUBYGEMS 101
           MATT YOHO




        ā€œUse the Source.ā€
RUBYGEMS 101
           MATT YOHO




RDoc
RUBYGEMS 101
           MATT YOHO




                       gem server
RUBYGEMS 101
           MATT YOHO
RUBYGEMS 101
           MATT YOHO




YARD
RUBYGEMS 101
           MATT YOHO




Rocco
RUBYGEMS 101
           MATT YOHO




                       man
RUBYGEMS 101
           MATT YOHO




        ā€¢NAME
        ā€¢SYNOPSIS
        ā€¢DESCRIPTION
        ā€¢OPTIONS
        ā€¢FILES
        ā€¢ENVIRONMENT
        ā€¢DIAGNOSTICS
        ā€¢BUGS
        ā€¢AUTHOR
        ā€¢SEE ALSO
RUBYGEMS 101
           MATT YOHO
RUBYGEMS 101
           MATT YOHO
RUBYGEMS 101
           MATT YOHO
RUBYGEMS 101
           MATT YOHO




                       README Driven
                        Development
RUBYGEMS 101
           MATT YOHO




                       Licensing
RUBYGEMS 101
           MATT YOHO




                       Do it right away.
RUBYGEMS 101
           MATT YOHO




                       MIT, BSD, Ruby
RUBYGEMS 101
           MATT YOHO




Permissive Licenses
         Copyright (c) 2004-2010 David Heinemeier Hansson

         Permission is hereby granted, free of charge, to any person obtaining
         a copy of this software and associated documentation files (the
         "Software"), to deal in the Software without restriction, including
         without limitation the rights to use, copy, modify, merge, publish,
         distribute, sublicense, and/or sell copies of the Software, and to
         permit persons to whom the Software is furnished to do so, subject to
         the following conditions:

         The above copyright notice and this permission notice shall be
         included in all copies or substantial portions of the Software.

         THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
         LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
         OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
         WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
RUBYGEMS 101
           MATT YOHO




             The DWTFYWTPL

       DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
       Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Version 2, December 2004

       Ā Everyone is permitted to copy and distribute verbatim or modified
       Ā copies of this license document, and changing it is allowed as long
       Ā as the name is changed.

       Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
       Ā Ā Ā TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

       Ā Ā 0. You just DO WHAT THE FUCK YOU WANT TO.
RUBYGEMS 101
           MATT YOHO




Matz and OSS


       ā€œThere are various merits,
        but for me the biggest is
       freedom. I prefer the term
        'free software' more than
                 open source.ā€

                       - Japan, Inc., August 2000
RUBYGEMS 101
           MATT YOHO




       Good
RUBYGEMS 101
           MATT YOHO
RUBYGEMS 101
           MATT YOHO




            RVM
RUBYGEMS 101
           MATT YOHO




            rvm gemset use
RUBYGEMS 101
           MATT YOHO




                       Donā€™t require
                        RubyGems
RUBYGEMS 101
           MATT YOHO
RUBYGEMS 101
           MATT YOHO




               export RUBYOPT=rubygems
RUBYGEMS 101
           MATT YOHO
RUBYGEMS 101
           MATT YOHO




                 Manually manage the load
                           path
RUBYGEMS 101
           MATT YOHO




lib = File.expand_path('../lib/', __FILE__)
$:.unshift lib unless $:.include?(lib)

require 'basic_assumption/version'

Gem::Specification.new do |s|
Ā Ā s.name = %q{basic_assumption}
Ā Ā s.version = BasicAssumption::Version::STRING
end
RUBYGEMS 101
           MATT YOHO




                       Use rake.vim
RUBYGEMS 101
           MATT YOHO




                       Donā€™t use Jeweler
RUBYGEMS 101
           MATT YOHO




                       Prefer static gemspecs
RUBYGEMS 101
           MATT YOHO




                       Use semantic
                        versioning
RUBYGEMS 101
           MATT YOHO




                       http://semver.org/
RUBYGEMS 101
           MATT YOHO




      X.Y.Z
      X.Y.Zpre


      Major.Minor.Patch
RUBYGEMS 101
           MATT YOHO
RUBYGEMS 101
           MATT YOHO




                       Write good specs.
RUBYGEMS 101
           MATT YOHO
RUBYGEMS 101
           MATT YOHO




                       Integration test
RUBYGEMS 101
           MATT YOHO




                 Specs go a long way, but...
RUBYGEMS 101
           MATT YOHO




                 Specs go a long way, but...


                       Rails dependencies, etc.
RUBYGEMS 101
           MATT YOHO




                       Yuck.
RUBYGEMS 101
           MATT YOHO




      Cucumber
RUBYGEMS 101
           MATT YOHO




                       Aruba
RUBYGEMS 101
           MATT YOHO




                         cucumber features
                       for command line apps
RUBYGEMS 101
           MATT YOHO
CUCARUBA! MATT YOHO




               YO DAWG! I heard you like writing
            features while you write features so we
                   put cukes in your cukes!
RUBYGEMS 101
           MATT YOHO




        ~/projects/lib/tmp/aruba
RUBYGEMS 101
           MATT YOHO




        ~/projects/lib/tmp/aruba


                              ./tmp/aruba
                       rake
                       task
RUBYGEMS 101
           MATT YOHO




        ~/projects/lib/tmp/aruba


                 templates          ./tmp/aruba
                             rake
                             task
RUBYGEMS 101
           MATT YOHO



Feature: Rails Controllers Can Make Assumptions

 Scenario: controller invokes assume
  Given a ļ¬le named "app/controllers/widgets_controller.rb" with:
   """
   class WidgetsController < ApplicationController
     assume(:widget) { Widget.ļ¬nd(params[:id]) }
   end
   """
  And a ļ¬le named "app/views/widgets/show.html.erb" with:
   """
   <blink><%= widget.name %></blink>
   """
  And a ļ¬le named "features/widget_is_viewed_by_visitor.feature" with:
   """
   Feature: Widget is viewed by visitor
     Scenario: success
       Given a widget named "foobar"
       When I view the widget
       Then I should see "foobar"
   """
  When I run "cucumber features/widget_is_viewed_by_visitor.feature"
  Then I should see:
   """
   1 scenario (1 passed)
   3 steps
   """
RUBYGEMS 101
           MATT YOHO




Feature: Foo Does Something
 Scenario: foo works
  Given a ļ¬le named "foo.feature" with:
    """
    Feature: Widget is viewed by visitor
      Scenario: success
        Given a foo named "bar"
        When I view the foo
        Then I should see "bar"
    """
  When I run "cucumber foo.feature"
  Then I should see:
    """
    1 scenario (1 passed)
    1 step
    """
RUBYGEMS 101
           MATT YOHO




           A little slow, but totally badass.
RUBYGEMS 101
           MATT YOHO
RUBYGEMS 101
           MATT YOHO




  http://github.com/aslakhellesoy/aruba

          http://github.com/rspec/rspec-
                        rails

             http://github.com/mattyoho/
                   basic_assumption
RUBYGEMS 101
           MATT YOHO




                        RVM and Bundler
                       are complimentary
RUBYGEMS 101
           MATT YOHO




                Provide contribution
                     guidelines
RUBYGEMS 101
           MATT YOHO




                       Unicorn
RUBYGEMS 101
           MATT YOHO




                        Get
                       Forked
RUBYGEMS 101
           MATT YOHO




    i <3 GitHub
RUBYGEMS 101
           MATT YOHO




                       Git commit
                        etiquette
RUBYGEMS 101
           MATT YOHO




                       Publish!
RUBYGEMS 101
           MATT YOHO
RUBYGEMS 101
           MATT YOHO




RubyGems.org



           gem build
           gem push
RUBYGEMS 101
           MATT YOHO




                       Learn by example
RUBYGEMS 101
           MATT YOHO




                          RSpec2, Nokogiri,
                       Paperclip, anything by
                        Ryan Tomayko, Tom
                       Preston-Warner, or any
                           other GitHubber
Thank you
Matt Yoho
matt@edgecase.com
@mattyoho

More Related Content

Viewers also liked

Shane test 1
Shane test 1Shane test 1
Shane test 1Adam
Ā 
Chapter 1
Chapter 1Chapter 1
Chapter 1elya09
Ā 
Hy solutionģ‚¬ė”€(5)ģ €ģ¶•ė³“ķ—˜ź°€ģž…ź³ ź°
Hy solutionģ‚¬ė”€(5)ģ €ģ¶•ė³“ķ—˜ź°€ģž…ź³ ź°Hy solutionģ‚¬ė”€(5)ģ €ģ¶•ė³“ķ—˜ź°€ģž…ź³ ź°
Hy solutionģ‚¬ė”€(5)ģ €ģ¶•ė³“ķ—˜ź°€ģž…ź³ ź°valuasset
Ā 
Hy solutionģ‚¬ė”€(4)ģ¹œė””ģ•„ė³€ģ•”ź°€ģž…ź³ ź°
Hy solutionģ‚¬ė”€(4)ģ¹œė””ģ•„ė³€ģ•”ź°€ģž…ź³ ź°Hy solutionģ‚¬ė”€(4)ģ¹œė””ģ•„ė³€ģ•”ź°€ģž…ź³ ź°
Hy solutionģ‚¬ė”€(4)ģ¹œė””ģ•„ė³€ģ•”ź°€ģž…ź³ ź°valuasset
Ā 
Andrea caicedo chica
Andrea caicedo chicaAndrea caicedo chica
Andrea caicedo chicarisu1992
Ā 
Integrated it portfolio management using epm live's it engine app
Integrated it portfolio management using epm live's it engine appIntegrated it portfolio management using epm live's it engine app
Integrated it portfolio management using epm live's it engine appEPM Live
Ā 
Hy solutionģ‚¬ė”€(3)źøˆģœµģƒķ’ˆė¶„ģ„elsģ›źøˆė³“ģž„ķ˜•
Hy solutionģ‚¬ė”€(3)źøˆģœµģƒķ’ˆė¶„ģ„elsģ›źøˆė³“ģž„ķ˜•Hy solutionģ‚¬ė”€(3)źøˆģœµģƒķ’ˆė¶„ģ„elsģ›źøˆė³“ģž„ķ˜•
Hy solutionģ‚¬ė”€(3)źøˆģœµģƒķ’ˆė¶„ģ„elsģ›źøˆė³“ģž„ķ˜•valuasset
Ā 
ꐜē“¢å¼•ę“ŽåŽŸē†ē•„览
ꐜē“¢å¼•ę“ŽåŽŸē†ē•„览ꐜē“¢å¼•ę“ŽåŽŸē†ē•„览
ꐜē“¢å¼•ę“ŽåŽŸē†ē•„览pluschen
Ā 
Power of one
Power of onePower of one
Power of oneMukesh151288
Ā 
Hy solutionģ‚¬ė”€(3)źøˆģœµģƒķ’ˆė¶„ģ„elsģ›źøˆė³“ģž„ķ˜•
Hy solutionģ‚¬ė”€(3)źøˆģœµģƒķ’ˆė¶„ģ„elsģ›źøˆė³“ģž„ķ˜•Hy solutionģ‚¬ė”€(3)źøˆģœµģƒķ’ˆė¶„ģ„elsģ›źøˆė³“ģž„ķ˜•
Hy solutionģ‚¬ė”€(3)źøˆģœµģƒķ’ˆė¶„ģ„elsģ›źøˆė³“ģž„ķ˜•valuasset
Ā 
Hy solution ķŽ€ė“œė³€ź²½ģ„¤ėŖ…
Hy solution ķŽ€ė“œė³€ź²½ģ„¤ėŖ…Hy solution ķŽ€ė“œė³€ź²½ģ„¤ėŖ…
Hy solution ķŽ€ė“œė³€ź²½ģ„¤ėŖ…valuasset
Ā 
Managing the Multigenerational Library
Managing the Multigenerational LibraryManaging the Multigenerational Library
Managing the Multigenerational LibraryColleen Harris
Ā 

Viewers also liked (19)

Ow2 contest - fossa2010
Ow2 contest - fossa2010Ow2 contest - fossa2010
Ow2 contest - fossa2010
Ā 
Shane test 1
Shane test 1Shane test 1
Shane test 1
Ā 
2012- comete is shining more and more
2012- comete is shining more and more2012- comete is shining more and more
2012- comete is shining more and more
Ā 
Chapter 1
Chapter 1Chapter 1
Chapter 1
Ā 
Hy solutionģ‚¬ė”€(5)ģ €ģ¶•ė³“ķ—˜ź°€ģž…ź³ ź°
Hy solutionģ‚¬ė”€(5)ģ €ģ¶•ė³“ķ—˜ź°€ģž…ź³ ź°Hy solutionģ‚¬ė”€(5)ģ €ģ¶•ė³“ķ—˜ź°€ģž…ź³ ź°
Hy solutionģ‚¬ė”€(5)ģ €ģ¶•ė³“ķ—˜ź°€ģž…ź³ ź°
Ā 
French summer of code contest - libre summer of code - fossa2011
French summer of code contest -  libre summer of code - fossa2011French summer of code contest -  libre summer of code - fossa2011
French summer of code contest - libre summer of code - fossa2011
Ā 
Hy solutionģ‚¬ė”€(4)ģ¹œė””ģ•„ė³€ģ•”ź°€ģž…ź³ ź°
Hy solutionģ‚¬ė”€(4)ģ¹œė””ģ•„ė³€ģ•”ź°€ģž…ź³ ź°Hy solutionģ‚¬ė”€(4)ģ¹œė””ģ•„ė³€ģ•”ź°€ģž…ź³ ź°
Hy solutionģ‚¬ė”€(4)ģ¹œė””ģ•„ė³€ģ•”ź°€ģž…ź³ ź°
Ā 
Laporan Tahunan AJI 2008
Laporan Tahunan AJI 2008Laporan Tahunan AJI 2008
Laporan Tahunan AJI 2008
Ā 
Oss for undergraduate - fossa2010
Oss for undergraduate - fossa2010Oss for undergraduate - fossa2010
Oss for undergraduate - fossa2010
Ā 
Andrea caicedo chica
Andrea caicedo chicaAndrea caicedo chica
Andrea caicedo chica
Ā 
Integrated it portfolio management using epm live's it engine app
Integrated it portfolio management using epm live's it engine appIntegrated it portfolio management using epm live's it engine app
Integrated it portfolio management using epm live's it engine app
Ā 
Hy solutionģ‚¬ė”€(3)źøˆģœµģƒķ’ˆė¶„ģ„elsģ›źøˆė³“ģž„ķ˜•
Hy solutionģ‚¬ė”€(3)źøˆģœµģƒķ’ˆė¶„ģ„elsģ›źøˆė³“ģž„ķ˜•Hy solutionģ‚¬ė”€(3)źøˆģœµģƒķ’ˆė¶„ģ„elsģ›źøˆė³“ģž„ķ˜•
Hy solutionģ‚¬ė”€(3)źøˆģœµģƒķ’ˆė¶„ģ„elsģ›źøˆė³“ģž„ķ˜•
Ā 
ꐜē“¢å¼•ę“ŽåŽŸē†ē•„览
ꐜē“¢å¼•ę“ŽåŽŸē†ē•„览ꐜē“¢å¼•ę“ŽåŽŸē†ē•„览
ꐜē“¢å¼•ę“ŽåŽŸē†ē•„览
Ā 
Buku Panduan : Media dan Reformasi Sektor Keamanan
Buku Panduan : Media dan Reformasi Sektor KeamananBuku Panduan : Media dan Reformasi Sektor Keamanan
Buku Panduan : Media dan Reformasi Sektor Keamanan
Ā 
Power of one
Power of onePower of one
Power of one
Ā 
Hy solutionģ‚¬ė”€(3)źøˆģœµģƒķ’ˆė¶„ģ„elsģ›źøˆė³“ģž„ķ˜•
Hy solutionģ‚¬ė”€(3)źøˆģœµģƒķ’ˆė¶„ģ„elsģ›źøˆė³“ģž„ķ˜•Hy solutionģ‚¬ė”€(3)źøˆģœµģƒķ’ˆė¶„ģ„elsģ›źøˆė³“ģž„ķ˜•
Hy solutionģ‚¬ė”€(3)źøˆģœµģƒķ’ˆė¶„ģ„elsģ›źøˆė³“ģž„ķ˜•
Ā 
Hy solution ķŽ€ė“œė³€ź²½ģ„¤ėŖ…
Hy solution ķŽ€ė“œė³€ź²½ģ„¤ėŖ…Hy solution ķŽ€ė“œė³€ź²½ģ„¤ėŖ…
Hy solution ķŽ€ė“œė³€ź²½ģ„¤ėŖ…
Ā 
Laporan Tahunan AJI 2010 - Ancaman Itu Datang dari Dalam
Laporan Tahunan AJI 2010 - Ancaman Itu Datang dari DalamLaporan Tahunan AJI 2010 - Ancaman Itu Datang dari Dalam
Laporan Tahunan AJI 2010 - Ancaman Itu Datang dari Dalam
Ā 
Managing the Multigenerational Library
Managing the Multigenerational LibraryManaging the Multigenerational Library
Managing the Multigenerational Library
Ā 

Recently uploaded

Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
Ā 
Mcleodganj Call Girls šŸ„° 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls šŸ„° 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls šŸ„° 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls šŸ„° 8617370543 Service Offer VIP Hot ModelDeepika Singh
Ā 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamUiPathCommunity
Ā 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontologyjohnbeverley2021
Ā 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
Ā 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
Ā 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vƔzquez
Ā 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
Ā 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Victor Rentea
Ā 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Victor Rentea
Ā 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
Ā 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Angeliki Cooney
Ā 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
Ā 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2
Ā 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistandanishmna97
Ā 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
Ā 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
Ā 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
Ā 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Christopher Logan Kennedy
Ā 

Recently uploaded (20)

Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
Ā 
Mcleodganj Call Girls šŸ„° 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls šŸ„° 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls šŸ„° 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls šŸ„° 8617370543 Service Offer VIP Hot Model
Ā 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
Ā 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
Ā 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
Ā 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Ā 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
Ā 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Ā 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Ā 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Ā 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Ā 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
Ā 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Ā 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Ā 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
Ā 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
Ā 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
Ā 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
Ā 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Ā 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
Ā 

A Portrait of the Artist as a Young Gem Author

  • 1. Portrait of the Artist as a Young Gem Author Matt Yoho @mattyoho
  • 2. RUBYGEMS 101 MATT YOHO
  • 3. RUBYGEMS 101 MATT YOHO Weā€™re going to talk about
  • 4. RUBYGEMS 101 MATT YOHO RubyGems
  • 5. RUBYGEMS 101 MATT YOHO What, why, how
  • 6. RUBYGEMS 101 MATT YOHO guidelines
  • 7. RUBYGEMS 101 MATT YOHO In the beginning...
  • 8. RUBYGEMS 101 MATT YOHO In the beginning... (Roughly 1995.)
  • 9. RUBYGEMS 101 MATT YOHO ...Matz created Ruby.
  • 10. RUBYGEMS 101 MATT YOHO And it was good.
  • 11. RUBYGEMS 101 MATT YOHO It was also interpreted.
  • 12. RUBYGEMS 101 MATT YOHO No .so, no .class, no .o, no .dll etc...
  • 13. RUBYGEMS 101 MATT YOHO load './foo/bar/paperclip.rb' require './foo/bar/paperclip'
  • 14. RUBYGEMS 101 MATT YOHO require works based on what is available in Rubyā€™s load path $LOAD_PATH or $:
  • 15. RUBYGEMS 101 MATT YOHO āš” matt $ irb >> $: => ["/Library/Ruby/Gems/1.8/gems/open_gem-1.4.0/bin", "/Library/Ruby/Gems/ 1.8/gems/open_gem-1.4.0/lib", "/Library/Ruby/Site/1.8", "/Library/Ruby/Site/1.8/ powerpc-darwin10.0", "/Library/Ruby/Site/1.8/universal-darwin10.0", "/Library/ Ruby/Site", "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ ruby/vendor_ruby/1.8", "/System/Library/Frameworks/Ruby.framework/Versions/ 1.8/usr/lib/ruby/vendor_ruby/1.8/universal-darwin10.0", "/System/Library/ Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/vendor_ruby", "/System/ Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8", "/System/ Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/powerpc- darwin10.0", "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ ruby/1.8/universal-darwin10.0", "."] >>
  • 16. RUBYGEMS 101 MATT YOHO require will load a path only once
  • 17. RUBYGEMS 101 MATT YOHO however... it does not expand paths
  • 18. RUBYGEMS 101 MATT YOHO require '/matt/foo/bar/ļ¬le' require './foo/bar/ļ¬le'
  • 19. RUBYGEMS 101 MATT YOHO Code shared at the source level.
  • 20. RUBYGEMS 101 MATT YOHO Wild West
  • 21. RUBYGEMS 101 MATT YOHO Package Management
  • 22. RUBYGEMS 101 MATT YOHO Along came RubyGems
  • 23. RUBYGEMS 101 MATT YOHO Along came RubyGems eventually.
  • 24. RUBYGEMS 101 MATT YOHO RubyConf 2003
  • 25. RUBYGEMS 101 MATT YOHO Jim Weirich Chad Fowler Rich Kilmer David Black
  • 26. RUBYGEMS 101 MATT YOHO Packaging standard Library repository/server
  • 27. RUBYGEMS 101 MATT YOHO gem server
  • 28. RUBYGEMS 101 MATT YOHO Eric Hodel @drbrain Seattle.rb
  • 29. RUBYGEMS 101 MATT YOHO RubyGems - How does it work?!
  • 30. RUBYGEMS 101 MATT YOHO Duck Punch
  • 31. RUBYGEMS 101 MATT YOHO āš” matt $ irb ruby-1.8.7-p249 > require 'foo' LoadError: no such ļ¬le to load -- foo from (irb):1:in `require' from (irb):1
  • 32. RUBYGEMS 101 MATT YOHO āš” matt $ irb -rubygems ruby-1.8.7-p249 > require 'foo' LoadError: no such ļ¬le to load -- foo from /Users/matt/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' from /Users/matt/ruby/1.8/rubygems/custom_require.rb:31:in `require' from (irb):1
  • 33. RUBYGEMS 101 MATT YOHO āš” matt $ irb ruby-1.8.7-p249 > require 'foo' LoadError: no such ļ¬le to load -- foo from (irb):1:in `require' from (irb):1
  • 34. RUBYGEMS 101 MATT YOHO āš” matt $ irb ruby-1.8.7-p249 > require 'foo' LoadError: no such ļ¬le to load -- foo from (irb):1:in `require' from (irb):1
  • 35. RUBYGEMS 101 MATT YOHO āš” matt $ irb -rubygems ruby-1.8.7-p249 > require 'foo' LoadError: no such ļ¬le to load -- foo from /Users/matt/ruby/1.8/rubygems/ custom_require.rb:31:in `gem_original_require' from /Users/matt/ruby/1.8/rubygems/ custom_require.rb:31:in `require' from (irb):1
  • 36. RUBYGEMS 101 MATT YOHO āš” matt $ irb -rubygems ruby-1.8.7-p249 > require 'foo' LoadError: no such ļ¬le to load -- foo from /Users/matt/ruby/1.8/rubygems/ custom_require.rb:31:in `gem_original_require' from /Users/matt/ruby/1.8/rubygems/ custom_require.rb:31:in `require' from (irb):1
  • 37. RUBYGEMS 101 MATT YOHO āš” matt $ irb -rubygems ruby-1.8.7-p249 > require 'foo' LoadError: no such ļ¬le to load -- foo from /Users/matt/ruby/1.8/rubygems/ custom_require.rb:31:in `gem_original_require' from /Users/matt/ruby/1.8/rubygems/ custom_require.rb:31:in `require' from (irb):1
  • 38. RUBYGEMS 101 MATT YOHO āš” matt $ irb >> $: => ["/Library/Ruby/Gems/1.8/gems/open_gem-1.4.0/bin", "/Library/Ruby/Gems/ 1.8/gems/open_gem-1.4.0/lib", "/Library/Ruby/Site/1.8", "/Library/Ruby/Site/1.8/ powerpc-darwin10.0", "/Library/Ruby/Site/1.8/universal-darwin10.0", "/Library/ Ruby/Site", "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ ruby/vendor_ruby/1.8", "/System/Library/Frameworks/Ruby.framework/Versions/ 1.8/usr/lib/ruby/vendor_ruby/1.8/universal-darwin10.0", "/System/Library/ Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/vendor_ruby", "/System/ Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8", "/System/ Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/powerpc- darwin10.0", "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ ruby/1.8/universal-darwin10.0", "."] >>
  • 39. RUBYGEMS 101 MATT YOHO āš” matt $ irb >> require ā€˜nokogiriā€™ => true >> $: => ["/Library/Ruby/Gems/1.8/gems/open_gem-1.4.0/bin", "/Library/Ruby/Gems/ 1.8/gems/open_gem-1.4.0/lib", "/Library/Ruby/Gems/1.8/gems/nokogiri-1.3.3/ bin", "/Library/Ruby/Gems/1.8/gems/nokogiri-1.3.3/lib", "/Library/Ruby/Gems/ 1.8/gems/nokogiri-1.3.3/ext", "/Library/Ruby/Site/1.8", "/Library/Ruby/Site/1.8/ powerpc-darwin10.0", "/Library/Ruby/Site/1.8/universal-darwin10.0", "/Library/ Ruby/Site", "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ ruby/vendor_ruby/1.8", "/System/Library/Frameworks/Ruby.framework/Versions/ 1.8/usr/lib/ruby/vendor_ruby/1.8/universal-darwin10.0", "/System/Library/ Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/vendor_ruby", "/System/ Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8", "/System/ Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/powerpc- darwin10.0", "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ ruby/1.8/universal-darwin10.0", "."] >>
  • 40. RUBYGEMS 101 MATT YOHO āš” matt $ irb >> require ā€˜nokogiriā€™ => true >> $: => ["/Library/Ruby/Gems/1.8/gems/open_gem-1.4.0/bin", "/Library/Ruby/Gems/ 1.8/gems/open_gem-1.4.0/lib", "/Library/Ruby/Gems/1.8/gems/nokogiri-1.3.3/ bin", "/Library/Ruby/Gems/1.8/gems/nokogiri-1.3.3/lib", "/Library/Ruby/Gems/ 1.8/gems/nokogiri-1.3.3/ext", "/Library/Ruby/Site/1.8", "/Library/Ruby/Site/1.8/ powerpc-darwin10.0", "/Library/Ruby/Site/1.8/universal-darwin10.0", "/Library/ Ruby/Site", "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ ruby/vendor_ruby/1.8", "/System/Library/Frameworks/Ruby.framework/Versions/ 1.8/usr/lib/ruby/vendor_ruby/1.8/universal-darwin10.0", "/System/Library/ Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/vendor_ruby", "/System/ Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8", "/System/ Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/powerpc- darwin10.0", "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ ruby/1.8/universal-darwin10.0", "."] >>
  • 41. RUBYGEMS 101 MATT YOHO Gemspec
  • 42. RUBYGEMS 101 MATT YOHO version = File.read(File.expand_path('../../RAILS_VERSION', __FILE__)).strip Gem::Specification.new do |s| Ā Ā s.platform = Gem::Platform::RUBY Ā Ā s.name = 'activemodel' Ā Ā s.version = version Ā Ā s.summary = 'A toolkit for building modeling frameworks.' Ā Ā s.description = 'A toolkit for building modeling frameworks.' Ā Ā s.required_ruby_version = '>= 1.8.7' Ā Ā s.author = 'David Heinemeier Hansson' Ā Ā s.email = 'david@loudthinking.com' Ā Ā s.homepage = 'http://www.rubyonrails.org' Ā Ā s.rubyforge_project = 'activemodel' Ā Ā s.files = Dir['CHANGELOG', 'MIT-LICENSE', 'README.rdoc', 'lib/**/ *'] Ā Ā s.require_path = 'lib' Ā Ā s.has_rdoc = true Ā Ā s.add_dependency('activesupport', version) Ā Ā s.add_dependency('builder', '~> 2.1.2') Ā Ā s.add_dependency('i18n', '~> 0.4.1') end
  • 43. RUBYGEMS 101 MATT YOHO version = File.read(File.expand_path("../RAILS_VERSION",__FILE__)).strip Gem::Specification.new do |s| Ā Ā s.platform = Gem::Platform::RUBY Ā Ā s.name = 'rails' Ā Ā s.version = version Ā Ā s.summary = 'Full-stack web application framework.' Ā Ā s.description = 'Ruby on Rails is awesome.' Ā Ā s.required_ruby_version = '>= 1.8.7' Ā Ā s.required_rubygems_version = ">= 1.3.6" Ā Ā s.author = 'David Heinemeier Hansson' Ā Ā s.email = 'david@loudthinking.com' Ā Ā s.homepage = 'http://www.rubyonrails.org' Ā Ā s.bindir = 'bin' Ā Ā s.executables = ['rails'] Ā Ā s.add_dependency('activesupport', version) Ā Ā s.add_dependency('actionpack', version) Ā Ā s.add_dependency('activerecord', version) Ā Ā s.add_dependency('activeresource', version) Ā Ā s.add_dependency('actionmailer', version) Ā Ā s.add_dependency('railties', version) Ā Ā s.add_dependency('bundler', '~> 1.0.0') end
  • 44. RUBYGEMS 101 MATT YOHO Structure
  • 45. RUBYGEMS 101 MATT YOHO
  • 46. RUBYGEMS 101 MATT YOHO
  • 47. RUBYGEMS 101 MATT YOHO
  • 48. RUBYGEMS 101 MATT YOHO
  • 49. RUBYGEMS 101 MATT YOHO #!/usr/local/bin/ruby # # This ļ¬le was generated by RubyGems. # # The application 'thin' is installed as part of a gem, and # this ļ¬le is here to facilitate running it. # require 'rubygems' version = ">= 0" if ARGV.ļ¬rst =~ /^_(.*)_$/ and Gem::Version.correct? $1 then version = $1 ARGV.shift end gem 'thin', version load 'thin'
  • 50. RUBYGEMS 101 MATT YOHO Rake
  • 51. RUBYGEMS 101 MATT YOHO Rake tasks make a gem authorā€™s life easier.
  • 52. RUBYGEMS 101 MATT YOHO namespace :gem do desc 'Builds the gem from the gemspec' task :build do sh 'mkdir -p ./pkg' sh 'gem build ./basic_assumption.gemspec' sh 'mv ./basic_assumption-*.gem ./pkg/basic_assumption-EDGE.gem' end desc 'Installs the built gem' task :install => :build do sh 'gem install ./pkg/basic_assumption-EDGE.gem' end end task :default => [:spec, :cucumber]
  • 53. RUBYGEMS 101 MATT YOHO āš” basic_assumption (master)$ rake -T (in /Users/matt/projects/basic_assumption) rake bundle:install # Installs the dependencies listed in Gemļ¬le rake clobber # Remove generated code rake clobber:app # Remove generated Rails app rake cucumber # Run Cucumber features rake gem:build # Builds the gem from the gemspec rake gem:install # Installs the built gem rake generate:app # Generate Rails app for integ tests rake generate:custom # Generate scaffolds, etc rake init # Set up gem, runs the specs and cukes rake setup # Sets up the environment for cukes rake spec # Run specs rake spec_with_rcov # Run specs with rcov
  • 54. RUBYGEMS 101 MATT YOHO Documentation
  • 55. RUBYGEMS 101 MATT YOHO RDoc
  • 56. RUBYGEMS 101 MATT YOHO ā€œUse the Source.ā€
  • 57. RUBYGEMS 101 MATT YOHO RDoc
  • 58. RUBYGEMS 101 MATT YOHO gem server
  • 59. RUBYGEMS 101 MATT YOHO
  • 60. RUBYGEMS 101 MATT YOHO YARD
  • 61. RUBYGEMS 101 MATT YOHO Rocco
  • 62. RUBYGEMS 101 MATT YOHO man
  • 63. RUBYGEMS 101 MATT YOHO ā€¢NAME ā€¢SYNOPSIS ā€¢DESCRIPTION ā€¢OPTIONS ā€¢FILES ā€¢ENVIRONMENT ā€¢DIAGNOSTICS ā€¢BUGS ā€¢AUTHOR ā€¢SEE ALSO
  • 64. RUBYGEMS 101 MATT YOHO
  • 65. RUBYGEMS 101 MATT YOHO
  • 66. RUBYGEMS 101 MATT YOHO
  • 67. RUBYGEMS 101 MATT YOHO README Driven Development
  • 68. RUBYGEMS 101 MATT YOHO Licensing
  • 69. RUBYGEMS 101 MATT YOHO Do it right away.
  • 70. RUBYGEMS 101 MATT YOHO MIT, BSD, Ruby
  • 71. RUBYGEMS 101 MATT YOHO Permissive Licenses Copyright (c) 2004-2010 David Heinemeier Hansson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  • 72. RUBYGEMS 101 MATT YOHO The DWTFYWTPL DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Version 2, December 2004 Ā Everyone is permitted to copy and distribute verbatim or modified Ā copies of this license document, and changing it is allowed as long Ā as the name is changed. Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā Ā DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Ā Ā Ā TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION Ā Ā 0. You just DO WHAT THE FUCK YOU WANT TO.
  • 73. RUBYGEMS 101 MATT YOHO Matz and OSS ā€œThere are various merits, but for me the biggest is freedom. I prefer the term 'free software' more than open source.ā€ - Japan, Inc., August 2000
  • 74. RUBYGEMS 101 MATT YOHO Good
  • 75. RUBYGEMS 101 MATT YOHO
  • 76. RUBYGEMS 101 MATT YOHO RVM
  • 77. RUBYGEMS 101 MATT YOHO rvm gemset use
  • 78. RUBYGEMS 101 MATT YOHO Donā€™t require RubyGems
  • 79. RUBYGEMS 101 MATT YOHO
  • 80. RUBYGEMS 101 MATT YOHO export RUBYOPT=rubygems
  • 81. RUBYGEMS 101 MATT YOHO
  • 82. RUBYGEMS 101 MATT YOHO Manually manage the load path
  • 83. RUBYGEMS 101 MATT YOHO lib = File.expand_path('../lib/', __FILE__) $:.unshift lib unless $:.include?(lib) require 'basic_assumption/version' Gem::Specification.new do |s| Ā Ā s.name = %q{basic_assumption} Ā Ā s.version = BasicAssumption::Version::STRING end
  • 84. RUBYGEMS 101 MATT YOHO Use rake.vim
  • 85. RUBYGEMS 101 MATT YOHO Donā€™t use Jeweler
  • 86. RUBYGEMS 101 MATT YOHO Prefer static gemspecs
  • 87. RUBYGEMS 101 MATT YOHO Use semantic versioning
  • 88. RUBYGEMS 101 MATT YOHO http://semver.org/
  • 89. RUBYGEMS 101 MATT YOHO X.Y.Z X.Y.Zpre Major.Minor.Patch
  • 90. RUBYGEMS 101 MATT YOHO
  • 91. RUBYGEMS 101 MATT YOHO Write good specs.
  • 92. RUBYGEMS 101 MATT YOHO
  • 93. RUBYGEMS 101 MATT YOHO Integration test
  • 94. RUBYGEMS 101 MATT YOHO Specs go a long way, but...
  • 95. RUBYGEMS 101 MATT YOHO Specs go a long way, but... Rails dependencies, etc.
  • 96. RUBYGEMS 101 MATT YOHO Yuck.
  • 97. RUBYGEMS 101 MATT YOHO Cucumber
  • 98. RUBYGEMS 101 MATT YOHO Aruba
  • 99. RUBYGEMS 101 MATT YOHO cucumber features for command line apps
  • 100. RUBYGEMS 101 MATT YOHO
  • 101. CUCARUBA! MATT YOHO YO DAWG! I heard you like writing features while you write features so we put cukes in your cukes!
  • 102. RUBYGEMS 101 MATT YOHO ~/projects/lib/tmp/aruba
  • 103. RUBYGEMS 101 MATT YOHO ~/projects/lib/tmp/aruba ./tmp/aruba rake task
  • 104. RUBYGEMS 101 MATT YOHO ~/projects/lib/tmp/aruba templates ./tmp/aruba rake task
  • 105. RUBYGEMS 101 MATT YOHO Feature: Rails Controllers Can Make Assumptions Scenario: controller invokes assume Given a ļ¬le named "app/controllers/widgets_controller.rb" with: """ class WidgetsController < ApplicationController assume(:widget) { Widget.ļ¬nd(params[:id]) } end """ And a ļ¬le named "app/views/widgets/show.html.erb" with: """ <blink><%= widget.name %></blink> """ And a ļ¬le named "features/widget_is_viewed_by_visitor.feature" with: """ Feature: Widget is viewed by visitor Scenario: success Given a widget named "foobar" When I view the widget Then I should see "foobar" """ When I run "cucumber features/widget_is_viewed_by_visitor.feature" Then I should see: """ 1 scenario (1 passed) 3 steps """
  • 106. RUBYGEMS 101 MATT YOHO Feature: Foo Does Something Scenario: foo works Given a ļ¬le named "foo.feature" with: """ Feature: Widget is viewed by visitor Scenario: success Given a foo named "bar" When I view the foo Then I should see "bar" """ When I run "cucumber foo.feature" Then I should see: """ 1 scenario (1 passed) 1 step """
  • 107. RUBYGEMS 101 MATT YOHO A little slow, but totally badass.
  • 108. RUBYGEMS 101 MATT YOHO
  • 109. RUBYGEMS 101 MATT YOHO http://github.com/aslakhellesoy/aruba http://github.com/rspec/rspec- rails http://github.com/mattyoho/ basic_assumption
  • 110. RUBYGEMS 101 MATT YOHO RVM and Bundler are complimentary
  • 111. RUBYGEMS 101 MATT YOHO Provide contribution guidelines
  • 112. RUBYGEMS 101 MATT YOHO Unicorn
  • 113. RUBYGEMS 101 MATT YOHO Get Forked
  • 114. RUBYGEMS 101 MATT YOHO i <3 GitHub
  • 115. RUBYGEMS 101 MATT YOHO Git commit etiquette
  • 116. RUBYGEMS 101 MATT YOHO Publish!
  • 117. RUBYGEMS 101 MATT YOHO
  • 118. RUBYGEMS 101 MATT YOHO RubyGems.org gem build gem push
  • 119. RUBYGEMS 101 MATT YOHO Learn by example
  • 120. RUBYGEMS 101 MATT YOHO RSpec2, Nokogiri, Paperclip, anything by Ryan Tomayko, Tom Preston-Warner, or any other GitHubber