一个用于将使用X-WR-TIMEZONE的日历转换为标准日历的Python模块和程序。
项目描述
一些日历提供商在ICS日历文件中引入了非标准的X-WR-TIMEZONE参数。根据RFC 5545的严格解释忽略了X-WR-TIMEZONE参数。这导致事件的时问与使用X-WR-TIMEZONE的时问不同。
此模块旨在通过将使用X-WR-TIMEZONE的日历转换为严格的RFC 5545日历来弥合差距。因此,让我们齐心协力,为每个人解决这个问题!
该模块的一些功能包括
使用Python的pip轻松安装。
命令行转换日历。
使用 wget 或 curl 管道传输日历文件。
一些要求包括:
没有 X-WR-TIMEZONE 的日历保持不变。
将日历传递给此模块两次不会改变它们。
安装
使用 pip 安装
python3 -m pip install x-wr-timezone
使用 apt 安装
sudo apt-get install python-x-wr-timezone
支持
命令行使用方法
您可以使用命令行界面标准化日历。以下示例假设 in.ics 是一个可能使用 X-WR-TIMEZONE 的日历,而 out.ics 则不需要 X-WR-TIMEZONE 才能正确显示。
cat in.is | x-wr-timezone > out.ics
x-wr-timezone in.ics out.ics
curl https://example.org/in.ics | x-wr-timezone > out.ics
wget -O- https://example.org/in.ics | x-wr-timezone > out.ics
您可以在命令行上获取使用帮助
x-wr-timezone --help
Python
安装库后,您可以导入它。
import x_wr_timezone
函数 to_standard() 转换 icalendar 对象。
x_wr_timezone.to_standard(an_icalendar)
以下是一个完整的示例,其功能几乎与该模块应有的功能相同
import icalendar # installed with x_wr_timezone
import x_wr_timezone
with open("in.ics", 'rb') as file:
calendar = icalendar.from_ical(file.read())
new_calendar = x_wr_timezone.to_standard(calendar)
# you could use the new_calendar variable now
with open('out.ics', 'wb') as file:
file.write(new_calendar.to_ical())
to_standard(calendar, timezone=None) 有以下参数
calendar 是 icalendar.Calendar 对象。
timezone 是一个可选时区。默认情况下,使用 calendar['X-WR-TIMEZONE'] 中的时区来检查日历是否需要更改。但是,如果 timezone 不是 None,则不会检查 calendar['X-WR-TIMEZONE'],并且假设 calendar 应该像 calendar['X-WR-TIMEZONE'] 有 timezone 的值一样进行更改。这不会添加或更改 calendar['X-WR-TIMEZONE'] 的值。您需要自己这样做。 timezone 可以是一个如 "UTC" 或 "Europe/Berlin" 的字符串,或一个 pytz.timezone 或 datetime 接受的时区。
返回值:不修改任何 calendar 参数。返回的日历仅更改和复制其属性和子组件,以返回正确的值。因此,返回的日历可能与作为 calendar 参数传递的日历相同。如果您修改返回值,请记住这一点。
开发
克隆 存储库 或其分支,然后 cd x-wr-timezone。
可选:安装 virtualenv 和 Python3 并创建虚拟环境
pip install virtualenv virtualenv -p python3 ENV source ENV/bin/activate # you need to do this for each shell
安装软件包和此模块,以便可以编辑
pip install -r test-requirements.txt -e .
运行测试
pytest
测试所有函数
pytest --x-wr-timezone all
使用 tox 进行测试
您可以使用 tox 在不同的 Python 版本中测试软件包。
tox
这测试了所有不同的功能
tox -- --x-wr-timezone all
新版本
发布新版本时,
编辑更改日志部分
编辑 setup.py,编辑 __version__ 变量
创建提交并推送
等待 CI 测试 完成构建。
运行
python3 setup.py tag_and_deploy
通知有关其发布的问题
测试
本项目的开发由测试驱动。测试确保接口的一致性,并减少随时间推移而丢失的知识。如果您想更改代码,测试有助于确保将来不会出现错误。从这个意义上说,它们是必需的。示例代码和ics文件可以转换为测试,从而加快修复错误的速度。
您可以在测试文件夹中查看测试。如果您有一个ics日历文件,该库没有生成所需的输出,您可以将其添加到test/calendars文件夹,并编写期望的测试。如果您愿意,可以先打开一个问题,例如讨论更改和如何进行更改。
变更日志
v1.0.0
使用zoneinfo代替pytz
测试与pytz和zoneinfo的兼容性,作为to_standard的参数
移除pytz作为依赖项
添加tzdata作为依赖项
添加类型提示
更新Python版本
v0.0.7
将master分支重命名为main
使用正确的SPDX许可证ID
测试Python 3.12
v0.0.6
弃用Python 3.7
支持Python 3.11
修复pytz的本地化问题,当datetime没有时区时
在GitHub Actions上运行测试
测试需要icalendar 5.0.11
修复datetime不在UTC且没有时区时的pytz本地化问题。
v0.0.5
重新审视README和CLI并修复拼写错误。
修改行为以处理在日历中使用X-WR-TIMEZONE属性找到的无时区事件,请参阅拉取请求7
v0.0.4
测试使用Gitlab CI的自动部署。
v0.0.3
使用datetime的tzname()函数来测试UTC。这有助于支持zoneinfo时区。
拆分访客类并将其重命名为walker。
v0.0.2
实现timezone参数。
不要修改calendar参数的值,只在不必要的地方进行复制。
v0.0.1
初始版本支持事件的DTSTART,DTEND,EXDATE,RDATE,RECURRENCE-ID属性。
命令行接口为x-wr-timezone。
许可协议
本软件根据LGPLv3许可,请参阅LICENSE文件。
项目详情
下载文件
下载适合您平台的应用程序。如果您不确定选择哪个,请了解更多关于安装包的信息。