GEM: iron-extensions

Written by Rob Morris @ Irongaze Consulting LLC (irongaze.com)

DESCRIPTION

Helpful extensions to core Ruby classes, plus a little sugar for common patterns. For users of version 1.1.x and lower, please note that as of version 1.2.0 the DSL-specific extensions have been moved to the iron-dsl gem!

ADDED EXTENSIONS

  • Array#list_join - join as a list, ignoring blank/nil entries

    [1, 2, nil, '', 'count'].list_join # => '1, 2, count'
    
  • Enumerable#convert_to_hash - convert an array or other enumerable to a hash using a block or constant

    [:frog, :pig].convert_to_hash {|n| n.to_s.capitalize} # => {:frog => 'Frog', :pig => 'Pig'}
    [:frog, :pig].convert_to_hash(nil) # => {:frog => nil, :pig => nil}
    
  • Enumerable#delete_unless - equivalent to delete_if but with inverted test

    [1,2,3,4,5].delete_unless(&:odd?) # => [1,3,5]
    
  • Class#inspect_only - override #inspect to only show the specified variables or methods

    class User
      # Limit inspect to these attrs
      inspect_only :name, :admin?
    
      def initialize
        @name = 'Bob'
        @password = 'topSECRET!'
        @something_complex = ValidationEngine.new
      end
    
      def admin?
        @name == 'Admin'
      end
    end
    
    # Inspecting instances of this class show only what we need
    User.new.inspect  # => "<User:1892377440 @name='Bob', :admin?=false>"
    
  • File.safe_replace - atomic replacement of a file given a block to generate it

    # Defers deleting old file until block completes successfully (ie no exceptions), then
    # moves the new file into the old file's location
    File.safe_replace('./config') do |file|
      file.write("PRODUCTION: true")
    end
    
  • Fixnum#to_human_size - size to MB/GB/whatever, adapted from Rails

    123456.to_human_size # => "120.5 KB"
    
  • Kernel#capture_stdout - capture all text sent to STDOUT within the passed block

    # Will result in out == 'Hi mom!\n'
    out = capture_stdout do 
      puts 'Hi mom!'
    end
    
  • Math.max/Math.min - find the max/min value passed

    Math.max(2,10) # => 10
    
  • Math.scale_to_fit - shrink width and height vals to fit in a box, preserving aspect ratio

    Math.scale_to_fit(100, 100, 50, 80) # => 50, 50
    
  • Nil#blank? - always true

  • Numeric#to_display - pretty display of numbers with options for number of decimal places and inclusion of thousands separator (US-only, sorry!)

    5000.to_display          # => 5,000
    100.to_display(2)        # => 100.00
    2105.2348.to_display(2)  # => 2,105.23
    
  • Numeric#bound - bound a given number to a range

    4.bound(5,10) # => 5
    
  • Object#in? - sugar to make expressing inclusion clearer

    1.in? [2,3,4] # => false
    'foo'.in? ['foo', 'bar'] # => true
    
  • Range#bound - ensure a number is in a range

    (1..5).bound(6) # => 5
    
  • Regexp::IP_ADDRESS, Regexp::EMAIL_ADDRESS, Regexp::DOMAIN - commonly useful regexen

  • String#blank? - true if empty?

  • String#append / String#prepend - these should be in Ruby core

  • String#to_date - “better” date parser than Date.parse (US-centric)

  • String#to_dashcase - perfect for permalinks!

  • String#smart_truncate - truncate honoring word boundaries

  • String#integer? - true when string represents an integer

  • String#extract - simplifies pulling info out of strings using regexen

    "Irongaze Consulting".extract(/^[a-z]/i) # => "Irongaze"
    dollars, cents = "$12.95".extract(/([0-9]+)\.([0-9]+)/) # => dollars == '12' and cents == '95'
    
  • Symbol#blank? - always false

  • Symbol#to_dashcase - same as for String

SYNOPSIS

To use:

require 'iron-extensions'

After that, simply write code to make use of the new extensions and helper classes.

REQUIREMENTS

  • Ruby 1.9.2 or later

INSTALL

To install, simply run:

sudo gem install iron-extensions

RVM users should drop the ‘sudo’:

gem install iron-extensions