calendar-assistant 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/README.md +280 -202
- data/Rakefile +9 -1
- data/lib/calendar_assistant.rb +35 -187
- data/lib/calendar_assistant/authorizer.rb +0 -3
- data/lib/calendar_assistant/calendar_assistant.rb +122 -0
- data/lib/calendar_assistant/cli.rb +84 -54
- data/lib/calendar_assistant/cli_helpers.rb +101 -38
- data/lib/calendar_assistant/config.rb +71 -12
- data/lib/calendar_assistant/date_helpers.rb +16 -0
- data/lib/calendar_assistant/event.rb +124 -14
- data/lib/calendar_assistant/event_repository.rb +30 -19
- data/lib/calendar_assistant/event_repository_factory.rb +7 -0
- data/lib/calendar_assistant/event_set.rb +124 -0
- data/lib/calendar_assistant/extensions/{event_date_time_extensions.rb → google_apis_extensions.rb} +5 -6
- data/lib/calendar_assistant/local_service.rb +82 -0
- data/lib/calendar_assistant/scheduler.rb +45 -0
- data/lib/calendar_assistant/string_helpers.rb +0 -2
- data/lib/calendar_assistant/version.rb +1 -1
- metadata +9 -4
- data/lib/calendar_assistant/extensions/event_extensions.rb +0 -71
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 98a2b95396339756f78030efdc8bab6106b47f9c09f5363d9a7097736fa2e10a
|
4
|
+
data.tar.gz: b2ce18e6aceeae81a41975bd9126901aede98b272023d625ef1fe63b59c27264
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 07b2596d086f9d0a7e87545e22ed287488c53935de4cc5e56b6e3578bd7265b1f2bdd14f974f717b0809e404c86fc95100c106664240aac86e812dfd4845cab7
|
7
|
+
data.tar.gz: e7bb29fb7dfe084cd30ddb5b339722e6204fa460c895c3c4e67f289cc78e69e321e80c645aa415ce96e90313e7f87cc90cd9a32f39093bc06cfe56c13c330ec4
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,32 +1,50 @@
|
|
1
|
-
|
2
1
|
# calendar assistant
|
3
2
|
|
4
|
-
A command-line tool to help
|
3
|
+
A command-line tool to help you manage your Google Calendar.
|
5
4
|
|
6
|
-
- book (and re-book) one-on-ones and other meetings automatically
|
7
|
-
- set up all-day events to let people know your location in the world
|
8
5
|
- easily join the videoconference for your current meeting
|
6
|
+
- see yours and others' "availability" suitable for an email response
|
7
|
+
- set up all-day events to let people know where you are (for frequent travelers)
|
8
|
+
- see views on your calendar events for a date or time range
|
9
|
+
- book (and re-book) one-on-ones and other meetings automatically
|
9
10
|
|
10
11
|
[![Concourse CI](https://ci.nokogiri.org/api/v1/teams/calendar-assistants/pipelines/calendar-assistant/jobs/rake-spec/badge)](https://ci.nokogiri.org/teams/calendar-assistants/pipelines/calendar-assistant)
|
11
12
|
[![Maintainability](https://api.codeclimate.com/v1/badges/3525792e1feeccfd8875/maintainability)](https://codeclimate.com/github/flavorjones/calendar-assistant/maintainability)
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
14
|
+
<!-- toc -->
|
15
|
+
|
16
|
+
- [Features](#features)
|
17
|
+
* [Pretty Display in Your Terminal](#pretty-display-in-your-terminal)
|
18
|
+
* [Human-Friendly Date and Time Specification](#human-friendly-date-and-time-specification)
|
19
|
+
* [Human-Friendly Duration Specification](#human-friendly-duration-specification)
|
20
|
+
* [Preferences](#preferences)
|
21
|
+
- [Setup](#setup)
|
22
|
+
* [Installation](#installation)
|
23
|
+
* [Set up a Google Cloud Project with API access](#set-up-a-google-cloud-project-with-api-access)
|
24
|
+
* [Authorize access to your Google Calendar](#authorize-access-to-your-google-calendar)
|
25
|
+
- [Commands](#commands)
|
26
|
+
* [`join`: Join a video call attached to a meeting](#join-join-a-video-call-attached-to-a-meeting)
|
27
|
+
* [`availability`: Find people's availability for meetings](#availability-find-peoples-availability-for-meetings)
|
28
|
+
* [`location-set`: Tell people where you are in the world](#location-set-tell-people-where-you-are-in-the-world)
|
29
|
+
* [`location`: View where you're going to be in the world](#location-view-where-youre-going-to-be-in-the-world)
|
30
|
+
* [`show`: View your calendar events](#show-view-your-calendar-events)
|
31
|
+
* [`config`: View your configuration parameters](#config-view-your-configuration-parameters)
|
32
|
+
- [Development](#development)
|
33
|
+
* [Tests](#tests)
|
34
|
+
* [Generate README](#generate-readme)
|
35
|
+
- [References](#references)
|
36
|
+
- [License](#license)
|
37
|
+
|
38
|
+
<!-- tocstop -->
|
21
39
|
|
22
40
|
## Features
|
23
41
|
|
24
|
-
### Pretty Display
|
42
|
+
### Pretty Display in Your Terminal
|
25
43
|
|
26
|
-
Events are nicely formatted, with faint strikeouts for events you've declined, and some additional attributes listed when present (e.g., "
|
44
|
+
Events are nicely formatted, with faint strikeouts for events you've declined, and some additional attributes listed when present (e.g., "awaiting", "self", "not-busy", "1:1" ...)
|
27
45
|
|
28
46
|
|
29
|
-
### Date and Time Specification
|
47
|
+
### Human-Friendly Date and Time Specification
|
30
48
|
|
31
49
|
All dates and times are interpreted by [Chronic](https://github.com/mojombo/chronic) and so can be fuzzy terms like "tomorrow", "tuesday", "next thursday", and "two days from now" as well as specific dates and times.
|
32
50
|
|
@@ -38,178 +56,98 @@ For a date range or a datetime range, split the start and end with `..` or `...`
|
|
38
56
|
Also note that every command will adopt an intelligent default, which is generally "today" or "now".
|
39
57
|
|
40
58
|
|
41
|
-
### Duration Specification
|
59
|
+
### Human-Friendly Duration Specification
|
42
60
|
|
43
61
|
Some duration-related preferences are interpreted by [ChronicDuration](https://github.com/henrypoydar/chronic_duration) and so can be terms like "10m", "30 minutes", "four hours", etc.
|
44
62
|
|
45
63
|
|
46
64
|
### Preferences
|
47
65
|
|
48
|
-
All tokens and preferences will be stored in `~/.calendar-assistant` which is in TOML format.
|
66
|
+
All tokens and preferences will be stored in `~/.calendar-assistant` which is in TOML format for easy editing.
|
49
67
|
|
50
68
|
|
51
|
-
##
|
52
|
-
|
53
|
-
<pre>
|
54
|
-
<b>$</b> calendar-assistant help
|
55
|
-
Commands:
|
56
|
-
calendar-assistant authorize PROFILE_NAME # create (or validate) a profile named NAME with calendar access
|
57
|
-
calendar-assistant availability [DATE | DATERANGE | TIMERANGE] # Show your availability for a date or range of dates (default 'today')
|
58
|
-
calendar-assistant config # Dump your configuration parameters (merge of defaults and overrides from /home/flavorjones/.calendar-assistant)
|
59
|
-
calendar-assistant help [COMMAND] # Describe available commands or one specific command
|
60
|
-
calendar-assistant join [TIME] # Open the URL for a video call attached to your meeting at time TIME (default 'now')
|
61
|
-
calendar-assistant location [DATE | DATERANGE] # Show your location for a date or range of dates (default 'today')
|
62
|
-
calendar-assistant location-set LOCATION [DATE | DATERANGE] # Set your location to LOCATION for a date or range of dates (default 'today')
|
63
|
-
calendar-assistant show [DATE | DATERANGE | TIMERANGE] # Show your events for a date or range of dates (default 'today')
|
69
|
+
## Setup
|
64
70
|
|
65
|
-
|
66
|
-
-h, -?, [--help], [--no-help]
|
67
|
-
-p, [--profile=PROFILE] # the profile you'd like to use (if different from default)
|
68
|
-
[--debug], [--no-debug] # how dare you suggest there are bugs
|
69
|
-
</pre>
|
71
|
+
### Installation
|
70
72
|
|
73
|
+
Install the gem: `gem install calendar-assistant`.
|
71
74
|
|
72
|
-
### View your configuration parameters
|
73
75
|
|
74
|
-
|
76
|
+
### Set up a Google Cloud Project with API access
|
75
77
|
|
76
78
|
<pre>
|
77
|
-
<b>$</b> calendar-assistant help config
|
78
79
|
Usage:
|
79
|
-
calendar-assistant
|
80
|
+
calendar-assistant setup
|
80
81
|
|
81
82
|
Options:
|
82
83
|
-h, -?, [--help], [--no-help]
|
83
|
-
-p, [--profile=PROFILE] # the profile you'd like to use (if different from default)
|
84
84
|
[--debug], [--no-debug] # how dare you suggest there are bugs
|
85
85
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
The output is TOML, which is suitable for dumping into `~/.calendar-assistant` and editing.
|
90
|
-
|
91
|
-
<pre>
|
92
|
-
<b>$</b> calendar-assistant config
|
86
|
+
Description:
|
87
|
+
This command will walk you through setting up a Google Cloud Project, enabling the Google Calendar
|
88
|
+
API, and saving the credentials necessary to access the API on behalf of users.
|
93
89
|
|
94
|
-
|
95
|
-
|
96
|
-
meeting-length = "30m"
|
97
|
-
profile = "work"
|
98
|
-
start-of-day = "9am"
|
90
|
+
If you already have downloaded client credentials, you don't need to run this command. Instead,
|
91
|
+
rename the downloaded JSON file to `/home/user/.calendar-assistant.client`
|
99
92
|
</pre>
|
100
93
|
|
101
94
|
|
102
95
|
### Authorize access to your Google Calendar
|
103
96
|
|
104
97
|
<pre>
|
105
|
-
<b>$</b> calendar-assistant help authorize
|
106
98
|
Usage:
|
107
99
|
calendar-assistant authorize PROFILE_NAME
|
108
100
|
|
109
101
|
Options:
|
110
102
|
-h, -?, [--help], [--no-help]
|
111
|
-
-p, [--profile=PROFILE] # the profile you'd like to use (if different from default)
|
112
103
|
[--debug], [--no-debug] # how dare you suggest there are bugs
|
113
104
|
|
114
105
|
Description:
|
115
|
-
Create and authorize a named profile (e.g., "work", "home", "
|
116
|
-
|
117
|
-
When setting up a profile, you'll be asked to visit a URL to authenticate, grant authorization, and generate and persist an access token.
|
106
|
+
Create and authorize a named profile (e.g., "work", "home", "flastname@company.tld") to access your
|
107
|
+
calendar.
|
118
108
|
|
119
|
-
|
109
|
+
When setting up a profile, you'll be asked to visit a URL to authenticate, grant authorization, and
|
110
|
+
generate and persist an access token.
|
120
111
|
|
121
|
-
|
122
|
-
|
123
|
-
Namely, the prerequisites are:
|
124
|
-
1. Turn on the Google API for your account
|
125
|
-
2. Create a new Google API Project
|
126
|
-
3. Download the configuration file for the Project, and name it as `credentials.json`
|
112
|
+
In order for this to work, you'll need to have set up your API client credentials. Run
|
113
|
+
`calendar-assistant help setup` for instructions.
|
127
114
|
</pre>
|
128
115
|
|
129
|
-
This command will generate a URL which you should load in your browser while logged in as the Google account you wish to authorize. Generate a token, and paste the token back into `calendar-assistant`.
|
130
|
-
|
131
|
-
Your access token will be stored in `~/.calendar-assistant` in the `[tokens]` section.
|
132
116
|
|
133
|
-
|
134
|
-
### Display your calendar events
|
117
|
+
## Commands
|
135
118
|
|
136
119
|
<pre>
|
137
|
-
|
138
|
-
|
139
|
-
calendar-assistant
|
120
|
+
Commands:
|
121
|
+
calendar-assistant authorize PROFILE_NAME # create (or validate) a profil...
|
122
|
+
calendar-assistant availability [DATE | DATERANGE | TIMERANGE] # Show your availability for a ...
|
123
|
+
calendar-assistant config # Dump your configuration param...
|
124
|
+
calendar-assistant help [COMMAND] # Describe available commands o...
|
125
|
+
calendar-assistant join [TIME] # Open the URL for a video call...
|
126
|
+
calendar-assistant location [DATE | DATERANGE] # Show your location for a date...
|
127
|
+
calendar-assistant location-set LOCATION [DATE | DATERANGE] # Set your location to LOCATION...
|
128
|
+
calendar-assistant setup # Link your local calendar-assi...
|
129
|
+
calendar-assistant show [DATE | DATERANGE | TIMERANGE] # Show your events for a date o...
|
130
|
+
calendar-assistant version # Display the version of calend...
|
140
131
|
|
141
132
|
Options:
|
142
|
-
-
|
143
|
-
|
144
|
-
-p, [--profile=PROFILE] # the profile you'd like to use (if different from default)
|
145
|
-
[--debug], [--no-debug] # how dare you suggest there are bugs
|
146
|
-
|
147
|
-
Show your events for a date or range of dates (default 'today')
|
148
|
-
</pre>
|
149
|
-
|
150
|
-
For example: display all events scheduled for tomorrow:
|
151
|
-
|
152
|
-
<pre>
|
153
|
-
<b>$</b> calendar-assistant show --profile=work 2018-10-01
|
154
|
-
<i>me@example.com (all times in America/New_York)
|
155
|
-
</i>
|
156
|
-
2018-10-01 <b> | 🗺 Mines of Moria </b><i> (not-busy, self)</i>
|
157
|
-
<strike>2018-10-01 03:30 - 05:00 | Generate enterprise portals </strike>
|
158
|
-
<strike>2018-10-01 07:30 - 08:30 | Incentivize wireless functionalities </strike>
|
159
|
-
<strike>2018-10-01 07:30 - 08:30 | Brand end-to-end action-items </strike>
|
160
|
-
2018-10-01 08:00 - 09:00<b> | Grow web-enabled synergies </b><i> (recurring, self)</i>
|
161
|
-
2018-10-01 09:00 - 10:30<b> | Disintermediate integrated web services </b><i> (self)</i>
|
162
|
-
2018-10-01 10:30 - 10:55<b> | Architect sticky synergies </b><i> (1:1, recurring)</i>
|
163
|
-
2018-10-01 11:00 - 11:30<b> | Leverage out-of-the-box supply-chains </b><i> (recurring)</i>
|
164
|
-
2018-10-01 11:30 - 12:00<b> | Architect dot-com portals </b><i> (1:1, recurring)</i>
|
165
|
-
<strike>2018-10-01 11:50 - 12:00 | Grow out-of-the-box convergence </strike>
|
166
|
-
2018-10-01 12:00 - 12:30<b> | Morph leading-edge experiences </b><i> (self)</i>
|
167
|
-
<strike>2018-10-01 12:15 - 12:30 | Revolutionize innovative communities </strike>
|
168
|
-
<strike>2018-10-01 12:30 - 13:30 | Evolve mission-critical e-services </strike>
|
169
|
-
2018-10-01 12:30 - 13:30<b> | Embrace world-class e-tailers </b><i> (recurring)</i>
|
170
|
-
2018-10-01 13:30 - 14:50<b> | Deliver out-of-the-box infomediaries </b><i> (self)</i>
|
171
|
-
<strike>2018-10-01 13:30 - 14:30 | Transform user-centric e-tailers </strike>
|
172
|
-
2018-10-01 15:00 - 15:30<b> | Aggregate magnetic e-business </b><i> (1:1)</i>
|
173
|
-
2018-10-01 16:00 - 17:00<b> | Leverage turn-key e-tailers </b><i> (1:1, recurring)</i>
|
174
|
-
2018-10-01 16:45 - 17:00<b> | Monetize real-time interfaces </b><i> (recurring)</i>
|
175
|
-
2018-10-01 17:00 - 17:30<b> | Generate out-of-the-box technologies </b><i> (recurring)</i>
|
176
|
-
2018-10-01 17:30 - 17:55<b> | Strategize enterprise communities </b><i> (1:1, recurring)</i>
|
177
|
-
<strike>2018-10-01 18:00 - 20:30 | Redefine 24/365 infrastructures </strike>
|
178
|
-
<strike>2018-10-01 18:30 - 19:00 | Innovate vertical e-business </strike>
|
179
|
-
<strike>2018-10-01 19:00 - 19:30 | Repurpose seamless deliverables </strike>
|
180
|
-
</pre>
|
181
|
-
|
182
|
-
Display _only_ the commitments I have to other people using the `-c` option:
|
183
|
-
|
184
|
-
<pre>
|
185
|
-
<b>$</b> calendar-assistant show -c 2018-10-01
|
186
|
-
<i>me@example.com (all times in America/New_York)
|
187
|
-
</i>
|
188
|
-
2018-10-01 10:30 - 10:55<b> | Exploit b2b synergies </b><i> (1:1, recurring)</i>
|
189
|
-
2018-10-01 11:00 - 11:30<b> | Reinvent customized systems </b><i> (recurring)</i>
|
190
|
-
2018-10-01 11:30 - 12:00<b> | Incentivize visionary users </b><i> (1:1, recurring)</i>
|
191
|
-
2018-10-01 12:30 - 13:30<b> | Engineer robust roi </b><i> (recurring)</i>
|
192
|
-
2018-10-01 15:00 - 15:30<b> | Exploit next-generation content </b><i> (1:1)</i>
|
193
|
-
2018-10-01 16:00 - 17:00<b> | Integrate sticky platforms </b><i> (1:1, recurring)</i>
|
194
|
-
2018-10-01 16:45 - 17:00<b> | Enhance intuitive portals </b><i> (recurring)</i>
|
195
|
-
2018-10-01 17:00 - 17:30<b> | Reinvent viral platforms </b><i> (recurring)</i>
|
196
|
-
2018-10-01 17:30 - 17:55<b> | Incubate magnetic interfaces </b><i> (1:1, recurring)</i>
|
133
|
+
-h, -?, [--help], [--no-help]
|
134
|
+
[--debug], [--no-debug] # how dare you suggest there are bugs
|
197
135
|
</pre>
|
198
136
|
|
199
137
|
|
200
|
-
### Join a video call attached to a meeting
|
138
|
+
### `join`: Join a video call attached to a meeting
|
201
139
|
|
202
140
|
<pre>
|
203
|
-
<b>$</b> calendar-assistant help join
|
204
141
|
Usage:
|
205
142
|
calendar-assistant join [TIME]
|
206
143
|
|
207
144
|
Options:
|
208
|
-
[--join], [--no-join]
|
209
|
-
|
210
|
-
-
|
211
|
-
|
212
|
-
|
145
|
+
[--join], [--no-join] # launch a browser to join the video call URL
|
146
|
+
# Default: true
|
147
|
+
-p, [--profile=PROFILE] # the profile you'd like to use (if different from default)
|
148
|
+
[--local-store=FILENAME] # Load events from a local file instead of Google Calendar
|
149
|
+
-h, -?, [--help], [--no-help]
|
150
|
+
[--debug], [--no-debug] # how dare you suggest there are bugs
|
213
151
|
|
214
152
|
Open the URL for a video call attached to your meeting at time TIME (default 'now')
|
215
153
|
</pre>
|
@@ -218,33 +156,39 @@ Some examples:
|
|
218
156
|
|
219
157
|
<pre>
|
220
158
|
<b>$</b> calendar-assistant join
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
<
|
226
|
-
|
227
|
-
|
228
|
-
|
159
|
+
<i>me@example.com</i>
|
160
|
+
|
161
|
+
2018-10-01 11:30 - 12:00<b> | Facilitate customized web-readiness </b><i> (1:1, recurring)</i>
|
162
|
+
|
163
|
+
https://pivotal.zoom.us/j/ABC90210 <i># ... and opens the videoconference URL</i>
|
164
|
+
|
165
|
+
|
166
|
+
<b>$</b> calendar-assistant join work 11:30 --no-join
|
167
|
+
<i>me@example.com</i>
|
168
|
+
|
169
|
+
2018-10-01 11:30 - 12:00<b> | Facilitate customized web-readiness </b><i> (1:1, recurring)</i>
|
170
|
+
|
171
|
+
https://pivotal.zoom.us/j/ABC90210 <i># ... and does not open the URL</i>
|
229
172
|
</pre>
|
230
173
|
|
231
174
|
|
232
|
-
### Find
|
175
|
+
### `availability`: Find people's availability for meetings
|
233
176
|
|
234
177
|
This is useful for emailing people your availability. It only considers `accepted` meetings when determining busy/free.
|
235
178
|
|
236
179
|
<pre>
|
237
|
-
<b>$</b> calendar-assistant help availability
|
238
180
|
Usage:
|
239
181
|
calendar-assistant availability [DATE | DATERANGE | TIMERANGE]
|
240
182
|
|
241
183
|
Options:
|
242
|
-
-l, [--meeting-length=LENGTH]
|
243
|
-
-s, [--start-of-day=TIME]
|
244
|
-
-e, [--end-of-day=TIME]
|
245
|
-
-
|
246
|
-
-p, [--profile=PROFILE]
|
247
|
-
[--
|
184
|
+
-l, [--meeting-length=LENGTH] # [default 30m] find chunks of available time at least as long as LENGTH (which is a ChronicDuration string like '30m' or '2h')
|
185
|
+
-s, [--start-of-day=TIME] # [default 9am] find chunks of available time after TIME (which is a BusinessTime string like '9am' or '14:30')
|
186
|
+
-e, [--end-of-day=TIME] # [default 6pm] find chunks of available time before TIME (which is a BusinessTime string like '9am' or '14:30')
|
187
|
+
-a, [--attendees=ATTENDEE1[,ATTENDEE2[,...]]] # [default 'me'] people (email IDs) to whom this command will be applied
|
188
|
+
-p, [--profile=PROFILE] # the profile you'd like to use (if different from default)
|
189
|
+
[--local-store=FILENAME] # Load events from a local file instead of Google Calendar
|
190
|
+
-h, -?, [--help], [--no-help]
|
191
|
+
[--debug], [--no-debug] # how dare you suggest there are bugs
|
248
192
|
|
249
193
|
Show your availability for a date or range of dates (default 'today')
|
250
194
|
</pre>
|
@@ -253,72 +197,93 @@ Show your availability for a date or range of dates (default 'today')
|
|
253
197
|
For example: show me my available time over a chunk of time:
|
254
198
|
|
255
199
|
<pre>
|
256
|
-
<b>$</b> calendar-assistant avail 2018-
|
257
|
-
<i>me@example.com
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
<b>Availability on
|
200
|
+
<b>$</b> calendar-assistant avail 2018-11-05..2018-11-07
|
201
|
+
<i>me@example.com</i>
|
202
|
+
<i>- looking for blocks at least 30 mins long</i>
|
203
|
+
<i>- between 9am and 6pm in America/New_York</i>
|
204
|
+
|
205
|
+
<b>Availability on Monday, November 5:
|
262
206
|
</b>
|
263
|
-
•
|
264
|
-
•
|
265
|
-
•
|
207
|
+
• 9:00am - 10:00am EST<i> (1h)</i>
|
208
|
+
• 1:30pm - 2:30pm EST<i> (1h)</i>
|
209
|
+
• 3:30pm - 5:00pm EST<i> (1h 30m)</i>
|
210
|
+
• 5:30pm - 6:00pm EST<i> (30m)</i>
|
266
211
|
|
267
|
-
<b>Availability on
|
212
|
+
<b>Availability on Tuesday, November 6:
|
268
213
|
</b>
|
269
|
-
•
|
270
|
-
•
|
271
|
-
• 1:55pm - 2:30pm
|
272
|
-
• 2:55pm - 3:30pm
|
214
|
+
• 9:00am - 4:30pm EST<i> (7h 30m)</i>
|
215
|
+
• 4:50pm - 6:00pm EST<i> (1h 10m)</i>
|
273
216
|
|
274
|
-
<b>Availability on
|
217
|
+
<b>Availability on Wednesday, November 7:
|
275
218
|
</b>
|
276
|
-
•
|
219
|
+
• 9:00am - 2:30pm EST<i> (5h 30m)</i>
|
220
|
+
• 5:30pm - 6:00pm EST<i> (30m)</i>
|
221
|
+
</pre>
|
222
|
+
|
223
|
+
|
224
|
+
You can also find times when multiple people are available:
|
225
|
+
|
226
|
+
<pre>
|
227
|
+
<b>$</b> calendar-assistant avail 2018-11-05..2018-11-07 -a me@example.com,other@example.com
|
228
|
+
<i>me@example.com, other@example.com</i>
|
229
|
+
<i>- looking for blocks at least 30 mins long</i>
|
230
|
+
<i>- between 9am and 6pm in America/New_York</i>
|
231
|
+
<i>- between 9am and 6pm in America/Los_Angeles</i>
|
232
|
+
|
233
|
+
<b>Availability on Monday, November 5:
|
234
|
+
</b>
|
235
|
+
• 4:30pm - 5:00pm EST / 1:30pm - 2:00pm PST<i> (30m)</i>
|
236
|
+
|
237
|
+
<b>Availability on Tuesday, November 6:
|
238
|
+
</b>
|
239
|
+
• 12:00pm - 4:30pm EST / 9:00am - 1:30pm PST<i> (4h 30m)</i>
|
240
|
+
• 4:50pm - 6:00pm EST / 1:50pm - 3:00pm PST<i> (1h 10m)</i>
|
241
|
+
|
242
|
+
<b>Availability on Wednesday, November 7:
|
243
|
+
</b>
|
244
|
+
• 12:00pm - 2:30pm EST / 9:00am - 11:30am PST<i> (2h 30m)</i>
|
277
245
|
</pre>
|
278
246
|
|
279
247
|
|
280
248
|
You can also set start and end times for the search, which is useful when looking for overlap with another time zone:
|
281
249
|
|
282
250
|
<pre>
|
283
|
-
<b>$</b> calendar-assistant avail 2018-
|
284
|
-
<i>me@example.com
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
<b>Availability on
|
251
|
+
<b>$</b> calendar-assistant avail 2018-11-05..2018-11-07 -s 12pm -e 7pm
|
252
|
+
<i>me@example.com</i>
|
253
|
+
<i>- looking for blocks at least 30 mins long</i>
|
254
|
+
<i>- between 12pm and 7pm in America/New_York</i>
|
255
|
+
|
256
|
+
<b>Availability on Monday, November 5:
|
289
257
|
</b>
|
290
|
-
•
|
291
|
-
•
|
292
|
-
•
|
293
|
-
• 6:25pm - 7:00pm
|
258
|
+
• 1:30pm - 2:30pm EST<i> (1h)</i>
|
259
|
+
• 3:30pm - 5:00pm EST<i> (1h 30m)</i>
|
260
|
+
• 5:30pm - 7:00pm EST<i> (1h 30m)</i>
|
294
261
|
|
295
|
-
<b>Availability on
|
262
|
+
<b>Availability on Tuesday, November 6:
|
296
263
|
</b>
|
297
|
-
•
|
298
|
-
•
|
299
|
-
• 2:55pm - 3:30pm
|
300
|
-
• 6:00pm - 7:00pm
|
264
|
+
• 12:00pm - 4:30pm EST<i> (4h 30m)</i>
|
265
|
+
• 4:50pm - 7:00pm EST<i> (2h 10m)</i>
|
301
266
|
|
302
|
-
<b>Availability on
|
267
|
+
<b>Availability on Wednesday, November 7:
|
303
268
|
</b>
|
304
|
-
•
|
305
|
-
•
|
269
|
+
• 12:00pm - 2:30pm EST<i> (2h 30m)</i>
|
270
|
+
• 5:30pm - 7:00pm EST<i> (1h 30m)</i>
|
306
271
|
</pre>
|
307
272
|
|
308
273
|
|
309
|
-
### Tell people where you are
|
274
|
+
### `location-set`: Tell people where you are in the world
|
310
275
|
|
311
276
|
Declare your location as an all-day non-busy event:
|
312
277
|
|
313
278
|
<pre>
|
314
|
-
<b>$</b> calendar-assistant help location-set
|
315
279
|
Usage:
|
316
280
|
calendar-assistant location-set LOCATION [DATE | DATERANGE]
|
317
281
|
|
318
282
|
Options:
|
319
|
-
-
|
320
|
-
|
321
|
-
|
283
|
+
-p, [--profile=PROFILE] # the profile you'd like to use (if different from default)
|
284
|
+
[--local-store=FILENAME] # Load events from a local file instead of Google Calendar
|
285
|
+
-h, -?, [--help], [--no-help]
|
286
|
+
[--debug], [--no-debug] # how dare you suggest there are bugs
|
322
287
|
|
323
288
|
Set your location to LOCATION for a date or range of dates (default 'today')
|
324
289
|
</pre>
|
@@ -328,39 +293,39 @@ Set your location to LOCATION for a date or range of dates (default 'today')
|
|
328
293
|
Some examples:
|
329
294
|
|
330
295
|
<pre>
|
331
|
-
|
296
|
+
<i># create an event titled `🗺 WFH` for today</i>
|
332
297
|
<b>$</b> calendar-assistant location set -p home WFH
|
333
298
|
<b>Created:</b>
|
334
299
|
2018-09-03 | <b>🗺 WFH</b> (not-busy, self)
|
335
300
|
|
336
|
-
|
301
|
+
<i># create an event titled `🗺 OOO` for tomorrow</i>
|
337
302
|
<b>$</b> calendar-assistant location-set OOO tomorrow
|
338
303
|
<b>Created:</b>
|
339
304
|
2018-09-04 | <b>🗺 OOO</b> (not-busy, self)
|
340
305
|
|
341
|
-
|
306
|
+
<i># create an event titled `🗺 Spring One` on the days of that conference</i>
|
342
307
|
<b>$</b> calendar-assistant location-set "Spring One" 2018-09-24...2018-09-27
|
343
308
|
<b>Created:</b>
|
344
309
|
2018-09-24 - 2018-09-27 | <b>🗺 Spring One</b> (not-busy, self)
|
345
310
|
|
346
|
-
|
311
|
+
<i># create a vacation event for next week</i>
|
347
312
|
<b>$</b> calendar-assistant location-set "Vacation!" "next monday ... next week friday"
|
348
313
|
<b>Created:</b>
|
349
314
|
2018-09-10 - 2018-09-14 | <b>🗺 Vacation!</b> (not-busy, self)
|
350
315
|
</pre>
|
351
316
|
|
352
317
|
|
353
|
-
###
|
318
|
+
### `location`: View where you're going to be in the world
|
354
319
|
|
355
320
|
<pre>
|
356
|
-
<b>$</b> calendar-assistant help location
|
357
321
|
Usage:
|
358
322
|
calendar-assistant location [DATE | DATERANGE]
|
359
323
|
|
360
324
|
Options:
|
361
|
-
-
|
362
|
-
|
363
|
-
|
325
|
+
-p, [--profile=PROFILE] # the profile you'd like to use (if different from default)
|
326
|
+
[--local-store=FILENAME] # Load events from a local file instead of Google Calendar
|
327
|
+
-h, -?, [--help], [--no-help]
|
328
|
+
[--debug], [--no-debug] # how dare you suggest there are bugs
|
364
329
|
|
365
330
|
Show your location for a date or range of dates (default 'today')
|
366
331
|
</pre>
|
@@ -371,18 +336,131 @@ For example:
|
|
371
336
|
<b>$</b> calendar-assistant location "2018-09-24...2018-09-28"
|
372
337
|
<i>me@example.com (all times in America/New_York)
|
373
338
|
</i>
|
374
|
-
2018-09-24 - 2018-09-
|
375
|
-
2018-09-28 <b> | 🗺
|
339
|
+
2018-09-24 - 2018-09-28 <b> | 🗺 Rivendell</b><i> (not-busy)</i>
|
340
|
+
2018-09-28 <b> | 🗺 Bywater</b><i> (not-busy)</i>
|
341
|
+
</pre>
|
342
|
+
|
343
|
+
|
344
|
+
### `show`: View your calendar events
|
345
|
+
|
346
|
+
<pre>
|
347
|
+
Usage:
|
348
|
+
calendar-assistant show [DATE | DATERANGE | TIMERANGE]
|
349
|
+
|
350
|
+
Options:
|
351
|
+
-c, [--commitments], [--no-commitments] # only show events that you've accepted with another person
|
352
|
+
-p, [--profile=PROFILE] # the profile you'd like to use (if different from default)
|
353
|
+
[--local-store=FILENAME] # Load events from a local file instead of Google Calendar
|
354
|
+
-a, [--attendees=ATTENDEE1[,ATTENDEE2[,...]]] # [default 'me'] people (email IDs) to whom this command will be applied
|
355
|
+
-h, -?, [--help], [--no-help]
|
356
|
+
[--debug], [--no-debug] # how dare you suggest there are bugs
|
357
|
+
|
358
|
+
Show your events for a date or range of dates (default 'today')
|
359
|
+
</pre>
|
360
|
+
|
361
|
+
For example: display all events scheduled for tomorrow:
|
362
|
+
|
363
|
+
<pre>
|
364
|
+
<b>$</b> calendar-assistant show 2018-10-01
|
365
|
+
<i>me@example.com (all times in America/New_York)
|
366
|
+
</i>
|
367
|
+
<strike>2018-10-01 03:30 - 05:00 | Maximize open-source markets</strike>
|
368
|
+
<strike>2018-10-01 07:30 - 08:30 | Incentivize innovative web services</strike>
|
369
|
+
<strike>2018-10-01 07:30 - 08:30 | Reinvent 24/7 niches</strike>
|
370
|
+
2018-10-01 10:30 - 10:55<b> | Engineer collaborative roi</b><i> (1:1, recurring)</i>
|
371
|
+
2018-10-01 11:00 - 11:30<b> | Implement one-to-one schemas</b><i> (recurring)</i>
|
372
|
+
2018-10-01 11:30 - 12:00<b> | Empower extensible vortals</b><i> (1:1, recurring)</i>
|
373
|
+
<strike>2018-10-01 11:50 - 12:00 | Synthesize web-enabled niches</strike>
|
374
|
+
2018-10-01 12:00 - 12:30<b> | Facilitate open-source infomediaries</b><i> (self)</i>
|
375
|
+
<strike>2018-10-01 12:15 - 12:30 | Iterate scalable partnerships</strike>
|
376
|
+
<strike>2018-10-01 12:30 - 13:30 | Unleash web-enabled content</strike>
|
377
|
+
2018-10-01 12:30 - 13:30<b> | Exploit collaborative web services</b><i> (recurring)</i>
|
378
|
+
2018-10-01 13:30 - 14:50<b> | Streamline back-end deliverables</b><i> (self)</i>
|
379
|
+
<strike>2018-10-01 13:30 - 14:30 | Innovate dot-com architectures</strike>
|
380
|
+
2018-10-01 15:00 - 15:30<b> | Optimize robust paradigms</b><i> (1:1)</i>
|
381
|
+
2018-10-01 16:00 - 17:00<b> | Brand 24/365 web services</b><i> (1:1, recurring)</i>
|
382
|
+
2018-10-01 16:45 - 17:00<b> | Extend vertical applications</b><i> (recurring)</i>
|
383
|
+
2018-10-01 17:00 - 17:30<b> | Monetize one-to-one roi</b><i> (recurring)</i>
|
384
|
+
2018-10-01 17:30 - 17:55<b> | Target transparent e-tailers</b><i> (1:1, recurring)</i>
|
385
|
+
<strike>2018-10-01 18:00 - 20:30 | Maximize value-added vortals</strike>
|
386
|
+
<strike>2018-10-01 18:30 - 19:00 | Whiteboard rich applications</strike>
|
387
|
+
<strike>2018-10-01 19:00 - 19:30 | Scale cross-platform portals</strike>
|
388
|
+
2018-10-01 <b> | 🗺 Wilderland</b><i> (not-busy)</i>
|
376
389
|
</pre>
|
377
390
|
|
391
|
+
Display _only_ the commitments I have to other people using the `-c` option:
|
392
|
+
|
393
|
+
<pre>
|
394
|
+
<b>$</b> calendar-assistant show -c 2018-10-01
|
395
|
+
<i>me@example.com (all times in America/New_York)
|
396
|
+
</i>
|
397
|
+
2018-10-01 10:30 - 10:55<b> | Engineer collaborative roi</b><i> (1:1, recurring)</i>
|
398
|
+
2018-10-01 11:00 - 11:30<b> | Implement one-to-one schemas</b><i> (recurring)</i>
|
399
|
+
2018-10-01 11:30 - 12:00<b> | Empower extensible vortals</b><i> (1:1, recurring)</i>
|
400
|
+
2018-10-01 12:30 - 13:30<b> | Exploit collaborative web services</b><i> (recurring)</i>
|
401
|
+
2018-10-01 15:00 - 15:30<b> | Optimize robust paradigms</b><i> (1:1)</i>
|
402
|
+
2018-10-01 16:00 - 17:00<b> | Brand 24/365 web services</b><i> (1:1, recurring)</i>
|
403
|
+
2018-10-01 16:45 - 17:00<b> | Extend vertical applications</b><i> (recurring)</i>
|
404
|
+
2018-10-01 17:00 - 17:30<b> | Monetize one-to-one roi</b><i> (recurring)</i>
|
405
|
+
2018-10-01 17:30 - 17:55<b> | Target transparent e-tailers</b><i> (1:1, recurring)</i>
|
406
|
+
2018-10-01 <b> | 🗺 Wilderland</b><i> (not-busy)</i>
|
407
|
+
</pre>
|
408
|
+
|
409
|
+
|
410
|
+
### `config`: View your configuration parameters
|
411
|
+
|
412
|
+
Calendar Assistant has intelligent defaults, which can be overridden in the TOML file `~/.calendar-assistant`, and further overridden via command-line parameters. Sometimes it's nice to be able to see what defaults Calendar Assistant is using:
|
413
|
+
|
414
|
+
<pre>
|
415
|
+
Usage:
|
416
|
+
calendar-assistant config
|
417
|
+
|
418
|
+
Options:
|
419
|
+
-h, -?, [--help], [--no-help]
|
420
|
+
[--debug], [--no-debug] # how dare you suggest there are bugs
|
421
|
+
|
422
|
+
Dump your configuration parameters (merge of defaults and overrides from /home/user/.calendar-assistant)
|
423
|
+
</pre>
|
424
|
+
|
425
|
+
The output is TOML, which is suitable for dumping into `~/.calendar-assistant` and editing.
|
426
|
+
|
427
|
+
<pre>
|
428
|
+
<b>$</b> calendar-assistant config
|
429
|
+
|
430
|
+
[settings]
|
431
|
+
end-of-day = "6pm"
|
432
|
+
meeting-length = "30m"
|
433
|
+
profile = "work"
|
434
|
+
start-of-day = "9am"
|
435
|
+
</pre>
|
436
|
+
|
437
|
+
## Development
|
438
|
+
|
439
|
+
### Tests
|
440
|
+
|
441
|
+
```bash
|
442
|
+
gem install bundler
|
443
|
+
bundle install
|
444
|
+
|
445
|
+
rake spec
|
446
|
+
```
|
447
|
+
|
448
|
+
### Generate README
|
449
|
+
|
450
|
+
* Requires npm to be installed
|
451
|
+
* Will use a fixture file rather than connecting to a remote calendar. Fixtures can be updated/regenerated in [generate-fixtures](generate-fixtures) script
|
452
|
+
|
453
|
+
```bash
|
454
|
+
./generate-readme
|
455
|
+
```
|
378
456
|
|
379
457
|
## References
|
380
458
|
|
381
459
|
Google Calendar Concepts: https://developers.google.com/calendar/concepts/
|
382
460
|
|
383
|
-
Google
|
461
|
+
Google Calendar API Reference: https://developers.google.com/calendar/v3/reference/
|
384
462
|
|
385
|
-
|
463
|
+
Google Calendar Ruby Client Docs: https://www.rubydoc.info/github/google/google-api-ruby-client/Google/Apis/CalendarV3
|
386
464
|
|
387
465
|
|
388
466
|
## License
|