管理复杂的过期规则。
项目描述
概述
expiration旨在管理复杂的过期规则。我的具体用例是备份,其中我希望永久保留年度备份,保留两年内的月度备份,保留三个月内的周备份,保留两周内的日备份,以及保留一周内的时备份。使用expiration,您可以实施描述这些规则的规则
>>> from __future__ import print_function >>> import expiration >>> from datetime import timedelta >>> expiration_rules = expiration.RetentionRules(timedelta(weeks=1), # default value ... [expiration.RetentionCriterion(expiration.date.year_of, ... None), ... expiration.RetentionCriterion(expiration.date.month_of, ... timedelta(days=2*365)), ... expiration.RetentionCriterion(expiration.date.week_of, ... timedelta(days=30*3)), ... expiration.RetentionCriterion(expiration.date.day_of, ... timedelta(weeks=2)), ... ])
接下来,您需要一些想要检查过期时间的项目。这些对象可以是任何类型:expiration不会检查它们,除了从中提取时间戳。您提供该时间戳访问函数,称为time_key。
为了演示,我将创建一些具有过期日期的对象
>>> from collections import namedtuple >>> from datetime import datetime >>> Item = namedtuple('Item', 'name expiration') >>> items = [Item(1, datetime(2012, 1, 1)), ... Item(2, datetime(2014, 1, 3)), ... Item(3, datetime(2014, 2, 1)), ... Item(4, datetime(2014, 2, 2)), ... Item(4, datetime(2014, 7, 1)), ... Item(5, datetime(2014, 7, 25, 8, 0)), ... Item(6, datetime(2014, 7, 25, 9, 0)), ... Item(7, datetime(2014, 7, 25, 10, 0)), ... ]
现在,我们找到哪些已经过期了
>>> from operator import attrgetter >>> for item, criterion in expiration.find_expired_items(items, attrgetter('expiration'), ... expiration_rules, ... asof_timestamp=datetime(2014, 8, 1)): ... print(item) Item(name=4, expiration=datetime.datetime(2014, 2, 2, 0, 0))
这表明在这些规则下,项目4是唯一一个将被删除的项目。它不是每月的第一个项目,而且已经超过3个月,所以它应该过期。
如果我们问,截至2020年1月1日,哪些项目已经过期
>>> for item, criterion in expiration.find_expired_items(items, attrgetter('expiration'), ... expiration_rules, ... asof_timestamp=datetime(2020, 1, 1)): ... print(item) Item(name=3, expiration=datetime.datetime(2014, 2, 1, 0, 0)) Item(name=4, expiration=datetime.datetime(2014, 2, 2, 0, 0)) Item(name=4, expiration=datetime.datetime(2014, 7, 1, 0, 0)) Item(name=5, expiration=datetime.datetime(2014, 7, 25, 8, 0)) Item(name=6, expiration=datetime.datetime(2014, 7, 25, 9, 0)) Item(name=7, expiration=datetime.datetime(2014, 7, 25, 10, 0))
唯一保留的项目是1和2,因为它们是每年开始时的第一个项目,具有无限期的过期时间。
局限性
因为 find_expired_items 只能一次比较一个项目与规则,因此它只能有效地实施“第一个”规则。也就是说,将标准应用于每年的第一个备份,或每月的第一个备份等。目前无法实施“保留每月第二个备份”等规则。如果您删除了第一个备份并保留了第二个备份,那么下次运行 find_expired_items 时,它会将之前是第二个的项目视为现在是第一个。
变更日志
1.0 2016-10-27 Eric V. Smith
始终要求 setuptools(问题#1)。
删除修改 RPM 名称的技巧(问题#2)。
没有代码更改。
0.1 2014-12-15 Eric V. Smith
初始发布。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。
源代码分发
expiration-1.0.tar.gz (9.1 kB 查看散列值)
构建分发
expiration-1.0-py2.py3-none-any.whl (6.6 kB 查看散列值)
关闭
expiration-1.0.tar.gz 的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | bbdac29eba142bf0833c1fd8e94e244bb8203dcfc20a10becc3ff016279ac948 |
|
MD5 | 77acd8c2d4b46ed3476d8bd19ce6f9df |
|
BLAKE2b-256 | 421b5e622186e547f3c9b393629dc64ba2f08f496faaf883cda01803e5b5e540 |
关闭
expiration-1.0-py2.py3-none-any.whl 的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | d9e704b28439f27f3a5acd358d950fedb39e514f49689a12a50919dfaf3acae0 |
|
MD5 | ac30c75f7ddb93d0251726d73364d194 |
|
BLAKE2b-256 | c6c35640545e8268dbba39f6680518c1c8b13e185800245615a1a5917cd248b9 |