Class: Jirawatch::CLI::Track

Inherits:
Dry::CLI::Command
  • Object
show all
Includes:
AuthenticatedCommand
Defined in:
lib/jirawatch/cli/track.rb

Instance Method Summary collapse

Methods included from AuthenticatedCommand

included

Methods included from Jira::Provisioning

#login, #save_credentials

Constructor Details

#initialize(reader: TTY::Reader.new, worklogger: Jirawatch::Interactors::Worklogger.new) ⇒ Track

Returns a new instance of Track.



12
13
14
15
16
17
18
# File 'lib/jirawatch/cli/track.rb', line 12

def initialize(
    reader: TTY::Reader.new,
    worklogger: Jirawatch::Interactors::Worklogger.new
)
  @reader = reader
  @worklogger = worklogger
end

Instance Method Details

#call(issue_key:, **options) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/jirawatch/cli/track.rb', line 20

def call(issue_key:, **options)
  tracking_started_at = Time.parse(options.fetch(:tracking_started_at, Time.now.to_s))
  fail! Jirawatch.strings.error_invalid_tracking_start if tracking_started_at > Time.now

  issue = @jira_client.Issue.find(issue_key) # Fails if issue doesn't exist

  paused = false
  tracking_restarted_at = tracking_started_at.to_i
  partial_time_spent = 0

  worked_hours = ((issue.attrs["fields"]["timetracking"]["timeSpentSeconds"].presence || 0)/60)/60
  worked_minutes = ((issue.attrs["fields"]["timetracking"]["timeSpentSeconds"].presence || 0)/60)%60
  estimate_hours = ((issue.attrs["fields"]["timetracking"]["originalEstimateSeconds"].presence || 0)/60)/60
  estimate_minutes = ((issue.attrs["fields"]["timetracking"]["originalEstimateSeconds"].presence || 0)/60)%60
  puts Jirawatch.strings.tracking_cli_name % [issue_key, issue.attrs["fields"]["summary"]]
  puts Jirawatch.strings.tracking_cli_time % [tracking_started_at.strftime("%Y-%m-%d %H:%M:%S"), worked_hours, worked_minutes, estimate_hours, estimate_minutes]
  puts Jirawatch.strings.tracking_cli_inputs

  @reader.on(:keyctrl_p) do
    unless paused
      partial_time_spent += Time.now.to_i - tracking_restarted_at
      time_unit = partial_time_spent / 60 == 1 ? "minute" : "minutes"
      puts Jirawatch.strings.tracking_paused % [partial_time_spent / 60, time_unit]
    else
      tracking_restarted_at = Time.now.to_i
      puts Jirawatch.strings.tracking_restarted
    end
    paused = !paused
  end

  begin
    loop do
      @reader.read_line("")
    end
  rescue Interrupt
    total_time_spent = partial_time_spent + (Time.now.to_i - tracking_restarted_at) unless paused
    total_time_spent = partial_time_spent if paused
    @worklogger.call @jira_client, issue_key, total_time_spent, tracking_started_at, default_message: options.fetch(:worklog_message, "")
  end
end