vgcal 0.2.3 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/Gemfile.lock +12 -9
- data/README.md +27 -2
- data/lib/vgcal/handlers/describer.rb +66 -25
- data/lib/vgcal/my_calendar.rb +12 -22
- data/lib/vgcal/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a8a4820ac5ec51ae8603b18a047717b7c0b12a143c70b04bd4dcff5fe21a349
|
4
|
+
data.tar.gz: 0e97596aecf4228d7c132a2960dcca84f8087402af8eeee99a1ad715432c6b8f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b4da59f8dc452af1ddcc90303a498cdf19af129fa8aa31f69cab379c34d674fc0d1709bfb23b04f958ff319b63cc665bbe4dd17b90a459fa88443a4af1ac7787
|
7
|
+
data.tar.gz: f5c2104b3e9b3928e5d16ab7a6332f32d3dc51c84964d89604a1d285550897cca16f8451017cd337c7234f8b043f41c39578119345d582d242f84ad9635fc043
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.0.
|
1
|
+
3.0.4
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
vgcal (0.
|
4
|
+
vgcal (0.3.3)
|
5
5
|
dotenv
|
6
6
|
google-api-client
|
7
7
|
thor (~> 1.1)
|
@@ -9,7 +9,7 @@ PATH
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
11
11
|
specs:
|
12
|
-
activesupport (6.1.4)
|
12
|
+
activesupport (6.1.4.1)
|
13
13
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
14
14
|
i18n (>= 1.6, < 2)
|
15
15
|
minitest (>= 5.1)
|
@@ -22,7 +22,7 @@ GEM
|
|
22
22
|
declarative (0.0.20)
|
23
23
|
diff-lcs (1.4.4)
|
24
24
|
dotenv (2.7.6)
|
25
|
-
faraday (1.
|
25
|
+
faraday (1.7.1)
|
26
26
|
faraday-em_http (~> 1.0)
|
27
27
|
faraday-em_synchrony (~> 1.0)
|
28
28
|
faraday-excon (~> 1.1)
|
@@ -30,6 +30,7 @@ GEM
|
|
30
30
|
faraday-net_http (~> 1.0)
|
31
31
|
faraday-net_http_persistent (~> 1.1)
|
32
32
|
faraday-patron (~> 1.0)
|
33
|
+
faraday-rack (~> 1.0)
|
33
34
|
multipart-post (>= 1.2, < 3)
|
34
35
|
ruby2_keywords (>= 0.0.4)
|
35
36
|
faraday-em_http (1.0.0)
|
@@ -39,6 +40,7 @@ GEM
|
|
39
40
|
faraday-net_http (1.0.1)
|
40
41
|
faraday-net_http_persistent (1.2.0)
|
41
42
|
faraday-patron (1.0.0)
|
43
|
+
faraday-rack (1.0.0)
|
42
44
|
gems (1.2.0)
|
43
45
|
google-api-client (0.53.0)
|
44
46
|
google-apis-core (~> 0.1)
|
@@ -60,19 +62,19 @@ GEM
|
|
60
62
|
google-apis-core (>= 0.4, < 2.a)
|
61
63
|
google-apis-discovery_v1 (~> 0.5)
|
62
64
|
thor (>= 0.20, < 2.a)
|
63
|
-
googleauth (0.
|
65
|
+
googleauth (0.17.1)
|
64
66
|
faraday (>= 0.17.3, < 2.0)
|
65
67
|
jwt (>= 1.4, < 3.0)
|
66
68
|
memoist (~> 0.16)
|
67
69
|
multi_json (~> 1.11)
|
68
70
|
os (>= 0.9, < 2.0)
|
69
|
-
signet (~> 0.
|
71
|
+
signet (~> 0.15)
|
70
72
|
httpclient (2.8.3)
|
71
73
|
i18n (1.8.10)
|
72
74
|
concurrent-ruby (~> 1.0)
|
73
75
|
jwt (2.2.3)
|
74
76
|
memoist (0.16.2)
|
75
|
-
mini_mime (1.1.
|
77
|
+
mini_mime (1.1.1)
|
76
78
|
minitest (5.14.4)
|
77
79
|
multi_json (1.15.0)
|
78
80
|
multipart-post (2.1.1)
|
@@ -116,8 +118,8 @@ GEM
|
|
116
118
|
parser (>= 3.0.1.1)
|
117
119
|
ruby-progressbar (1.11.0)
|
118
120
|
ruby2_keywords (0.0.5)
|
119
|
-
signet (0.
|
120
|
-
addressable (~> 2.
|
121
|
+
signet (0.16.0)
|
122
|
+
addressable (~> 2.8)
|
121
123
|
faraday (>= 0.17.3, < 2.0)
|
122
124
|
jwt (>= 1.5, < 3.0)
|
123
125
|
multi_json (~> 1.10)
|
@@ -131,6 +133,7 @@ GEM
|
|
131
133
|
zeitwerk (2.4.2)
|
132
134
|
|
133
135
|
PLATFORMS
|
136
|
+
arm64-darwin-21
|
134
137
|
x86_64-darwin-19
|
135
138
|
|
136
139
|
DEPENDENCIES
|
@@ -141,4 +144,4 @@ DEPENDENCIES
|
|
141
144
|
vgcal!
|
142
145
|
|
143
146
|
BUNDLED WITH
|
144
|
-
2.2.
|
147
|
+
2.2.33
|
data/README.md
CHANGED
@@ -46,6 +46,7 @@ Options:
|
|
46
46
|
-n, [--next-week], [--no-next-week] # Show next week tasks
|
47
47
|
-s, [--start-date=N] # Start date. ex.20210701
|
48
48
|
-e, [--end-date=N] # End date. ex.20210728
|
49
|
+
-o, [--output=OUTPUT] # Output format. [text|json]
|
49
50
|
|
50
51
|
Show google calendar
|
51
52
|
$
|
@@ -61,8 +62,8 @@ $ vgcal show
|
|
61
62
|
Period: 2021-07-24T00:00:00+09:00 - 2021-07-24T23:59:59+09:00
|
62
63
|
|
63
64
|
My tasks: 5.25h(0.66day)
|
64
|
-
・all day task 1:
|
65
|
-
・all day task2:
|
65
|
+
・all day task 1: 0h
|
66
|
+
・all day task2: 0h
|
66
67
|
・meeting1: 2.0h
|
67
68
|
・meeting2: 0.25h
|
68
69
|
・meeting3: 3.0h
|
@@ -80,6 +81,30 @@ $ vgcal show -d +1
|
|
80
81
|
|
81
82
|
# Schedule for 2021/07/01 - 2021/07/28
|
82
83
|
$ vgcal show -s 20210701 -e 20210728
|
84
|
+
|
85
|
+
# Formatted json
|
86
|
+
$ vgcal show -o json | jq .
|
87
|
+
{
|
88
|
+
"start_date": "2021-09-05T00:00:00+09:00",
|
89
|
+
"end_date": "2021-09-05T23:59:59+09:00",
|
90
|
+
"tasks": [
|
91
|
+
{
|
92
|
+
"title": "all day task 1",
|
93
|
+
"time": 0,
|
94
|
+
"task_type": "my_task"
|
95
|
+
},
|
96
|
+
{
|
97
|
+
"title": "task a",
|
98
|
+
"time": 1,
|
99
|
+
"task_type": "my_task"
|
100
|
+
},
|
101
|
+
{
|
102
|
+
"title": "task b",
|
103
|
+
"time": 1,
|
104
|
+
"task_type": "my_task"
|
105
|
+
}
|
106
|
+
]
|
107
|
+
}
|
83
108
|
```
|
84
109
|
|
85
110
|
## Development
|
@@ -3,6 +3,7 @@
|
|
3
3
|
require 'thor'
|
4
4
|
require 'vgcal/my_calendar'
|
5
5
|
require 'fileutils'
|
6
|
+
require 'json'
|
6
7
|
|
7
8
|
module Vgcal
|
8
9
|
module Handlers
|
@@ -13,10 +14,11 @@ module Vgcal
|
|
13
14
|
def init
|
14
15
|
vgcal_dir = "#{Dir.home}/.vgcal"
|
15
16
|
cred_json = "#{vgcal_dir}/credentials.json"
|
16
|
-
dot_env
|
17
|
+
dot_env = "#{vgcal_dir}/.env"
|
18
|
+
gem_root = File.expand_path '../../../', __dir__
|
17
19
|
Dir.mkdir(vgcal_dir, 0o755) unless Dir.exist?(vgcal_dir)
|
18
|
-
FileUtils.cp('template-credentials.json', cred_json) unless File.exist?(cred_json)
|
19
|
-
FileUtils.cp('template.env', dot_env) unless File.exist?(dot_env)
|
20
|
+
FileUtils.cp(File.join(gem_root,'template-credentials.json'), cred_json) unless File.exist?(cred_json)
|
21
|
+
FileUtils.cp(File.join(gem_root,'template.env'), dot_env) unless File.exist?(dot_env)
|
20
22
|
puts "Fix the __FIX_ME__ in #{cred_json} and #{dot_env}"
|
21
23
|
end
|
22
24
|
|
@@ -25,28 +27,22 @@ module Vgcal
|
|
25
27
|
option :'next-week', type: :boolean, aliases: '-n', desc: 'Show next week tasks'
|
26
28
|
option :'start-date', type: :numeric, aliases: '-s', desc: 'Start date. ex.20210701'
|
27
29
|
option :'end-date', type: :numeric, aliases: '-e', desc: 'End date. ex.20210728'
|
30
|
+
option :'output', type: :string, aliases: '-o', desc: 'Output format. [text|json]'
|
28
31
|
|
29
32
|
desc 'show', 'Show google calendar'
|
30
33
|
|
31
34
|
def show
|
32
35
|
Dotenv.load("#{Dir.home}/.vgcal/.env")
|
33
|
-
|
34
|
-
puts
|
35
|
-
mcal = MyCalendar.new(start_date, end_date)
|
36
|
+
mcal = MyCalendar.new(start_date, end_date)
|
36
37
|
events = mcal.events
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
46
|
-
meetings = mcal.invited_meetings(events)
|
47
|
-
puts "Invited meetings: #{meetings[0]}h(#{(meetings[0] / 8).round(2)}day)"
|
48
|
-
meetings[1].each do |meeting|
|
49
|
-
puts " ・#{meeting[0]}: #{meeting[1]}h"
|
38
|
+
|
39
|
+
case options[:output]
|
40
|
+
when 'json'
|
41
|
+
stdout_json(mcal.tasks(events), mcal.invited_meetings(events))
|
42
|
+
when 'text'
|
43
|
+
stdout_default(mcal.tasks(events), mcal.invited_meetings(events))
|
44
|
+
else
|
45
|
+
stdout_default(mcal.tasks(events), mcal.invited_meetings(events))
|
50
46
|
end
|
51
47
|
end
|
52
48
|
|
@@ -58,6 +54,55 @@ module Vgcal
|
|
58
54
|
|
59
55
|
private
|
60
56
|
|
57
|
+
def stdout_json(my_tasks, invited_meetings)
|
58
|
+
hash = {
|
59
|
+
'start_date': "#{start_date}",
|
60
|
+
'end_date': "#{end_date}",
|
61
|
+
'tasks': []
|
62
|
+
}
|
63
|
+
my_tasks.each do |task|
|
64
|
+
hash[:tasks].push ({
|
65
|
+
"title": task[0],
|
66
|
+
"time": task[1],
|
67
|
+
"task_type": 'my_task'
|
68
|
+
})
|
69
|
+
end
|
70
|
+
invited_meetings.each do |meeting|
|
71
|
+
hash[:tasks].push ({
|
72
|
+
'title': meeting[0],
|
73
|
+
'time': meeting[1],
|
74
|
+
'task_type': 'invited_meeting'
|
75
|
+
})
|
76
|
+
end
|
77
|
+
puts hash.to_json
|
78
|
+
end
|
79
|
+
|
80
|
+
def stdout_default(my_tasks, invited_meetings)
|
81
|
+
puts "Period: #{start_date} - #{end_date}"
|
82
|
+
puts
|
83
|
+
my_task_time = 0
|
84
|
+
my_tasks.select do |n|
|
85
|
+
my_task_time += n[1]
|
86
|
+
end
|
87
|
+
puts "My tasks: #{my_task_time}h(#{(my_task_time / 8).round(2)}day)"
|
88
|
+
my_tasks.each do |task|
|
89
|
+
if my_tasks.is_a?(String)
|
90
|
+
puts " ・#{task[0]}: #{task[1]}"
|
91
|
+
else
|
92
|
+
puts " ・#{task[0]}: #{task[1]}h"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
meeting_time = 0
|
97
|
+
invited_meetings.select do |m|
|
98
|
+
meeting_time += m[1]
|
99
|
+
end
|
100
|
+
puts "Invited meetings: #{meeting_time}h(#{(meeting_time / 8).round(2)}day)"
|
101
|
+
invited_meetings.each do |meeting|
|
102
|
+
puts " ・#{meeting[0]}: #{meeting[1]}h"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
61
106
|
def start_date
|
62
107
|
s_date = if options[:'current-week']
|
63
108
|
if Date.today.sunday?
|
@@ -97,7 +142,7 @@ module Vgcal
|
|
97
142
|
end
|
98
143
|
elsif options[:'next-week']
|
99
144
|
if Date.today.sunday?
|
100
|
-
(Date.today +
|
145
|
+
(Date.today + 13).to_s
|
101
146
|
else
|
102
147
|
(Date.today + 7 + (6 - Date.today.wday)).to_s
|
103
148
|
end
|
@@ -113,11 +158,7 @@ module Vgcal
|
|
113
158
|
elsif options['start-date'] && options['end-date']
|
114
159
|
Date.parse(options['end-date'].to_s)
|
115
160
|
else
|
116
|
-
|
117
|
-
(Date.today + 6).to_s
|
118
|
-
else
|
119
|
-
(Date.today + (6 - Date.today.wday)).to_s
|
120
|
-
end
|
161
|
+
Date.today.to_s
|
121
162
|
end
|
122
163
|
"#{e_date}T23:59:59+09:00"
|
123
164
|
end
|
data/lib/vgcal/my_calendar.rb
CHANGED
@@ -8,29 +8,28 @@ module Vgcal
|
|
8
8
|
class MyCalendar
|
9
9
|
def initialize(start_date, end_date)
|
10
10
|
@start_date = start_date
|
11
|
-
@end_date
|
11
|
+
@end_date = end_date
|
12
12
|
end
|
13
13
|
|
14
14
|
def events
|
15
|
-
service
|
15
|
+
service = Google::Apis::CalendarV3::CalendarService.new
|
16
16
|
service.authorization = Vgcal::Authorizer.new.credentials
|
17
|
-
calendar_id
|
17
|
+
calendar_id = 'primary'
|
18
18
|
service.list_events(calendar_id,
|
19
|
-
max_results:
|
19
|
+
max_results: 100,
|
20
20
|
single_events: true,
|
21
|
-
order_by:
|
22
|
-
time_min:
|
23
|
-
time_max:
|
21
|
+
order_by: 'startTime',
|
22
|
+
time_min: @start_date,
|
23
|
+
time_max: @end_date)
|
24
24
|
end
|
25
25
|
|
26
|
-
# return: [
|
26
|
+
# return: [["daily scrum", 0.25], ["SRE定例", 1.0], ["test", 2.0], ["task2", 1.0]]
|
27
27
|
def tasks(events)
|
28
|
-
total_meeting_times = 0
|
29
28
|
tasks_hash = {}
|
30
29
|
events.items.each do |e|
|
31
30
|
if e.organizer.email.include?(my_email_address) && !e.summary.start_with?(*hide_words)
|
32
31
|
if all_day_event?(e.start.date)
|
33
|
-
tasks_hash[e.summary] =
|
32
|
+
tasks_hash[e.summary] = 0
|
34
33
|
else
|
35
34
|
task_time = (e.end.date_time - e.start.date_time).to_f * 24
|
36
35
|
# 1日の中で同じタスク名が複数あったら時間を集計する。例.午前と午後それぞれでAプロジェクトに1時間スケジュール
|
@@ -39,19 +38,14 @@ module Vgcal
|
|
39
38
|
else
|
40
39
|
tasks_hash[e.summary] = task_time
|
41
40
|
end
|
42
|
-
total_meeting_times = 0
|
43
|
-
tasks_hash.each do |h|
|
44
|
-
total_meeting_times += h.to_ary[1] unless h.to_ary[1].is_a?(String)
|
45
|
-
end
|
46
41
|
end
|
47
42
|
end
|
48
43
|
end
|
49
|
-
|
44
|
+
tasks_hash.sort.to_a
|
50
45
|
end
|
51
46
|
|
52
|
-
# return: [
|
47
|
+
# return: [["朝会", 0.5], ["daily scrum", 0.25], ["SRE朝会", 0.5], ["定例", 1.0]]
|
53
48
|
def invited_meetings(events)
|
54
|
-
total_meeting_times = 0
|
55
49
|
tasks_hash = {}
|
56
50
|
events.items.each do |e|
|
57
51
|
next if e.organizer.email.include?(my_email_address) || e.summary.start_with?(*hide_words)
|
@@ -67,13 +61,9 @@ module Vgcal
|
|
67
61
|
else
|
68
62
|
tasks_hash[e.summary] = task_time
|
69
63
|
end
|
70
|
-
total_meeting_times = 0
|
71
|
-
tasks_hash.each do |h|
|
72
|
-
total_meeting_times += h.to_ary[1]
|
73
|
-
end
|
74
64
|
end
|
75
65
|
end
|
76
|
-
|
66
|
+
tasks_hash.sort.to_a
|
77
67
|
end
|
78
68
|
|
79
69
|
private
|
data/lib/vgcal/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vgcal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shota Ito
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-08-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -155,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
155
155
|
- !ruby/object:Gem::Version
|
156
156
|
version: '0'
|
157
157
|
requirements: []
|
158
|
-
rubygems_version: 3.2.
|
158
|
+
rubygems_version: 3.2.33
|
159
159
|
signing_key:
|
160
160
|
specification_version: 4
|
161
161
|
summary: "%q{The vgcal command simplifies the display of Google Calendar events.}"
|