Change replacement_patterns_defined to require an attribute name

This ensures that the method is only used in contexts where we know
for which attribute we expect a replacement pattern to be defined.

This change makes errors less likely where one would expect that
all replacement patterns are defined for subjects (which is the status
quo as implemented, but not as designed).

Also all code that I've seen so far that calls this method, needed to
validate the subject attribute separately afterwards. This change should
make such code shorter.
This commit is contained in:
Jan Sandbrink
2025-01-07 13:33:04 +01:00
parent b68b13e8d2
commit 871d7bfd1f
4 changed files with 5 additions and 12 deletions
+2 -4
View File
@@ -104,10 +104,8 @@ class Type < ApplicationRecord
object.types.include?(self)
end
def replacement_patterns_defined?
return false if patterns.blank?
enabled_patterns.any?
def replacement_pattern_defined_for?(attribute)
enabled_patterns.key?(attribute)
end
def enabled_patterns
+1 -2
View File
@@ -73,8 +73,7 @@ class WorkPackages::CreateService < BaseServices::BaseCallable
end
def set_templated_subject(work_package)
return true unless work_package.type&.replacement_patterns_defined?
return true unless work_package.type.enabled_patterns[:subject]
return true unless work_package.type&.replacement_pattern_defined_for?(:subject)
work_package.subject = work_package.type.enabled_patterns[:subject].resolve(work_package)
work_package.save
@@ -49,9 +49,7 @@ class WorkPackages::SetAttributesService < BaseServices::SetAttributes
end
def mark_templated_subject
return true unless work_package.type&.replacement_patterns_defined?
if work_package.type.patterns.all_enabled[:subject]
if work_package.type&.replacement_pattern_defined_for?(:subject)
work_package.subject = "Templated by #{work_package.type.name}"
end
end
+1 -3
View File
@@ -42,9 +42,7 @@ class WorkPackages::UpdateService < BaseServices::Update
private
def set_templated_attributes
return unless model.type.replacement_patterns_defined?
model.type.patterns.all_enabled.each do |key, pattern|
model.type.enabled_patterns.each do |key, pattern|
model.public_send(:"#{key}=", pattern.resolve(model))
end
end