lib/bruv.rb in bruv-0.2.0 vs lib/bruv.rb in bruv-0.2.2

- old
+ new

@@ -1,33 +1,76 @@ require "bruv/version" +# Module adding Bruv.attribute and Bruv.attributes helper methods. +# It adds an initializer method which sets values for defined attributes +# and perform additional conversions if specified. +# +# @example +# class MyClass +# include Bruv +# attribute :price, ->(ci) { Float(ci) } +# attributes :age, :type +# end +# +# mc = MyClass.new("123", 100, :user) +# mc.first_name # => 123.00 +# mc.age # => 100 +# mc.type # => :user +# module Bruv class BruvArgumentError < ArgumentError; end def self.included(obj) obj.class_eval do + # Array of registered attribute names. @instance_variables = [] + + # Hash of procs for registered attributes. @procs = {} + # Getter for @instance_variables + # @return [Array] def self.instance_variables @instance_variables end + # Getter for @procs + # @return [Hash] def self.procs @procs end + # Appends single variable name to {instance_variables} and if mproc + # is passed it adds it to {procs}. + # @param name [#to_sym] Name of the variable to be defined. + # @param mproc [#call] Proc called in the #initialize method + # which can perform additional value conversions + # @return [Hash] + # @example + # attribute :tag, ->(t) { t.downcase } + # attribute :code, ->(c) { { a: 123, b: 321 }.fetch(c) } def self.attribute(name, mproc = nil) mname = name.to_sym instance_variables << mname procs[mname] = mproc end + # Appends multiple variable names to {instance_variables} + # @param *names [Array<#to_sym>] Array of names, each name variable should + # respond to #to_sym + # @return [Array] + # @example + # attributes :first_name, :last_name def self.attributes(*names) @instance_variables += names.map(&:to_sym) end + # Defines getter methods for each attribute in {instance_variables}, + # and calls a proc for an attribute if it was registered. + # @note Attributes are defined in order in which they were registered. + # @param *args [Array] Array of attribute values. + # @raise [BruvArgumentError] when more values are passed that registered attributes. def initialize(*args) raise_argument_error if args.size > self.class.instance_variables.size self.class.instance_variables.each_with_index do |var, index| mproc = self.class.procs[var.to_sym] || proc { |a| a } instance_variable_set("@#{var}", mproc.call(args[index])) @@ -35,12 +78,13 @@ end end private + # Prepares Error message def raise_argument_error - message = "Number of arguments exceeds number of instance variables for: #{self.class.name}" - raise BruvArgumentError, message + message = "Number of arguments exceeds number of instance variables for:" + raise BruvArgumentError, "#{message} #{self.class.name}" end end end end