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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2b9f8888bd43de3a041b90dab1ffd3a8b6ba389543926f28d7c55d43373a15bc
4
- data.tar.gz: 37d614878ec772bba329858b12d8849f90d7cd1d1ddf201126889bb8473693ce
3
+ metadata.gz: a50c3becb0b4a9536811b9c003e3cbc611a5dcdacf20169d3f8ed09bd8955003
4
+ data.tar.gz: 80bfb02dc2272c04f8678835a6c5424caf599a5052e6bbb3a6f3d141458d5699
5
5
  SHA512:
6
- metadata.gz: f66f944ca82d54c014c9e9a577614d624edbaf40a8a81d2c7a2107b0ae8a0ba659b05125ca9664f06321b655795ae7fe920605662c58446c5974650e310661e6
7
- data.tar.gz: 14173ac55e5944be336b33fd0d8f25a86c9e4e917465e7d2a9ab69dedad671c2e193b065e99d4ceeaca43338dc6d1388bc6954756dc61e81ae791047ff445faf
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
- if ARGV.size == 3
24
- year, month, day = *ARGV.map(&:to_i)
25
- elsif ARGV.size == 2
26
- year = Time.now.year
27
- month, day = *ARGV.map(&:to_i)
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
- raise ArgumentError, 'Usage: toggl-worktime [YEAR] MONTH DAY'
30
- end
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
@@ -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)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Toggl
4
4
  module Worktime
5
- VERSION = '0.3.2'
5
+ VERSION = '0.4.0'
6
6
  end
7
7
  end
@@ -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', '~> 10.0'
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.3.2
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: 2018-09-26 00:00:00.000000000 Z
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: '10.0'
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: '10.0'
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
- rubyforge_project:
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"]'