{"id":15661166,"url":"https://github.com/flavorjones/calendar-assistant","last_synced_at":"2025-04-12T08:08:41.761Z","repository":{"id":33194713,"uuid":"146506469","full_name":"flavorjones/calendar-assistant","owner":"flavorjones","description":"Command-line tool to manage your Google Calendar","archived":false,"fork":false,"pushed_at":"2024-08-16T15:37:38.000Z","size":1079,"stargazers_count":20,"open_issues_count":59,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-12T08:05:44.086Z","etag":null,"topics":["google-calendar"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/flavorjones.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-08-28T21:02:40.000Z","updated_at":"2025-02-14T06:44:07.000Z","dependencies_parsed_at":"2022-08-07T20:15:21.893Z","dependency_job_id":"9804e419-3ea5-43a7-a7d1-0c142b0983e7","html_url":"https://github.com/flavorjones/calendar-assistant","commit_stats":null,"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flavorjones%2Fcalendar-assistant","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flavorjones%2Fcalendar-assistant/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flavorjones%2Fcalendar-assistant/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flavorjones%2Fcalendar-assistant/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/flavorjones","download_url":"https://codeload.github.com/flavorjones/calendar-assistant/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248537140,"owners_count":21120709,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["google-calendar"],"created_at":"2024-10-03T13:26:13.572Z","updated_at":"2025-04-12T08:08:41.663Z","avatar_url":"https://github.com/flavorjones.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"icons/calendar-assistant.png\" align=\"right\" /\u003e\n\n# Calendar Assistant\n\u003eA command-line tool to help you manage your Google Calendar.\n\n- easily join the videoconference for your current meeting\n- see yours and others' \"availability\" suitable for an email response\n- set up all-day events to let people know where you are (for frequent travelers)\n- see views on your calendar events for a date or time range\n- book (and re-book) one-on-ones and other meetings automatically\n\n[![Gem Version](https://badge.fury.io/rb/calendar-assistant.svg)](https://badge.fury.io/rb/calendar-assistant)\n[![Test suite](https://github.com/flavorjones/calendar-assistant/actions/workflows/test-suite.yml/badge.svg)](https://github.com/flavorjones/calendar-assistant/actions/workflows/test-suite.yml)\n[![Maintainability](https://api.codeclimate.com/v1/badges/3525792e1feeccfd8875/maintainability)](https://codeclimate.com/github/flavorjones/calendar-assistant/maintainability)\n[![Test Coverage](https://api.codeclimate.com/v1/badges/3525792e1feeccfd8875/test_coverage)](https://codeclimate.com/github/flavorjones/calendar-assistant/test_coverage)\n[![Join the chat at https://gitter.im/flavorjones/calendar-assistant](https://badges.gitter.im/flavorjones/calendar-assistant.svg)](https://gitter.im/flavorjones/calendar-assistant?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n\n## Contents\n\n\u003c!-- toc --\u003e\n\n- [Features](#features)\n  * [Pretty Display in Your Terminal](#pretty-display-in-your-terminal)\n  * [Human-Friendly Date and Time Specification](#human-friendly-date-and-time-specification)\n  * [Human-Friendly Duration Specification](#human-friendly-duration-specification)\n  * [Filter Events by property](#filter-events-by-property)\n  * [Preferences](#preferences)\n- [Setup](#setup)\n  * [Installation](#installation)\n  * [Set up a Google Cloud Project with API access](#set-up-a-google-cloud-project-with-api-access)\n  * [Authorize access to your Google Calendar](#authorize-access-to-your-google-calendar)\n- [Commands](#commands)\n  * [`join`: Join a video call attached to a meeting](#join-join-a-video-call-attached-to-a-meeting)\n  * [`availability`: Find people's availability for meetings](#availability-find-peoples-availability-for-meetings)\n  * [`location-set`: Tell people where you are in the world](#location-set-tell-people-where-you-are-in-the-world)\n  * [`location`: View where you're going to be in the world](#location-view-where-youre-going-to-be-in-the-world)\n  * [`show`: View your calendar events](#show-view-your-calendar-events)\n  * [`lint`: Calendar events that require action](#lint-calendar-events-that-require-action)\n  * [`config`: View your configuration parameters](#config-view-your-configuration-parameters)\n  * [`interactive`: Interactive Console](#interactive-interactive-console)\n- [Development](#development)\n  * [Running Tests Locally](#running-tests-locally)\n  * [Continuous Integration](#continuous-integration)\n  * [Code Quality](#code-quality)\n  * [Generate README](#generate-readme)\n- [References](#references)\n- [License](#license)\n\n\u003c!-- tocstop --\u003e\n\n## Features\n\n### Pretty Display in Your Terminal\n\nEvents 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\" ...)\n\n\n### Human-Friendly Date and Time Specification\n\nAll 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.\n\nFor a date range or a datetime range, split the start and end with `..` or `...` (with or without spaces) like:\n\n* \"tomorrow ... three days from now\"\n* \"2018-09-24..2018-09-27\".\n\nAlso note that every command will adopt an intelligent default, which is generally \"today\" or \"now\".\n\n\n### Human-Friendly Duration Specification\n\nSome 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.\n\n### Filter Events by property\n\nCommands that return events like `show`, `join`, `availability`, `location` or `lint` can be filtered using the option `--must-be` or `--must-not-be`. These options expect a comma separated list of one of the following properties.\n\n* **Response**\n\t* `accepted`\n\t* `declined`\n\t* `awaiting`\n\t* `tentative`\n* **Temporal**\n\t* `all_day`\n\t* `past`\n\t* `current`\n\t* `future`\n* **Visibility**\n\t* `private`\n\t* `public`\n\t* `explicitly_visible`\n\t* `visible_guestlist`\n* **Attributes**\n\t* `location_event`\n\t* `self`\n\t* `one_on_one`\n\t* `busy`\n\t* `commitment`\n\t* `recurring`\n\t* `abandoned`\n\t* `anyone_can_add_self`\n\t* `attendees_omitted`\n\t* `end_time_unspecified`\n\t* `guests_can_invite_others`\n\t* `guests_can_modify`\n\t* `guests_can_see_other_guests`\n\t* `private_copy`\n\t* `locked`\n\t* `needs_action`\n\n\n### Preferences\n\nAll tokens and preferences will be stored in `~/.calendar-assistant` which is in TOML format for easy editing.\n\nThe location of `.calendar-assistant` defaults to the user's home directory. This location may be overridden by setting the environment variable `CA_HOME`\n\n\n#### Nickname\n\nSome commands, like `location-set`, will refer to you by nickname if you configure it (the alternative might be to not specify your name, or use your email id).\n\nSet `nickname` to a string that would uniquely and briefly identify you to others, like \"Mike D\" or \"JK\".\n\n#### Location Emoji\n\nThere is a `[settings]` key called `location-icon` that may be set to an emoji denoting a location event. By default CalendarAssistant will use `\"🌎\"`, but you can change this.\n\n\n#### Command-Specific Preferences\n\nIf there are user preferences you'd like to set for just a single command (e.g., making public location events created via `location-set`), you can create a nested section in your TOML settings file, like so:\n\n```toml\n[settings]\nvisibility = \"default\"\nnickname = \"uniquely-me\"\n\n[settings.location_set]\nvisibility = \"public\"\ncalendars = [\"teamcalendar@group.calendar.google.com\",\"teamcalendar2@group.calendar.google.com\"]\n```\n\n\n## Setup\n\n### Installation\n\nInstall the gem: `gem install calendar-assistant`.\n\n\n### Set up a Google Cloud Project with API access\n\n\u003cpre\u003e\nUsage:\n  calendar-assistant setup\n\nOptions:\n  -h, -?, [--help], [--no-help], [--skip-help]                    \n          [--debug], [--no-debug], [--skip-debug]                 # how dare you suggest there are bugs\n  -f,     [--formatting], [--no-formatting], [--skip-formatting]  # Enable Text Formatting\n                                                                  # Default: true\n\nDescription:\n  This command will walk you through setting up a Google Cloud Project, enabling the Google Calendar API, and saving\n  the credentials necessary to access the API on behalf of users.\n\n  If you already have downloaded client credentials, you don't need to run this command. Instead, rename the downloaded\n  JSON file to `/home/user/.calendar-assistant.client`\n\u003c/pre\u003e\n\n\n### Authorize access to your Google Calendar\n\n\u003cpre\u003e\nUsage:\n  calendar-assistant authorize PROFILE_NAME\n\nOptions:\n  -h, -?, [--help], [--no-help], [--skip-help]                    \n          [--debug], [--no-debug], [--skip-debug]                 # how dare you suggest there are bugs\n  -f,     [--formatting], [--no-formatting], [--skip-formatting]  # Enable Text Formatting\n                                                                  # Default: true\n\nDescription:\n  Create and authorize a named profile (e.g., \"work\", \"home\", \"flastname@company.tld\") to access your calendar.\n\n  When setting up a profile, you'll be asked to visit a URL to authenticate, grant authorization, and generate and\n  persist an access token.\n\n  In order for this to work, you'll need to have set up your API client credentials. Run `calendar-assistant help\n  setup` for instructions.\n\u003c/pre\u003e\n\n\n## Commands\n\n\u003cpre\u003e\nCommands:\n  calendar-assistant authorize PROFILE_NAME                       # create (or validate) a profile named NAME with ca...\n  calendar-assistant availability [DATE | DATERANGE | TIMERANGE]  # Show your availability for a date or range of dat...\n  calendar-assistant config                                       # Dump your configuration parameters (merge of defa...\n  calendar-assistant help [COMMAND]                               # Describe available commands or one specific command\n  calendar-assistant interactive                                  # interactive console for calendar assistant\n  calendar-assistant join [TIME]                                  # Open the URL for a video call attached to your me...\n  calendar-assistant lint [DATE | DATERANGE | TIMERANGE]          # Lint your events for a date or range of dates (de...\n  calendar-assistant location [DATE | DATERANGE]                  # Show your location for a date or range of dates (...\n  calendar-assistant location-set LOCATION [DATE | DATERANGE]     # Set your location to LOCATION for a date or range...\n  calendar-assistant setup                                        # Link your local calendar-assistant installation t...\n  calendar-assistant show [DATE | DATERANGE | TIMERANGE]          # Show your events for a date or range of dates (de...\n  calendar-assistant version                                      # Display the version of calendar-assistant\n\nOptions:\n  -h, -?, [--help], [--no-help], [--skip-help]                    \n          [--debug], [--no-debug], [--skip-debug]                 # how dare you suggest there are bugs\n  -f,     [--formatting], [--no-formatting], [--skip-formatting]  # Enable Text Formatting\n                                                                  # Default: true\n\u003c/pre\u003e\n\n\n### `join`: Join a video call attached to a meeting\n\n\u003cpre\u003e\nUsage:\n  calendar-assistant join [TIME]\n\nOptions:\n          [--join], [--no-join], [--skip-join]                    # launch a browser to join the video call URL\n                                                                  # Default: true\n  -p,     [--profile=PROFILE]                                     # the profile you'd like to use (if different from default)\n  -l,     [--local-store=FILENAME]                                # Load events from a local file instead of Google Calendar\n  -b,     [--must-be=PROPERTY1[,PROPERTY2[,...]]]                 # Event properties that must be true (see README)\n  -n,     [--must-not-be=PROPERTY1[,PROPERTY2[,...]]]             # Event properties that must be false (see README)\n  -h, -?, [--help], [--no-help], [--skip-help]                    \n          [--debug], [--no-debug], [--skip-debug]                 # how dare you suggest there are bugs\n  -f,     [--formatting], [--no-formatting], [--skip-formatting]  # Enable Text Formatting\n                                                                  # Default: true\n\nOpen the URL for a video call attached to your meeting at time TIME (default 'now')\n\u003c/pre\u003e\n\nSome examples:\n\n\u003cpre\u003e\n\u003cb\u003e$\u003c/b\u003e calendar-assistant join\n\u003ci\u003eme@example.com\u003c/i\u003e\n\n2018-10-01  11:30 - 12:00\u003cb\u003e | Facilitate customized web-readiness \u003c/b\u003e\u003ci\u003e (1:1, recurring)\u003c/i\u003e\n\nhttps://pivotal.zoom.us/j/ABC90210 \u003ci\u003e# ... and opens the videoconference URL\u003c/i\u003e\n\n\n\u003cb\u003e$\u003c/b\u003e calendar-assistant join work 11:30 --no-join\n\u003ci\u003eme@example.com\u003c/i\u003e\n\n2018-10-01  11:30 - 12:00\u003cb\u003e | Facilitate customized web-readiness \u003c/b\u003e\u003ci\u003e (1:1, recurring)\u003c/i\u003e\n\nhttps://pivotal.zoom.us/j/ABC90210 \u003ci\u003e# ... and does not open the URL\u003c/i\u003e\n\u003c/pre\u003e\n\n\n### `availability`: Find people's availability for meetings\n\nThis is useful for emailing people your availability. It only considers `accepted` meetings when determining busy/free.\n\n\u003cpre\u003e\nUsage:\n  calendar-assistant availability [DATE | DATERANGE | TIMERANGE]\n\nOptions:\n  -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')\n  -s,              [--start-of-day=TIME]                                   # [default 9am] find chunks of available time after TIME (which is a BusinessTime string like '9am' or '14:30')\n  -e,              [--end-of-day=TIME]                                     # [default 6pm] find chunks of available time before TIME (which is a BusinessTime string like '9am' or '14:30')\n  -a, --attendees, [--calendars=CALENDAR1[,CALENDAR2[,...]]]               # [default 'me'] people (email IDs) to whom this command will be applied\n  -p,              [--profile=PROFILE]                                     # the profile you'd like to use (if different from default)\n  -l,              [--local-store=FILENAME]                                # Load events from a local file instead of Google Calendar\n  -b,              [--must-be=PROPERTY1[,PROPERTY2[,...]]]                 # Event properties that must be true (see README)\n  -n,              [--must-not-be=PROPERTY1[,PROPERTY2[,...]]]             # Event properties that must be false (see README)\n  -h, -?,          [--help], [--no-help], [--skip-help]                    \n                   [--debug], [--no-debug], [--skip-debug]                 # how dare you suggest there are bugs\n  -f,              [--formatting], [--no-formatting], [--skip-formatting]  # Enable Text Formatting\n                                                                           # Default: true\n\nShow your availability for a date or range of dates (default 'today')\n\u003c/pre\u003e\n\n\nFor example: show me my available time over a chunk of time:\n\n\u003cpre\u003e\n\u003cb\u003e$\u003c/b\u003e calendar-assistant avail 2018-11-05..2018-11-07\n\u003ci\u003eme@example.com\u003c/i\u003e\n\u003ci\u003e- looking for blocks at least 30 mins long\u003c/i\u003e\n\u003ci\u003e- between 9am and 6pm in America/New_York\u003c/i\u003e\n\n\u003cb\u003eAvailability on Monday, November 5:\n\u003c/b\u003e\n •  9:00am - 10:00am EST\u003ci\u003e (1h)\u003c/i\u003e\n •  1:30pm -  2:30pm EST\u003ci\u003e (1h)\u003c/i\u003e\n •  3:30pm -  5:00pm EST\u003ci\u003e (1h 30m)\u003c/i\u003e\n •  5:30pm -  6:00pm EST\u003ci\u003e (30m)\u003c/i\u003e\n\n\u003cb\u003eAvailability on Tuesday, November 6:\n\u003c/b\u003e\n •  9:00am -  4:30pm EST\u003ci\u003e (7h 30m)\u003c/i\u003e\n •  4:50pm -  6:00pm EST\u003ci\u003e (1h 10m)\u003c/i\u003e\n\n\u003cb\u003eAvailability on Wednesday, November 7:\n\u003c/b\u003e\n •  9:00am -  2:30pm EST\u003ci\u003e (5h 30m)\u003c/i\u003e\n •  5:30pm -  6:00pm EST\u003ci\u003e (30m)\u003c/i\u003e\n\u003c/pre\u003e\n\n\nYou can also find times when multiple people are available:\n\n\u003cpre\u003e\n\u003cb\u003e$\u003c/b\u003e calendar-assistant avail 2018-11-05..2018-11-07 -a me@example.com,other@example.com\n\u003ci\u003eme@example.com, other@example.com\u003c/i\u003e\n\u003ci\u003e- looking for blocks at least 30 mins long\u003c/i\u003e\n\u003ci\u003e- between 9am and 6pm in America/New_York\u003c/i\u003e\n\u003ci\u003e- between 9am and 6pm in America/Los_Angeles\u003c/i\u003e\n\n\u003cb\u003eAvailability on Monday, November 5:\n\u003c/b\u003e\n •  4:30pm -  5:00pm EST /  1:30pm -  2:00pm PST\u003ci\u003e (30m)\u003c/i\u003e\n\n\u003cb\u003eAvailability on Tuesday, November 6:\n\u003c/b\u003e\n • 12:00pm -  4:30pm EST /  9:00am -  1:30pm PST\u003ci\u003e (4h 30m)\u003c/i\u003e\n •  4:50pm -  6:00pm EST /  1:50pm -  3:00pm PST\u003ci\u003e (1h 10m)\u003c/i\u003e\n\n\u003cb\u003eAvailability on Wednesday, November 7:\n\u003c/b\u003e\n • 12:00pm -  2:30pm EST /  9:00am - 11:30am PST\u003ci\u003e (2h 30m)\u003c/i\u003e\n\u003c/pre\u003e\n\n\nYou can also set start and end times for the search, which is useful when looking for overlap with another time zone:\n\n\u003cpre\u003e\n\u003cb\u003e$\u003c/b\u003e calendar-assistant avail 2018-11-05..2018-11-07 -s 12pm -e 7pm\n\u003ci\u003eme@example.com\u003c/i\u003e\n\u003ci\u003e- looking for blocks at least 30 mins long\u003c/i\u003e\n\u003ci\u003e- between 12pm and 7pm in America/New_York\u003c/i\u003e\n\n\u003cb\u003eAvailability on Monday, November 5:\n\u003c/b\u003e\n •  1:30pm -  2:30pm EST\u003ci\u003e (1h)\u003c/i\u003e\n •  3:30pm -  5:00pm EST\u003ci\u003e (1h 30m)\u003c/i\u003e\n •  5:30pm -  7:00pm EST\u003ci\u003e (1h 30m)\u003c/i\u003e\n\n\u003cb\u003eAvailability on Tuesday, November 6:\n\u003c/b\u003e\n • 12:00pm -  4:30pm EST\u003ci\u003e (4h 30m)\u003c/i\u003e\n •  4:50pm -  7:00pm EST\u003ci\u003e (2h 10m)\u003c/i\u003e\n\n\u003cb\u003eAvailability on Wednesday, November 7:\n\u003c/b\u003e\n • 12:00pm -  2:30pm EST\u003ci\u003e (2h 30m)\u003c/i\u003e\n •  5:30pm -  7:00pm EST\u003ci\u003e (1h 30m)\u003c/i\u003e\n\u003c/pre\u003e\n\n\n### `location-set`: Tell people where you are in the world\n\nDeclare your location as an all-day non-busy event:\n\n\u003cpre\u003e\nUsage:\n  calendar-assistant location-set LOCATION [DATE | DATERANGE]\n\nOptions:\n                   [--force]                                               # will manage location across multiple calendars whether a nickname is set or not\n                   [--visibility=VISIBILITY]                               # [default is 'default'] Set the visibility of the event. Values are 'public', 'private', 'default'.\n  -p,              [--profile=PROFILE]                                     # the profile you'd like to use (if different from default)\n  -l,              [--local-store=FILENAME]                                # Load events from a local file instead of Google Calendar\n  -b,              [--must-be=PROPERTY1[,PROPERTY2[,...]]]                 # Event properties that must be true (see README)\n  -n,              [--must-not-be=PROPERTY1[,PROPERTY2[,...]]]             # Event properties that must be false (see README)\n  -a, --attendees, [--calendars=CALENDAR1[,CALENDAR2[,...]]]               # [default 'me'] people (email IDs) to whom this command will be applied\n  -h, -?,          [--help], [--no-help], [--skip-help]                    \n                   [--debug], [--no-debug], [--skip-debug]                 # how dare you suggest there are bugs\n  -f,              [--formatting], [--no-formatting], [--skip-formatting]  # Enable Text Formatting\n                                                                           # Default: true\n\nSet your location to LOCATION for a date or range of dates (default 'today')\n\u003c/pre\u003e\n\n**Note** that you can only be in one place at a time, so existing location events may be modified or deleted when new overlapping events are created.\n\nSome examples:\n\n\u003cpre\u003e\n\u003ci\u003e# create an event titled `🗺 WFH` for today\u003c/i\u003e\n\u003cb\u003e$\u003c/b\u003e calendar-assistant location set -p home WFH\n\u003cb\u003eCreated:\u003c/b\u003e\n2018-09-03                | \u003cb\u003e🗺  WFH\u003c/b\u003e (not-busy, self)\n\n\u003ci\u003e# create an event titled `🗺 OOO` for tomorrow\u003c/i\u003e\n\u003cb\u003e$\u003c/b\u003e calendar-assistant location-set OOO tomorrow\n\u003cb\u003eCreated:\u003c/b\u003e\n2018-09-04                | \u003cb\u003e🗺  OOO\u003c/b\u003e (not-busy, self)\n\n\u003ci\u003e# create an event titled `🗺 Spring One` on the days of that conference\u003c/i\u003e\n\u003cb\u003e$\u003c/b\u003e calendar-assistant location-set \"Spring One\" 2018-09-24...2018-09-27\n\u003cb\u003eCreated:\u003c/b\u003e\n2018-09-24 - 2018-09-27   | \u003cb\u003e🗺  Spring One\u003c/b\u003e (not-busy, self)\n\n\u003ci\u003e# create a vacation event for next week\u003c/i\u003e\n\u003cb\u003e$\u003c/b\u003e calendar-assistant location-set \"Vacation!\" \"next monday ... next week friday\"\n\u003cb\u003eCreated:\u003c/b\u003e\n2018-09-10 - 2018-09-14   | \u003cb\u003e🗺  Vacation!\u003c/b\u003e (not-busy, self)\n\u003c/pre\u003e\n\n\n### `location`: View where you're going to be in the world\n\n\u003cpre\u003e\nUsage:\n  calendar-assistant location [DATE | DATERANGE]\n\nOptions:\n  -p,     [--profile=PROFILE]                                     # the profile you'd like to use (if different from default)\n  -l,     [--local-store=FILENAME]                                # Load events from a local file instead of Google Calendar\n  -b,     [--must-be=PROPERTY1[,PROPERTY2[,...]]]                 # Event properties that must be true (see README)\n  -n,     [--must-not-be=PROPERTY1[,PROPERTY2[,...]]]             # Event properties that must be false (see README)\n  -h, -?, [--help], [--no-help], [--skip-help]                    \n          [--debug], [--no-debug], [--skip-debug]                 # how dare you suggest there are bugs\n  -f,     [--formatting], [--no-formatting], [--skip-formatting]  # Enable Text Formatting\n                                                                  # Default: true\n\nShow your location for a date or range of dates (default 'today')\n\u003c/pre\u003e\n\nFor example:\n\n\u003cpre\u003e\n\u003cb\u003e$\u003c/b\u003e calendar-assistant location \"2018-09-24...2018-09-28\"\n\u003ci\u003eme@example.com (all times in America/New_York)\n\u003c/i\u003e\n2018-09-24 - 2018-09-28  \u003cb\u003e | 🌎 Iron Hills\u003c/b\u003e\u003ci\u003e (not-busy)\u003c/i\u003e\n2018-09-28               \u003cb\u003e | 🌎 Country Round\u003c/b\u003e\u003ci\u003e (not-busy)\u003c/i\u003e\n\u003c/pre\u003e\n\n\n### `show`: View your calendar events\n\n\u003cpre\u003e\nUsage:\n  calendar-assistant show [DATE | DATERANGE | TIMERANGE]\n\nOptions:\n  -c,              [--commitments], [--no-commitments], [--skip-commitments]  # only show events that you've accepted with another person\n  -p,              [--profile=PROFILE]                                        # the profile you'd like to use (if different from default)\n  -l,              [--local-store=FILENAME]                                   # Load events from a local file instead of Google Calendar\n  -a, --attendees, [--calendars=CALENDAR1[,CALENDAR2[,...]]]                  # [default 'me'] people (email IDs) to whom this command will be applied\n  -b,              [--must-be=PROPERTY1[,PROPERTY2[,...]]]                    # Event properties that must be true (see README)\n  -n,              [--must-not-be=PROPERTY1[,PROPERTY2[,...]]]                # Event properties that must be false (see README)\n  -h, -?,          [--help], [--no-help], [--skip-help]                       \n                   [--debug], [--no-debug], [--skip-debug]                    # how dare you suggest there are bugs\n  -f,              [--formatting], [--no-formatting], [--skip-formatting]     # Enable Text Formatting\n                                                                              # Default: true\n\nShow your events for a date or range of dates (default 'today')\n\u003c/pre\u003e\n\nFor example: display all events scheduled for tomorrow:\n\n\u003cpre\u003e\n\u003cb\u003e$\u003c/b\u003e calendar-assistant show 2018-10-01\n\u003ci\u003eme@example.com (all times in America/New_York)\n\u003c/i\u003e\n\u003cstrike\u003e2018-10-01  03:30 - 05:00 | Facilitate 24/365 web services\u003c/strike\u003e\n\u003cstrike\u003e2018-10-01  07:30 - 08:30 | Reintermediate magnetic communities\u003c/strike\u003e\n\u003cstrike\u003e2018-10-01  07:30 - 08:30 | Revolutionize bricks-and-clicks synergies\u003c/strike\u003e\n2018-10-01  10:30 - 10:55\u003cb\u003e | Whiteboard clicks-and-mortar metrics\u003c/b\u003e\u003ci\u003e (1:1, recurring)\u003c/i\u003e\n2018-10-01  11:00 - 11:30\u003cb\u003e | Architect holistic models\u003c/b\u003e\u003ci\u003e (recurring)\u003c/i\u003e\n2018-10-01  11:30 - 12:00\u003cb\u003e | Reinvent bleeding-edge e-services\u003c/b\u003e\u003ci\u003e (1:1, recurring)\u003c/i\u003e\n2018-10-01  11:50 - 12:00\u003cb\u003e | Synergize e-business systems\u003c/b\u003e\u003ci\u003e (awaiting)\u003c/i\u003e\n2018-10-01  12:00 - 12:30\u003cb\u003e | Reinvent e-business e-tailers\u003c/b\u003e\u003ci\u003e (self)\u003c/i\u003e\n\u003cstrike\u003e2018-10-01  12:15 - 12:30 | Maximize clicks-and-mortar convergence\u003c/strike\u003e\n\u003cstrike\u003e2018-10-01  12:30 - 13:30 | Disintermediate end-to-end bandwidth\u003c/strike\u003e\n2018-10-01  12:30 - 13:30\u003cb\u003e | Iterate innovative networks\u003c/b\u003e\u003ci\u003e (awaiting, recurring)\u003c/i\u003e\n2018-10-01  13:30 - 14:50\u003cb\u003e | Engage holistic users\u003c/b\u003e\u003ci\u003e (self)\u003c/i\u003e\n\u003cstrike\u003e2018-10-01  13:30 - 14:30 | Enable e-business e-services\u003c/strike\u003e\n2018-10-01  15:00 - 15:30\u003cb\u003e | Innovate impactful technologies\u003c/b\u003e\u003ci\u003e (1:1)\u003c/i\u003e\n2018-10-01  16:00 - 17:00\u003cb\u003e | Iterate dynamic networks\u003c/b\u003e\u003ci\u003e (1:1, recurring)\u003c/i\u003e\n2018-10-01  16:45 - 17:00\u003cb\u003e | Deploy robust content\u003c/b\u003e\u003ci\u003e (recurring)\u003c/i\u003e\n2018-10-01  17:00 - 17:30\u003cb\u003e | Synthesize viral methodologies\u003c/b\u003e\u003ci\u003e (recurring)\u003c/i\u003e\n2018-10-01  17:30 - 17:55\u003cb\u003e | Scale collaborative methodologies\u003c/b\u003e\u003ci\u003e (1:1, recurring)\u003c/i\u003e\n\u003cstrike\u003e2018-10-01  18:00 - 20:30 | Seize rich experiences\u003c/strike\u003e\n\u003cstrike\u003e2018-10-01  18:30 - 19:00 | Engineer one-to-one e-business\u003c/strike\u003e\n2018-10-01  19:00 - 19:30\u003cb\u003e | Recontextualize collaborative content\u003c/b\u003e\u003ci\u003e (awaiting)\u003c/i\u003e\n2018-10-01               \u003cb\u003e | 🌎 Grey Mountains\u003c/b\u003e\u003ci\u003e (not-busy)\u003c/i\u003e\n\u003c/pre\u003e\n\nDisplay _only_ the commitments I have to other people using the `-c` option:\n\n\u003cpre\u003e\n\u003cb\u003e$\u003c/b\u003e calendar-assistant show -c 2018-10-01\n\u003ci\u003eme@example.com (all times in America/New_York)\n\u003c/i\u003e\n2018-10-01  10:30 - 10:55\u003cb\u003e | Whiteboard clicks-and-mortar metrics\u003c/b\u003e\u003ci\u003e (1:1, recurring)\u003c/i\u003e\n2018-10-01  11:00 - 11:30\u003cb\u003e | Architect holistic models\u003c/b\u003e\u003ci\u003e (recurring)\u003c/i\u003e\n2018-10-01  11:30 - 12:00\u003cb\u003e | Reinvent bleeding-edge e-services\u003c/b\u003e\u003ci\u003e (1:1, recurring)\u003c/i\u003e\n2018-10-01  11:50 - 12:00\u003cb\u003e | Synergize e-business systems\u003c/b\u003e\u003ci\u003e (awaiting)\u003c/i\u003e\n2018-10-01  12:30 - 13:30\u003cb\u003e | Iterate innovative networks\u003c/b\u003e\u003ci\u003e (awaiting, recurring)\u003c/i\u003e\n2018-10-01  15:00 - 15:30\u003cb\u003e | Innovate impactful technologies\u003c/b\u003e\u003ci\u003e (1:1)\u003c/i\u003e\n2018-10-01  16:00 - 17:00\u003cb\u003e | Iterate dynamic networks\u003c/b\u003e\u003ci\u003e (1:1, recurring)\u003c/i\u003e\n2018-10-01  16:45 - 17:00\u003cb\u003e | Deploy robust content\u003c/b\u003e\u003ci\u003e (recurring)\u003c/i\u003e\n2018-10-01  17:00 - 17:30\u003cb\u003e | Synthesize viral methodologies\u003c/b\u003e\u003ci\u003e (recurring)\u003c/i\u003e\n2018-10-01  17:30 - 17:55\u003cb\u003e | Scale collaborative methodologies\u003c/b\u003e\u003ci\u003e (1:1, recurring)\u003c/i\u003e\n2018-10-01  19:00 - 19:30\u003cb\u003e | Recontextualize collaborative content\u003c/b\u003e\u003ci\u003e (awaiting)\u003c/i\u003e\n\u003c/pre\u003e\n\n\n### `lint`: Calendar events that require action\n\n\u003cpre\u003e\nUsage:\n  calendar-assistant lint [DATE | DATERANGE | TIMERANGE]\n\nOptions:\n  -p,              [--profile=PROFILE]                                     # the profile you'd like to use (if different from default)\n  -l,              [--local-store=FILENAME]                                # Load events from a local file instead of Google Calendar\n  -a, --attendees, [--calendars=CALENDAR1[,CALENDAR2[,...]]]               # [default 'me'] people (email IDs) to whom this command will be applied\n  -b,              [--must-be=PROPERTY1[,PROPERTY2[,...]]]                 # Event properties that must be true (see README)\n  -n,              [--must-not-be=PROPERTY1[,PROPERTY2[,...]]]             # Event properties that must be false (see README)\n  -h, -?,          [--help], [--no-help], [--skip-help]                    \n                   [--debug], [--no-debug], [--skip-debug]                 # how dare you suggest there are bugs\n  -f,              [--formatting], [--no-formatting], [--skip-formatting]  # Enable Text Formatting\n                                                                           # Default: true\n\nLint your events for a date or range of dates (default 'today')\n\u003c/pre\u003e\n\nFor example: display all events that require action scheduled for tomorrow:\n\n\u003cpre\u003e\n\u003cb\u003e$\u003c/b\u003e calendar-assistant lint 2018-10-01\nme@example.com\n- looking for events that need attention\n- all times in America/New_York\n\n2018-10-01  11:50 - 12:00\u003cb\u003e | Synergize e-business systems\u003c/b\u003e\u003ci\u003e (awaiting)\u003c/i\u003e\n                                    attendees: 👍 three@example.com, 🤷 four@example.com\n2018-10-01  12:30 - 13:30\u003cb\u003e | Iterate innovative networks\u003c/b\u003e\u003ci\u003e (awaiting, recurring)\u003c/i\u003e\n                                    attendees: 👍 three@example.com, 🤷 four@example.com\n2018-10-01  19:00 - 19:30\u003cb\u003e | Recontextualize collaborative content\u003c/b\u003e\u003ci\u003e (awaiting)\u003c/i\u003e\n                                    attendees: 👍 three@example.com, 🤷 four@example.com\n\u003c/pre\u003e\n\n\n### `config`: View your configuration parameters\n\nCalendar 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:\n\n\u003cpre\u003e\nUsage:\n  calendar-assistant config\n\nOptions:\n  -h, -?, [--help], [--no-help], [--skip-help]                    \n          [--debug], [--no-debug], [--skip-debug]                 # how dare you suggest there are bugs\n  -f,     [--formatting], [--no-formatting], [--skip-formatting]  # Enable Text Formatting\n                                                                  # Default: true\n\nDump your configuration parameters (merge of defaults and overrides from /home/user/.calendar-assistant)\n\u003c/pre\u003e\n\nThe output is TOML, which is suitable for dumping into `~/.calendar-assistant` and editing.\n\n\u003cpre\u003e\n\u003cb\u003e$\u003c/b\u003e calendar-assistant config\n[settings]\nend-of-day = \"6pm\"\nlocation-icon = \"🌎\"\nmeeting-length = \"30m\"\nstart-of-day = \"9am\"\n\u003c/pre\u003e\n\n### `interactive`: Interactive Console\n\n\u003cpre\u003e\nUsage:\n  calendar-assistant interactive\n\nOptions:\n  -h, -?, [--help], [--no-help], [--skip-help]                    \n          [--debug], [--no-debug], [--skip-debug]                 # how dare you suggest there are bugs\n  -f,     [--formatting], [--no-formatting], [--skip-formatting]  # Enable Text Formatting\n                                                                  # Default: true\n\ninteractive console for calendar assistant\n\u003c/pre\u003e\n\nFor example, check the version of calendar assistant\n\n```\ncalendar-assistant\u003e version\n0.0.0\n```\n\n## Development\n\n### Running Tests Locally\n\n```bash\ngem install bundler\nbundle install\n\nbundle exec rake spec     # Run all tests except feature tests\nbundle exec rake features # Run only feature tests\nbundle exec rake          # Default task runs both feature and non feature tests\n```\n\n**Note:** Feature tests are excluded by default in [.rspec](.rspec)\n\n\n### Continuous Integration\n\nCI is running in [Github Actions](https://github.com/flavorjones/calendar-assistant/actions/workflows/test-suite.yml).\n\n\n### Code Quality\n\nWe're running [Code Climate](https://codeclimate.com/github/flavorjones/calendar-assistant) to monitor code quality and test coverage.\n\n\n### Generate README\n\n* Note that doing this requires npm to be installed\n* Generation will use a fixture file rather than connecting to a remote calendar. Fixtures can be updated/regenerated in [generate-fixtures](generate-fixtures) script\n\n```bash\n./generate-readme\n```\n\n\n## References\n\nGoogle Calendar Concepts: https://developers.google.com/calendar/concepts/\n\nGoogle Calendar API Reference: https://developers.google.com/calendar/v3/reference/\n\nGoogle Calendar Ruby Client Docs: https://www.rubydoc.info/github/google/google-api-ruby-client/Google/Apis/CalendarV3\n\n\n## License\n\nSee files `LICENSE` and `NOTICE` in this repository.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflavorjones%2Fcalendar-assistant","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflavorjones%2Fcalendar-assistant","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflavorjones%2Fcalendar-assistant/lists"}