Appengine夹具装载机
Appengine-Fixture-Loader的Python项目详细描述
appengine fixture loader发动机夹具装载机
一种将类似django的fixture加载到本地开发数据存储中的简单方法,最初打算由testable_appengine使用。
安装
对于不太冒险的人,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版本检测更新到最新版本