1
0
mirror of https://github.com/b4tman/sync_ics2gcal synced 2026-02-05 07:44:59 +00:00

219 Commits

Author SHA1 Message Date
dependabot[bot]
95208568cb Bump google-api-python-client from 2.116.0 to 2.120.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.116.0 to 2.120.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.116.0...v2.120.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-01 09:45:32 +03:00
dependabot[bot]
bfa8079560 Bump google-auth from 2.27.0 to 2.28.1
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.27.0 to 2.28.1.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.27.0...v2.28.1)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-01 09:40:24 +03:00
dependabot[bot]
914b69d81a Bump pytest from 8.0.0 to 8.0.2
Bumps [pytest](https://github.com/pytest-dev/pytest) from 8.0.0 to 8.0.2.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/8.0.0...8.0.2)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-01 09:10:09 +03:00
dependabot[bot]
ff9d82a5b1 Bump black from 24.1.1 to 24.2.0
Bumps [black](https://github.com/psf/black) from 24.1.1 to 24.2.0.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/24.1.1...24.2.0)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-01 09:09:50 +03:00
dependabot[bot]
228591580f Bump pytz from 2023.4 to 2024.1
Bumps [pytz](https://github.com/stub42/pytz) from 2023.4 to 2024.1.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2023.4...release_2024.1)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-01 09:09:29 +03:00
dependabot[bot]
4135802850 Bump types-pytz from 2023.3.1.1 to 2024.1.0.20240203
Bumps [types-pytz](https://github.com/python/typeshed) from 2023.3.1.1 to 2024.1.0.20240203.
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pytz
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-05 23:40:33 +03:00
dependabot[bot]
d6cc89456a Bump types-python-dateutil from 2.8.19.14 to 2.8.19.20240106
Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.8.19.14 to 2.8.19.20240106.
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-python-dateutil
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-05 23:33:58 +03:00
dependabot[bot]
6f93231a79 Bump google-api-python-client from 2.111.0 to 2.116.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.111.0 to 2.116.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.111.0...v2.116.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-05 23:29:07 +03:00
dependabot[bot]
314ed34dc7 Bump google-auth from 2.25.2 to 2.27.0
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.25.2 to 2.27.0.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.25.2...v2.27.0)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-05 23:23:09 +03:00
dependabot[bot]
47015c3c5e Bump pytest from 7.4.4 to 8.0.0
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.4 to 8.0.0.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.4.4...8.0.0)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-05 23:20:43 +03:00
dependabot[bot]
60543837f7 Bump lxml from 5.0.0 to 5.1.0
Bumps [lxml](https://github.com/lxml/lxml) from 5.0.0 to 5.1.0.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-5.0.0...lxml-5.1.0)

---
updated-dependencies:
- dependency-name: lxml
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-05 23:13:53 +03:00
dependabot[bot]
391de7570b Bump black from 23.12.1 to 24.1.1
Bumps [black](https://github.com/psf/black) from 23.12.1 to 24.1.1.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/23.12.1...24.1.1)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-05 23:11:19 +03:00
dependabot[bot]
2d62495068 Bump pytz from 2023.3.post1 to 2023.4
Bumps [pytz](https://github.com/stub42/pytz) from 2023.3.post1 to 2023.4.
- [Commits](https://github.com/stub42/pytz/compare/release_2023.3.post1...release_2023.4)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-05 23:02:47 +03:00
dependabot[bot]
d0944b4a56 Bump jinja2 from 3.1.2 to 3.1.3
Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3.
- [Release notes](https://github.com/pallets/jinja/releases)
- [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3)

---
updated-dependencies:
- dependency-name: jinja2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-12 08:48:53 +03:00
dependabot[bot]
5bb33d1cb7 Bump google-api-python-client from 2.109.0 to 2.111.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.109.0 to 2.111.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.109.0...v2.111.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-01 23:32:28 +03:00
dependabot[bot]
e7cbd72569 Bump google-auth from 2.24.0 to 2.25.2
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.24.0 to 2.25.2.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.24.0...v2.25.2)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-01 23:27:03 +03:00
dependabot[bot]
6b7f4ce5ff Bump lxml from 4.9.3 to 5.0.0
Bumps [lxml](https://github.com/lxml/lxml) from 4.9.3 to 5.0.0.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-4.9.3...lxml-5.0.0)

---
updated-dependencies:
- dependency-name: lxml
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-01 22:45:47 +03:00
dependabot[bot]
99b39b2abf Bump pytest from 7.4.3 to 7.4.4
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.3 to 7.4.4.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.4.3...7.4.4)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-01 22:42:49 +03:00
dependabot[bot]
5e6e173525 Bump mypy from 1.7.1 to 1.8.0
Bumps [mypy](https://github.com/python/mypy) from 1.7.1 to 1.8.0.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python/mypy/compare/v1.7.1...v1.8.0)

---
updated-dependencies:
- dependency-name: mypy
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-01 22:41:43 +03:00
dependabot[bot]
5fd1c75a25 Bump black from 23.11.0 to 23.12.1
Bumps [black](https://github.com/psf/black) from 23.11.0 to 23.12.1.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/23.11.0...23.12.1)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-01 22:41:03 +03:00
dependabot[bot]
4ba6a3cbd5 Bump icalendar from 5.0.10 to 5.0.11
Bumps [icalendar](https://github.com/collective/icalendar) from 5.0.10 to 5.0.11.
- [Changelog](https://github.com/collective/icalendar/blob/master/CHANGES.rst)
- [Commits](https://github.com/collective/icalendar/compare/v5.0.10...v5.0.11)

---
updated-dependencies:
- dependency-name: icalendar
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-01 12:50:42 +03:00
dependabot[bot]
20db097fed Bump google-auth from 2.23.4 to 2.24.0
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.23.4 to 2.24.0.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.23.4...v2.24.0)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-01 12:46:21 +03:00
dependabot[bot]
f0363d7b0b Bump google-api-python-client from 2.106.0 to 2.109.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.106.0 to 2.109.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.106.0...v2.109.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-01 12:20:09 +03:00
dependabot[bot]
6b7f1df64b Bump black from 23.10.1 to 23.11.0
Bumps [black](https://github.com/psf/black) from 23.10.1 to 23.11.0.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/23.10.1...23.11.0)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-01 12:14:21 +03:00
dependabot[bot]
cf85c3c3f9 Bump mypy from 1.6.1 to 1.7.1
Bumps [mypy](https://github.com/python/mypy) from 1.6.1 to 1.7.1.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python/mypy/compare/v1.6.1...v1.7.1)

---
updated-dependencies:
- dependency-name: mypy
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-01 12:13:13 +03:00
dependabot[bot]
bc5082e10e Bump sphinx-rtd-theme from 1.3.0 to 2.0.0
Bumps [sphinx-rtd-theme](https://github.com/readthedocs/sphinx_rtd_theme) from 1.3.0 to 2.0.0.
- [Changelog](https://github.com/readthedocs/sphinx_rtd_theme/blob/master/docs/changelog.rst)
- [Commits](https://github.com/readthedocs/sphinx_rtd_theme/compare/1.3.0...2.0.0)

---
updated-dependencies:
- dependency-name: sphinx-rtd-theme
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-01 11:34:07 +03:00
dependabot[bot]
dcf5fc428a Bump google-api-python-client from 2.101.0 to 2.106.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.101.0 to 2.106.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.101.0...v2.106.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-01 11:48:31 +03:00
dependabot[bot]
a8f887de52 Bump google-auth from 2.23.2 to 2.23.4
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.23.2 to 2.23.4.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.23.2...v2.23.4)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-01 10:24:09 +03:00
dependabot[bot]
49420f417f Bump black from 23.9.1 to 23.10.1
Bumps [black](https://github.com/psf/black) from 23.9.1 to 23.10.1.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/23.9.1...23.10.1)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-01 10:15:11 +03:00
dependabot[bot]
21fc0b9db4 Bump pytest from 7.4.2 to 7.4.3
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.2 to 7.4.3.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.4.2...7.4.3)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-01 08:45:51 +03:00
dependabot[bot]
79191247b4 Bump mypy from 1.5.1 to 1.6.1
Bumps [mypy](https://github.com/python/mypy) from 1.5.1 to 1.6.1.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python/mypy/compare/v1.5.1...v1.6.1)

---
updated-dependencies:
- dependency-name: mypy
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-01 08:36:55 +03:00
dependabot[bot]
fe70c3acd6 Bump urllib3 from 1.26.17 to 1.26.18
Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.17 to 1.26.18.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/1.26.17...1.26.18)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-18 09:59:34 +03:00
dependabot[bot]
b3df47b8be Bump urllib3 from 1.26.16 to 1.26.17
Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.16 to 1.26.17.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/1.26.16...1.26.17)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-03 08:32:18 +03:00
dependabot[bot]
3c98345014 Bump google-api-python-client from 2.97.0 to 2.101.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.97.0 to 2.101.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.97.0...v2.101.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-01 15:15:35 +03:00
dependabot[bot]
ec45edb8f2 Bump google-auth from 2.22.0 to 2.23.2
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.22.0 to 2.23.2.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.22.0...v2.23.2)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-01 14:15:13 +03:00
dependabot[bot]
122b311b8a Bump icalendar from 5.0.7 to 5.0.10
Bumps [icalendar](https://github.com/collective/icalendar) from 5.0.7 to 5.0.10.
- [Changelog](https://github.com/collective/icalendar/blob/master/CHANGES.rst)
- [Commits](https://github.com/collective/icalendar/compare/v5.0.7...v5.0.10)

---
updated-dependencies:
- dependency-name: icalendar
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-01 13:19:51 +03:00
dependabot[bot]
f36a5ad064 Bump pytest from 7.4.0 to 7.4.2
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.4.0 to 7.4.2.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.4.0...7.4.2)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-01 13:17:32 +03:00
dependabot[bot]
e11139d76f Bump types-pyyaml from 6.0.12.11 to 6.0.12.12
Bumps [types-pyyaml](https://github.com/python/typeshed) from 6.0.12.11 to 6.0.12.12.
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pyyaml
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-01 13:15:06 +03:00
dependabot[bot]
42ad4da28d Bump black from 23.7.0 to 23.9.1
Bumps [black](https://github.com/psf/black) from 23.7.0 to 23.9.1.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/23.7.0...23.9.1)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-01 13:13:38 +03:00
dependabot[bot]
550a73eb29 Bump types-pytz from 2023.3.0.1 to 2023.3.1.1
Bumps [types-pytz](https://github.com/python/typeshed) from 2023.3.0.1 to 2023.3.1.1.
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pytz
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-01 13:09:58 +03:00
dependabot[bot]
b1332b8d64 Bump pytz from 2023.3 to 2023.3.post1
Bumps [pytz](https://github.com/stub42/pytz) from 2023.3 to 2023.3.post1.
- [Commits](https://github.com/stub42/pytz/compare/release_2023.3...release_2023.3.post1)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-01 13:07:43 +03:00
dependabot[bot]
8a0904f68b Bump google-api-python-client from 2.95.0 to 2.97.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.95.0 to 2.97.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.95.0...v2.97.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-01 15:02:43 +03:00
dependabot[bot]
ca6d0bf525 Bump sphinx-rtd-theme from 1.3.0rc1 to 1.3.0
Bumps [sphinx-rtd-theme](https://github.com/readthedocs/sphinx_rtd_theme) from 1.3.0rc1 to 1.3.0.
- [Changelog](https://github.com/readthedocs/sphinx_rtd_theme/blob/master/docs/changelog.rst)
- [Commits](https://github.com/readthedocs/sphinx_rtd_theme/compare/1.3.0rc1...1.3.0)

---
updated-dependencies:
- dependency-name: sphinx-rtd-theme
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-01 08:49:44 +03:00
d2db9f9472 add py.typed 2023-08-20 23:29:38 +03:00
Dmitry Belyaev
657b0c0621 Merge pull request #204 from b4tman/docs
add docs
2023-08-20 23:15:24 +03:00
545cde2ccc add docs 2023-08-20 23:08:56 +03:00
b2c4136a92 upd poetry.lock
to fix https://github.com/b4tman/sync_ics2gcal/security/dependabot/6
2023-08-16 09:49:39 +03:00
dependabot[bot]
a65b544c8b Bump google-api-python-client from 2.91.0 to 2.95.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.91.0 to 2.95.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.91.0...v2.95.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-01 15:04:11 +03:00
dependabot[bot]
52867a2f8e Bump google-auth from 2.21.0 to 2.22.0
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.21.0 to 2.22.0.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.21.0...v2.22.0)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-01 14:33:02 +03:00
dependabot[bot]
16e78dadbd Bump lxml from 4.9.2 to 4.9.3
Bumps [lxml](https://github.com/lxml/lxml) from 4.9.2 to 4.9.3.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-4.9.2...lxml-4.9.3)

---
updated-dependencies:
- dependency-name: lxml
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-01 13:33:06 +03:00
dependabot[bot]
ecaf9c4a39 Bump black from 23.3.0 to 23.7.0
Bumps [black](https://github.com/psf/black) from 23.3.0 to 23.7.0.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/23.3.0...23.7.0)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-01 09:57:23 +03:00
dependabot[bot]
17e28f5eab Bump types-pyyaml from 6.0.12.10 to 6.0.12.11
Bumps [types-pyyaml](https://github.com/python/typeshed) from 6.0.12.10 to 6.0.12.11.
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pyyaml
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-01 09:41:22 +03:00
dependabot[bot]
1d91cd37a2 Bump types-python-dateutil from 2.8.19.13 to 2.8.19.14
Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.8.19.13 to 2.8.19.14.
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-python-dateutil
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-01 09:21:49 +03:00
dependabot[bot]
f23adf3730 Bump pyyaml from 6.0 to 6.0.1
Bumps [pyyaml](https://github.com/yaml/pyyaml) from 6.0 to 6.0.1.
- [Changelog](https://github.com/yaml/pyyaml/blob/6.0.1/CHANGES)
- [Commits](https://github.com/yaml/pyyaml/compare/6.0...6.0.1)

---
updated-dependencies:
- dependency-name: pyyaml
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-08-01 09:00:20 +03:00
dependabot[bot]
b5e34a7175 Bump google-api-python-client from 2.88.0 to 2.91.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.88.0 to 2.91.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.88.0...v2.91.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-01 12:54:13 +03:00
dependabot[bot]
3709159f73 Bump google-auth from 2.19.0 to 2.21.0
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.19.0 to 2.21.0.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.19.0...v2.21.0)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-01 12:13:39 +03:00
dependabot[bot]
6cf5b936b1 Bump pytest from 7.3.1 to 7.4.0
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.3.1 to 7.4.0.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.3.1...7.4.0)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-01 11:45:39 +03:00
dependabot[bot]
830c6d6493 Bump mypy from 1.3.0 to 1.4.1
Bumps [mypy](https://github.com/python/mypy) from 1.3.0 to 1.4.1.
- [Commits](https://github.com/python/mypy/compare/v1.3.0...v1.4.1)

---
updated-dependencies:
- dependency-name: mypy
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-01 11:37:07 +03:00
dependabot[bot]
55ae6e70cc Bump google-api-python-client from 2.86.0 to 2.88.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.86.0 to 2.88.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.86.0...v2.88.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 13:23:54 +03:00
dependabot[bot]
cc107eb295 Bump google-auth from 2.17.3 to 2.19.0
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.17.3 to 2.19.0.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.17.3...v2.19.0)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 13:08:02 +03:00
dependabot[bot]
14a3492ed5 Bump icalendar from 5.0.5 to 5.0.7
Bumps [icalendar](https://github.com/collective/icalendar) from 5.0.5 to 5.0.7.
- [Changelog](https://github.com/collective/icalendar/blob/master/CHANGES.rst)
- [Commits](https://github.com/collective/icalendar/compare/v5.0.5...v5.0.7)

---
updated-dependencies:
- dependency-name: icalendar
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 11:45:30 +03:00
dependabot[bot]
12bb35ca33 Bump mypy from 1.2.0 to 1.3.0
Bumps [mypy](https://github.com/python/mypy) from 1.2.0 to 1.3.0.
- [Commits](https://github.com/python/mypy/compare/v1.2.0...v1.3.0)

---
updated-dependencies:
- dependency-name: mypy
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 11:28:50 +03:00
dependabot[bot]
dee0aad617 Bump types-python-dateutil from 2.8.19.12 to 2.8.19.13
Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.8.19.12 to 2.8.19.13.
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-python-dateutil
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 09:16:17 +03:00
dependabot[bot]
ac318237e0 Bump types-pyyaml from 6.0.12.9 to 6.0.12.10
Bumps [types-pyyaml](https://github.com/python/typeshed) from 6.0.12.9 to 6.0.12.10.
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pyyaml
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-06-01 09:04:47 +03:00
dependabot[bot]
c9f51c98c7 Bump requests from 2.27.1 to 2.31.0
Bumps [requests](https://github.com/psf/requests) from 2.27.1 to 2.31.0.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.27.1...v2.31.0)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-23 08:33:37 +03:00
dependabot[bot]
ab441a18e1 Bump google-api-python-client from 2.83.0 to 2.86.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.83.0 to 2.86.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.83.0...v2.86.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-02 11:28:25 +03:00
dependabot[bot]
aad1b7d266 Bump google-auth from 2.17.1 to 2.17.3
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.17.1 to 2.17.3.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.17.1...v2.17.3)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-02 10:48:00 +03:00
dependabot[bot]
1c0074a308 Bump icalendar from 5.0.4 to 5.0.5
Bumps [icalendar](https://github.com/collective/icalendar) from 5.0.4 to 5.0.5.
- [Release notes](https://github.com/collective/icalendar/releases)
- [Changelog](https://github.com/collective/icalendar/blob/master/CHANGES.rst)
- [Commits](https://github.com/collective/icalendar/compare/v5.0.4...v5.0.5)

---
updated-dependencies:
- dependency-name: icalendar
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-02 10:17:21 +03:00
dependabot[bot]
2e684ca132 Bump pytest from 7.2.2 to 7.3.1
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.2.2 to 7.3.1.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.2.2...7.3.1)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-02 10:11:26 +03:00
dependabot[bot]
5a64414bb6 Bump mypy from 1.1.1 to 1.2.0
Bumps [mypy](https://github.com/python/mypy) from 1.1.1 to 1.2.0.
- [Release notes](https://github.com/python/mypy/releases)
- [Commits](https://github.com/python/mypy/compare/v1.1.1...v1.2.0)

---
updated-dependencies:
- dependency-name: mypy
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-02 10:05:58 +03:00
dependabot[bot]
169faa4505 Bump types-python-dateutil from 2.8.19.11 to 2.8.19.12
Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.8.19.11 to 2.8.19.12.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-python-dateutil
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-02 09:30:47 +03:00
dependabot[bot]
9a03984642 Bump google-api-python-client from 2.79.0 to 2.83.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.79.0 to 2.83.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.79.0...v2.83.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-01 23:26:24 +03:00
dependabot[bot]
20343c8719 Bump google-auth from 2.16.1 to 2.17.1
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.16.1 to 2.17.1.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.16.1...v2.17.1)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-01 23:19:36 +03:00
dependabot[bot]
830feaf3fc Bump mypy from 1.0.1 to 1.1.1
Bumps [mypy](https://github.com/python/mypy) from 1.0.1 to 1.1.1.
- [Release notes](https://github.com/python/mypy/releases)
- [Commits](https://github.com/python/mypy/compare/v1.0.1...v1.1.1)

---
updated-dependencies:
- dependency-name: mypy
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-01 19:39:41 +03:00
dependabot[bot]
9d38a8cde4 Bump pytest from 7.2.1 to 7.2.2
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.2.1 to 7.2.2.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.2.1...7.2.2)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-01 19:20:49 +03:00
dependabot[bot]
178c41c411 Bump black from 23.1.0 to 23.3.0
Bumps [black](https://github.com/psf/black) from 23.1.0 to 23.3.0.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/23.1.0...23.3.0)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-01 18:44:39 +03:00
dependabot[bot]
c2f59f9562 Bump pytz from 2022.7.1 to 2023.3
Bumps [pytz](https://github.com/stub42/pytz) from 2022.7.1 to 2023.3.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2022.7.1...release_2023.3)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-01 13:09:39 +03:00
dependabot[bot]
fe07b21e5d Bump types-pytz from 2022.7.1.2 to 2023.3.0.0
Bumps [types-pytz](https://github.com/python/typeshed) from 2022.7.1.2 to 2023.3.0.0.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pytz
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-01 13:09:14 +03:00
dependabot[bot]
c806ec25e4 Bump types-pyyaml from 6.0.12.8 to 6.0.12.9
Bumps [types-pyyaml](https://github.com/python/typeshed) from 6.0.12.8 to 6.0.12.9.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pyyaml
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-01 13:08:56 +03:00
dependabot[bot]
c426ecf06d Bump types-python-dateutil from 2.8.19.9 to 2.8.19.11
Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.8.19.9 to 2.8.19.11.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-python-dateutil
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-01 13:08:38 +03:00
5f0aa46e28 add python 3.11 2023-03-11 22:49:29 +03:00
dependabot[bot]
ee3e5ba613 Bump google-auth from 2.16.0 to 2.16.1
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.16.0 to 2.16.1.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.16.0...v2.16.1)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-01 12:45:45 +03:00
dependabot[bot]
45610c8bfe Bump google-api-python-client from 2.76.0 to 2.79.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.76.0 to 2.79.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.76.0...v2.79.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-01 12:35:31 +03:00
dependabot[bot]
5591765911 Bump mypy from 0.991 to 1.0.1
Bumps [mypy](https://github.com/python/mypy) from 0.991 to 1.0.1.
- [Release notes](https://github.com/python/mypy/releases)
- [Commits](https://github.com/python/mypy/compare/v0.991...v1.0.1)

---
updated-dependencies:
- dependency-name: mypy
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-01 12:34:34 +03:00
dependabot[bot]
b209fff2a1 Bump types-pytz from 2022.7.1.0 to 2022.7.1.2
Bumps [types-pytz](https://github.com/python/typeshed) from 2022.7.1.0 to 2022.7.1.2.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pytz
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-01 12:33:07 +03:00
dependabot[bot]
69fc8560b6 Bump types-python-dateutil from 2.8.19.6 to 2.8.19.9
Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.8.19.6 to 2.8.19.9.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-python-dateutil
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-01 11:54:12 +03:00
dependabot[bot]
3e00dfffa4 Bump types-pyyaml from 6.0.12.3 to 6.0.12.8
Bumps [types-pyyaml](https://github.com/python/typeshed) from 6.0.12.3 to 6.0.12.8.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pyyaml
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-01 10:42:19 +03:00
dependabot[bot]
e64ede2472 Bump black from 22.12.0 to 23.1.0
Bumps [black](https://github.com/psf/black) from 22.12.0 to 23.1.0.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/22.12.0...23.1.0)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-01 10:07:58 +03:00
dependabot[bot]
a73d7048e4 Bump google-auth from 2.15.0 to 2.16.0
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.15.0 to 2.16.0.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.15.0...v2.16.0)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-04 18:31:12 +03:00
dependabot[bot]
e80b004a99 Bump google-api-python-client from 2.70.0 to 2.76.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.70.0 to 2.76.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.70.0...v2.76.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-04 13:23:15 +03:00
dependabot[bot]
a806cc87c3 Bump pytest from 7.2.0 to 7.2.1
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.2.0 to 7.2.1.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.2.0...7.2.1)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-03 13:39:20 +03:00
dependabot[bot]
88eede3a00 Bump types-python-dateutil from 2.8.19.5 to 2.8.19.6
Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.8.19.5 to 2.8.19.6.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-python-dateutil
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-03 10:34:34 +03:00
dependabot[bot]
7d605328c1 Bump types-pyyaml from 6.0.12.2 to 6.0.12.3
Bumps [types-pyyaml](https://github.com/python/typeshed) from 6.0.12.2 to 6.0.12.3.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pyyaml
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-01 17:08:12 +03:00
dependabot[bot]
6561da777a Bump pytz from 2022.7 to 2022.7.1
Bumps [pytz](https://github.com/stub42/pytz) from 2022.7 to 2022.7.1.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2022.7...release_2022.7.1)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-01 13:32:32 +03:00
dependabot[bot]
a0429e24ab Bump types-pytz from 2022.7.0.0 to 2022.7.1.0
Bumps [types-pytz](https://github.com/python/typeshed) from 2022.7.0.0 to 2022.7.1.0.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pytz
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-01 13:05:23 +03:00
dependabot[bot]
fa768c96ab Bump types-pytz from 2022.6.0.1 to 2022.7.0.0
Bumps [types-pytz](https://github.com/python/typeshed) from 2022.6.0.1 to 2022.7.0.0.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pytz
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-04 17:14:52 +03:00
dependabot[bot]
f566c98065 Bump types-python-dateutil from 2.8.19.4 to 2.8.19.5
Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.8.19.4 to 2.8.19.5.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-python-dateutil
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-04 16:08:25 +03:00
dependabot[bot]
c568dcd6ea Bump google-api-python-client from 2.68.0 to 2.70.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.68.0 to 2.70.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.68.0...v2.70.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-04 14:46:35 +03:00
dependabot[bot]
111d773ff8 Bump google-auth from 2.14.1 to 2.15.0
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.14.1 to 2.15.0.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.14.1...v2.15.0)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-04 14:38:53 +03:00
dependabot[bot]
ac96a78280 Bump pytz from 2022.6 to 2022.7
Bumps [pytz](https://github.com/stub42/pytz) from 2022.6 to 2022.7.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2022.6...release_2022.7)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-04 14:10:27 +03:00
dependabot[bot]
5e845cf629 Bump fire from 0.4.0 to 0.5.0
Bumps [fire](https://github.com/google/python-fire) from 0.4.0 to 0.5.0.
- [Release notes](https://github.com/google/python-fire/releases)
- [Commits](https://github.com/google/python-fire/compare/v0.4.0...v0.5.0)

---
updated-dependencies:
- dependency-name: fire
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-04 13:54:18 +03:00
dependabot[bot]
d43c906869 Bump lxml from 4.9.1 to 4.9.2
Bumps [lxml](https://github.com/lxml/lxml) from 4.9.1 to 4.9.2.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-4.9.1...lxml-4.9.2)

---
updated-dependencies:
- dependency-name: lxml
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-04 12:28:13 +03:00
dependabot[bot]
b685ed0c15 Bump icalendar from 5.0.3 to 5.0.4
Bumps [icalendar](https://github.com/collective/icalendar) from 5.0.3 to 5.0.4.
- [Release notes](https://github.com/collective/icalendar/releases)
- [Changelog](https://github.com/collective/icalendar/blob/master/CHANGES.rst)
- [Commits](https://github.com/collective/icalendar/compare/v5.0.3...v5.0.4)

---
updated-dependencies:
- dependency-name: icalendar
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-04 01:28:46 +03:00
dependabot[bot]
b6c6366b88 Bump black from 22.10.0 to 22.12.0
Bumps [black](https://github.com/psf/black) from 22.10.0 to 22.12.0.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/22.10.0...22.12.0)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-03 22:14:33 +03:00
dependabot[bot]
6ad8a6fa5e Bump certifi from 2022.5.18.1 to 2022.12.7
Bumps [certifi](https://github.com/certifi/python-certifi) from 2022.5.18.1 to 2022.12.7.
- [Release notes](https://github.com/certifi/python-certifi/releases)
- [Commits](https://github.com/certifi/python-certifi/compare/2022.05.18.1...2022.12.07)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-09 10:35:11 +03:00
dependabot[bot]
022a339157 Bump types-python-dateutil from 2.8.19.2 to 2.8.19.4
Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.8.19.2 to 2.8.19.4.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-python-dateutil
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-02 10:22:06 +03:00
dependabot[bot]
f0c095dcc9 Bump types-pyyaml from 6.0.12.1 to 6.0.12.2
Bumps [types-pyyaml](https://github.com/python/typeshed) from 6.0.12.1 to 6.0.12.2.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pyyaml
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-02 09:53:09 +03:00
dependabot[bot]
c6d47d2eba Bump mypy from 0.982 to 0.991
Bumps [mypy](https://github.com/python/mypy) from 0.982 to 0.991.
- [Release notes](https://github.com/python/mypy/releases)
- [Commits](https://github.com/python/mypy/compare/v0.982...v0.991)

---
updated-dependencies:
- dependency-name: mypy
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-02 00:25:06 +03:00
dependabot[bot]
3e766d614c Bump icalendar from 5.0.1 to 5.0.3
Bumps [icalendar](https://github.com/collective/icalendar) from 5.0.1 to 5.0.3.
- [Release notes](https://github.com/collective/icalendar/releases)
- [Changelog](https://github.com/collective/icalendar/blob/master/CHANGES.rst)
- [Commits](https://github.com/collective/icalendar/compare/v5.0.1...v5.0.3)

---
updated-dependencies:
- dependency-name: icalendar
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-01 22:24:59 +03:00
dependabot[bot]
5c6c293d3b Bump google-api-python-client from 2.65.0 to 2.68.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.65.0 to 2.68.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.65.0...v2.68.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-01 22:15:08 +03:00
dependabot[bot]
b9ac2de328 Bump google-auth from 2.14.0 to 2.14.1
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.14.0 to 2.14.1.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.14.0...v2.14.1)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-01 20:58:33 +03:00
dependabot[bot]
ebf0b2dc7c Bump types-pytz from 2022.2.1.0 to 2022.6.0.1
Bumps [types-pytz](https://github.com/python/typeshed) from 2022.2.1.0 to 2022.6.0.1.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pytz
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-02 19:43:43 +03:00
dependabot[bot]
fb6a3c5503 Bump types-pyyaml from 6.0.12 to 6.0.12.1
Bumps [types-pyyaml](https://github.com/python/typeshed) from 6.0.12 to 6.0.12.1.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pyyaml
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-02 19:38:31 +03:00
dependabot[bot]
2aee926d1e Bump types-python-dateutil from 2.8.19 to 2.8.19.2
Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.8.19 to 2.8.19.2.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-python-dateutil
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-01 18:28:13 +03:00
dependabot[bot]
b1188c00a7 Bump google-api-python-client from 2.63.0 to 2.65.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.63.0 to 2.65.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.63.0...v2.65.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-01 17:29:41 +03:00
dependabot[bot]
77e036975b Bump google-auth from 2.12.0 to 2.14.0
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.12.0 to 2.14.0.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.12.0...v2.14.0)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-01 16:58:36 +03:00
dependabot[bot]
c0b2863687 Bump pytz from 2022.2.1 to 2022.6
Bumps [pytz](https://github.com/stub42/pytz) from 2022.2.1 to 2022.6.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2022.2.1...release_2022.6)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-01 15:47:10 +03:00
dependabot[bot]
72e4659f8f Bump mypy from 0.981 to 0.982
Bumps [mypy](https://github.com/python/mypy) from 0.981 to 0.982.
- [Release notes](https://github.com/python/mypy/releases)
- [Commits](https://github.com/python/mypy/compare/v0.981...v0.982)

---
updated-dependencies:
- dependency-name: mypy
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-01 15:28:15 +03:00
dependabot[bot]
27ba8192fd Bump icalendar from 4.1.0 to 5.0.1
Bumps [icalendar](https://github.com/collective/icalendar) from 4.1.0 to 5.0.1.
- [Release notes](https://github.com/collective/icalendar/releases)
- [Changelog](https://github.com/collective/icalendar/blob/master/CHANGES.rst)
- [Commits](https://github.com/collective/icalendar/compare/4.1.0...v5.0.1)

---
updated-dependencies:
- dependency-name: icalendar
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-01 10:59:27 +03:00
dependabot[bot]
a209146c56 Bump black from 22.8.0 to 22.10.0
Bumps [black](https://github.com/psf/black) from 22.8.0 to 22.10.0.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/22.8.0...22.10.0)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-01 09:23:44 +03:00
dependabot[bot]
a60f8777f5 Bump pytest from 7.1.3 to 7.2.0
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.1.3 to 7.2.0.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.1.3...7.2.0)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-01 07:55:19 +03:00
dependabot[bot]
eafbd6bf59 Bump types-pyyaml from 6.0.11 to 6.0.12
Bumps [types-pyyaml](https://github.com/python/typeshed) from 6.0.11 to 6.0.12.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pyyaml
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 12:45:56 +03:00
dependabot[bot]
9d02e01da0 Bump mypy from 0.971 to 0.981
Bumps [mypy](https://github.com/python/mypy) from 0.971 to 0.981.
- [Release notes](https://github.com/python/mypy/releases)
- [Commits](https://github.com/python/mypy/compare/v0.971...v0.981)

---
updated-dependencies:
- dependency-name: mypy
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 11:45:16 +03:00
dependabot[bot]
1c1a1a220d Bump pytest from 7.1.2 to 7.1.3
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.1.2 to 7.1.3.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.1.2...7.1.3)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 11:37:18 +03:00
dependabot[bot]
3759992950 Bump google-api-python-client from 2.58.0 to 2.63.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.58.0 to 2.63.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.58.0...v2.63.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 11:28:11 +03:00
dependabot[bot]
45b07dc5ab Bump google-auth from 2.11.0 to 2.12.0
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.11.0 to 2.12.0.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.11.0...v2.12.0)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 11:20:12 +03:00
dependabot[bot]
4f22594ddc Bump protobuf from 3.20.1 to 3.20.2
Bumps [protobuf](https://github.com/protocolbuffers/protobuf) from 3.20.1 to 3.20.2.
- [Release notes](https://github.com/protocolbuffers/protobuf/releases)
- [Changelog](https://github.com/protocolbuffers/protobuf/blob/main/generate_changelog.py)
- [Commits](https://github.com/protocolbuffers/protobuf/compare/v3.20.1...v3.20.2)

---
updated-dependencies:
- dependency-name: protobuf
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-24 01:49:24 +03:00
dependabot[bot]
dd2d87d38d Bump types-pytz from 2022.1.2 to 2022.2.1.0
Bumps [types-pytz](https://github.com/python/typeshed) from 2022.1.2 to 2022.2.1.0.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pytz
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-01 15:06:32 +03:00
dependabot[bot]
ee4d6de9d5 Bump pytz from 2022.1 to 2022.2.1
Bumps [pytz](https://github.com/stub42/pytz) from 2022.1 to 2022.2.1.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2022.1...release_2022.2.1)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-01 13:25:47 +03:00
dependabot[bot]
353ffa1d0c Bump flake8 from 5.0.1 to 5.0.4
Bumps [flake8](https://github.com/pycqa/flake8) from 5.0.1 to 5.0.4.
- [Release notes](https://github.com/pycqa/flake8/releases)
- [Commits](https://github.com/pycqa/flake8/compare/5.0.1...5.0.4)

---
updated-dependencies:
- dependency-name: flake8
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-01 12:54:27 +03:00
dependabot[bot]
3da56345b1 Bump black from 22.6.0 to 22.8.0
Bumps [black](https://github.com/psf/black) from 22.6.0 to 22.8.0.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/22.6.0...22.8.0)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-01 12:44:39 +03:00
dependabot[bot]
47808d92bd Bump google-auth from 2.9.1 to 2.11.0
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.9.1 to 2.11.0.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.9.1...v2.11.0)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-01 12:30:51 +03:00
dependabot[bot]
444e70942e Bump google-api-python-client from 2.55.0 to 2.58.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.55.0 to 2.58.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.55.0...v2.58.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-01 12:21:33 +03:00
dependabot[bot]
0accf99f99 Bump types-python-dateutil from 2.8.18 to 2.8.19
Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.8.18 to 2.8.19.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-python-dateutil
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-01 12:07:12 +03:00
dependabot[bot]
9eb3d964bd Bump types-pyyaml from 6.0.9 to 6.0.11
Bumps [types-pyyaml](https://github.com/python/typeshed) from 6.0.9 to 6.0.11.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pyyaml
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-01 11:49:50 +03:00
dependabot[bot]
b51cec36e4 Bump google-api-python-client from 2.52.0 to 2.55.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.52.0 to 2.55.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.52.0...v2.55.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-01 11:43:54 +03:00
dependabot[bot]
a2d51b1886 Bump google-auth from 2.9.0 to 2.9.1
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.9.0 to 2.9.1.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.9.0...v2.9.1)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-01 10:49:44 +03:00
dependabot[bot]
22d448c993 Bump mypy from 0.961 to 0.971
Bumps [mypy](https://github.com/python/mypy) from 0.961 to 0.971.
- [Release notes](https://github.com/python/mypy/releases)
- [Commits](https://github.com/python/mypy/compare/v0.961...v0.971)

---
updated-dependencies:
- dependency-name: mypy
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-01 10:42:15 +03:00
dependabot[bot]
526be4de8a Bump types-pytz from 2022.1.1 to 2022.1.2
Bumps [types-pytz](https://github.com/python/typeshed) from 2022.1.1 to 2022.1.2.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pytz
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-01 10:25:15 +03:00
dependabot[bot]
cc526e4172 Bump flake8 from 4.0.1 to 5.0.1
Bumps [flake8](https://github.com/pycqa/flake8) from 4.0.1 to 5.0.1.
- [Release notes](https://github.com/pycqa/flake8/releases)
- [Commits](https://github.com/pycqa/flake8/compare/4.0.1...5.0.1)

---
updated-dependencies:
- dependency-name: flake8
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-01 10:16:35 +03:00
dependabot[bot]
f2e9b2cf87 Bump icalendar from 4.0.9 to 4.1.0
Bumps [icalendar](https://github.com/collective/icalendar) from 4.0.9 to 4.1.0.
- [Release notes](https://github.com/collective/icalendar/releases)
- [Changelog](https://github.com/collective/icalendar/blob/4.1.0/CHANGES.rst)
- [Commits](https://github.com/collective/icalendar/compare/4.0.9...4.1.0)

---
updated-dependencies:
- dependency-name: icalendar
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-01 08:56:52 +03:00
dependabot[bot]
0da36d5428 Bump lxml from 4.9.0 to 4.9.1
Bumps [lxml](https://github.com/lxml/lxml) from 4.9.0 to 4.9.1.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-4.9.0...lxml-4.9.1)

---
updated-dependencies:
- dependency-name: lxml
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-07 09:02:28 +03:00
dependabot[bot]
af8150197d Bump google-api-python-client from 2.49.0 to 2.52.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.49.0 to 2.52.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.49.0...v2.52.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-01 15:36:13 +03:00
dependabot[bot]
72f474217a Bump google-auth from 2.6.6 to 2.9.0
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.6.6 to 2.9.0.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.6.6...v2.9.0)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-01 14:32:59 +03:00
dependabot[bot]
22b4cec62b Bump black from 22.3.0 to 22.6.0
Bumps [black](https://github.com/psf/black) from 22.3.0 to 22.6.0.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/22.3.0...22.6.0)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-01 14:22:44 +03:00
dependabot[bot]
defea7633b Bump types-python-dateutil from 2.8.17 to 2.8.18
Bumps [types-python-dateutil](https://github.com/python/typeshed) from 2.8.17 to 2.8.18.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-python-dateutil
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-01 13:46:27 +03:00
dependabot[bot]
520fd15da8 Bump types-pyyaml from 6.0.8 to 6.0.9
Bumps [types-pyyaml](https://github.com/python/typeshed) from 6.0.8 to 6.0.9.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pyyaml
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-01 12:38:09 +03:00
dependabot[bot]
f04c0c46fd Bump types-pytz from 2021.3.8 to 2022.1.1
Bumps [types-pytz](https://github.com/python/typeshed) from 2021.3.8 to 2022.1.1.
- [Release notes](https://github.com/python/typeshed/releases)
- [Commits](https://github.com/python/typeshed/commits)

---
updated-dependencies:
- dependency-name: types-pytz
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-01 11:07:12 +03:00
dependabot[bot]
74d2e18e91 Bump mypy from 0.960 to 0.961
Bumps [mypy](https://github.com/python/mypy) from 0.960 to 0.961.
- [Release notes](https://github.com/python/mypy/releases)
- [Commits](https://github.com/python/mypy/compare/v0.960...v0.961)

---
updated-dependencies:
- dependency-name: mypy
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-01 10:42:31 +03:00
5e4bed5604 bump github/codeql-action to v2
https://github.blog/changelog/2022-04-27-code-scanning-deprecation-of-codeql-action-v1/
2022-06-04 23:51:41 +03:00
111d527c33 check formatting with black (#99)
* check formatting with black + suggest on pr

* test format check

* fix test format error

suggested by reviewdog[black]

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-06-04 23:43:13 +03:00
Dmitry Belyaev
a18be3d079 Merge pull request #98 from b4tman/mypy
type checking with mypy
2022-06-04 22:57:22 +03:00
c9b38cd29e add mypy strict check (not failing) 2022-06-04 20:14:53 +03:00
c2c3a7a14d fix type errors in tests
with mypy --strict
2022-06-04 18:51:43 +03:00
787e9df642 explicitly exports
to fix (mypy --strict) errors like:
>> error: Module "sync_ics2gcal" does not explicitly export attribute "GoogleCalendarService"; implicit reexport disabled
2022-06-04 18:50:58 +03:00
80e15b0622 fix type errors
with mypy --strict
2022-06-04 18:47:54 +03:00
ad634e9c6e ignore tmp_bin/ 2022-06-04 17:40:33 +03:00
6ba8106f3e version 0.1.4 2022-06-04 17:29:11 +03:00
e5abc3c218 fix test error 2022-06-04 17:12:21 +03:00
9ad97a158c test type error 2022-06-04 17:09:09 +03:00
47ac72c1fe fix add-path 2022-06-04 17:01:33 +03:00
c1c621cbf0 add reviewdog workflow with mypy 2022-06-04 16:54:33 +03:00
bfdeaa17ff drop python 3.7 support
for TypedDict
2022-06-04 15:56:11 +03:00
1eef4114cd ci: fix mypy checks 2022-06-04 15:48:25 +03:00
e2d5548466 update poetry.lock 2022-06-04 15:46:02 +03:00
0778fbe51f ci: check with mypy + upload report 2022-06-04 15:44:01 +03:00
7b62e2c583 ignore mypy_report folder + lxml dep 2022-06-04 15:42:19 +03:00
3cbbbb1a1b remove TypeAlias usage 2022-06-04 01:07:24 +03:00
29275d3f0e more types in test_sync 2022-06-04 00:57:38 +03:00
edd6c39dcb more types in sync 2022-06-04 00:40:15 +03:00
54146451c7 types: + EventsSearchResults 2022-06-04 00:39:29 +03:00
5b4dca0ab9 add types-PyYAML, mypy ignore_missing: +fire 2022-06-04 00:11:14 +03:00
2f3a87f25f more types in gcal 2022-06-03 23:42:29 +03:00
260f168077 mypy ignore_missing_imports 2022-06-03 23:39:11 +03:00
dc23acb7d2 type annotations in ical, gcal 2022-06-03 22:07:06 +03:00
4a85424215 add mypy 2022-06-03 22:07:05 +03:00
8eaafc9925 workflows: remove poetry cache 2022-06-03 15:55:50 +03:00
7582cba1dd add test_format_datetime_utc 2022-06-03 14:06:36 +03:00
dependabot[bot]
6ac6a0fb6b Bump google-api-python-client from 2.46.0 to 2.49.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.46.0 to 2.49.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.46.0...v2.49.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-01 14:04:08 +03:00
dependabot[bot]
e8c0c17a4c Bump google-api-python-client from 2.42.0 to 2.46.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.42.0 to 2.46.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.42.0...v2.46.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-02 15:34:29 +03:00
dependabot[bot]
64a12c3754 Bump google-auth from 2.6.2 to 2.6.6
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.6.2 to 2.6.6.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.6.2...v2.6.6)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-02 15:25:53 +03:00
dependabot[bot]
aef5fd6491 Bump pytest from 7.1.1 to 7.1.2
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.1.1 to 7.1.2.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.1.1...7.1.2)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-02 15:17:00 +03:00
dependabot[bot]
6221cd02e9 Bump black from 22.1.0 to 22.3.0
Bumps [black](https://github.com/psf/black) from 22.1.0 to 22.3.0.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/22.1.0...22.3.0)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 16:59:11 +03:00
dependabot[bot]
6e0684372c Bump pytest from 7.0.1 to 7.1.1
Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.0.1 to 7.1.1.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/7.0.1...7.1.1)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 16:12:30 +03:00
dependabot[bot]
903092835e Bump pytz from 2021.3 to 2022.1
Bumps [pytz](https://github.com/stub42/pytz) from 2021.3 to 2022.1.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2021.3...release_2022.1)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 13:12:04 +03:00
dependabot[bot]
f62f032a00 Bump google-auth from 2.6.0 to 2.6.2
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.6.0 to 2.6.2.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.6.0...v2.6.2)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 12:58:54 +03:00
8c05b8319c reset poetry cache (github workflows) 2022-04-05 12:40:40 +03:00
adc61821cf bump actions/checkout to 3 2022-04-05 12:38:17 +03:00
25670a61ba bump actions/cache to 3.0.1 2022-04-05 12:37:02 +03:00
dependabot[bot]
6411241a9a Bump google-api-python-client from 2.39.0 to 2.42.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.39.0 to 2.42.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.39.0...v2.42.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-05 10:58:07 +03:00
912754b4c1 Merge pull request #88 from gwww/develop
Format with black
2022-03-08 19:53:22 +03:00
Glenn Waters
70278c1542 Format with black. 2022-03-08 10:46:21 -05:00
dependabot[bot]
2372103807 Bump google-api-python-client from 2.36.0 to 2.39.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.36.0 to 2.39.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.36.0...v2.39.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-02 23:10:35 +03:00
3062d4323a Update README.md 2022-03-02 23:08:23 +03:00
7f8806e259 Delete .travis.yml 2022-03-02 23:08:03 +03:00
dependabot[bot]
348dae9f60 Bump pytest from 6.2.5 to 7.0.1
Bumps [pytest](https://github.com/pytest-dev/pytest) from 6.2.5 to 7.0.1.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/6.2.5...7.0.1)

---
updated-dependencies:
- dependency-name: pytest
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-02 23:05:52 +03:00
f0a7668fcd fix typo 2022-02-24 12:34:41 +03:00
38fe634a9f fix var names 2022-02-24 12:20:07 +03:00
839a3ac0c3 fix parsing config start_from (#82) 2022-02-23 13:11:56 +03:00
70a9dac822 update poetry.lock 2022-02-23 12:34:29 +03:00
e6cc7ad336 Merge pull request #81 from b4tman/filter_no-updated
overwrite events without updated field (#80)
2022-02-22 10:26:17 +03:00
693c6c4359 overwrite events without updated field 2022-02-22 10:15:05 +03:00
b09136747f rewrite test_filter_events_no_updated 2022-02-22 09:52:28 +03:00
89877bc6d8 add test_filter_events_to_update_no_updated
#80
2022-02-21 22:40:07 +03:00
61d3186522 drop python 3.6 support 2022-02-11 14:29:25 +03:00
3fa8334408 remove requirements.txt 2022-02-11 14:19:38 +03:00
dependabot[bot]
809b0996c2 Bump google-api-python-client from 2.33.0 to 2.36.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.33.0 to 2.36.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.33.0...v2.36.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-01 09:20:25 +03:00
dependabot[bot]
93840f9795 Bump google-auth from 2.3.3 to 2.6.0
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.3.3 to 2.6.0.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.3.3...v2.6.0)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-01 09:04:17 +03:00
843ad37066 travis ci: add python 3.10 2022-01-19 12:17:50 +03:00
dependabot[bot]
309969cc42 Bump google-api-python-client from 2.31.0 to 2.33.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.31.0 to 2.33.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.31.0...v2.33.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-01-01 12:27:24 +03:00
dependabot[bot]
a3b3954f39 Bump google-auth from 2.3.2 to 2.3.3
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.3.2 to 2.3.3.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.3.2...v2.3.3)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-01 11:07:29 +03:00
dependabot[bot]
3838d66067 Bump google-api-python-client from 2.28.0 to 2.31.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.28.0 to 2.31.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.28.0...v2.31.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-01 09:31:22 +03:00
dependabot[bot]
c3ab0bea08 Bump google-api-python-client from 2.23.0 to 2.28.0
Bumps [google-api-python-client](https://github.com/googleapis/google-api-python-client) from 2.23.0 to 2.28.0.
- [Release notes](https://github.com/googleapis/google-api-python-client/releases)
- [Changelog](https://github.com/googleapis/google-api-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-python-client/compare/v2.23.0...v2.28.0)

---
updated-dependencies:
- dependency-name: google-api-python-client
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-01 09:48:46 +03:00
dependabot[bot]
5e55300448 Bump google-auth from 2.2.1 to 2.3.2
Bumps [google-auth](https://github.com/googleapis/google-auth-library-python) from 2.2.1 to 2.3.2.
- [Release notes](https://github.com/googleapis/google-auth-library-python/releases)
- [Changelog](https://github.com/googleapis/google-auth-library-python/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-auth-library-python/compare/v2.2.1...v2.3.2)

---
updated-dependencies:
- dependency-name: google-auth
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-01 09:38:31 +03:00
dependabot[bot]
69eea1b351 Bump flake8 from 3.9.2 to 4.0.1
Bumps [flake8](https://github.com/pycqa/flake8) from 3.9.2 to 4.0.1.
- [Release notes](https://github.com/pycqa/flake8/releases)
- [Commits](https://github.com/pycqa/flake8/compare/3.9.2...4.0.1)

---
updated-dependencies:
- dependency-name: flake8
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-01 09:34:06 +03:00
dependabot[bot]
1a3ce7cda4 Bump icalendar from 4.0.7 to 4.0.9
Bumps [icalendar](https://github.com/collective/icalendar) from 4.0.7 to 4.0.9.
- [Release notes](https://github.com/collective/icalendar/releases)
- [Changelog](https://github.com/collective/icalendar/blob/master/CHANGES.rst)
- [Commits](https://github.com/collective/icalendar/compare/4.0.7...4.0.9)

---
updated-dependencies:
- dependency-name: icalendar
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-01 09:23:47 +03:00
dependabot[bot]
36c4825080 Bump pytz from 2021.1 to 2021.3
Bumps [pytz](https://github.com/stub42/pytz) from 2021.1 to 2021.3.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2021.1...release_2021.3)

---
updated-dependencies:
- dependency-name: pytz
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-01 09:15:39 +03:00
dependabot[bot]
200ed88bd9 Bump pyyaml from 5.4.1 to 6.0
Bumps [pyyaml](https://github.com/yaml/pyyaml) from 5.4.1 to 6.0.
- [Release notes](https://github.com/yaml/pyyaml/releases)
- [Changelog](https://github.com/yaml/pyyaml/blob/master/CHANGES)
- [Commits](https://github.com/yaml/pyyaml/compare/5.4.1...6.0)

---
updated-dependencies:
- dependency-name: pyyaml
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-01 08:58:31 +03:00
a81192b96f add python 3.10 (github actions) (#66) 2021-10-21 10:18:39 +03:00
30 changed files with 2425 additions and 1438 deletions

View File

@@ -16,7 +16,7 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v3
with: with:
# We must fetch at least the immediate parents so that if this is # We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head. # a pull request then we can checkout the head.
@@ -24,10 +24,10 @@ jobs:
# Initializes the CodeQL tools for scanning. # Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL
uses: github/codeql-action/init@v1 uses: github/codeql-action/init@v2
# Override language selection by uncommenting this and choosing your languages # Override language selection by uncommenting this and choosing your languages
with: with:
languages: python languages: python
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1 uses: github/codeql-action/analyze@v2

View File

@@ -17,25 +17,20 @@ jobs:
strategy: strategy:
max-parallel: 4 max-parallel: 4
matrix: matrix:
python-version: [3.6, 3.7, 3.8, 3.9] python-version: ['3.8', '3.9', '3.10', '3.11']
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }} - name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2 uses: actions/setup-python@v2
with: with:
python-version: ${{ matrix.python-version }} python-version: ${{ matrix.python-version }}
- name: Upgrade pip - name: Upgrade pip
run: python -m pip install --upgrade pip run: python -m pip install --upgrade pip
- name: Load cached Poetry installation
uses: actions/cache@v2
with:
path: ~/.local
key: poetry-0
- name: Install Poetry - name: Install Poetry
uses: snok/install-poetry@v1 uses: snok/install-poetry@v1
- name: Install deps - name: Install deps
run: poetry install run: poetry install --with dev
- name: Lint with flake8 - name: Lint with flake8
run: | run: |
# stop the build if there are Python syntax errors or undefined names # stop the build if there are Python syntax errors or undefined names
@@ -44,3 +39,21 @@ jobs:
poetry run flake8 sync_ics2gcal --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics poetry run flake8 sync_ics2gcal --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Test with pytest - name: Test with pytest
run: poetry run pytest -v run: poetry run pytest -v
- name: Check type annotations with mypy
run: |
mkdir mypy_report
poetry run mypy --pretty --html-report mypy_report/ .
- name: Check type annotations with mypy strict mode (not failing)
run: |
poetry run mypy --strict --pretty . || true
- name: Check formatting with black
run: poetry run black --check --diff --color .
- name: Upload mypy report
uses: actions/upload-artifact@v2
with:
name: mypy_report
path: mypy_report/

View File

@@ -8,22 +8,17 @@ jobs:
deploy: deploy:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v2 uses: actions/setup-python@v2
with: with:
python-version: '3.x' python-version: '3.x'
- name: Upgrade pip - name: Upgrade pip
run: python -m pip install --upgrade pip run: python -m pip install --upgrade pip
- name: Load cached Poetry installation
uses: actions/cache@v2
with:
path: ~/.local
key: poetry-0
- name: Install Poetry - name: Install Poetry
uses: snok/install-poetry@v1 uses: snok/install-poetry@v1
- name: Install deps - name: Install deps
run: poetry install run: poetry install --with dev
- name: Build - name: Build
run: poetry build run: poetry build
- name: Publish - name: Publish

49
.github/workflows/reviewdog.yml vendored Normal file
View File

@@ -0,0 +1,49 @@
name: reviewdog
on:
pull_request:
branches:
- master
- develop
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: 3.x
- name: Upgrade pip
run: python -m pip install --upgrade pip
- name: Install Poetry
uses: snok/install-poetry@v1
- name: Install deps
run: poetry install --with dev
- name: setup mypy
run: |
mkdir tmp_bin/
echo "#!/bin/sh" > tmp_bin/mypy
echo "poetry run mypy \$@" >> tmp_bin/mypy
chmod +x tmp_bin/mypy
echo "$(pwd)/tmp_bin" >> $GITHUB_PATH
- uses: tsuyoshicho/action-mypy@v3
with:
reporter: github-pr-review
level: warning
- name: format with black
run: poetry run black .
- name: suggester / black
uses: reviewdog/action-suggester@v1
with:
tool_name: black

7
.gitignore vendored
View File

@@ -4,8 +4,15 @@ service-account.json
my-test*.ics my-test*.ics
.vscode/ .vscode/
.idea/ .idea/
.venv/
.pytest_cache/
.mypy_cache/
/dist/ /dist/
/*.egg-info/ /*.egg-info/
/build/ /build/
/.eggs/ /.eggs/
venv/ venv/
mypy_report/
tmp_bin/
docs/build/

14
.readthedocs.yml Normal file
View File

@@ -0,0 +1,14 @@
version: 2
build:
os: ubuntu-22.04
tools:
python: "3.11"
jobs:
post_install:
- pip install poetry
- poetry config virtualenvs.create false
- poetry install --with=docs
sphinx:
configuration: docs/source/conf.py

View File

@@ -1,21 +0,0 @@
language: python
os: linux
dist: focal
python:
- "3.6"
- "3.7"
- "3.8"
- "3.9"
before_install:
- pip install poetry
install:
- poetry install
script:
# stop the build if there are Python syntax errors or undefined names
- poetry run flake8 sync_ics2gcal --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
- poetry run flake8 sync_ics2gcal --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
# run tests
- poetry run pytest -v

View File

@@ -1,8 +1,8 @@
# sync_ics2gcal # sync_ics2gcal
[![PyPI version](https://badge.fury.io/py/sync-ics2gcal.svg)](https://badge.fury.io/py/sync-ics2gcal) [![PyPI version](https://badge.fury.io/py/sync-ics2gcal.svg)](https://badge.fury.io/py/sync-ics2gcal)
[![Build Status](https://travis-ci.org/b4tman/sync_ics2gcal.svg?branch=master)](https://travis-ci.org/b4tman/sync_ics2gcal)
![Python package status](https://github.com/b4tman/sync_ics2gcal/workflows/Python%20package/badge.svg) ![Python package status](https://github.com/b4tman/sync_ics2gcal/workflows/Python%20package/badge.svg)
[![Documentation Status](https://readthedocs.org/projects/sync-ics2gcal/badge/?version=latest)](https://sync-ics2gcal.readthedocs.io/en/latest/?badge=latest)
Python scripts for sync .ics file with Google calendar Python scripts for sync .ics file with Google calendar
@@ -99,3 +99,5 @@ sync-ics2gcal
## How it works ## How it works
![How it works](how-it-works.png) ![How it works](how-it-works.png)
Documentation is available at [sync-ics2gcal.readthedocs.io](https://sync-ics2gcal.readthedocs.io).

20
docs/Makefile Normal file
View File

@@ -0,0 +1,20 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= poetry run sphinx-build
SOURCEDIR = source
BUILDDIR = build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

35
docs/make.bat Normal file
View File

@@ -0,0 +1,35 @@
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=poetry run sphinx-build
)
set SOURCEDIR=source
set BUILDDIR=build
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.https://www.sphinx-doc.org/
exit /b 1
)
if "%1" == "" goto help
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
:end
popd

40
docs/source/conf.py Normal file
View File

@@ -0,0 +1,40 @@
# Configuration file for the Sphinx documentation builder.
#
# For the full list of built-in configuration values, see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html
# -- Project information -----------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
import importlib
from typing import List
project = "sync_ics2gcal"
copyright = "2023, b4tman"
author = "b4tman"
version = importlib.metadata.version("sync_ics2gcal")
release = version
# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
extensions = [
"myst_parser",
"sphinx.ext.autodoc",
"sphinx_design",
"sphinx.ext.viewcode",
"sphinx_copybutton",
"sphinx.ext.githubpages",
]
templates_path = ["_templates"]
exclude_patterns: List[str] = []
source_suffix = [".rst", ".md"]
# -- Options for HTML output -------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
html_theme = "sphinx_rtd_theme"
html_static_path = ["_static"]

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

22
docs/source/index.rst Normal file
View File

@@ -0,0 +1,22 @@
.. sync_ics2gcal documentation master file, created by
sphinx-quickstart on Sat Aug 20 22:19:59 2023.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to sync_ics2gcal's documentation!
=========================================
.. toctree::
:maxdepth: 2
:caption: Contents:
readme_link
reference
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

7
docs/source/modules.rst Normal file
View File

@@ -0,0 +1,7 @@
sync_ics2gcal
=============
.. toctree::
:maxdepth: 4
sync_ics2gcal

View File

@@ -0,0 +1,3 @@
```{include} ../../README.md
```

View File

@@ -0,0 +1,6 @@
-------------
Reference
-------------
.. include:: modules.rst

View File

@@ -0,0 +1,53 @@
sync\_ics2gcal package
======================
Submodules
----------
sync\_ics2gcal.gcal module
--------------------------
.. automodule:: sync_ics2gcal.gcal
:members:
:undoc-members:
:show-inheritance:
sync\_ics2gcal.ical module
--------------------------
.. automodule:: sync_ics2gcal.ical
:members:
:undoc-members:
:show-inheritance:
sync\_ics2gcal.manage\_calendars module
---------------------------------------
.. automodule:: sync_ics2gcal.manage_calendars
:members:
:undoc-members:
:show-inheritance:
sync\_ics2gcal.sync module
--------------------------
.. automodule:: sync_ics2gcal.sync
:members:
:undoc-members:
:show-inheritance:
sync\_ics2gcal.sync\_calendar module
------------------------------------
.. automodule:: sync_ics2gcal.sync_calendar
:members:
:undoc-members:
:show-inheritance:
Module contents
---------------
.. automodule:: sync_ics2gcal
:members:
:undoc-members:
:show-inheritance:

1628
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "sync_ics2gcal" name = "sync_ics2gcal"
version = "0.1.3" version = "0.1.4"
description = "Sync ics file with Google calendar" description = "Sync ics file with Google calendar"
authors = ["Dmitry Belyaev <b4tm4n@mail.ru>"] authors = ["Dmitry Belyaev <b4tm4n@mail.ru>"]
license = "MIT" license = "MIT"
@@ -11,27 +11,43 @@ keywords = ["icalendar", "sync", "google", "calendar"]
classifiers = [ classifiers = [
'License :: OSI Approved :: MIT License', 'License :: OSI Approved :: MIT License',
'Operating System :: OS Independent', 'Operating System :: OS Independent',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',
'Programming Language :: Python :: 3.11',
] ]
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = ">=3.6.1" python = "^3.8"
google-auth = "2.2.1" google-auth = "2.28.1"
google-api-python-client = "2.23.0" google-api-python-client = "2.120.0"
icalendar = "4.0.7" icalendar = "5.0.11"
pytz = "2021.1" pytz = "2024.1"
PyYAML = "5.4.1" PyYAML = "6.0.1"
fire = "0.4.0" fire = "0.5.0"
pydantic = "^1.8.2"
[tool.poetry.dev-dependencies] [tool.poetry.group.dev]
pytest = "^6.2.5" optional = true
flake8 = "^3.9.2"
autopep8 = "^1.5.7" [tool.poetry.group.docs]
optional = true
[tool.poetry.group.dev.dependencies]
pytest = ">=7.4,<9.0"
flake8 = "^5.0.4"
black = ">=23.7,<25.0"
mypy = ">=0.960"
types-python-dateutil = "^2.8.19"
types-pytz = ">=2021.3.8"
types-PyYAML = "^6.0.12"
lxml = ">=4.9.3,<6.0.0"
[tool.poetry.group.docs.dependencies]
sphinx = ">=7.1,<7.2"
myst-parser = "^2.0.0"
sphinx-rtd-theme = ">=1.2.2,<3.0.0"
sphinx-copybutton = "^0.5.2"
sphinx-design = "^0.5.0"
[tool.poetry.scripts] [tool.poetry.scripts]
sync-ics2gcal = "sync_ics2gcal.sync_calendar:main" sync-ics2gcal = "sync_ics2gcal.sync_calendar:main"
@@ -40,3 +56,12 @@ manage-ics2gcal = "sync_ics2gcal.manage_calendars:main"
[build-system] [build-system]
requires = ["poetry-core>=1.0.0"] requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api" build-backend = "poetry.core.masonry.api"
[[tool.mypy.overrides]]
module = [
'icalendar',
'google.*',
'googleapiclient',
'fire'
]
ignore_missing_imports = true

View File

@@ -1,6 +0,0 @@
google-auth==2.2.1
google-api-python-client==2.23.0
icalendar==4.0.7
pytz==2021.1
PyYAML==5.4.1
fire==0.4.0

View File

@@ -1,18 +1,44 @@
from .ical import CalendarConverter, EventConverter, DateDateTime
from .ical import (
CalendarConverter,
EventConverter,
DateDateTime
)
from .gcal import ( from .gcal import (
GoogleCalendarService, GoogleCalendarService,
GoogleCalendar, GoogleCalendar,
EventData, EventData,
EventList, EventList,
EventTuple EventTuple,
EventDataKey,
EventDateOrDateTime,
EventDate,
EventDateTime,
EventsSearchResults,
ACLRule,
ACLScope,
CalendarData,
BatchRequestCallback,
) )
from .sync import ( from .sync import CalendarSync, ComparedEvents
CalendarSync
) __all__ = [
"ical",
"gcal",
"sync",
"CalendarConverter",
"EventConverter",
"DateDateTime",
"GoogleCalendarService",
"GoogleCalendar",
"EventData",
"EventList",
"EventTuple",
"EventDataKey",
"EventDateOrDateTime",
"EventDate",
"EventDateTime",
"EventsSearchResults",
"ACLRule",
"ACLScope",
"CalendarData",
"CalendarSync",
"ComparedEvents",
]

View File

@@ -1,17 +1,97 @@
import logging import logging
from datetime import datetime from datetime import datetime
from typing import List, Dict, Any, Callable, Tuple, Optional, Union from typing import (
List,
Dict,
Any,
Callable,
Tuple,
Optional,
Union,
TypedDict,
Literal,
NamedTuple,
)
import google.auth import google.auth
from google.oauth2 import service_account from google.oauth2 import service_account
from googleapiclient import discovery from googleapiclient import discovery
from pytz import utc from pytz import utc
EventData = Dict[str, Union[str, 'EventData', None]]
class EventDate(TypedDict, total=False):
date: str
timeZone: str
class EventDateTime(TypedDict, total=False):
dateTime: str
timeZone: str
EventDateOrDateTime = Union[EventDate, EventDateTime]
class ACLScope(TypedDict, total=False):
type: str
value: str
class ACLRule(TypedDict, total=False):
scope: ACLScope
role: str
class CalendarData(TypedDict, total=False):
id: str
summary: str
description: str
timeZone: str
class EventData(TypedDict, total=False):
id: str
summary: str
description: str
start: EventDateOrDateTime
end: EventDateOrDateTime
iCalUID: str
location: str
status: str
created: str
updated: str
sequence: int
transparency: str
visibility: str
EventDataKey = Union[
Literal["id"],
Literal["summary"],
Literal["description"],
Literal["start"],
Literal["end"],
Literal["iCalUID"],
Literal["location"],
Literal["status"],
Literal["created"],
Literal["updated"],
Literal["sequence"],
Literal["transparency"],
Literal["visibility"],
]
EventList = List[EventData] EventList = List[EventData]
EventTuple = Tuple[EventData, EventData] EventTuple = Tuple[EventData, EventData]
class EventsSearchResults(NamedTuple):
exists: List[EventTuple]
new: List[EventData]
BatchRequestCallback = Callable[[str, Any, Optional[Exception]], None]
class GoogleCalendarService: class GoogleCalendarService:
"""class for make google calendar service Resource """class for make google calendar service Resource
@@ -20,47 +100,51 @@ class GoogleCalendarService:
""" """
@staticmethod @staticmethod
def default(): def default() -> discovery.Resource:
"""make service Resource from default credentials (authorize) """make service Resource from default credentials (authorize)
( https://developers.google.com/identity/protocols/application-default-credentials ) ( https://developers.google.com/identity/protocols/application-default-credentials )
( https://googleapis.dev/python/google-auth/latest/reference/google.auth.html#google.auth.default ) ( https://googleapis.dev/python/google-auth/latest/reference/google.auth.html#google.auth.default )
""" """
scopes = ['https://www.googleapis.com/auth/calendar'] scopes = ["https://www.googleapis.com/auth/calendar"]
credentials, _ = google.auth.default(scopes=scopes) credentials, _ = google.auth.default(scopes=scopes)
service = discovery.build( service = discovery.build(
'calendar', 'v3', credentials=credentials, cache_discovery=False) "calendar", "v3", credentials=credentials, cache_discovery=False
)
return service return service
@staticmethod @staticmethod
def from_srv_acc_file(service_account_file: str): def from_srv_acc_file(service_account_file: str) -> discovery.Resource:
"""make service Resource from service account filename (authorize) """make service Resource from service account filename (authorize)"""
"""
scopes = ['https://www.googleapis.com/auth/calendar'] scopes = ["https://www.googleapis.com/auth/calendar"]
credentials = service_account.Credentials.from_service_account_file( credentials = service_account.Credentials.from_service_account_file(
service_account_file) service_account_file
)
scoped_credentials = credentials.with_scopes(scopes) scoped_credentials = credentials.with_scopes(scopes)
service = discovery.build( service = discovery.build(
'calendar', 'v3', credentials=scoped_credentials, "calendar", "v3", credentials=scoped_credentials, cache_discovery=False
cache_discovery=False) )
return service return service
@staticmethod @staticmethod
def from_config(config: Optional[Dict[str, Optional[str]]] = None): def from_config(config: Optional[Dict[str, str]] = None) -> discovery.Resource:
"""make service Resource from config dict """make service Resource from config dict
Arguments: Arguments:
config -- config with keys:
(optional) service_account: - service account filename **config** -- config with keys:
if key not in dict then default credentials will be used
( https://developers.google.com/identity/protocols/application-default-credentials ) (optional) service_account: - service account filename
-- None: default credentials will be used if key not in dict then default credentials will be used
( https://developers.google.com/identity/protocols/application-default-credentials )
-- **None**: default credentials will be used
""" """
if config is not None and 'service_account' in config: if config is not None and "service_account" in config:
service = GoogleCalendarService.from_srv_acc_file( service_account_filename: str = config["service_account"]
config['service_account']) service = GoogleCalendarService.from_srv_acc_file(service_account_filename)
else: else:
service = GoogleCalendarService.default() service = GoogleCalendarService.default()
return service return service
@@ -76,25 +160,26 @@ def select_event_key(event: EventData) -> Optional[str]:
key name or None if no key found key name or None if no key found
""" """
key = None key: Optional[str] = None
if 'iCalUID' in event: if "iCalUID" in event:
key = 'iCalUID' key = "iCalUID"
elif 'id' in event: elif "id" in event:
key = 'id' key = "id"
return key return key
class GoogleCalendar: class GoogleCalendar:
"""class to interact with calendar on google """class to interact with calendar on Google"""
"""
logger = logging.getLogger('GoogleCalendar') logger = logging.getLogger("GoogleCalendar")
def __init__(self, service: discovery.Resource, calendarId: Optional[str]): def __init__(self, service: discovery.Resource, calendar_id: Optional[str]):
self.service: discovery.Resource = service self.service: discovery.Resource = service
self.calendarId: str = calendarId self.calendar_id: str = str(calendar_id)
def _make_request_callback(self, action: str, events_by_req: EventList) -> Callable: def _make_request_callback(
self, action: str, events_by_req: EventList
) -> BatchRequestCallback:
"""make callback for log result of batch request """make callback for log result of batch request
Arguments: Arguments:
@@ -105,184 +190,214 @@ class GoogleCalendar:
callback function callback function
""" """
def callback(request_id, response, exception): def callback(
event = events_by_req[int(request_id)] request_id: str, response: Any, exception: Optional[Exception]
key = select_event_key(event) ) -> None:
event: EventData = events_by_req[int(request_id)]
event_key: Optional[str] = select_event_key(event)
key: str = event_key if event_key is not None else ""
if exception is not None: if exception is not None:
self.logger.error( self.logger.error(
'failed to %s event with %s: %s, exception: %s', "failed to %s event with %s: %s, exception: %s",
action, key, event.get(key), str(exception) action,
key,
event.get(key),
str(exception),
) )
else: else:
resp_key = select_event_key(response) resp_key: Optional[str] = select_event_key(response)
if resp_key is not None: if resp_key is not None:
event = response event = response
key = resp_key key = resp_key
self.logger.info('event %s ok, %s: %s', self.logger.info("event %s ok, %s: %s", action, key, event.get(key))
action, key, event.get(key))
return callback return callback
def list_events_from(self, start: datetime) -> EventList: def list_events_from(self, start: datetime) -> EventList:
""" list events from calendar, where start date >= start """list events from calendar, where start date >= start"""
""" fields: str = "nextPageToken,items(id,iCalUID,updated)"
fields = 'nextPageToken,items(id,iCalUID,updated)' events: EventList = []
events = [] page_token: Optional[str] = None
page_token = None time_min: str = (
timeMin = utc.normalize(start.astimezone(utc)).replace( utc.normalize(start.astimezone(utc)).replace(tzinfo=None).isoformat() + "Z"
tzinfo=None).isoformat() + 'Z' )
while True: while True:
response = self.service.events().list(calendarId=self.calendarId, response = (
pageToken=page_token, self.service.events()
singleEvents=True, .list(
timeMin=timeMin, calendarId=self.calendar_id,
fields=fields).execute() pageToken=page_token,
if 'items' in response: singleEvents=True,
events.extend(response['items']) timeMin=time_min,
page_token = response.get('nextPageToken') fields=fields,
)
.execute()
)
if "items" in response:
events.extend(response["items"])
page_token = response.get("nextPageToken")
if not page_token: if not page_token:
break break
self.logger.info('%d events listed', len(events)) self.logger.info("%d events listed", len(events))
return events return events
def find_exists(self, events: List) -> Tuple[List[EventTuple], EventList]: def find_exists(self, events: EventList) -> EventsSearchResults:
""" find existing events from list, by 'iCalUID' field """find existing events from list, by 'iCalUID' field
Arguments: Arguments:
events {list} -- list of events events {list} -- list of events
Returns: Returns:
tuple -- (events_exist, events_not_found) EventsSearchResults -- (events_exist, events_not_found)
events_exist - list of tuples: (new_event, exists_event) events_exist - list of tuples: (new_event, exists_event)
""" """
fields = 'items(id,iCalUID,updated)' fields: str = "items(id,iCalUID,updated)"
events_by_req = [] events_by_req: EventList = []
exists = [] exists: List[EventTuple] = []
not_found = [] not_found: EventList = []
def list_callback(request_id, response, exception): def list_callback(
found = False request_id: str, response: Any, exception: Optional[Exception]
cur_event = events_by_req[int(request_id)] ) -> None:
found: bool = False
cur_event: EventData = events_by_req[int(request_id)]
if exception is None: if exception is None:
found = ([] != response['items']) found = [] != response["items"]
else: else:
self.logger.error( self.logger.error(
'exception %s, while listing event with UID: %s', "exception %s, while listing event with UID: %s",
str(exception), cur_event['iCalUID']) str(exception),
cur_event["iCalUID"],
)
if found: if found:
exists.append( exists.append((cur_event, response["items"][0]))
(cur_event, response['items'][0]))
else: else:
not_found.append(events_by_req[int(request_id)]) not_found.append(events_by_req[int(request_id)])
batch = self.service.new_batch_http_request(callback=list_callback) batch = self.service.new_batch_http_request(callback=list_callback)
i = 0 i: int = 0
for event in events: for event in events:
events_by_req.append(event) events_by_req.append(event)
batch.add(self.service.events().list(calendarId=self.calendarId, batch.add(
iCalUID=event['iCalUID'], self.service.events().list(
showDeleted=True, calendarId=self.calendar_id,
fields=fields iCalUID=event["iCalUID"],
), showDeleted=True,
request_id=str(i) fields=fields,
) ),
request_id=str(i),
)
i += 1 i += 1
batch.execute() batch.execute()
self.logger.info('%d events exists, %d not found', self.logger.info("%d events exists, %d not found", len(exists), len(not_found))
len(exists), len(not_found)) return EventsSearchResults(exists, not_found)
return exists, not_found
def insert_events(self, events: EventList): def insert_events(self, events: EventList) -> None:
""" insert list of events """insert list of events
Arguments: Arguments:
events - events list events - events list
""" """
fields = 'id' fields: str = "id"
events_by_req = [] events_by_req: EventList = []
insert_callback = self._make_request_callback('insert', events_by_req) insert_callback = self._make_request_callback("insert", events_by_req)
batch = self.service.new_batch_http_request(callback=insert_callback) batch = self.service.new_batch_http_request(callback=insert_callback)
i = 0 i: int = 0
for event in events: for event in events:
events_by_req.append(event) events_by_req.append(event)
batch.add(self.service.events().insert( batch.add(
calendarId=self.calendarId, body=event, fields=fields), self.service.events().insert(
request_id=str(i) calendarId=self.calendar_id, body=event, fields=fields
),
request_id=str(i),
) )
i += 1 i += 1
batch.execute() batch.execute()
def patch_events(self, event_tuples: List[EventTuple]): def patch_events(self, event_tuples: List[EventTuple]) -> None:
""" patch (update) events """patch (update) events
Arguments: Arguments:
event_tuples -- list of tuples: (new_event, exists_event) event_tuples -- list of tuples: (new_event, exists_event)
""" """
fields = 'id' fields: str = "id"
events_by_req = [] events_by_req: EventList = []
patch_callback = self._make_request_callback('patch', events_by_req) patch_callback = self._make_request_callback("patch", events_by_req)
batch = self.service.new_batch_http_request(callback=patch_callback) batch = self.service.new_batch_http_request(callback=patch_callback)
i = 0 i: int = 0
for event_new, event_old in event_tuples: for event_new, event_old in event_tuples:
if 'id' not in event_old: if "id" not in event_old:
continue continue
events_by_req.append(event_new) events_by_req.append(event_new)
batch.add(self.service.events().patch( batch.add(
calendarId=self.calendarId, eventId=event_old['id'], self.service.events().patch(
body=event_new), fields=fields, request_id=str(i)) calendarId=self.calendar_id, eventId=event_old["id"], body=event_new
),
fields=fields,
request_id=str(i),
)
i += 1 i += 1
batch.execute() batch.execute()
def update_events(self, event_tuples: List[EventTuple]): def update_events(self, event_tuples: List[EventTuple]) -> None:
""" update events """update events
Arguments: Arguments:
event_tuples -- list of tuples: (new_event, exists_event) event_tuples -- list of tuples: (new_event, exists_event)
""" """
fields = 'id' fields: str = "id"
events_by_req = [] events_by_req: EventList = []
update_callback = self._make_request_callback('update', events_by_req) update_callback = self._make_request_callback("update", events_by_req)
batch = self.service.new_batch_http_request(callback=update_callback) batch = self.service.new_batch_http_request(callback=update_callback)
i = 0 i: int = 0
for event_new, event_old in event_tuples: for event_new, event_old in event_tuples:
if 'id' not in event_old: if "id" not in event_old:
continue continue
events_by_req.append(event_new) events_by_req.append(event_new)
batch.add(self.service.events().update( batch.add(
calendarId=self.calendarId, eventId=event_old['id'], self.service.events().update(
body=event_new, fields=fields), request_id=str(i)) calendarId=self.calendar_id,
eventId=event_old["id"],
body=event_new,
fields=fields,
),
request_id=str(i),
)
i += 1 i += 1
batch.execute() batch.execute()
def delete_events(self, events: EventList): def delete_events(self, events: EventList) -> None:
""" delete events """delete events
Arguments: Arguments:
events -- list of events events -- list of events
""" """
events_by_req = [] events_by_req: EventList = []
delete_callback = self._make_request_callback('delete', events_by_req) delete_callback = self._make_request_callback("delete", events_by_req)
batch = self.service.new_batch_http_request(callback=delete_callback) batch = self.service.new_batch_http_request(callback=delete_callback)
i = 0 i: int = 0
for event in events: for event in events:
events_by_req.append(event) events_by_req.append(event)
batch.add(self.service.events().delete( batch.add(
calendarId=self.calendarId, self.service.events().delete(
eventId=event['id']), request_id=str(i)) calendarId=self.calendar_id, eventId=event["id"]
),
request_id=str(i),
)
i += 1 i += 1
batch.execute() batch.execute()
def create(self, summary: str, timeZone: Optional[str] = None) -> Any: def create(self, summary: str, time_zone: Optional[str] = None) -> Any:
"""create calendar """create calendar
Arguments: Arguments:
@@ -295,52 +410,35 @@ class GoogleCalendar:
calendar Resource calendar Resource
""" """
calendar = {'summary': summary} calendar = CalendarData(summary=summary)
if timeZone is not None: if time_zone is not None:
calendar['timeZone'] = timeZone calendar["timeZone"] = time_zone
created_calendar = self.service.calendars().insert( created_calendar = self.service.calendars().insert(body=calendar).execute()
body=calendar self.calendar_id = created_calendar["id"]
).execute()
self.calendarId = created_calendar['id']
return created_calendar return created_calendar
def delete(self): def delete(self) -> None:
"""delete calendar """delete calendar"""
"""
self.service.calendars().delete(calendarId=self.calendarId).execute() self.service.calendars().delete(calendarId=self.calendar_id).execute()
def make_public(self): def make_public(self) -> None:
"""make calendar puplic """make calendar public"""
"""
rule_public = { rule_public = ACLRule(scope=ACLScope(type="default"), role="reader")
'scope': { self.service.acl().insert(
'type': 'default', calendarId=self.calendar_id, body=rule_public
},
'role': 'reader'
}
return self.service.acl().insert(
calendarId=self.calendarId,
body=rule_public
).execute() ).execute()
def add_owner(self, email: str): def add_owner(self, email: str) -> None:
"""add calendar owner by email """add calendar owner by email
Arguments: Arguments:
email -- email to add email -- email to add
""" """
rule_owner = { rule_owner = ACLRule(scope=ACLScope(type="user", value=email), role="owner")
'scope': { self.service.acl().insert(
'type': 'user', calendarId=self.calendar_id, body=rule_owner
'value': email,
},
'role': 'owner'
}
return self.service.acl().insert(
calendarId=self.calendarId,
body=rule_owner
).execute() ).execute()

View File

@@ -1,60 +1,22 @@
import datetime import datetime
import logging import logging
from typing import Union, Dict, Callable, Optional from typing import Union, Dict, Callable, Optional, Mapping, TypedDict
from icalendar import Calendar, Event from icalendar import Calendar, Event
from pytz import utc from pytz import utc
import pydantic from .gcal import (
EventData,
from .gcal import EventData, EventList EventList,
EventDateOrDateTime,
EventDateTime,
EventDate,
EventDataKey,
)
DateDateTime = Union[datetime.date, datetime.datetime] DateDateTime = Union[datetime.date, datetime.datetime]
class GCal_DateDateTime(pydantic.BaseModel):
date: Optional[str] = pydantic.Field(default=None)
date_time: Optional[str] = pydantic.Field(alias='dateTime', default=None)
timezone: Optional[str] = pydantic.Field(alias='timeZone', default=None)
@pydantic.root_validator(allow_reuse=True)
def check_only_date_or_datetime(cls, values):
date = values.get('date', None)
date_time = values.get('date_time', None)
assert (date is None) != (date_time is None), \
'only date or date_time must be provided'
return values
@classmethod
def create_from(cls, value: DateDateTime) -> 'GCal_DateDateTime':
key: str = 'date'
str_value: str = ''
if type(value) is datetime.datetime:
key = 'date_time'
str_value = format_datetime_utc(value)
else:
str_value = value.isoformat()
return cls(**{key: str_value})
class Config:
allow_population_by_field_name = True
class GCal_Event(pydantic.BaseModel):
created: Optional[str] = None
updated: Optional[str] = None
summary: Optional[str] = None
description: Optional[str] = None
location: Optional[str] = None
start: GCal_DateDateTime
end: GCal_DateDateTime
transparency: Optional[str] = None
ical_uid: str = pydantic.Field(alias='iCalUID')
class Config:
allow_population_by_field_name = True
def format_datetime_utc(value: DateDateTime) -> str: def format_datetime_utc(value: DateDateTime) -> str:
"""utc datetime as string from date or datetime value """utc datetime as string from date or datetime value
@@ -64,20 +26,17 @@ def format_datetime_utc(value: DateDateTime) -> str:
Returns: Returns:
utc datetime value as string in iso format utc datetime value as string in iso format
""" """
if type(value) is datetime.date: if not isinstance(value, datetime.datetime):
value = datetime.datetime( value = datetime.datetime(value.year, value.month, value.day, tzinfo=utc)
value.year, value.month, value.day, tzinfo=utc)
value = value.replace(microsecond=1) value = value.replace(microsecond=1)
return utc.normalize( return utc.normalize(value.astimezone(utc)).replace(tzinfo=None).isoformat() + "Z"
value.astimezone(utc)
).replace(tzinfo=None).isoformat() + 'Z'
def gcal_date_or_dateTime(value: DateDateTime, def gcal_date_or_datetime(
check_value: Optional[DateDateTime] = None) \ value: DateDateTime, check_value: Optional[DateDateTime] = None
-> Dict[str, str]: ) -> EventDateOrDateTime:
"""date or dateTime to gcal (start or end dict) """date or datetime to gcal (start or end dict)
Arguments: Arguments:
value: date or datetime value: date or datetime
@@ -90,18 +49,18 @@ def gcal_date_or_dateTime(value: DateDateTime,
if check_value is None: if check_value is None:
check_value = value check_value = value
result: Dict[str, str] = {} result: EventDateOrDateTime
if isinstance(check_value, datetime.datetime): if isinstance(check_value, datetime.datetime):
result['dateTime'] = format_datetime_utc(value) result = EventDateTime(dateTime=format_datetime_utc(value))
else: else:
if isinstance(check_value, datetime.date): if isinstance(check_value, datetime.date):
if isinstance(value, datetime.datetime): if isinstance(value, datetime.datetime):
value = datetime.date(value.year, value.month, value.day) value = datetime.date(value.year, value.month, value.day)
result['date'] = value.isoformat() result = EventDate(date=value.isoformat())
return result return result
class EventConverter(Event): class EventConverter(Event): # type: ignore
"""Convert icalendar event to google calendar resource """Convert icalendar event to google calendar resource
( https://developers.google.com/calendar/v3/reference/events#resource-representations ) ( https://developers.google.com/calendar/v3/reference/events#resource-representations )
""" """
@@ -110,13 +69,13 @@ class EventConverter(Event):
"""decoded string property """decoded string property
Arguments: Arguments:
prop - propperty name prop - property name
Returns: Returns:
string value string value
""" """
return self.decoded(prop).decode(encoding='utf-8') return str(self.decoded(prop).decode(encoding="utf-8"))
def _datetime_str_prop(self, prop: str) -> str: def _datetime_str_prop(self, prop: str) -> str:
"""utc datetime as string from property """utc datetime as string from property
@@ -130,8 +89,8 @@ class EventConverter(Event):
return format_datetime_utc(self.decoded(prop)) return format_datetime_utc(self.decoded(prop))
def _gcal_start(self) -> GCal_DateDateTime: def _gcal_start(self) -> EventDateOrDateTime:
""" event start dict from icalendar event """event start dict from icalendar event
Raises: Raises:
ValueError -- if DTSTART not date or datetime ValueError -- if DTSTART not date or datetime
@@ -140,10 +99,10 @@ class EventConverter(Event):
dict dict
""" """
value = self.decoded('DTSTART') value = self.decoded("DTSTART")
return GCal_DateDateTime.create_from(value) return gcal_date_or_datetime(value)
def _gcal_end(self) -> GCal_DateDateTime: def _gcal_end(self) -> EventDateOrDateTime:
"""event end dict from icalendar event """event end dict from icalendar event
Raises: Raises:
@@ -152,31 +111,31 @@ class EventConverter(Event):
dict dict
""" """
result = None result: EventDateOrDateTime
if 'DTEND' in self: if "DTEND" in self:
value = self.decoded('DTEND') value = self.decoded("DTEND")
result = GCal_DateDateTime.create_from(value) result = gcal_date_or_datetime(value)
elif 'DURATION' in self: elif "DURATION" in self:
start_val = self.decoded('DTSTART') start_val = self.decoded("DTSTART")
duration = self.decoded('DURATION') duration = self.decoded("DURATION")
end_val = start_val + duration end_val = start_val + duration
if type(start_val) is datetime.date:
if type(end_val) is datetime.datetime:
end_val = datetime.date(
end_val.year, end_val.month, end_val.day)
result = GCal_DateDateTime.create_from(end_val) result = gcal_date_or_datetime(end_val, check_value=start_val)
else: else:
raise ValueError('no DTEND or DURATION') raise ValueError("no DTEND or DURATION")
return result return result
def _put_to_gcal(self, gcal_event: EventData, def _put_to_gcal(
prop: str, func: Callable[[str], str], self,
ics_prop: Optional[str] = None): gcal_event: EventData,
"""get property from ical event if exist, and put to gcal event prop: EventDataKey,
func: Callable[[str], str],
ics_prop: Optional[str] = None,
) -> None:
"""get property from ical event if existed, and put to gcal event
Arguments: Arguments:
gcal_event -- dest event gcal_event -- destination event
prop -- property name prop -- property name
func -- function to convert func -- function to convert
ics_prop -- ical property name (default: {None}) ics_prop -- ical property name (default: {None})
@@ -187,69 +146,56 @@ class EventConverter(Event):
if ics_prop in self: if ics_prop in self:
gcal_event[prop] = func(ics_prop) gcal_event[prop] = func(ics_prop)
def _get_prop(self, prop: str, func: Callable[[str], str]): def convert(self) -> EventData:
"""get property from ical event if exist else None
Arguments:
prop -- property name
func -- function to convert
"""
if prop not in self:
return None
return func(prop)
def to_gcal(self) -> EventData:
"""Convert """Convert
Returns: Returns:
dict - google calendar#event resource dict - google calendar#event resource
""" """
kwargs = { event: EventData = EventData(
'ical_uid': self._str_prop('UID'), iCalUID=self._str_prop("UID"),
'start': self._gcal_start(), start=self._gcal_start(),
'end': self._gcal_end(), end=self._gcal_end(),
'summary': self._get_prop('SUMMARY', self._str_prop), )
'description': self._get_prop('DESCRIPTION', self._str_prop),
'location': self._get_prop('LOCATION', self._str_prop),
'created': self._get_prop('CREATED', self._datetime_str_prop),
'updated': self._get_prop('LAST-MODIFIED', self._datetime_str_prop),
'transparency': self._get_prop('TRANSP', lambda prop: self._str_prop(prop).lower()),
}
return GCal_Event(**kwargs).dict(by_alias=True, exclude_defaults=True) self._put_to_gcal(event, "summary", self._str_prop)
self._put_to_gcal(event, "description", self._str_prop)
self._put_to_gcal(event, "location", self._str_prop)
self._put_to_gcal(event, "created", self._datetime_str_prop)
self._put_to_gcal(event, "updated", self._datetime_str_prop, "LAST-MODIFIED")
self._put_to_gcal(
event, "transparency", lambda prop: self._str_prop(prop).lower(), "TRANSP"
)
return event
class CalendarConverter: class CalendarConverter:
"""Convert icalendar events to google calendar resources """Convert icalendar events to google calendar resources"""
"""
logger = logging.getLogger('CalendarConverter') logger = logging.getLogger("CalendarConverter")
def __init__(self, calendar: Optional[Calendar] = None): def __init__(self, calendar: Optional[Calendar] = None):
self.calendar: Optional[Calendar] = calendar self.calendar: Optional[Calendar] = calendar
def load(self, filename: str): def load(self, filename: str) -> None:
""" load calendar from ics file """load calendar from ics file"""
""" with open(filename, "r", encoding="utf-8") as f:
with open(filename, 'r', encoding='utf-8') as f:
self.calendar = Calendar.from_ical(f.read()) self.calendar = Calendar.from_ical(f.read())
self.logger.info('%s loaded', filename) self.logger.info("%s loaded", filename)
def loads(self, string: str): def loads(self, string: str) -> None:
""" load calendar from ics string """load calendar from ics string"""
"""
self.calendar = Calendar.from_ical(string) self.calendar = Calendar.from_ical(string)
def events_to_gcal(self) -> EventList: def events_to_gcal(self) -> EventList:
"""Convert events to google calendar resources """Convert events to google calendar resources"""
"""
ics_events = self.calendar.walk(name='VEVENT') calendar: Calendar = self.calendar
self.logger.info('%d events readed', len(ics_events)) ics_events = calendar.walk(name="VEVENT")
self.logger.info("%d events read", len(ics_events))
result = list( result = list(map(lambda event: EventConverter(event).convert(), ics_events))
map(lambda event: EventConverter(event).to_gcal(), ics_events)) self.logger.info("%d events converted", len(result))
self.logger.info('%d events converted', len(result))
return result return result

View File

@@ -8,9 +8,9 @@ from . import GoogleCalendar, GoogleCalendarService
def load_config(filename: str) -> Optional[Dict[str, Any]]: def load_config(filename: str) -> Optional[Dict[str, Any]]:
result = None result: Optional[Dict[str, Any]] = None
try: try:
with open(filename, 'r', encoding='utf-8') as f: with open(filename, "r", encoding="utf-8") as f:
result = yaml.safe_load(f) result = yaml.safe_load(f)
except FileNotFoundError: except FileNotFoundError:
pass pass
@@ -19,24 +19,27 @@ def load_config(filename: str) -> Optional[Dict[str, Any]]:
class PropertyCommands: class PropertyCommands:
""" get/set google calendar properties """ """get/set google calendar properties"""
def __init__(self, _service): def __init__(self, _service: Any) -> None:
self._service = _service self._service = _service
def get(self, calendar_id: str, property_name: str) -> None: def get(self, calendar_id: str, property_name: str) -> None:
""" get calendar property """get calendar property
Args: Args:
calendar_id: calendar id calendar_id: calendar id
property_name: property key property_name: property key
""" """
response = self._service.calendarList().get(calendarId=calendar_id, response = (
fields=property_name).execute() self._service.calendarList()
.get(calendarId=calendar_id, fields=property_name)
.execute()
)
print(response.get(property_name)) print(response.get(property_name))
def set(self, calendar_id: str, property_name: str, property_value: str) -> None: def set(self, calendar_id: str, property_name: str, property_value: str) -> None:
""" set calendar property """set calendar property
Args: Args:
calendar_id: calendar id calendar_id: calendar id
@@ -44,53 +47,60 @@ class PropertyCommands:
property_value: property value property_value: property value
""" """
body = {property_name: property_value} body = {property_name: property_value}
response = self._service.calendarList().patch(body=body, calendarId=calendar_id).execute() response = (
self._service.calendarList()
.patch(body=body, calendarId=calendar_id)
.execute()
)
print(response) print(response)
class Commands: class Commands:
""" manage google calendars in service account """ """manage google calendars in service account"""
def __init__(self, config: str = 'config.yml'): def __init__(self, config: str = "config.yml"):
""" """
Args: Args:
config(str): config filename config(str): config filename
""" """
self._config: Optional[Dict[str, Any]] = load_config(config) self._config: Optional[Dict[str, Any]] = load_config(config)
if self._config is not None and 'logging' in self._config: if self._config is not None and "logging" in self._config:
logging.config.dictConfig(self._config['logging']) logging.config.dictConfig(self._config["logging"])
self._service = GoogleCalendarService.from_config(self._config) self._service = GoogleCalendarService.from_config(self._config)
self.property = PropertyCommands(self._service) self.property = PropertyCommands(self._service)
def list(self, show_hidden: bool = False, show_deleted: bool = False) -> None: def list(self, show_hidden: bool = False, show_deleted: bool = False) -> None:
""" list calendars """list calendars
Args: Args:
show_hidden: show hidden calendars show_hidden: show hidden calendars
show_deleted: show deleted calendars show_deleted: show deleted calendars
""" """
fields: str = 'nextPageToken,items(id,summary)' fields: str = "nextPageToken,items(id,summary)"
calendars: List[Dict[str, Any]] = [] calendars: List[Dict[str, Any]] = []
page_token: Optional[str] = None page_token: Optional[str] = None
while True: while True:
calendars_api = self._service.calendarList() calendars_api = self._service.calendarList()
response = calendars_api.list(fields=fields, response = calendars_api.list(
pageToken=page_token, fields=fields,
showHidden=show_hidden, pageToken=page_token,
showDeleted=show_deleted showHidden=show_hidden,
).execute() showDeleted=show_deleted,
if 'items' in response: ).execute()
calendars.extend(response['items']) if "items" in response:
page_token = response.get('nextPageToken') calendars.extend(response["items"])
page_token = response.get("nextPageToken")
if page_token is None: if page_token is None:
break break
for calendar in calendars: for calendar in calendars:
print('{summary}: {id}'.format_map(calendar)) print("{summary}: {id}".format_map(calendar))
def create(self, summary: str, timezone: Optional[str] = None, public: bool = False) -> None: def create(
""" create calendar self, summary: str, timezone: Optional[str] = None, public: bool = False
) -> None:
"""create calendar
Args: Args:
summary: new calendar summary summary: new calendar summary
@@ -101,10 +111,10 @@ class Commands:
calendar.create(summary, timezone) calendar.create(summary, timezone)
if public: if public:
calendar.make_public() calendar.make_public()
print('{}: {}'.format(summary, calendar.calendarId)) print("{}: {}".format(summary, calendar.calendar_id))
def add_owner(self, calendar_id: str, email: str) -> None: def add_owner(self, calendar_id: str, email: str) -> None:
""" add owner to calendar """add owner to calendar
Args: Args:
calendar_id: calendar id calendar_id: calendar id
@@ -112,33 +122,33 @@ class Commands:
""" """
calendar = GoogleCalendar(self._service, calendar_id) calendar = GoogleCalendar(self._service, calendar_id)
calendar.add_owner(email) calendar.add_owner(email)
print('to {} added owner: {}'.format(calendar_id, email)) print("to {} added owner: {}".format(calendar_id, email))
def remove(self, calendar_id: str) -> None: def remove(self, calendar_id: str) -> None:
""" remove calendar """remove calendar
Args: Args:
calendar_id: calendar id calendar_id: calendar id
""" """
calendar = GoogleCalendar(self._service, calendar_id) calendar = GoogleCalendar(self._service, calendar_id)
calendar.delete() calendar.delete()
print('removed: {}'.format(calendar_id)) print("removed: {}".format(calendar_id))
def rename(self, calendar_id: str, summary: str) -> None: def rename(self, calendar_id: str, summary: str) -> None:
""" rename calendar """rename calendar
Args: Args:
calendar_id: calendar id calendar_id: calendar id
summary: summary:
""" """
calendar = {'summary': summary} calendar = {"summary": summary}
self._service.calendars().patch(body=calendar, calendarId=calendar_id).execute() self._service.calendars().patch(body=calendar, calendarId=calendar_id).execute()
print('{}: {}'.format(summary, calendar_id)) print("{}: {}".format(summary, calendar_id))
def main(): def main() -> None:
fire.Fire(Commands, name='manage-ics2gcal') fire.Fire(Commands, name="manage-ics2gcal")
if __name__ == '__main__': if __name__ == "__main__":
main() main()

0
sync_ics2gcal/py.typed Normal file
View File

View File

@@ -1,20 +1,35 @@
import datetime import datetime
import logging import logging
import operator import operator
from typing import List, Dict, Set, Tuple, Union, Callable from typing import List, Dict, Set, Tuple, Union, Callable, NamedTuple
import dateutil.parser import dateutil.parser
from pytz import utc from pytz import utc
from .gcal import GoogleCalendar, EventData, EventList, EventTuple from .gcal import (
GoogleCalendar,
EventData,
EventList,
EventTuple,
EventDataKey,
EventDateOrDateTime,
EventDate,
)
from .ical import CalendarConverter, DateDateTime from .ical import CalendarConverter, DateDateTime
class CalendarSync: class ComparedEvents(NamedTuple):
"""class for syncronize calendar with google """Compared events"""
"""
logger = logging.getLogger('CalendarSync') added: EventList
changed: List[EventTuple]
deleted: EventList
class CalendarSync:
"""class for synchronize calendar with Google"""
logger = logging.getLogger("CalendarSync")
def __init__(self, gcalendar: GoogleCalendar, converter: CalendarConverter): def __init__(self, gcalendar: GoogleCalendar, converter: CalendarConverter):
self.gcalendar: GoogleCalendar = gcalendar self.gcalendar: GoogleCalendar = gcalendar
@@ -24,24 +39,22 @@ class CalendarSync:
self.to_delete: EventList = [] self.to_delete: EventList = []
@staticmethod @staticmethod
def _events_list_compare(items_src: EventList, def _events_list_compare(
items_dst: EventList, items_src: EventList, items_dst: EventList, key: EventDataKey = "iCalUID"
key: str = 'iCalUID') \ ) -> ComparedEvents:
-> Tuple[EventList, List[EventTuple], EventList]: """compare list of events by key
""" compare list of events by key
Arguments: Arguments:
items_src {list of dict} -- source events items_src {list of dict} -- source events
items_dst {list of dict} -- dest events items_dst {list of dict} -- destination events
key {str} -- name of key to compare (default: {'iCalUID'}) key {str} -- name of key to compare (default: {'iCalUID'})
Returns: Returns:
tuple -- (items_to_insert, ComparedEvents -- (added, changed, deleted)
items_to_update,
items_to_delete)
""" """
def get_key(item: EventData) -> str: return item[key] def get_key(item: EventData) -> str:
return str(item[key])
keys_src: Set[str] = set(map(get_key, items_src)) keys_src: Set[str] = set(map(get_key, items_src))
keys_dst: Set[str] = set(map(get_key, items_dst)) keys_dst: Set[str] = set(map(get_key, items_dst))
@@ -50,67 +63,68 @@ class CalendarSync:
keys_to_update = keys_src & keys_dst keys_to_update = keys_src & keys_dst
keys_to_delete = keys_dst - keys_src keys_to_delete = keys_dst - keys_src
def items_by_keys(items: EventList, def items_by_keys(items: EventList, keys: Set[str]) -> EventList:
key_name: str, return list(filter(lambda item: get_key(item) in keys, items))
keys: Set[str]) -> EventList:
return list(filter(lambda item: item[key_name] in keys, items))
items_to_insert = items_by_keys(items_src, key, keys_to_insert) items_to_insert = items_by_keys(items_src, keys_to_insert)
items_to_delete = items_by_keys(items_dst, key, keys_to_delete) items_to_delete = items_by_keys(items_dst, keys_to_delete)
to_upd_src = items_by_keys(items_src, key, keys_to_update) to_upd_src = items_by_keys(items_src, keys_to_update)
to_upd_dst = items_by_keys(items_dst, key, keys_to_update) to_upd_dst = items_by_keys(items_dst, keys_to_update)
to_upd_src.sort(key=get_key) to_upd_src.sort(key=get_key)
to_upd_dst.sort(key=get_key) to_upd_dst.sort(key=get_key)
items_to_update = list(zip(to_upd_src, to_upd_dst)) items_to_update = list(zip(to_upd_src, to_upd_dst))
return items_to_insert, items_to_update, items_to_delete return ComparedEvents(items_to_insert, items_to_update, items_to_delete)
def _filter_events_to_update(self): def _filter_events_to_update(self) -> None:
""" filter 'to_update' events by 'updated' datetime """filter 'to_update' events by 'updated' datetime"""
"""
def filter_updated(event_tuple: EventTuple) -> bool: def filter_updated(event_tuple: EventTuple) -> bool:
new, old = event_tuple new, old = event_tuple
new_date = dateutil.parser.parse(new['updated']) if "updated" not in new or "updated" not in old:
old_date = dateutil.parser.parse(old['updated']) return True
new_date = dateutil.parser.parse(new["updated"])
old_date = dateutil.parser.parse(old["updated"])
return new_date > old_date return new_date > old_date
self.to_update = list(filter(filter_updated, self.to_update)) self.to_update = list(filter(filter_updated, self.to_update))
@staticmethod @staticmethod
def _filter_events_by_date(events: EventList, def _filter_events_by_date(
date: DateDateTime, events: EventList,
op: Callable[[DateDateTime, date: DateDateTime,
DateDateTime], bool]) -> EventList: op: Callable[[DateDateTime, DateDateTime], bool],
""" filter events by start datetime ) -> EventList:
"""filter events by start datetime
Arguments: Arguments:
events -- events list events -- events list
date {datetime} -- datetime to compare date {datetime} -- datetime to compare
op {operator} -- comparsion operator op {operator} -- comparison operator
Returns: Returns:
list of filtred events list of filtered events
""" """
def filter_by_date(event: EventData) -> bool: def filter_by_date(event: EventData) -> bool:
date_cmp = date date_cmp = date
event_start: Dict[str, str] = event['start'] event_start: EventDateOrDateTime = event["start"]
event_date: Union[DateDateTime, str, None] = None event_date: Union[DateDateTime, str, None] = None
compare_dates = False compare_dates = False
if 'date' in event_start: if "date" in event_start:
event_date = event_start['date'] event_date = event_start["date"] # type: ignore
compare_dates = True compare_dates = True
elif 'dateTime' in event_start: elif "dateTime" in event_start:
event_date = event_start['dateTime'] event_date = event_start["dateTime"] # type: ignore
event_date = dateutil.parser.parse(event_date) event_date = dateutil.parser.parse(str(event_date))
if compare_dates: if compare_dates:
date_cmp = datetime.date(date.year, date.month, date.day) date_cmp = datetime.date(date.year, date.month, date.day)
event_date = datetime.date( event_date = datetime.date(
event_date.year, event_date.month, event_date.day) event_date.year, event_date.month, event_date.day
)
return op(event_date, date_cmp) return op(event_date, date_cmp)
@@ -118,13 +132,13 @@ class CalendarSync:
@staticmethod @staticmethod
def _tz_aware_datetime(date: DateDateTime) -> datetime.datetime: def _tz_aware_datetime(date: DateDateTime) -> datetime.datetime:
"""make tz aware datetime from datetime/date (utc if no tzinfo) """make tz aware datetime from datetime/date (utc if no tz-info)
Arguments: Arguments:
date - date or datetime / with or without tzinfo date - date or datetime / with or without tz-info
Returns: Returns:
datetime with tzinfo datetime with tz-info
""" """
if not isinstance(date, datetime.datetime): if not isinstance(date, datetime.datetime):
@@ -134,7 +148,7 @@ class CalendarSync:
return date return date
def prepare_sync(self, start_date: DateDateTime) -> None: def prepare_sync(self, start_date: DateDateTime) -> None:
"""prepare sync lists by comparsion of events """prepare sync lists by comparison of events
Arguments: Arguments:
start_date -- date/datetime to start sync start_date -- date/datetime to start sync
@@ -147,44 +161,47 @@ class CalendarSync:
# divide source events by start datetime # divide source events by start datetime
events_src_pending = CalendarSync._filter_events_by_date( events_src_pending = CalendarSync._filter_events_by_date(
events_src, start_date, operator.ge) events_src, start_date, operator.ge
)
events_src_past = CalendarSync._filter_events_by_date( events_src_past = CalendarSync._filter_events_by_date(
events_src, start_date, operator.lt) events_src, start_date, operator.lt
)
# first events comparsion # first events comparison
self.to_insert, self.to_update, self.to_delete = CalendarSync._events_list_compare( (
events_src_pending, events_dst) self.to_insert,
self.to_update,
self.to_delete,
) = CalendarSync._events_list_compare(events_src_pending, events_dst)
# find in events 'to_delete' past events from source, for update (move to past) # find in events 'to_delete' past events from source, for update (move to past)
_, add_to_update, self.to_delete = CalendarSync._events_list_compare( _, add_to_update, self.to_delete = CalendarSync._events_list_compare(
events_src_past, self.to_delete) events_src_past, self.to_delete
)
self.to_update.extend(add_to_update) self.to_update.extend(add_to_update)
# find if events 'to_insert' exists in gcalendar, for update them # find if events 'to_insert' exists in gcalendar, for update them
add_to_update, self.to_insert = self.gcalendar.find_exists( add_to_update, self.to_insert = self.gcalendar.find_exists(self.to_insert)
self.to_insert)
self.to_update.extend(add_to_update) self.to_update.extend(add_to_update)
# exclude outdated events from 'to_update' list, by 'updated' field # exclude outdated events from 'to_update' list, by 'updated' field
self._filter_events_to_update() self._filter_events_to_update()
self.logger.info( self.logger.info(
'prepared to sync: ( insert: %d, update: %d, delete: %d )', "prepared to sync: ( insert: %d, update: %d, delete: %d )",
len(self.to_insert), len(self.to_insert),
len(self.to_update), len(self.to_update),
len(self.to_delete) len(self.to_delete),
) )
def clear(self) -> None: def clear(self) -> None:
""" clear prepared sync lists (insert, update, delete) """clear prepared sync lists (insert, update, delete)"""
"""
self.to_insert.clear() self.to_insert.clear()
self.to_update.clear() self.to_update.clear()
self.to_delete.clear() self.to_delete.clear()
def apply(self) -> None: def apply(self) -> None:
""" apply sync (insert, update, delete), using prepared lists of events """apply sync (insert, update, delete), using prepared lists of events"""
"""
self.gcalendar.insert_events(self.to_insert) self.gcalendar.insert_events(self.to_insert)
self.gcalendar.update_events(self.to_update) self.gcalendar.update_events(self.to_update)
@@ -192,4 +209,4 @@ class CalendarSync:
self.clear() self.clear()
self.logger.info('sync done') self.logger.info("sync done")

View File

@@ -1,4 +1,4 @@
from typing import Dict, Any from typing import Dict, Any, Union
import yaml import yaml
@@ -6,49 +6,48 @@ import dateutil.parser
import datetime import datetime
import logging import logging
import logging.config import logging.config
from . import ( from . import CalendarConverter, GoogleCalendarService, GoogleCalendar, CalendarSync
CalendarConverter,
GoogleCalendarService, ConfigDate = Union[str, datetime.datetime]
GoogleCalendar,
CalendarSync
)
def load_config() -> Dict[str, Any]: def load_config() -> Dict[str, Any]:
with open('config.yml', 'r', encoding='utf-8') as f: with open("config.yml", "r", encoding="utf-8") as f:
result = yaml.safe_load(f) result = yaml.safe_load(f)
return result return result # type: ignore
def get_start_date(date_str: str) -> datetime.datetime: def get_start_date(date: ConfigDate) -> datetime.datetime:
if 'now' == date_str: if isinstance(date, datetime.datetime):
return date
if "now" == date:
result = datetime.datetime.utcnow() result = datetime.datetime.utcnow()
else: else:
result = dateutil.parser.parse(date_str) result = dateutil.parser.parse(date)
return result return result
def main(): def main() -> None:
config = load_config() config = load_config()
if 'logging' in config: if "logging" in config:
logging.config.dictConfig(config['logging']) logging.config.dictConfig(config["logging"])
calendarId: str = config['calendar']['google_id'] calendar_id: str = config["calendar"]["google_id"]
ics_filepath: str = config['calendar']['source'] ics_filepath: str = config["calendar"]["source"]
start = get_start_date(config['start_from']) start = get_start_date(config["start_from"])
converter = CalendarConverter() converter = CalendarConverter()
converter.load(ics_filepath) converter.load(ics_filepath)
service = GoogleCalendarService.from_config(config) service = GoogleCalendarService.from_config(config)
gcalendar = GoogleCalendar(service, calendarId) gcalendar = GoogleCalendar(service, calendar_id)
sync = CalendarSync(gcalendar, converter) sync = CalendarSync(gcalendar, converter)
sync.prepare_sync(start) sync.prepare_sync(start)
sync.apply() sync.apply()
if __name__ == '__main__': if __name__ == "__main__":
main() main()

View File

@@ -1,105 +0,0 @@
from typing import Iterable, List, Tuple, Union, Optional
from uuid import uuid4
import datetime
from itertools import islice
from dataclasses import dataclass
import time
import statistics
import functools
from sync_ics2gcal import CalendarConverter
@dataclass
class IcsTestEvent:
uid: str
start_date: Union[datetime.datetime, datetime.date]
end_date: Union[datetime.datetime, datetime.date, None] = None
duration: Optional[datetime.timedelta] = None
created: Union[datetime.datetime, datetime.date, None] = None
updated: Union[datetime.datetime, datetime.date, None] = None
@staticmethod
def _format_datetime(value: Union[datetime.datetime, datetime.date]):
result: str = ''
if isinstance(value, datetime.datetime):
result += f'DATE-TIME:{value.strftime("%Y%m%dT%H%M%SZ")}'
else:
result += f'DATE:{value.strftime("%Y%m%d")}'
return result
def render(self) -> str:
result: str = ''
result += 'BEGIN:VEVENT\r\n'
result += f'UID:{self.uid}\r\n'
result += f'DTSTART;VALUE={IcsTestEvent._format_datetime(self.start_date)}\r\n'
if self.end_date is not None:
result += f'DTEND;VALUE={IcsTestEvent._format_datetime(self.end_date)}\r\n'
else:
result += f'DURATION:P{self.duration.days}D\r\n'
if self.created is not None:
result += f'CREATED:{self.created.strftime("%Y%m%dT%H%M%SZ")}\r\n'
if self.updated is not None:
result += f'LAST-MODIFIED:{self.updated.strftime("%Y%m%dT%H%M%SZ")}\r\n'
result += 'END:VEVENT\r\n'
return result
@dataclass
class IcsTestCalendar:
events: List[IcsTestEvent]
def render(self) -> str:
result: str = ''
result += 'BEGIN:VCALENDAR\r\n'
for event in self.events:
result += event.render()
result += 'END:VCALENDAR\r\n'
return result
def gen_test_calendar(events_count: int) -> IcsTestCalendar:
def gen_events() -> Iterable[IcsTestEvent]:
for i in range(10000000):
uid = f'{uuid4()}@test.com'
start_date = datetime.datetime.now() + datetime.timedelta(hours=i)
end_date = start_date + datetime.timedelta(hours=1)
event: IcsTestEvent = IcsTestEvent(
uid=uid, start_date=start_date, end_date=end_date, created=start_date, updated=start_date)
yield event
events: List[IcsTestEvent] = list(islice(gen_events(), events_count))
result: IcsTestCalendar = IcsTestCalendar(events)
return result
test_calendar: IcsTestCalendar = gen_test_calendar(1000)
ics_test_calendar: str = test_calendar.render()
converter = CalendarConverter()
converter.loads(ics_test_calendar)
def bench(num_iters=1000):
def make_wrapper(func):
@functools.wraps(func)
def wrapper(*args, **kw):
times = []
for _ in range(num_iters):
t0 = time.perf_counter_ns()
result = func(*args, **kw)
t1 = time.perf_counter_ns()
times.append(t1 - t0)
best = min(times)
avg = round(sum(times) / num_iters, 2)
median = statistics.median(times)
print(
f'{func.__name__} x {num_iters} => best: {best} ns, \tavg: {avg} ns, \tmedian: {median} ns')
return result
return wrapper()
return make_wrapper
@bench(num_iters=500)
def events_to_gcal():
converter.events_to_gcal()

View File

@@ -1,31 +1,52 @@
from typing import Tuple import datetime
from typing import Tuple, Any
import pytest import pytest
from pytz import timezone, utc
from sync_ics2gcal import CalendarConverter from sync_ics2gcal import CalendarConverter
from sync_ics2gcal.ical import format_datetime_utc
uid = "UID:uisgtr8tre93wewe0yr8wqy@test.com" uid = "UID:uisgtr8tre93wewe0yr8wqy@test.com"
only_start_date = uid + """ only_start_date = (
uid
+ """
DTSTART;VALUE=DATE:20180215 DTSTART;VALUE=DATE:20180215
""" """
date_val = only_start_date + """ )
date_val = (
only_start_date
+ """
DTEND;VALUE=DATE:20180217 DTEND;VALUE=DATE:20180217
""" """
date_duration = only_start_date + """ )
date_duration = (
only_start_date
+ """
DURATION:P2D DURATION:P2D
""" """
datetime_utc_val = uid + """ )
datetime_utc_val = (
uid
+ """
DTSTART;VALUE=DATE-TIME:20180319T092001Z DTSTART;VALUE=DATE-TIME:20180319T092001Z
DTEND:20180321T102501Z DTEND:20180321T102501Z
""" """
datetime_utc_duration = uid + """ )
datetime_utc_duration = (
uid
+ """
DTSTART;VALUE=DATE-TIME:20180319T092001Z DTSTART;VALUE=DATE-TIME:20180319T092001Z
DURATION:P2DT1H5M DURATION:P2DT1H5M
""" """
created_updated = date_val + """ )
created_updated = (
date_val
+ """
CREATED:20180320T071155Z CREATED:20180320T071155Z
LAST-MODIFIED:20180326T120235Z LAST-MODIFIED:20180326T120235Z
""" """
)
def ics_test_cal(content: str) -> str: def ics_test_cal(content: str) -> str:
@@ -36,60 +57,90 @@ def ics_test_event(content: str) -> str:
return ics_test_cal("BEGIN:VEVENT\r\n{}END:VEVENT\r\n".format(content)) return ics_test_cal("BEGIN:VEVENT\r\n{}END:VEVENT\r\n".format(content))
def test_empty_calendar(): def test_empty_calendar() -> None:
converter = CalendarConverter() converter = CalendarConverter()
converter.loads(ics_test_cal("")) converter.loads(ics_test_cal(""))
evnts = converter.events_to_gcal() evnts = converter.events_to_gcal()
assert evnts == [] assert evnts == []
def test_empty_event(): def test_empty_event() -> None:
converter = CalendarConverter() converter = CalendarConverter()
converter.loads(ics_test_event("")) converter.loads(ics_test_event(""))
with pytest.raises(KeyError): with pytest.raises(KeyError):
converter.events_to_gcal() converter.events_to_gcal()
def test_event_no_end(): def test_event_no_end() -> None:
converter = CalendarConverter() converter = CalendarConverter()
converter.loads(ics_test_event(only_start_date)) converter.loads(ics_test_event(only_start_date))
with pytest.raises(ValueError): with pytest.raises(ValueError):
converter.events_to_gcal() converter.events_to_gcal()
@pytest.fixture(params=[ @pytest.fixture(
("date", ics_test_event(date_val), '2018-02-15', '2018-02-17'), params=[
("date", ics_test_event(date_duration), '2018-02-15', '2018-02-17'), ("date", ics_test_event(date_val), "2018-02-15", "2018-02-17"),
("dateTime", ics_test_event(datetime_utc_val), ("date", ics_test_event(date_duration), "2018-02-15", "2018-02-17"),
'2018-03-19T09:20:01.000001Z', '2018-03-21T10:25:01.000001Z'), (
("dateTime", ics_test_event(datetime_utc_duration), '2018-03-19T09:20:01.000001Z', '2018-03-21T10:25:01.000001Z')], "dateTime",
ids=['date values', 'date duration', ics_test_event(datetime_utc_val),
'datetime utc values', 'datetime utc duration'] "2018-03-19T09:20:01.000001Z",
"2018-03-21T10:25:01.000001Z",
),
(
"dateTime",
ics_test_event(datetime_utc_duration),
"2018-03-19T09:20:01.000001Z",
"2018-03-21T10:25:01.000001Z",
),
],
ids=[
"date values",
"date duration",
"datetime utc values",
"datetime utc duration",
],
) )
def param_events_start_end(request): def param_events_start_end(request: Any) -> Any:
return request.param return request.param
def test_event_start_end(param_events_start_end: Tuple[str, str, str, str]): def test_event_start_end(param_events_start_end: Tuple[str, str, str, str]) -> None:
(date_type, ics_str, start, end) = param_events_start_end (date_type, ics_str, start, end) = param_events_start_end
converter = CalendarConverter() converter = CalendarConverter()
converter.loads(ics_str) converter.loads(ics_str)
events = converter.events_to_gcal() events = converter.events_to_gcal()
assert len(events) == 1 assert len(events) == 1
event = events[0] event = events[0]
assert event['start'] == { assert event["start"] == {date_type: start}
date_type: start assert event["end"] == {date_type: end}
}
assert event['end'] == {
date_type: end
}
def test_event_created_updated(): def test_event_created_updated() -> None:
converter = CalendarConverter() converter = CalendarConverter()
converter.loads(ics_test_event(created_updated)) converter.loads(ics_test_event(created_updated))
events = converter.events_to_gcal() events = converter.events_to_gcal()
assert len(events) == 1 assert len(events) == 1
event = events[0] event = events[0]
assert event['created'] == '2018-03-20T07:11:55.000001Z' assert event["created"] == "2018-03-20T07:11:55.000001Z"
assert event['updated'] == '2018-03-26T12:02:35.000001Z' assert event["updated"] == "2018-03-26T12:02:35.000001Z"
@pytest.mark.parametrize(
"value,expected_str",
[
(
datetime.datetime(2022, 6, 3, 13, 52, 15, 1, utc),
"2022-06-03T13:52:15.000001Z",
),
(
datetime.datetime(2022, 6, 3, 13, 52, 15, 1, timezone("Europe/Moscow")),
"2022-06-03T11:22:15.000001Z",
),
(datetime.date(2022, 6, 3), "2022-06-03T00:00:00.000001Z"),
],
ids=["utc", "with timezone", "date"],
)
def test_format_datetime_utc(value: datetime.datetime, expected_str: str) -> None:
assert format_datetime_utc(value) == expected_str

View File

@@ -3,95 +3,97 @@ import hashlib
import operator import operator
from copy import deepcopy from copy import deepcopy
from random import shuffle from random import shuffle
from typing import Union, List, Dict, Optional from typing import Union, List, Dict, Optional, AnyStr
import dateutil.parser import dateutil.parser
import pytest import pytest
from pytz import timezone, utc from pytz import timezone, utc
from sync_ics2gcal import CalendarSync from sync_ics2gcal import CalendarSync, DateDateTime
from sync_ics2gcal.gcal import EventDateOrDateTime, EventData, EventList
def sha1(string: Union[str, bytes]) -> str: def sha1(s: AnyStr) -> str:
if isinstance(string, str):
string = string.encode('utf8')
h = hashlib.sha1() h = hashlib.sha1()
h.update(string) h.update(str(s).encode("utf8") if isinstance(s, str) else s)
return h.hexdigest() return h.hexdigest()
def gen_events(start: int, def gen_events(
stop: int, start: int,
start_time: Union[datetime.datetime, datetime.date], stop: int,
no_time: bool = False) -> List[Dict[str, Union[str, Dict[str, str]]]]: start_time: DateDateTime,
no_time: bool = False,
) -> EventList:
duration: datetime.timedelta
date_key: str
date_end: str
if no_time: if no_time:
start_time = datetime.date( start_time = datetime.date(start_time.year, start_time.month, start_time.day)
start_time.year, start_time.month, start_time.day) duration = datetime.date(1, 1, 2) - datetime.date(1, 1, 1)
duration: datetime.timedelta = datetime.date(1, 1, 2) - datetime.date(1, 1, 1) date_key = "date"
date_key: str = "date" date_end = ""
date_end: str = ''
else: else:
start_time = utc.normalize( start_time = utc.normalize(start_time.astimezone(utc)).replace(tzinfo=None) # type: ignore
start_time.astimezone(utc)).replace(tzinfo=None) duration = datetime.datetime(1, 1, 1, 2) - datetime.datetime(1, 1, 1, 1)
duration: datetime.timedelta = datetime.datetime(1, 1, 1, 2) - datetime.datetime(1, 1, 1, 1) date_key = "dateTime"
date_key: str = "dateTime" date_end = "Z"
date_end: str = 'Z'
result: List[Dict[str, Union[str, Dict[str, str]]]] = [] result: EventList = []
for i in range(start, stop): for i in range(start, stop):
event_start = start_time + (duration * i) event_start = start_time + (duration * i)
event_end = event_start + duration event_end = event_start + duration
updated: Union[datetime.datetime, datetime.date] = event_start updated: DateDateTime = event_start
if no_time: if no_time:
updated = datetime.datetime( updated = datetime.datetime(
updated.year, updated.month, updated.day, 0, 0, 0, 1, tzinfo=utc) updated.year, updated.month, updated.day, 0, 0, 0, 1, tzinfo=utc
)
event: Dict[str, Union[str, Dict[str, str]]] = { event: EventData = {
'summary': 'test event __ {}'.format(i), "summary": "test event __ {}".format(i),
'location': 'la la la {}'.format(i), "location": "la la la {}".format(i),
'description': 'test TEST -- test event {}'.format(i), "description": "test TEST -- test event {}".format(i),
"iCalUID": "{}@test.com".format(sha1("test - event {}".format(i))), "iCalUID": "{}@test.com".format(sha1("test - event {}".format(i))),
"updated": updated.isoformat() + 'Z', "updated": updated.isoformat() + "Z",
"created": updated.isoformat() + 'Z', "created": updated.isoformat() + "Z",
'start': {date_key: event_start.isoformat() + date_end}, "start": {date_key: event_start.isoformat() + date_end}, # type: ignore
'end': {date_key: event_end.isoformat() + date_end} "end": {date_key: event_end.isoformat() + date_end}, # type: ignore
} }
result.append(event) result.append(event)
return result return result
def gen_list_to_compare(start: int, stop: int) -> List[Dict[str, str]]: def gen_list_to_compare(start: int, stop: int) -> EventList:
result: List[Dict[str, str]] = [] result: EventList = []
for i in range(start, stop): for i in range(start, stop):
result.append({'iCalUID': 'test{:06d}'.format(i)}) result.append({"iCalUID": "test{:06d}".format(i)})
return result return result
def get_start_date(event: Dict[str, Union[str, Dict[str, str]]]) -> Union[datetime.datetime, datetime.date]: def get_start_date(event: EventData) -> DateDateTime:
event_start: Dict[str, str] = event['start'] event_start: EventDateOrDateTime = event["start"]
start_date: Optional[str] = None start_date: Optional[str] = None
is_date = False is_date = False
if 'date' in event_start: if "date" in event_start:
start_date = event_start['date'] start_date = event_start["date"] # type: ignore
is_date = True is_date = True
if 'dateTime' in event_start: if "dateTime" in event_start:
start_date = event_start['dateTime'] start_date = event_start["dateTime"] # type: ignore
result = dateutil.parser.parse(start_date) result: DateDateTime = dateutil.parser.parse(str(start_date))
if is_date: if is_date:
result = datetime.date(result.year, result.month, result.day) result = datetime.date(result.year, result.month, result.day)
return result return result
def test_compare(): def test_compare() -> None:
part_len = 20 part_len: int = 20
# [1..2n] # [1..2n]
lst_src = gen_list_to_compare(1, 1 + part_len * 2) lst_src = gen_list_to_compare(1, 1 + part_len * 2)
# [n..3n] # [n..3n]
lst_dst = gen_list_to_compare( lst_dst = gen_list_to_compare(1 + part_len, 1 + part_len * 3)
1 + part_len, 1 + part_len * 3)
lst_src_rnd = deepcopy(lst_src) lst_src_rnd = deepcopy(lst_src)
lst_dst_rnd = deepcopy(lst_dst) lst_dst_rnd = deepcopy(lst_dst)
@@ -99,15 +101,14 @@ def test_compare():
shuffle(lst_src_rnd) shuffle(lst_src_rnd)
shuffle(lst_dst_rnd) shuffle(lst_dst_rnd)
to_ins, to_upd, to_del = CalendarSync._events_list_compare( to_ins, to_upd, to_del = CalendarSync._events_list_compare(lst_src_rnd, lst_dst_rnd)
lst_src_rnd, lst_dst_rnd)
assert len(to_ins) == part_len assert len(to_ins) == part_len
assert len(to_upd) == part_len assert len(to_upd) == part_len
assert len(to_del) == part_len assert len(to_del) == part_len
assert sorted(to_ins, key=lambda x: x['iCalUID']) == lst_src[:part_len] assert sorted(to_ins, key=lambda x: x["iCalUID"]) == lst_src[:part_len]
assert sorted(to_del, key=lambda x: x['iCalUID']) == lst_dst[part_len:] assert sorted(to_del, key=lambda x: x["iCalUID"]) == lst_dst[part_len:]
to_upd_ok = list(zip(lst_src[part_len:], lst_dst[:part_len])) to_upd_ok = list(zip(lst_src[part_len:], lst_dst[:part_len]))
assert len(to_upd) == len(to_upd_ok) assert len(to_upd) == len(to_upd_ok)
@@ -115,35 +116,29 @@ def test_compare():
assert item in to_upd assert item in to_upd
@pytest.mark.parametrize("no_time", [True, False], ids=['date', 'dateTime']) @pytest.mark.parametrize("no_time", [True, False], ids=["date", "dateTime"])
def test_filter_events_by_date(no_time: bool): def test_filter_events_by_date(no_time: bool) -> None:
msk = timezone('Europe/Moscow') msk = timezone("Europe/Moscow")
now = utc.localize(datetime.datetime.utcnow()) now = utc.localize(datetime.datetime.utcnow())
msk_now = msk.normalize(now.astimezone(msk)) msk_now = msk.normalize(now.astimezone(msk))
part_len = 5 part_len = 5
if no_time: if no_time:
duration = datetime.date( duration = datetime.date(1, 1, 2) - datetime.date(1, 1, 1)
1, 1, 2) - datetime.date(1, 1, 1)
else: else:
duration = datetime.datetime( duration = datetime.datetime(1, 1, 1, 2) - datetime.datetime(1, 1, 1, 1)
1, 1, 1, 2) - datetime.datetime(1, 1, 1, 1)
date_cmp = msk_now + (duration * part_len) date_cmp: DateDateTime = msk_now + (duration * part_len)
if no_time: if no_time:
date_cmp = datetime.date( date_cmp = datetime.date(date_cmp.year, date_cmp.month, date_cmp.day)
date_cmp.year, date_cmp.month, date_cmp.day)
events = gen_events( events = gen_events(1, 1 + (part_len * 2), msk_now, no_time)
1, 1 + (part_len * 2), msk_now, no_time)
shuffle(events) shuffle(events)
events_pending = CalendarSync._filter_events_by_date( events_pending = CalendarSync._filter_events_by_date(events, date_cmp, operator.ge)
events, date_cmp, operator.ge) events_past = CalendarSync._filter_events_by_date(events, date_cmp, operator.lt)
events_past = CalendarSync._filter_events_by_date(
events, date_cmp, operator.lt)
assert len(events_pending) == 1 + part_len assert len(events_pending) == 1 + part_len
assert len(events_past) == part_len - 1 assert len(events_past) == part_len - 1
@@ -155,26 +150,52 @@ def test_filter_events_by_date(no_time: bool):
assert get_start_date(event) < date_cmp assert get_start_date(event) < date_cmp
def test_filter_events_to_update(): def test_filter_events_to_update() -> None:
msk = timezone('Europe/Moscow') msk = timezone("Europe/Moscow")
now = utc.localize(datetime.datetime.utcnow()) now = utc.localize(datetime.datetime.utcnow())
msk_now = msk.normalize(now.astimezone(msk)) msk_now = msk.normalize(now.astimezone(msk))
one_hour = datetime.datetime( one_hour = datetime.datetime(1, 1, 1, 2) - datetime.datetime(1, 1, 1, 1)
1, 1, 1, 2) - datetime.datetime(1, 1, 1, 1)
date_upd = msk_now + (one_hour * 5) date_upd = msk_now + (one_hour * 5)
count = 10 count = 10
events_old = gen_events(1, 1 + count, msk_now) events_old = gen_events(1, 1 + count, msk_now)
events_new = gen_events(1, 1 + count, date_upd) events_new = gen_events(1, 1 + count, date_upd)
sync1 = CalendarSync(None, None) sync1 = CalendarSync(None, None) # type: ignore
sync1.to_update = list(zip(events_new, events_old)) sync1.to_update = list(zip(events_new, events_old))
sync1._filter_events_to_update() sync1._filter_events_to_update()
sync2 = CalendarSync(None, None) sync2 = CalendarSync(None, None) # type: ignore
sync2.to_update = list(zip(events_old, events_new)) sync2.to_update = list(zip(events_old, events_new))
sync2._filter_events_to_update() sync2._filter_events_to_update()
assert len(sync1.to_update) == count assert len(sync1.to_update) == count
assert sync2.to_update == [] assert sync2.to_update == []
def test_filter_events_no_updated() -> None:
"""
test filtering events that not have 'updated' field
such events should always pass the filter
"""
now = datetime.datetime.utcnow()
yesterday = now - datetime.timedelta(days=-1)
count = 10
events_old = gen_events(1, 1 + count, now)
events_new = gen_events(1, 1 + count, now)
# 1/2 updated=yesterday, 1/2 no updated field
i = 0
for event in events_new:
if 0 == i % 2:
event["updated"] = yesterday.isoformat() + "Z"
else:
del event["updated"]
i += 1
sync = CalendarSync(None, None) # type: ignore
sync.to_update = list(zip(events_old, events_new))
sync._filter_events_to_update()
assert len(sync.to_update) == count // 2