From b853120644819dd1ae646ea762f457836abfea09 Mon Sep 17 00:00:00 2001 From: Zog Date: Wed, 17 Jan 2018 16:57:59 +0100 Subject: Refs #5593 @1h; - Register all models that implement checksums - Add a simple rake task that updates all checksums within a given referential --- app/models/concerns/checksum_support.rb | 1 + app/models/referential.rb | 40 +++++++++++++++++++++++++++++++++ lib/tasks/referential.rake | 27 ++++++++++++++++++++++ 3 files changed, 68 insertions(+) diff --git a/app/models/concerns/checksum_support.rb b/app/models/concerns/checksum_support.rb index b700ef286..ff73c87a3 100644 --- a/app/models/concerns/checksum_support.rb +++ b/app/models/concerns/checksum_support.rb @@ -5,6 +5,7 @@ module ChecksumSupport included do before_save :set_current_checksum_source, :update_checksum + Referential.register_model_with_checksum self end def checksum_attributes diff --git a/app/models/referential.rb b/app/models/referential.rb index 92931564d..baaa354da 100644 --- a/app/models/referential.rb +++ b/app/models/referential.rb @@ -75,6 +75,46 @@ class Referential < ActiveRecord::Base alias_method_chain :save, :table_lock_timeout + if Rails.env.development? + def self.force_register_models_with_checksum + paths = Rails.application.paths['app/models'].to_a + Rails.application.railties.each do |tie| + next unless tie.respond_to? :paths + paths += tie.paths['app/models'].to_a + end + + paths.each do |path| + next unless File.directory?(path) + Dir.chdir path do + Dir['**/*.rb'].each do |src| + next if src =~ /^concerns/ + # thanks for inconsistent naming ... + if src == "route_control/zdl_stop_area.rb" + RouteControl::ZDLStopArea + next + end + Rails.logger.info "Loading #{src}" + begin + src[0..-4].classify.safe_constantize + rescue => e + Rails.logger.info "Failed: #{e.message}" + nil + end + end + end + end + end + end + + def self.register_model_with_checksum klass + @_models_with_checksum ||= [] + @_models_with_checksum << klass + end + + def self.models_with_checksum + @_models_with_checksum || [] + end + def lines if metadatas.blank? workbench ? workbench.lines : associated_lines diff --git a/lib/tasks/referential.rake b/lib/tasks/referential.rake index 7bab6e040..1b46f69f0 100644 --- a/lib/tasks/referential.rake +++ b/lib/tasks/referential.rake @@ -67,4 +67,31 @@ namespace :referential do referential.update(ready: true) end end + + desc 'Update all the checksums in the given referential' + task :update_checksums_in_referential, [:slug] => :environment do |t, args| + thing = %w(\\ | / —) + Referential.force_register_models_with_checksum if Rails.env.development? + referential = Referential.find_by_slug(args[:slug]) + referential.switch do + Referential.models_with_checksum.each do |klass| + i = 0 + j = 0 + prev_size = 1 + print "Updating checksums for #{klass.name}: " + count = klass.count + klass.find_each do |o| + o.update_checksum! + if j%10 == 0 + out = "#{"\b"*prev_size}\e[33m#{thing[i]}\e[0m (#{j}/#{count})" + prev_size = out.size - prev_size - 9 + print out + i = (i+1) % thing.size + end + j += 1 + end + print "#{"\b"*prev_size}\e[32m✓\e[0m (#{count}/#{count})\n" + end + end + end end -- cgit v1.2.3 From 98127bd3d67395c6ec9fc8e0a7ef253f67e8565d Mon Sep 17 00:00:00 2001 From: Zog Date: Wed, 17 Jan 2018 17:21:18 +0100 Subject: Refs #5593; Add same task for all referentials in given organisation --- lib/tasks/referential.rake | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/lib/tasks/referential.rake b/lib/tasks/referential.rake index 1b46f69f0..adb31cf50 100644 --- a/lib/tasks/referential.rake +++ b/lib/tasks/referential.rake @@ -68,17 +68,19 @@ namespace :referential do end end - desc 'Update all the checksums in the given referential' - task :update_checksums_in_referential, [:slug] => :environment do |t, args| + def update_checksums_fo_referential referential thing = %w(\\ | / —) - Referential.force_register_models_with_checksum if Rails.env.development? - referential = Referential.find_by_slug(args[:slug]) + Referential.force_register_models_with_checksum if Rails.env.development? && Referential.models_with_checksum.empty? + puts "\n \e[33m***\e[0m Referential #{referential.name}" referential.switch do Referential.models_with_checksum.each do |klass| i = 0 j = 0 prev_size = 1 - print "Updating checksums for #{klass.name}: " + head = "Updating checksums for #{klass.name}: " + print head + print "⎯"*(80-head.size) + print " " count = klass.count klass.find_each do |o| o.update_checksum! @@ -94,4 +96,18 @@ namespace :referential do end end end + + desc 'Update all the checksums in the given referential' + task :update_checksums_in_referential, [:slug] => :environment do |t, args| + referential = Referential.find_by_slug(args[:slug]) + update_checksums_fo_referential referential + end + + desc 'Update all the checksums in the given organisation' + task :update_checksums_in_organisation, [:organisation_id] => :environment do |t, args| + thing = %w(\\ | / —) + Organisation.find(args[:organisation_id]).referentials.find_each do |referential| + update_checksums_fo_referential referential + end + end end -- cgit v1.2.3 From 03b8e22dba81a5877cfe61a9299580408c18e1f8 Mon Sep 17 00:00:00 2001 From: Zog Date: Fri, 19 Jan 2018 15:52:20 +0100 Subject: Refs #5593; Fix typo --- lib/tasks/referential.rake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/tasks/referential.rake b/lib/tasks/referential.rake index adb31cf50..d53157312 100644 --- a/lib/tasks/referential.rake +++ b/lib/tasks/referential.rake @@ -68,7 +68,7 @@ namespace :referential do end end - def update_checksums_fo_referential referential + def update_checksums_for_referential referential thing = %w(\\ | / —) Referential.force_register_models_with_checksum if Rails.env.development? && Referential.models_with_checksum.empty? puts "\n \e[33m***\e[0m Referential #{referential.name}" @@ -100,14 +100,14 @@ namespace :referential do desc 'Update all the checksums in the given referential' task :update_checksums_in_referential, [:slug] => :environment do |t, args| referential = Referential.find_by_slug(args[:slug]) - update_checksums_fo_referential referential + update_checksums_for_referential referential end desc 'Update all the checksums in the given organisation' task :update_checksums_in_organisation, [:organisation_id] => :environment do |t, args| thing = %w(\\ | / —) Organisation.find(args[:organisation_id]).referentials.find_each do |referential| - update_checksums_fo_referential referential + update_checksums_for_referential referential end end end -- cgit v1.2.3