0.0
No commit activity in last 3 years
No release in over 3 years
Define strict attributes for options hash
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Development

>= 3.4.0, ~> 3.4
 Project Readme

StrictOptions

Description

Allow you define strict attributes for options hash.

Common practice in Ruby OOP are something like this:

  class MyBestClass
    def initialize(name, data, options = {})
      @name    = name
      @data    = data
      @options = options
    end

    def some_method
      raise ArgumentError, "No user set" unless options[:user]
      raise ArgumentError, "No blah set" unless options[:blah]

      # ... do something if user & blah was set
    end
  end

If you want some short method that allow raise ArgumentError (or some other Error) for all strict options you can use strict_options! method.

Installation & Setup

Gemfile:

gem 'strict_options'

and run bundle in console

or for plain ruby-program:

gem install strict_options

and in rubyfile:

require 'strict_options'

Example

require 'strict_options'

class Product
  include StrictOptions

  def initialize(name, options = {})
    @name    = name
    @options = options
    @sku     = options.fetch(:sku,   nil)
    @price   = options.fetch(:price, nil)
    @brand   = options.fetch(:brand, nil)
  end

  def full_name
    strict_options!(:brand, :sku)
    "#{@brand} #{@name} (#{@sku})"
  end

  def dicounted_price
    strict_options!(:price)
    @price * 0.8
  end
end

And now you will control options attributes:

p = Product.new("iPhone")
p.full_name #=> options :brand, :sku are missing (ArgumentError)
p.discounted_price #=> option :price is missing (ArgumentError)

and don't miss any attributes

p = Product.new("iPhone", brand: "Apple", sku: "iphone_6s_16gb", price: 649)
puts p.full_name #=> Apple iPhone (iphone_6s_16gb)
puts p.discounted_price #=> 519.2

Hold your hand at API pulse*

Features

You could define you custom ExceptionClass and exception message:

class PriceError < StandardError; end

def calculate_sale_price
  strict_options!(:price, exception_class: PriceError,
                        exception_message: "No price!")
end

calculate_sale_price
#=> #<PriceError: No price!>

TODO

  • Some improvements ? =)