普通旧python对象的工厂。

calve_machine的Python项目详细描述


普通旧python对象的工厂。

基本用法

一个简单的例子:

>>> from should_dsl import should, should_not
>>> from calve_machine import inseminate, pregnant

>>> @inseminate
... def programmer(p):
...     p.name = 'Sheldon Cooper, Ph.D.'
...     p.age = 29
...     p.languages = ['eiffel', 'io', 'erlang']

>>> prog = pregnant.calve('programmer')
>>> prog.name |should| equal_to('Sheldon Cooper, Ph.D.')
>>> prog.age |should| be(29)
>>> prog.languages |should| equal_to(['eiffel', 'io', 'erlang'])

继承

工厂可以从其他工厂继承:

>>> @inseminate
... def programmer(p):
...     p.name = 'Sheldon Cooper, Ph.D.'
...     p.age = 29
...     p.languages = ['eiffel', 'io', 'erlang']

>>> @inseminate(seed_from='programmer')
... def python_programmer(p):
...     p.languages = ['python']
...     p.foo = 'spam'

>>> prog = pregnant.calve('python_programmer')
>>> prog.name |should| equal_to('Sheldon Cooper, Ph.D.')
>>> prog.age |should| be(29)
>>> prog.languages |should| equal_to(['python'])
>>> prog.foo |should| equal_to('spam')

>>> @inseminate(seed_from='python_programmer')
... def zope_programmer(p):
...     p.languages = ['zcml']
...     p.age = 30

>>> prog = pregnant.calve('zope_programmer')
>>> prog.name |should| equal_to('Sheldon Cooper, Ph.D.')
>>> prog.age |should| be(30)
>>> prog.languages |should| equal_to(['zcml'])
>>> prog.foo |should| equal_to('spam')

序列

工厂可以生成序列:

>>> from calve_machine import sequence

>>> @inseminate
... def id_holder(i):
...     i.name = sequence(lambda n: "Crazy Guy %s" %n)
...     i.square_id = sequence(lambda n: n ** 2)

>>> obj = pregnant.calve('id_holder')
>>> obj.name |should| equal_to("Crazy Guy 1")
>>> obj.square_id |should| be(1)

>>> obj = pregnant.calve('id_holder')
>>> obj.name |should| equal_to("Crazy Guy 2")
>>> obj.square_id |should| be(4)

>>> obj = pregnant.calve('id_holder')
>>> obj.name |should| equal_to("Crazy Guy 3")
>>> obj.square_id |should| be(9)

模板化

对象可以使用现有对象作为模板生成。给定一个对象:

>>> class Spam(object):
...     def __init__(self, eggs):
...         self.eggs = eggs
...     def fried(self):
...         return self.eggs + ' w/ cholesterol'

>>> spam = Spam("Guava")
>>> guava_prog = pregnant.calve('programmer', template=spam)

“程序员”的一切都按预期进行:

>>> guava_prog.name |should| equal_to('Sheldon Cooper, Ph.D.')
>>> guava_prog.age |should| be(29)
>>> guava_prog.languages |should| equal_to(['eiffel', 'io', 'erlang'])

模板对象中的所有成员都存在:

>>> guava_prog.eggs |should| equal_to('Guava')
>>> guava_prog.fried() |should| equal_to('Guava w/ cholesterol')

新生对象的类与模板对象的类相同:

>>> guava_prog |should| be_instance_of(Spam)

模板对象保持不变:

>>> spam |should_not| respond_to('name')
>>> spam |should_not| respond_to('age')
>>> spam |should_not| respond_to('languages')

类作为模板

模板可以是类,而不仅仅是对象:

>>> class Person:
...     def __init__(self):
...         self.city = 'Campos dos Goytacazes/RJ/Brazil'

>>> prog = pregnant.calve('programmer', template=Person)

“程序员”的一切都按预期进行:

>>> prog.name |should| equal_to('Sheldon Cooper, Ph.D.')
>>> prog.age |should| be(29)
>>> prog.languages |should| equal_to(['eiffel', 'io', 'erlang'])

模板类中的所有成员都存在:

>>> prog.city |should| equal_to('Campos dos Goytacazes/RJ/Brazil')

新生对象的类与模板对象的类相同:

>>> prog |should| be_instance_of(Person)

如果类具有必需的init参数:

>>> class User:
...     def __init__(self, email, password):
...         self.email, self.password = email, password

可以使用init()方法定义构造函数参数:

>>> @inseminate
... def parameterized_programmer(u):
...     u.init('admin@admin.com', 's3cr3t')
...     u.name = 'Sheldon Cooper'

>>> prog = pregnant.calve('parameterized_programmer', template=User)
>>> prog.email |should| equal_to('admin@admin.com')
>>> prog.password |should| equal_to('s3cr3t')
>>> prog.name |should| equal_to('Sheldon Cooper')

对于没有构造函数的类,将忽略构造函数的参数 参数:

>>> prog = pregnant.calve('parameterized_programmer', template=Person)

关联

calve_machine支持对象关联:

>>> from calve_machine import association

>>> @inseminate
... def customer(c):
...     c.name = 'Someone'

>>> @inseminate
... def order(o):
...     o.owner = association('customer')

>>> an_order = pregnant.calve('order')
>>> an_order.owner.name |should| equal_to('Someone')

如果字段名等于种子名,则无需指定种子名:

>>> @inseminate
... def order(o):
...     o.customer = association()

>>> an_order = pregnant.calve('order')
>>> an_order.customer.name |should| equal_to('Someone')

生成之后

可以定义任意代码以在创建的对象上运行:

>>> class User(object):
...    def __init__(self):
...        self.authorized = False
...    def authorize(self):
...        self.authorized = True

>>> @inseminate
... def user(u):
...     u.email = 'admin@admin.com'
...     u.password = 'adm!npassword'
...     u.after_build(lambda user: user.authorize())

>>> user = pregnant.calve('user', template=User())
>>> user |should| be_authorized

如何安装

对于最新版本,请运行:

pip install calve_machine

您还可以直接从github安装当前的开发版本:

pip install -e git+https://github.com/rodrigomanhaes/calve_machine.git#egg=calve_machine

如何运行测试

只需运行:

make test

用于安装所有测试依赖项(Should-DSL 以及Specloud,目前)和 运行测试。小牛机器本身没有依赖关系。

想法

犊牛机器的灵感来自factory_girl

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

推荐PyPI第三方库


热门话题
jframe为什么JAVA paint()方法不起作用?   java Guice:将ContainerRequestContext注入拦截器   java如何优雅地关闭Spring JMS MessageListenerAdapter   java如何在Spring中设置快照隔离级别   Java中的安卓平台独立信任存储路径   java无法在eclipse中运行hello world程序   java Sinch空指针问题   使用Java将JSON流式传输到BigQuery   java从“大数据”中选择什么Swing控件?   java通过对象字段过滤/排序集合?   java将数据从活动传递到另一个活动中的片段   java访问打包在jar文件中的文档   Java获取事件的大小。getDragboard()。getFiles()。流()。映射(文件::长度)。toString());   java Android libgdx:启动程序图标按下后,启动屏幕不会立即显示   java如何在Google App Engine灵活环境中配置oracle jdk   java有没有办法减少这些行?   Java:客户端socket不读取第二行,在终止符行之后保持打开状态   java以编程方式获取api 29上的所有APK文件   java ActionBar按钮不显示