管理复杂的过期规则。
expiration的Python项目详细描述
概述
过期旨在管理复杂的过期规则。我的特定 用例用于备份,我希望永远保存年度备份, 每月备份2年,每周备份3个月,每天 备份2周,每小时备份1周。到期, 您将实现描述如下的规则:
>>> 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不检查它们, 除了从中提取时间戳。你提供的 时间戳访问函数,称为时间键。
为了演示,我将创建一组过期的对象 日期:
>>> 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,因为它们是第一个 每年年初的项目,到期时间无限 时间。
限制
因为每次只比较一个项目 规则,它只能有效地实现“第一个”规则。也就是说, 对年度的第一次备份或 月份等。它目前不能执行诸如“保留 本月第二次备份”。如果你删除了第一个备份 保留第二个,然后下次运行“查找过期项” 会看到以前是第二个项目,现在是第一个。
更改日志
1.0 2016年10月27日Eric V.Smith
- 始终需要设置工具(问题1)。
- 删除hack以修改RPM名称(问题2)。
- 没有代码更改。
0.1 2014年12月15日Eric V.Smith
- 初次发布。