class TogglRedmineComparator

rubocop:disable Metrics/ClassLength

Constants

BUFFER

Public Class Methods

call(days_behind = 7) click to toggle source
# File lib/renuo/cli/app/toggl_redmine_comparator.rb, line 17
def call(days_behind = 7)
  report = {}
  since_date = days_behind.days.before(Date.yesterday).strftime("%F")
  until_date = Date.yesterday.strftime("%F")
  extract_redmine(report, since_date, until_date)
  extract_toggl(report, since_date, until_date)
  report = report.sort.reverse.to_h
  print_table(report)
  report
end

Private Class Methods

colorization_for_value(value) click to toggle source
# File lib/renuo/cli/app/toggl_redmine_comparator.rb, line 51
def colorization_for_value(value)
  if more_toggl?(value)
    :red
  elsif more_redmine?(value)
    :default
  else
    :green
  end
end
colorize_table_row(date, value) click to toggle source
# File lib/renuo/cli/app/toggl_redmine_comparator.rb, line 43
def colorize_table_row(date, value)
  printed_day = date.strftime("%F %a")
  printed_redmine = to_time(value[:redmine])
  printed_toggl = to_time(value[:toggl])
  colorize_method = colorization_for_value(value)
  [printed_day, printed_redmine, printed_toggl].map { |v| v.colorize(colorize_method) }
end
convert_redmine_csv(encoded_body) click to toggle source
# File lib/renuo/cli/app/toggl_redmine_comparator.rb, line 70
def convert_redmine_csv(encoded_body)
  separated_csv_entries = CSV.parse(encoded_body, col_sep: ",")
  keys = separated_csv_entries.shift[1..-2]
  entries = separated_csv_entries.shift[1..-2]
  keys.zip(entries)
end
default_value() click to toggle source
# File lib/renuo/cli/app/toggl_redmine_comparator.rb, line 119
def default_value
  { redmine: 0.0, toggl: 0.0 }
end
extract_redmine(report, since_date, _until_date) click to toggle source
# File lib/renuo/cli/app/toggl_redmine_comparator.rb, line 61
def extract_redmine(report, since_date, _until_date)
  encoded_body = perform_redmine_call(since_date)
  csv = convert_redmine_csv(encoded_body)
  csv.each do |date, entry|
    report[Date.parse(date)] ||= default_value
    report[Date.parse(date)][:redmine] = to_seconds(entry) if entry.present?
  end
end
extract_toggl(report, since_date, until_date) click to toggle source
# File lib/renuo/cli/app/toggl_redmine_comparator.rb, line 98
def extract_toggl(report, since_date, until_date)
  user_id = Toggl::User.me.id
  workspace_ids = Toggl::Workspace.all.map(&:id)

  workspace_ids.each do |workspace_id|
    time_entries = Toggl::Detail.where(since: since_date, until: until_date,
                                       user_agent: "renuo-cli", workspace_id:, user_ids: user_id)
    parse_toggl_entries(report, time_entries)
  end
end
generate_redmine_query(since_date) click to toggle source
# File lib/renuo/cli/app/toggl_redmine_comparator.rb, line 86
def generate_redmine_query(since_date)
  URI.encode_www_form(
    [["utf8", "✓"], ["criteria[]", "user"],
     ["f[]", "spent_on"], ["f[]", "user_id"],
     ["op[spent_on]", ">="], ["op[user_id]", "="],
     ["v[spent_on][]", since_date], ["v[user_id][]", "me"],
     ["f[]", ""],
     ["c[]", "project"], ["c[]", "spent_on"], ["c[]", "user"], ["c[]", "activity"], ["c[]", "issue"],
     ["c[]", "comments"], ["c[]", "hours"], %w[columns day], ["criteria[]", ""]]
  )
end
more_redmine?(value) click to toggle source
# File lib/renuo/cli/app/toggl_redmine_comparator.rb, line 145
def more_redmine?(value)
  (value[:redmine] - value[:toggl]) > BUFFER
end
more_toggl?(value) click to toggle source
# File lib/renuo/cli/app/toggl_redmine_comparator.rb, line 141
def more_toggl?(value)
  (value[:toggl] - value[:redmine]) > BUFFER
end
non_working_day?(value) click to toggle source
# File lib/renuo/cli/app/toggl_redmine_comparator.rb, line 135
def non_working_day?(value)
  [value[:redmine], value[:toggl]].all?(&:zero?)
end
parse_toggl_entries(report, time_entries) click to toggle source
# File lib/renuo/cli/app/toggl_redmine_comparator.rb, line 109
def parse_toggl_entries(report, time_entries)
  time_entries
    .reject { |te| te.end.nil? }
    .group_by { |time_entry| Date.parse(time_entry.end) }
    .each do |date, grouped_time_entries|
    report[date] ||= default_value
    report[date][:toggl] += grouped_time_entries.sum(&:dur)
  end
end
perform_redmine_call(since_date) click to toggle source
# File lib/renuo/cli/app/toggl_redmine_comparator.rb, line 77
def perform_redmine_call(since_date)
  query = generate_redmine_query(since_date)
  url = URI("https://redmine.renuo.ch/time_entries/report.csv?#{query}")
  req = Net::HTTP::Get.new(url)
  req["X-Redmine-API-Key"] = RenuoCliConfig.redmine_api_key
  response = Net::HTTP.start(url.hostname, url.port, use_ssl: true) { |http| http.request(req) }
  response.body.force_encoding("ISO-8859-1").encode("UTF-8")
end
print_table(report) click to toggle source
to_seconds(value) click to toggle source
# File lib/renuo/cli/app/toggl_redmine_comparator.rb, line 130
def to_seconds(value)
  hours, minutes = value.to_d.divmod(1.0)
  (hours * 60 * 60 * 1000) + (minutes * 60 * 60 * 1000)
end
to_time(value) click to toggle source
# File lib/renuo/cli/app/toggl_redmine_comparator.rb, line 123
def to_time(value)
  sec = value / 1000.0
  min, _sec = sec.divmod(60.0)
  hour, min = min.divmod(60.0)
  format("%<hour>02d:%<min>02d", hour:, min:)
end