Appengine夹具装载机

Appengine-Fixture-Loader的Python项目详细描述


appengine fixture loader发动机夹具装载机

一种将类似django的fixture加载到本地开发数据存储中的简单方法,最初打算由testable_appengine使用。

https://img.shields.io/pypi/l/appengine-fixture-loader.svghttps://badge.fury.io/py/appengine-fixture-loader.svghttps://api.travis-ci.org/rbanffy/appengine-fixture-loader.svghttps://img.shields.io/pypi/pyversions/appengine-fixture-loader.svghttps://img.shields.io/pypi/dm/appengine-fixture-loader.svghttps://coveralls.io/repos/rbanffy/appengine-fixture-loader/badge.svg?branch=master&service=github

安装

对于不太冒险的人,appengine fixture loader可以在pypi上的https://pypi.python.org/pypi/Appengine-Fixture-Loader上获得。

单一类型荷载

假设您有这样一个模型:

classPerson(ndb.Model):"""Our sample class"""first_name=ndb.StringProperty()last_name=ndb.StringProperty()born=ndb.DateTimeProperty()userid=ndb.IntegerProperty()thermostat_set_to=ndb.FloatProperty()snores=ndb.BooleanProperty()started_school=ndb.DateProperty()sleeptime=ndb.TimeProperty()favorite_movies=ndb.JsonProperty()processed=ndb.BooleanProperty(default=False)

如果要加载这样的数据文件:

[{"__id__":"jdoe","born":"1968-03-03T00:00:00","first_name":"John","last_name":"Doe","favorite_movies":["2001","The Day The Earth Stood Still (1951)"],"snores":false,"sleeptime":"23:00","started_school":"1974-02-15","thermostat_set_to":18.34,"userid":1},...{"born":"1980-05-25T00:00:00","first_name":"Bob","last_name":"Schneier","favorite_movies":["2001","Superman"],"snores":true,"sleeptime":"22:00","started_school":"1985-08-01","thermostat_set_to":18.34,"userid":-5}]

您需要做的就是:

fromappengine_fixture_loader.loaderimportload_fixture

然后:

loaded_data=load_fixture('tests/persons.json',kind=Person)

在我们的示例中,加载的数据将包含一个已持久化的人员模型列表,然后您可以操作该模型并再次持久化。

当定义时,\u id\uu属性将用给定的id保存对象。在我们的例子中,定义的第一个对象的键将是ndb.key('person','jdoe')。键可以在一个对象上按对象基定义-其中省略了\u id\uxu参数,将生成一个自动ID-第二个键类似于ndb.key('person',1)

多种荷载

从一个文件中加载多种对象是很方便的。对于这些情况,我们提供了一种简单的方法来识别要加载的对象的类型,并提供一组模型来在加载对象时使用。

考虑我们最初的示例模型:

classPerson(ndb.Model):"""Our sample class"""first_name=ndb.StringProperty()last_name=ndb.StringProperty()born=ndb.DateTimeProperty()userid=ndb.IntegerProperty()thermostat_set_to=ndb.FloatProperty()snores=ndb.BooleanProperty()started_school=ndb.DateProperty()sleeptime=ndb.TimeProperty()favorite_movies=ndb.JsonProperty()processed=ndb.BooleanProperty(default=False)

再加一个:

classDog(ndb.Model):"""Another sample class"""name=ndb.StringProperty()

现在,如果我们想让一个文件加载两种类型的对象,我们需要使用json:

中的\uu kind\uu属性
[{"__kind__":"Person","born":"1968-03-03T00:00:00","first_name":"John","last_name":"Doe","favorite_movies":["2001","The Day The Earth Stood Still (1951)"],"snores":false,"sleeptime":"23:00","started_school":"1974-02-15","thermostat_set_to":18.34,"userid":1},{"__kind__":"Dog","name":"Fido"}]

而且,要加载文件,我们必须:

fromappengine_fixture_loader.loaderimportload_fixture

以及:

loaded_data=load_fixture('tests/persons_and_dogs.json',kind={'Person':Person,'Dog':Dog})

将生成一个人员和狗的列表(在这种情况下,一人一狗)。

多种类、多层次负荷

另一个常见的情况是拥有要为测试重建的实体层次结构。

使用稍加修改的示例类:

classPerson(ndb.Model):"""Our sample class"""first_name=ndb.StringProperty()last_name=ndb.StringProperty()born=ndb.DateTimeProperty()userid=ndb.IntegerProperty()thermostat_set_to=ndb.FloatProperty()snores=ndb.BooleanProperty()started_school=ndb.DateProperty()sleeptime=ndb.TimeProperty()favorite_movies=ndb.JsonProperty()processed=ndb.BooleanProperty(default=False)appropriate_adult=ndb.KeyProperty()

以及:

classDog(ndb.Model):"""Another sample class"""name=ndb.StringProperty()processed=ndb.BooleanProperty(default=False)owner=ndb.KeyProperty()

使用类似于元属性的子属性,如:

[{"__kind__":"Person","born":"1968-03-03T00:00:00","first_name":"John","last_name":"Doe",..."__children__appropriate_adult__":[{"__kind__":"Person","born":"1970-04-27T00:00:00",..."__children__appropriate_adult__":[{"__kind__":"Person","born":"1980-05-25T00:00:00","first_name":"Bob",..."userid":3}]}]},{"__kind__":"Person","born":"1999-09-19T00:00:00","first_name":"Alice",..."__children__appropriate_adult__":[{"__kind__":"Person",..."__children__owner__":[{"__kind__":"Dog","name":"Fido"}]}]}]

您可以为测试重建整个实体树。

具有自动键的基于父/祖先的关系

也可以通过使用\u children\uuuuuuuuuuuuuuuuuuuuuuuuuxuan/cite>属性来设置父项

对于我们的示例类,导入:

[{"__kind__":"Person","first_name":"Alice",..."__children__":[{"__kind__":"Person","first_name":"Bob",..."__children__owner__":[{"__kind__":"Dog","name":"Fido"}]}]}]

应等于:

alice=Person(first_name='Alice')alice.put()bob=Person(first_name='Bob',parent=alice)bob.put()fido=Dog(name='Fido',parent=bob)fido.put()

然后您可以使用以下命令检索fido:

fido=Dog.query(ancestor=alice.key).get()

开发

有两种推荐的方法可以使用这个代码库。如果你想保留 只安装一个app engine sdk,您可以克隆存储库并运行 测试者:

$ PYTHONPATH=path/to/appengine/library python setup.py test

或者,此项目包含从 可测试项目。可测试的外观设计是为了让它更容易 为google app engine应用程序编写(和运行)测试并挂接 travis ci的应用。实际上,它创建一个virtualenv并下载 最新的sdk和其他支持工具。使用它,你跑 制作。打电话给make help将给您一个可用make的快速列表 目标:

$ make venv
Running virtualenv with interpreter /usr/bin/python2
New python executable in /export/home/ricardo/projects/appengine-fixture-loader/.env/bin/python2
Also creating executable in /export/home/ricardo/projects/appengine-fixture-loader/.env/bin/python
(...)
‘/export/home/ricardo/projects/appengine-fixture-loader/.env/bin/run_tests.py’ -> ‘/export/home/ricardo/projects/appengine-fixture-loader/.env/lib/google_appengine/run_tests.py’
‘/export/home/ricardo/projects/appengine-fixture-loader/.env/bin/wrapper_util.py’ -> ‘/export/home/ricardo/projects/appengine-fixture-loader/.env/lib/google_appengine/wrapper_util.py’
$ source .env/bin/activate
(.env) $ nosetests
..............
----------------------------------------------------------------------
Ran 14 tests in 2.708s

OK

历史

0.1.0(2014-10-13)

  • github上的第一个版本。

0.1.1(2014-12-4)

  • 添加对多种JSON文件的支持

0.1.2(2014-12-4)

  • 小修

0.1.3(2014-12-5)

  • 增加了对基于propertykey的子实体的支持

0.1.4(2015-2-4)

  • 修复了在每次属性更改时调用后处理器的错误
  • 在readme.rst中添加了有关开发的部分

0.1.5(2015-2-11)

  • 添加了支持
  • 通过\u id\u属性添加了手动键定义

0.1.6(2015-8-30)

  • 如果未安装curl,则生成
  • 小文档改进

0.1.7(2015-11-3)

  • 在文档中突出显示语法
  • 使用工作服进行覆盖率分析

0.1.8(2016-02-05)

  • 新资源/makefile

0.1.9(2016-12-19)

  • 用pycodestyle替换pep8
  • 将当前sdk版本检测更新到最新版本

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

推荐PyPI第三方库


热门话题
SpringPropertySource中的java三元运算符似乎不起作用   lambda在Java中对对象列表进行排序最优雅的方式是什么?   Java中矢量图像到光栅图像的转换   java如何在Android中将表格从web传输到我的数据库   运行基于java的web应用程序实例的web服务   谷歌应用引擎中的java漂亮URL   删除n个点(.)来自Java中的字符串   Java PrintWriter:随时间写入同一文件   列表<String>属性的java swagger@ApiModelProperty示例值   java的final关键字是否在static之类的方法中存储变量?   用户授权JavaSE   总是返回null的java方法   如何在Java中生成用于通过网络发送数据的字节数组   java LinkedHashSet作为API公共方法的返回类型   写入新xsd文件时java FileNotFoundException   Android中的java不向异步任务传递任何内容   有没有更简单的方法将java中的字符值转换为int?   javajdbc许可在jar中打包JDBC