简单而简陋的对象数据映射器库
项目描述
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进行验证(设置任何验证方法)。