A nicer way to run RSpec and/or Cucumber

geordi, our collection of awesome shell scripts, has been extended by three scripts to help you call RSpec or Cucumber:

cuc

This script runs Cucumber the way you want it:

  • Prints some line feeds to easily find your test results when you come back to the console later
  • Configures Cucumber to use cucumber_spinner if it is available in your Gemfile
  • Runs Cucumber under bundle exec
  • Uses an old version of Firefox for Selenium (Javascript) features...

How to test resource_controller hooks

When using the resource_controller gem you often hook onto events like this:
update.before do
do_something
end

For testing such things in your controller you should -- as always -- not trigger something that eventually calls the thing you want.\
Instead, in your specs, have resource_controller run those hooks like it does itself. Like that:

describe 'before update' do
 ...

Dump a two-dimensional array to an Excel .xls spreadsheet

Copy the attached Ruby code to config/initializers, or paste it into your IRB console. You can now dump any two-dimensional array to an Excel .xls spreadsheet with a single method call:

table = [['user', 'email', 'hours']]
User.all.each do |user|
  table << [user.name, user.email, user.hours]
end

table.dump_to_excel('users.xls')

The first row in the array will be dumped as the table head in bold type.

You need the spreadsheet gem in your Gemfile.

Note that there is a [limit of 65535 rows](https://makandracard...

Gem Versioning and Bundler: Doing it Right

When running an executable, ALWAYS use bundle exec. In some cases, running executables without bundle exec may work, if the executable happens to be installed in your system and does not pull in any gems that conflict with your bundle. However, this is unreliable and is the source of considerable pain. Even if it looks like it works, it may not work in the future or on another machine. 

Execution of shell code in Ruby scripts

Deprecated ways to execute shell code in Ruby

This is just a reference for legacy code. For new code, always use capture3.

%x{ } or backticks – quick and easy

Returns the standard output of running the given command in a subshell. This is an alias for `...`, and you can use string interpolation.

Example:

name = 'ls'
result = `which #{name}`

It does not escape anything you inject in the string, so be aware of possible security vulnerabilities...

How to employ and run your tests with parallel_tests to speed up test execution

When your cucumber features grow massively over time, the test execution can take a lot of time.
One easy way to speed up your test execution is to use the parallel_tests gem.
It comes along with some useful rake tasks that let you setup your local test environment shortly to run your features, specs or unit-tests in parallel.

Follow these steps to get it to work.

  1. Add the parallel_tests gem to your Gemfile test sections like that:

    # ./Gemfile
    
    group :development, :test do
    

...

Script to create and copy a production dump to your project root

Soon after having written our shell-for script, we wanted to easily get dumps of our productions machines, too. This is how we do it:

dump-for staging [-s]

It will copy the dump to your project's tmp directory and name it according to the capistrano stage you're calling for, here: staging.dump. When you pass the optional -s option, the dump will automatically been sourced into your local development database.


This script ...

Releasing geordi

After having written useful scripts into makandra notes for a long time, we’ve now tied them into a powerful new gem: geordi.

It gives you the power to

  • get a dump from your production database with dump-for production
  • install your local gems to the production machine with install-gems-remotely
  • execute rake tasks to several environments at the same time with power-rake db:migrate
  • and much more

Check it out from github.

Faker is now I18n aware, ships with unicorns

Recent versions of the Faker gem retrieve their strings from your locale file (e.g. config/locale/de.yml). This leads to awesome errors like this:

undefined method `shuffle' for "translation missing: de.faker.lorem.words":ActiveSupport::SafeBuffer

To fix this, copy the contents of a Faker locale file into your config/locale/de.yml.

This is stupid.

Before installing the Curb gem

You need to
apt-get install libcurl3-dev

Updating a gem created with Bundler

Since May 2011 we are cutting new gems using Bundler, which is less painful than cutting gems using Jeweler. You know a gem was cut using Bundler if you see the word Bundler in a gem project's Rakefile.

This is how to update a gem that was cut using Bundler:

  • Say git pull or check out a repository from Github like git clone git@github.com:makandra/geordi.git
  • Update the gem version in `lib/project...

Test that a number or money amount is shown with Cucumber

This is an awful way to test whether a number is shown on the screen:

Then I should see "5"

It is awful because the step above is green for 5, 5123 and -51.

This step definition below makes sure this doesn't happen. You can use it like this:

Then I should see the number 5

The step also works if you you'd like to test that the number is followed by a unit:

Then I should see the amount 5 €

The separator between the number and its unit is allowed to be either a space or a [nbsp](https://makandracards.com/makandra/838-generate...

Sudo a gem executable does not work on Ubuntu

Today I needed to execute a ruby gem executable with sudo. But, surprisingly, bash would tell me command not found for the gem that ran lovely without sudo.

Gem bins are installed to /var/lib/gems/1.8/bin, which is not in sudo’s PATH. Unfortunately, you can’t change the path, since sudo for Ubuntu is compiled with the --with-secure-path option.

#Solution A: symlink the gems (if you need only some few gems)

  • for each gem you need for sudo, run `ln -s /var/lib/gems/1.8/bin/gem_for_sudo /usr/local/bin/gem_for_sudo

#Soluti...

Getting started with Chef

Before installing chef, make sure curl is installed and sudo finds your gems

#Important

  • execute all commands from within your chef-repo directory, else you'll be missing out on configuration files

Script to open an SSH shell to a Capistrano deployment target

We regularly need to connect to the server in order to e.g. access the production console. Guessing the Capistrano deploy user and then again guessing the right directory on the server is awkward, so we wrote a script that parses config/deploy and gives you the handy command shell-for.

Run it from any project directory like this, passing a Capistrano multistage deployment target:

shell-for staging

Now it also supports commands to be remotely executed before loading the bash. Use --no-bash to only execute the command and load no ba...

Getting started with Puppet

When you simply want to get to know Puppet, follow puppetlabs’ Learning Puppet Docs. They give you a handy introduction inside a virtual machine they provide. You can watch the talk by Garrett Honeycutt 'Expanded Introduction to Puppet'.

Do not miss their cheatsheat and their [learn-puppet virtual machine](http://info.puppetl...

Putting static content on Cloudfront

We recently decided to put static content for HouseTrip.com to Amazon Cloudfront for a faster user experience. This happens fully automatically on deploy and is transparent in development. Together with a heavy use of sprites this sped up page load time quite nicely.

These are a couple of the problems you need to solve in order to do this:

  • There is no good way to invalidate Cloudfront cached assets, and Cloudfront will ignor...

Bash script to run specs and features

Run rspec-and-cucumber from any project directory to run both RSpec and Cucumber. If available, rspec_spinner or cucumber_spinner are used.

Note that features are not run when specs fail.\
If you prefer to run them in parallel or run features regardless of the spec results, please adjust it for yourself accordingly.


This script is part of our geordi gem on github.

javan/whenever - GitHub

Whenever is a Ruby gem that provides a clear syntax for writing and deploying cron jobs.

Haml and Sass 3.1 are Released

Sass now comes with user-defined functions, keyword arguments, list manipulation. Haml and Sass are now two separate gems.

Collect an array of IDs from any object

The Edge Rider gem will define a method collect_ids on your ActiveRecord models, scopes, integer scalars and collections, which will return a list of their IDs:

User.last.collect_ids # => [9]
[User.first, User.last].collect_ids # => [1, 9]
User.active.collect_ids # => [4, 5, 6]
[4, 5, 6].collect_ids # => [4, 5, 6]
7.collect_ids #=> [7]

This allows you to parametrize scopes with a variety of argument types:

class Note < ActiveRecord::Base
  named_scope :for_users, lamb...

makandra/consul

Our new scope-based authorization gem for Ruby on Rails has been released. This might one day replace Aegis as our standard authorization solution.

Convert RDoc markup to HTML

If you want to convert a README.rdoc file to HTML, say this from a shell:

rdoc README.rdoc

You will find the generated HTML in doc/index.html.

If you do this while working on one of our gems, please .gitignore everything in doc and don't commit the generated HTML.

jeanmartin/konto_check

Ruby gem to check whether a given bic/account-no-combination can possibly be valid for a German bank. Can also resolve German bank names from a given bic.