toggl-worktime 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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"]'