Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Тут находится программа, выполняющая обработку данных из файла.
- # Тест показывает как программа должна работать.
- # В этой программе нужно обработать файл данных data_large.txt.
- # Ожидания от результата:
- # Корректная обработатка файла data_large.txt;
- # Проведена оптимизация кода и представлены ее результаты;
- # Production-ready код;
- # Применены лучшие практики;
- require 'json'
- require 'pry'
- require 'date'
- require 'minitest/autorun'
- require 'benchmark'
- require 'set'
- def parse_session(fields)
- {
- browser: fields[3].upcase,
- time: fields[4],
- date: fields[5]
- }
- end
- def calculate_user_stats(user, result_user_stats)
- return if user[:name].nil?
- user_stats = {}
- user_stats[:sessionsCount] = user[:sessions].count
- session_durations = user[:sessions].map { |session| session[:time].to_i }
- user_stats[:totalTime] = "#{session_durations.sum} min."
- user_stats[:longestSession] = "#{session_durations.max} min."
- browsers = user[:sessions].map { |session| session[:browser] }.sort
- user_stats[:browsers] = browsers.join(', ')
- user_stats[:usedIE] = browsers.any? { |browser| browser.match?(/INTERNET EXPLORER/) }
- user_stats[:alwaysUsedChrome] = browsers.all? { |browser| browser.match?(/CHROME/) }
- session_dates = user[:sessions].map { |session| Date.parse(session[:date]) }
- user_stats[:dates] = session_dates.sort.reverse.map(&:iso8601)
- result_user_stats[user[:name]] = user_stats
- end
- def handle_file
- current_user = { name: nil, sessions: [] }
- result = {
- users_count: 0,
- sessions_count: 0,
- uniq_browsers: Set.new,
- users_stats: {}
- }
- File.open('data_large.txt').each do |line|
- fields = line.split(',')
- entry_class = fields[0]
- case entry_class
- when 'user'
- calculate_user_stats(current_user, result[:users_stats])
- result[:users_count] += 1
- current_user = { name: "#{fields[2]} #{fields[3]}", sessions: [] }
- when 'session'
- current_user[:sessions] << parse_session(fields)
- result[:sessions_count] += 1
- result[:uniq_browsers] << fields[3].upcase
- end
- end
- calculate_user_stats(current_user, result[:users_stats])
- result
- end
- def work
- result = handle_file
- report = {
- totalUsers: result[:users_count],
- totalSessions: result[:sessions_count],
- uniqueBrowsersCount: result[:uniq_browsers].count,
- allBrowsers: result[:uniq_browsers].to_a.sort.join(','),
- usersStats: result[:users_stats]
- }
- File.write('result.json', "#{report.to_json}\n")
- end
- # Benchmark.bmbm do |x|
- # x.report('work') { work }
- # end
- # Rehearsal ----------------------------------------
- # work 49.371923 0.657388 50.029311 ( 50.304776)
- # ------------------------------ total: 50.029311sec
- # user system total real
- # work 48.509724 0.419018 48.928742 ( 49.084887)
- class TestMe < Minitest::Test
- def setup
- File.write('result.json', '')
- File.write(
- 'data_large.txt',
- <<~TEXT
- user,0,Leida,Cira,0
- session,0,0,Safari 29,87,2016-10-23
- session,0,1,Firefox 12,118,2017-02-27
- session,0,2,Internet Explorer 28,31,2017-03-28
- session,0,3,Internet Explorer 28,109,2016-09-15
- session,0,4,Safari 39,104,2017-09-27
- session,0,5,Internet Explorer 35,6,2016-09-01
- user,1,Palmer,Katrina,65
- session,1,0,Safari 17,12,2016-10-21
- session,1,1,Firefox 32,3,2016-12-20
- session,1,2,Chrome 6,59,2016-11-11
- session,1,3,Internet Explorer 10,28,2017-04-29
- session,1,4,Chrome 13,116,2016-12-28
- user,2,Gregory,Santos,86
- session,2,0,Chrome 35,6,2018-09-21
- session,2,1,Safari 49,85,2017-05-22
- session,2,2,Firefox 47,17,2018-02-02
- session,2,3,Chrome 20,84,2016-11-25
- TEXT
- )
- end
- def test_result
- work
- expected_result = '{"totalUsers":3,"uniqueBrowsersCount":14,"totalSessions":15,"allBrowsers":"CHROME 13,CHROME 20,CHROME 35,CHROME 6,FIREFOX 12,FIREFOX 32,FIREFOX 47,INTERNET EXPLORER 10,INTERNET EXPLORER 28,INTERNET EXPLORER 35,SAFARI 17,SAFARI 29,SAFARI 39,SAFARI 49","usersStats":{"Leida Cira":{"sessionsCount":6,"totalTime":"455 min.","longestSession":"118 min.","browsers":"FIREFOX 12, INTERNET EXPLORER 28, INTERNET EXPLORER 28, INTERNET EXPLORER 35, SAFARI 29, SAFARI 39","usedIE":true,"alwaysUsedChrome":false,"dates":["2017-09-27","2017-03-28","2017-02-27","2016-10-23","2016-09-15","2016-09-01"]},"Palmer Katrina":{"sessionsCount":5,"totalTime":"218 min.","longestSession":"116 min.","browsers":"CHROME 13, CHROME 6, FIREFOX 32, INTERNET EXPLORER 10, SAFARI 17","usedIE":true,"alwaysUsedChrome":false,"dates":["2017-04-29","2016-12-28","2016-12-20","2016-11-11","2016-10-21"]},"Gregory Santos":{"sessionsCount":4,"totalTime":"192 min.","longestSession":"85 min.","browsers":"CHROME 20, CHROME 35, FIREFOX 47, SAFARI 49","usedIE":false,"alwaysUsedChrome":false,"dates":["2018-09-21","2018-02-02","2017-05-22","2016-11-25"]}}}' + "\n"
- parsed_expected = JSON.parse(expected_result)
- assert_equal parsed_expected, JSON.parse(File.read('result.json'))
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement