dude-cli 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|