跳转到主要内容

一个用于将使用X-WR-TIMEZONE的日历转换为标准日历的Python模块和程序。

项目描述

CI build and test status Python Package Version on Pypi Downloads from Pypi Support on Open Collective

一些日历提供商在ICS日历文件中引入了非标准的X-WR-TIMEZONE参数。根据RFC 5545的严格解释忽略了X-WR-TIMEZONE参数。这导致事件的时问与使用X-WR-TIMEZONE的时问不同。

此模块旨在通过将使用X-WR-TIMEZONE的日历转换为严格的RFC 5545日历来弥合差距。因此,让我们齐心协力,为每个人解决这个问题!

该模块的一些功能包括

  • 使用Python的pip轻松安装。

  • 命令行转换日历。

  • 使用 wgetcurl 管道传输日历文件。

一些要求包括:

  • 没有 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) 有以下参数

  • calendaricalendar.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 参数传递的日历相同。如果您修改返回值,请记住这一点。

开发

  1. 克隆 存储库 或其分支,然后 cd x-wr-timezone

  2. 可选:安装 virtualenv 和 Python3 并创建虚拟环境

    pip install virtualenv
    virtualenv -p python3 ENV
    source ENV/bin/activate # you need to do this for each shell
  3. 安装软件包和此模块,以便可以编辑

    pip install -r test-requirements.txt -e .
  4. 运行测试

    pytest

测试所有函数

pytest --x-wr-timezone all

使用 tox 进行测试

您可以使用 tox 在不同的 Python 版本中测试软件包。

tox

这测试了所有不同的功能

tox -- --x-wr-timezone all

新版本

发布新版本时,

  1. 编辑更改日志部分

  2. 编辑 setup.py,编辑 __version__ 变量

  3. 创建提交并推送

  4. 等待 CI 测试 完成构建。

  5. 运行

    python3 setup.py tag_and_deploy
  6. 通知有关其发布的问题

测试

本项目的开发由测试驱动。测试确保接口的一致性,并减少随时间推移而丢失的知识。如果您想更改代码,测试有助于确保将来不会出现错误。从这个意义上说,它们是必需的。示例代码和ics文件可以转换为测试,从而加快修复错误的速度。

您可以在测试文件夹中查看测试。如果您有一个ics日历文件,该库没有生成所需的输出,您可以将其添加到test/calendars文件夹,并编写期望的测试。如果您愿意,可以先打开一个问题,例如讨论更改和如何进行更改。

变更日志

  • v1.0.0

    • 使用zoneinfo代替pytz

    • 测试与pytzzoneinfo的兼容性,作为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

    • 使用datetimetzname()函数来测试UTC。这有助于支持zoneinfo时区。

    • 拆分访客类并将其重命名为walker。

  • v0.0.2

    • 实现timezone参数。

    • 不要修改calendar参数的值,只在不必要的地方进行复制。

  • v0.0.1

    • 初始版本支持事件的DTSTART,DTEND,EXDATE,RDATE,RECURRENCE-ID属性。

    • 命令行接口为x-wr-timezone

许可协议

本软件根据LGPLv3许可,请参阅LICENSE文件。

项目详情


下载文件

下载适合您平台的应用程序。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

x_wr_timezone-1.0.1.tar.gz (16.6 kB 查看哈希)

上传时间

构建分布

x_wr_timezone-1.0.1-py3-none-any.whl (10.4 kB 查看哈希)

上传时间 Python 3

由...