summaryrefslogtreecommitdiff
path: root/app/models/service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/service.rb')
-rw-r--r--app/models/service.rb59
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,