dude-cli 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/dude/cli.rb +22 -7
- data/lib/dude/git.rb +6 -1
- data/lib/dude/gitlab.rb +19 -0
- data/lib/dude/interface.rb +45 -21
- data/lib/dude/report.rb +38 -0
- data/lib/dude/toggl.rb +3 -4
- data/lib/dude/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f1b1363a91b57a06932df8d4b80be8b7a709e694
|
4
|
+
data.tar.gz: 9e65b6ffa950cfd5c4a14e53872040385cb06a88
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 54999e8a1a98d83a94fb3442bc98d06101a54836426b0e5f22e1b3eed4dcfc1035568920b921ddd60b81b00fecfd36763e35b55cb8006653342e91cb56fa15f3
|
7
|
+
data.tar.gz: f65cb5832180d149fde8d9af81a24468c2fdf747c7174c6ce55ab0f80ce39d9091efbf1ee919975822ca5a9b8aecdcd642d6b6720e50a62c0e3e7e267315eeac
|
data/Gemfile.lock
CHANGED
data/lib/dude/cli.rb
CHANGED
@@ -22,18 +22,14 @@ module Dude
|
|
22
22
|
|
23
23
|
desc 'checkout [ISSUE_ID]', 'checkout to branch with name "ID-issue-title"'
|
24
24
|
def checkout(issue_id, project_title = folder_name)
|
25
|
-
issue_title =
|
26
|
-
issue_id: issue_id, project_title: project_title
|
27
|
-
).call
|
25
|
+
issue_title = get_issue_title(issue_id, project_title)
|
28
26
|
Git.new(branch_name: git_branch_name(issue_title, issue_id)).call
|
29
27
|
end
|
30
28
|
|
31
|
-
desc 'start [ISSUE_ID]', 'start task in Toggl with issue title
|
29
|
+
desc 'start [ISSUE_ID]', 'start task in Toggl with issue title, checkout to branch and estimate time if it is needed'
|
32
30
|
def start(issue_id, project_title = folder_name)
|
33
31
|
checkout(issue_id, project_title)
|
34
|
-
issue_title =
|
35
|
-
issue_id: issue_id, project_title: project_title
|
36
|
-
).call
|
32
|
+
issue_title = get_issue_title(issue_id, project_title)
|
37
33
|
Toggl.new(title: "##{issue_id} #{issue_title}", project_title: project_title).start_time_entry
|
38
34
|
puts "Starting Toggl task"
|
39
35
|
end
|
@@ -44,17 +40,36 @@ module Dude
|
|
44
40
|
Interface.new.issues_list(issues)
|
45
41
|
end
|
46
42
|
|
43
|
+
desc 'estimate [DURATION] [ISSUE_ID]', 'estimate time'
|
44
|
+
def estimate(duration, issue_id = current_issue_id, project_title = folder_name)
|
45
|
+
Gitlab.new(issue_id: issue_id, project_title: project_title).estimate_time(duration)
|
46
|
+
end
|
47
|
+
|
47
48
|
desc 'stop', 'stop current time entry in Toggl'
|
48
49
|
def stop
|
49
50
|
Toggl.new.stop_current_time_entry
|
50
51
|
end
|
51
52
|
|
53
|
+
desc 'issue', 'Information about issue'
|
54
|
+
def issue(issue_id = current_issue_id, project_title = folder_name)
|
55
|
+
Gitlab.new(issue_id: issue_id, project_title: project_title).issue_info
|
56
|
+
end
|
57
|
+
|
52
58
|
desc 'stats', 'display your stats from Toggl'
|
53
59
|
def stats
|
54
60
|
Toggl.new.report
|
55
61
|
end
|
62
|
+
|
56
63
|
private
|
57
64
|
|
65
|
+
def current_issue_id
|
66
|
+
Git.new.current_branch_name.chomp.split('-').first
|
67
|
+
end
|
68
|
+
|
69
|
+
def get_issue_title(issue_id, project_title)
|
70
|
+
Gitlab.new(issue_id: issue_id, project_title: project_title).call
|
71
|
+
end
|
72
|
+
|
58
73
|
def duderc_file_content
|
59
74
|
"TOGGL_EMAIL=\nTOGGL_TOKEN=\nTOGGL_WORKSPACE_ID=\n" \
|
60
75
|
"GITLAB_ENDPOINT=https://gitlab.yoursite.com/api/v4/\n" \
|
data/lib/dude/git.rb
CHANGED
@@ -6,10 +6,15 @@ module Dude
|
|
6
6
|
|
7
7
|
def initialize(options = {})
|
8
8
|
@options = options
|
9
|
+
@git = ::Git.init
|
9
10
|
end
|
10
11
|
|
11
12
|
def call
|
12
|
-
|
13
|
+
@git.branch(options[:branch_name]).checkout if options[:branch_name]
|
14
|
+
end
|
15
|
+
|
16
|
+
def current_branch_name
|
17
|
+
%x(git rev-parse --abbrev-ref HEAD)
|
13
18
|
end
|
14
19
|
end
|
15
20
|
end
|
data/lib/dude/gitlab.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'gitlab'
|
2
|
+
require 'rest-client'
|
2
3
|
require_relative 'settings'
|
4
|
+
require_relative 'interface'
|
3
5
|
|
4
6
|
module Dude
|
5
7
|
class Gitlab
|
@@ -26,8 +28,25 @@ module Dude
|
|
26
28
|
::Gitlab.issues(project_id).select.map {|a| [a.iid, a.title, a.labels]}
|
27
29
|
end
|
28
30
|
|
31
|
+
def estimate_time(duration)
|
32
|
+
issue_resource['time_estimate'].post duration: duration
|
33
|
+
end
|
34
|
+
|
35
|
+
def issue_info
|
36
|
+
issue_info = JSON.parse(issue_resource.get.body)
|
37
|
+
Interface.new.draw_issue_info(issue_info)
|
38
|
+
end
|
39
|
+
|
29
40
|
private
|
30
41
|
|
42
|
+
def issue_link
|
43
|
+
@issue_link ||= ::Gitlab.issue(project_id, options[:issue_id])._links.self.gsub(/http/, 'https')
|
44
|
+
end
|
45
|
+
|
46
|
+
def issue_resource
|
47
|
+
@issue_resource ||= RestClient::Resource.new(issue_link, headers: { 'PRIVATE-TOKEN': settings['GITLAB_TOKEN'] })
|
48
|
+
end
|
49
|
+
|
31
50
|
def project_id
|
32
51
|
@project_id ||= ::Gitlab.project_search(options[:project_title])[0].id
|
33
52
|
end
|
data/lib/dude/interface.rb
CHANGED
@@ -5,10 +5,34 @@ module Dude
|
|
5
5
|
class Interface
|
6
6
|
include Settings
|
7
7
|
|
8
|
-
def report
|
9
|
-
|
8
|
+
def draw_report(report)
|
9
|
+
@report = report
|
10
|
+
report_weekly
|
10
11
|
puts ''
|
11
|
-
report_daily
|
12
|
+
report_daily
|
13
|
+
end
|
14
|
+
|
15
|
+
def draw_issue_info(info)
|
16
|
+
issue_label = info['labels'].find do |label|
|
17
|
+
['To Do', 'Doing', 'To Verify'].include? label
|
18
|
+
end
|
19
|
+
|
20
|
+
issue_color = case issue_label
|
21
|
+
when 'To Do'
|
22
|
+
:yellow
|
23
|
+
when 'Doing'
|
24
|
+
:green
|
25
|
+
when 'To Verify'
|
26
|
+
:blue
|
27
|
+
end
|
28
|
+
|
29
|
+
puts "#{info['title']} ##{info['iid']}".colorize(issue_color).bold
|
30
|
+
puts "Status: ".colorize(:yellow) + "#{issue_label}"
|
31
|
+
puts "Estimated time: ".colorize(:yellow) +
|
32
|
+
"#{info['time_stats']['human_time_estimate']}"
|
33
|
+
puts "Spent time: ".colorize(:yellow) +
|
34
|
+
"#{info['time_stats']['human_total_time_spent'] || '0h'}"
|
35
|
+
puts "Link: ".colorize(:yellow) + "#{info['web_url']}"
|
12
36
|
end
|
13
37
|
|
14
38
|
def issues_list(issues)
|
@@ -28,22 +52,26 @@ module Dude
|
|
28
52
|
|
29
53
|
private
|
30
54
|
|
31
|
-
def report_weekly
|
32
|
-
puts "Week".
|
33
|
-
puts '-' * 15
|
34
|
-
puts "Worked:".colorize(:yellow).bold +
|
35
|
-
" #{seconds_to_time(
|
36
|
-
|
37
|
-
"
|
55
|
+
def report_weekly
|
56
|
+
puts "Week".colorize(:green).bold
|
57
|
+
# puts '-' * 15
|
58
|
+
puts " Worked:".colorize(:yellow).bold +
|
59
|
+
" #{seconds_to_time(@report.week_time_worked)} / " \
|
60
|
+
"#{@report.hours_without_weekends}:00:00 " \
|
61
|
+
"(#{@report.week_time_worked * 100 / 144000}%)"
|
62
|
+
puts " Time left:".colorize(:yellow).bold +
|
63
|
+
" #{seconds_to_time(144000 - @report.week_time_worked)}"
|
38
64
|
end
|
39
65
|
|
40
|
-
def report_daily
|
41
|
-
puts "Today".
|
42
|
-
puts '-' * 15
|
43
|
-
puts "Worked:".colorize(:yellow).bold +
|
44
|
-
" #{seconds_to_time(
|
45
|
-
|
46
|
-
"
|
66
|
+
def report_daily
|
67
|
+
puts "Today".colorize(:green).bold
|
68
|
+
# puts '-' * 15
|
69
|
+
puts " Worked:".colorize(:yellow).bold +
|
70
|
+
" #{seconds_to_time(@report.today_time_worked)} / " \
|
71
|
+
" #{settings['HOURS_PER_DAY']}:00:00 " \
|
72
|
+
"(#{@report.today_time_worked * 100 / 28800}%)"
|
73
|
+
puts " Time left:".colorize(:yellow).bold +
|
74
|
+
" #{seconds_to_time(@report.seconds_for_today - @report.week_time_worked)}"
|
47
75
|
end
|
48
76
|
|
49
77
|
def seconds_to_time(s)
|
@@ -51,10 +79,6 @@ module Dude
|
|
51
79
|
"#{sprintf '%02d', hms[0]}:#{sprintf '%02d', hms[1]}:#{sprintf '%02d', hms[2]}"
|
52
80
|
end
|
53
81
|
|
54
|
-
def seconds_for_today
|
55
|
-
Time.now.wday * settings['HOURS_PER_DAY'].to_i * 3600
|
56
|
-
end
|
57
|
-
|
58
82
|
def term
|
59
83
|
term_size = IO.console.winsize
|
60
84
|
@terminal = OpenStruct.new(h: term_size[0], w: term_size[1])
|
data/lib/dude/report.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'date'
|
2
|
+
require_relative 'settings'
|
3
|
+
|
4
|
+
module Dude
|
5
|
+
class Report
|
6
|
+
include Settings
|
7
|
+
attr_reader :report
|
8
|
+
|
9
|
+
def initialize(report_json)
|
10
|
+
@report = JSON.parse(report_json.body)
|
11
|
+
end
|
12
|
+
|
13
|
+
def week_time_worked
|
14
|
+
@time_worked ||= report['total_grand'] / 1000
|
15
|
+
end
|
16
|
+
|
17
|
+
def today_time_worked
|
18
|
+
@today_time_worked ||= report['week_totals'].map {|a| a.nil? ? 0 : a / 1000}[Time.now.wday - 1]
|
19
|
+
end
|
20
|
+
|
21
|
+
def days_without_weekends
|
22
|
+
@days_without_weekends ||= report['week_totals'][0..Time.now.wday - 1].compact.count
|
23
|
+
end
|
24
|
+
|
25
|
+
def weekends
|
26
|
+
@weekends ||= report['week_totals'][0..Time.now.wday - 1].
|
27
|
+
select { |a| a.nil? }.count
|
28
|
+
end
|
29
|
+
|
30
|
+
def hours_without_weekends
|
31
|
+
@hours_without_weekends ||= settings['HOURS_PER_WEEK'].to_i - weekends * settings['HOURS_PER_DAY'].to_i
|
32
|
+
end
|
33
|
+
|
34
|
+
def seconds_for_today
|
35
|
+
days_without_weekends * settings['HOURS_PER_DAY'].to_i * 3600
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/dude/toggl.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'rest-client'
|
2
2
|
require 'date'
|
3
3
|
require_relative 'settings'
|
4
|
+
require_relative 'report'
|
4
5
|
|
5
6
|
module Dude
|
6
7
|
class Toggl
|
@@ -12,10 +13,8 @@ module Dude
|
|
12
13
|
end
|
13
14
|
|
14
15
|
def report
|
15
|
-
report = toggl_report.get params: report_params
|
16
|
-
|
17
|
-
today_time_worked = JSON.parse(report.body)['week_totals'].map {|a| a.nil? ? 0 : a / 1000}[Time.now.wday - 1]
|
18
|
-
Interface.new.report(time_worked, today_time_worked)
|
16
|
+
report = Report.new(toggl_report.get params: report_params)
|
17
|
+
Interface.new.draw_report(report)
|
19
18
|
end
|
20
19
|
|
21
20
|
def start_time_entry
|
data/lib/dude/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dude-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nikita Pupko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -161,6 +161,7 @@ files:
|
|
161
161
|
- lib/dude/git.rb
|
162
162
|
- lib/dude/gitlab.rb
|
163
163
|
- lib/dude/interface.rb
|
164
|
+
- lib/dude/report.rb
|
164
165
|
- lib/dude/settings.rb
|
165
166
|
- lib/dude/toggl.rb
|
166
167
|
- lib/dude/version.rb
|