module StubRequests::Concerns::Property::ClassMethods

Module ClassMethods provides class methods for {Property}

@author Mikael Henriksson <mikael@zoolutions.se>

Public Instance Methods

define_property(name, type, default) click to toggle source

@api private

# File lib/stub_requests/concerns/property.rb, line 67
def define_property(name, type, default)
  property_reader(name, default)
  property_predicate(name)
  property_writer(name, type)

  set_property_default(name, default)
  set_property_defined(name, type, default)
end
normalize_type(type, **options) click to toggle source

@api private

# File lib/stub_requests/concerns/property.rb, line 59
def normalize_type(type, **options)
  type_array = Array(type)
  return type_array unless (default = options[:default])

  type_array.concat([default.class]).flatten.uniq
end
property(name, type:, **options) click to toggle source

Define property methods for the name

@param [Symbol] name the name of the property @param [Object] type the expected type of the property @param [Hash<Symbol>] options a hash with options @option options [Object] :default a default value for the property

@return [void]

# File lib/stub_requests/concerns/property.rb, line 48
def property(name, type:, **options)
  type = normalize_type(type, options)
  default = options[:default]
  Validator.call(name, type, default, properties)

  Docile.dsl_eval(self) do
    define_property(name, type, default)
  end
end
property_predicate(name) click to toggle source

@api private

# File lib/stub_requests/concerns/property.rb, line 87
def property_predicate(name)
  silence_redefinition_of_method("#{name}?")
  redefine_method("#{name}?") do
    !!public_send(name) # rubocop:disable Style/DoubleNegation
  end
end
property_reader(name, default) click to toggle source

@api private

# File lib/stub_requests/concerns/property.rb, line 77
def property_reader(name, default)
  invar = "@#{name}"
  silence_redefinition_of_method(name.to_s)
  redefine_method(name) do
    instance_variable_set(invar, default) unless instance_variable_defined?(invar)
    instance_variable_get(invar)
  end
end
property_writer(name, type) click to toggle source

@api private

# File lib/stub_requests/concerns/property.rb, line 95
def property_writer(name, type)
  redefine_method("#{name}=") do |obj|
    validate! name: name, value: obj, type: type
    instance_variable_set("@#{name}", obj)
  end
end
set_property_default(name, default) click to toggle source
# File lib/stub_requests/concerns/property.rb, line 102
def set_property_default(name, default)
  instance_variable_set("@#{name}", default)
end
set_property_defined(name, type, default) click to toggle source

@api private

# File lib/stub_requests/concerns/property.rb, line 107
def set_property_defined(name, type, default)
  self.properties ||= {}
  properties[name] = { type: type, default: default }
end