From 217b8cce8a00ec1429a16bc4242c0f4a91e47b68 Mon Sep 17 00:00:00 2001 From: Martin Eigenmann Date: Thu, 11 Nov 2021 23:33:01 +0100 Subject: [PATCH 1/9] install-with-pipenv --- Pipfile | 21 +++ Pipfile.lock | 432 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 453 insertions(+) create mode 100644 Pipfile create mode 100644 Pipfile.lock diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..2d9943e --- /dev/null +++ b/Pipfile @@ -0,0 +1,21 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +httplib2 = "==0.20.1" +icalendar = "==4.0.9" +python-dateutil = "==2.8.2" +pytz = "==2021.3" +DateTime = "==4.3" + +[dev-packages] +coverage = "==6.0.1" +codecov = "==2.1.12" +pytest = "==6.2.5" +black = "===21.9b0" +flake8 = "===3.7.9" + +[requires] +python_version = "3.9" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..6486f81 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,432 @@ +{ + "_meta": { + "hash": { + "sha256": "510a903800edf66ea6bc20e2dcde2e6f75f14713cc0566fb0f7b10dc7fe02f8b" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "datetime": { + "hashes": [ + "sha256:371dba07417b929a4fa685c2f7a3eaa6a62d60c02947831f97d4df9a9e70dfd0", + "sha256:5cef605bab8259ff61281762cdf3290e459fbf0b4719951d5fab967d5f2ea0ea" + ], + "index": "pypi", + "version": "==4.3" + }, + "httplib2": { + "hashes": [ + "sha256:0efbcb8bfbfbc11578130d87d8afcc65c2274c6eb446e59fc674e4d7c972d327", + "sha256:8fa4dbf2fbf839b71f8c7837a831e00fcdc860feca99b8bda58ceae4bc53d185" + ], + "index": "pypi", + "version": "==0.20.1" + }, + "icalendar": { + "hashes": [ + "sha256:cc73fa9c848744843046228cb66ea86cd8c18d73a51b140f7c003f760b84a997", + "sha256:cf1446ffdf1b6ad469451a8966cfa7694f5fac796ac6fc7cd93e28c51a637d2c" + ], + "index": "pypi", + "version": "==4.0.9" + }, + "pyparsing": { + "hashes": [ + "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", + "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" + ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.4.7" + }, + "python-dateutil": { + "hashes": [ + "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", + "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + ], + "index": "pypi", + "version": "==2.8.2" + }, + "pytz": { + "hashes": [ + "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c", + "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326" + ], + "index": "pypi", + "version": "==2021.3" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "zope.interface": { + "hashes": [ + "sha256:08f9636e99a9d5410181ba0729e0408d3d8748026ea938f3b970a0249daa8192", + "sha256:0b465ae0962d49c68aa9733ba92a001b2a0933c317780435f00be7ecb959c702", + "sha256:0cba8477e300d64a11a9789ed40ee8932b59f9ee05f85276dbb4b59acee5dd09", + "sha256:0cee5187b60ed26d56eb2960136288ce91bcf61e2a9405660d271d1f122a69a4", + "sha256:0ea1d73b7c9dcbc5080bb8aaffb776f1c68e807767069b9ccdd06f27a161914a", + "sha256:0f91b5b948686659a8e28b728ff5e74b1be6bf40cb04704453617e5f1e945ef3", + "sha256:15e7d1f7a6ee16572e21e3576d2012b2778cbacf75eb4b7400be37455f5ca8bf", + "sha256:17776ecd3a1fdd2b2cd5373e5ef8b307162f581c693575ec62e7c5399d80794c", + "sha256:194d0bcb1374ac3e1e023961610dc8f2c78a0f5f634d0c737691e215569e640d", + "sha256:1c0e316c9add0db48a5b703833881351444398b04111188069a26a61cfb4df78", + "sha256:205e40ccde0f37496904572035deea747390a8b7dc65146d30b96e2dd1359a83", + "sha256:273f158fabc5ea33cbc936da0ab3d4ba80ede5351babc4f577d768e057651531", + "sha256:2876246527c91e101184f63ccd1d716ec9c46519cc5f3d5375a3351c46467c46", + "sha256:2c98384b254b37ce50eddd55db8d381a5c53b4c10ee66e1e7fe749824f894021", + "sha256:2e5a26f16503be6c826abca904e45f1a44ff275fdb7e9d1b75c10671c26f8b94", + "sha256:334701327f37c47fa628fc8b8d28c7d7730ce7daaf4bda1efb741679c2b087fc", + "sha256:3748fac0d0f6a304e674955ab1365d515993b3a0a865e16a11ec9d86fb307f63", + "sha256:3c02411a3b62668200910090a0dff17c0b25aaa36145082a5a6adf08fa281e54", + "sha256:3dd4952748521205697bc2802e4afac5ed4b02909bb799ba1fe239f77fd4e117", + "sha256:3f24df7124c323fceb53ff6168da70dbfbae1442b4f3da439cd441681f54fe25", + "sha256:469e2407e0fe9880ac690a3666f03eb4c3c444411a5a5fddfdabc5d184a79f05", + "sha256:4de4bc9b6d35c5af65b454d3e9bc98c50eb3960d5a3762c9438df57427134b8e", + "sha256:5208ebd5152e040640518a77827bdfcc73773a15a33d6644015b763b9c9febc1", + "sha256:52de7fc6c21b419078008f697fd4103dbc763288b1406b4562554bd47514c004", + "sha256:5bb3489b4558e49ad2c5118137cfeaf59434f9737fa9c5deefc72d22c23822e2", + "sha256:5dba5f530fec3f0988d83b78cc591b58c0b6eb8431a85edd1569a0539a8a5a0e", + "sha256:5dd9ca406499444f4c8299f803d4a14edf7890ecc595c8b1c7115c2342cadc5f", + "sha256:5f931a1c21dfa7a9c573ec1f50a31135ccce84e32507c54e1ea404894c5eb96f", + "sha256:63b82bb63de7c821428d513607e84c6d97d58afd1fe2eb645030bdc185440120", + "sha256:66c0061c91b3b9cf542131148ef7ecbecb2690d48d1612ec386de9d36766058f", + "sha256:6f0c02cbb9691b7c91d5009108f975f8ffeab5dff8f26d62e21c493060eff2a1", + "sha256:71aace0c42d53abe6fc7f726c5d3b60d90f3c5c055a447950ad6ea9cec2e37d9", + "sha256:7d97a4306898b05404a0dcdc32d9709b7d8832c0c542b861d9a826301719794e", + "sha256:7df1e1c05304f26faa49fa752a8c690126cf98b40b91d54e6e9cc3b7d6ffe8b7", + "sha256:8270252effc60b9642b423189a2fe90eb6b59e87cbee54549db3f5562ff8d1b8", + "sha256:867a5ad16892bf20e6c4ea2aab1971f45645ff3102ad29bd84c86027fa99997b", + "sha256:877473e675fdcc113c138813a5dd440da0769a2d81f4d86614e5d62b69497155", + "sha256:8892f89999ffd992208754851e5a052f6b5db70a1e3f7d54b17c5211e37a98c7", + "sha256:9a9845c4c6bb56e508651f005c4aeb0404e518c6f000d5a1123ab077ab769f5c", + "sha256:a1e6e96217a0f72e2b8629e271e1b280c6fa3fe6e59fa8f6701bec14e3354325", + "sha256:a8156e6a7f5e2a0ff0c5b21d6bcb45145efece1909efcbbbf48c56f8da68221d", + "sha256:a9506a7e80bcf6eacfff7f804c0ad5350c8c95b9010e4356a4b36f5322f09abb", + "sha256:af310ec8335016b5e52cae60cda4a4f2a60a788cbb949a4fbea13d441aa5a09e", + "sha256:b0297b1e05fd128d26cc2460c810d42e205d16d76799526dfa8c8ccd50e74959", + "sha256:bf68f4b2b6683e52bec69273562df15af352e5ed25d1b6641e7efddc5951d1a7", + "sha256:d0c1bc2fa9a7285719e5678584f6b92572a5b639d0e471bb8d4b650a1a910920", + "sha256:d4d9d6c1a455d4babd320203b918ccc7fcbefe308615c521062bc2ba1aa4d26e", + "sha256:db1fa631737dab9fa0b37f3979d8d2631e348c3b4e8325d6873c2541d0ae5a48", + "sha256:dd93ea5c0c7f3e25335ab7d22a507b1dc43976e1345508f845efc573d3d779d8", + "sha256:f44e517131a98f7a76696a7b21b164bcb85291cee106a23beccce454e1f433a4", + "sha256:f7ee479e96f7ee350db1cf24afa5685a5899e2b34992fb99e1f7c1b0b758d263" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==5.4.0" + } + }, + "develop": { + "attrs": { + "hashes": [ + "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1", + "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==21.2.0" + }, + "black": { + "hashes": [ + "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115", + "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91" + ], + "index": "pypi", + "version": "===21.9b0" + }, + "certifi": { + "hashes": [ + "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872", + "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569" + ], + "version": "==2021.10.8" + }, + "charset-normalizer": { + "hashes": [ + "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0", + "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b" + ], + "markers": "python_version >= '3'", + "version": "==2.0.7" + }, + "click": { + "hashes": [ + "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3", + "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b" + ], + "markers": "python_version >= '3.6'", + "version": "==8.0.3" + }, + "codecov": { + "hashes": [ + "sha256:585dc217dc3d8185198ceb402f85d5cb5dbfa0c5f350a5abcdf9e347776a5b47", + "sha256:782a8e5352f22593cbc5427a35320b99490eb24d9dcfa2155fd99d2b75cfb635", + "sha256:a0da46bb5025426da895af90938def8ee12d37fcbcbbbc15b6dc64cf7ebc51c1" + ], + "index": "pypi", + "version": "==2.1.12" + }, + "coverage": { + "hashes": [ + "sha256:07efe1fbd72e67df026ad5109bcd216acbbd4a29d5208b3dab61779bae6b7b26", + "sha256:0898d6948b31df13391cd40568de8f35fa5901bc922c5ae05cf070587cb9c666", + "sha256:0a7e55cc9f7efa22d5cc9966276ec7a40a8803676f6ccbfdc06a486fba9aa9ee", + "sha256:17426808e8e0824f864876312d41961223bf5e503bf8f1f846735279a60ea345", + "sha256:1770d24f45f1f2daeae34cfa3b33fcb29702153544cd2ad40d58399dd4ff53b5", + "sha256:1864bdf9b2ccb43e724051bc23a1c558daf101ad4488ede1945f2a8be1facdad", + "sha256:2c5f39d1556e75fc3c4fb071f9e7cfa618895a999a0de763a541d730775d0d5f", + "sha256:3490ff6dbf3f7accf0750136ed60ae1f487bccc1f097740e3b21262bc9c89854", + "sha256:353a50f123f0185cdb7a1e1e3e2cfb9d1fd7e293cfaf68eedaf5bd8e02e3ec32", + "sha256:3edbb3ec580c73e5a264f5d04f30245bc98eff1a26765d46c5c65134f0a0e2f7", + "sha256:4eb9cd910ca8e243f930243a9940ea1a522e32435d15668445753d087c30ee12", + "sha256:5b06f4f1729e2963281d9cd6e65e6976bf27b44d4c07ac5b47223ce45f822cec", + "sha256:5b1ceacb86e0a9558061dcc6baae865ed25933ea57effea644f21657cdce19bc", + "sha256:65da6e3e8325291f012921bbf71fea0a97824e1c573981871096aac6e2cf0ec5", + "sha256:66fe33e9e0df58675e08e83fe257f89e7f625e7633ea93d0872154e09cce2724", + "sha256:6873f3f954d3e3ab8b1881f4e5307cc19f70c9f931c41048d9f7e6fd946eabe7", + "sha256:73880a80fad0597eca43e213e5e1711bf6c0fcdb7eb6b01b3b17841ebe5a7f8d", + "sha256:7600fac458f74c68b097379f76f3a6e3a630493fc7fc94b6508fedd9d498c194", + "sha256:83682b73785d2e078e0b5f63410b8125b122e1a22422640c57edd4011c950f3e", + "sha256:83faa3692e8306b20293889714fdf573d10ef5efc5843bd7c7aea6971487bd6a", + "sha256:9c416ba03844608f45661a5b48dc59c6b5e89956efe388564dd138ca8caf540b", + "sha256:9d242a2434801ef5125330deddb4cddba8990c9a49b3dec99dca17dd7eefba5a", + "sha256:a2e15ab5afbee34abf716fece80ea33ea09a82e7450512f022723b1a82ec9a4e", + "sha256:abe8207dfb8a61ded9cd830d26c1073c8218fc0ae17eb899cfe8ec0fafae6e22", + "sha256:ad7182a82843f9f85487f44567c8c688f16c906bdb8d0e44ae462aed61cb8f1b", + "sha256:b45f89a8ef65c29195f8f28dbe215f44ccb29d934f3e862d2a5c12e38698a793", + "sha256:b81a4e667c45b13658b84f9b8f1d32ef86d5405fabcbd181b76b9e51d295f397", + "sha256:c9c413c4397d4cdc7ca89286158d240ce524f9667b52c9a64dd7e13d16cf8815", + "sha256:e11cca9eb5c9b3eaad899728ee2ce916138399ee8cbbccaadc1871fecb750827", + "sha256:e66c50f0ab445fec920a9f084914ea1776a809e3016c3738519048195f851bbb", + "sha256:ea452a2d83964d08232ade470091015e7ab9b8f53acbec10f2210fbab4ce7e43", + "sha256:f398d38e6ebc2637863db1d7be3d4f9c5174e7d24bb3b0716cdb1f204669cbcf", + "sha256:f82a17f2a77958f3eef40ad385fc82d4c6ba9a77a51a174efe03ce75daebbc16" + ], + "index": "pypi", + "version": "==6.0.1" + }, + "entrypoints": { + "hashes": [ + "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19", + "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451" + ], + "markers": "python_version >= '2.7'", + "version": "==0.3" + }, + "flake8": { + "hashes": [ + "sha256:45681a117ecc81e870cbf1262835ae4af5e7a8b08e40b944a8a6e6b895914cfb", + "sha256:49356e766643ad15072a789a20915d3c91dc89fd313ccd71802303fd67e4deca" + ], + "index": "pypi", + "version": "===3.7.9" + }, + "idna": { + "hashes": [ + "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff", + "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d" + ], + "markers": "python_version >= '3'", + "version": "==3.3" + }, + "iniconfig": { + "hashes": [ + "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", + "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32" + ], + "version": "==1.1.1" + }, + "mccabe": { + "hashes": [ + "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", + "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" + ], + "version": "==0.6.1" + }, + "mypy-extensions": { + "hashes": [ + "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d", + "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8" + ], + "version": "==0.4.3" + }, + "packaging": { + "hashes": [ + "sha256:096d689d78ca690e4cd8a89568ba06d07ca097e3306a4381635073ca91479966", + "sha256:14317396d1e8cdb122989b916fa2c7e9ca8e2be9e8060a6eff75b6b7b4d8a7e0" + ], + "markers": "python_version >= '3.6'", + "version": "==21.2" + }, + "pathspec": { + "hashes": [ + "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a", + "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1" + ], + "version": "==0.9.0" + }, + "platformdirs": { + "hashes": [ + "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2", + "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d" + ], + "markers": "python_version >= '3.6'", + "version": "==2.4.0" + }, + "pluggy": { + "hashes": [ + "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", + "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" + ], + "markers": "python_version >= '3.6'", + "version": "==1.0.0" + }, + "py": { + "hashes": [ + "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", + "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==1.11.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56", + "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.5.0" + }, + "pyflakes": { + "hashes": [ + "sha256:17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0", + "sha256:d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.1.1" + }, + "pyparsing": { + "hashes": [ + "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", + "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" + ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.4.7" + }, + "pytest": { + "hashes": [ + "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89", + "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134" + ], + "index": "pypi", + "version": "==6.2.5" + }, + "regex": { + "hashes": [ + "sha256:05b7d6d7e64efe309972adab77fc2af8907bb93217ec60aa9fe12a0dad35874f", + "sha256:0617383e2fe465732af4509e61648b77cbe3aee68b6ac8c0b6fe934db90be5cc", + "sha256:07856afef5ffcc052e7eccf3213317fbb94e4a5cd8177a2caa69c980657b3cb4", + "sha256:162abfd74e88001d20cb73ceaffbfe601469923e875caf9118333b1a4aaafdc4", + "sha256:2207ae4f64ad3af399e2d30dde66f0b36ae5c3129b52885f1bffc2f05ec505c8", + "sha256:30ab804ea73972049b7a2a5c62d97687d69b5a60a67adca07eb73a0ddbc9e29f", + "sha256:3b5df18db1fccd66de15aa59c41e4f853b5df7550723d26aa6cb7f40e5d9da5a", + "sha256:3c5fb32cc6077abad3bbf0323067636d93307c9fa93e072771cf9a64d1c0f3ef", + "sha256:416c5f1a188c91e3eb41e9c8787288e707f7d2ebe66e0a6563af280d9b68478f", + "sha256:432bd15d40ed835a51617521d60d0125867f7b88acf653e4ed994a1f8e4995dc", + "sha256:4aaa4e0705ef2b73dd8e36eeb4c868f80f8393f5f4d855e94025ce7ad8525f50", + "sha256:537ca6a3586931b16a85ac38c08cc48f10fc870a5b25e51794c74df843e9966d", + "sha256:53db2c6be8a2710b359bfd3d3aa17ba38f8aa72a82309a12ae99d3c0c3dcd74d", + "sha256:5537f71b6d646f7f5f340562ec4c77b6e1c915f8baae822ea0b7e46c1f09b733", + "sha256:6650f16365f1924d6014d2ea770bde8555b4a39dc9576abb95e3cd1ff0263b36", + "sha256:666abff54e474d28ff42756d94544cdfd42e2ee97065857413b72e8a2d6a6345", + "sha256:68a067c11463de2a37157930d8b153005085e42bcb7ad9ca562d77ba7d1404e0", + "sha256:780b48456a0f0ba4d390e8b5f7c661fdd218934388cde1a974010a965e200e12", + "sha256:788aef3549f1924d5c38263104dae7395bf020a42776d5ec5ea2b0d3d85d6646", + "sha256:7ee1227cf08b6716c85504aebc49ac827eb88fcc6e51564f010f11a406c0a667", + "sha256:7f301b11b9d214f83ddaf689181051e7f48905568b0c7017c04c06dfd065e244", + "sha256:83ee89483672b11f8952b158640d0c0ff02dc43d9cb1b70c1564b49abe92ce29", + "sha256:85bfa6a5413be0ee6c5c4a663668a2cad2cbecdee367630d097d7823041bdeec", + "sha256:9345b6f7ee578bad8e475129ed40123d265464c4cfead6c261fd60fc9de00bcf", + "sha256:93a5051fcf5fad72de73b96f07d30bc29665697fb8ecdfbc474f3452c78adcf4", + "sha256:962b9a917dd7ceacbe5cd424556914cb0d636001e393b43dc886ba31d2a1e449", + "sha256:98ba568e8ae26beb726aeea2273053c717641933836568c2a0278a84987b2a1a", + "sha256:a3feefd5e95871872673b08636f96b61ebef62971eab044f5124fb4dea39919d", + "sha256:b43c2b8a330a490daaef5a47ab114935002b13b3f9dc5da56d5322ff218eeadb", + "sha256:b483c9d00a565633c87abd0aaf27eb5016de23fed952e054ecc19ce32f6a9e7e", + "sha256:ba05430e819e58544e840a68b03b28b6d328aff2e41579037e8bab7653b37d83", + "sha256:ca5f18a75e1256ce07494e245cdb146f5a9267d3c702ebf9b65c7f8bd843431e", + "sha256:d5ca078bb666c4a9d1287a379fe617a6dccd18c3e8a7e6c7e1eb8974330c626a", + "sha256:da1a90c1ddb7531b1d5ff1e171b4ee61f6345119be7351104b67ff413843fe94", + "sha256:dba70f30fd81f8ce6d32ddeef37d91c8948e5d5a4c63242d16a2b2df8143aafc", + "sha256:dd33eb9bdcfbabab3459c9ee651d94c842bc8a05fabc95edf4ee0c15a072495e", + "sha256:e0538c43565ee6e703d3a7c3bdfe4037a5209250e8502c98f20fea6f5fdf2965", + "sha256:e1f54b9b4b6c53369f40028d2dd07a8c374583417ee6ec0ea304e710a20f80a0", + "sha256:e32d2a2b02ccbef10145df9135751abea1f9f076e67a4e261b05f24b94219e36", + "sha256:e71255ba42567d34a13c03968736c5d39bb4a97ce98188fafb27ce981115beec", + "sha256:ed2e07c6a26ed4bea91b897ee2b0835c21716d9a469a96c3e878dc5f8c55bb23", + "sha256:eef2afb0fd1747f33f1ee3e209bce1ed582d1896b240ccc5e2697e3275f037c7", + "sha256:f23222527b307970e383433daec128d769ff778d9b29343fb3496472dc20dabe", + "sha256:f341ee2df0999bfdf7a95e448075effe0db212a59387de1a70690e4acb03d4c6", + "sha256:f7f325be2804246a75a4f45c72d4ce80d2443ab815063cdf70ee8fb2ca59ee1b", + "sha256:f8af619e3be812a2059b212064ea7a640aff0568d972cd1b9e920837469eb3cb", + "sha256:fa8c626d6441e2d04b6ee703ef2d1e17608ad44c7cb75258c09dd42bacdfc64b", + "sha256:fbb9dc00e39f3e6c0ef48edee202f9520dafb233e8b51b06b8428cfcb92abd30", + "sha256:fff55f3ce50a3ff63ec8e2a8d3dd924f1941b250b0aac3d3d42b687eeff07a8e" + ], + "version": "==2021.11.10" + }, + "requests": { + "hashes": [ + "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24", + "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==2.26.0" + }, + "toml": { + "hashes": [ + "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", + "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" + ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.10.2" + }, + "tomli": { + "hashes": [ + "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee", + "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade" + ], + "markers": "python_version >= '3.6'", + "version": "==1.2.2" + }, + "typing-extensions": { + "hashes": [ + "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e", + "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7", + "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34" + ], + "version": "==3.10.0.2" + }, + "urllib3": { + "hashes": [ + "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece", + "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", + "version": "==1.26.7" + } + } +} From beb25f134d4b3904432dce599ace01d72db90a42 Mon Sep 17 00:00:00 2001 From: Martin Eigenmann Date: Thu, 11 Nov 2021 23:36:05 +0100 Subject: [PATCH 2/9] remove poetry --- poetry.lock | 660 ------------------------------------------------- pyproject.toml | 26 -- setup.cfg | 2 - 3 files changed, 688 deletions(-) delete mode 100644 poetry.lock delete mode 100644 pyproject.toml delete mode 100644 setup.cfg diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index 71c0ac7..0000000 --- a/poetry.lock +++ /dev/null @@ -1,660 +0,0 @@ -[[package]] -name = "atomicwrites" -version = "1.4.0" -description = "Atomic file writes." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "attrs" -version = "21.2.0" -description = "Classes Without Boilerplate" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] - -[[package]] -name = "black" -version = "21.9b0" -description = "The uncompromising code formatter." -category = "dev" -optional = false -python-versions = ">=3.6.2" - -[package.dependencies] -click = ">=7.1.2" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0,<1" -platformdirs = ">=2" -regex = ">=2020.1.8" -tomli = ">=0.2.6,<2.0.0" -typing-extensions = [ - {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, - {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, -] - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -python2 = ["typed-ast (>=1.4.2)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "certifi" -version = "2021.10.8" -description = "Python package for providing Mozilla's CA Bundle." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "charset-normalizer" -version = "2.0.6" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "dev" -optional = false -python-versions = ">=3.5.0" - -[package.extras] -unicode_backport = ["unicodedata2"] - -[[package]] -name = "click" -version = "8.0.3" -description = "Composable command line interface toolkit" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "codecov" -version = "2.1.12" -description = "Hosted coverage reports for GitHub, Bitbucket and Gitlab" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -coverage = "*" -requests = ">=2.7.9" - -[[package]] -name = "colorama" -version = "0.4.4" -description = "Cross-platform colored terminal text." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "coverage" -version = "6.0.1" -description = "Code coverage measurement for Python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -toml = ["tomli"] - -[[package]] -name = "datetime" -version = "4.3" -description = "This package provides a DateTime data type, as known from Zope. Unless you need to communicate with Zope APIs, you're probably better off using Python's built-in datetime module." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -pytz = "*" -"zope.interface" = "*" - -[[package]] -name = "flake8" -version = "4.0.1" -description = "the modular source code checker: pep8 pyflakes and co" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.8.0,<2.9.0" -pyflakes = ">=2.4.0,<2.5.0" - -[[package]] -name = "httplib2" -version = "0.20.1" -description = "A comprehensive HTTP client library." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pyparsing = ">=2.4.2,<3" - -[[package]] -name = "icalendar" -version = "4.0.9" -description = "iCalendar parser/generator" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -python-dateutil = "*" -pytz = "*" - -[[package]] -name = "idna" -version = "3.2" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "mccabe" -version = "0.6.1" -description = "McCabe checker, plugin for flake8" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "packaging" -version = "21.0" -description = "Core utilities for Python packages" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2" - -[[package]] -name = "pathspec" -version = "0.9.0" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[[package]] -name = "platformdirs" -version = "2.4.0" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] - -[[package]] -name = "pluggy" -version = "1.0.0" -description = "plugin and hook calling mechanisms for python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "py" -version = "1.10.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pycodestyle" -version = "2.8.0" -description = "Python style guide checker" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "pyflakes" -version = "2.4.0" -description = "passive checker of Python programs" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "pytest" -version = "6.2.5" -description = "pytest: simple powerful testing with Python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=19.2.0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -toml = "*" - -[package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "pytz" -version = "2021.3" -description = "World timezone definitions, modern and historical" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "regex" -version = "2021.10.8" -description = "Alternative regular expression module, to replace re." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "requests" -version = "2.26.0" -description = "Python HTTP for Humans." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "tomli" -version = "1.2.1" -description = "A lil' TOML parser" -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "typing-extensions" -version = "3.10.0.2" -description = "Backported and Experimental Type Hints for Python 3.5+" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "urllib3" -version = "1.26.7" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -brotli = ["brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "zope.interface" -version = "5.4.0" -description = "Interfaces for Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.extras] -docs = ["sphinx", "repoze.sphinx.autointerface"] -test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] -testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] - -[metadata] -lock-version = "1.1" -python-versions = "^3.9" -content-hash = "4f19d83b34af680e41bde58b1ce2ac03265b32f390831545b81a07eb69cc0937" - -[metadata.files] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, - {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, -] -black = [ - {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"}, - {file = "black-21.9b0.tar.gz", hash = "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"}, -] -certifi = [ - {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, - {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.6.tar.gz", hash = "sha256:5ec46d183433dcbd0ab716f2d7f29d8dee50505b3fdb40c6b985c7c4f5a3591f"}, - {file = "charset_normalizer-2.0.6-py3-none-any.whl", hash = "sha256:5d209c0a931f215cee683b6445e2d77677e7e75e159f78def0db09d68fafcaa6"}, -] -click = [ - {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, - {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, -] -codecov = [ - {file = "codecov-2.1.12-py2.py3-none-any.whl", hash = "sha256:585dc217dc3d8185198ceb402f85d5cb5dbfa0c5f350a5abcdf9e347776a5b47"}, - {file = "codecov-2.1.12-py3.8.egg", hash = "sha256:782a8e5352f22593cbc5427a35320b99490eb24d9dcfa2155fd99d2b75cfb635"}, - {file = "codecov-2.1.12.tar.gz", hash = "sha256:a0da46bb5025426da895af90938def8ee12d37fcbcbbbc15b6dc64cf7ebc51c1"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -coverage = [ - {file = "coverage-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:abe8207dfb8a61ded9cd830d26c1073c8218fc0ae17eb899cfe8ec0fafae6e22"}, - {file = "coverage-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83faa3692e8306b20293889714fdf573d10ef5efc5843bd7c7aea6971487bd6a"}, - {file = "coverage-6.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f82a17f2a77958f3eef40ad385fc82d4c6ba9a77a51a174efe03ce75daebbc16"}, - {file = "coverage-6.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b06f4f1729e2963281d9cd6e65e6976bf27b44d4c07ac5b47223ce45f822cec"}, - {file = "coverage-6.0.1-cp310-cp310-win32.whl", hash = "sha256:7600fac458f74c68b097379f76f3a6e3a630493fc7fc94b6508fedd9d498c194"}, - {file = "coverage-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:2c5f39d1556e75fc3c4fb071f9e7cfa618895a999a0de763a541d730775d0d5f"}, - {file = "coverage-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3edbb3ec580c73e5a264f5d04f30245bc98eff1a26765d46c5c65134f0a0e2f7"}, - {file = "coverage-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea452a2d83964d08232ade470091015e7ab9b8f53acbec10f2210fbab4ce7e43"}, - {file = "coverage-6.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1770d24f45f1f2daeae34cfa3b33fcb29702153544cd2ad40d58399dd4ff53b5"}, - {file = "coverage-6.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ad7182a82843f9f85487f44567c8c688f16c906bdb8d0e44ae462aed61cb8f1b"}, - {file = "coverage-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:9d242a2434801ef5125330deddb4cddba8990c9a49b3dec99dca17dd7eefba5a"}, - {file = "coverage-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e66c50f0ab445fec920a9f084914ea1776a809e3016c3738519048195f851bbb"}, - {file = "coverage-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5b1ceacb86e0a9558061dcc6baae865ed25933ea57effea644f21657cdce19bc"}, - {file = "coverage-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e15ab5afbee34abf716fece80ea33ea09a82e7450512f022723b1a82ec9a4e"}, - {file = "coverage-6.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6873f3f954d3e3ab8b1881f4e5307cc19f70c9f931c41048d9f7e6fd946eabe7"}, - {file = "coverage-6.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0898d6948b31df13391cd40568de8f35fa5901bc922c5ae05cf070587cb9c666"}, - {file = "coverage-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9c416ba03844608f45661a5b48dc59c6b5e89956efe388564dd138ca8caf540b"}, - {file = "coverage-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:66fe33e9e0df58675e08e83fe257f89e7f625e7633ea93d0872154e09cce2724"}, - {file = "coverage-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:353a50f123f0185cdb7a1e1e3e2cfb9d1fd7e293cfaf68eedaf5bd8e02e3ec32"}, - {file = "coverage-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b81a4e667c45b13658b84f9b8f1d32ef86d5405fabcbd181b76b9e51d295f397"}, - {file = "coverage-6.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:17426808e8e0824f864876312d41961223bf5e503bf8f1f846735279a60ea345"}, - {file = "coverage-6.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e11cca9eb5c9b3eaad899728ee2ce916138399ee8cbbccaadc1871fecb750827"}, - {file = "coverage-6.0.1-cp38-cp38-win32.whl", hash = "sha256:0a7e55cc9f7efa22d5cc9966276ec7a40a8803676f6ccbfdc06a486fba9aa9ee"}, - {file = "coverage-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:4eb9cd910ca8e243f930243a9940ea1a522e32435d15668445753d087c30ee12"}, - {file = "coverage-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:83682b73785d2e078e0b5f63410b8125b122e1a22422640c57edd4011c950f3e"}, - {file = "coverage-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b45f89a8ef65c29195f8f28dbe215f44ccb29d934f3e862d2a5c12e38698a793"}, - {file = "coverage-6.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:73880a80fad0597eca43e213e5e1711bf6c0fcdb7eb6b01b3b17841ebe5a7f8d"}, - {file = "coverage-6.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f398d38e6ebc2637863db1d7be3d4f9c5174e7d24bb3b0716cdb1f204669cbcf"}, - {file = "coverage-6.0.1-cp39-cp39-win32.whl", hash = "sha256:1864bdf9b2ccb43e724051bc23a1c558daf101ad4488ede1945f2a8be1facdad"}, - {file = "coverage-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:c9c413c4397d4cdc7ca89286158d240ce524f9667b52c9a64dd7e13d16cf8815"}, - {file = "coverage-6.0.1-pp36-none-any.whl", hash = "sha256:65da6e3e8325291f012921bbf71fea0a97824e1c573981871096aac6e2cf0ec5"}, - {file = "coverage-6.0.1-pp37-none-any.whl", hash = "sha256:07efe1fbd72e67df026ad5109bcd216acbbd4a29d5208b3dab61779bae6b7b26"}, - {file = "coverage-6.0.1.tar.gz", hash = "sha256:3490ff6dbf3f7accf0750136ed60ae1f487bccc1f097740e3b21262bc9c89854"}, -] -datetime = [ - {file = "DateTime-4.3-py2.py3-none-any.whl", hash = "sha256:371dba07417b929a4fa685c2f7a3eaa6a62d60c02947831f97d4df9a9e70dfd0"}, - {file = "DateTime-4.3.tar.gz", hash = "sha256:5cef605bab8259ff61281762cdf3290e459fbf0b4719951d5fab967d5f2ea0ea"}, -] -flake8 = [ - {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, - {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, -] -httplib2 = [ - {file = "httplib2-0.20.1-py3-none-any.whl", hash = "sha256:8fa4dbf2fbf839b71f8c7837a831e00fcdc860feca99b8bda58ceae4bc53d185"}, - {file = "httplib2-0.20.1.tar.gz", hash = "sha256:0efbcb8bfbfbc11578130d87d8afcc65c2274c6eb446e59fc674e4d7c972d327"}, -] -icalendar = [ - {file = "icalendar-4.0.9-py2.py3-none-any.whl", hash = "sha256:cf1446ffdf1b6ad469451a8966cfa7694f5fac796ac6fc7cd93e28c51a637d2c"}, - {file = "icalendar-4.0.9.tar.gz", hash = "sha256:cc73fa9c848744843046228cb66ea86cd8c18d73a51b140f7c003f760b84a997"}, -] -idna = [ - {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"}, - {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -mccabe = [ - {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, - {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -packaging = [ - {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, - {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, -] -pathspec = [ - {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, - {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, -] -platformdirs = [ - {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, - {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -py = [ - {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, - {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, -] -pycodestyle = [ - {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, - {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, -] -pyflakes = [ - {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, - {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, -] -pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, -] -pytest = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] -pytz = [ - {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, - {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, -] -regex = [ - {file = "regex-2021.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:981c786293a3115bc14c103086ae54e5ee50ca57f4c02ce7cf1b60318d1e8072"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51feefd58ac38eb91a21921b047da8644155e5678e9066af7bcb30ee0dca7361"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea8de658d7db5987b11097445f2b1f134400e2232cb40e614e5f7b6f5428710e"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1ce02f420a7ec3b2480fe6746d756530f69769292eca363218c2291d0b116a01"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39079ebf54156be6e6902f5c70c078f453350616cfe7bfd2dd15bdb3eac20ccc"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff24897f6b2001c38a805d53b6ae72267025878d35ea225aa24675fbff2dba7f"}, - {file = "regex-2021.10.8-cp310-cp310-win32.whl", hash = "sha256:c6569ba7b948c3d61d27f04e2b08ebee24fec9ff8e9ea154d8d1e975b175bfa7"}, - {file = "regex-2021.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:45cb0f7ff782ef51bc79e227a87e4e8f24bc68192f8de4f18aae60b1d60bc152"}, - {file = "regex-2021.10.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fab3ab8aedfb443abb36729410403f0fe7f60ad860c19a979d47fb3eb98ef820"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74e55f8d66f1b41d44bc44c891bcf2c7fad252f8f323ee86fba99d71fd1ad5e3"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d52c5e089edbdb6083391faffbe70329b804652a53c2fdca3533e99ab0580d9"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1abbd95cbe9e2467cac65c77b6abd9223df717c7ae91a628502de67c73bf6838"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9b5c215f3870aa9b011c00daeb7be7e1ae4ecd628e9beb6d7e6107e07d81287"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f540f153c4f5617bc4ba6433534f8916d96366a08797cbbe4132c37b70403e92"}, - {file = "regex-2021.10.8-cp36-cp36m-win32.whl", hash = "sha256:1f51926db492440e66c89cd2be042f2396cf91e5b05383acd7372b8cb7da373f"}, - {file = "regex-2021.10.8-cp36-cp36m-win_amd64.whl", hash = "sha256:5f55c4804797ef7381518e683249310f7f9646da271b71cb6b3552416c7894ee"}, - {file = "regex-2021.10.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb2baff66b7d2267e07ef71e17d01283b55b3cc51a81b54cc385e721ae172ba4"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e527ab1c4c7cf2643d93406c04e1d289a9d12966529381ce8163c4d2abe4faf"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c98b013273e9da5790ff6002ab326e3f81072b4616fd95f06c8fa733d2745f"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:55ef044899706c10bc0aa052f2fc2e58551e2510694d6aae13f37c50f3f6ff61"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa0ab3530a279a3b7f50f852f1bab41bc304f098350b03e30a3876b7dd89840e"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a37305eb3199d8f0d8125ec2fb143ba94ff6d6d92554c4b8d4a8435795a6eccd"}, - {file = "regex-2021.10.8-cp37-cp37m-win32.whl", hash = "sha256:2efd47704bbb016136fe34dfb74c805b1ef5c7313aef3ce6dcb5ff844299f432"}, - {file = "regex-2021.10.8-cp37-cp37m-win_amd64.whl", hash = "sha256:924079d5590979c0e961681507eb1773a142553564ccae18d36f1de7324e71ca"}, - {file = "regex-2021.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b09d3904bf312d11308d9a2867427479d277365b1617e48ad09696fa7dfcdf59"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f125fce0a0ae4fd5c3388d369d7a7d78f185f904c90dd235f7ecf8fe13fa741"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f199419a81c1016e0560c39773c12f0bd924c37715bffc64b97140d2c314354"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:09e1031e2059abd91177c302da392a7b6859ceda038be9e015b522a182c89e4f"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c070d5895ac6aeb665bd3cd79f673775caf8d33a0b569e98ac434617ecea57d"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:176796cb7f82a7098b0c436d6daac82f57b9101bb17b8e8119c36eecf06a60a3"}, - {file = "regex-2021.10.8-cp38-cp38-win32.whl", hash = "sha256:5e5796d2f36d3c48875514c5cd9e4325a1ca172fc6c78b469faa8ddd3d770593"}, - {file = "regex-2021.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:e4204708fa116dd03436a337e8e84261bc8051d058221ec63535c9403a1582a1"}, - {file = "regex-2021.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b8b6ee6555b6fbae578f1468b3f685cdfe7940a65675611365a7ea1f8d724991"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973499dac63625a5ef9dfa4c791aa33a502ddb7615d992bdc89cf2cc2285daa3"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88dc3c1acd3f0ecfde5f95c32fcb9beda709dbdf5012acdcf66acbc4794468eb"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4786dae85c1f0624ac77cb3813ed99267c9adb72e59fdc7297e1cf4d6036d493"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe6ce4f3d3c48f9f402da1ceb571548133d3322003ce01b20d960a82251695d2"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e3e2cea8f1993f476a6833ef157f5d9e8c75a59a8d8b0395a9a6887a097243b"}, - {file = "regex-2021.10.8-cp39-cp39-win32.whl", hash = "sha256:82cfb97a36b1a53de32b642482c6c46b6ce80803854445e19bc49993655ebf3b"}, - {file = "regex-2021.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:b04e512eb628ea82ed86eb31c0f7fc6842b46bf2601b66b1356a7008327f7700"}, - {file = "regex-2021.10.8.tar.gz", hash = "sha256:26895d7c9bbda5c52b3635ce5991caa90fbb1ddfac9c9ff1c7ce505e2282fb2a"}, -] -requests = [ - {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, - {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tomli = [ - {file = "tomli-1.2.1-py3-none-any.whl", hash = "sha256:8dd0e9524d6f386271a36b41dbf6c57d8e32fd96fd22b6584679dc569d20899f"}, - {file = "tomli-1.2.1.tar.gz", hash = "sha256:a5b75cb6f3968abb47af1b40c1819dc519ea82bcc065776a866e8d74c5ca9442"}, -] -typing-extensions = [ - {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, - {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, - {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, -] -urllib3 = [ - {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, - {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, -] -"zope.interface" = [ - {file = "zope.interface-5.4.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:7df1e1c05304f26faa49fa752a8c690126cf98b40b91d54e6e9cc3b7d6ffe8b7"}, - {file = "zope.interface-5.4.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2c98384b254b37ce50eddd55db8d381a5c53b4c10ee66e1e7fe749824f894021"}, - {file = "zope.interface-5.4.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:08f9636e99a9d5410181ba0729e0408d3d8748026ea938f3b970a0249daa8192"}, - {file = "zope.interface-5.4.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0ea1d73b7c9dcbc5080bb8aaffb776f1c68e807767069b9ccdd06f27a161914a"}, - {file = "zope.interface-5.4.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:273f158fabc5ea33cbc936da0ab3d4ba80ede5351babc4f577d768e057651531"}, - {file = "zope.interface-5.4.0-cp27-cp27m-win32.whl", hash = "sha256:a1e6e96217a0f72e2b8629e271e1b280c6fa3fe6e59fa8f6701bec14e3354325"}, - {file = "zope.interface-5.4.0-cp27-cp27m-win_amd64.whl", hash = "sha256:877473e675fdcc113c138813a5dd440da0769a2d81f4d86614e5d62b69497155"}, - {file = "zope.interface-5.4.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f7ee479e96f7ee350db1cf24afa5685a5899e2b34992fb99e1f7c1b0b758d263"}, - {file = "zope.interface-5.4.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:b0297b1e05fd128d26cc2460c810d42e205d16d76799526dfa8c8ccd50e74959"}, - {file = "zope.interface-5.4.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:af310ec8335016b5e52cae60cda4a4f2a60a788cbb949a4fbea13d441aa5a09e"}, - {file = "zope.interface-5.4.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:9a9845c4c6bb56e508651f005c4aeb0404e518c6f000d5a1123ab077ab769f5c"}, - {file = "zope.interface-5.4.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0b465ae0962d49c68aa9733ba92a001b2a0933c317780435f00be7ecb959c702"}, - {file = "zope.interface-5.4.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:5dd9ca406499444f4c8299f803d4a14edf7890ecc595c8b1c7115c2342cadc5f"}, - {file = "zope.interface-5.4.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:469e2407e0fe9880ac690a3666f03eb4c3c444411a5a5fddfdabc5d184a79f05"}, - {file = "zope.interface-5.4.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:52de7fc6c21b419078008f697fd4103dbc763288b1406b4562554bd47514c004"}, - {file = "zope.interface-5.4.0-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:3dd4952748521205697bc2802e4afac5ed4b02909bb799ba1fe239f77fd4e117"}, - {file = "zope.interface-5.4.0-cp35-cp35m-win32.whl", hash = "sha256:dd93ea5c0c7f3e25335ab7d22a507b1dc43976e1345508f845efc573d3d779d8"}, - {file = "zope.interface-5.4.0-cp35-cp35m-win_amd64.whl", hash = "sha256:3748fac0d0f6a304e674955ab1365d515993b3a0a865e16a11ec9d86fb307f63"}, - {file = "zope.interface-5.4.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:66c0061c91b3b9cf542131148ef7ecbecb2690d48d1612ec386de9d36766058f"}, - {file = "zope.interface-5.4.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:d0c1bc2fa9a7285719e5678584f6b92572a5b639d0e471bb8d4b650a1a910920"}, - {file = "zope.interface-5.4.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2876246527c91e101184f63ccd1d716ec9c46519cc5f3d5375a3351c46467c46"}, - {file = "zope.interface-5.4.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:334701327f37c47fa628fc8b8d28c7d7730ce7daaf4bda1efb741679c2b087fc"}, - {file = "zope.interface-5.4.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:71aace0c42d53abe6fc7f726c5d3b60d90f3c5c055a447950ad6ea9cec2e37d9"}, - {file = "zope.interface-5.4.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:5bb3489b4558e49ad2c5118137cfeaf59434f9737fa9c5deefc72d22c23822e2"}, - {file = "zope.interface-5.4.0-cp36-cp36m-win32.whl", hash = "sha256:1c0e316c9add0db48a5b703833881351444398b04111188069a26a61cfb4df78"}, - {file = "zope.interface-5.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f0c02cbb9691b7c91d5009108f975f8ffeab5dff8f26d62e21c493060eff2a1"}, - {file = "zope.interface-5.4.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7d97a4306898b05404a0dcdc32d9709b7d8832c0c542b861d9a826301719794e"}, - {file = "zope.interface-5.4.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:867a5ad16892bf20e6c4ea2aab1971f45645ff3102ad29bd84c86027fa99997b"}, - {file = "zope.interface-5.4.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5f931a1c21dfa7a9c573ec1f50a31135ccce84e32507c54e1ea404894c5eb96f"}, - {file = "zope.interface-5.4.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:194d0bcb1374ac3e1e023961610dc8f2c78a0f5f634d0c737691e215569e640d"}, - {file = "zope.interface-5.4.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:8270252effc60b9642b423189a2fe90eb6b59e87cbee54549db3f5562ff8d1b8"}, - {file = "zope.interface-5.4.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:15e7d1f7a6ee16572e21e3576d2012b2778cbacf75eb4b7400be37455f5ca8bf"}, - {file = "zope.interface-5.4.0-cp37-cp37m-win32.whl", hash = "sha256:8892f89999ffd992208754851e5a052f6b5db70a1e3f7d54b17c5211e37a98c7"}, - {file = "zope.interface-5.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2e5a26f16503be6c826abca904e45f1a44ff275fdb7e9d1b75c10671c26f8b94"}, - {file = "zope.interface-5.4.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:0f91b5b948686659a8e28b728ff5e74b1be6bf40cb04704453617e5f1e945ef3"}, - {file = "zope.interface-5.4.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:4de4bc9b6d35c5af65b454d3e9bc98c50eb3960d5a3762c9438df57427134b8e"}, - {file = "zope.interface-5.4.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bf68f4b2b6683e52bec69273562df15af352e5ed25d1b6641e7efddc5951d1a7"}, - {file = "zope.interface-5.4.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:63b82bb63de7c821428d513607e84c6d97d58afd1fe2eb645030bdc185440120"}, - {file = "zope.interface-5.4.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:db1fa631737dab9fa0b37f3979d8d2631e348c3b4e8325d6873c2541d0ae5a48"}, - {file = "zope.interface-5.4.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f44e517131a98f7a76696a7b21b164bcb85291cee106a23beccce454e1f433a4"}, - {file = "zope.interface-5.4.0-cp38-cp38-win32.whl", hash = "sha256:a9506a7e80bcf6eacfff7f804c0ad5350c8c95b9010e4356a4b36f5322f09abb"}, - {file = "zope.interface-5.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:3c02411a3b62668200910090a0dff17c0b25aaa36145082a5a6adf08fa281e54"}, - {file = "zope.interface-5.4.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:0cee5187b60ed26d56eb2960136288ce91bcf61e2a9405660d271d1f122a69a4"}, - {file = "zope.interface-5.4.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:a8156e6a7f5e2a0ff0c5b21d6bcb45145efece1909efcbbbf48c56f8da68221d"}, - {file = "zope.interface-5.4.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:205e40ccde0f37496904572035deea747390a8b7dc65146d30b96e2dd1359a83"}, - {file = "zope.interface-5.4.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:3f24df7124c323fceb53ff6168da70dbfbae1442b4f3da439cd441681f54fe25"}, - {file = "zope.interface-5.4.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:5208ebd5152e040640518a77827bdfcc73773a15a33d6644015b763b9c9febc1"}, - {file = "zope.interface-5.4.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:17776ecd3a1fdd2b2cd5373e5ef8b307162f581c693575ec62e7c5399d80794c"}, - {file = "zope.interface-5.4.0-cp39-cp39-win32.whl", hash = "sha256:d4d9d6c1a455d4babd320203b918ccc7fcbefe308615c521062bc2ba1aa4d26e"}, - {file = "zope.interface-5.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:0cba8477e300d64a11a9789ed40ee8932b59f9ee05f85276dbb4b59acee5dd09"}, - {file = "zope.interface-5.4.0.tar.gz", hash = "sha256:5dba5f530fec3f0988d83b78cc591b58c0b6eb8431a85edd1569a0539a8a5a0e"}, -] diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 66068d0..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,26 +0,0 @@ -[tool.poetry] -name = "icalevents" -version = "0.1.26" -description = "Simple Python 3 library to download, parse and query iCal sources." -authors = ["Martin Eigenmann ", "Thomas Irgang ", "Alexander Hultnér "] -license = "MIT Licence" -readme = "README.md" - -[tool.poetry.dependencies] -python = "^3.9" -httplib2 = "==0.20.1" -icalendar = "4.0.9" -python-dateutil = "==2.8.2" -pytz = "==2021.3" -DateTime = "==4.3" - -[tool.poetry.dev-dependencies] -coverage = "==6.0.1" -codecov = "==2.1.12" -pytest = "==6.2.5" -black = "===21.9b0" -flake8 = "===3.7.9" - -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index b88034e..0000000 --- a/setup.cfg +++ /dev/null @@ -1,2 +0,0 @@ -[metadata] -description-file = README.md From 1df3dc1db2afcee127d89084324e955a23f08196 Mon Sep 17 00:00:00 2001 From: Martin Eigenmann Date: Sun, 26 Dec 2021 15:25:56 +0100 Subject: [PATCH 3/9] feat: actually handle dates, datetimes and timezones as defined in specs --- icalevents/icalevents.py | 8 +- icalevents/icalparser.py | 455 ++++++++++++++++++--------------------- test/test_icalevents.py | 288 +++++++++++++++++++++---- test/test_icalparser.py | 32 +-- 4 files changed, 453 insertions(+), 330 deletions(-) diff --git a/icalevents/icalevents.py b/icalevents/icalevents.py index bf6082d..f6e20d1 100644 --- a/icalevents/icalevents.py +++ b/icalevents/icalevents.py @@ -20,6 +20,9 @@ def events( end=None, fix_apple=False, http=None, + tzinfo=None, + sort=None, + strict=False ): """ Get all events form the given iCal URL occurring in the given time range. @@ -30,6 +33,9 @@ def events( :param start: start date (see dateutils.date) :param end: end date (see dateutils.date) :param fix_apple: fix known Apple iCal issues + :param tzinfo: return values in specified tz + :param sort: sort return values + :param strict: return dates, datetimes and datetime with timezones as specified in ical :return: events as list of dictionaries """ found_events = [] @@ -46,7 +52,7 @@ def events( if not content and string_content: content = ical_download.data_from_string(string_content, apple_fix=fix_apple) - found_events += parse_events(content, start=start, end=end) + found_events += parse_events(content, start=start, end=end, tzinfo=tzinfo, sort=sort, strict=strict) return found_events diff --git a/icalevents/icalparser.py b/icalevents/icalparser.py index a5d5531..425eaa6 100644 --- a/icalevents/icalparser.py +++ b/icalevents/icalparser.py @@ -2,20 +2,20 @@ Parse iCal data to Events. """ # for UID generation +from faulthandler import is_enabled from random import randint -from datetime import datetime, timedelta, date +from datetime import datetime, timedelta, date, tzinfo from typing import Optional -from dateutil.relativedelta import relativedelta -from dateutil.rrule import rrule, rruleset, rrulestr +from dateutil.rrule import rrulestr from dateutil.tz import UTC, gettz from icalendar import Calendar -from icalendar.windows_to_olson import WINDOWS_TO_OLSON from icalendar.prop import vDDDLists, vText -from pytz import timezone from uuid import uuid4 +from icalendar.windows_to_olson import WINDOWS_TO_OLSON +from pytz import timezone def now(): """ @@ -89,41 +89,33 @@ class Event: "Only events can be compared with each other! Other is %s" % type(other) ) else: - return self.start < other.start + # start and end can be dates, datetimes and datetimes with timezoneinfo + if type(self.start) is date and type(other.start) is date: + return self.start < other.start + elif type(self.start) is datetime and type(other.start) is datetime: + if self.start.tzinfo == other.start.tzinfo: + return self.start < other.start + else: + return self.start.astimezone(UTC) < other.start.astimezone(UTC) + elif type(self.start) is date and type(other.start) is datetime: + return self.start < other.start.date() + elif type(self.start) is datetime and type(other.start) is date: + return self.start.date() < other.start + def __str__(self): - n = now() - - if not self.start.tzinfo: - self.start = normalize(self.start) - if not self.end.tzinfo: - self.end = normalize(self.end) - - # compute time delta description - if not self.all_day: - if self.end > n > self.start: - # event is now - delta = "now" - elif self.start > n: - # event is a future event - if self.time_left().days > 0: - delta = "%s days left" % self.time_left().days - else: - hours = self.time_left().seconds / (60 * 60) - delta = "%.1f hours left" % hours - else: - # event is over - delta = "ended" - else: - if self.end > n > self.start: - delta = "today" - elif self.start > n: - delta = "%s days left" % self.time_left().days - else: - delta = "ended" - - return "%s: %s (%s)" % (self.start, self.summary, delta) + return "%s: %s (%s)" % (self.start, self.summary, self.end - self.start) + def astimezone(self, tzinfo): + + if type(self.start) is datetime: + self.start = self.start.astimezone(tzinfo) + + if type(self.end) is datetime: + self.end = self.end.astimezone(tzinfo) + + return self + def copy_to(self, new_start=None, uid=None): """ Create a new event equal to this with new start date. @@ -174,24 +166,23 @@ def encode(value: Optional[vText]) -> Optional[str]: return str(value.encode("utf-8")) -def create_event(component, utc_default, tz=UTC): +def create_event(component, utc_default): """ Create an event from its iCal representation. :param component: iCal component - :param tz: timezone for start and end times :return: event """ event = Event() - event.start = normalize(component.get("dtstart").dt, tz=tz) + event.start = component.get("dtstart").dt # The RFC specifies that the TZID parameter must be specified for datetime or time # Otherwise we set a default timezone (if only one is set with VTIMEZONE) or utc event.floating = type(component.get("dtstart").dt) == date and utc_default if component.get("dtend"): - event.end = normalize(component.get("dtend").dt, tz=tz) + event.end = component.get("dtend").dt elif component.get("duration"): # compute implicit end as start + duration event.end = event.start + component.get("duration").dt else: # compute implicit end as start + 0 @@ -231,13 +222,19 @@ def create_event(component, utc_default, tz=UTC): event.transparent = component.get("transp") == "TRANSPARENT" if component.get("created"): - event.created = normalize(component.get("created").dt, tz) + event.created = component.get("created").dt if component.get("RECURRENCE-ID"): - event.recurrence_id = normalize(component.get("RECURRENCE-ID").dt, tz) + rid = component.get("RECURRENCE-ID").dt + + # Spec defines that if DTSTART is a date RECURRENCE-ID also is to be interpreted as a date + if type(component.get("dtstart").dt) is date: + event.recurrence_id = date(year=rid.year, month=rid.month, day=rid.day) + else: + event.recurrence_id = rid if component.get("last-modified"): - event.last_modified = normalize(component.get("last-modified").dt, tz) + event.last_modified = component.get("last-modified").dt elif event.created: event.last_modified = event.created @@ -261,58 +258,7 @@ def create_event(component, utc_default, tz=UTC): return event -def normalize(dt, tz=UTC): - """ - Convert date or datetime to datetime with timezone. - - :param dt: date to normalize - :param tz: the normalized date's timezone - :return: date as datetime with timezone - """ - if type(dt) is date: - dt = dt + relativedelta(hour=0) - elif type(dt) is datetime: - pass - else: - raise ValueError("unknown type %s" % type(dt)) - - if dt.tzinfo: - dt = dt.astimezone(tz) - else: - dt = dt.replace(tzinfo=tz) - - return dt - - -def get_timezone(tz_name): - if tz_name in WINDOWS_TO_OLSON: - return gettz(WINDOWS_TO_OLSON[tz_name]) - else: - return gettz(tz_name) - - -def adjust_timezone(component, dates, tz=None): - # Remove timezone if none is present in component - if ( - isinstance(component["dtstart"].dt, date) - or component["dtstart"].dt.tzinfo is None - ): - dates = [ - date.replace(tzinfo=None) if type(date) is datetime else date - for date in dates - ] - - # Add timezone if one is present in component - if ( - isinstance(component["dtstart"].dt, datetime) - and not component["dtstart"].dt.tzinfo is None - ): - dates = [normalize(date) for date in dates] - - return dates - - -def parse_events(content, start=None, end=None, default_span=timedelta(days=7)): +def parse_events(content, start=None, end=None, default_span=timedelta(days=7), tzinfo=None, sort=False, strict=False): """ Query the events occurring in a given time range. @@ -332,7 +278,13 @@ def parse_events(content, start=None, end=None, default_span=timedelta(days=7)): raise ValueError("Content is invalid!") calendar = Calendar.from_ical(content) - + + + # > Will be deprecated ======================== + # Calendar.from_ical already parses timezones as specified in the ical. + # We can specify a 'default' tz but this is not according to spec. + # Kept this here to verify tests and backward compatibility + # Keep track of the timezones defined in the calendar timezones = {} @@ -360,183 +312,179 @@ def parse_events(content, start=None, end=None, default_span=timedelta(days=7)): else: utc_default = True cal_tz = UTC - - start = normalize(start, cal_tz) - end = normalize(end, cal_tz) - + # < ========================================== + found = [] - for component in calendar.walk(): - # Skip dates that are stored as exceptions. + + def add_if_not_exception(event): + exdate = "%04d%02d%02d" % ( + event.start.year, + event.start.month, + event.start.day, + ) + + if exdate not in exceptions: + found.append(event) + + for component in calendar.walk(): exceptions = {} - + + if "EXDATE" in component: + # Deal with the fact that sometimes it's a list and + # sometimes it's a singleton + exlist = [] + if isinstance(component["EXDATE"], list): + exlist = component["EXDATE"] + else: + exlist.append(component["EXDATE"]) + for ex in exlist: + exdate = ex.to_ical().decode("UTF-8") + exceptions[exdate[0:8]] = exdate + if component.name == "VEVENT": - e = create_event(component, utc_default, cal_tz) - - if "EXDATE" in component: - # Deal with the fact that sometimes it's a list and - # sometimes it's a singleton - exlist = [] - if isinstance(component["EXDATE"], list): - exlist = component["EXDATE"] - else: - exlist.append(component["EXDATE"]) - for ex in exlist: - exdate = ex.to_ical().decode("UTF-8") - exceptions[exdate[0:8]] = exdate - - # Attempt to work out what timezone is used for the start - # and end times. If the timezone is defined in the calendar, - # use it; otherwise, attempt to load the rules from pytz. - start_tz = None - - if e.start.tzinfo != UTC: - if str(e.start.tzinfo) in timezones: - start_tz = timezones[str(e.start.tzinfo)] - else: - start_tz = e.start.tzinfo - - # If we've been passed or constructed start/end values - # that are timezone naive, but the actual appointment - # start and end times are in a timezone, convert start - # and end to have a timezone. Otherwise, python will - # raise an exception for comparing timezone naive - # and offset-aware values. - if e.start.tzinfo and not start.tzinfo: - start = normalize(start, e.start.tzinfo) - if e.start.tzinfo and not end.tzinfo: - end = normalize(end, e.start.tzinfo) - - duration = e.end - e.start - - event_start = component.get("dtstart").dt - rule_start_time_zone = cal_tz - if type(event_start) is datetime and event_start.tzinfo: - rule_start_time_zone = component.get("dtstart").dt.tzinfo + e = create_event(component, utc_default) + + # make rule.between happy and provide from, to points in time that have the same format as dtstart + s = component['dtstart'].dt + if type(s) is date and not e.recurring: + f, t = date(start.year, start.month, start.day), date(end.year, end.month, end.day) + elif type(s) is datetime and s.tzinfo: + f, t = datetime(start.year, start.month, start.day, tzinfo=s.tzinfo), datetime(end.year, end.month, end.day, tzinfo=s.tzinfo) + else: + f, t = datetime(start.year, start.month, start.day), datetime(end.year, end.month, end.day) + if e.recurring: - # Unfold recurring events according to their rrule - rule = parse_rrule(component, rule_start_time_zone) - [after] = adjust_timezone(component, [start], start_tz) - [end] = adjust_timezone(component, [end], start_tz) - for dt in rule.between(after, end, inc=True): - if start_tz is None: - # Shrug. If we couldn't work out the timezone, it is what it is. - ecopy = e.copy_to(dt, e.uid) + rule = parse_rrule(component) + for dt in rule.between(f, t, inc=True): + # Recompute the start time in the current timezone *on* the + # date of *this* occurrence. This handles the case where the + # recurrence has crossed over the daylight savings time boundary. + if type(dt) is datetime and dt.tzinfo: + dtstart = dt.replace(tzinfo=get_timezone(str(dt.tzinfo))) + ecopy = e.copy_to(dtstart.date() if type(s) is date else dtstart, e.uid) else: - # Recompute the start time in the current timezone *on* the - # date of *this* occurrence. This handles the case where the - # recurrence has crossed over the daylight savings time boundary. - naive = datetime( - dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second - ) - dtstart = normalize(naive, tz=start_tz) - ecopy = e.copy_to(dtstart, e.uid) - - # We're effectively looping over the start time, we might need - # to adjust the end time too, but don't have it's recurred value. - # Make sure it's adjusted by constructing it from the meeting - # duration. Pro: it'll be right. Con: if it was in a different - # timezone from the start time, we'll have lost that. - ecopy.end = dtstart + duration - - exdate = "%04d%02d%02d" % ( - ecopy.start.year, - ecopy.start.month, - ecopy.start.day, - ) - - if exdate not in exceptions: - found.append(ecopy) - elif e.end >= start and e.start <= end: - exdate = "%04d%02d%02d" % (e.start.year, e.start.month, e.start.day) - if exdate not in exceptions: - if ( - type(e.recurrence_id) == datetime - and type(component.get("dtstart").dt) == datetime - ): - naive = datetime( - e.recurrence_id.year, - e.recurrence_id.month, - e.recurrence_id.day, - e.recurrence_id.hour, - e.recurrence_id.minute, - e.recurrence_id.second, - ) - e.recurrence_id = normalize( - naive, tz=component.get("dtstart").dt.tzinfo - ) - found.append(e) + ecopy = e.copy_to(dt.date() if type(s) is date else dt, e.uid) + add_if_not_exception(ecopy) + + elif e.end >= f and e.start <= t: + add_if_not_exception(e) + + result = found.copy() - + + # Remove events that are replaced in ical for event in found: if not event.recurrence_id and (event.uid, event.start) in [ (f.uid, f.recurrence_id) for f in found ]: result.remove(event) + # > Will be deprecated ======================== + # We will apply default cal_tz as required by some tests. + # This is just here for backward-compatibility + if not strict: + for event in result: + if type(event.start) is date: + event.start = datetime(year=event.start.year, month=event.start.month, day=event.start.day, hour=0, minute=0, tzinfo=cal_tz) + event.end = datetime(year=event.end.year, month=event.end.month, day=event.end.day, hour=0, minute=0, tzinfo=cal_tz) + elif type(event.start) is datetime: + if event.start.tzinfo: + event.start = event.start.astimezone(cal_tz) + event.end = event.end.astimezone(cal_tz) + else: + event.start = event.start.replace(tzinfo=cal_tz) + event.end = event.end.replace(tzinfo=cal_tz) + + if event.created: + if type(event.created) is date: + event.created = datetime(year=event.created.year, month=event.created.month, day=event.created.day, hour=0, minute=0, tzinfo=cal_tz) + if type(event.created) is datetime: + if event.created.tzinfo: + event.created = event.created.astimezone(cal_tz) + else: + event.created = event.created.replace(tzinfo=cal_tz) + + if event.last_modified: + if type(event.last_modified) is date: + event.last_modified = datetime(year=event.last_modified.year, month=event.last_modified.month, day=event.last_modified.day, hour=0, minute=0, tzinfo=cal_tz) + if type(event.last_modified) is datetime: + if event.last_modified.tzinfo: + event.last_modified = event.last_modified.astimezone(cal_tz) + else: + event.last_modified = event.last_modified.replace(tzinfo=cal_tz) + # < ========================================== + + if sort: + result.sort() + + if tzinfo: + result = [event.astimezone(tzinfo) for event in result] + + + return result -def parse_rrule(component, tz=UTC): +def parse_rrule(component): """ Extract a dateutil.rrule object from an icalendar component. Also includes the component's dtstart and exdate properties. The rdate and exrule properties are not yet supported. :param component: icalendar component - :param tz: timezone for DST handling - :return: extracted rrule or rruleset + :return: extracted rrule or rruleset or None """ - if component.get("rrule"): - # component['rrule'] can be both a scalar and a list - rrules = component["rrule"] - if not isinstance(rrules, list): - rrules = [rrules] - - # If dtstart is a datetime, make sure it's in a timezone. - rdtstart = component["dtstart"].dt - if type(rdtstart) is datetime: - rdtstart = normalize(rdtstart, tz=tz) - - # Remove/add timezone to rrule until dates depending on component - for index, rru in enumerate(rrules): - if "UNTIL" in rru: - if type(rdtstart) is date: - rrules[index]["UNTIL"] = [ - normalize(until, tz).date() for until in rrules[index]["UNTIL"] - ] - else: - # Handle summer/winter time - rrules[index]["UNTIL"] = [ - normalize(until, UTC) - + tz.utcoffset(component["dtstart"].dt, is_dst=True) - for until in rrules[index]["UNTIL"] - ] - - # Parse the rrules, might return a rruleset instance, instead of rrule - rule = rrulestr( + + if not component.get("rrule"): + return None + + dtstart = component.get("dtstart").dt + + # component['rrule'] can be both a scalar and a list + rrules = component.get("rrule") + if not isinstance(rrules, list): + rrules = [rrules] + + def conform_until(until, dtstart): + if type(dtstart) is datetime: + return (until.astimezone(UTC) if type(until) is datetime else datetime(year=until.year, month=until.month, day=until.day, tzinfo=UTC)) + dtstart.tzinfo.utcoffset(dtstart) + elif type(dtstart) is date: + return until.date() + timedelta(days=1) if type(until) is datetime else until + + for index, rru in enumerate(rrules): + if "UNTIL" in rru: + rrules[index]["UNTIL"] = [ + conform_until(until, dtstart) for until in rrules[index]["UNTIL"] + ] + + rule = rrulestr( "\n".join(x.to_ical().decode() for x in rrules), - dtstart=rdtstart, + dtstart=dtstart, forceset=True, unfold=True, ) - - if component.get("exdate"): - # Add exdates to the rruleset - for exd in extract_exdates(component): + + if component.get("exdate"): + # Add exdates to the rruleset + for exd in extract_exdates(component): + if type(dtstart) is date: + if exd.tzinfo: + rule.exdate(exd.replace(tzinfo=None)) + #rule.exdate(datetime(year=exd.year, month=exd.month, day=exd.day) + timedelta(days=1)) + else: + rule.exdate(exd) + else: rule.exdate(exd) - # TODO: What about rdates and exrules? - if component.get("exrule"): - pass + # TODO: What about rdates and exrules? + if component.get("exrule"): + #pass + print('exrule', component.get("exrule")) - if component.get("rdate"): - pass - - # You really want an rrule for a component without rrule? Here you are. - else: - rule = rruleset() - rule.rdate(normalize(component["dtstart"].dt, tz=tz)) + if component.get("rdate"): + #pass + print('rdate', component.get("rdate")) return rule @@ -549,13 +497,18 @@ def extract_exdates(component): :return: list of exception dates """ dates = [] - - exd_prop = component.get("exdate") - if exd_prop: - if isinstance(exd_prop, list): # In case there is more than one exdate property + if exd_prop := component.get("exdate"): + if isinstance(exd_prop, list): for exd_list in exd_prop: - dates.extend(normalize(exd.dt) for exd in exd_list.dts) + dates.extend(exd.dt for exd in exd_list.dts) elif isinstance(exd_prop, vDDDLists): - dates.extend(normalize(exd.dt) for exd in exd_prop.dts) + dates.extend(exd.dt for exd in exd_prop.dts) - return adjust_timezone(component, dates) + return dates + + +def get_timezone(tz_name): + if tz_name in WINDOWS_TO_OLSON: + return gettz(WINDOWS_TO_OLSON[tz_name]) + else: + return gettz(tz_name) \ No newline at end of file diff --git a/test/test_icalevents.py b/test/test_icalevents.py index 723bf45..a6b52bf 100644 --- a/test/test_icalevents.py +++ b/test/test_icalevents.py @@ -288,46 +288,6 @@ class ICalEventsTests(unittest.TestCase): self.assertTrue(icalevents.all_done(key), "request is finished") self.assertEqual(len(icalevents.latest_events(key)), 2, "two events are found") - def test_event_str(self): - ical = "test/test_data/duration.ics" - start = date(2018, 1, 1) - end = date(2018, 2, 1) - n = datetime.now(UTC) - m = relativedelta(hour=0, minute=0, second=0, microsecond=0) - - evs = icalevents.events(file=ical, start=start, end=end) - - e1 = evs[0] - self.assertIsNotNone( - search(r"ended", str(e1.copy_to(n - relativedelta(days=5) + m))), - "stringify past event", - ) - self.assertIsNotNone( - search(r"today", str(e1.copy_to(n - relativedelta(days=1) + m))), - "stringify ongoing event", - ) - self.assertIsNotNone( - search(r"days left", str(e1.copy_to(n + relativedelta(days=3) + m))), - "stringify future event", - ) - - e2 = evs[1] - self.assertIsNotNone( - search(r"ended", str(e2.copy_to(n - relativedelta(hours=5)))), - "stringify past event", - ) - self.assertIsNotNone( - search(r"now", str(e2.copy_to(n - relativedelta(hours=1)))), - "stringify ongoing event", - ) - self.assertIsNotNone( - search(r"hours left", str(e2.copy_to(n + relativedelta(hours=3)))), - "stringify future event", - ) - self.assertIsNotNone( - search(r"days left", str(e2.copy_to(n + relativedelta(days=3)))), - "stringify future event", - ) def test_events_no_description(self): ical = "test/test_data/no_description.ics" @@ -405,9 +365,19 @@ class ICalEventsTests(unittest.TestCase): start = date(2021, 1, 1) end = date(2021, 12, 31) - evs = icalevents.events(file=ical, start=start, end=end) + evs = icalevents.events(file=ical, start=start, end=end, sort=True) self.assertEqual(len(evs), 42, "42 events in total - one was moved") + + def test_recurence_id_ms_moved(self): + ical = "test/test_data/recurrenceid_ms.ics" + start = date(2021, 4, 8) + end = date(2021, 4, 10) + + evs = icalevents.events(file=ical, start=start, end=end, sort=True) + self.assertEqual(evs[0].start.day, 10) + + self.assertEqual(len(evs), 1, "only one event - it was moved") def test_recurence_id_google(self): ical = "test/test_data/recurrenceid_google.ics" @@ -427,8 +397,16 @@ class ICalEventsTests(unittest.TestCase): self.assertEqual( len(evs), 239, "239 events in total" - ) # 102 events / 91 + 11 recurring + ) + def test_cest_2021_02(self): + ical = "test/test_data/cest.ics" + start = date(2021, 2, 1) + end = date(2021, 2, 28) + + evs = icalevents.events(file=ical, start=start, end=end) + self.assertEqual(len(evs), 17, "17 in february") + def test_cest_2021_03(self): ical = "test/test_data/cest.ics" start = date(2021, 3, 1) @@ -441,18 +419,133 @@ class ICalEventsTests(unittest.TestCase): ical = "test/test_data/cest.ics" start = date(2021, 4, 1) end = date(2021, 5, 1) - - evs = icalevents.events(file=ical, start=start, end=end) - self.assertEqual(len(evs), 27, "27 in april") + + tz = gettz('Europe/Zurich') + events = icalevents.events(file=ical, start=start, end=end, tzinfo=tz, sort=True, strict=True) + + times = [ + ((2021, 4, 1, 14, 0), (2021, 4, 1, 14, 30)), + ((2021, 4, 1, 15, 30), (2021, 4, 1, 17, 0)), + + ((2021, 4, 2), (2021, 4, 3)), + + ((2021, 4, 5, 16, 00), (2021, 4, 5, 17, 0)), + + ((2021, 4, 7), (2021, 4, 8)), + + ((2021, 4, 8, 11, 0), (2021, 4, 8, 12, 0)), + ((2021, 4, 8, 14, 30), (2021, 4, 8, 15, 0)), + ((2021, 4, 8, 15, 0), (2021, 4, 8, 15, 30)), + + ((2021, 4, 9), (2021, 4, 10)), + #((2021, 4, 9), (2021, 4, 10)), # Google said this should exist, microsoft disagrees + + ((2021, 4, 12, 11, 0), (2021, 4, 12, 11, 30)), + ((2021, 4, 12, 16, 0), (2021, 4, 12, 17, 0)), + + ((2021, 4, 14), (2021, 4, 15)), + + ((2021, 4, 15, 12, 0), (2021, 4, 15, 13, 0)), + ((2021, 4, 15, 15, 0), (2021, 4, 15, 15, 30)), + + ((2021, 4, 16), (2021, 4, 17)), + + ((2021, 4, 19, 16, 0), (2021, 4, 19, 17, 0)), + + ((2021, 4, 21), (2021, 4, 22)), + + ((2021, 4, 22, 11, 0), (2021, 4, 22, 12, 0)), + ((2021, 4, 22, 14, 45), (2021, 4, 22, 15, 15)), + + ((2021, 4, 23), (2021, 4, 24)), + + ((2021, 4, 26, 16, 0), (2021, 4, 26, 17, 0)), + + ((2021, 4, 28), (2021, 4, 29)), + + ((2021, 4, 29, 9, 0), (2021, 4, 29, 11, 0)), + ((2021, 4, 29, 11, 0), (2021, 4, 29, 11, 30)), + ((2021, 4, 29, 14, 15), (2021, 4, 29, 15, 00)), + ((2021, 4, 29, 15, 0), (2021, 4, 29, 15, 30)), + + ((2021, 4, 30), (2021, 5, 1)), + ] + + for index, time in enumerate(times): + self.assertEqual(events[index].start, date(*time[0]) if len(time[0]) == 3 else datetime(*time[0], tzinfo=tz)) + self.assertEqual(events[index].end, date(*time[1]) if len(time[1]) == 3 else datetime(*time[1], tzinfo=tz)) + + self.assertEqual(len(events), len(times)) def test_cest_2021_05(self): ical = "test/test_data/cest.ics" start = date(2021, 5, 1) end = date(2021, 6, 1) - evs = icalevents.events(file=ical, start=start, end=end) - self.assertEqual(len(evs), 20, "20 in mai") + tz = gettz('Europe/Zurich') + events = icalevents.events(file=ical, start=start, end=end, tzinfo=tz, sort=True, strict=True) + + times = [ + ((2021, 5, 3, 16, 0), (2021, 5, 3, 17, 0)), + + ((2021, 5, 5), (2021, 5, 6)), + + ((2021, 5, 6, 11, 0), (2021, 5, 6, 12, 0)), + ((2021, 5, 6, 15, 0), (2021, 5, 6, 15, 30)), + + ((2021, 5, 7), (2021, 5, 8)), + + ((2021, 5, 10, 16, 0), (2021, 5, 10, 17, 0)), + + ((2021, 5, 12), (2021, 5, 13)), + + ((2021, 5, 13, 15, 0), (2021, 5, 13, 15, 30)), + + ((2021, 5, 14), (2021, 5, 15)), + + ((2021, 5, 17, 16, 0), (2021, 5, 17, 17, 0)), + + ((2021, 5, 19), (2021, 5, 20)), + + ((2021, 5, 20, 11, 0), (2021, 5, 20, 12, 0)), + ((2021, 5, 20, 12, 0), (2021, 5, 20, 13, 0)), + ((2021, 5, 20, 15, 0), (2021, 5, 20, 15, 30)), + + ((2021, 5, 21), (2021, 5, 22)), + + ((2021, 5, 24, 16, 0), (2021, 5, 24, 17, 0)), + + ((2021, 5, 26), (2021, 5, 27)), + + ((2021, 5, 27, 15, 0), (2021, 5, 27, 15, 30)), + + ((2021, 5, 28), (2021, 5, 29)), + + ((2021, 5, 31, 16, 0), (2021, 5, 31, 17, 0)), + ] + + for index, time in enumerate(times): + self.assertEqual(events[index].start, date(*time[0]) if len(time[0]) == 3 else datetime(*time[0], tzinfo=tz)) + self.assertEqual(events[index].end, date(*time[1]) if len(time[1]) == 3 else datetime(*time[1], tzinfo=tz)) + + self.assertEqual(len(events), len(times)) + def test_cest_2021_06(self): + ical = "test/test_data/cest.ics" + start = date(2021, 6, 1) + end = date(2021, 6, 30) + + evs = icalevents.events(file=ical, start=start, end=end) + self.assertEqual(len(evs), 11, "11 in june") + + def test_cest_2021_07(self): + ical = "test/test_data/cest.ics" + start = date(2021, 7, 1) + end = date(2021, 7, 31) + + evs = icalevents.events(file=ical, start=start, end=end) + self.assertEqual(len(evs), 1, "1 in july") + def test_cest_1(self): ical = "test/test_data/cest_every_day_for_one_year.ics" start = date(2020, 1, 1) @@ -607,3 +700,104 @@ class ICalEventsTests(unittest.TestCase): datetime(2021, 11, 23, 13, 0, tzinfo=UTC), "moved 1 hour from 12:00 to 13:00", ) + + def test_recurring_tz_passover_fall(self): + ical = "test/test_data/recurring_override.ics" + start = date(2021, 8, 30) + end = date(2021, 9, 18) + + tz = gettz('Europe/Zurich') + events = icalevents.events(file=ical, start=start, end=end, tzinfo=tz, sort=True, strict=True) + + times = [ + ((2021, 8, 30, 8, 0), (2021, 8, 30, 17, 0)), + ((2021, 8, 30, 9, 30), (2021, 8, 30, 10, 0)), + + ((2021, 8, 31, 10, 0), (2021, 8, 31, 10, 30)), + ((2021, 8, 31, 10, 15), (2021, 8, 31, 10, 45)), + ((2021, 8, 31, 13, 15), (2021, 8, 31, 14, 0)), + + ((2021, 9, 1, 9, 0), (2021, 9, 1, 10, 0)), + ((2021, 9, 1, 9, 30), (2021, 9, 1, 10, 0)), + ((2021, 9, 1, 12, 0), (2021, 9, 1, 13, 0)), + + ((2021, 9, 2, 10, 0), (2021, 9, 2, 10, 30)), + + ((2021, 9, 3, 8, 0), (2021, 9, 3, 8, 30)), + ((2021, 9, 3, 9, 0), (2021, 9, 3, 9, 30)), + ((2021, 9, 3, 9, 30), (2021, 9, 3, 10, 0)), + ((2021, 9, 3, 15, 30), (2021, 9, 3, 16, 0)), + ((2021, 9, 3, 17, 30), (2021, 9, 3, 19, 0)), + + ((2021, 9, 6, 8, 0), (2021, 9, 6, 17, 0)), + ((2021, 9, 6, 9, 30), (2021, 9, 6, 10, 0)), + + ((2021, 9, 7, 9, 0), (2021, 9, 7, 12, 0)), + ((2021, 9, 7, 9, 0), (2021, 9, 7, 12, 0)), + ((2021, 9, 7, 10, 0), (2021, 9, 7, 10, 30)), + + ((2021, 9, 8, 9, 30), (2021, 9, 8, 10, 0)), + ((2021, 9, 8, 12, 0), (2021, 9, 8, 13, 0)), + + ((2021, 9, 9), (2021, 9, 10)), + ((2021, 9, 9, 10, 0), (2021, 9, 9, 10, 30)), + ((2021, 9, 9, 11, 0), (2021, 9, 9, 12, 0)), + + ((2021, 9, 10, 8, 0), (2021, 9, 10, 8, 30)), + ((2021, 9, 10, 9, 30), (2021, 9, 10, 10, 0)), + ((2021, 9, 10, 17, 30), (2021, 9, 10, 19, 0)), + + ((2021, 9, 13, 9, 30), (2021, 9, 13, 10, 0)), + + ((2021, 9, 14, 9, 0), (2021, 9, 14, 10, 0)), + ((2021, 9, 14, 10, 0), (2021, 9, 14, 10, 30)), + ((2021, 9, 14, 15, 0), (2021, 9, 14, 15, 30)), + + ((2021, 9, 15, 9, 30), (2021, 9, 15, 10, 0)), + + ((2021, 9, 16, 10, 0), (2021, 9, 16, 10, 30)), + ((2021, 9, 16), (2021, 9, 17)), + + ((2021, 9, 17, 9, 30), (2021, 9, 17, 10, 0)), + ((2021, 9, 17, 17, 30), (2021, 9, 17, 19, 0)), + ] + + for index, time in enumerate(times): + self.assertEqual(events[index].start, date(*time[0]) if len(time[0]) == 3 else datetime(*time[0], tzinfo=tz)) + self.assertEqual(events[index].end, date(*time[1]) if len(time[1]) == 3 else datetime(*time[1], tzinfo=tz)) + + self.assertEqual(len(events), len(times)) + + def test_recurring_tz_passover_spring(self): + ical = "test/test_data/recurring_override.ics" + start = date(2022, 3, 6) + end = date(2022, 4, 10) + + tz = gettz('Europe/Zurich') + events = icalevents.events(file=ical, start=start, end=end, tzinfo=tz, sort=True, strict=True) + + times = [ + ((2022, 3, 8, 11, 45), (2022, 3, 8, 12, 0)), + + ((2022, 3, 10), (2022, 3, 11)), + ((2022, 3, 10, 11, 0), (2022, 3, 10, 12, 0)), + + ((2022, 3, 15, 11, 45), (2022, 3, 15, 12, 0)), + + ((2022, 3, 22, 11, 45), (2022, 3, 22, 12, 0)), + ((2022, 3, 22, 14, 00), (2022, 3, 22, 15, 0)), + + ((2022, 3, 24), (2022, 3, 25)), + + ((2022, 3, 29, 11, 45), (2022, 3, 29, 12, 0)), + + ((2022, 4, 3, 8, 0), (2022, 4, 3, 8, 30)), + + ((2022, 4, 7), (2022, 4, 8)), + ] + + for index, time in enumerate(times): + self.assertEqual(events[index].start, date(*time[0]) if len(time[0]) == 3 else datetime(*time[0], tzinfo=tz)) + self.assertEqual(events[index].end, date(*time[1]) if len(time[1]) == 3 else datetime(*time[1], tzinfo=tz)) + + self.assertEqual(len(events), len(times)) \ No newline at end of file diff --git a/test/test_icalparser.py b/test/test_icalparser.py index 16ca87f..0a8e4e0 100644 --- a/test/test_icalparser.py +++ b/test/test_icalparser.py @@ -78,36 +78,6 @@ class ICalParserTests(unittest.TestCase): def test_event_order(self): self.assertTrue(self.eventA > self.eventB, "order of events") - def test_normalize(self): - dt = date(year=2016, month=11, day=13) - norm = icalevents.icalparser.normalize(dt) - - self.assertTrue(type(norm) is datetime, "type is datetime") - self.assertEqual(2016, norm.year, "year") - self.assertEqual(11, norm.month, "month") - self.assertEqual(13, norm.day, "day") - self.assertEqual(0, norm.hour, "hour") - self.assertEqual(0, norm.minute, "minute") - self.assertEqual(0, norm.second, "second") - self.assertEqual(0, norm.microsecond, "microsecond") - self.assertEqual(UTC, norm.tzinfo, "timezone") - - dt = datetime(year=2016, month=11, day=13, hour=1, minute=2, second=3) - norm = icalevents.icalparser.normalize(dt) - - self.assertTrue(type(norm) is datetime, "type is datetime") - self.assertEqual(2016, norm.year, "year") - self.assertEqual(11, norm.month, "month") - self.assertEqual(13, norm.day, "day") - self.assertEqual(1, norm.hour, "hour") - self.assertEqual(2, norm.minute, "minute") - self.assertEqual(3, norm.second, "second") - self.assertEqual(0, norm.microsecond, "microsecond") - self.assertEqual(UTC, norm.tzinfo, "timezone") - - with self.assertRaises(ValueError, msg="type check effective"): - icalevents.icalparser.normalize(None) - def test_attendee(self): self.assertIsInstance(self.eventA.attendee, str) self.assertIsInstance(self.eventB.attendee, list) @@ -119,4 +89,4 @@ class ICalParserTests(unittest.TestCase): def test_str(self): self.eventA.start = datetime(year=2017, month=2, day=3, hour=12, minute=5) self.eventA.end = datetime(year=2017, month=2, day=3, hour=15, minute=5) - self.assertEqual("2017-02-03 12:05:00+00:00: Event A (ended)", str(self.eventA)) + self.assertEqual("2017-02-03 12:05:00: Event A (3:00:00)", str(self.eventA)) From 3ab3008c2eca07f301f566b7da4244cb24d831e5 Mon Sep 17 00:00:00 2001 From: Martin Eigenmann Date: Sun, 26 Dec 2021 15:27:34 +0100 Subject: [PATCH 4/9] remove unused file --- test/test_data/cest copy.ics | 2262 ---------------------------------- 1 file changed, 2262 deletions(-) delete mode 100644 test/test_data/cest copy.ics diff --git a/test/test_data/cest copy.ics b/test/test_data/cest copy.ics deleted file mode 100644 index 8c07e39..0000000 --- a/test/test_data/cest copy.ics +++ /dev/null @@ -1,2262 +0,0 @@ -BEGIN:VCALENDAR -METHOD:PUBLISH -PRODID:Microsoft Exchange Server 2010 -VERSION:2.0 -X-WR-CALNAME:Calendar -BEGIN:VTIMEZONE -TZID:W. Europe Standard Time -BEGIN:STANDARD -DTSTART:16010101T030000 -TZOFFSETFROM:+0200 -TZOFFSETTO:+0100 -RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 -END:STANDARD -BEGIN:DAYLIGHT -DTSTART:16010101T020000 -TZOFFSETFROM:+0100 -TZOFFSETTO:+0200 -RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 -END:DAYLIGHT -END:VTIMEZONE -BEGIN:VEVENT -RRULE:FREQ=WEEKLY;UNTIL=20200521T220000Z;INTERVAL=1;BYDAY=MO,FR;WKST=MO -UID:040000008200E00074C5B7101A82E008000000001075617F3BE6D501000000000000000 - 0100000007B29D30C240193429FF8C08553783419 -SUMMARY:Away -DTSTART;VALUE=DATE:20200508 -DTEND;VALUE=DATE:20200509 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:OOF -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:TRUE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:1 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000B05AD42D8A27D601000000000000000 - 01000000030BB2D39F818C747A760BA7929ED3981 -SUMMARY:Tentative -DTSTART;TZID=W. Europe Standard Time:20200512T090000 -DTEND;TZID=W. Europe Standard Time:20200512T093000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:TENTATIVE -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -RRULE:FREQ=WEEKLY;UNTIL=20200520T140000Z;INTERVAL=1;BYDAY=WE;WKST=MO -UID:040000008200E00074C5B7101A82E00800000000D0B7C0A43BE6D501000000000000000 - 0100000000C1F72E9A45C5D4ABC1F1AC4E9461313 -SUMMARY:Away -DTSTART;TZID=W. Europe Standard Time:20200513T160000 -DTEND;TZID=W. Europe Standard Time:20200513T220000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:OOF -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:1 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:DE298210-0417-46D3-B2B2-4038AA905649 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200526T090000 -DTEND;TZID=W. Europe Standard Time:20200526T093000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:B5E946AC-2F29-4F13-8922-5686D24E8187 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200526T114500 -DTEND;TZID=W. Europe Standard Time:20200526T120000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:EAE44C91-F256-4212-A477-6B5215AA8BC7 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200527T090000 -DTEND;TZID=W. Europe Standard Time:20200527T094500 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000C01BF415203BD601000000000000000 - 0100000006B678962A55F6842977AD405D4ECAA8B -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200608T154500 -DTEND;TZID=W. Europe Standard Time:20200608T161500 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:BF60522B-2482-4734-A552-14F8C39011CA -SUMMARY:Free -DTSTART;TZID=W. Europe Standard Time:20200701T090000 -DTEND;TZID=W. Europe Standard Time:20200701T110000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:TRANSPARENT -STATUS:CONFIRMED -SEQUENCE:1 -X-MICROSOFT-CDO-APPT-SEQUENCE:1 -X-MICROSOFT-CDO-BUSYSTATUS:FREE -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:AE5B3952-8663-432D-84C2-87D34E9C753F -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200706T090000 -DTEND;TZID=W. Europe Standard Time:20200706T093000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:8839D7E0-115A-4E61-B5B3-AE6307DAD3D4 -SUMMARY:Tentative -DTSTART;TZID=W. Europe Standard Time:20200706T093000 -DTEND;TZID=W. Europe Standard Time:20200706T100000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:TENTATIVE -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:733C582E-47E9-405A-A365-D476589C803C -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200706T130000 -DTEND;TZID=W. Europe Standard Time:20200706T133000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:A3A5B2A9-6D72-4541-8F24-E77EA1BEFC3F -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200708T103000 -DTEND;TZID=W. Europe Standard Time:20200708T120000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:2 -X-MICROSOFT-CDO-APPT-SEQUENCE:2 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:55B4C453-E46F-4C59-80F0-86795757EA54 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200713T153000 -DTEND;TZID=W. Europe Standard Time:20200713T160000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:2 -X-MICROSOFT-CDO-APPT-SEQUENCE:2 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000908294864A50D601000000000000000 - 010000000B11AD25C8FAC044AA4B213C41795F969 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200716T120000 -DTEND;TZID=W. Europe Standard Time:20200716T130000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:4 -X-MICROSOFT-CDO-APPT-SEQUENCE:4 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:997EAA7F-3875-48A7-9F2C-625A9DA4C74B -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200716T143000 -DTEND;TZID=W. Europe Standard Time:20200716T150000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000DC9F44E10C5AD601000000000000000 - 0100000000F865D0942EDAE45AD168FD5AE0085DD -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200717T130000 -DTEND;TZID=W. Europe Standard Time:20200717T133000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000400D2869775ED601000000000000000 - 010000000712CF41D5BDC7B47AC67478991311A12 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200720T103000 -DTEND;TZID=W. Europe Standard Time:20200720T104500 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000004C7923C4D522D601000000000000000 - 010000000A106A7E501F8324795D06DEA44182073 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200727T070000 -DTEND;TZID=W. Europe Standard Time:20200727T073000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:D03C22DA-13B7-49AE-9087-7CC1183EE7AA -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200727T134500 -DTEND;TZID=W. Europe Standard Time:20200727T154500 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:1 -X-MICROSOFT-CDO-APPT-SEQUENCE:1 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000005ABFDC9E1F64D601000000000000000 - 010000000A86E35E32541A043AF90A3B032210D57 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200730T133000 -DTEND;TZID=W. Europe Standard Time:20200730T140000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000503CA7354B50D601000000000000000 - 0100000000FEB7774C50048408D5F919D19319CAF -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200813T120000 -DTEND;TZID=W. Europe Standard Time:20200813T130000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:3 -X-MICROSOFT-CDO-APPT-SEQUENCE:3 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:171F5E53-F03C-4FD6-A92A-CCC3AEC9099B -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200826T103000 -DTEND;TZID=W. Europe Standard Time:20200826T120000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:34CC9FCD-AFBB-4DF1-B1B7-9E2FC79139B1 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200904T160000 -DTEND;TZID=W. Europe Standard Time:20200904T164500 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:1 -X-MICROSOFT-CDO-APPT-SEQUENCE:1 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:4E3984EFA34448D68E97183D8EAF5FB80 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200907T130000 -DTEND;TZID=W. Europe Standard Time:20200907T140000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:2 -X-MICROSOFT-CDO-APPT-SEQUENCE:2 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -RRULE:FREQ=WEEKLY;UNTIL=20201216T080000Z;INTERVAL=1;BYDAY=WE;WKST=SU -UID:1F6F1A4B-A70F-45DA-8F31-A47AAE02F7AC -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200909T090000 -DTEND;TZID=W. Europe Standard Time:20200909T103000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:5 -X-MICROSOFT-CDO-APPT-SEQUENCE:5 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:1 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:DF3704CE-4336-42E3-9BBE-F4AB1AE33E36 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200911T160000 -DTEND;TZID=W. Europe Standard Time:20200911T210000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -RRULE:FREQ=WEEKLY;UNTIL=20201221T230000Z;INTERVAL=1;BYDAY=TU;WKST=MO -UID:040000008200E00074C5B7101A82E0080000000016888E6CBF86D601000000000000000 - 010000000448FF2FAF3F0424A89B6DC5D1FD02484 -SUMMARY:Away -DTSTART;VALUE=DATE:20200915 -DTEND;VALUE=DATE:20200916 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:OOF -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:TRUE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:1 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -RRULE:FREQ=WEEKLY;UNTIL=20201224T110000Z;INTERVAL=1;BYDAY=TH;WKST=MO -UID:040000008200E00074C5B7101A82E00800000000A429EDD6C086D601000000000000000 - 0100000009CEB2D590EF69D4F9F4A5CBEEB46C471 -SUMMARY:Away -DTSTART;TZID=W. Europe Standard Time:20200917T120000 -DTEND;TZID=W. Europe Standard Time:20200917T173000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:OOF -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:1 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:98E77A12-F595-4DFA-AAA4-70655A64AD22 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200918T110000 -DTEND;TZID=W. Europe Standard Time:20200918T120000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -RRULE:FREQ=WEEKLY;UNTIL=20201225T110000Z;INTERVAL=1;BYDAY=FR;WKST=MO -UID:040000008200E00074C5B7101A82E008000000003E664513C186D601000000000000000 - 01000000026A83D65744F3C4C80410BE9CFA1B03C -SUMMARY:Away -DTSTART;TZID=W. Europe Standard Time:20200918T120000 -DTEND;TZID=W. Europe Standard Time:20200918T170000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:OOF -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:1 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:91B8081F-4764-4108-97A9-E4C0AF6E33C3 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200924T093000 -DTEND;TZID=W. Europe Standard Time:20200924T113000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000103FADEF4C71D601000000000000000 - 010000000F08C89F594F6A645A59D42928F69DF4B -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200924T120000 -DTEND;TZID=W. Europe Standard Time:20200924T130000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:F9B8DF47-0F86-4845-BDED-646A38D03B0A -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20200930T101500 -DTEND;TZID=W. Europe Standard Time:20200930T103000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000349C10C11797D601000000000000000 - 010000000927A2F068F5FCA40829F0F35BA04ACFC -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201001T090000 -DTEND;TZID=W. Europe Standard Time:20201001T093000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000BB812ABD0A97D601000000000000000 - 010000000F4E98D4229BFFA49871BE9A4252B77BA -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201001T093000 -DTEND;TZID=W. Europe Standard Time:20201001T100000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000F152D604BB91D601000000000000000 - 010000000B062F09E1083D94E801010FDFBB3C179 -SUMMARY:Free -DTSTART;TZID=W. Europe Standard Time:20201002T080000 -DTEND;TZID=W. Europe Standard Time:20201002T120000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:TRANSPARENT -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:FREE -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E0080000000000F12AF14197D601000000000000000 - 010000000B2F69E4E61595740A288CD8FF9191DC1 -SUMMARY:Tentative -DTSTART;TZID=W. Europe Standard Time:20201002T090000 -DTEND;TZID=W. Europe Standard Time:20201002T094500 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:TENTATIVE -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000002DCD218DF6A1D601000000000000000 - 0100000008C2B77CC1D0C8E4F9F75A410E5FB5170 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201016T090000 -DTEND;TZID=W. Europe Standard Time:20201016T094500 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000E30226C965A1D601000000000000000 - 0100000000248855A551E4F409F1C134AB8B1E8F5 -SUMMARY:Tentative -DTSTART;TZID=W. Europe Standard Time:20201016T130000 -DTEND;TZID=W. Europe Standard Time:20201016T133000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:1 -X-MICROSOFT-CDO-APPT-SEQUENCE:1 -X-MICROSOFT-CDO-BUSYSTATUS:TENTATIVE -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000B773F8E965A1D601000000000000000 - 0100000005AF82035561A6D438E87A4558E721B4D -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201016T160000 -DTEND;TZID=W. Europe Standard Time:20201016T170000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:1 -X-MICROSOFT-CDO-APPT-SEQUENCE:1 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000006043B50DC4A7D601000000000000000 - 010000000504B9DE85AC0434BB1E1152DEC546CBC -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201022T090000 -DTEND;TZID=W. Europe Standard Time:20201022T100000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E0080000000050FC3101C4A7D601000000000000000 - 010000000886DDB26E9F8EF448AE0C6FBF58F9A50 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201022T100000 -DTEND;TZID=W. Europe Standard Time:20201022T103000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000803A2CD475ABD601000000000000000 - 010000000E8B2F7397211794A9A0039A9A547ECB6 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201026T150000 -DTEND;TZID=W. Europe Standard Time:20201026T160000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:1 -X-MICROSOFT-CDO-APPT-SEQUENCE:1 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000A0AC4F364D71D601000000000000000 - 010000000598606CD1DBC3F458327B7940CCC0E4F -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201029T120000 -DTEND;TZID=W. Europe Standard Time:20201029T130000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000007D3D53B664ACD601000000000000000 - 010000000F8C3CFB29FA20B4FAC6AB54B9F985EFF -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201030T090000 -DTEND;TZID=W. Europe Standard Time:20201030T093000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:1 -X-MICROSOFT-CDO-APPT-SEQUENCE:1 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000F0E7713464B3D601000000000000000 - 010000000F20CCD9063386848B1E6C38D56348A3A -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201105T113000 -DTEND;TZID=W. Europe Standard Time:20201105T114500 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000B003167078B6D601000000000000000 - 0100000009566D0821DFAB444A78B69525A1F61A2 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201109T150000 -DTEND;TZID=W. Europe Standard Time:20201109T153000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000772606315EB6D601000000000000000 - 0100000001CCF2EBE9FEFE0439A7C3D07F4FE4883 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201113T090000 -DTEND;TZID=W. Europe Standard Time:20201113T120000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000008C9C524993B9D601000000000000000 - 0100000009EAAC0689CB0C1498DDA7C183750D6A2 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201113T110000 -DTEND;TZID=W. Europe Standard Time:20201113T120000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000198EAB2DE8BBD601000000000000000 - 0100000004B3E4AC2F61161469205D3DD9BF15047 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201118T090000 -DTEND;TZID=W. Europe Standard Time:20201118T100000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000007D0934885EB6D601000000000000000 - 0100000005D8D3D05DA30FF4AA18FC1A9BC69270C -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201119T110000 -DTEND;TZID=W. Europe Standard Time:20201119T120000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E0080000000021FE26DABEBDD601000000000000000 - 010000000A61457CDF929E84B9E540355583BECC6 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201120T090000 -DTEND;TZID=W. Europe Standard Time:20201120T093000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000591198E55EB6D601000000000000000 - 010000000CC7B25FF48720A42932E5EF20335F073 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201123T130000 -DTEND;TZID=W. Europe Standard Time:20201123T140000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:1 -X-MICROSOFT-CDO-APPT-SEQUENCE:1 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000002FD322CF0EC3D601000000000000000 - 0100000002879E7E16395374FA08EA9A114429811 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201125T130000 -DTEND;TZID=W. Europe Standard Time:20201125T134500 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E0080000000089F581662EC3D601000000000000000 - 0100000004D75E5BEC145564D9A55BBE5A1ED1800 -SUMMARY:Tentative -DTSTART;TZID=W. Europe Standard Time:20201127T091500 -DTEND;TZID=W. Europe Standard Time:20201127T100000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:TENTATIVE -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000005F8D2ADC1BC7D601000000000000000 - 010000000DEF2117458876E41BCF3BA06CFCCA592 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201202T093000 -DTEND;TZID=W. Europe Standard Time:20201202T103000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000006CC4F013A9C4D601000000000000000 - 010000000F149D1D4B39A914CACE58508268387AD -SUMMARY:Tentative -DTSTART;TZID=W. Europe Standard Time:20201204T091500 -DTEND;TZID=W. Europe Standard Time:20201204T100000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:TENTATIVE -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000007BB741DEAFC8D601000000000000000 - 0100000001684F5DC2799904BA0520074A8841886 -SUMMARY:Free -DTSTART;VALUE=DATE:20201207 -DTEND;VALUE=DATE:20201208 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:TRANSPARENT -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:FREE -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:TRUE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000002099F7108FCCD601000000000000000 - 01000000092773DDAACCD5343A8B16FCFEB67D040 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20201207T130000 -DTEND;TZID=W. Europe Standard Time:20201207T133000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000001F0DAC8B99C8D601000000000000000 - 010000000DAE6A8429A0E224BBEFA1ECD2FD61D5C -SUMMARY:Away -DTSTART;VALUE=DATE:20201214 -DTEND;VALUE=DATE:20210103 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:OOF -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:TRUE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000007D187AF9CAE4D601000000000000000 - 010000000FE63728EA079484EAD5DC5A25B5E16A7 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210107T094500 -DTEND;TZID=W. Europe Standard Time:20210107T103000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -RRULE:FREQ=WEEKLY;UNTIL=20210125T230000Z;INTERVAL=1;BYDAY=MO,TU;WKST=SU -UID:040000008200E00074C5B7101A82E008000000002B891E7C27E4D601000000000000000 - 0100000006DE03E881A143B45AD0DCE35DAE22EAE -SUMMARY:Away -DTSTART;VALUE=DATE:20210111 -DTEND;VALUE=DATE:20210112 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:OOF -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:TRUE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:1 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000009CBE5D424AEAD601000000000000000 - 01000000022A6E26556835141B9E5E95142C40DEF -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210114T100000 -DTEND;TZID=W. Europe Standard Time:20210114T110000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000884B9DBFC7E9D601000000000000000 - 010000000A30A5DF8B2B46D488F11D6B274B544D6 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210121T110000 -DTEND;TZID=W. Europe Standard Time:20210121T120000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E0080000000060DBEE5200F0D601000000000000000 - 01000000023B33A24482A7D46B9B37405A78E3366 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210121T160000 -DTEND;TZID=W. Europe Standard Time:20210121T170000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E0080000000020F5C57016CFD601000000000000000 - 0100000007BB1D7474520E348A825D6909AA899FE -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210128T123000 -DTEND;TZID=W. Europe Standard Time:20210128T131500 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:1 -X-MICROSOFT-CDO-APPT-SEQUENCE:1 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000440773E767F5D601000000000000000 - 0100000009966933D911E7E42B6AB82C6BD6B4F32 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210129T143000 -DTEND;TZID=W. Europe Standard Time:20210129T151500 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:1 -X-MICROSOFT-CDO-APPT-SEQUENCE:1 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000000EEC6AE56EFDD601000000000000000 - 010000000A13DB89C59332647B6810D2CAF3934BE -SUMMARY:Away -DTSTART;TZID=W. Europe Standard Time:20210208T123000 -DTEND;TZID=W. Europe Standard Time:20210208T153000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:OOF -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000376247EB6EFDD601000000000000000 - 010000000D8E5E8A206338C4093D0A8D898092505 -SUMMARY:Away -DTSTART;TZID=W. Europe Standard Time:20210209T100000 -DTEND;TZID=W. Europe Standard Time:20210209T110000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:OOF -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E0080000000063A58C56C8FED601000000000000000 - 0100000000CA0BC7BC5659B4CADDDFC4178FB5E91 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210209T150000 -DTEND;TZID=W. Europe Standard Time:20210209T154500 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -RRULE:FREQ=WEEKLY;UNTIL=20210701T220000Z;INTERVAL=1;BYDAY=WE,FR;WKST=SU -EXDATE;TZID=W. Europe Standard Time:20210409T000000 -UID:040000008200E00074C5B7101A82E0080000000062FD14411601D701000000000000000 - 01000000052EAF66D5C3BC6458198F47BAE50996F -SUMMARY:Away -DTSTART;VALUE=DATE:20210210 -DTEND;VALUE=DATE:20210211 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:OOF -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:TRUE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:1 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000303073B75600D701000000000000000 - 010000000AE5A210A3F9BEE44B9B75195D0FAB846 -SUMMARY:Tentative -DTSTART;TZID=W. Europe Standard Time:20210211T102000 -DTEND;TZID=W. Europe Standard Time:20210211T105000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:TENTATIVE -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000001033B0755900D701000000000000000 - 010000000F21D5BA0A102E44FA1349F57C83524E9 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210212T100000 -DTEND;TZID=W. Europe Standard Time:20210212T103000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000009A51E42C8500D701000000000000000 - 01000000026D978CECD0ED94ABAE1820E59EBDACD -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210212T140000 -DTEND;TZID=W. Europe Standard Time:20210212T144500 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:1 -X-MICROSOFT-CDO-APPT-SEQUENCE:1 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000919F8FC44601D701000000000000000 - 010000000C69F0D73D52D9644856FB428C86A0058 -SUMMARY:Away -DTSTART;VALUE=DATE:20210215 -DTEND;VALUE=DATE:20210220 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:OOF -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:TRUE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E0080000000053199367C4FED601000000000000000 - 0100000007A757D6743D6AC45B928616252EEFD13 -SUMMARY:Away -DTSTART;TZID=W. Europe Standard Time:20210215T133000 -DTEND;TZID=W. Europe Standard Time:20210215T150000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:OOF -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000001A5783F69306D701000000000000000 - 01000000091231B1A616E6E4C83C33C02741BCCB2 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210222T111500 -DTEND;TZID=W. Europe Standard Time:20210222T114500 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -RRULE:FREQ=WEEKLY;UNTIL=20210614T140000Z;INTERVAL=1;BYDAY=MO;WKST=SU -UID:040000008200E00074C5B7101A82E0080000000032F6CC7BC4FED601000000000000000 - 01000000059A4AC935178BE498342C66FCD96605B -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210222T160000 -DTEND;TZID=W. Europe Standard Time:20210222T170000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:1 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000005A6368804A0BD701000000000000000 - 010000000282C19D7AAC16D42A5AE2A4BA42C666D -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210225T140000 -DTEND;TZID=W. Europe Standard Time:20210225T144500 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000D0AABD9383F5D601000000000000000 - 0100000000A8335BCAA31684BA1520DCE5D660873 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210304T120000 -DTEND;TZID=W. Europe Standard Time:20210304T130000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000415891C7D211D701000000000000000 - 0100000005DECAE2F4DBDE242B2CCFD09A74DBABA -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210308T133000 -DTEND;TZID=W. Europe Standard Time:20210308T140000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000AF393EB98015D701000000000000000 - 010000000763A658A5A46CD44BE873E1C3015A606 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210311T110000 -DTEND;TZID=W. Europe Standard Time:20210311T120000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000005B85AB63FA14D701000000000000000 - 01000000004B8755F6F487641B55BB9603E985222 -SUMMARY:Free -DTSTART;TZID=W. Europe Standard Time:20210311T130000 -DTEND;TZID=W. Europe Standard Time:20210311T133000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:TRANSPARENT -STATUS:CONFIRMED -X-MICROSOFT-CDO-BUSYSTATUS:FREE -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -RRULE:FREQ=WEEKLY;UNTIL=20210527T130000Z;INTERVAL=1;BYDAY=TH;WKST=MO -UID:040000008200E00074C5B7101A82E00800000000E9C052427816D701000000000000000 - 0100000008F01F7E13E614043AD1987096D963151 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210311T150000 -DTEND;TZID=W. Europe Standard Time:20210311T153000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:1 -X-MICROSOFT-CDO-APPT-SEQUENCE:1 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:1 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000502B3C36A30ED701000000000000000 - 010000000EAF014D5A35FB14B93C6395A458BF29A -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210315T100000 -DTEND;TZID=W. Europe Standard Time:20210315T103000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000F4592894950ED701000000000000000 - 010000000A7CBC87DBBCA6943AAA7201F572B2A11 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210316T100000 -DTEND;TZID=W. Europe Standard Time:20210316T110000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E0080000000020BBAF412A17D701000000000000000 - 01000000015C7B7FD9D3C704D8A71EA1095C4144C -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210316T133000 -DTEND;TZID=W. Europe Standard Time:20210316T143000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000EAB7100F3E1BD701000000000000000 - 01000000039AC9904FB7B574CACB169DCA9A308C5 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210318T110000 -DTEND;TZID=W. Europe Standard Time:20210318T120000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:3 -X-MICROSOFT-CDO-APPT-SEQUENCE:3 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E0080000000056708658D41BD701000000000000000 - 010000000288A95567748874395EB3C35488488C4 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210318T140000 -DTEND;TZID=W. Europe Standard Time:20210318T144500 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E0080000000047612D687716D701000000000000000 - 010000000C64ADB397B7B5F46A00A2569EC5EA967 -RECURRENCE-ID;TZID=W. Europe Standard Time:20210325T110000 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210325T110000 -DTEND;TZID=W. Europe Standard Time:20210325T120000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:3 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -RRULE:FREQ=WEEKLY;UNTIL=20210520T090000Z;INTERVAL=2;BYDAY=TH;WKST=MO -UID:040000008200E00074C5B7101A82E0080000000047612D687716D701000000000000000 - 010000000C64ADB397B7B5F46A00A2569EC5EA967 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210325T110000 -DTEND;TZID=W. Europe Standard Time:20210325T120000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:1 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000E438F64A7D1AD701000000000000000 - 0100000006865BBCD6ADF3C498266727498DA68B8 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210325T130000 -DTEND;TZID=W. Europe Standard Time:20210325T134500 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000009000BFC0C820D701000000000000000 - 01000000019AB21D3295D4041B98C981AF2630F56 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210325T140000 -DTEND;TZID=W. Europe Standard Time:20210325T150000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E008000000004025612F8D21D701000000000000000 - 010000000EB5CE5C94A6D8D4DBFFEAE51936A4B0B -SUMMARY:Tentative -DTSTART;TZID=W. Europe Standard Time:20210326T203000 -DTEND;TZID=W. Europe Standard Time:20210326T213000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:TENTATIVE -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000E9C052427816D701000000000000000 - 0100000008F01F7E13E614043AD1987096D963151 -RECURRENCE-ID;TZID=W. Europe Standard Time:20210401T150000 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210401T140000 -DTEND;TZID=W. Europe Standard Time:20210401T143000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:2 -X-MICROSOFT-CDO-APPT-SEQUENCE:2 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:3 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E0080000000011605C2ACD26D701000000000000000 - 010000000F798EE164A5A0649A59CE9127B6CFC1B -SUMMARY:Away -DTSTART;TZID=W. Europe Standard Time:20210401T153000 -DTEND;TZID=W. Europe Standard Time:20210401T170000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:OOF -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E0080000000047612D687716D701000000000000000 - 010000000C64ADB397B7B5F46A00A2569EC5EA967 -RECURRENCE-ID;TZID=W. Europe Standard Time:20210408T110000 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210408T110000 -DTEND;TZID=W. Europe Standard Time:20210408T120000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:3 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000FD7292805F2CD701000000000000000 - 01000000084E6928FD699C3428C99D6027BA86275 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210408T143000 -DTEND;TZID=W. Europe Standard Time:20210408T150000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000F610DC2BDE24D701000000000000000 - 010000000F0F7E5A9202B5C4DAF526C900716D097 -SUMMARY:Away -DTSTART;VALUE=DATE:20210409 -DTEND;VALUE=DATE:20210410 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:OOF -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:TRUE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000D05779292F2DD701000000000000000 - 010000000D150442AD591AE4B86FD598B7840020D -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210412T110000 -DTEND;TZID=W. Europe Standard Time:20210412T113000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000605EA78DFF10D701000000000000000 - 010000000EAE226447A402443AF0B8B003E0E015D -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210415T120000 -DTEND;TZID=W. Europe Standard Time:20210415T130000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E0080000000047612D687716D701000000000000000 - 010000000C64ADB397B7B5F46A00A2569EC5EA967 -RECURRENCE-ID;TZID=W. Europe Standard Time:20210422T110000 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210422T110000 -DTEND;TZID=W. Europe Standard Time:20210422T120000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:3 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000E9C052427816D701000000000000000 - 0100000008F01F7E13E614043AD1987096D963151 -RECURRENCE-ID;TZID=W. Europe Standard Time:20210422T150000 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210422T144500 -DTEND;TZID=W. Europe Standard Time:20210422T151500 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:3 -X-MICROSOFT-CDO-APPT-SEQUENCE:3 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:3 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000A0167C30CF35D701000000000000000 - 010000000EFA0066ABD2B1B418293BD97F9CDBA8C -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210429T090000 -DTEND;TZID=W. Europe Standard Time:20210429T110000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:1 -X-MICROSOFT-CDO-APPT-SEQUENCE:1 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000532394E1CC3CD701000000000000000 - 0100000007DD8BEF5B4F8184EA8CEA7032E7534D7 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210429T110000 -DTEND;TZID=W. Europe Standard Time:20210429T113000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000A7CA7204D73CD701000000000000000 - 010000000BF412F30A119224B9A77AA835DF602C4 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210429T141500 -DTEND;TZID=W. Europe Standard Time:20210429T150000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -BEGIN:VEVENT -UID:040000008200E00074C5B7101A82E00800000000B0B38DC8F431D701000000000000000 - 01000000051CF385F745B294C895769D9C4C29FA1 -SUMMARY:Busy -DTSTART;TZID=W. Europe Standard Time:20210520T120000 -DTEND;TZID=W. Europe Standard Time:20210520T130000 -CLASS:PUBLIC -PRIORITY:5 -DTSTAMP:20210508T112140Z -TRANSP:OPAQUE -STATUS:CONFIRMED -SEQUENCE:0 -X-MICROSOFT-CDO-APPT-SEQUENCE:0 -X-MICROSOFT-CDO-BUSYSTATUS:BUSY -X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY -X-MICROSOFT-CDO-ALLDAYEVENT:FALSE -X-MICROSOFT-CDO-IMPORTANCE:1 -X-MICROSOFT-CDO-INSTTYPE:0 -X-MICROSOFT-DONOTFORWARDMEETING:FALSE -X-MICROSOFT-DISALLOW-COUNTER:FALSE -END:VEVENT -END:VCALENDAR From 5f45b5f44e6df66b029c9bb9bf9d8cda519d6927 Mon Sep 17 00:00:00 2001 From: Martin Eigenmann Date: Mon, 27 Dec 2021 07:07:03 +0100 Subject: [PATCH 5/9] Revert "install-with-pipenv" This reverts commit 217b8cce8a00ec1429a16bc4242c0f4a91e47b68. --- Pipfile | 21 --- Pipfile.lock | 432 --------------------------------------------------- 2 files changed, 453 deletions(-) delete mode 100644 Pipfile delete mode 100644 Pipfile.lock diff --git a/Pipfile b/Pipfile deleted file mode 100644 index 2d9943e..0000000 --- a/Pipfile +++ /dev/null @@ -1,21 +0,0 @@ -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -httplib2 = "==0.20.1" -icalendar = "==4.0.9" -python-dateutil = "==2.8.2" -pytz = "==2021.3" -DateTime = "==4.3" - -[dev-packages] -coverage = "==6.0.1" -codecov = "==2.1.12" -pytest = "==6.2.5" -black = "===21.9b0" -flake8 = "===3.7.9" - -[requires] -python_version = "3.9" diff --git a/Pipfile.lock b/Pipfile.lock deleted file mode 100644 index 6486f81..0000000 --- a/Pipfile.lock +++ /dev/null @@ -1,432 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "510a903800edf66ea6bc20e2dcde2e6f75f14713cc0566fb0f7b10dc7fe02f8b" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.9" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "datetime": { - "hashes": [ - "sha256:371dba07417b929a4fa685c2f7a3eaa6a62d60c02947831f97d4df9a9e70dfd0", - "sha256:5cef605bab8259ff61281762cdf3290e459fbf0b4719951d5fab967d5f2ea0ea" - ], - "index": "pypi", - "version": "==4.3" - }, - "httplib2": { - "hashes": [ - "sha256:0efbcb8bfbfbc11578130d87d8afcc65c2274c6eb446e59fc674e4d7c972d327", - "sha256:8fa4dbf2fbf839b71f8c7837a831e00fcdc860feca99b8bda58ceae4bc53d185" - ], - "index": "pypi", - "version": "==0.20.1" - }, - "icalendar": { - "hashes": [ - "sha256:cc73fa9c848744843046228cb66ea86cd8c18d73a51b140f7c003f760b84a997", - "sha256:cf1446ffdf1b6ad469451a8966cfa7694f5fac796ac6fc7cd93e28c51a637d2c" - ], - "index": "pypi", - "version": "==4.0.9" - }, - "pyparsing": { - "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.4.7" - }, - "python-dateutil": { - "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" - ], - "index": "pypi", - "version": "==2.8.2" - }, - "pytz": { - "hashes": [ - "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c", - "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326" - ], - "index": "pypi", - "version": "==2021.3" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.16.0" - }, - "zope.interface": { - "hashes": [ - "sha256:08f9636e99a9d5410181ba0729e0408d3d8748026ea938f3b970a0249daa8192", - "sha256:0b465ae0962d49c68aa9733ba92a001b2a0933c317780435f00be7ecb959c702", - "sha256:0cba8477e300d64a11a9789ed40ee8932b59f9ee05f85276dbb4b59acee5dd09", - "sha256:0cee5187b60ed26d56eb2960136288ce91bcf61e2a9405660d271d1f122a69a4", - "sha256:0ea1d73b7c9dcbc5080bb8aaffb776f1c68e807767069b9ccdd06f27a161914a", - "sha256:0f91b5b948686659a8e28b728ff5e74b1be6bf40cb04704453617e5f1e945ef3", - "sha256:15e7d1f7a6ee16572e21e3576d2012b2778cbacf75eb4b7400be37455f5ca8bf", - "sha256:17776ecd3a1fdd2b2cd5373e5ef8b307162f581c693575ec62e7c5399d80794c", - "sha256:194d0bcb1374ac3e1e023961610dc8f2c78a0f5f634d0c737691e215569e640d", - "sha256:1c0e316c9add0db48a5b703833881351444398b04111188069a26a61cfb4df78", - "sha256:205e40ccde0f37496904572035deea747390a8b7dc65146d30b96e2dd1359a83", - "sha256:273f158fabc5ea33cbc936da0ab3d4ba80ede5351babc4f577d768e057651531", - "sha256:2876246527c91e101184f63ccd1d716ec9c46519cc5f3d5375a3351c46467c46", - "sha256:2c98384b254b37ce50eddd55db8d381a5c53b4c10ee66e1e7fe749824f894021", - "sha256:2e5a26f16503be6c826abca904e45f1a44ff275fdb7e9d1b75c10671c26f8b94", - "sha256:334701327f37c47fa628fc8b8d28c7d7730ce7daaf4bda1efb741679c2b087fc", - "sha256:3748fac0d0f6a304e674955ab1365d515993b3a0a865e16a11ec9d86fb307f63", - "sha256:3c02411a3b62668200910090a0dff17c0b25aaa36145082a5a6adf08fa281e54", - "sha256:3dd4952748521205697bc2802e4afac5ed4b02909bb799ba1fe239f77fd4e117", - "sha256:3f24df7124c323fceb53ff6168da70dbfbae1442b4f3da439cd441681f54fe25", - "sha256:469e2407e0fe9880ac690a3666f03eb4c3c444411a5a5fddfdabc5d184a79f05", - "sha256:4de4bc9b6d35c5af65b454d3e9bc98c50eb3960d5a3762c9438df57427134b8e", - "sha256:5208ebd5152e040640518a77827bdfcc73773a15a33d6644015b763b9c9febc1", - "sha256:52de7fc6c21b419078008f697fd4103dbc763288b1406b4562554bd47514c004", - "sha256:5bb3489b4558e49ad2c5118137cfeaf59434f9737fa9c5deefc72d22c23822e2", - "sha256:5dba5f530fec3f0988d83b78cc591b58c0b6eb8431a85edd1569a0539a8a5a0e", - "sha256:5dd9ca406499444f4c8299f803d4a14edf7890ecc595c8b1c7115c2342cadc5f", - "sha256:5f931a1c21dfa7a9c573ec1f50a31135ccce84e32507c54e1ea404894c5eb96f", - "sha256:63b82bb63de7c821428d513607e84c6d97d58afd1fe2eb645030bdc185440120", - "sha256:66c0061c91b3b9cf542131148ef7ecbecb2690d48d1612ec386de9d36766058f", - "sha256:6f0c02cbb9691b7c91d5009108f975f8ffeab5dff8f26d62e21c493060eff2a1", - "sha256:71aace0c42d53abe6fc7f726c5d3b60d90f3c5c055a447950ad6ea9cec2e37d9", - "sha256:7d97a4306898b05404a0dcdc32d9709b7d8832c0c542b861d9a826301719794e", - "sha256:7df1e1c05304f26faa49fa752a8c690126cf98b40b91d54e6e9cc3b7d6ffe8b7", - "sha256:8270252effc60b9642b423189a2fe90eb6b59e87cbee54549db3f5562ff8d1b8", - "sha256:867a5ad16892bf20e6c4ea2aab1971f45645ff3102ad29bd84c86027fa99997b", - "sha256:877473e675fdcc113c138813a5dd440da0769a2d81f4d86614e5d62b69497155", - "sha256:8892f89999ffd992208754851e5a052f6b5db70a1e3f7d54b17c5211e37a98c7", - "sha256:9a9845c4c6bb56e508651f005c4aeb0404e518c6f000d5a1123ab077ab769f5c", - "sha256:a1e6e96217a0f72e2b8629e271e1b280c6fa3fe6e59fa8f6701bec14e3354325", - "sha256:a8156e6a7f5e2a0ff0c5b21d6bcb45145efece1909efcbbbf48c56f8da68221d", - "sha256:a9506a7e80bcf6eacfff7f804c0ad5350c8c95b9010e4356a4b36f5322f09abb", - "sha256:af310ec8335016b5e52cae60cda4a4f2a60a788cbb949a4fbea13d441aa5a09e", - "sha256:b0297b1e05fd128d26cc2460c810d42e205d16d76799526dfa8c8ccd50e74959", - "sha256:bf68f4b2b6683e52bec69273562df15af352e5ed25d1b6641e7efddc5951d1a7", - "sha256:d0c1bc2fa9a7285719e5678584f6b92572a5b639d0e471bb8d4b650a1a910920", - "sha256:d4d9d6c1a455d4babd320203b918ccc7fcbefe308615c521062bc2ba1aa4d26e", - "sha256:db1fa631737dab9fa0b37f3979d8d2631e348c3b4e8325d6873c2541d0ae5a48", - "sha256:dd93ea5c0c7f3e25335ab7d22a507b1dc43976e1345508f845efc573d3d779d8", - "sha256:f44e517131a98f7a76696a7b21b164bcb85291cee106a23beccce454e1f433a4", - "sha256:f7ee479e96f7ee350db1cf24afa5685a5899e2b34992fb99e1f7c1b0b758d263" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==5.4.0" - } - }, - "develop": { - "attrs": { - "hashes": [ - "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1", - "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==21.2.0" - }, - "black": { - "hashes": [ - "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115", - "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91" - ], - "index": "pypi", - "version": "===21.9b0" - }, - "certifi": { - "hashes": [ - "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872", - "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569" - ], - "version": "==2021.10.8" - }, - "charset-normalizer": { - "hashes": [ - "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0", - "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b" - ], - "markers": "python_version >= '3'", - "version": "==2.0.7" - }, - "click": { - "hashes": [ - "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3", - "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b" - ], - "markers": "python_version >= '3.6'", - "version": "==8.0.3" - }, - "codecov": { - "hashes": [ - "sha256:585dc217dc3d8185198ceb402f85d5cb5dbfa0c5f350a5abcdf9e347776a5b47", - "sha256:782a8e5352f22593cbc5427a35320b99490eb24d9dcfa2155fd99d2b75cfb635", - "sha256:a0da46bb5025426da895af90938def8ee12d37fcbcbbbc15b6dc64cf7ebc51c1" - ], - "index": "pypi", - "version": "==2.1.12" - }, - "coverage": { - "hashes": [ - "sha256:07efe1fbd72e67df026ad5109bcd216acbbd4a29d5208b3dab61779bae6b7b26", - "sha256:0898d6948b31df13391cd40568de8f35fa5901bc922c5ae05cf070587cb9c666", - "sha256:0a7e55cc9f7efa22d5cc9966276ec7a40a8803676f6ccbfdc06a486fba9aa9ee", - "sha256:17426808e8e0824f864876312d41961223bf5e503bf8f1f846735279a60ea345", - "sha256:1770d24f45f1f2daeae34cfa3b33fcb29702153544cd2ad40d58399dd4ff53b5", - "sha256:1864bdf9b2ccb43e724051bc23a1c558daf101ad4488ede1945f2a8be1facdad", - "sha256:2c5f39d1556e75fc3c4fb071f9e7cfa618895a999a0de763a541d730775d0d5f", - "sha256:3490ff6dbf3f7accf0750136ed60ae1f487bccc1f097740e3b21262bc9c89854", - "sha256:353a50f123f0185cdb7a1e1e3e2cfb9d1fd7e293cfaf68eedaf5bd8e02e3ec32", - "sha256:3edbb3ec580c73e5a264f5d04f30245bc98eff1a26765d46c5c65134f0a0e2f7", - "sha256:4eb9cd910ca8e243f930243a9940ea1a522e32435d15668445753d087c30ee12", - "sha256:5b06f4f1729e2963281d9cd6e65e6976bf27b44d4c07ac5b47223ce45f822cec", - "sha256:5b1ceacb86e0a9558061dcc6baae865ed25933ea57effea644f21657cdce19bc", - "sha256:65da6e3e8325291f012921bbf71fea0a97824e1c573981871096aac6e2cf0ec5", - "sha256:66fe33e9e0df58675e08e83fe257f89e7f625e7633ea93d0872154e09cce2724", - "sha256:6873f3f954d3e3ab8b1881f4e5307cc19f70c9f931c41048d9f7e6fd946eabe7", - "sha256:73880a80fad0597eca43e213e5e1711bf6c0fcdb7eb6b01b3b17841ebe5a7f8d", - "sha256:7600fac458f74c68b097379f76f3a6e3a630493fc7fc94b6508fedd9d498c194", - "sha256:83682b73785d2e078e0b5f63410b8125b122e1a22422640c57edd4011c950f3e", - "sha256:83faa3692e8306b20293889714fdf573d10ef5efc5843bd7c7aea6971487bd6a", - "sha256:9c416ba03844608f45661a5b48dc59c6b5e89956efe388564dd138ca8caf540b", - "sha256:9d242a2434801ef5125330deddb4cddba8990c9a49b3dec99dca17dd7eefba5a", - "sha256:a2e15ab5afbee34abf716fece80ea33ea09a82e7450512f022723b1a82ec9a4e", - "sha256:abe8207dfb8a61ded9cd830d26c1073c8218fc0ae17eb899cfe8ec0fafae6e22", - "sha256:ad7182a82843f9f85487f44567c8c688f16c906bdb8d0e44ae462aed61cb8f1b", - "sha256:b45f89a8ef65c29195f8f28dbe215f44ccb29d934f3e862d2a5c12e38698a793", - "sha256:b81a4e667c45b13658b84f9b8f1d32ef86d5405fabcbd181b76b9e51d295f397", - "sha256:c9c413c4397d4cdc7ca89286158d240ce524f9667b52c9a64dd7e13d16cf8815", - "sha256:e11cca9eb5c9b3eaad899728ee2ce916138399ee8cbbccaadc1871fecb750827", - "sha256:e66c50f0ab445fec920a9f084914ea1776a809e3016c3738519048195f851bbb", - "sha256:ea452a2d83964d08232ade470091015e7ab9b8f53acbec10f2210fbab4ce7e43", - "sha256:f398d38e6ebc2637863db1d7be3d4f9c5174e7d24bb3b0716cdb1f204669cbcf", - "sha256:f82a17f2a77958f3eef40ad385fc82d4c6ba9a77a51a174efe03ce75daebbc16" - ], - "index": "pypi", - "version": "==6.0.1" - }, - "entrypoints": { - "hashes": [ - "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19", - "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451" - ], - "markers": "python_version >= '2.7'", - "version": "==0.3" - }, - "flake8": { - "hashes": [ - "sha256:45681a117ecc81e870cbf1262835ae4af5e7a8b08e40b944a8a6e6b895914cfb", - "sha256:49356e766643ad15072a789a20915d3c91dc89fd313ccd71802303fd67e4deca" - ], - "index": "pypi", - "version": "===3.7.9" - }, - "idna": { - "hashes": [ - "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff", - "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d" - ], - "markers": "python_version >= '3'", - "version": "==3.3" - }, - "iniconfig": { - "hashes": [ - "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", - "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32" - ], - "version": "==1.1.1" - }, - "mccabe": { - "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" - ], - "version": "==0.6.1" - }, - "mypy-extensions": { - "hashes": [ - "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d", - "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8" - ], - "version": "==0.4.3" - }, - "packaging": { - "hashes": [ - "sha256:096d689d78ca690e4cd8a89568ba06d07ca097e3306a4381635073ca91479966", - "sha256:14317396d1e8cdb122989b916fa2c7e9ca8e2be9e8060a6eff75b6b7b4d8a7e0" - ], - "markers": "python_version >= '3.6'", - "version": "==21.2" - }, - "pathspec": { - "hashes": [ - "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a", - "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1" - ], - "version": "==0.9.0" - }, - "platformdirs": { - "hashes": [ - "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2", - "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d" - ], - "markers": "python_version >= '3.6'", - "version": "==2.4.0" - }, - "pluggy": { - "hashes": [ - "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", - "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" - ], - "markers": "python_version >= '3.6'", - "version": "==1.0.0" - }, - "py": { - "hashes": [ - "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", - "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.11.0" - }, - "pycodestyle": { - "hashes": [ - "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56", - "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.5.0" - }, - "pyflakes": { - "hashes": [ - "sha256:17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0", - "sha256:d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.1.1" - }, - "pyparsing": { - "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.4.7" - }, - "pytest": { - "hashes": [ - "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89", - "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134" - ], - "index": "pypi", - "version": "==6.2.5" - }, - "regex": { - "hashes": [ - "sha256:05b7d6d7e64efe309972adab77fc2af8907bb93217ec60aa9fe12a0dad35874f", - "sha256:0617383e2fe465732af4509e61648b77cbe3aee68b6ac8c0b6fe934db90be5cc", - "sha256:07856afef5ffcc052e7eccf3213317fbb94e4a5cd8177a2caa69c980657b3cb4", - "sha256:162abfd74e88001d20cb73ceaffbfe601469923e875caf9118333b1a4aaafdc4", - "sha256:2207ae4f64ad3af399e2d30dde66f0b36ae5c3129b52885f1bffc2f05ec505c8", - "sha256:30ab804ea73972049b7a2a5c62d97687d69b5a60a67adca07eb73a0ddbc9e29f", - "sha256:3b5df18db1fccd66de15aa59c41e4f853b5df7550723d26aa6cb7f40e5d9da5a", - "sha256:3c5fb32cc6077abad3bbf0323067636d93307c9fa93e072771cf9a64d1c0f3ef", - "sha256:416c5f1a188c91e3eb41e9c8787288e707f7d2ebe66e0a6563af280d9b68478f", - "sha256:432bd15d40ed835a51617521d60d0125867f7b88acf653e4ed994a1f8e4995dc", - "sha256:4aaa4e0705ef2b73dd8e36eeb4c868f80f8393f5f4d855e94025ce7ad8525f50", - "sha256:537ca6a3586931b16a85ac38c08cc48f10fc870a5b25e51794c74df843e9966d", - "sha256:53db2c6be8a2710b359bfd3d3aa17ba38f8aa72a82309a12ae99d3c0c3dcd74d", - "sha256:5537f71b6d646f7f5f340562ec4c77b6e1c915f8baae822ea0b7e46c1f09b733", - "sha256:6650f16365f1924d6014d2ea770bde8555b4a39dc9576abb95e3cd1ff0263b36", - "sha256:666abff54e474d28ff42756d94544cdfd42e2ee97065857413b72e8a2d6a6345", - "sha256:68a067c11463de2a37157930d8b153005085e42bcb7ad9ca562d77ba7d1404e0", - "sha256:780b48456a0f0ba4d390e8b5f7c661fdd218934388cde1a974010a965e200e12", - "sha256:788aef3549f1924d5c38263104dae7395bf020a42776d5ec5ea2b0d3d85d6646", - "sha256:7ee1227cf08b6716c85504aebc49ac827eb88fcc6e51564f010f11a406c0a667", - "sha256:7f301b11b9d214f83ddaf689181051e7f48905568b0c7017c04c06dfd065e244", - "sha256:83ee89483672b11f8952b158640d0c0ff02dc43d9cb1b70c1564b49abe92ce29", - "sha256:85bfa6a5413be0ee6c5c4a663668a2cad2cbecdee367630d097d7823041bdeec", - "sha256:9345b6f7ee578bad8e475129ed40123d265464c4cfead6c261fd60fc9de00bcf", - "sha256:93a5051fcf5fad72de73b96f07d30bc29665697fb8ecdfbc474f3452c78adcf4", - "sha256:962b9a917dd7ceacbe5cd424556914cb0d636001e393b43dc886ba31d2a1e449", - "sha256:98ba568e8ae26beb726aeea2273053c717641933836568c2a0278a84987b2a1a", - "sha256:a3feefd5e95871872673b08636f96b61ebef62971eab044f5124fb4dea39919d", - "sha256:b43c2b8a330a490daaef5a47ab114935002b13b3f9dc5da56d5322ff218eeadb", - "sha256:b483c9d00a565633c87abd0aaf27eb5016de23fed952e054ecc19ce32f6a9e7e", - "sha256:ba05430e819e58544e840a68b03b28b6d328aff2e41579037e8bab7653b37d83", - "sha256:ca5f18a75e1256ce07494e245cdb146f5a9267d3c702ebf9b65c7f8bd843431e", - "sha256:d5ca078bb666c4a9d1287a379fe617a6dccd18c3e8a7e6c7e1eb8974330c626a", - "sha256:da1a90c1ddb7531b1d5ff1e171b4ee61f6345119be7351104b67ff413843fe94", - "sha256:dba70f30fd81f8ce6d32ddeef37d91c8948e5d5a4c63242d16a2b2df8143aafc", - "sha256:dd33eb9bdcfbabab3459c9ee651d94c842bc8a05fabc95edf4ee0c15a072495e", - "sha256:e0538c43565ee6e703d3a7c3bdfe4037a5209250e8502c98f20fea6f5fdf2965", - "sha256:e1f54b9b4b6c53369f40028d2dd07a8c374583417ee6ec0ea304e710a20f80a0", - "sha256:e32d2a2b02ccbef10145df9135751abea1f9f076e67a4e261b05f24b94219e36", - "sha256:e71255ba42567d34a13c03968736c5d39bb4a97ce98188fafb27ce981115beec", - "sha256:ed2e07c6a26ed4bea91b897ee2b0835c21716d9a469a96c3e878dc5f8c55bb23", - "sha256:eef2afb0fd1747f33f1ee3e209bce1ed582d1896b240ccc5e2697e3275f037c7", - "sha256:f23222527b307970e383433daec128d769ff778d9b29343fb3496472dc20dabe", - "sha256:f341ee2df0999bfdf7a95e448075effe0db212a59387de1a70690e4acb03d4c6", - "sha256:f7f325be2804246a75a4f45c72d4ce80d2443ab815063cdf70ee8fb2ca59ee1b", - "sha256:f8af619e3be812a2059b212064ea7a640aff0568d972cd1b9e920837469eb3cb", - "sha256:fa8c626d6441e2d04b6ee703ef2d1e17608ad44c7cb75258c09dd42bacdfc64b", - "sha256:fbb9dc00e39f3e6c0ef48edee202f9520dafb233e8b51b06b8428cfcb92abd30", - "sha256:fff55f3ce50a3ff63ec8e2a8d3dd924f1941b250b0aac3d3d42b687eeff07a8e" - ], - "version": "==2021.11.10" - }, - "requests": { - "hashes": [ - "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24", - "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==2.26.0" - }, - "toml": { - "hashes": [ - "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", - "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.10.2" - }, - "tomli": { - "hashes": [ - "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee", - "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade" - ], - "markers": "python_version >= '3.6'", - "version": "==1.2.2" - }, - "typing-extensions": { - "hashes": [ - "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e", - "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7", - "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34" - ], - "version": "==3.10.0.2" - }, - "urllib3": { - "hashes": [ - "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece", - "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.26.7" - } - } -} From 93187a5ec6d34585c7948b3b766d77a86e3fdb20 Mon Sep 17 00:00:00 2001 From: Martin Eigenmann Date: Mon, 27 Dec 2021 07:07:17 +0100 Subject: [PATCH 6/9] Revert "remove poetry" This reverts commit beb25f134d4b3904432dce599ace01d72db90a42. --- poetry.lock | 660 +++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 26 ++ setup.cfg | 2 + 3 files changed, 688 insertions(+) create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100644 setup.cfg diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..71c0ac7 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,660 @@ +[[package]] +name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "21.2.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] + +[[package]] +name = "black" +version = "21.9b0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +click = ">=7.1.2" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0,<1" +platformdirs = ">=2" +regex = ">=2020.1.8" +tomli = ">=0.2.6,<2.0.0" +typing-extensions = [ + {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, + {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, +] + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +python2 = ["typed-ast (>=1.4.2)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "certifi" +version = "2021.10.8" +description = "Python package for providing Mozilla's CA Bundle." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "charset-normalizer" +version = "2.0.6" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "dev" +optional = false +python-versions = ">=3.5.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "click" +version = "8.0.3" +description = "Composable command line interface toolkit" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "codecov" +version = "2.1.12" +description = "Hosted coverage reports for GitHub, Bitbucket and Gitlab" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +coverage = "*" +requests = ">=2.7.9" + +[[package]] +name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "coverage" +version = "6.0.1" +description = "Code coverage measurement for Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "datetime" +version = "4.3" +description = "This package provides a DateTime data type, as known from Zope. Unless you need to communicate with Zope APIs, you're probably better off using Python's built-in datetime module." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +pytz = "*" +"zope.interface" = "*" + +[[package]] +name = "flake8" +version = "4.0.1" +description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +mccabe = ">=0.6.0,<0.7.0" +pycodestyle = ">=2.8.0,<2.9.0" +pyflakes = ">=2.4.0,<2.5.0" + +[[package]] +name = "httplib2" +version = "0.20.1" +description = "A comprehensive HTTP client library." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +pyparsing = ">=2.4.2,<3" + +[[package]] +name = "icalendar" +version = "4.0.9" +description = "iCalendar parser/generator" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +python-dateutil = "*" +pytz = "*" + +[[package]] +name = "idna" +version = "3.2" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "mccabe" +version = "0.6.1" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "packaging" +version = "21.0" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2" + +[[package]] +name = "pathspec" +version = "0.9.0" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[[package]] +name = "platformdirs" +version = "2.4.0" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] +test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "py" +version = "1.10.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pycodestyle" +version = "2.8.0" +description = "Python style guide checker" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pyflakes" +version = "2.4.0" +description = "passive checker of Python programs" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pyparsing" +version = "2.4.7" +description = "Python parsing module" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "pytest" +version = "6.2.5" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +toml = "*" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytz" +version = "2021.3" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "regex" +version = "2021.10.8" +description = "Alternative regular expression module, to replace re." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "requests" +version = "2.26.0" +description = "Python HTTP for Humans." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "tomli" +version = "1.2.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "typing-extensions" +version = "3.10.0.2" +description = "Backported and Experimental Type Hints for Python 3.5+" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "urllib3" +version = "1.26.7" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" + +[package.extras] +brotli = ["brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "zope.interface" +version = "5.4.0" +description = "Interfaces for Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.extras] +docs = ["sphinx", "repoze.sphinx.autointerface"] +test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] +testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.9" +content-hash = "4f19d83b34af680e41bde58b1ce2ac03265b32f390831545b81a07eb69cc0937" + +[metadata.files] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] +attrs = [ + {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, + {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, +] +black = [ + {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"}, + {file = "black-21.9b0.tar.gz", hash = "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"}, +] +certifi = [ + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.0.6.tar.gz", hash = "sha256:5ec46d183433dcbd0ab716f2d7f29d8dee50505b3fdb40c6b985c7c4f5a3591f"}, + {file = "charset_normalizer-2.0.6-py3-none-any.whl", hash = "sha256:5d209c0a931f215cee683b6445e2d77677e7e75e159f78def0db09d68fafcaa6"}, +] +click = [ + {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, + {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, +] +codecov = [ + {file = "codecov-2.1.12-py2.py3-none-any.whl", hash = "sha256:585dc217dc3d8185198ceb402f85d5cb5dbfa0c5f350a5abcdf9e347776a5b47"}, + {file = "codecov-2.1.12-py3.8.egg", hash = "sha256:782a8e5352f22593cbc5427a35320b99490eb24d9dcfa2155fd99d2b75cfb635"}, + {file = "codecov-2.1.12.tar.gz", hash = "sha256:a0da46bb5025426da895af90938def8ee12d37fcbcbbbc15b6dc64cf7ebc51c1"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +coverage = [ + {file = "coverage-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:abe8207dfb8a61ded9cd830d26c1073c8218fc0ae17eb899cfe8ec0fafae6e22"}, + {file = "coverage-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83faa3692e8306b20293889714fdf573d10ef5efc5843bd7c7aea6971487bd6a"}, + {file = "coverage-6.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f82a17f2a77958f3eef40ad385fc82d4c6ba9a77a51a174efe03ce75daebbc16"}, + {file = "coverage-6.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b06f4f1729e2963281d9cd6e65e6976bf27b44d4c07ac5b47223ce45f822cec"}, + {file = "coverage-6.0.1-cp310-cp310-win32.whl", hash = "sha256:7600fac458f74c68b097379f76f3a6e3a630493fc7fc94b6508fedd9d498c194"}, + {file = "coverage-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:2c5f39d1556e75fc3c4fb071f9e7cfa618895a999a0de763a541d730775d0d5f"}, + {file = "coverage-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3edbb3ec580c73e5a264f5d04f30245bc98eff1a26765d46c5c65134f0a0e2f7"}, + {file = "coverage-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea452a2d83964d08232ade470091015e7ab9b8f53acbec10f2210fbab4ce7e43"}, + {file = "coverage-6.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1770d24f45f1f2daeae34cfa3b33fcb29702153544cd2ad40d58399dd4ff53b5"}, + {file = "coverage-6.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ad7182a82843f9f85487f44567c8c688f16c906bdb8d0e44ae462aed61cb8f1b"}, + {file = "coverage-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:9d242a2434801ef5125330deddb4cddba8990c9a49b3dec99dca17dd7eefba5a"}, + {file = "coverage-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e66c50f0ab445fec920a9f084914ea1776a809e3016c3738519048195f851bbb"}, + {file = "coverage-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5b1ceacb86e0a9558061dcc6baae865ed25933ea57effea644f21657cdce19bc"}, + {file = "coverage-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e15ab5afbee34abf716fece80ea33ea09a82e7450512f022723b1a82ec9a4e"}, + {file = "coverage-6.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6873f3f954d3e3ab8b1881f4e5307cc19f70c9f931c41048d9f7e6fd946eabe7"}, + {file = "coverage-6.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0898d6948b31df13391cd40568de8f35fa5901bc922c5ae05cf070587cb9c666"}, + {file = "coverage-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9c416ba03844608f45661a5b48dc59c6b5e89956efe388564dd138ca8caf540b"}, + {file = "coverage-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:66fe33e9e0df58675e08e83fe257f89e7f625e7633ea93d0872154e09cce2724"}, + {file = "coverage-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:353a50f123f0185cdb7a1e1e3e2cfb9d1fd7e293cfaf68eedaf5bd8e02e3ec32"}, + {file = "coverage-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b81a4e667c45b13658b84f9b8f1d32ef86d5405fabcbd181b76b9e51d295f397"}, + {file = "coverage-6.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:17426808e8e0824f864876312d41961223bf5e503bf8f1f846735279a60ea345"}, + {file = "coverage-6.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e11cca9eb5c9b3eaad899728ee2ce916138399ee8cbbccaadc1871fecb750827"}, + {file = "coverage-6.0.1-cp38-cp38-win32.whl", hash = "sha256:0a7e55cc9f7efa22d5cc9966276ec7a40a8803676f6ccbfdc06a486fba9aa9ee"}, + {file = "coverage-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:4eb9cd910ca8e243f930243a9940ea1a522e32435d15668445753d087c30ee12"}, + {file = "coverage-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:83682b73785d2e078e0b5f63410b8125b122e1a22422640c57edd4011c950f3e"}, + {file = "coverage-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b45f89a8ef65c29195f8f28dbe215f44ccb29d934f3e862d2a5c12e38698a793"}, + {file = "coverage-6.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:73880a80fad0597eca43e213e5e1711bf6c0fcdb7eb6b01b3b17841ebe5a7f8d"}, + {file = "coverage-6.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f398d38e6ebc2637863db1d7be3d4f9c5174e7d24bb3b0716cdb1f204669cbcf"}, + {file = "coverage-6.0.1-cp39-cp39-win32.whl", hash = "sha256:1864bdf9b2ccb43e724051bc23a1c558daf101ad4488ede1945f2a8be1facdad"}, + {file = "coverage-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:c9c413c4397d4cdc7ca89286158d240ce524f9667b52c9a64dd7e13d16cf8815"}, + {file = "coverage-6.0.1-pp36-none-any.whl", hash = "sha256:65da6e3e8325291f012921bbf71fea0a97824e1c573981871096aac6e2cf0ec5"}, + {file = "coverage-6.0.1-pp37-none-any.whl", hash = "sha256:07efe1fbd72e67df026ad5109bcd216acbbd4a29d5208b3dab61779bae6b7b26"}, + {file = "coverage-6.0.1.tar.gz", hash = "sha256:3490ff6dbf3f7accf0750136ed60ae1f487bccc1f097740e3b21262bc9c89854"}, +] +datetime = [ + {file = "DateTime-4.3-py2.py3-none-any.whl", hash = "sha256:371dba07417b929a4fa685c2f7a3eaa6a62d60c02947831f97d4df9a9e70dfd0"}, + {file = "DateTime-4.3.tar.gz", hash = "sha256:5cef605bab8259ff61281762cdf3290e459fbf0b4719951d5fab967d5f2ea0ea"}, +] +flake8 = [ + {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, + {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, +] +httplib2 = [ + {file = "httplib2-0.20.1-py3-none-any.whl", hash = "sha256:8fa4dbf2fbf839b71f8c7837a831e00fcdc860feca99b8bda58ceae4bc53d185"}, + {file = "httplib2-0.20.1.tar.gz", hash = "sha256:0efbcb8bfbfbc11578130d87d8afcc65c2274c6eb446e59fc674e4d7c972d327"}, +] +icalendar = [ + {file = "icalendar-4.0.9-py2.py3-none-any.whl", hash = "sha256:cf1446ffdf1b6ad469451a8966cfa7694f5fac796ac6fc7cd93e28c51a637d2c"}, + {file = "icalendar-4.0.9.tar.gz", hash = "sha256:cc73fa9c848744843046228cb66ea86cd8c18d73a51b140f7c003f760b84a997"}, +] +idna = [ + {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"}, + {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +mccabe = [ + {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, + {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +packaging = [ + {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, + {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, +] +pathspec = [ + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, +] +platformdirs = [ + {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, + {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +py = [ + {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, + {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, +] +pycodestyle = [ + {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, + {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, +] +pyflakes = [ + {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, + {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, +] +pyparsing = [ + {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, + {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, +] +pytest = [ + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] +python-dateutil = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] +pytz = [ + {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, + {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, +] +regex = [ + {file = "regex-2021.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:981c786293a3115bc14c103086ae54e5ee50ca57f4c02ce7cf1b60318d1e8072"}, + {file = "regex-2021.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51feefd58ac38eb91a21921b047da8644155e5678e9066af7bcb30ee0dca7361"}, + {file = "regex-2021.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea8de658d7db5987b11097445f2b1f134400e2232cb40e614e5f7b6f5428710e"}, + {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1ce02f420a7ec3b2480fe6746d756530f69769292eca363218c2291d0b116a01"}, + {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39079ebf54156be6e6902f5c70c078f453350616cfe7bfd2dd15bdb3eac20ccc"}, + {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff24897f6b2001c38a805d53b6ae72267025878d35ea225aa24675fbff2dba7f"}, + {file = "regex-2021.10.8-cp310-cp310-win32.whl", hash = "sha256:c6569ba7b948c3d61d27f04e2b08ebee24fec9ff8e9ea154d8d1e975b175bfa7"}, + {file = "regex-2021.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:45cb0f7ff782ef51bc79e227a87e4e8f24bc68192f8de4f18aae60b1d60bc152"}, + {file = "regex-2021.10.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fab3ab8aedfb443abb36729410403f0fe7f60ad860c19a979d47fb3eb98ef820"}, + {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74e55f8d66f1b41d44bc44c891bcf2c7fad252f8f323ee86fba99d71fd1ad5e3"}, + {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d52c5e089edbdb6083391faffbe70329b804652a53c2fdca3533e99ab0580d9"}, + {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1abbd95cbe9e2467cac65c77b6abd9223df717c7ae91a628502de67c73bf6838"}, + {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9b5c215f3870aa9b011c00daeb7be7e1ae4ecd628e9beb6d7e6107e07d81287"}, + {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f540f153c4f5617bc4ba6433534f8916d96366a08797cbbe4132c37b70403e92"}, + {file = "regex-2021.10.8-cp36-cp36m-win32.whl", hash = "sha256:1f51926db492440e66c89cd2be042f2396cf91e5b05383acd7372b8cb7da373f"}, + {file = "regex-2021.10.8-cp36-cp36m-win_amd64.whl", hash = "sha256:5f55c4804797ef7381518e683249310f7f9646da271b71cb6b3552416c7894ee"}, + {file = "regex-2021.10.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb2baff66b7d2267e07ef71e17d01283b55b3cc51a81b54cc385e721ae172ba4"}, + {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e527ab1c4c7cf2643d93406c04e1d289a9d12966529381ce8163c4d2abe4faf"}, + {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c98b013273e9da5790ff6002ab326e3f81072b4616fd95f06c8fa733d2745f"}, + {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:55ef044899706c10bc0aa052f2fc2e58551e2510694d6aae13f37c50f3f6ff61"}, + {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa0ab3530a279a3b7f50f852f1bab41bc304f098350b03e30a3876b7dd89840e"}, + {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a37305eb3199d8f0d8125ec2fb143ba94ff6d6d92554c4b8d4a8435795a6eccd"}, + {file = "regex-2021.10.8-cp37-cp37m-win32.whl", hash = "sha256:2efd47704bbb016136fe34dfb74c805b1ef5c7313aef3ce6dcb5ff844299f432"}, + {file = "regex-2021.10.8-cp37-cp37m-win_amd64.whl", hash = "sha256:924079d5590979c0e961681507eb1773a142553564ccae18d36f1de7324e71ca"}, + {file = "regex-2021.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b09d3904bf312d11308d9a2867427479d277365b1617e48ad09696fa7dfcdf59"}, + {file = "regex-2021.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f125fce0a0ae4fd5c3388d369d7a7d78f185f904c90dd235f7ecf8fe13fa741"}, + {file = "regex-2021.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f199419a81c1016e0560c39773c12f0bd924c37715bffc64b97140d2c314354"}, + {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:09e1031e2059abd91177c302da392a7b6859ceda038be9e015b522a182c89e4f"}, + {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c070d5895ac6aeb665bd3cd79f673775caf8d33a0b569e98ac434617ecea57d"}, + {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:176796cb7f82a7098b0c436d6daac82f57b9101bb17b8e8119c36eecf06a60a3"}, + {file = "regex-2021.10.8-cp38-cp38-win32.whl", hash = "sha256:5e5796d2f36d3c48875514c5cd9e4325a1ca172fc6c78b469faa8ddd3d770593"}, + {file = "regex-2021.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:e4204708fa116dd03436a337e8e84261bc8051d058221ec63535c9403a1582a1"}, + {file = "regex-2021.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b8b6ee6555b6fbae578f1468b3f685cdfe7940a65675611365a7ea1f8d724991"}, + {file = "regex-2021.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973499dac63625a5ef9dfa4c791aa33a502ddb7615d992bdc89cf2cc2285daa3"}, + {file = "regex-2021.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88dc3c1acd3f0ecfde5f95c32fcb9beda709dbdf5012acdcf66acbc4794468eb"}, + {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4786dae85c1f0624ac77cb3813ed99267c9adb72e59fdc7297e1cf4d6036d493"}, + {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe6ce4f3d3c48f9f402da1ceb571548133d3322003ce01b20d960a82251695d2"}, + {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e3e2cea8f1993f476a6833ef157f5d9e8c75a59a8d8b0395a9a6887a097243b"}, + {file = "regex-2021.10.8-cp39-cp39-win32.whl", hash = "sha256:82cfb97a36b1a53de32b642482c6c46b6ce80803854445e19bc49993655ebf3b"}, + {file = "regex-2021.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:b04e512eb628ea82ed86eb31c0f7fc6842b46bf2601b66b1356a7008327f7700"}, + {file = "regex-2021.10.8.tar.gz", hash = "sha256:26895d7c9bbda5c52b3635ce5991caa90fbb1ddfac9c9ff1c7ce505e2282fb2a"}, +] +requests = [ + {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, + {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +tomli = [ + {file = "tomli-1.2.1-py3-none-any.whl", hash = "sha256:8dd0e9524d6f386271a36b41dbf6c57d8e32fd96fd22b6584679dc569d20899f"}, + {file = "tomli-1.2.1.tar.gz", hash = "sha256:a5b75cb6f3968abb47af1b40c1819dc519ea82bcc065776a866e8d74c5ca9442"}, +] +typing-extensions = [ + {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, + {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, + {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, +] +urllib3 = [ + {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, + {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, +] +"zope.interface" = [ + {file = "zope.interface-5.4.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:7df1e1c05304f26faa49fa752a8c690126cf98b40b91d54e6e9cc3b7d6ffe8b7"}, + {file = "zope.interface-5.4.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2c98384b254b37ce50eddd55db8d381a5c53b4c10ee66e1e7fe749824f894021"}, + {file = "zope.interface-5.4.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:08f9636e99a9d5410181ba0729e0408d3d8748026ea938f3b970a0249daa8192"}, + {file = "zope.interface-5.4.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0ea1d73b7c9dcbc5080bb8aaffb776f1c68e807767069b9ccdd06f27a161914a"}, + {file = "zope.interface-5.4.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:273f158fabc5ea33cbc936da0ab3d4ba80ede5351babc4f577d768e057651531"}, + {file = "zope.interface-5.4.0-cp27-cp27m-win32.whl", hash = "sha256:a1e6e96217a0f72e2b8629e271e1b280c6fa3fe6e59fa8f6701bec14e3354325"}, + {file = "zope.interface-5.4.0-cp27-cp27m-win_amd64.whl", hash = "sha256:877473e675fdcc113c138813a5dd440da0769a2d81f4d86614e5d62b69497155"}, + {file = "zope.interface-5.4.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f7ee479e96f7ee350db1cf24afa5685a5899e2b34992fb99e1f7c1b0b758d263"}, + {file = "zope.interface-5.4.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:b0297b1e05fd128d26cc2460c810d42e205d16d76799526dfa8c8ccd50e74959"}, + {file = "zope.interface-5.4.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:af310ec8335016b5e52cae60cda4a4f2a60a788cbb949a4fbea13d441aa5a09e"}, + {file = "zope.interface-5.4.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:9a9845c4c6bb56e508651f005c4aeb0404e518c6f000d5a1123ab077ab769f5c"}, + {file = "zope.interface-5.4.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0b465ae0962d49c68aa9733ba92a001b2a0933c317780435f00be7ecb959c702"}, + {file = "zope.interface-5.4.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:5dd9ca406499444f4c8299f803d4a14edf7890ecc595c8b1c7115c2342cadc5f"}, + {file = "zope.interface-5.4.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:469e2407e0fe9880ac690a3666f03eb4c3c444411a5a5fddfdabc5d184a79f05"}, + {file = "zope.interface-5.4.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:52de7fc6c21b419078008f697fd4103dbc763288b1406b4562554bd47514c004"}, + {file = "zope.interface-5.4.0-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:3dd4952748521205697bc2802e4afac5ed4b02909bb799ba1fe239f77fd4e117"}, + {file = "zope.interface-5.4.0-cp35-cp35m-win32.whl", hash = "sha256:dd93ea5c0c7f3e25335ab7d22a507b1dc43976e1345508f845efc573d3d779d8"}, + {file = "zope.interface-5.4.0-cp35-cp35m-win_amd64.whl", hash = "sha256:3748fac0d0f6a304e674955ab1365d515993b3a0a865e16a11ec9d86fb307f63"}, + {file = "zope.interface-5.4.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:66c0061c91b3b9cf542131148ef7ecbecb2690d48d1612ec386de9d36766058f"}, + {file = "zope.interface-5.4.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:d0c1bc2fa9a7285719e5678584f6b92572a5b639d0e471bb8d4b650a1a910920"}, + {file = "zope.interface-5.4.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2876246527c91e101184f63ccd1d716ec9c46519cc5f3d5375a3351c46467c46"}, + {file = "zope.interface-5.4.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:334701327f37c47fa628fc8b8d28c7d7730ce7daaf4bda1efb741679c2b087fc"}, + {file = "zope.interface-5.4.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:71aace0c42d53abe6fc7f726c5d3b60d90f3c5c055a447950ad6ea9cec2e37d9"}, + {file = "zope.interface-5.4.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:5bb3489b4558e49ad2c5118137cfeaf59434f9737fa9c5deefc72d22c23822e2"}, + {file = "zope.interface-5.4.0-cp36-cp36m-win32.whl", hash = "sha256:1c0e316c9add0db48a5b703833881351444398b04111188069a26a61cfb4df78"}, + {file = "zope.interface-5.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f0c02cbb9691b7c91d5009108f975f8ffeab5dff8f26d62e21c493060eff2a1"}, + {file = "zope.interface-5.4.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:7d97a4306898b05404a0dcdc32d9709b7d8832c0c542b861d9a826301719794e"}, + {file = "zope.interface-5.4.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:867a5ad16892bf20e6c4ea2aab1971f45645ff3102ad29bd84c86027fa99997b"}, + {file = "zope.interface-5.4.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5f931a1c21dfa7a9c573ec1f50a31135ccce84e32507c54e1ea404894c5eb96f"}, + {file = "zope.interface-5.4.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:194d0bcb1374ac3e1e023961610dc8f2c78a0f5f634d0c737691e215569e640d"}, + {file = "zope.interface-5.4.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:8270252effc60b9642b423189a2fe90eb6b59e87cbee54549db3f5562ff8d1b8"}, + {file = "zope.interface-5.4.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:15e7d1f7a6ee16572e21e3576d2012b2778cbacf75eb4b7400be37455f5ca8bf"}, + {file = "zope.interface-5.4.0-cp37-cp37m-win32.whl", hash = "sha256:8892f89999ffd992208754851e5a052f6b5db70a1e3f7d54b17c5211e37a98c7"}, + {file = "zope.interface-5.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2e5a26f16503be6c826abca904e45f1a44ff275fdb7e9d1b75c10671c26f8b94"}, + {file = "zope.interface-5.4.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:0f91b5b948686659a8e28b728ff5e74b1be6bf40cb04704453617e5f1e945ef3"}, + {file = "zope.interface-5.4.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:4de4bc9b6d35c5af65b454d3e9bc98c50eb3960d5a3762c9438df57427134b8e"}, + {file = "zope.interface-5.4.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bf68f4b2b6683e52bec69273562df15af352e5ed25d1b6641e7efddc5951d1a7"}, + {file = "zope.interface-5.4.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:63b82bb63de7c821428d513607e84c6d97d58afd1fe2eb645030bdc185440120"}, + {file = "zope.interface-5.4.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:db1fa631737dab9fa0b37f3979d8d2631e348c3b4e8325d6873c2541d0ae5a48"}, + {file = "zope.interface-5.4.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f44e517131a98f7a76696a7b21b164bcb85291cee106a23beccce454e1f433a4"}, + {file = "zope.interface-5.4.0-cp38-cp38-win32.whl", hash = "sha256:a9506a7e80bcf6eacfff7f804c0ad5350c8c95b9010e4356a4b36f5322f09abb"}, + {file = "zope.interface-5.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:3c02411a3b62668200910090a0dff17c0b25aaa36145082a5a6adf08fa281e54"}, + {file = "zope.interface-5.4.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:0cee5187b60ed26d56eb2960136288ce91bcf61e2a9405660d271d1f122a69a4"}, + {file = "zope.interface-5.4.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:a8156e6a7f5e2a0ff0c5b21d6bcb45145efece1909efcbbbf48c56f8da68221d"}, + {file = "zope.interface-5.4.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:205e40ccde0f37496904572035deea747390a8b7dc65146d30b96e2dd1359a83"}, + {file = "zope.interface-5.4.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:3f24df7124c323fceb53ff6168da70dbfbae1442b4f3da439cd441681f54fe25"}, + {file = "zope.interface-5.4.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:5208ebd5152e040640518a77827bdfcc73773a15a33d6644015b763b9c9febc1"}, + {file = "zope.interface-5.4.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:17776ecd3a1fdd2b2cd5373e5ef8b307162f581c693575ec62e7c5399d80794c"}, + {file = "zope.interface-5.4.0-cp39-cp39-win32.whl", hash = "sha256:d4d9d6c1a455d4babd320203b918ccc7fcbefe308615c521062bc2ba1aa4d26e"}, + {file = "zope.interface-5.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:0cba8477e300d64a11a9789ed40ee8932b59f9ee05f85276dbb4b59acee5dd09"}, + {file = "zope.interface-5.4.0.tar.gz", hash = "sha256:5dba5f530fec3f0988d83b78cc591b58c0b6eb8431a85edd1569a0539a8a5a0e"}, +] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..66068d0 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,26 @@ +[tool.poetry] +name = "icalevents" +version = "0.1.26" +description = "Simple Python 3 library to download, parse and query iCal sources." +authors = ["Martin Eigenmann ", "Thomas Irgang ", "Alexander Hultnér "] +license = "MIT Licence" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.9" +httplib2 = "==0.20.1" +icalendar = "4.0.9" +python-dateutil = "==2.8.2" +pytz = "==2021.3" +DateTime = "==4.3" + +[tool.poetry.dev-dependencies] +coverage = "==6.0.1" +codecov = "==2.1.12" +pytest = "==6.2.5" +black = "===21.9b0" +flake8 = "===3.7.9" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..b88034e --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[metadata] +description-file = README.md From d6bf733597194b142982798442611561085b29b6 Mon Sep 17 00:00:00 2001 From: Martin Eigenmann Date: Mon, 27 Dec 2021 07:22:37 +0100 Subject: [PATCH 7/9] ci: run pre-commit manually and apply linters --- icalevents/icalevents.py | 6 +- icalevents/icalparser.py | 163 +++++++++++++++++++++++++-------------- test/test_icalevents.py | 163 +++++++++++++++++---------------------- 3 files changed, 178 insertions(+), 154 deletions(-) diff --git a/icalevents/icalevents.py b/icalevents/icalevents.py index f6e20d1..f7f8ada 100644 --- a/icalevents/icalevents.py +++ b/icalevents/icalevents.py @@ -22,7 +22,7 @@ def events( http=None, tzinfo=None, sort=None, - strict=False + strict=False, ): """ Get all events form the given iCal URL occurring in the given time range. @@ -52,7 +52,9 @@ def events( if not content and string_content: content = ical_download.data_from_string(string_content, apple_fix=fix_apple) - found_events += parse_events(content, start=start, end=end, tzinfo=tzinfo, sort=sort, strict=strict) + found_events += parse_events( + content, start=start, end=end, tzinfo=tzinfo, sort=sort, strict=strict + ) return found_events diff --git a/icalevents/icalparser.py b/icalevents/icalparser.py index 425eaa6..5b011df 100644 --- a/icalevents/icalparser.py +++ b/icalevents/icalparser.py @@ -17,6 +17,7 @@ from uuid import uuid4 from icalendar.windows_to_olson import WINDOWS_TO_OLSON from pytz import timezone + def now(): """ Get current time. @@ -102,20 +103,19 @@ class Event: elif type(self.start) is datetime and type(other.start) is date: return self.start.date() < other.start - def __str__(self): return "%s: %s (%s)" % (self.start, self.summary, self.end - self.start) def astimezone(self, tzinfo): - + if type(self.start) is datetime: self.start = self.start.astimezone(tzinfo) - + if type(self.end) is datetime: self.end = self.end.astimezone(tzinfo) - + return self - + def copy_to(self, new_start=None, uid=None): """ Create a new event equal to this with new start date. @@ -226,7 +226,7 @@ def create_event(component, utc_default): if component.get("RECURRENCE-ID"): rid = component.get("RECURRENCE-ID").dt - + # Spec defines that if DTSTART is a date RECURRENCE-ID also is to be interpreted as a date if type(component.get("dtstart").dt) is date: event.recurrence_id = date(year=rid.year, month=rid.month, day=rid.day) @@ -258,7 +258,15 @@ def create_event(component, utc_default): return event -def parse_events(content, start=None, end=None, default_span=timedelta(days=7), tzinfo=None, sort=False, strict=False): +def parse_events( + content, + start=None, + end=None, + default_span=timedelta(days=7), + tzinfo=None, + sort=False, + strict=False, +): """ Query the events occurring in a given time range. @@ -278,13 +286,12 @@ def parse_events(content, start=None, end=None, default_span=timedelta(days=7), raise ValueError("Content is invalid!") calendar = Calendar.from_ical(content) - - + # > Will be deprecated ======================== # Calendar.from_ical already parses timezones as specified in the ical. # We can specify a 'default' tz but this is not according to spec. # Kept this here to verify tests and backward compatibility - + # Keep track of the timezones defined in the calendar timezones = {} @@ -313,9 +320,9 @@ def parse_events(content, start=None, end=None, default_span=timedelta(days=7), utc_default = True cal_tz = UTC # < ========================================== - + found = [] - + def add_if_not_exception(event): exdate = "%04d%02d%02d" % ( event.start.year, @@ -325,10 +332,10 @@ def parse_events(content, start=None, end=None, default_span=timedelta(days=7), if exdate not in exceptions: found.append(event) - - for component in calendar.walk(): + + for component in calendar.walk(): exceptions = {} - + if "EXDATE" in component: # Deal with the fact that sometimes it's a list and # sometimes it's a singleton @@ -340,19 +347,25 @@ def parse_events(content, start=None, end=None, default_span=timedelta(days=7), for ex in exlist: exdate = ex.to_ical().decode("UTF-8") exceptions[exdate[0:8]] = exdate - + if component.name == "VEVENT": e = create_event(component, utc_default) - + # make rule.between happy and provide from, to points in time that have the same format as dtstart - s = component['dtstart'].dt + s = component["dtstart"].dt if type(s) is date and not e.recurring: - f, t = date(start.year, start.month, start.day), date(end.year, end.month, end.day) + f, t = date(start.year, start.month, start.day), date( + end.year, end.month, end.day + ) elif type(s) is datetime and s.tzinfo: - f, t = datetime(start.year, start.month, start.day, tzinfo=s.tzinfo), datetime(end.year, end.month, end.day, tzinfo=s.tzinfo) + f, t = datetime( + start.year, start.month, start.day, tzinfo=s.tzinfo + ), datetime(end.year, end.month, end.day, tzinfo=s.tzinfo) else: - f, t = datetime(start.year, start.month, start.day), datetime(end.year, end.month, end.day) - + f, t = datetime(start.year, start.month, start.day), datetime( + end.year, end.month, end.day + ) + if e.recurring: rule = parse_rrule(component) for dt in rule.between(f, t, inc=True): @@ -361,18 +374,18 @@ def parse_events(content, start=None, end=None, default_span=timedelta(days=7), # recurrence has crossed over the daylight savings time boundary. if type(dt) is datetime and dt.tzinfo: dtstart = dt.replace(tzinfo=get_timezone(str(dt.tzinfo))) - ecopy = e.copy_to(dtstart.date() if type(s) is date else dtstart, e.uid) + ecopy = e.copy_to( + dtstart.date() if type(s) is date else dtstart, e.uid + ) else: ecopy = e.copy_to(dt.date() if type(s) is date else dt, e.uid) add_if_not_exception(ecopy) - + elif e.end >= f and e.start <= t: add_if_not_exception(e) - - result = found.copy() - + # Remove events that are replaced in ical for event in found: if not event.recurrence_id and (event.uid, event.start) in [ @@ -386,8 +399,22 @@ def parse_events(content, start=None, end=None, default_span=timedelta(days=7), if not strict: for event in result: if type(event.start) is date: - event.start = datetime(year=event.start.year, month=event.start.month, day=event.start.day, hour=0, minute=0, tzinfo=cal_tz) - event.end = datetime(year=event.end.year, month=event.end.month, day=event.end.day, hour=0, minute=0, tzinfo=cal_tz) + event.start = datetime( + year=event.start.year, + month=event.start.month, + day=event.start.day, + hour=0, + minute=0, + tzinfo=cal_tz, + ) + event.end = datetime( + year=event.end.year, + month=event.end.month, + day=event.end.day, + hour=0, + minute=0, + tzinfo=cal_tz, + ) elif type(event.start) is datetime: if event.start.tzinfo: event.start = event.start.astimezone(cal_tz) @@ -395,19 +422,33 @@ def parse_events(content, start=None, end=None, default_span=timedelta(days=7), else: event.start = event.start.replace(tzinfo=cal_tz) event.end = event.end.replace(tzinfo=cal_tz) - - if event.created: + + if event.created: if type(event.created) is date: - event.created = datetime(year=event.created.year, month=event.created.month, day=event.created.day, hour=0, minute=0, tzinfo=cal_tz) + event.created = datetime( + year=event.created.year, + month=event.created.month, + day=event.created.day, + hour=0, + minute=0, + tzinfo=cal_tz, + ) if type(event.created) is datetime: if event.created.tzinfo: event.created = event.created.astimezone(cal_tz) else: event.created = event.created.replace(tzinfo=cal_tz) - - if event.last_modified: + + if event.last_modified: if type(event.last_modified) is date: - event.last_modified = datetime(year=event.last_modified.year, month=event.last_modified.month, day=event.last_modified.day, hour=0, minute=0, tzinfo=cal_tz) + event.last_modified = datetime( + year=event.last_modified.year, + month=event.last_modified.month, + day=event.last_modified.day, + hour=0, + minute=0, + tzinfo=cal_tz, + ) if type(event.last_modified) is datetime: if event.last_modified.tzinfo: event.last_modified = event.last_modified.astimezone(cal_tz) @@ -417,12 +458,10 @@ def parse_events(content, start=None, end=None, default_span=timedelta(days=7), if sort: result.sort() - + if tzinfo: result = [event.astimezone(tzinfo) for event in result] - - return result @@ -435,43 +474,51 @@ def parse_rrule(component): :param component: icalendar component :return: extracted rrule or rruleset or None """ - + if not component.get("rrule"): return None - + dtstart = component.get("dtstart").dt - + # component['rrule'] can be both a scalar and a list rrules = component.get("rrule") if not isinstance(rrules, list): rrules = [rrules] - + def conform_until(until, dtstart): if type(dtstart) is datetime: - return (until.astimezone(UTC) if type(until) is datetime else datetime(year=until.year, month=until.month, day=until.day, tzinfo=UTC)) + dtstart.tzinfo.utcoffset(dtstart) + return ( + until.astimezone(UTC) + if type(until) is datetime + else datetime( + year=until.year, month=until.month, day=until.day, tzinfo=UTC + ) + ) + dtstart.tzinfo.utcoffset(dtstart) elif type(dtstart) is date: - return until.date() + timedelta(days=1) if type(until) is datetime else until - + return ( + until.date() + timedelta(days=1) if type(until) is datetime else until + ) + for index, rru in enumerate(rrules): if "UNTIL" in rru: rrules[index]["UNTIL"] = [ conform_until(until, dtstart) for until in rrules[index]["UNTIL"] ] - + rule = rrulestr( - "\n".join(x.to_ical().decode() for x in rrules), - dtstart=dtstart, - forceset=True, - unfold=True, - ) - + "\n".join(x.to_ical().decode() for x in rrules), + dtstart=dtstart, + forceset=True, + unfold=True, + ) + if component.get("exdate"): # Add exdates to the rruleset for exd in extract_exdates(component): if type(dtstart) is date: if exd.tzinfo: rule.exdate(exd.replace(tzinfo=None)) - #rule.exdate(datetime(year=exd.year, month=exd.month, day=exd.day) + timedelta(days=1)) + # rule.exdate(datetime(year=exd.year, month=exd.month, day=exd.day) + timedelta(days=1)) else: rule.exdate(exd) else: @@ -479,12 +526,12 @@ def parse_rrule(component): # TODO: What about rdates and exrules? if component.get("exrule"): - #pass - print('exrule', component.get("exrule")) + # pass + print("exrule", component.get("exrule")) if component.get("rdate"): - #pass - print('rdate', component.get("rdate")) + # pass + print("rdate", component.get("rdate")) return rule @@ -511,4 +558,4 @@ def get_timezone(tz_name): if tz_name in WINDOWS_TO_OLSON: return gettz(WINDOWS_TO_OLSON[tz_name]) else: - return gettz(tz_name) \ No newline at end of file + return gettz(tz_name) diff --git a/test/test_icalevents.py b/test/test_icalevents.py index a6b52bf..aa04587 100644 --- a/test/test_icalevents.py +++ b/test/test_icalevents.py @@ -288,7 +288,6 @@ class ICalEventsTests(unittest.TestCase): self.assertTrue(icalevents.all_done(key), "request is finished") self.assertEqual(len(icalevents.latest_events(key)), 2, "two events are found") - def test_events_no_description(self): ical = "test/test_data/no_description.ics" start = date(2018, 10, 15) @@ -368,7 +367,7 @@ class ICalEventsTests(unittest.TestCase): evs = icalevents.events(file=ical, start=start, end=end, sort=True) self.assertEqual(len(evs), 42, "42 events in total - one was moved") - + def test_recurence_id_ms_moved(self): ical = "test/test_data/recurrenceid_ms.ics" start = date(2021, 4, 8) @@ -395,9 +394,7 @@ class ICalEventsTests(unittest.TestCase): evs = icalevents.events(file=ical, start=start, end=end) - self.assertEqual( - len(evs), 239, "239 events in total" - ) + self.assertEqual(len(evs), 239, "239 events in total") def test_cest_2021_02(self): ical = "test/test_data/cest.ics" @@ -406,7 +403,7 @@ class ICalEventsTests(unittest.TestCase): evs = icalevents.events(file=ical, start=start, end=end) self.assertEqual(len(evs), 17, "17 in february") - + def test_cest_2021_03(self): ical = "test/test_data/cest.ics" start = date(2021, 3, 1) @@ -419,62 +416,53 @@ class ICalEventsTests(unittest.TestCase): ical = "test/test_data/cest.ics" start = date(2021, 4, 1) end = date(2021, 5, 1) - - tz = gettz('Europe/Zurich') - events = icalevents.events(file=ical, start=start, end=end, tzinfo=tz, sort=True, strict=True) - + + tz = gettz("Europe/Zurich") + events = icalevents.events( + file=ical, start=start, end=end, tzinfo=tz, sort=True, strict=True + ) + times = [ ((2021, 4, 1, 14, 0), (2021, 4, 1, 14, 30)), ((2021, 4, 1, 15, 30), (2021, 4, 1, 17, 0)), - ((2021, 4, 2), (2021, 4, 3)), - ((2021, 4, 5, 16, 00), (2021, 4, 5, 17, 0)), - ((2021, 4, 7), (2021, 4, 8)), - ((2021, 4, 8, 11, 0), (2021, 4, 8, 12, 0)), ((2021, 4, 8, 14, 30), (2021, 4, 8, 15, 0)), ((2021, 4, 8, 15, 0), (2021, 4, 8, 15, 30)), - ((2021, 4, 9), (2021, 4, 10)), - #((2021, 4, 9), (2021, 4, 10)), # Google said this should exist, microsoft disagrees - + # ((2021, 4, 9), (2021, 4, 10)), # Google said this should exist, microsoft disagrees ((2021, 4, 12, 11, 0), (2021, 4, 12, 11, 30)), ((2021, 4, 12, 16, 0), (2021, 4, 12, 17, 0)), - ((2021, 4, 14), (2021, 4, 15)), - ((2021, 4, 15, 12, 0), (2021, 4, 15, 13, 0)), ((2021, 4, 15, 15, 0), (2021, 4, 15, 15, 30)), - ((2021, 4, 16), (2021, 4, 17)), - ((2021, 4, 19, 16, 0), (2021, 4, 19, 17, 0)), - ((2021, 4, 21), (2021, 4, 22)), - ((2021, 4, 22, 11, 0), (2021, 4, 22, 12, 0)), ((2021, 4, 22, 14, 45), (2021, 4, 22, 15, 15)), - ((2021, 4, 23), (2021, 4, 24)), - ((2021, 4, 26, 16, 0), (2021, 4, 26, 17, 0)), - ((2021, 4, 28), (2021, 4, 29)), - ((2021, 4, 29, 9, 0), (2021, 4, 29, 11, 0)), ((2021, 4, 29, 11, 0), (2021, 4, 29, 11, 30)), ((2021, 4, 29, 14, 15), (2021, 4, 29, 15, 00)), ((2021, 4, 29, 15, 0), (2021, 4, 29, 15, 30)), - ((2021, 4, 30), (2021, 5, 1)), ] - + for index, time in enumerate(times): - self.assertEqual(events[index].start, date(*time[0]) if len(time[0]) == 3 else datetime(*time[0], tzinfo=tz)) - self.assertEqual(events[index].end, date(*time[1]) if len(time[1]) == 3 else datetime(*time[1], tzinfo=tz)) - + self.assertEqual( + events[index].start, + date(*time[0]) if len(time[0]) == 3 else datetime(*time[0], tzinfo=tz), + ) + self.assertEqual( + events[index].end, + date(*time[1]) if len(time[1]) == 3 else datetime(*time[1], tzinfo=tz), + ) + self.assertEqual(len(events), len(times)) def test_cest_2021_05(self): @@ -482,52 +470,44 @@ class ICalEventsTests(unittest.TestCase): start = date(2021, 5, 1) end = date(2021, 6, 1) - tz = gettz('Europe/Zurich') - events = icalevents.events(file=ical, start=start, end=end, tzinfo=tz, sort=True, strict=True) - + tz = gettz("Europe/Zurich") + events = icalevents.events( + file=ical, start=start, end=end, tzinfo=tz, sort=True, strict=True + ) + times = [ ((2021, 5, 3, 16, 0), (2021, 5, 3, 17, 0)), - ((2021, 5, 5), (2021, 5, 6)), - ((2021, 5, 6, 11, 0), (2021, 5, 6, 12, 0)), ((2021, 5, 6, 15, 0), (2021, 5, 6, 15, 30)), - ((2021, 5, 7), (2021, 5, 8)), - ((2021, 5, 10, 16, 0), (2021, 5, 10, 17, 0)), - ((2021, 5, 12), (2021, 5, 13)), - ((2021, 5, 13, 15, 0), (2021, 5, 13, 15, 30)), - ((2021, 5, 14), (2021, 5, 15)), - ((2021, 5, 17, 16, 0), (2021, 5, 17, 17, 0)), - ((2021, 5, 19), (2021, 5, 20)), - ((2021, 5, 20, 11, 0), (2021, 5, 20, 12, 0)), ((2021, 5, 20, 12, 0), (2021, 5, 20, 13, 0)), ((2021, 5, 20, 15, 0), (2021, 5, 20, 15, 30)), - ((2021, 5, 21), (2021, 5, 22)), - ((2021, 5, 24, 16, 0), (2021, 5, 24, 17, 0)), - ((2021, 5, 26), (2021, 5, 27)), - ((2021, 5, 27, 15, 0), (2021, 5, 27, 15, 30)), - ((2021, 5, 28), (2021, 5, 29)), - ((2021, 5, 31, 16, 0), (2021, 5, 31, 17, 0)), ] - + for index, time in enumerate(times): - self.assertEqual(events[index].start, date(*time[0]) if len(time[0]) == 3 else datetime(*time[0], tzinfo=tz)) - self.assertEqual(events[index].end, date(*time[1]) if len(time[1]) == 3 else datetime(*time[1], tzinfo=tz)) - + self.assertEqual( + events[index].start, + date(*time[0]) if len(time[0]) == 3 else datetime(*time[0], tzinfo=tz), + ) + self.assertEqual( + events[index].end, + date(*time[1]) if len(time[1]) == 3 else datetime(*time[1], tzinfo=tz), + ) + self.assertEqual(len(events), len(times)) def test_cest_2021_06(self): @@ -537,7 +517,7 @@ class ICalEventsTests(unittest.TestCase): evs = icalevents.events(file=ical, start=start, end=end) self.assertEqual(len(evs), 11, "11 in june") - + def test_cest_2021_07(self): ical = "test/test_data/cest.ics" start = date(2021, 7, 1) @@ -545,7 +525,7 @@ class ICalEventsTests(unittest.TestCase): evs = icalevents.events(file=ical, start=start, end=end) self.assertEqual(len(evs), 1, "1 in july") - + def test_cest_1(self): ical = "test/test_data/cest_every_day_for_one_year.ics" start = date(2020, 1, 1) @@ -706,98 +686,93 @@ class ICalEventsTests(unittest.TestCase): start = date(2021, 8, 30) end = date(2021, 9, 18) - tz = gettz('Europe/Zurich') - events = icalevents.events(file=ical, start=start, end=end, tzinfo=tz, sort=True, strict=True) - + tz = gettz("Europe/Zurich") + events = icalevents.events( + file=ical, start=start, end=end, tzinfo=tz, sort=True, strict=True + ) + times = [ ((2021, 8, 30, 8, 0), (2021, 8, 30, 17, 0)), ((2021, 8, 30, 9, 30), (2021, 8, 30, 10, 0)), - ((2021, 8, 31, 10, 0), (2021, 8, 31, 10, 30)), ((2021, 8, 31, 10, 15), (2021, 8, 31, 10, 45)), ((2021, 8, 31, 13, 15), (2021, 8, 31, 14, 0)), - ((2021, 9, 1, 9, 0), (2021, 9, 1, 10, 0)), ((2021, 9, 1, 9, 30), (2021, 9, 1, 10, 0)), ((2021, 9, 1, 12, 0), (2021, 9, 1, 13, 0)), - ((2021, 9, 2, 10, 0), (2021, 9, 2, 10, 30)), - ((2021, 9, 3, 8, 0), (2021, 9, 3, 8, 30)), ((2021, 9, 3, 9, 0), (2021, 9, 3, 9, 30)), ((2021, 9, 3, 9, 30), (2021, 9, 3, 10, 0)), ((2021, 9, 3, 15, 30), (2021, 9, 3, 16, 0)), ((2021, 9, 3, 17, 30), (2021, 9, 3, 19, 0)), - ((2021, 9, 6, 8, 0), (2021, 9, 6, 17, 0)), ((2021, 9, 6, 9, 30), (2021, 9, 6, 10, 0)), - ((2021, 9, 7, 9, 0), (2021, 9, 7, 12, 0)), ((2021, 9, 7, 9, 0), (2021, 9, 7, 12, 0)), ((2021, 9, 7, 10, 0), (2021, 9, 7, 10, 30)), - ((2021, 9, 8, 9, 30), (2021, 9, 8, 10, 0)), ((2021, 9, 8, 12, 0), (2021, 9, 8, 13, 0)), - ((2021, 9, 9), (2021, 9, 10)), ((2021, 9, 9, 10, 0), (2021, 9, 9, 10, 30)), ((2021, 9, 9, 11, 0), (2021, 9, 9, 12, 0)), - ((2021, 9, 10, 8, 0), (2021, 9, 10, 8, 30)), ((2021, 9, 10, 9, 30), (2021, 9, 10, 10, 0)), ((2021, 9, 10, 17, 30), (2021, 9, 10, 19, 0)), - ((2021, 9, 13, 9, 30), (2021, 9, 13, 10, 0)), - ((2021, 9, 14, 9, 0), (2021, 9, 14, 10, 0)), ((2021, 9, 14, 10, 0), (2021, 9, 14, 10, 30)), ((2021, 9, 14, 15, 0), (2021, 9, 14, 15, 30)), - ((2021, 9, 15, 9, 30), (2021, 9, 15, 10, 0)), - ((2021, 9, 16, 10, 0), (2021, 9, 16, 10, 30)), ((2021, 9, 16), (2021, 9, 17)), - ((2021, 9, 17, 9, 30), (2021, 9, 17, 10, 0)), ((2021, 9, 17, 17, 30), (2021, 9, 17, 19, 0)), ] - + for index, time in enumerate(times): - self.assertEqual(events[index].start, date(*time[0]) if len(time[0]) == 3 else datetime(*time[0], tzinfo=tz)) - self.assertEqual(events[index].end, date(*time[1]) if len(time[1]) == 3 else datetime(*time[1], tzinfo=tz)) - + self.assertEqual( + events[index].start, + date(*time[0]) if len(time[0]) == 3 else datetime(*time[0], tzinfo=tz), + ) + self.assertEqual( + events[index].end, + date(*time[1]) if len(time[1]) == 3 else datetime(*time[1], tzinfo=tz), + ) + self.assertEqual(len(events), len(times)) - + def test_recurring_tz_passover_spring(self): ical = "test/test_data/recurring_override.ics" start = date(2022, 3, 6) end = date(2022, 4, 10) - tz = gettz('Europe/Zurich') - events = icalevents.events(file=ical, start=start, end=end, tzinfo=tz, sort=True, strict=True) - + tz = gettz("Europe/Zurich") + events = icalevents.events( + file=ical, start=start, end=end, tzinfo=tz, sort=True, strict=True + ) + times = [ ((2022, 3, 8, 11, 45), (2022, 3, 8, 12, 0)), - ((2022, 3, 10), (2022, 3, 11)), ((2022, 3, 10, 11, 0), (2022, 3, 10, 12, 0)), - ((2022, 3, 15, 11, 45), (2022, 3, 15, 12, 0)), - ((2022, 3, 22, 11, 45), (2022, 3, 22, 12, 0)), ((2022, 3, 22, 14, 00), (2022, 3, 22, 15, 0)), - ((2022, 3, 24), (2022, 3, 25)), - ((2022, 3, 29, 11, 45), (2022, 3, 29, 12, 0)), - ((2022, 4, 3, 8, 0), (2022, 4, 3, 8, 30)), - ((2022, 4, 7), (2022, 4, 8)), ] - + for index, time in enumerate(times): - self.assertEqual(events[index].start, date(*time[0]) if len(time[0]) == 3 else datetime(*time[0], tzinfo=tz)) - self.assertEqual(events[index].end, date(*time[1]) if len(time[1]) == 3 else datetime(*time[1], tzinfo=tz)) - - self.assertEqual(len(events), len(times)) \ No newline at end of file + self.assertEqual( + events[index].start, + date(*time[0]) if len(time[0]) == 3 else datetime(*time[0], tzinfo=tz), + ) + self.assertEqual( + events[index].end, + date(*time[1]) if len(time[1]) == 3 else datetime(*time[1], tzinfo=tz), + ) + + self.assertEqual(len(events), len(times)) From 00f339223046ccfff6c71d6bfd877af556a364a2 Mon Sep 17 00:00:00 2001 From: Martin Eigenmann Date: Sun, 18 Dec 2022 12:00:51 +0100 Subject: [PATCH 8/9] fix: allows until to be defined as datetime with timezone. Shamelessly copied code from @mbafford: https://github.com/jazzband/icalevents/pull/109/files --- icalevents/icalparser.py | 24 ++++++++-- test/test_data/multi_exdate_same_line_ms.ics | 47 ++++++++++++++++++++ test/test_icalevents.py | 19 ++++++++ 3 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 test/test_data/multi_exdate_same_line_ms.ics diff --git a/icalevents/icalparser.py b/icalevents/icalparser.py index fcff72c..32fb17d 100644 --- a/icalevents/icalparser.py +++ b/icalevents/icalparser.py @@ -340,7 +340,9 @@ def parse_events( # Deal with the fact that sometimes it's a list and # sometimes it's a singleton exlist = [] - if isinstance(component["EXDATE"], list): + if isinstance(component["EXDATE"], vDDDLists): + exlist = component["EXDATE"].dts + elif isinstance(component["EXDATE"], list): exlist = component["EXDATE"] else: exlist.append(component["EXDATE"]) @@ -487,13 +489,29 @@ def parse_rrule(component): def conform_until(until, dtstart): if type(dtstart) is datetime: - return ( + # If we have timezone defined adjust for daylight saving time + if type(until) is datetime: + until_offset = ( + until.astimezone(dtstart.tzinfo).utcoffset() + if until.tzinfo is not None and dtstart.tzinfo is not None + else None + ) + if until_offset is not None: + return until + abs(until_offset) + + offset = dtstart.tzinfo.utcoffset(dtstart) if dtstart.tzinfo else None + normalized_until = ( until.astimezone(UTC) if type(until) is datetime else datetime( year=until.year, month=until.month, day=until.day, tzinfo=UTC ) - ) + dtstart.tzinfo.utcoffset(dtstart) + ) + if offset: + return normalized_until + offset + + return normalized_until + elif type(dtstart) is date: return ( until.date() + timedelta(days=1) if type(until) is datetime else until diff --git a/test/test_data/multi_exdate_same_line_ms.ics b/test/test_data/multi_exdate_same_line_ms.ics new file mode 100644 index 0000000..f3808e6 --- /dev/null +++ b/test/test_data/multi_exdate_same_line_ms.ics @@ -0,0 +1,47 @@ +BEGIN:VCALENDAR +METHOD:PUBLISH +PRODID:Microsoft Exchange Server 2010 +VERSION:2.0 +X-WR-CALNAME:Calendar +BEGIN:VTIMEZONE +TZID:Eastern Standard Time +BEGIN:STANDARD +DTSTART:16010101T020000 +TZOFFSETFROM:-0400 +TZOFFSETTO:-0500 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11 +END:STANDARD +BEGIN:DAYLIGHT +DTSTART:16010101T020000 +TZOFFSETFROM:-0500 +TZOFFSETTO:-0400 +RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=3 +END:DAYLIGHT +END:VTIMEZONE +BEGIN:VEVENT +DESCRIPTION:Test event that has an RRULE with multiple EXDATE +RRULE:FREQ=WEEKLY;UNTIL=20220429T150000Z;INTERVAL=1;BYDAY=FR;WKST=MO +EXDATE;TZID=Eastern Standard Time:20220318T110000,20220401T110000,20220408T + 110000 +UID:040000008200R00074P5O7101N82R00800000000R0Q793689428Q801000000000000000 + 010000000QOPN4SS024R0264S9P0Q7OOQQ16PN399 +SUMMARY:Recurring With Exclusions +DTSTART;TZID=Eastern Standard Time:20220311T110000 +DTEND;TZID=Eastern Standard Time:20220311T113000 +CLASS:PUBLIC +PRIORITY:5 +DTSTAMP:20220330T125447Z +TRANSP:OPAQUE +STATUS:CONFIRMED +SEQUENCE:0 +LOCATION:Microsoft Teams Meeting +X-MICROSOFT-CDO-APPT-SEQUENCE:0 +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY +X-MICROSOFT-CDO-ALLDAYEVENT:FALSE +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-CDO-INSTTYPE:1 +X-MICROSOFT-DONOTFORWARDMEETING:FALSE +X-MICROSOFT-DISALLOW-COUNTER:FALSE +END:VEVENT +END:VCALENDAR diff --git a/test/test_icalevents.py b/test/test_icalevents.py index bc4ed5f..8a899f9 100644 --- a/test/test_icalevents.py +++ b/test/test_icalevents.py @@ -776,3 +776,22 @@ class ICalEventsTests(unittest.TestCase): ) self.assertEqual(len(events), len(times)) + + def test_multi_exdate_same_line(self): + ical = "test/test_data/multi_exdate_same_line_ms.ics" + tz = gettz("America/New_York") + start = date(2022, 3, 1) + end = date(2022, 5, 1) + + evs = icalevents.events(file=ical, start=start, end=end) + + # parsing starts at 2022-03-01 + self.assertEqual(evs[0].start, datetime(2022, 3, 11, 11, 0, 0, tzinfo=tz)) + # 2022-03-18 is excluded by EXDATE rule + self.assertEqual(evs[1].start, datetime(2022, 3, 25, 11, 0, 0, tzinfo=tz)) + # 2022-04-01 is excluded by EXDATE rule + # 2022-04-08 is excluded by EXDATE rule + self.assertEqual(evs[2].start, datetime(2022, 4, 15, 11, 0, 0, tzinfo=tz)) + self.assertEqual(evs[3].start, datetime(2022, 4, 22, 11, 0, 0, tzinfo=tz)) + self.assertEqual(evs[4].start, datetime(2022, 4, 29, 11, 0, 0, tzinfo=tz)) + # parsing stops at 2022-05-01 From 53817ccd88084ac70ef48813fea761d84bbaf1a4 Mon Sep 17 00:00:00 2001 From: Martin Eigenmann Date: Sun, 18 Dec 2022 12:20:50 +0100 Subject: [PATCH 9/9] chore: cleanup mr --- icalevents/icalparser.py | 59 +++++++++++++++------------------------- 1 file changed, 22 insertions(+), 37 deletions(-) diff --git a/icalevents/icalparser.py b/icalevents/icalparser.py index 32fb17d..ffae683 100644 --- a/icalevents/icalparser.py +++ b/icalevents/icalparser.py @@ -342,10 +342,8 @@ def parse_events( exlist = [] if isinstance(component["EXDATE"], vDDDLists): exlist = component["EXDATE"].dts - elif isinstance(component["EXDATE"], list): - exlist = component["EXDATE"] else: - exlist.append(component["EXDATE"]) + exlist = component["EXDATE"] for ex in exlist: exdate = ex.to_ical().decode("UTF-8") exceptions[exdate[0:8]] = exdate @@ -477,9 +475,6 @@ def parse_rrule(component): :return: extracted rrule or rruleset or None """ - if not component.get("rrule"): - return None - dtstart = component.get("dtstart").dt # component['rrule'] can be both a scalar and a list @@ -491,31 +486,27 @@ def parse_rrule(component): if type(dtstart) is datetime: # If we have timezone defined adjust for daylight saving time if type(until) is datetime: - until_offset = ( - until.astimezone(dtstart.tzinfo).utcoffset() - if until.tzinfo is not None and dtstart.tzinfo is not None - else None + return until + abs( + ( + until.astimezone(dtstart.tzinfo).utcoffset() + if until.tzinfo is not None and dtstart.tzinfo is not None + else None + ) + or timedelta() ) - if until_offset is not None: - return until + abs(until_offset) - offset = dtstart.tzinfo.utcoffset(dtstart) if dtstart.tzinfo else None - normalized_until = ( + return ( until.astimezone(UTC) if type(until) is datetime else datetime( year=until.year, month=until.month, day=until.day, tzinfo=UTC ) + ) + ( + (dtstart.tzinfo.utcoffset(dtstart) if dtstart.tzinfo else None) + or timedelta() ) - if offset: - return normalized_until + offset - return normalized_until - - elif type(dtstart) is date: - return ( - until.date() + timedelta(days=1) if type(until) is datetime else until - ) + return until.date() + timedelta(days=1) if type(until) is datetime else until for index, rru in enumerate(rrules): if "UNTIL" in rru: @@ -534,22 +525,16 @@ def parse_rrule(component): # Add exdates to the rruleset for exd in extract_exdates(component): if type(dtstart) is date: - if exd.tzinfo: - rule.exdate(exd.replace(tzinfo=None)) - # rule.exdate(datetime(year=exd.year, month=exd.month, day=exd.day) + timedelta(days=1)) - else: - rule.exdate(exd) + rule.exdate(exd.replace(tzinfo=None)) else: rule.exdate(exd) # TODO: What about rdates and exrules? if component.get("exrule"): - # pass - print("exrule", component.get("exrule")) + pass if component.get("rdate"): - # pass - print("rdate", component.get("rdate")) + pass return rule @@ -562,12 +547,12 @@ def extract_exdates(component): :return: list of exception dates """ dates = [] - if exd_prop := component.get("exdate"): - if isinstance(exd_prop, list): - for exd_list in exd_prop: - dates.extend(exd.dt for exd in exd_list.dts) - elif isinstance(exd_prop, vDDDLists): - dates.extend(exd.dt for exd in exd_prop.dts) + exd_prop = component.get("exdate") + if isinstance(exd_prop, list): + for exd_list in exd_prop: + dates.extend(exd.dt for exd in exd_list.dts) + else: # it must be a vDDDLists + dates.extend(exd.dt for exd in exd_prop.dts) return dates