1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
# frozen_string_literal: true
require 'active_support/concern'
module AppStoreConnect
module Object
module Attributes
extend ActiveSupport::Concern
class_methods do
def attributes(&block)
self::Attributes.class_eval(&block)
end
end
included do
attr_reader :attributes
klass = Class.new do |attributes|
include Object::Properties
attributes.send(:define_method, :initialize) do |**kwargs|
self.class.properties.each do |name, options|
raise ArgumentError, "#{name} required" if options[:required] && !kwargs[name]
value = kwargs.fetch(name, options[:default])
instance_variable_set("@#{name}", value)
end
end
def to_h
{}.tap do |hash|
self.class.properties.each_key do |name|
value = instance_variable_get("@#{name}")
hash[name] = value unless value.nil?
end
end
end
end
const_set('Attributes', klass)
end
end
end
end
|