跳转到主要内容

管理复杂的过期规则。

项目描述

概述

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 查看散列值)

上传时间 Python 2 Python 3

由以下机构支持