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
# File lib/renuo/cli/app/toggl_redmine_comparator.rb, line 30 def print_table(report) rows = [] report.each do |date, value| rows << colorize_table_row(date, value) rows << :separator end rows.pop table = Terminal::Table.new headings: %w[Day Redmine Toggl].map(&:cyan), rows:, style: { padding_left: 2, padding_right: 2, border_x: "-".blue, border_y: "|".blue, border_i: "+".blue } puts table end
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