toggl-worktime 0.6.0 → 0.7.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: 2cfe44749042b8e44a2cb4eaf293b35fd8475c087af1040d3dd4af61da35b259
4
- data.tar.gz: 32f74be718a831e0d1a14ddb2fc7ef23b9e1d9dcc3b6b37bd84ad0f2c3bc9e0b
3
+ metadata.gz: a6bd12811159316cdb35f131f3d312037d80120236c1fb10881431e240fee7ec
4
+ data.tar.gz: 1fb3c3aae79814dad772e3f427bdf0cf1ee9dc00319ab7156037a060f2efe719
5
5
  SHA512:
6
- metadata.gz: dcad3dbe2c7aa33865839740bbbffdd6504e83a3fdf819fc80cb2fb96350b1bef30220d4db37aabc0dd46152260cee4e081a2e1fa3fd575b9e4b801262524c66
7
- data.tar.gz: cf32344967d372151d617586eecffa13b9c84e2e6ad3ecbb1b5b4075ddacf1c54d2ac9374c1186a4d2bed1a008096e323f7858d28b6663d1e3c552c00922c2ae
6
+ metadata.gz: '08d5918bf3afb5f6127228ca89cc45c902642d49d27984c68c686d10866283aa3c2ced0a241844a0379628a3186a742b90898c093ae0554c7cb5e19439f5d233'
7
+ data.tar.gz: ed2b0510a16e84597e1dd79944230729415ae188db93e186247e599d2fc2d90c786ff640f0d6e5e5277668d7e0ead5199c590eaec30e7af82ca59c4f7f5d7a15
@@ -0,0 +1,23 @@
1
+ name: rspec CI
2
+
3
+ on:
4
+ push:
5
+
6
+ jobs:
7
+ build:
8
+ runs-on: ubuntu-latest
9
+
10
+ steps:
11
+ - name: Checkout code
12
+ uses: actions/checkout@v6
13
+
14
+ - name: Set up Ruby
15
+ uses: ruby/setup-ruby@v1
16
+ with:
17
+ ruby-version: 3.4.0
18
+
19
+ - name: Install dependencies
20
+ run: bundle install
21
+
22
+ - name: Run Rspec
23
+ run: bundle exec rspec
data/.gitignore CHANGED
@@ -7,6 +7,7 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ /vendor/
10
11
 
11
12
  # rspec failure tracking
12
13
  .rspec_status
data/exe/toggl-worktime CHANGED
@@ -40,13 +40,13 @@ else
40
40
  raise ArgumentError, 'Usage: toggl-worktime [YEAR] MONTH DAY'
41
41
  end
42
42
 
43
- driver.merge!(year, month, day)
43
+ driver.merge_multi!(year, month, day, day)
44
44
  user = driver.me
45
45
 
46
46
  puts user['fullname']
47
47
  puts 'worktime'
48
48
 
49
- driver.write
49
+ driver.write(day)
50
50
 
51
- puts "Total worktime: #{driver.total_time}"
51
+ puts "Total worktime: #{driver.total_time(day: day)}"
52
52
  end
@@ -57,15 +57,14 @@ module Toggl
57
57
 
58
58
  def fetch
59
59
  @day_data = []
60
+ @driver.merge_multi!(@year, @month, 1, @days_in_month)
60
61
  (1..@days_in_month).each do |day|
61
62
  dateobj = Date.new(@year, @month, day)
62
63
  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)
64
+ if @driver.days.include?(day)
65
+ begin_at = @driver.work_time_map[day].first[0]&.getlocal(@zone_offset)&.strftime('%T')
66
+ end_at = @driver.work_time_map[day].last[1]&.getlocal(@zone_offset)&.strftime('%T')
67
+ day_datum = Toggl::Worktime::Day.new(dateobj, @driver.total_time(day: day), begin_at, end_at)
69
68
  else
70
69
  day_datum = Toggl::Worktime::Day.new(dateobj, 0, '', '')
71
70
  end
@@ -7,26 +7,29 @@ module Toggl
7
7
  ONE_DAY_SECONDS = 86_400
8
8
 
9
9
  attr_reader :toggl
10
- attr_reader :work_time
10
+ attr_reader :work_time_map
11
+ attr_reader :days
11
12
 
12
13
  def initialize(config:)
13
14
  @toggl = TogglV9::API.new
14
15
  @config = config
15
- @merger = nil
16
- @work_time = nil
17
16
  @zone_offset = Toggl::Worktime::Time.zone_offset(@config.timezone)
18
17
  @calendar = nil
18
+ @days = []
19
+ @merger_map = {}
20
+ @work_time_map = {}
19
21
  end
20
22
 
21
23
  def calendar(week_begin, year, month)
22
24
  @calendar = Toggl::Worktime::Calendar.new(self, @zone_offset, week_begin, year, month)
23
25
  end
24
26
 
25
- def time_entries(year, month, day)
27
+ # Multi-day time entries in a request
28
+ def time_entries_multi(year, month, begin_day, end_day)
26
29
  beginning_day = ::Time.new(
27
- year, month, day, @config.day_begin_hour, 0, 0, @zone_offset
30
+ year, month, begin_day, @config.day_begin_hour, 0, 0, @zone_offset
28
31
  )
29
- ending_day = beginning_day + ONE_DAY_SECONDS
32
+ ending_day = beginning_day + ONE_DAY_SECONDS * (end_day - begin_day + 1)
30
33
  start_iso = beginning_day.strftime('%FT%T%:z')
31
34
  end_iso = ending_day.strftime('%FT%T%:z')
32
35
  toggl.get_time_entries(start_date: start_iso, end_date: end_iso)
@@ -53,15 +56,41 @@ module Toggl
53
56
  @toggl.me(true)
54
57
  end
55
58
 
56
- def merge!(year, month, day)
57
- time_entries = time_entries(year, month, day)
58
- time_entries = filter_entries(time_entries)
59
- @merger = Toggl::Worktime::Merger.new(time_entries, @config)
60
- @work_time = @merger.merge
59
+ # Generator: Split time_entries for multiple days into days
60
+ def split_by_day(entries_multi)
61
+ current_date = nil
62
+ beginning_day = nil
63
+ time_entries = []
64
+ entries_multi.sort { |a, b| a['start'] <=> b['start'] }.each do |time_entry|
65
+ start_ts = Toggl::Worktime::Merger.parse_date(time_entry['start'], @zone_offset)
66
+ if beginning_day.nil? || beginning_day.strftime('%F') != (start_ts - @config.day_begin_hour * 3600).strftime('%F')
67
+ # Push current buffer
68
+ unless beginning_day.nil?
69
+ yield [beginning_day.day, time_entries]
70
+ end
71
+ time_entries = []
72
+ beginning_day = ::Time.new(
73
+ start_ts.year, start_ts.month, start_ts.day, @config.day_begin_hour, 0, 0, @zone_offset
74
+ )
75
+ ending_day = beginning_day + ONE_DAY_SECONDS
76
+ end
77
+ time_entries << time_entry
78
+ end
79
+ yield [beginning_day.day, time_entries]
80
+ end
81
+
82
+ def merge_multi!(year, month, begin_day, end_day)
83
+ entries_multi = time_entries_multi(year, month, begin_day, end_day)
84
+ time_entries_filtered_multi = filter_entries(entries_multi)
85
+ split_by_day(time_entries_filtered_multi) do |day, time_entries|
86
+ @days << day
87
+ @merger_map[day] = Toggl::Worktime::Merger.new(time_entries, @config)
88
+ @work_time_map[day] = @merger_map[day].merge
89
+ end
61
90
  end
62
91
 
63
- def write
64
- @work_time.each do |span|
92
+ def write(day)
93
+ @work_time_map[day].each do |span|
65
94
  begin_s = time_expr(span[0])
66
95
  end_s = time_expr(span[1])
67
96
  puts "#{begin_s} - #{end_s}"
@@ -72,8 +101,9 @@ module Toggl
72
101
  time ? time.getlocal(@zone_offset).strftime('%F %T') : 'nil'
73
102
  end
74
103
 
75
- def total_time
76
- total_seconds = @merger.total_time.to_i
104
+ def total_time(day:)
105
+ merger = @merger_map[day]
106
+ total_seconds = merger.total_time.to_i
77
107
  hours = total_seconds / (60 * 60)
78
108
  minutes = (total_seconds - (hours * 60 * 60)) / 60
79
109
  seconds = total_seconds % 60
@@ -46,8 +46,8 @@ module Toggl
46
46
  def time_entries_each
47
47
  zone_offset = Toggl::Worktime::Time.zone_offset(@config.timezone)
48
48
  @time_entries.sort { |a, b| a['start'] <=> b['start'] }.each do |te|
49
- start = parse_date(te['start'], zone_offset)
50
- stop = parse_date(te['stop'], zone_offset)
49
+ start = Merger.parse_date(te['start'], zone_offset)
50
+ stop = Merger.parse_date(te['stop'], zone_offset)
51
51
  @last_stop = stop
52
52
  @current_start = start if @current_start.nil?
53
53
  @current_stop = stop if @current_stop.nil?
@@ -58,10 +58,12 @@ module Toggl
58
58
  end
59
59
  end
60
60
 
61
- def parse_date(date, zone_offset)
62
- return nil if date.nil?
61
+ class << self
62
+ def parse_date(date, zone_offset)
63
+ return nil if date.nil?
63
64
 
64
- ::Time.parse(date).getlocal(zone_offset)
65
+ ::Time.parse(date).getlocal(zone_offset)
66
+ end
65
67
  end
66
68
 
67
69
  def continuing(start)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Toggl
4
4
  module Worktime
5
- VERSION = '0.6.0'
5
+ VERSION = '0.7.0'
6
6
  end
7
7
  end
@@ -26,6 +26,7 @@ Gem::Specification.new do |spec|
26
26
  spec.add_dependency 'togglv9', '>= 0.1.0'
27
27
  spec.add_dependency 'tty-table'
28
28
  spec.add_development_dependency 'bundler', '>= 2.2.10'
29
+ spec.add_development_dependency 'gem-release'
29
30
  spec.add_development_dependency 'github_changelog_generator'
30
31
  spec.add_development_dependency 'pry'
31
32
  spec.add_development_dependency 'rake', '>= 12.3.3'
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.6.0
4
+ version: 0.7.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: 2025-07-11 00:00:00.000000000 Z
11
+ date: 2025-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: awesome_print
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: 2.2.10
69
+ - !ruby/object:Gem::Dependency
70
+ name: gem-release
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: github_changelog_generator
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -158,6 +172,7 @@ executables:
158
172
  extensions: []
159
173
  extra_rdoc_files: []
160
174
  files:
175
+ - ".github/workflows/ci.yml"
161
176
  - ".gitignore"
162
177
  - ".rspec"
163
178
  - ".rubocop.yml"