Upgrade to Pro — share decks privately, control downloads, hide ads and more …

You have to test multiple versions of your gem's dependencies. You used Appraisal. It's super affective!

You have to test multiple versions of your gem's dependencies. You used Appraisal. It's super affective!

So, it seems like you've finished writing your awesome gem. However, are you sure that your gem is working perfectly against multiple versions of its dependency? Are you sure that you didn't break any backward compatibility? In this talk, I'm going to show you the approach we have been taken to test our gems against multiple versions of dependencies, such as testing against Rails 3.2 and Rails 3.1. I'm also going to introduce you to our gem called "Appraisal" which helps you generating Gemfiles to be used with Bundler, and also guide it to running your test suite against those multiple Gemfiles. Lastly, I'm going to show you how you can config Travis CI to test your gem against those multiple versions of dependencies.

Presented at RubyKaigi 2013 on May 30, 2013.

Video is available at http://vimeo.com/69748748

Prem Sichanugrist

May 30, 2013
Tweet

More Decks by Prem Sichanugrist

Other Decks in Programming

Transcript

  1. You have to test multiple versions
    of your gem’s dependencies.
    You used Appraisal. It’s super effective!

    View Slide

  2. ϖϨϜɹγνϟψΪτ
    Prem Sichanugrist
    Developer at thoughtbot
    @sikachu
    /sikachu

    View Slide

  3. View Slide

  4. Published your gem?

    View Slide

  5. Fully tested?

    View Slide

  6. Works with older
    version of dependencies?

    View Slide

  7. Works with older
    version of dependencies?

    View Slide

  8. Why testing with
    multiple versions?

    View Slide

  9. People doesn’t update their
    project’s dependencies

    View Slide

  10. People install your gem

    View Slide

  11. Your gem is only tested
    against newer version
    of its dependency

    View Slide

  12. “This gem doesn’t work”

    View Slide

  13. View Slide

  14. Works with latest version
    !=
    Works with old versions

    View Slide

  15. ~>

    View Slide

  16. SemVer
    Semantic Versioning

    View Slide

  17. ~> 3.2

    View Slide

  18. ~> 3.2

    View Slide

  19. ~> 3.2

    View Slide

  20. People don’t follow
    SemVer

    View Slide

  21. People don’t follow
    SemVer

    View Slide

  22. View Slide

  23. Supported Rails Versions
    • 3.1.x
    • 3.2.x

    View Slide

  24. Supported Rails Versions
    • 3.1.x
    • 3.2.x
    • 4.0.0

    View Slide

  25. Supported Rails Versions
    • 3.0.x
    • 3.1.x
    • 3.2.x
    • 4.0.0

    View Slide

  26. Supported Rails Versions
    • 2.3.x
    • 3.0.x
    • 3.1.x
    • 3.2.x
    • 4.0.0

    View Slide

  27. How?

    View Slide

  28. Before Bundler

    View Slide

  29. Uninstall and reinstall

    View Slide

  30. $ gem uninstall activesupport
    $ gem install activesupport -v 3.1.12
    $ rake
    $ gem install activesupport
    $ rake

    View Slide

  31. ·͍ͣ
    (Bad)

    View Slide

  32. Why was this so bad?
    • Time consuming
    • Can’t test against multiple versions at once
    • Doesn’t handle dependency of dependency
    • Dependency hell
    • $ rm -Rf $GEM_HOME

    View Slide

  33. Test in isolation

    View Slide

  34. Gemset

    View Slide

  35. rbenv
    (with rbenv-gemset)

    View Slide

  36. $ rvm gemset create rails-3-2
    $ rvm gemset use rails-3-2
    $ gem install rails -v 3.2.13
    $ rake
    $ rvm gemset create rails-3-1
    $ rvm gemset use rails-3-1
    $ gem install rails -v 3.1.12
    $ rake
    # ...

    View Slide

  37. $ rvm @rails-3-1,@rails-3-2 do rake

    View Slide

  38. View Slide

  39. This is good, but ...
    • Waste of space; gems are not shared
    • Contributors need to use Ruby manager
    that supports Gemset
    • May need to have bootstrap script to setup
    gemsets

    View Slide

  40. View Slide

  41. Multiple Gemfiles

    View Slide

  42. !"" Gemfile
    !"" rails-3-1.gemfile
    !"" rails-3-2.gemfile
    ...

    View Slide

  43. rails-3-1.gemfile:
    source "http://rubygems.org"
    gem "rails", "~> 3.1.12"
    gem "rspec"

    View Slide

  44. rails-3-2.gemfile:
    source "http://rubygems.org"
    gem "rails", "~> 3.2.13"
    gem "rspec"

    View Slide

  45. $ bundle install --gemfile=rails-3-2.gemfile
    $ export BUNDLE_GEMFILE=rails-3-2.gemfile
    $ bundle exec rake
    $ bundle install --gemfile=rails-3-1.gemfile
    $ export BUNDLE_GEMFILE=rails-3-1.gemfile
    $ bundle exec rake

    View Slide

  46. View Slide

  47. View Slide

  48. Still hard to maintain

    View Slide

  49. Still have to edit
    Gemfiles by hand

    View Slide

  50. Have to specify
    dependencies over and over

    View Slide

  51. Adding new dependency

    View Slide

  52. Adding new dependency
    ... edit multiple files!

    View Slide

  53. No easy way to test all
    the versions at once

    View Slide

  54. View Slide

  55. “There should be a
    better way to do this”

    View Slide

  56. Appraisal

    View Slide

  57. Set multiple versions of
    dependencies in one place

    View Slide

  58. Merge dependencies
    and generate Gemfiles

    View Slide

  59. Setup environment for
    Bundler

    View Slide

  60. View Slide

  61. Demo

    View Slide

  62. Gemfile:
    source "http://rubygems.org"
    gem "rails"
    gem "rspec"
    gem "appraisal"

    View Slide

  63. Gemfile:
    source "http://rubygems.org"
    gemspec

    View Slide

  64. Appraisals:
    appraise "rails-3-1" do
    gem "rails", "~> 3.1.12"
    end
    appraise "rails-3-2" do
    gem "rails", "~> 3.2.13"
    end

    View Slide

  65. Rakefile:
    require "bundler/setup"
    require "appraisal"
    task "test" do
    # ...
    end

    View Slide

  66. Rakefile:
    require "bundler/setup"
    require "appraisal"
    task "test" do
    # ...
    end

    View Slide

  67. # Generate Gemfiles
    $ rake appraisal:gemfiles
    # Install dependencies
    $ rake appraisal:install

    View Slide

  68. # Run "test" task against all versions
    $ rake appraisal test
    # Run "test" task against a single version
    $ rake appraisal:rails-3-1 test

    View Slide

  69. Appraisal
    • Allow you to set dependencies in a single
    place
    • Generate sub-Gemfiles for you
    • Install multiple versions of dependencies
    • Setup Bundler to use the correct version
    of dependency

    View Slide

  70. View Slide

  71. Show that your gem is
    working with multiple
    versions of dependency

    View Slide

  72. .travis.yml:
    gemfile:
    - gemfiles/rails_3_1.gemfile
    - gemfiles/rails_3_2.gemfile

    View Slide

  73. View Slide

  74. View Slide

  75. View Slide

  76. Remember

    View Slide

  77. View Slide

  78. Test it against multiple
    versions of its dependencies

    View Slide

  79. Test it against multiple
    versions of its dependencies
    by using Appraisal x

    View Slide

  80. View Slide

  81. View Slide

  82. RUBYKAIGI
    Promo code:
    $20 off first month of Prime
    http://learn.thoughtbot.com
    ͋Γ͕ͱ͏͍͟͝·͢ʂ

    View Slide