diff options
Diffstat (limited to 'app/models/service.rb')
-rw-r--r-- | app/models/service.rb | 59 |
1 files changed, 21 insertions, 38 deletions
diff --git a/app/models/service.rb b/app/models/service.rb index f6d8fb1fb46..4e1498d3fe0 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -23,7 +23,9 @@ class Service < ApplicationRecord default_value_for :pipeline_events, true default_value_for :wiki_page_events, true - after_initialize :initialize_properties + after_initialize do |service| + service.assign_attributes(service.properties) + end after_commit :reset_updated_properties after_commit :cache_project_has_external_issue_tracker @@ -77,10 +79,6 @@ class Service < ApplicationRecord read_attribute(:category).to_sym end - def initialize_properties - self.properties = {} if properties.nil? - end - def title # implement inside child end @@ -174,31 +172,7 @@ class Service < ApplicationRecord # Also keep track of updated properties in a similar way as ActiveModel::Dirty def self.prop_accessor(*args) args.each do |arg| - class_eval %{ - unless method_defined?(arg) - def #{arg} - properties['#{arg}'] - end - end - - def #{arg}=(value) - self.properties ||= {} - updated_properties['#{arg}'] = #{arg} unless #{arg}_changed? - self.properties['#{arg}'] = value - end - - def #{arg}_changed? - #{arg}_touched? && #{arg} != #{arg}_was - end - - def #{arg}_touched? - updated_properties.include?('#{arg}') - end - - def #{arg}_was - updated_properties['#{arg}'] - end - } + define_prop_accessor(arg, ActiveModel::Type::Value.new) end end @@ -206,16 +180,25 @@ class Service < ApplicationRecord # for each serialized property. # Also keep track of updated properties in a similar way as ActiveModel::Dirty def self.boolean_accessor(*args) - self.prop_accessor(*args) - args.each do |arg| - class_eval %{ - def #{arg}? - # '!!' is used because nil or empty string is converted to nil - !!ActiveRecord::Type::Boolean.new.cast(#{arg}) - end - } + define_prop_accessor(arg, :boolean, default: false) + alias_attribute "#{arg}?", arg + end + end + + def self.define_prop_accessor(arg, type, **options) + define_method("#{arg}=") do |value| + self.properties ||= {} + updated_properties[arg.to_s] = value + properties[arg.to_s] = value + super(value) end + + define_method("#{arg}_touched?") do + updated_properties.include?(arg.to_s) + end + + attribute(arg, type, **options) end # Returns a hash of the properties that have been assigned a new value since last save, |