Skip to main content

简单而简陋的对象数据映射器库

项目描述

Froshki 是一个简单而糟糕的对象数据映射器库。

看起来与WTForms非常相似,而是专注于数据输入/输出抽象,将验证或转换功能分离为 API 和扩展。

而不是与网络表单等集成,旨在实现更灵活的属性采购。

特征

  • 将数据模式定义为类定义。

  • 通过关键字参数、dict 或两者提供数据输入。

  • 使用用户定义的方法或与第三方库的内置集成转换和验证数据输入。

  • 访问经过验证的数据作为属性/映射。

  • 易于在验证中挂钩您的功能。

简单使用

原始演示:

>>> from froshki import Froshki, Attribute
>>>
>>> class ResourceId(Attribute):
...     @classmethod
...     def transform(klass, input_value):
...         return int(input_value)
...     @classmethod
...     def validate(klass, input_value):
...         if input_value in (1,5,7,9):
...             return True, input_value
...         else:
...             return False, 'resource id not found'
>>>
>>> class Filetype(Attribute):
...     @classmethod
...     def transform(klass, input_value):
...         return input_value.lower()
...     @classmethod
...     def validate(klass, input_value):
...         if input_value in ('pdf', 'txt', 'mobi'):
...             return True, input_value
...         else:
...             return False, 'filetype unavailable'
>>>
>>> class Download(Froshki):
...     resource_id = ResourceId()
...     filetype = Filetype()
>>>
>>> download = Download(resource_id='9', filetype='PDF')
>>> download.validate()
True
>>> download.resource_id
9
>>> download.filetype
'pdf'

要使用 Froshki 的任何功能,请扩展froshki.Froshki以定义数据模型模式。通过将froshki.Attribute子类附加到模型上来表示属性。

您可以为属性添加任何数据转换 ( Attribute.transform ) 或验证 ( Attribute.validate ) 方法。 Froshki.validate按定义转换和验证所有属性。但是有点麻烦,可以使用支持属性定义的内置扩展。

使用 trafaret 扩展

您需要预先安装trafaret才能使用该扩展程序。用法:

>>> from froshki import Froshki
>>> import trafaret
>>> from froshki.ext import trafaret_attr
>>>
>>> class SendInquiry(Froshki):
...     user_name = trafaret_attr(trafaret.String())()
...     user_contact = trafaret_attr(trafaret.Email())()
...     message = trafaret_attr(trafaret.String(regex=r'\w{10,400}'))()
>>>
>>> send_inquiry = SendInquiry(
...     user_name='yu mat', user_contact='drowse314@gmail.com',
...     message='cannot post messages to my group'
... )
>>> send_inquiry.validate()
True

如果您更喜欢其他验证库,您会发现扩展froshki.Attribute.validate非常容易。或者内置支持更多库:

有关扩展写入的文档或详细信息,请参阅froshki/ext/*_ attr.py。

其它功能

数据作为映射

一些实用程序属性可用于访问经过验证的数据:

(...)
>>> send_inquiry.data
{'user_name': 'yu mat', 'user_contact': 'drowse314@gmail.com', 'message': 'cannot post messages to my group'}
>>> send_inquiry.errors  # error messages are registered if validation failed
{}

此外,您可以使用映射初始化froshki.Froshki

(...)
>>> data = {'user_name': 'ymat', 'user_contact': 'drowse314.gmail.com', 'message': 'cannot post messages to my group'}
>>> another_inquiry = SendInquiry(source=data)
>>> another_inquiry.validate()
False

具有别名的源属性

您可以使用与类属性名称不同的名称来获取属性:

>>> class ResourceAccess(Froshki):
...     resource_id = Attribute()
...     user_id = Attribute()
...     resource_key = Attribute(key_alias='password')
>>> access = ResourceAccess(resource_id='1276', user_id='ymat', password='VXFPF93')
>>> access.resource_key
'VXFPF93'

额外验证

您可以使用validation_hook装饰器为属性关系等添加依赖于属性的额外验证器方法:

>>> from froshki import Froshki, Attribute, validation_hook
>>>
>>> class SendInquiry(Froshki):
...     user_name = Attribute()
...     user_contact = Attribute()
...     user_contact_confirmation = Attribute()
...     message = Attribute()
...     @validation_hook
...     def confirm_email(self):
...         return self.user_contact == self.user_contact_confirmation
>>>
>>> send_inquiry = SendInquiry(
...     user_name='yu mat', user_contact='drowse314@gmail.com', user_contact_confirmation='drose@gmail.com',
...     message='cannot post messages to my group'
... )
>>> send_inquiry.validate()
False

如果您需要这些额外验证器的错误信息,请按如下方式扩展装饰器:

(...)
>>> class SendInquiryExt(SendInquiry):
...     @validation_hook.extend(error='inconsistent email inputs')
...     def confirm_email(self):
...         return self.user_contact == self.user_contact_confirmation
>>>
>>> send_inquiry = SendInquiry(
...     user_name='yu mat', user_contact='drowse314@gmail.com', user_contact_confirmation='drose@gmail.com',
...     message='cannot post messages to my group'
... )
>>> send_inquiry.validate()
False
>>> send_inquiry.errors
{'confirm_email': 'inconsistent email inputs'}

子类化和属性混合

froshki.Froshki子类可用作基类:

(...)
>>> class Resource(Froshki):
...     resource_id = ResourceId()
>>>
>>> class Download(Resource):
...     filetype = Filetype()
>>>
>>> download = Download(resource_id='9', filetype='pdf')
>>> download.validate()
True

如果您想在模式之间共享一些属性定义,则混合很有用:

(...)
>>> class UserMixin(object):
...     user = Attribute()
>>>
>>> class DownloadAsUser(Download, UserMixin):
...     pass
>>>
>>> download_as_someone = DownloadAsUser(
...     resource_id='5', filetype='mobi',
...     user='ymat',
... )
>>> download_as_someone.validate()
True
>>> download_as_someone.user
'ymat'

您可以通过附加froshki.Attribute实例将任何类用作属性混合,但会导致 MRO 问题的froshki.Froshki子类除外。

其他选项

froshki.Froshki类有一些有用的选项。

  • Froshki.default_values:提供属性默认值作为字典。

  • Froshki.ignore_unkown_keys:控制参数是否接受未定义为属性的名称(真/假)。

还有一些froshki.Attribute的选项。

  • (作为参数)Attribute(nullable=<bool>):允许None进行验证(设置任何验证方法)。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

froshki-0.4.3.tar.gz (8.2 kB 查看哈希)

已上传 source