haunts


Namehaunts JSON
Version 0.7.1 PyPI version JSON
download
home_pagehttps://github.com/keul/haunts
SummaryFill and sync Google Calendars with events taken from a Google spreadsheet
upload_time2024-04-13 12:22:52
maintainerNone
docs_urlNone
authorLuca Fabbri
requires_python>=3.9
licenseGNU General Public License v3
keywords google-calendar spreadsheet reports worklog
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            =============
B-Open Haunts
=============

.. image:: https://raw.githubusercontent.com/keul/haunts/main/docs/fear-of-the-worklog.jpg
        :target: https://dungeonsdragons.fandom.com/wiki/Haunt
        :alt: Haunt monster

\  

.. image:: https://img.shields.io/pypi/v/haunts.svg
        :target: https://pypi.python.org/pypi/haunts

.. contents:: Table of Contents

What it does
============

Fill Google Calendars with events taken from a Google Spreadsheet. Or the other way around.

How to install
==============

.. code-block:: bash

   pip install haunts

Prerequisites
=============

To use Google Calendar and Google Spreasheet APIs you must generate a Google API application and download a *credentials.json*:

* Run ``haunts --config``. It will create the ``~/.haunts`` folder and an ``haunts.ini`` file inside it.
* Edit the ``haunts.ini`` file by setting the ``CONTROLLER_SHEET_DOCUMENT_ID``
* Go to https://console.cloud.google.com/home/dashboard and create a Project called *haunts*.
  
  * In the search bar, search *Credentials APIs and services* and enable it.
  * Click on *Create Credentials*, set *Desktop* as the *type* and save the json file as ``~/.haunts/credentials.json``.
  * In the search bar, search *Google Sheets API* and *Google Calendar API* and activate them.
  
* Run ``haunts`` normally.
  It will ask you to authenticate to both the Google Sheets and the Google Calendar APIs (a browser should be automatically opened for you).
  This action will create the following files: ``~/.haunts/calendars-token.json`` and ``~/.haunts/sheets-token.json``

How to use
==========

Command line help is accessible using:

.. code-block:: bash

   haunts --help

Usage by examples
-----------------

To sync every available entry in a sheet named "May": 

.. code-block:: bash

   haunts May

To limits sync to events on a limited set of days:

.. code-block:: bash

   haunts --day=2021-05-24 --day=2021-05-25 --day=2021-05-28 May

To also limits sync to some projects (calendars):

.. code-block:: bash

   haunts --day=2021-05-24 --day=2021-05-25 --day=2021-05-28 --project="Project X" May

To execute only on rows where a "delete" action is defined (see "Actions" below):

.. code-block:: bash

   haunts --day=2021-05-24 --day=2021-05-25 --day=2021-05-28 --project="Project X" -a D May

To get the report instead of running calendar sync:

.. code-block:: bash

   haunts --execute report --day=2021-05-24 --day=2021-05-25 --day=2021-05-28 --project="Project X" May

To just report overtime entries in the set:

.. code-block:: bash

   haunts --execute report --day=2021-05-24 --day=2021-05-25 --day=2021-05-28 --project="Project X" --overtime May

To *read* today events from all configured calendar and write them on your "May" sheet for the current:

.. code-block:: bash

   haunts --execute read May

To *read* events for a specific date from all configured calendar and write them on your "May" sheet for the current:

.. code-block:: bash

   haunts --execute read -d 2023-05-15 May

How it works
------------

What haunts does depends on the ``--execute`` parameter.

In its default configuration (if ``--execute`` is omitted, or equal to ``sync``), the command will try to access a Google Spreatsheet you must have access to (write access required), specifically: it will read a single sheet at time inside that spreadsheet.
Every row inside this sheet is an event that will be also created on a Google Calendar.

Alternatively you can provide:

- ``--execute report``.
  
  In this case it just access the Google Spreadsheet to collect data.
- ``--execute read``.
  
  In this case it fills the Google Spreadsheet for you, by *reading* you calendars.

Sheet definition
----------------

The referenced sheet must contains a set of columns. Headers names are important but orders matters not.
Any additional columns will be ignored.

An `example sheet
<https://docs.google.com/spreadsheets/d/18ADhaNhEyr05cyNqXU-o-V4ialrzW9CS3XiFLM-glT4/edit#gid=998726384>`_ is provided.

The partition in multiple sheets is designed to keep every month in a separate sheet, but this is not strictly checked.

Every sheet should contains following headers:

**Date**
  (date)
  
  The day where the event will be created. If the date is not found, the line will be treated as an empty line (so: skipped)

**Start time**
  (time string in format ``HH:MM`` or empty) - *optional column*
  
  If provided, the current event will start at given time. This will influence also events defined after this row

**Spent**
  (number or empty)
  
  How long the event will last. Leave empty to create a full-day event.
  
  When executiing the report, full day event length is influences by ``OVERTIME_FROM`` configuration option

**Project**
  (string)
  
  Project name as it's named in the *config* sheet (see below)

**Activity**
  (string)
  
  Summary of the event

**Details**
  (string, optional)
  
  Additional text for the event description

**Event id**
  (string)
  
  Leave this empty. It will be filled with the id of the generated event

**Link**
  (text)
  
  Leave this empty. It will be filled with a link to the event inside Google Calendar

**Action**
  (chars)
  
  See below. If empty: it will be filled with an ``I`` when an event is created from this row

Configuring projects
~~~~~~~~~~~~~~~~~~~~

The spreadsheet must also contains a *configuration sheet* (default name is ``config``, can be changed in the .ini) where you must put at least two columns (with same headers as follows):

**id**
  The id of a Google Calendar associated to this project.
  You must have write access to this calendar.

**name**
  The name of the project, like a human readable name for a calendar.
  A project name can be associated to the same calendar id multiple times (this way you can have aliases).

**read_from** (optional)
  User only for ``--execute read``.

  Read events from this (optional) calendar id instead of the main one.
  This makes possible to *read* events from a calendar, but store them in another ones.

Values in the ``name`` column are valid values for the ``Project`` column introduced above.

How events will be filled
-------------------------

Let says you run something like this:

.. code-block:: bash

   haunts --day=2021-07-08 July

*haunts*  will access the sheet named ``July`` in the spreadsheet configured in the .ini file.
Only rows where the ``Date`` filed will match the ``--day`` parameter will be considered (if this param is not provided: the full sheet content is analyzed).

For every rows that match, *haunts* will:

- Generate a new event, starting from a default time (this can be configured in the .ini).
  The event will last for ``Spent`` hours
- The next event will start where the previous ended
- If the event will be successfully created, an "I" will be placed in the ``Action`` column.
  This will make future executions to ignore the line.
- Other columns will be read or filled as described above.

Actions
-------

Possible values you can find (or type yourself) in the ``Action`` column:

- ``I``
  
  *ignore*: execution will just ignore this line. This is commonly automatically filled by haunts itself, but you can add this value manually to ignore the line. Example: for events you already have on calendar but you want to track on the spreadsheet too.
- ``II``
  
  *ignore all*: same as ``I``, but also ignore rows in the ``--execute=report`` mode
- ``D``
  
  *delete*: execution will clear ``Action``, ``Event id`` and ``Link`` cells for this row, and delete the related event on the Google Calendar.
  As also ``Action`` is cleared, next execution will likely fill this line again. Use this as a poor-man-edit, to change something on the event.

When syncing a calendar (``--execute=sync``) you can use this column to filter on which rows execute sync by providing the ``--action`` option. For example:

.. code-block:: bash

   haunts --action D July

This will sync only rows where the "Action" column contains the delete (``D``) value.

Reporting feature
-----------------

Using ``haunts -e report <SHEET_NAME>`` will read the source Spreadsheet to collect statistical data.

Both ``-p`` and ``-d`` parameters are allowed.

The resulting table can be something like the following::

   Date        Project      Total
   ----------  ---------  -------
   2022-11-20  Calendar1        2
   2022-11-20  Calendar2        1
   2022-11-21  Calendar2        5
   2022-11-21  Calendar3        3
   2022-11-23  Calendar1       10
   2022-11-24  Calendar1        8
   2022-11-26  Calendar4        9
   2022-11-27  Calendar4        8
   2022-11-27  Calendar5        1
   ----------  ---------  -------
                               47

For every calendar and day found in the sheet, it report a total of hours spent.

Full day events are taken into account, and the overwork is also supported by configuring both ``OVERTIME_FROM`` (default is: no overwork support) and ``WORKING_HOURS`` (default is: 8).

If you want to report overtime, you can use the ``--overtime`` flag, and only overtime rows will counted.

TODO and known issues
=====================

* rows in the sheet must be sorted ascending
* *haunts* will not check for already filled time slots (yet?), so overlapping of events may happens
* ``-e report`` is calculating values on Python side, you know… we have a more reliable spreadsheet there
* ``-e report`` is counting overtime based on "Start time" column, while it's probably better to read start dates from events

Why?!
=====

In `B-Open
<https://www.bopen.eu/>`_ this is how we register our worklogs, participation to projects in multiple Google Calendars.

OK, but why "haunts"?!
----------------------

An haunt is a monster from `Dungeons&Dragons
<https://dungeonsdragons.fandom.com/wiki/Haunt>`_, which is translated in the italian version of the game as "Presenza".

But "presenza" is the same term used in italian for "participation", so how we call our worklogs.

And filling worklogs haunt us.

.. image:: https://raw.githubusercontent.com/keul/haunts/main/docs/pm.gif

Roadmap
=======

The following (ambitious) roadmap is based on the maturtiy level of the software, no timeline available yet.

- Alpha
  
  Fill worklogs in my place
- Beta
  
  Integration with GitHib Copilot, to write code for me
- Production/Stable
  
  Integration with GTP-4, to reply to collegues on Slack in my place
- Mature
  
  Profit
- Inactive
  
  (*I mean me… not the software*)

Credits
=======

Developers and contributors.

* keul (main-worklogs-hater)
* francesconazzaro (how-to-use-google-api-evangelist)
* gcammarota (reporting-tool-guy)



History
=======

0.7.1 (2024-04-13)
------------------

- read event selection: if user is in invited list, add the event only if she/he accepted or not answered
- read events: do not put event id (I action flag) when event cames from a linked calendar


0.7.0 (2024-04-09)
------------------

- Added ``read`` option to ``--execute``

0.6.0 (2023-03-31)
------------------

- Added ``II`` action

0.5.0 (2022-12-04)
------------------

- Renamed ``--action`` to ``--execute``
- new option:``--action`` to filter by values on "Action" column
- new option:``--overtime`` to just report overtime amount

0.4.0 (2022-12-01)
------------------

- Added ``-p`` parameter, to just act on specific project(s)
- Added ``--action``, and implemented ``report`` action (credits to @gcammarota)
- More detailed logging when deleting events with action ``D``

0.3.1 (2022-11-21)
------------------

- bugfix: if a row uses an ``I`` action, everything there is ignored
- When a project is not found: do not stop haunts but skip the line and report that when execution ends.
  Closes #14
- Empty lines now supported.
  Closes #12
- Human readable error message when the sheet is not found.
  Closes #11

0.3.0 (2022-05-02)
------------------

- Fixed: ``START_TIME`` default was not used.
  Closes #4
- New: new action: ``D``
- New: added "Start time" feature.
  Closes #7
- Fix: reduces number of writes.
  Closes #6
- Fix: do not fail badly when max number of requests per minutes is reached.
  See #1
- New: added "--config" for initial env configuration, improved documentation

0.2.1 (2022-02-10)
------------------

- Fixed full day criteria

0.2.0 (2021-07-29)
------------------

- Added support for full-day event

0.1.0 (2021-07-10)
------------------

* Initial release

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/keul/haunts",
    "name": "haunts",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "google-calendar spreadsheet reports worklog",
    "author": "Luca Fabbri",
    "author_email": "l.fabbri@bopen.eu",
    "download_url": "https://files.pythonhosted.org/packages/8b/f0/c608e83cc3d79f6bfbce78854853a65e33ada4efee4bf974407c6c24623f/haunts-0.7.1.tar.gz",
    "platform": null,
    "description": "=============\nB-Open Haunts\n=============\n\n.. image:: https://raw.githubusercontent.com/keul/haunts/main/docs/fear-of-the-worklog.jpg\n        :target: https://dungeonsdragons.fandom.com/wiki/Haunt\n        :alt: Haunt monster\n\n\\  \n\n.. image:: https://img.shields.io/pypi/v/haunts.svg\n        :target: https://pypi.python.org/pypi/haunts\n\n.. contents:: Table of Contents\n\nWhat it does\n============\n\nFill Google Calendars with events taken from a Google Spreadsheet. Or the other way around.\n\nHow to install\n==============\n\n.. code-block:: bash\n\n   pip install haunts\n\nPrerequisites\n=============\n\nTo use Google Calendar and Google Spreasheet APIs you must generate a Google API application and download a *credentials.json*:\n\n* Run ``haunts --config``. It will create the ``~/.haunts`` folder and an ``haunts.ini`` file inside it.\n* Edit the ``haunts.ini`` file by setting the ``CONTROLLER_SHEET_DOCUMENT_ID``\n* Go to https://console.cloud.google.com/home/dashboard and create a Project called *haunts*.\n  \n  * In the search bar, search *Credentials APIs and services* and enable it.\n  * Click on *Create Credentials*, set *Desktop* as the *type* and save the json file as ``~/.haunts/credentials.json``.\n  * In the search bar, search *Google Sheets API* and *Google Calendar API* and activate them.\n  \n* Run ``haunts`` normally.\n  It will ask you to authenticate to both the Google Sheets and the Google Calendar APIs (a browser should be automatically opened for you).\n  This action will create the following files: ``~/.haunts/calendars-token.json`` and ``~/.haunts/sheets-token.json``\n\nHow to use\n==========\n\nCommand line help is accessible using:\n\n.. code-block:: bash\n\n   haunts --help\n\nUsage by examples\n-----------------\n\nTo sync every available entry in a sheet named \"May\": \n\n.. code-block:: bash\n\n   haunts May\n\nTo limits sync to events on a limited set of days:\n\n.. code-block:: bash\n\n   haunts --day=2021-05-24 --day=2021-05-25 --day=2021-05-28 May\n\nTo also limits sync to some projects (calendars):\n\n.. code-block:: bash\n\n   haunts --day=2021-05-24 --day=2021-05-25 --day=2021-05-28 --project=\"Project X\" May\n\nTo execute only on rows where a \"delete\" action is defined (see \"Actions\" below):\n\n.. code-block:: bash\n\n   haunts --day=2021-05-24 --day=2021-05-25 --day=2021-05-28 --project=\"Project X\" -a D May\n\nTo get the report instead of running calendar sync:\n\n.. code-block:: bash\n\n   haunts --execute report --day=2021-05-24 --day=2021-05-25 --day=2021-05-28 --project=\"Project X\" May\n\nTo just report overtime entries in the set:\n\n.. code-block:: bash\n\n   haunts --execute report --day=2021-05-24 --day=2021-05-25 --day=2021-05-28 --project=\"Project X\" --overtime May\n\nTo *read* today events from all configured calendar and write them on your \"May\" sheet for the current:\n\n.. code-block:: bash\n\n   haunts --execute read May\n\nTo *read* events for a specific date from all configured calendar and write them on your \"May\" sheet for the current:\n\n.. code-block:: bash\n\n   haunts --execute read -d 2023-05-15 May\n\nHow it works\n------------\n\nWhat haunts does depends on the ``--execute`` parameter.\n\nIn its default configuration (if ``--execute`` is omitted, or equal to ``sync``), the command will try to access a Google Spreatsheet you must have access to (write access required), specifically: it will read a single sheet at time inside that spreadsheet.\nEvery row inside this sheet is an event that will be also created on a Google Calendar.\n\nAlternatively you can provide:\n\n- ``--execute report``.\n  \n  In this case it just access the Google Spreadsheet to collect data.\n- ``--execute read``.\n  \n  In this case it fills the Google Spreadsheet for you, by *reading* you calendars.\n\nSheet definition\n----------------\n\nThe referenced sheet must contains a set of columns. Headers names are important but orders matters not.\nAny additional columns will be ignored.\n\nAn `example sheet\n<https://docs.google.com/spreadsheets/d/18ADhaNhEyr05cyNqXU-o-V4ialrzW9CS3XiFLM-glT4/edit#gid=998726384>`_ is provided.\n\nThe partition in multiple sheets is designed to keep every month in a separate sheet, but this is not strictly checked.\n\nEvery sheet should contains following headers:\n\n**Date**\n  (date)\n  \n  The day where the event will be created. If the date is not found, the line will be treated as an empty line (so: skipped)\n\n**Start time**\n  (time string in format ``HH:MM`` or empty) - *optional column*\n  \n  If provided, the current event will start at given time. This will influence also events defined after this row\n\n**Spent**\n  (number or empty)\n  \n  How long the event will last. Leave empty to create a full-day event.\n  \n  When executiing the report, full day event length is influences by ``OVERTIME_FROM`` configuration option\n\n**Project**\n  (string)\n  \n  Project name as it's named in the *config* sheet (see below)\n\n**Activity**\n  (string)\n  \n  Summary of the event\n\n**Details**\n  (string, optional)\n  \n  Additional text for the event description\n\n**Event id**\n  (string)\n  \n  Leave this empty. It will be filled with the id of the generated event\n\n**Link**\n  (text)\n  \n  Leave this empty. It will be filled with a link to the event inside Google Calendar\n\n**Action**\n  (chars)\n  \n  See below. If empty: it will be filled with an ``I`` when an event is created from this row\n\nConfiguring projects\n~~~~~~~~~~~~~~~~~~~~\n\nThe spreadsheet must also contains a *configuration sheet* (default name is ``config``, can be changed in the .ini) where you must put at least two columns (with same headers as follows):\n\n**id**\n  The id of a Google Calendar associated to this project.\n  You must have write access to this calendar.\n\n**name**\n  The name of the project, like a human readable name for a calendar.\n  A project name can be associated to the same calendar id multiple times (this way you can have aliases).\n\n**read_from** (optional)\n  User only for ``--execute read``.\n\n  Read events from this (optional) calendar id instead of the main one.\n  This makes possible to *read* events from a calendar, but store them in another ones.\n\nValues in the ``name`` column are valid values for the ``Project`` column introduced above.\n\nHow events will be filled\n-------------------------\n\nLet says you run something like this:\n\n.. code-block:: bash\n\n   haunts --day=2021-07-08 July\n\n*haunts*  will access the sheet named ``July`` in the spreadsheet configured in the .ini file.\nOnly rows where the ``Date`` filed will match the ``--day`` parameter will be considered (if this param is not provided: the full sheet content is analyzed).\n\nFor every rows that match, *haunts* will:\n\n- Generate a new event, starting from a default time (this can be configured in the .ini).\n  The event will last for ``Spent`` hours\n- The next event will start where the previous ended\n- If the event will be successfully created, an \"I\" will be placed in the ``Action`` column.\n  This will make future executions to ignore the line.\n- Other columns will be read or filled as described above.\n\nActions\n-------\n\nPossible values you can find (or type yourself) in the ``Action`` column:\n\n- ``I``\n  \n  *ignore*: execution will just ignore this line. This is commonly automatically filled by haunts itself, but you can add this value manually to ignore the line. Example: for events you already have on calendar but you want to track on the spreadsheet too.\n- ``II``\n  \n  *ignore all*: same as ``I``, but also ignore rows in the ``--execute=report`` mode\n- ``D``\n  \n  *delete*: execution will clear ``Action``, ``Event id`` and ``Link`` cells for this row, and delete the related event on the Google Calendar.\n  As also ``Action`` is cleared, next execution will likely fill this line again. Use this as a poor-man-edit, to change something on the event.\n\nWhen syncing a calendar (``--execute=sync``) you can use this column to filter on which rows execute sync by providing the ``--action`` option. For example:\n\n.. code-block:: bash\n\n   haunts --action D July\n\nThis will sync only rows where the \"Action\" column contains the delete (``D``) value.\n\nReporting feature\n-----------------\n\nUsing ``haunts -e report <SHEET_NAME>`` will read the source Spreadsheet to collect statistical data.\n\nBoth ``-p`` and ``-d`` parameters are allowed.\n\nThe resulting table can be something like the following::\n\n   Date        Project      Total\n   ----------  ---------  -------\n   2022-11-20  Calendar1        2\n   2022-11-20  Calendar2        1\n   2022-11-21  Calendar2        5\n   2022-11-21  Calendar3        3\n   2022-11-23  Calendar1       10\n   2022-11-24  Calendar1        8\n   2022-11-26  Calendar4        9\n   2022-11-27  Calendar4        8\n   2022-11-27  Calendar5        1\n   ----------  ---------  -------\n                               47\n\nFor every calendar and day found in the sheet, it report a total of hours spent.\n\nFull day events are taken into account, and the overwork is also supported by configuring both ``OVERTIME_FROM`` (default is: no overwork support) and ``WORKING_HOURS`` (default is: 8).\n\nIf you want to report overtime, you can use the ``--overtime`` flag, and only overtime rows will counted.\n\nTODO and known issues\n=====================\n\n* rows in the sheet must be sorted ascending\n* *haunts* will not check for already filled time slots (yet?), so overlapping of events may happens\n* ``-e report`` is calculating values on Python side, you know\u2026 we have a more reliable spreadsheet there\n* ``-e report`` is counting overtime based on \"Start time\" column, while it's probably better to read start dates from events\n\nWhy?!\n=====\n\nIn `B-Open\n<https://www.bopen.eu/>`_ this is how we register our worklogs, participation to projects in multiple Google Calendars.\n\nOK, but why \"haunts\"?!\n----------------------\n\nAn haunt is a monster from `Dungeons&Dragons\n<https://dungeonsdragons.fandom.com/wiki/Haunt>`_, which is translated in the italian version of the game as \"Presenza\".\n\nBut \"presenza\" is the same term used in italian for \"participation\", so how we call our worklogs.\n\nAnd filling worklogs haunt us.\n\n.. image:: https://raw.githubusercontent.com/keul/haunts/main/docs/pm.gif\n\nRoadmap\n=======\n\nThe following (ambitious) roadmap is based on the maturtiy level of the software, no timeline available yet.\n\n- Alpha\n  \n  Fill worklogs in my place\n- Beta\n  \n  Integration with GitHib Copilot, to write code for me\n- Production/Stable\n  \n  Integration with GTP-4, to reply to collegues on Slack in my place\n- Mature\n  \n  Profit\n- Inactive\n  \n  (*I mean me\u2026 not the software*)\n\nCredits\n=======\n\nDevelopers and contributors.\n\n* keul (main-worklogs-hater)\n* francesconazzaro (how-to-use-google-api-evangelist)\n* gcammarota (reporting-tool-guy)\n\n\n\nHistory\n=======\n\n0.7.1 (2024-04-13)\n------------------\n\n- read event selection: if user is in invited list, add the event only if she/he accepted or not answered\n- read events: do not put event id (I action flag) when event cames from a linked calendar\n\n\n0.7.0 (2024-04-09)\n------------------\n\n- Added ``read`` option to ``--execute``\n\n0.6.0 (2023-03-31)\n------------------\n\n- Added ``II`` action\n\n0.5.0 (2022-12-04)\n------------------\n\n- Renamed ``--action`` to ``--execute``\n- new option:``--action`` to filter by values on \"Action\" column\n- new option:``--overtime`` to just report overtime amount\n\n0.4.0 (2022-12-01)\n------------------\n\n- Added ``-p`` parameter, to just act on specific project(s)\n- Added ``--action``, and implemented ``report`` action (credits to @gcammarota)\n- More detailed logging when deleting events with action ``D``\n\n0.3.1 (2022-11-21)\n------------------\n\n- bugfix: if a row uses an ``I`` action, everything there is ignored\n- When a project is not found: do not stop haunts but skip the line and report that when execution ends.\n  Closes #14\n- Empty lines now supported.\n  Closes #12\n- Human readable error message when the sheet is not found.\n  Closes #11\n\n0.3.0 (2022-05-02)\n------------------\n\n- Fixed: ``START_TIME`` default was not used.\n  Closes #4\n- New: new action: ``D``\n- New: added \"Start time\" feature.\n  Closes #7\n- Fix: reduces number of writes.\n  Closes #6\n- Fix: do not fail badly when max number of requests per minutes is reached.\n  See #1\n- New: added \"--config\" for initial env configuration, improved documentation\n\n0.2.1 (2022-02-10)\n------------------\n\n- Fixed full day criteria\n\n0.2.0 (2021-07-29)\n------------------\n\n- Added support for full-day event\n\n0.1.0 (2021-07-10)\n------------------\n\n* Initial release\n",
    "bugtrack_url": null,
    "license": "GNU General Public License v3",
    "summary": "Fill and sync Google Calendars with events taken from a Google spreadsheet",
    "version": "0.7.1",
    "project_urls": {
        "Homepage": "https://github.com/keul/haunts"
    },
    "split_keywords": [
        "google-calendar",
        "spreadsheet",
        "reports",
        "worklog"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6875bbf03feeea7c57125559abb653815b5628d5f918e18da17c4f55e38286e8",
                "md5": "8e0cb86e674be7e16d7ba56e3858b80b",
                "sha256": "87ff111f83a0acbc3abb7be510aa8aa6f2450fbcbf4851cd557bfb63c7b80417"
            },
            "downloads": -1,
            "filename": "haunts-0.7.1-py2.py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "8e0cb86e674be7e16d7ba56e3858b80b",
            "packagetype": "bdist_wheel",
            "python_version": "py2.py3",
            "requires_python": ">=3.9",
            "size": 20760,
            "upload_time": "2024-04-13T12:22:50",
            "upload_time_iso_8601": "2024-04-13T12:22:50.320550Z",
            "url": "https://files.pythonhosted.org/packages/68/75/bbf03feeea7c57125559abb653815b5628d5f918e18da17c4f55e38286e8/haunts-0.7.1-py2.py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8bf0c608e83cc3d79f6bfbce78854853a65e33ada4efee4bf974407c6c24623f",
                "md5": "05daf8e0b6d481c5b08b9cc3602eb867",
                "sha256": "75e96f8e66844f0d4484d38c4318b8dfcd985af46801f9772b093f43be7ac9bc"
            },
            "downloads": -1,
            "filename": "haunts-0.7.1.tar.gz",
            "has_sig": false,
            "md5_digest": "05daf8e0b6d481c5b08b9cc3602eb867",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 176066,
            "upload_time": "2024-04-13T12:22:52",
            "upload_time_iso_8601": "2024-04-13T12:22:52.891834Z",
            "url": "https://files.pythonhosted.org/packages/8b/f0/c608e83cc3d79f6bfbce78854853a65e33ada4efee4bf974407c6c24623f/haunts-0.7.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-13 12:22:52",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "keul",
    "github_project": "haunts",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "tox": true,
    "lcname": "haunts"
}
        
Elapsed time: 0.23944s