Implement and Test in One File with bundler/inline and rspec/autorun

Sometimes I want to create a tiny one-off script that intended to run on a sandbox environment like a Docker container and needs only one file. Most of the time, I also need test frameworks to do some refactoring. It can be done with bundler/inline and rspec/autorun.

require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'rspec'
end

def doit
  'return a string'
end

require 'rspec/autorun'

RSpec.describe '#doit' do
  example do
    expect(doit).to be_a(String)
  end
end

Usually, Bundler reads the dependencies from Gemfile. However, we can forgo this file by using gemfile block instead. As running the script, Bundler will install gems that are required by the block but not installed in the system. So the initial run may take a little longer time for installation. Note that you cannot place require 'rspec/autorun' before the gemfile block since some of the dependencies might not be installed yet before that.

You can run it as an ordinary Ruby script and let Bundler takes care of the dependencies.

root@a44fe6f150cc:/work# ruby example_script.rb
.

Finished in 0.00195 seconds (files took 0.05462 seconds to load)
1 example, 0 failures

By the way, the same thing can be done with the combination of Bundler and Minitest.

 gemfile do
   source 'https://rubygems.org'
-  gem 'rspec'
+  gem 'minitest'
 end

 def doit
   'return a string'
 end

-require 'rspec/autorun'
+require 'minitest/autorun'

-RSpec.describe '#doit' do
-  example do
-    expect(doit).to be_a(String)
+class TestDoit < Minitest::Test
+  def test_doit
+    assert_equal(String, doit.class)
   end
 end

bundler/inline allow us to declare the dependencies without creating a Gemfile, install them automatically. We don't have to create a directory for the script and run bundle install. It's useful for a tiny one-off script.

See Also

Gentaro "hibariya" Terada

Otaka-no-mori, Chiba, Japan
Email me

Loves Ruby, Internet, and Programming.