toggl-worktime 0.3.2 → 0.4.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/CHANGELOG.md +7 -0
- data/README.md +41 -0
- data/exe/toggl-worktime +25 -13
- data/lib/toggl/worktime.rb +3 -0
- data/lib/toggl/worktime/calendar.rb +93 -0
- data/lib/toggl/worktime/driver.rb +5 -0
- data/lib/toggl/worktime/version.rb +1 -1
- data/toggl-worktime.gemspec +2 -1
- metadata +22 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a50c3becb0b4a9536811b9c003e3cbc611a5dcdacf20169d3f8ed09bd8955003
|
4
|
+
data.tar.gz: 80bfb02dc2272c04f8678835a6c5424caf599a5052e6bbb3a6f3d141458d5699
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 635b3b61cde0e75cc19527a65f04c224f23e3c41866c3921b8e6f3dd59268013fab775ffa60ff6d780422a27ee6578cce2abbaac14cb1c27215e38c20a2fa957
|
7
|
+
data.tar.gz: c4938047c7dd2d4989f815cde8cb599a6a3c97e16001ee9d39a3edfa8249cbf9caa2f3ce4e5bd0fb72b0de668ebc2224653e2f82bb6dfe20e9372ea7b40aac5c
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## [v0.3.2](https://github.com/limitusus/toggl-worktime/tree/v0.3.2) (2018-09-26)
|
4
|
+
[Full Changelog](https://github.com/limitusus/toggl-worktime/compare/v0.3.1...v0.3.2)
|
5
|
+
|
6
|
+
**Merged pull requests:**
|
7
|
+
|
8
|
+
- Deal with empty time slot [\#7](https://github.com/limitusus/toggl-worktime/pull/7) ([limitusus](https://github.com/limitusus))
|
9
|
+
|
3
10
|
## [v0.3.1](https://github.com/limitusus/toggl-worktime/tree/v0.3.1) (2018-09-26)
|
4
11
|
[Full Changelog](https://github.com/limitusus/toggl-worktime/compare/v0.3.0...v0.3.1)
|
5
12
|
|
data/README.md
CHANGED
@@ -33,6 +33,47 @@ worktime
|
|
33
33
|
nil - nil
|
34
34
|
```
|
35
35
|
|
36
|
+
## Calendar mode
|
37
|
+
|
38
|
+
You can see your monthly worktime in calendar view
|
39
|
+
|
40
|
+
```console
|
41
|
+
$ toggl-worktime --calendar 2021 1
|
42
|
+
┌────────┬─────────────────┬─────────────────┬─────────────────┬─────────────────┬─────────────────┬────────┐
|
43
|
+
│Sun │Mon │Tue │Wed │Thu │Fri │Sat │
|
44
|
+
├────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼────────┤
|
45
|
+
│ │ │ │ │ │Day: 1 │Day: 2 │
|
46
|
+
│ │ │ │ │ │- │- │
|
47
|
+
│ │ │ │ │ │00:00:00 │00:00:00│
|
48
|
+
├────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼────────┤
|
49
|
+
│Day: 3 │Day: 4 │Day: 5 │Day: 6 │Day: 7 │Day: 8 │Day: 9 │
|
50
|
+
│- │- │10:00:00-18:00:00│10:00:00-18:00:00│10:00:00-18:00:00│10:00:00-18:00:00│- │
|
51
|
+
│00:00:00│00:00:00 │07:00:00 │07:00:00 │07:00:00 │07:00:00 │00:00:00│
|
52
|
+
├────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼────────┤
|
53
|
+
│Day: 10 │Day: 11 │Day: 12 │Day: 13 │Day: 14 │Day: 15 │Day: 16 │
|
54
|
+
│- │- │10:00:00-18:00:00│10:00:00-18:00:00│10:00:00-18:00:00│10:00:00-18:00:00│- │
|
55
|
+
│00:00:00│00:00:00 │07:00:00 │07:00:00 │07:00:00 │07:00:00 │00:00:00│
|
56
|
+
├────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼────────┤
|
57
|
+
│Day: 17 │Day: 18 │Day: 19 │Day: 20 │Day: 21 │Day: 22 │Day: 23 │
|
58
|
+
│- │10:00:00-18:00:00│10:00:00-18:00:00│10:00:00-18:00:00│10:00:00-18:00:00│10:00:00-18:00:00│- │
|
59
|
+
│00:00:00│07:00:00 │07:00:00 │07:00:00 │07:00:00 │07:00:00 │00:00:00│
|
60
|
+
├────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼────────┤
|
61
|
+
│Day: 24 │Day: 25 │Day: 26 │Day: 27 │Day: 28 │Day: 29 │Day: 30 │
|
62
|
+
│- │10:00:00-18:00:00│10:00:00-18:00:00│10:00:00-18:00:00│10:00:00-18:00:00│10:00:00-18:00:00│- │
|
63
|
+
│00:00:00│07:00:00 │07:00:00 │07:00:00 │07:00:00 │07:00:00 │00:00:00│
|
64
|
+
├────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼─────────────────┼────────┤
|
65
|
+
│Day: 31 │ │ │ │ │ │ │
|
66
|
+
│- │ │ │ │ │ │ │
|
67
|
+
│00:00:00│ │ │ │ │ │ │
|
68
|
+
└────────┴─────────────────┴─────────────────┴─────────────────┴─────────────────┴─────────────────┴────────┘
|
69
|
+
```
|
70
|
+
|
71
|
+
You can change the beginning day of the week with `-b` option:
|
72
|
+
|
73
|
+
```console
|
74
|
+
$ toggl-worktime --calendar 2021 1 -b Mon
|
75
|
+
```
|
76
|
+
|
36
77
|
## Installation
|
37
78
|
|
38
79
|
Add this line to your application's Gemfile:
|
data/exe/toggl-worktime
CHANGED
@@ -9,10 +9,14 @@ require 'toggl/worktime'
|
|
9
9
|
|
10
10
|
Version = Toggl::Worktime::VERSION
|
11
11
|
config_file = "#{ENV['HOME']}/.toggl_worktime"
|
12
|
+
mode = :default
|
13
|
+
week_begin = :Sun
|
12
14
|
debug = false
|
13
15
|
|
14
16
|
opt = OptionParser.new
|
15
17
|
opt.on('-c CONFIG', '--config CONFIG') { |v| config_file = v }
|
18
|
+
opt.on('-l', '--calendar', 'Calendar view mode') { mode = :calendar }
|
19
|
+
opt.on('-b', '--week-begin=VAL', 'Beginning of the week: Sun, Mon, etc.') { |v| week_begin = v }
|
16
20
|
opt.on('--debug') { |v| debug = v }
|
17
21
|
opt.parse!(ARGV)
|
18
22
|
|
@@ -20,21 +24,29 @@ config = Toggl::Worktime::Config.new(path: config_file)
|
|
20
24
|
driver = Toggl::Worktime::Driver.new(config: config)
|
21
25
|
p config if debug
|
22
26
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
27
|
+
case mode
|
28
|
+
when :calendar
|
29
|
+
raise ArgumentError, 'Usage: toggl-worktime --cal YEAR MONTH' if ARGV.size != 2
|
30
|
+
|
31
|
+
driver.calendar(week_begin, *ARGV.map(&:to_i)).write
|
28
32
|
else
|
29
|
-
|
30
|
-
|
33
|
+
case ARGV.size
|
34
|
+
when 3
|
35
|
+
year, month, day = *ARGV.map(&:to_i)
|
36
|
+
when 2
|
37
|
+
year = Time.now.year
|
38
|
+
month, day = *ARGV.map(&:to_i)
|
39
|
+
else
|
40
|
+
raise ArgumentError, 'Usage: toggl-worktime [YEAR] MONTH DAY'
|
41
|
+
end
|
31
42
|
|
32
|
-
driver.merge!(year, month, day)
|
33
|
-
user = driver.me
|
43
|
+
driver.merge!(year, month, day)
|
44
|
+
user = driver.me
|
34
45
|
|
35
|
-
puts user['fullname']
|
36
|
-
puts 'worktime'
|
46
|
+
puts user['fullname']
|
47
|
+
puts 'worktime'
|
37
48
|
|
38
|
-
driver.write
|
49
|
+
driver.write
|
39
50
|
|
40
|
-
puts "Total worktime: #{driver.total_time}"
|
51
|
+
puts "Total worktime: #{driver.total_time}"
|
52
|
+
end
|
data/lib/toggl/worktime.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'togglv8'
|
4
|
+
require 'date'
|
4
5
|
require 'json'
|
5
6
|
require 'toggl/worktime/version'
|
6
7
|
require 'toggl/worktime/config'
|
7
8
|
require 'toggl/worktime/merger'
|
8
9
|
require 'toggl/worktime/time'
|
9
10
|
require 'toggl/worktime/driver'
|
11
|
+
require 'toggl/worktime/calendar'
|
12
|
+
require 'tty-table'
|
10
13
|
|
11
14
|
module Toggl
|
12
15
|
# Main module
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Toggl
|
4
|
+
module Worktime
|
5
|
+
# Worktime Calendar
|
6
|
+
class Calendar
|
7
|
+
WEEK = %i[Sun Mon Tue Wed Thu Fri Sat].freeze
|
8
|
+
|
9
|
+
class UnknownWeekdayError < StandardError; end
|
10
|
+
|
11
|
+
def initialize(driver, zone_offset, week_begin, year, month)
|
12
|
+
@driver = driver
|
13
|
+
@zone_offset = zone_offset
|
14
|
+
@year = year
|
15
|
+
@month = month
|
16
|
+
today = ::Time.new
|
17
|
+
@days_in_month = Date.new(year, month, -1).day
|
18
|
+
@last_fetch_day = @days_in_month
|
19
|
+
@last_fetch_day = today.day if today.year == year && today.month == month && today.day < @days_in_month
|
20
|
+
@data = nil
|
21
|
+
@week_begin_day = week_begin.to_sym
|
22
|
+
raise UnknownWeekdayError if WEEK.index(@week_begin_day).nil?
|
23
|
+
end
|
24
|
+
|
25
|
+
def week
|
26
|
+
begin_index = WEEK.index(@week_begin_day)
|
27
|
+
WEEK.rotate(begin_index)
|
28
|
+
end
|
29
|
+
|
30
|
+
def write
|
31
|
+
fetch if @data.nil?
|
32
|
+
rotation = week.index(:Sun)
|
33
|
+
table = TTY::Table.new header: week
|
34
|
+
week_data = []
|
35
|
+
@day_data.each do |datum|
|
36
|
+
wday = datum.day.wday
|
37
|
+
# wday may be rotated
|
38
|
+
wday_index = (wday + rotation) % 7
|
39
|
+
week_data[wday_index] = datum.format
|
40
|
+
if wday_index == 6
|
41
|
+
table << week_data
|
42
|
+
week_data = []
|
43
|
+
end
|
44
|
+
end
|
45
|
+
# last week data may exist
|
46
|
+
unless week_data.length.zero?
|
47
|
+
# Padding
|
48
|
+
(7 - week_data.length).times do
|
49
|
+
week_data << nil
|
50
|
+
end
|
51
|
+
table << week_data
|
52
|
+
end
|
53
|
+
multi_renderer = TTY::Table::Renderer::Unicode.new(table, multiline: true)
|
54
|
+
multi_renderer.border.separator = :each_row
|
55
|
+
puts multi_renderer.render
|
56
|
+
end
|
57
|
+
|
58
|
+
def fetch
|
59
|
+
@day_data = []
|
60
|
+
(1..@days_in_month).each do |day|
|
61
|
+
dateobj = Date.new(@year, @month, day)
|
62
|
+
day_datum = nil
|
63
|
+
if day <= @last_fetch_day
|
64
|
+
@driver.merge!(@year, @month, day)
|
65
|
+
time = @driver.total_time
|
66
|
+
begin_at = @driver.work_time.first[0]&.getlocal(@zone_offset)&.strftime('%T')
|
67
|
+
end_at = @driver.work_time.last[1]&.getlocal(@zone_offset)&.strftime('%T')
|
68
|
+
day_datum = Toggl::Worktime::Day.new(dateobj, time, begin_at, end_at)
|
69
|
+
else
|
70
|
+
day_datum = Toggl::Worktime::Day.new(dateobj, 0, '', '')
|
71
|
+
end
|
72
|
+
@day_data << day_datum
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# One-day datum
|
78
|
+
class Day
|
79
|
+
attr_reader :day
|
80
|
+
|
81
|
+
def initialize(day, time, begin_at, end_at)
|
82
|
+
@day = day
|
83
|
+
@time = time
|
84
|
+
@begin = begin_at
|
85
|
+
@end = end_at
|
86
|
+
end
|
87
|
+
|
88
|
+
def format
|
89
|
+
"Day: #{day.day}\n#{@begin}-#{@end}\n#{@time}"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -15,6 +15,11 @@ module Toggl
|
|
15
15
|
@merger = nil
|
16
16
|
@work_time = nil
|
17
17
|
@zone_offset = Toggl::Worktime::Time.zone_offset(@config.timezone)
|
18
|
+
@calendar = nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def calendar(week_begin, year, month)
|
22
|
+
@calendar = Toggl::Worktime::Calendar.new(self, @zone_offset, week_begin, year, month)
|
18
23
|
end
|
19
24
|
|
20
25
|
def time_entries(year, month, day)
|
data/toggl-worktime.gemspec
CHANGED
@@ -24,9 +24,10 @@ Gem::Specification.new do |spec|
|
|
24
24
|
|
25
25
|
spec.add_dependency 'awesome_print'
|
26
26
|
spec.add_dependency 'togglv8'
|
27
|
+
spec.add_dependency 'tty-table'
|
27
28
|
spec.add_development_dependency 'bundler', '~> 1.15'
|
28
29
|
spec.add_development_dependency 'pry'
|
29
|
-
spec.add_development_dependency 'rake', '
|
30
|
+
spec.add_development_dependency 'rake', '>= 12.3.3'
|
30
31
|
spec.add_development_dependency 'rb-readline'
|
31
32
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
32
33
|
spec.add_development_dependency 'rubocop'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: toggl-worktime
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tomoya KABE
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_print
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: tty-table
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,16 +84,16 @@ dependencies:
|
|
70
84
|
name: rake
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
|
-
- - "
|
87
|
+
- - ">="
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
89
|
+
version: 12.3.3
|
76
90
|
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
|
-
- - "
|
94
|
+
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
96
|
+
version: 12.3.3
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: rb-readline
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -144,6 +158,7 @@ files:
|
|
144
158
|
- bin/setup
|
145
159
|
- exe/toggl-worktime
|
146
160
|
- lib/toggl/worktime.rb
|
161
|
+
- lib/toggl/worktime/calendar.rb
|
147
162
|
- lib/toggl/worktime/config.rb
|
148
163
|
- lib/toggl/worktime/driver.rb
|
149
164
|
- lib/toggl/worktime/merger.rb
|
@@ -169,8 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
169
184
|
- !ruby/object:Gem::Version
|
170
185
|
version: '0'
|
171
186
|
requirements: []
|
172
|
-
|
173
|
-
rubygems_version: 2.7.3
|
187
|
+
rubygems_version: 3.1.4
|
174
188
|
signing_key:
|
175
189
|
specification_version: 4
|
176
190
|
summary: '["Summarise Toggl Time Entries", "Summarise Toggl Time Entries", "https://github.com/limitusus/toggl-worktime"]'
|