class UpdatePushoverAgentOptions < ActiveRecord::Migration DEFAULT_OPTIONS = { 'message' => '{{ message | default: text }}', 'device' => '{{ device }}', 'title' => '{{ title | default: subject }}', 'url' => '{{ url }}', 'url_title' => '{{ url_title }}', 'priority' => '{{ priority }}', 'timestamp' => '{{ timestamp }}', 'sound' => '{{ sound }}', 'retry' => '{{ retry }}', 'expire' => '{{ expire }}', } def up Agents::PushoverAgent.find_each do |agent| options = agent.options DEFAULT_OPTIONS.each_pair do |key, default| current = options[key] options[key] = if current.blank? default else "#{prefix_for(key)}#{current}#{suffix_for(key)}" end end agent.save!(validate: false) end end def down Agents::PushoverAgent.transaction do Agents::PushoverAgent.find_each do |agent| options = agent.options DEFAULT_OPTIONS.each_pair do |key, default| current = options[key] options[key] = if current == default '' else current[/\A#{Regexp.quote(prefix_for(key))}(.*)#{Regexp.quote(suffix_for(key))}\z/, 1] end or raise ActiveRecord::IrreversibleMigration, "Cannot revert migration once Pushover agents are configured" end agent.save!(validate: false) end end end def prefix_for(key) "{% capture _default_ %}" end def suffix_for(key) "{% endcapture %}" << DEFAULT_OPTIONS[key].sub(/(?=\}\}\z)/, '| default: _default_ ') end end