51 lines
1.5 KiB
Ruby
51 lines
1.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module Graphs
|
|
class Commits
|
|
attr_reader :commits, :start_date, :end_date, :duration,
|
|
:commits_per_week_days, :commits_per_time, :commits_per_month
|
|
|
|
def initialize(commits)
|
|
@commits = commits
|
|
@start_date = commits.last.committed_date.to_date
|
|
@end_date = commits.first.committed_date.to_date
|
|
@duration = (@end_date - @start_date).to_i
|
|
|
|
collect_data
|
|
end
|
|
|
|
def authors
|
|
@authors ||= @commits.map(&:author_email).uniq.size
|
|
end
|
|
|
|
def commit_per_day
|
|
@commit_per_day ||= (@commits.size.to_f / (@duration + 1)).round(1)
|
|
end
|
|
|
|
def collect_data
|
|
@commits_per_week_days = {}
|
|
Date::DAYNAMES.each { |day| @commits_per_week_days[day] = 0 }
|
|
|
|
@commits_per_time = {}
|
|
(0..23).to_a.each { |hour| @commits_per_time[hour] = 0 }
|
|
|
|
@commits_per_month = {}
|
|
(1..31).to_a.each { |day| @commits_per_month[day] = 0 }
|
|
|
|
@commits.each do |commit|
|
|
hour = commit.committed_date.strftime('%k').to_i
|
|
day_of_month = commit.committed_date.strftime('%e').to_i
|
|
weekday = commit.committed_date.strftime('%A')
|
|
|
|
@commits_per_week_days[weekday] ||= 0
|
|
@commits_per_week_days[weekday] += 1
|
|
@commits_per_time[hour] ||= 0
|
|
@commits_per_time[hour] += 1
|
|
@commits_per_month[day_of_month] ||= 0
|
|
@commits_per_month[day_of_month] += 1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|