Project

iron-enum

0.0
No commit activity in last 3 years
No release in over 3 years
Adds enumerated constant value support to Ruby and Rails projects
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

active_record
~> 3.0
~> 2.6
~> 1.3
 Project Readme

GEM: iron-enum¶ ↑

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

DESCRIPTION¶ ↑

Add support for rich enum values (enumerated constants) to Ruby/Rails.

SYNOPSIS¶ ↑

Managing constants - status flags, system states, etc - is frustrating when working with Ruby and Rails. The canonical solution is to use class constants. But doing so leaves a lot to be desired. This gem provides a much more Ruby-like way of dealing with magic constants that provides symbol/key-based lookup, automatic conversion between keys and values, user-friendly naming, attribute support, model scoping and validation, and more.

To use:

# Require the gem's classes (not needed if using Bundler)
require 'iron/enum'  

# Declare an enum module.  In this case, let's say we're working on a
# shopping cart system that tracks orders.  Orders have a status - perfect
# place for an enumeration!
module OrderStatus
  enum :created,   1
  enum :cancelled, 2, 'No Sale'
  enum :purchased, 3
  enum :shipped,   4
  enum :returned,  5
end

# Once you have your enum set up, there are a host of things you can do.
# To start with, enums set up normal Ruby class constants:
>> puts OrderStatus::PURCHASED
=> 3

# But you can also refer to them with symbolic keys:
>> puts OrderStatus.value(:purchased)
=> 3

# You can convert between values, keys and text:
>> OrderStatus.value(:shipped)
=> 4
>> OrderStatus.name(:shipped)
=> 'Shipped'
>> OrderStatus.key(4)
=> :shipped

# Validate values against the set of good values
>> OrderStatus.valid_value?(10)
=> false

# Get an array of all valid values
>> OrderStatus.values
=> [1, 2, 3, 4, 5]
# Get a selection of values by key
>> OrderStatus.values(:created, :cancelled, :returned)
=> [1, 2, 5]

# This is all handy, but where enums really shine is as declared attributes
class Order < ActiveRecord::Base
  # Pass the attribute and the enum module that it uses
  enum_attr :status => OrderStatus

  # Note that if your attribute's name maps to your enum module name, you can skip the hash:
  # enum_attr :order_status
end

# Now you can set a value using a key
>> @order = Order.new
>> @order.status = :shipped
=> 4
# Test for a given value with a clear syntax
>> @order.status_returned?
=> false
# Set a value
>> @order.status_returned!
=> 5

# Setting an invalid value raises an exception
# This raises RuntimeError('Unknown key or value [27] in enum OrderStatus')
>> @order.status = 27

# You even get free scoping!
>> Order.with_status(:shipped)
=> [...all orders with status == 4...]

# And model validation, should you somehow set the field to an improper value
>> @order = Order.new
>> @order.send(:write_attribute, :status, -2)
>> @order.valid?
=> false

REQUIREMENTS¶ ↑

None, though you’ll need rspec, sqlite3 and active_record gems to test and build the gem

INSTALL¶ ↑

To install, simply run:

sudo gem install iron-enum

RVM users can skip the sudo:

gem install iron-enum

Once installed, just require it:

require 'iron-enum'