Git Product home page Git Product logo

calendar-assistant's People

Contributors

dependabot-preview[bot] avatar dependabot-support avatar flavorjones avatar gsiener avatar mikfreedman avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

calendar-assistant's Issues

[braindump] variations on 1:1s

This should most definitely be broken up into smaller stories, it's intended to capture some high-level thoughts around a command to create and manage one-on-ones (or more generally, people meetings).

Some variations I currently have (manually, with great difficulty) or would like:

  • with a person every N weeks for M minutes
  • with a person every N weeks alternating M and M' minutes
  • with two people, alternating 2:1 with 1:1s, every N weeks for M minutes
  • with a person just once, schedule within an upcoming time period
  • with pool of people in repeating time slot(s) (e.g. all CF Eng managers in these three time slots)

Features:

  • associate a person with a preference for start-of-day (breakfast) or end-of-day (pub)

Crazy Implementation Thought

One thought, and this might be crazy, is not to always use GCal's "recurring event" feature (though ice_cube will make that easy), but instead to schedule individual meetings, and then rely on the linter to see "it's been N weeks since your last meeting with Jim, I'll schedule a new one".

Pros: this means that meeting frequency can easily be dialed up or down across a wide variety of one-on-ones. @gsiener has suggested a "dial" for when he's busy and for the next month wants every 2-week one-on-one to become a 3-week; every 3-week to become a 4-week; etc. (Or the other way, let's get some 1:1s done this week!)

Cons: this likely means that one-on-ones won't be on the same day at the same time for people. Regularity is important for many people and this may mean the one-on-one meeting is perceived as less valuable, or is less likely to be attended.

mirror any flights I have from my Tripit calendar to my primary calendar

When I'm on a plane, or on my way to or from the airport,
I should be marked as busy,
Because of physics.


GIven a Tripit or Google calendar event for a flight,
When there's a flight on that calendar,
Then a mirror appointment should be created on my main calendar,
Padded by 90 minutes on each side,
Telling people that I'm busy.

option to set visibility of location events at create time

I'd like to have my location events default to 'public' instead of 'default visibility', but others probably have other opinions.

Rather than default to "public", I'd like a commandline parameter to set them public at create time.

This might even be a good excuse to introduce a user config to set this default.

Specify a default profile

I find myself almost always using one profile, and I think the commands would flow more easily without needing to add the profile. E.g.:

calendar-assistant show work vs. calendar-assistant show
calendar-assistant location-set work WFH today vs. calendar-assistant location-set WFH today

I'd suggest calendar-assistant profile-set work, which would then allow subsequent commands to default to that profile. WDYT?

upgrade to `telia-oss/github-pr-resource`

see branch flavorjones-new-pr-resource in which I tried to do too much.

  • make the pipelines multiple tasks again
  • make sure we give the PR resource a new name because otherwise we get the ref error from the previous resource input
  • investigate why ATC_EXTERNAL_URL isn't bound when we generate the PR message

Add a location based on flying events

Google generally automatically adds events when you fly places, it reads your itinerary emails (nbd).

image

Wouldn't it be cool if there was an automatic way to generate location events based on these automatic flying events?

# create an event titled `๐Ÿ—บ Columbus` on the days of the trip to Columbus
$ calendar-assistant location list flights
[1] 2018-09-24 - 2018-09-27: New York => Columbus
[2] 2018-10-01 - 2018-10-10: New York => San Francisco
$ calendar-assistant location set-flight 1
Created:
2018-09-24 - 2018-09-27   | ๐Ÿ—บ  Columbus (not-busy, self)

Or, something

make README generation part of the build

Now that #33 has been completed. It should be trivial to make README generation part of the build.

This will be useful because changes are often made that result in README updates which aren't committed as part of the normal workflow.

At the very least the build could fail if the generated README and committed README do not match

option to mark all-day location events as "busy"

As someone who's going on vacation
I want to mark my calendar as completely busy all day
So people know I'm not available


This is probably just a flag on the location set command, e.g.

calendar-assistant location set work --busy "Sipping Mai Tais" 2019-10-01...2019-10-05

or

calendar-assistant location set work -b "Sipping Mai Tais" 2019-10-01...2019-10-05

"availability" run for multiple calendars shows available blocks shorter than specified length

For example:

ca avail monday..next week friday -a [email protected],[email protected] -l 60m
[email protected], [email protected]
- looking for blocks at least 1 hr long
- between 9am and 6pm in America/Los_Angeles
- between 9am and 6pm in America/New_York

Availability on Monday, December 3:

 โ€ข 10:30am - 11:30am PST /  1:30pm -  2:30pm EST (1h)

Availability on Tuesday, December 4:

 โ€ข 11:15am - 11:30am PST /  2:15pm -  2:30pm EST (15m)
 โ€ข  1:30pm -  1:45pm PST /  4:30pm -  4:45pm EST (15m)

Availability on Wednesday, December 5:

  (No available blocks in this time range.)

Availability on Thursday, December 6:

  (No available blocks in this time range.)

Availability on Friday, December 7:

 โ€ข  2:00pm -  3:00pm PST /  5:00pm -  6:00pm EST (1h)


Share availability with others

As an employee who routinely interacts with clients and others where scheduling is a nightmare, I would love for there to be a way for me to easily (automatically?) share my availability with these external parties.

show statistics over a time period

I'd really like to be able to analyze where I'm spending my time, ideally this is a backwards-looking stat but might be applied forwards.

Some rough thoughts on buckets that would be useful for me:

  • unstructured time: includes past available time and all "self" time
  • one-on-ones: meetings with one other person, either recurring or one-offsf
  • recurring meetings: meetings that recur with any periodicity
  • OOO time

Potential UX:

$ calendar-assistant stats
[email protected]
- looking back one month

Time spent in recurring meetings: 10h 30m (20.2%)
Time spent in one-on-ones: 22h 10m (41.6%)
Unstructured time: 18h 30m (30.3%)

This could support the -a option to run against someone else to whose calendar you have access.

This should support a time range as well (default to past month).

Something interesting to think about: should percentages be calculated from the user's business day (config) or be calculated from total time spent in meetings?

make CalendarAssistant::Event cast everything as a `Time` object

Because BusinessTime does all its cool shit on the Time class, having DateTime objects floating around is either a) asking for trouble, or b) requires invoking #to_time all over the place.

Instead let's make sure Event does the right thing by casting the return values as Time for:

  • #start_time
  • #end_time

and let's make sure all internal methods use the #start_time and #end_time methods:

  • #past?
  • #future?
  • #duration

command to schedule a one-time meeting with one person

I'd like the ability to quickly schedule a one-time meeting with someone. Here are some things to consider:

  • option to specify length of meeting (default 30 minutes)
  • consider timezones of each person (don't book outside work hours)
  • prompt user before booking it

Likely upcoming stories to consider:

  • option to avoid booking lunch
  • option to go outside of working hours
  • ability to include more than one other person
  • add a Zoom link

A UX idea:

  • calendar-assistant meet CAL_ID TITLE [OTHER1 [OTHER2 ...]] [-d DURATION]

Question:

  • should title be an optional parameter? we could default to first names of people, like "Mike, Graham, and Tim"

Related to #14.

open a zoom link in a calendar entry

Given an event has an associated zoom link
When I enter the command calendar-assistant meeting join <profile>
Then the zoom link is opened in the default browser

concourse

  • make a team on ci.nokogiri.org
  • make a master pipeline
  • hook up slack notifications
  • make a PR pipeline
  • add a badge to the README

linting should prompt for action when 1:1s are declined by the other person (or all other people)

The web UI does a thing where it shows when the other person has declined.

I'd like linting to prompt me to decline or reschedule.

An imaginary journey:

$ calendar-assistant lint today
Found meetings that were declined:

2018-09-17 08:00 - 09:00  | ๐Ÿ‘ซ MD / RDZ (1:1, recurring)
Would you like to reschedule? (y/n): n
(Declining  "๐Ÿ‘ซ MD / RDZ")

2018-09-17 14:00 - 14:30  | ๐Ÿ‘ซ Evan / MikeD (1:1, recurring)
Would you like to reschedule? (y/n): y
(Rescheduling "๐Ÿ‘ซ Evan / MikeD")
... eliding this input because it's another story ...

(Depends on #7 for rescheduling functionality.)

Unable to join a zoom when the description is nil

ca join --debug
/Users/user/.rvm/rubies/ruby-2.4.1/lib/ruby/2.4.0/uri/rfc2396_parser.rb:268:in `extract': undefined method `scan' for nil:NilClass (NoMethodError)

Zoom could be in the location then description then it should fail gracefully.

show events and availability for another person's calendar

hanging off #18

  • show availability for another calendar
  • show events for another calendar
  • make sure time zones are handled appropriately (see below)
  • make sure print_events and print_available_blocks show the right header info (from the right calendar)
  • investigate whether free/busy is right for unresponded-to events?

consider whether attributes should be on CA or on EventRepository (e.g., calendar) and whether the "default" for CA should change if only one required attendee is present

command to defensively block off time

My dream for a utility such as this is to generate a bunch of "busy" meetings of varying lengths to fill a block of time rather than using a single multi-hour meeting block.

My experience is that folks trying to find a time on your calendar a more inclined to double book you over a long meeting block than if it looks like you have multiple meetings.

something like:

calendar-assistant busy-block create <profile-name> [<range datespec>]

Generates something like this:

image

Can't do anything but help after authorization

15:05:30 firecrest in ~/workspace/calendar-assistant
โœ“ master โ†’ ruby -Ilib bin/calendar-assistant show today
ERROR: could not parse /Users/dwfrank/.calendar-assistant: undefined method `ascii_tree' for nil:NilClass

Is this an authorization fail? Or PEBKAC?

Scheduler issues (in "availability")

Found a few issues

  1. we're checking event.accepted? which doesn't work for private events (events on other people's calendars that I can't see details for). I think we can work around this by using event.private? || event.accepted?

  1. we're not capturing events that are "OOO", because they show up as "self" and we're choosing to ignore those at this time. Maybe we shouldn't ignore those self-meetings? Or else, we should try to detect if it's an OOO meeting by looking at the description, which will say:

"This is an out-of-office event, which can only be edited in Google Calendar. Meetings during this time will be automatically declined."


  1. events come out of the API ordered by start time, but the end times are not sorted. Here's an example output:
$ ruby -Ilib bin/calendar-assistant show yesterday -r [email protected]
[email protected] (all times in America/Los_Angeles)

2018-11-16  09:06 - 09:20 | redacted (awaiting, recurring)
2018-11-16  10:00 - 10:30 | redacted (1:1, recurring)
2018-11-16  10:30 - 11:00 | redacted (awaiting, recurring)
2018-11-16  11:00 - 12:00 | redacted (1:1, recurring)
2018-11-16  11:00 - 11:30 | redacted (self)
2018-11-16  12:00 - 12:30 | redacted (awaiting, recurring)
2018-11-16  12:30 - 13:29 | REDACTED (recurring, self)
2018-11-16  12:30 - 18:00 | redacted (self)

You can see that there are two meetings at 11, one ends at 11:30 and one ends at 12:00. The Scheduler gets confused by this and thinks the person is free from 11:30-12:00:

$ ruby -Ilib bin/calendar-assistant avail yesterday -r [email protected]
[email protected]
- looking for blocks at least 30 mins long
- between 9am and 6pm in America/Los_Angeles

Availability on Friday, November 16:

 โ€ข  9:00am - 10:00am PST (1h)
 โ€ข 10:30am - 11:00am PST (30m)
 โ€ข 11:30am - 12:30pm PST (1h)

  1. It looks like a long event at the end of the day still isn't being handled correctly. Here's the two sets of output for another person:
$ ruby -Ilib bin/calendar-assistant show yesterday -r [email protected]
[email protected] (all times in America/Chicago)

2018-11-16  09:00 - 09:30 | (private) (private)
2018-11-16  10:00 - 10:30 | (private) (private)
2018-11-16  12:00 - 12:30 | (private) (private)
2018-11-16  13:30 - 15:00 | (private) (private)
2018-11-16  15:00 - 15:30 | (private) (private)
2018-11-16  16:00 - 16:30 | (private) (private)
2018-11-16  16:30 - 17:00 | (private) (private)
2018-11-16  17:00 - 19:00 | (private) (private)

and

$ ruby -Ilib bin/calendar-assistant avail yesterday -r [email protected]
[email protected]
- looking for blocks at least 30 mins long
- between 9am and 6pm in America/Chicago

Availability on Friday, November 16:

 โ€ข  9:30am - 10:00am CST (30m)
 โ€ข 10:30am - 12:00pm CST (1h 30m)
 โ€ข 12:30pm -  1:30pm CST (1h)
 โ€ข  3:30pm -  4:00pm CST (30m)
 โ€ข  5:00pm -  6:00pm CST (1h)

You can see that there's an event from 17:00-19:00, but the Scheduler is reporting 17:00-18:00 as available.

Put client credentials somewhere

Client credentials are hardcoded to be in a file named credentials.json in the local directory. Need to put these somewhere else, maybe ~/.calendar-assistant.client_creds.json or something.

I want to keep these creds separate from the user tokens because, if and when we erect a web UI on top of this, the client creds are global, and the user tokens are user-specific.

We should also make sure that this file is chmodded properly to prevent other users from seeing it (similar to ssh keys, should be 600 or similar).

generate a list of upcoming availability

When I'm trying to schedule a meeting with someone outside the org, I often provide a list of upcoming available slots. Ultimately, I'd love to have Sunrise Meet back. In the short term, my suggestion would be something like:

$ calendar-assistant show availability work [--size 60min]

Monday (10/8) 2pm-3:30pm
Tuesday (10/9) 11am-12pm
Wednesday (10/10) 4pm-6pm

"availability" command should support multiple users

hanging off #18


I'm imagining a workflow like:

Given [email protected] whose home time zone is America/Los_Angeles ...

$ calendar-assistant avail -r me,[email protected]

[email protected], [email protected]
- looking for blocks at least 30 mins long
- between 9am and 6pm in America/New_York
- between 9am and 6pm in America/Los_Angeles

Availability on Monday, November 19:

 โ€ข 12:00pm -  1:00pm EST /  9:00am - 10:00am PST (1h)
 โ€ข  1:30pm -  2:00pm EST / 10:30am - 11:00am PST (30m)

The alternative UX would be repeating usage of params:

calendar-assistant avail -r me -r [email protected]

which is something that Thor doesn't support (it instead prefers passing multiple space-delimited options like -r me [email protected] which I find confusing and I'm pretty sure isn't POSIX-compliant ๐Ÿคทโ€โ™‚๏ธ).

I'm open to other ideas here. @gsiener @mikfreedman

mistyping a calendar ID should provide a human-readable error message

Today if I mistype a calendar ID, the result is messy:

$ calendar-assistant avail -a [email protected],[email protected]
Traceback (most recent call last):
	39: from /home/flavorjones/.rvm/gems/ruby-2.5.3/bin/ruby_executable_hooks:24:in `<main>'
	38: from /home/flavorjones/.rvm/gems/ruby-2.5.3/bin/ruby_executable_hooks:24:in `eval'
	37: from /home/flavorjones/.rvm/gems/ruby-2.5.3/bin/calendar-assistant:23:in `<main>'
	36: from /home/flavorjones/.rvm/gems/ruby-2.5.3/bin/calendar-assistant:23:in `load'
	35: from /home/flavorjones/.rvm/gems/ruby-2.5.3/gems/calendar-assistant-0.5.0/bin/calendar-assistant:8:in `<top (required)>'
... <snip> ...
	10: from /home/flavorjones/.rvm/gems/ruby-2.5.3/gems/retriable-3.1.2/lib/retriable.rb:56:in `times'
	 9: from /home/flavorjones/.rvm/gems/ruby-2.5.3/gems/retriable-3.1.2/lib/retriable.rb:61:in `block in retriable'
	 8: from /home/flavorjones/.rvm/gems/ruby-2.5.3/gems/google-api-client-0.24.3/lib/google/apis/core/http_command.rb:101:in `block in execute'
	 7: from /home/flavorjones/.rvm/gems/ruby-2.5.3/gems/retriable-3.1.2/lib/retriable.rb:56:in `retriable'
	 6: from /home/flavorjones/.rvm/gems/ruby-2.5.3/gems/retriable-3.1.2/lib/retriable.rb:56:in `times'
	 5: from /home/flavorjones/.rvm/gems/ruby-2.5.3/gems/retriable-3.1.2/lib/retriable.rb:61:in `block in retriable'
	 4: from /home/flavorjones/.rvm/gems/ruby-2.5.3/gems/google-api-client-0.24.3/lib/google/apis/core/http_command.rb:104:in `block (2 levels) in execute'
	 3: from /home/flavorjones/.rvm/gems/ruby-2.5.3/gems/google-api-client-0.24.3/lib/google/apis/core/http_command.rb:299:in `execute_once'
	 2: from /home/flavorjones/.rvm/gems/ruby-2.5.3/gems/google-api-client-0.24.3/lib/google/apis/core/http_command.rb:183:in `process_response'
	 1: from /home/flavorjones/.rvm/gems/ruby-2.5.3/gems/google-api-client-0.24.3/lib/google/apis/core/api_command.rb:116:in `check_status'
/home/flavorjones/.rvm/gems/ruby-2.5.3/gems/google-api-client-0.24.3/lib/google/apis/core/http_command.rb:218:in `check_status': notFound: Not Found (Google::Apis::ClientError)

Similar to 5ef6514 and 5ae823e and 71a2189, we should make sure we trap this error and emit something human-readable, preferably pointing the user at the incorrect calendar ID.

linting should confirm when meetings are marked as 'free'

Sometimes people may set the meeting "show my time as" to Free instead of busy, or maybe set the visibility to something weird like "Private" which can confuse others as they try and schedule meetings with you.

Linter should probably catch these abnormal thingies, and leave off all-day events that are often marked as "free"

should be able to associate a color with a meeting type

I'm imagining a way to configure an association of a color with a meeting type:

style:
  - meeting_type: 1-1
    color: basil
  - meeting_type: self
    color: sage

so that when meetings are created/rescheduled/etc. the color is set appropriately

Config can be set in environment

Each option should be able to be set by the environment.
These settings could generally follow the format below

# calendar-assistant --local-store=fixtures.yml
CALENDAR_ASSISTANT_LOCAL_STORE=fixtures.yml calendar-assistant

config preference should be

  1. Command line options
  2. OS Environment Variables
  3. User Config (TOML)
  4. Defaults

defensively preserve remaining time during a day

When my calendar for the day is nearly full,
Linting should create "self + busy" events filling the remaining time,
So that I get some thinking time.


(This needs to be broken down into smaller stories.)

An interesting concept to explore here is: what is "nearly full"? Some ideas:

  • There's only one 60-minute block left (i.e. save a big chunk of time)
  • There's more than N minutes of meetings scheduled already (i.e., put a ceiling on how much time I'm with other people)

Also see #2 for related discussion.

In my head I'm imagining some user config like:

defense:
  - type: save-chunk
    options:
      length: 60m
  - type: busy-ceiling
    options:
      max: 360
      ignore: "< 25m"

and then running something like:

calendar-assistant lint --defense today

would check my calendar for the day and take action.

meetings with rooms are not recognized as 1:1s

Events that have a room attached often look like this:

...
 @attendees=
  [#<Google::Apis::CalendarV3::EventAttendee
    @display_name="redacted",
    @email="[email protected]",
    @organizer=true,
    @response_status="accepted",
    @self=true>,
   #<Google::Apis::CalendarV3::EventAttendee
    @display_name="redacted",
    @email="[email protected]",
    @response_status="accepted">,
   #<Google::Apis::CalendarV3::EventAttendee
    @display_name="LDN - Bartik (4 people, lounge)",
    @email=
     "[email protected]",
    @resource=true,
    @response_status="accepted">],
...

These events should still be considered 1:1s because the third attendee is the room resource.

command to reschedule a meeting

I'd like an easy command to reschedule a meeting for a time when all invitees are available.

This requires some thought around how to identify a calendar event. There's a unique id assigned by GCal, but it's not human-readable. For the purposes of a functional story we'll use this calendar-id.

Some options and inputs for this command:

  • if it's recurring, are we rescheduling the whole thing, or just this instance?
  • parameter: how far into the future to look before giving up (maybe default to a week?)
  • how big of a business day to consider using (and possibly expand it after a failed pass)
  • how much of an overlap with other events we can tolerate
  • an option to simply list a bunch of potential times, along with conflicts (if any)

Some heuristics and constraints:

  • pay attention to invitees' home time zones and only book meetings during business hours (see business day comment above) and not during lunch hour (12:30-13:30 local)
  • do a second pass ignoring "optional" invitees (if any)
  • do a third pass expanding the business day by an hour on each side, and looking at the lunch hour

(This could and should probably be broken out into multiple stories.)

location-set date handling bug

Given I have a location AAA set for three day: today, tomorrow, day after
When I try to set a different location BBB for today
Then the AAA event should be truncated to tomorrow and the day after


What actually happened:

$ date
Wed Nov 14 09:50:57 EST 2018

$ ca location 2018-11-12..friday
[email protected] (all times in America/New_York)

2018-11-12                | ๐Ÿ—บ  NYC (not-busy, self)
2018-11-13                | ๐Ÿ—บ  NJ (not-busy, self)
2018-11-14 - 2018-11-16   | ๐Ÿ—บ  NYC (not-busy, self)

$ ca location-set NJ today
Traceback (most recent call last):
	28: from /home/flavorjones/.rvm/gems/ruby-2.5.1/bin/ruby_executable_hooks:24:in `<main>'
	27: from /home/flavorjones/.rvm/gems/ruby-2.5.1/bin/ruby_executable_hooks:24:in `eval'
	26: from /home/flavorjones/.rvm/gems/ruby-2.5.1/bin/calendar-assistant:23:in `<main>'
	25: from /home/flavorjones/.rvm/gems/ruby-2.5.1/bin/calendar-assistant:23:in `load'
	24: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/calendar-assistant-0.2.1/bin/calendar-assistant:8:in `<top (required)>'
	23: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/thor-0.20.3/lib/thor/base.rb:466:in `start'
	22: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/thor-0.20.3/lib/thor.rb:387:in `dispatch'
	21: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/thor-0.20.3/lib/thor/invocation.rb:126:in `invoke_command'
	20: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/thor-0.20.3/lib/thor/command.rb:27:in `run'
	19: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/calendar-assistant-0.2.1/lib/calendar_assistant/cli.rb:160:in `location_set'
	18: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/calendar-assistant-0.2.1/lib/calendar_assistant.rb:109:in `create_location_event'
	17: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/calendar-assistant-0.2.1/lib/calendar_assistant.rb:109:in `each'
	16: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/calendar-assistant-0.2.1/lib/calendar_assistant.rb:114:in `block in create_location_event'
	15: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/calendar-assistant-0.2.1/lib/calendar_assistant/event_repository.rb:34:in `update'
	14: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/google-api-client-0.24.3/generated/google/apis/calendar_v3/service.rb:1656:in `update_event'
	13: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/google-api-client-0.24.3/lib/google/apis/core/base_service.rb:360:in `execute_or_queue_command'
	12: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/google-api-client-0.24.3/lib/google/apis/core/http_command.rb:93:in `execute'
	11: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/retriable-3.1.2/lib/retriable.rb:56:in `retriable'
	10: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/retriable-3.1.2/lib/retriable.rb:56:in `times'
	 9: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/retriable-3.1.2/lib/retriable.rb:61:in `block in retriable'
	 8: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/google-api-client-0.24.3/lib/google/apis/core/http_command.rb:101:in `block in execute'
	 7: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/retriable-3.1.2/lib/retriable.rb:56:in `retriable'
	 6: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/retriable-3.1.2/lib/retriable.rb:56:in `times'
	 5: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/retriable-3.1.2/lib/retriable.rb:61:in `block in retriable'
	 4: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/google-api-client-0.24.3/lib/google/apis/core/http_command.rb:104:in `block (2 levels) in execute'
	 3: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/google-api-client-0.24.3/lib/google/apis/core/http_command.rb:299:in `execute_once'
	 2: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/google-api-client-0.24.3/lib/google/apis/core/http_command.rb:183:in `process_response'
	 1: from /home/flavorjones/.rvm/gems/ruby-2.5.1/gems/google-api-client-0.24.3/lib/google/apis/core/api_command.rb:116:in `check_status'
/home/flavorjones/.rvm/gems/ruby-2.5.1/gems/google-api-client-0.24.3/lib/google/apis/core/http_command.rb:218:in `check_status': required: Missing end time. (Google::Apis::ClientError)

refactor the user interactions in "setup" and "authorize"

Currently "setup" interaction code is embedded in cli.rb

And "authorize" interaction code is embedded in authorizer.rb

They're both probably wrong:

  • Authorizer doesn't have access to CLI Helpers like Out#puts and #prompt
  • CLI shouldn't have such complex code in it. Ideally it has one branch and calls out to methods for everything

I think this probably means introducing a new class of some kind to do this work. Or maybe just jam more methods into CLIHelpers.

look into slow "local file store" spec

Running with rspec -p1 shows:

Top 1 slowest examples (0.98886 seconds, 24.5% of total time):
  CalendarAssistant using the local file store reads from those events
    0.98886 seconds ./spec/calendar_assistant_spec.rb:75

The next-slowest spec is 0.1 seconds. Can we look into why this is slow?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.