Skip to content

sveredyuk/strict_options

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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 ? =)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages