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 +4 -4
- data/.github/workflows/ci.yml +23 -0
- data/.gitignore +1 -0
- data/exe/toggl-worktime +3 -3
- data/lib/toggl/worktime/calendar.rb +5 -6
- data/lib/toggl/worktime/driver.rb +45 -15
- data/lib/toggl/worktime/merger.rb +7 -5
- data/lib/toggl/worktime/version.rb +1 -1
- data/toggl-worktime.gemspec +1 -0
- metadata +17 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a6bd12811159316cdb35f131f3d312037d80120236c1fb10881431e240fee7ec
|
|
4
|
+
data.tar.gz: 1fb3c3aae79814dad772e3f427bdf0cf1ee9dc00319ab7156037a060f2efe719
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
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.
|
|
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
|
|
64
|
-
@driver.
|
|
65
|
-
|
|
66
|
-
|
|
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 :
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
@
|
|
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
|
-
|
|
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
|
-
|
|
62
|
-
|
|
61
|
+
class << self
|
|
62
|
+
def parse_date(date, zone_offset)
|
|
63
|
+
return nil if date.nil?
|
|
63
64
|
|
|
64
|
-
|
|
65
|
+
::Time.parse(date).getlocal(zone_offset)
|
|
66
|
+
end
|
|
65
67
|
end
|
|
66
68
|
|
|
67
69
|
def continuing(start)
|
data/toggl-worktime.gemspec
CHANGED
|
@@ -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.
|
|
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-
|
|
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"
|