|
| 1 | +# frozen_string_literal: true |
| 2 | + |
| 3 | +module FacebookDataAnalyzer |
| 4 | + class Friends < Analyzeable |
| 5 | + attr_reader :friends |
| 6 | + # year, day_of_week, day, month: {#unit: count ...} |
| 7 | + # weekend: {weekend: count, |
| 8 | + # weekday: count} |
| 9 | + # month_year: {#month - #year: count ...} |
| 10 | + # week_year: {#week - #year: count ...} |
| 11 | + COUNT_BY = %i[year day_of_week day month weekend month_year week_year].freeze |
| 12 | + |
| 13 | + def initialize(catalog:) |
| 14 | + @catalog = catalog |
| 15 | + @directory = "#{catalog}/html/" |
| 16 | + @file_pattern = 'friends.htm' |
| 17 | + @friends = [] |
| 18 | + |
| 19 | + super() |
| 20 | + end |
| 21 | + |
| 22 | + def analyze |
| 23 | + Dir.chdir(@directory) do |
| 24 | + content = File.open(@file_pattern).read |
| 25 | + doc = Nokogiri::HTML(content) |
| 26 | + friends_list = doc.css('div.contents > ul')[0].css('li') |
| 27 | + |
| 28 | + friends_list.each do |friend_element| |
| 29 | + friend = Friend.parse(friend_element: friend_element) |
| 30 | + |
| 31 | + @friends << friend |
| 32 | + count(analyzeable: friend) |
| 33 | + end |
| 34 | + end |
| 35 | + end |
| 36 | + |
| 37 | + def export(package:) |
| 38 | + making_friends_sheet(package: package) |
| 39 | + end |
| 40 | + |
| 41 | + private |
| 42 | + |
| 43 | + def making_friends_sheet(package:) |
| 44 | + package.workbook.add_worksheet(name: 'Making friends') do |sheet| |
| 45 | + sheet.add_row ['Making friends'] |
| 46 | + sheet.add_row [''] |
| 47 | + |
| 48 | + sheet.add_row ['Making friends by year'] |
| 49 | + sheet.add_row ['Year', 'Number of friends added'] |
| 50 | + @counted_by[:year].sort_by { |year, _count| year }.each do |year, count| |
| 51 | + sheet.add_row [year, count] |
| 52 | + end |
| 53 | + |
| 54 | + sheet.add_row ['Making friends by week day'] |
| 55 | + sheet.add_row ['Day of week', 'Number of friends added'] |
| 56 | + @counted_by[:day_of_week].sort_by { |_day, count| count }.reverse.each do |day, count| |
| 57 | + sheet.add_row [day, count] |
| 58 | + end |
| 59 | + |
| 60 | + sheet.add_row ['Making friends by month'] |
| 61 | + sheet.add_row ['Month', 'Number of friends added'] |
| 62 | + @counted_by[:month].sort_by { |_month, count| count }.reverse.each do |month, count| |
| 63 | + sheet.add_row [month, count] |
| 64 | + end |
| 65 | + |
| 66 | + sheet.add_row ['Making friends on weekend vs. working days'] |
| 67 | + sheet.add_row ['Working day or weekend', 'Number of friends added'] |
| 68 | + @counted_by[:weekend].each do |type_of_day, count| |
| 69 | + sheet.add_row [type_of_day.to_s, count] |
| 70 | + end |
| 71 | + |
| 72 | + sheet.add_row ['Most busy weeks for making friends (week number and year)'] |
| 73 | + sheet.add_row ['Week and year', 'Number of friends added'] |
| 74 | + @counted_by[:week_year].sort_by { |_week_year, count| count }.reverse.each do |week_year, count| |
| 75 | + sheet.add_row [week_year, count] |
| 76 | + end |
| 77 | + |
| 78 | + sheet.add_row ['Most busy month-year by friends added'] |
| 79 | + sheet.add_row ['Month year', 'Number of friends added'] |
| 80 | + @counted_by[:month_year].sort_by { |_month_year, count| count }.reverse.each do |month_year, count| |
| 81 | + sheet.add_row [month_year, count] |
| 82 | + end |
| 83 | + |
| 84 | + sheet.add_row ['Most busy making friends days'] |
| 85 | + sheet.add_row ['Day', 'Number of friends added'] |
| 86 | + @counted_by[:day].sort_by { |_day, count| count }.reverse.each do |day, count| |
| 87 | + sheet.add_row [day, count] |
| 88 | + end |
| 89 | + end |
| 90 | + end |
| 91 | + end |
| 92 | +end |
0 commit comments