# coding: utf-8 # execution example: rake 'referential:create[3, 1896, '01-01-2017', '01-04-2017']' namespace :referential do desc 'Create a referential and accompanying data' task :create, [:workbench_id, :start_date, :end_date] => [:environment] do |t, args| args.with_defaults(workbench_id: 1, start_date: Date.today.strftime, end_date: (Date.today + 30).strftime) Referential.transaction do workbench = Workbench.find_by!(id: args[:workbench_id]) line = workbench.line_referential.lines.order("random()").first name = "Referential #{Faker::Name.unique.name}" referential = workbench.referentials.create!(name: name, slug: name.downcase.parameterize.underscore, organisation: workbench.organisation, prefix: Faker::Lorem.unique.characters(10)) ReferentialMetadata.create!(referential: referential, line_ids: [line.id], periodes: [Date.parse(args[:start_date])..Date.parse(args[:end_date])]) referential.switch print "✓ Created Referential ".green, name, "(#{referential.id})".blue, "\n" puts " For inspection of data in the console, do a: `Referential.last.switch'".blueish stop_areas = workbench.stop_area_referential.stop_areas.last(10) 4.times do |i| name = Faker::Name.unique.name route_attrs = { line: line, name: "Route #{name}", published_name: "Published #{name}" } if i.even? route_attrs[:wayback] = :outbound route = Chouette::Route.create!(route_attrs) route.stop_areas = stop_areas else route_attrs[:wayback] = :inbound route_attrs[:opposite_route] = Chouette::Route.last if i == 3 route = Chouette::Route.create!(route_attrs) route.stop_areas = stop_areas.reverse end route.save! print " ✓ Created Route ".green, route.name, "(#{route.id}), ".blue, "Line (#{line.id}) has #{line.routes.count} routes\n" journey_pattern = Chouette::JourneyPattern.create!(route: route, name: "Journey Pattern #{Faker::Name.unique.name}") print "✓ Created JourneyPattern ".green, journey_pattern.name, "(#{journey_pattern.id})".blue, "\n" journey_pattern.stop_points = stop_areas.inject([]) { |stop_points, stop_area| stop_points += stop_area.stop_points } time_tables = [] 2.times do |j| name = "Test #{Faker::Name.unique.name}" time_table = Chouette::TimeTable.create!(comment: name, start_date: Date.parse(args[:start_date]) + j.days, end_date: Date.parse(args[:end_date]) - j.days) print "✓ Created TimeTable ".green, time_table.comment, "(#{time_table.id})".blue, "\n" time_tables << time_table end 25.times do |j| vehicle_journey = Chouette::VehicleJourney.create!(journey_pattern: journey_pattern, route: route, number: Faker::Number.unique.number(4), time_tables: time_tables) print "✓ Created VehicleJourney ".green, vehicle_journey.number, "(#{vehicle_journey.id})".blue, "\n" time = Time.current.at_noon + j.minutes journey_pattern.stop_points.each_with_index do |stop_point, k| vehicle_journey.vehicle_journey_at_stops.create!(stop_point: stop_point, arrival_time: time + k.minutes, departure_time: time + k.minutes + 30.seconds) end end end referential.update(ready: true) end end def update_checksums_fo_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}" referential.switch do Referential.models_with_checksum.each do |klass| i = 0 j = 0 prev_size = 1 head = "Updating checksums for #{klass.name}: " print head print "⎯"*(80-head.size) print " " 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 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