管理复杂的过期规则。

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

  • 初次发布。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Grid loadmask(true)在gxt中不起作用   java将字符串索引转换为整数   为什么Java泛型适用于基元数组,但不适用于基元数组?   java如何让Azure应用程序服务Tomcat将所有80/443流量转发到运行在同一应用程序服务上的JBoss   具有多个值的java转换映射到树?   java如何设置SQL server连接URL?   java设置了多个相互独立的JFrame   安全性在JAVA中如何使用RSAPrivateKey的密码短语?   java不能使用比Apache Velocity中更大的条件   如何在Java中打印字符串的所有排列   停止Android Studio自动导入java。sql。日期   对象简单计算器程序java   java如何在安卓中使用“&”符号作为字符串?   java Connect,为我的安卓应用程序从REST API发布和获取数据