diff options
| author | Alban Peignier | 2018-04-25 22:10:24 +0200 | 
|---|---|---|
| committer | GitHub | 2018-04-25 22:10:24 +0200 | 
| commit | cf962fb13fe52394f09a7fad90f848be6ab65d51 (patch) | |
| tree | 0fd8d7f4c84040e20a91e8b9ca6d96e568f70d0b | |
| parent | 1434331621f3677ba825da6dc44d438a7df99b70 (diff) | |
| parent | be3c5cd964581edc0fef868cca6889cb4acc1e10 (diff) | |
| download | chouette-core-cf962fb13fe52394f09a7fad90f848be6ab65d51.tar.bz2 | |
Merge pull request #520 from af83/6711-update-parents-checksum
Update checksums on parents. Fixes #6711
| -rw-r--r-- | app/models/chouette/journey_pattern.rb | 2 | ||||
| -rw-r--r-- | app/models/chouette/stop_point.rb | 1 | ||||
| -rw-r--r-- | app/models/chouette/vehicle_journey.rb | 2 | ||||
| -rw-r--r-- | app/models/concerns/checksum_support.rb | 22 | ||||
| -rw-r--r-- | spec/models/chouette/journey_pattern_spec.rb | 8 | ||||
| -rw-r--r-- | spec/models/chouette/vehicle_journey_spec.rb | 1 | 
6 files changed, 28 insertions, 8 deletions
| diff --git a/app/models/chouette/journey_pattern.rb b/app/models/chouette/journey_pattern.rb index 4b4cc2c73..8bdf72dfb 100644 --- a/app/models/chouette/journey_pattern.rb +++ b/app/models/chouette/journey_pattern.rb @@ -29,6 +29,8 @@ module Chouette        values.flatten      end +    has_checksum_children StopPoint +      def self.state_update route, state        transaction do          state.each do |item| diff --git a/app/models/chouette/stop_point.rb b/app/models/chouette/stop_point.rb index b0906d65f..edb0e81fd 100644 --- a/app/models/chouette/stop_point.rb +++ b/app/models/chouette/stop_point.rb @@ -11,6 +11,7 @@ module Chouette      belongs_to :stop_area      belongs_to :route, inverse_of: :stop_points +    has_many :journey_patterns, through: :route      has_many :vehicle_journey_at_stops, :dependent => :destroy      has_many :vehicle_journeys, -> {uniq}, :through => :vehicle_journey_at_stops diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb index 74d875164..8a29057e2 100644 --- a/app/models/chouette/vehicle_journey.rb +++ b/app/models/chouette/vehicle_journey.rb @@ -144,7 +144,7 @@ module Chouette          vjas =  self.vehicle_journey_at_stops          vjas += VehicleJourneyAtStop.where(vehicle_journey_id: self.id) unless self.new_record? -        attrs << vjas.uniq.sort_by { |s| s.stop_point&.position }.map(&:checksum).sort +        attrs << vjas.uniq.sort_by { |s| s.stop_point&.position }.map(&:checksum)          attrs << self.purchase_windows.map(&:checksum).sort if purchase_windows.present?          attrs << ignored_routing_contraint_zones.map(&:checksum).sort if ignored_routing_contraint_zones.present? diff --git a/app/models/concerns/checksum_support.rb b/app/models/concerns/checksum_support.rb index de3a6e16b..ed33e8f92 100644 --- a/app/models/concerns/checksum_support.rb +++ b/app/models/concerns/checksum_support.rb @@ -12,10 +12,16 @@ module ChecksumSupport    module ClassMethods      def has_checksum_children klass, opts={}        parent_class = self -      relation = opts[:relation] || self.model_name.singular +      belongs_to = opts[:relation] || self.model_name.singular +      has_many = opts[:relation] || self.model_name.plural + +      Rails.logger.debug "Define callback in #{klass} to update checksums #{self.model_name} (via #{has_many}/#{belongs_to})"        klass.after_save do -        parent = self.send(relation) -        parent&.update_checksum_without_callbacks! +        parents = [] +        parents << self.send(belongs_to) if klass.reflections[belongs_to].present? +        parents += self.send(has_many) if klass.reflections[has_many].present? +        Rails.logger.debug "Request from #{klass.name} checksum updates for #{parents.count} #{parent_class} parent(s)" +        parents.compact.each &:update_checksum_without_callbacks!        end      end    end @@ -57,22 +63,24 @@ module ChecksumSupport    def update_checksum      if self.checksum_source_changed?        self.checksum = Digest::SHA256.new.hexdigest(self.checksum_source) +      Rails.logger.debug("Changed #{self.class.name}:#{id} checksum: #{self.checksum}")      end    end    def update_checksum! -    set_current_checksum_source -    if checksum_source_changed? -      update checksum: Digest::SHA256.new.hexdigest(checksum_source) -    end +    _checksum_source = current_checksum_source +    update checksum_source: _checksum_source, checksum: Digest::SHA256.new.hexdigest(_checksum_source) +    Rails.logger.debug("Updated #{self.class.name}:#{id} checksum: #{self.checksum}")    end    def update_checksum_without_callbacks!      set_current_checksum_source      _checksum = Digest::SHA256.new.hexdigest(checksum_source) +    Rails.logger.debug("Compute checksum for #{self.class.name}:#{id} checksum_source:'#{checksum_source}' checksum: #{_checksum}")      if _checksum != self.checksum        self.checksum = _checksum        self.class.where(id: self.id).update_all(checksum: _checksum) unless self.new_record? +      Rails.logger.debug("Updated #{self.class.name}:#{id} checksum: #{self.checksum}")      end    end  end diff --git a/spec/models/chouette/journey_pattern_spec.rb b/spec/models/chouette/journey_pattern_spec.rb index 57ee5ab4e..fbc48c95a 100644 --- a/spec/models/chouette/journey_pattern_spec.rb +++ b/spec/models/chouette/journey_pattern_spec.rb @@ -6,6 +6,14 @@ describe Chouette::JourneyPattern, :type => :model do    describe 'checksum' do      it_behaves_like 'checksum support' + +    context "when a stop_point is updated" do +      it "should update checksum" do +        expect do +          subject.stop_points.first.update position: subject.stop_points.size +        end.to change{subject.reload.checksum} +      end +    end    end    # context 'validate minimum stop_points size' do diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb index 8682d59a2..9cc695c3c 100644 --- a/spec/models/chouette/vehicle_journey_spec.rb +++ b/spec/models/chouette/vehicle_journey_spec.rb @@ -1,3 +1,4 @@ +# coding: utf-8  require 'spec_helper'  describe Chouette::VehicleJourney, :type => :model do | 
