{ "info": { "author": "Tomaz Muraus", "author_email": "tomaz@tomaz.me", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Information Technology", "Operating System :: POSIX :: Linux", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "# Protobuf Message to Google Datastore Entity Protobuf Message Translator\n\n[![Tests Build Status](https://travis-ci.org/Kami/python-protobuf-cloud-datastore-entity-translator.svg?branch=master)](https://travis-ci.org/Kami/python-protobuf-cloud-datastore-entity-translator) [![Codecov](https://codecov.io/github/Kami/python-protobuf-cloud-datastore-entity-translator/badge.svg?branch=master&service=github)](https://codecov.io/github/Kami/python-protobuf-cloud-datastore-entity-translator?branch=master) [![](https://img.shields.io/pypi/v/protobuf-cloud-datastore-translator.svg)](https://pypi.org/project/protobuf-cloud-datastore-translator/) [![](https://img.shields.io/pypi/pyversions/protobuf-cloud-datastore-translator.svg)](https://pypi.org/project/protobuf-cloud-datastore-translator/) [![](https://img.shields.io/github/license/Kami/python-protobuf-cloud-datastore-entity-translator.svg)](https://github.com/Kami/python-protobuf-cloud-datastore-entity-translator/blob/master/LICENSE)\n\nThis library allows you to store arbitrary Protobuf message objects inside the Google Datastore.\n\nIt exposes methods for translating arbitrary Protobuf message objects to Entity Protobuf objects\nwhich are used by Google Datastore and vice-versa.\n\nIt supports all the native which are supported by the Google Datastore.\n\n## Why, Motivation\n\nIf you are working with Google Datastore from a single programming language you can utilize\none of the multiple Datastore ORMs for that programming language. Those ORMs allow you to define\nschema for your database models and work with them using native programming language types.\n\nThis approach brakes down when you want to work with the same set of datastore entities from\nmultiple programming language.\n\nThere are multiple solutions for that problem, but one approach is to define some kind of model\nschema which is programming language agnostic.\n\nAnd this library tries to do just that. It utilizes native protobuf message definitions as a schema\nfor database models. This way those definitions can be shared by multiple programming language and\neach language just needs a light translator library (like this one) which knows how to translate\narbitrary Protobuf object into Entity Protobuf object and vice-versa.\n\n## Features\n\nRight now the library supports the following Protobuf field types and functionality:\n\n* All the simple types (string, int32, int64, double, float, bytes, bool, enum)\n* Scalar / container types (map, repeated)\n* Complex types from Protobuf standard library (``google.protobuf.Timestamp``,\n ``google.protobuf.Struct``, ``google.types.LatLng``)\n* Using imports and referencing types from different Protobuf definition files. For example,\n you can have Protobuf message definition called ``Model1DB`` inside file ``model1.proto`` which\n has a field which references ``Model2DB`` from ``model2.proto`` file.\n\n For that to work, you need to make sure that the root directory which contains all the generated\n Protobuf Python files is available in ``PYTHONPATH``.\n\n For example, if generated files are written to ``my_app/generated/``, ``my_app/generated/`` needs\n to be in ``PYTHONPATH`` and this directory needs to be a Python package (it needs to contain\n ``__init__.py`` file).\n\nFor more information on the actual types supported by Google Datastore, refer to\nhttps://cloud.google.com/datastore/docs/concepts/entities#properties_and_value_types.\n\n## Supported Python versions\n\n* Python 2.7\n* Python 3.6\n* Python 3.7\n\nIt may also work with Python 3.4 and 3.5, but we don't test against those versions.\n\n## Usage\n\nThis library exposes three main public methods.\n\n### ``model_pb_to_entity_pb(model_pb, exclude_falsy_values=False, exclude_from_index=None)``\n\nThis method converts arbitrary Protobuf message objects to the Entity Protobuf object which can\nbe used with Google Datastore.\n\nFor example:\n\n```python\nfrom google.cloud import datastore\nfrom google.protobuf.timestamp_pb2 import Timestamp\n\nfrom protobuf_cloud_datastore_translator import model_pb_to_entity_pb\n\nfrom generated.protobuf.models import my_model_pb2\n\n# 1. Store your database model object which is represented using a custom Protobuf message class\n# instance inside Google Datastore\n\n# Create database model Protobuf instance\nmodel_pb = my_model_pb2.MyModelDB()\n# Other entity attributes\nmodel_pb.key1 = 'value1'\nmodel_pb.key2 = 200\nmodel_pb.parameters['foo'] = 'bar'\nmodel_pb.parameters['bar'] = 'baz'\n\nstart_time_timestamp = Timestamp()\nstart_time_timestamp.GetCurrentTime()\n\nmodel_pb.start_time = start_time_timestamp\n\n# Convert it to Entity Protobuf object which can be used with Google Datastore\nentity_pb = model_pb_to_entity_pb(model_pb)\n\n# Store it in the datastore\nclient = Client(...)\nkey = self.client.key('MyModelDB', 'some_primary_key')\nentity_pb_translated.key.CopyFrom(key.to_protobuf())\nentity = datastore.helpers.entity_from_protobuf(entity_pb)\nclient.put(entity)\n```\n\n### ``model_pb_with_key_to_entity_pb(client, model_pb, exclude_falsy_values=False, exclude_from_index=None)``\n\nAs a convenience, this library also exposes ``model_pb_to_entity_pb`` method. This method assumes\nthere is a special ``key`` string field on your Protobuf message which will act as an Entity\nprimary key.\n\nUnderneath, this method infers ``project_id`` and ``namespace_id`` parts of the Entity composite\nprimary key from the ``client`` object which is passed to this method. Entity ``kind`` is inferred\nfrom the Protobuf message model name. For example, if the Protobuf message model name is\n``UserInfoDB``, entity kind would be set to ``UserInfoDB``.\n\nFor example:\n\n```python\nfrom google.cloud import datastore\n\nfrom protobuf_cloud_datastore_translator import model_pb_to_entity_pb\n\nmodel_pb = my_model_pb2.MyModelDB()\nmodel_pb.key = 'key-1234'\n# set model fields\n# ...\n\nclient = Client(project='my-project', namespace='my-namespace')\n\nentity_pb = model_pb_to_entity_pb(model_pb)\n\n# Store it in the datastore\nentity = datastore.helpers.entity_from_protobuf(entity_pb)\nclient.put(entity)\n\n# In this scenario, actual key would look the same if you manually constructed it like this:\nkey = client.key('MyModelDB', 'key-1234', project='my-project', namespace='my-namespace')\n```\n\n### ``entity_pb_to_model_pb(model_pb_class, entity_pb, strict=False)``\n\nThis method converts raw Entity Protobuf object as returned by the Google Datastore to provided\nProtobuf message class.\n\nBy default, fields which are found on the Datastore Entity Protobuf object, but not on the\nProtobuf message class are ignored. If you want an exception to be thrown in such scenario, you\ncan pass ``strict=True`` argument to the method.\n\nFor example:\n\n```python\nkey = client.key('MyModelDB', 'some_primary_key')\nentity = client.get(key)\nentity_pb = datastore.helpers.entity_to_protobuf(entity)\n\nmodel_pb = entity_pb_to_model_pb(my_model_pb2.MyModelPB, entity_pb)\nprint(model_pb)\n```\n\n## Excluding Protobuf Model Fields from Indexes\n\nBy default, Google Cloud Datstore automatically indexes each entity (model) property.\n\nIndexing each field (entity property) is usually not desired nor needed. It also has some\nlimitations (for example, size of a simple field which is to be indexed is limited to ``1500``\nbytes, etc.). In addition to that, uncessary indexing causes increased storage space consumption.\n\nThis library allows you to define which model fields to exclude from index on the field basis\nutilizing Protobuf field options extension.\n\nFor example:\n\n```protobuf\nsyntax = \"proto3\";\n\nimport \"google/protobuf/descriptor.proto\";\n\n// Custom Protobuf option which specifies which model fields should be excluded\n// from index\n// NOTE: Keep in mind that it's important not to change the option name\n// (\"exclude_from_index\") since this library uses that special option name to\n// determine if a field should be excluded from index.\nextend google.protobuf.FieldOptions {\n bool exclude_from_index = 50000;\n}\n\nmessage ExampleDBModelWithOptions1 {\n string string_key_one = 1 [(exclude_from_index) = true];\n string string_key_two = 2;\n string string_key_three = 3 [(exclude_from_index) = true];\n string string_key_four = 4;\n int32 int32_field_one = 5;\n int32 int32_field_two = 6 [(exclude_from_index) = true];\n}\n```\n\nIn this example, fields ``string_key_one``, ``string_key_three`` and ``int32_field_two`` won't be\nindexed (https://cloud.google.com/datastore/docs/concepts/indexes#unindexed_properties).\n\nIn this example, field option extension is defined in the same file where model is defined, but in\nreality you will likely define that extension inside a custom protobuf file (e.g\n``field_options.proto``) and include that file inside other files which contain your database model\ndefinitions.\n\nKeep in mind that if you define option extension inside a package, that package needs to match the\npackage under which the models are stored.\n\nFor example:\n\n1. ``protobuf/models/field_options.proto``:\n\n```protobuf\nsyntax = \"proto3\";\n\npackage models;\n\nimport \"google/protobuf/descriptor.proto\";\n\n// Custom Protobuf option which specifies which model fields should be excluded\n// from index\n// NOTE: Keep in mind that it's important not to change the option name\n// (\"exclude_from_index\") since this library uses that special option name to\n// determine if a field should be excluded from index.\nextend google.protobuf.FieldOptions {\n bool exclude_from_index = 50000;\n}\n```\n\n2. ``protobuf/models/my_model.proto``:\n\n```protobuf\nsyntax = \"proto3\";\n\npackage models;\n\nimport \"models/field_options.proto\";\n\nmessage ExampleDBModelWithOptions1 {\n string string_key_one = 1 [(exclude_from_index) = true];\n string string_key_two = 2;\n string string_key_three = 3 [(exclude_from_index) = true];\n string string_key_four = 4;\n int32 int32_field_one = 5;\n int32 int32_field_two = 6 [(exclude_from_index) = true];\n}\n```\n\n## Examples\n\nFor example Protobuf message definitions, see ``protobuf/`` directory.\n\nExample usage:\n\n```python\nfrom google.cloud import datastore\n\nfrom protobuf_cloud_datastore_translator import model_pb_to_entity_pb\nfrom protobuf_cloud_datastore_translator import entity_pb_to_model_pb\n\nfrom generated.protobuf.models import my_model_pb2\n\n# 1. Store your database model object which is represented using a custom Protobuf message class\n# instance inside Google Datastore\n\n# Create database model Protobuf instance\nmodel_pb = my_model_pb2.MyModelDB()\nmodel_pb.key1 = 'value1'\nmodel_pb.key2 = 200\n\n# Convert it to Entity Protobuf object which can be used with Google Datastore\nentity_pb = model_pb_to_entity_pb(model_pb)\n\n# Store it in the datastore\n# To avoid conversion back and forth you can also use lower level client methods which\n# work directly with the Entity Protobuf objects\n# For information on the low level client usage, see\n# https://github.com/GoogleCloudPlatform/google-cloud-datastore/blob/master/python/demos/trivial/adams.py#L66\nclient = Client(...)\nkey = self.client.key('MyModelDB', 'some_primary_key')\nentity_pb_translated.key.CopyFrom(key.to_protobuf())\n\nentity = datastore.helpers.entity_from_protobuf(entity_pb)\nclient.put(entity)\n\n# 2. Retrieve entity from the datastore and convert it to your Protobuf DB model instance class\n# Same here - you can also use low level client to retrieve Entity protobuf object directly and\n# avoid unnecessary conversion round trip\nkey = client.key('MyModelDB', 'some_primary_key')\nentity = client.get(key)\nentity_pb = datastore.helpers.entity_to_protobuf(entity)\n\nmodel_pb = entity_pb_to_model_pb(my_model_pb2.MyModelPB, entity_pb)\nprint(model_pb)\n```\n\n\n## Gotchas\n\n### Default values\n\nIn Protobuf syntax version 3 a concept of field being set has been removed and combined with a\nconcept of a default value. This means that even when a field is not set, a default value which\nis specific to that field type will be returned.\n\nAs far as this library is concerned, this means when you are converting / translating Protobuf\nobject with no values set, translated object will still contain default values for fields which\nare not set.\n\nFor example, the output / end result of both those two calls will be the same:\n\n```python\n# Field values are explicitly provided, but they match default values\nexample_pb = example_pb2.ExampleDBModel()\nexample_pb.bool_key = False\nexample_pb.string_key = ''\nexample_pb.int32_key = 0\nexample_pb.int64_key = 0\nexample_pb.double_key = 0.0\nexample_pb.float_key = 0.0\nexample_pb.enum_key = example_pb2.ExampleEnumModel.ENUM0\nexample_pb.bool_key = False\nexample_pb.bytes_key = b''\nexample_pb.null_key = 1\n\nentity_pb_translated = model_pb_to_entity_pb(example_pb)\nprint(entity_pb_translated)\n\n# No field values are provided, implicit default values are used during serialization\nexample_pb = example_pb2.ExampleDBModel()\nentity_pb_translated = model_pb_to_entity_pb(example_pb)\nprint(entity_pb_translated)\n```\n\nIf you don't want default values to be set on the translated Entity Protobuf objects and stored\ninside the datastore, you can pass ``exclude_falsy_values=True`` argument to the\n``model_pb_to_entity_pb`` method.\n\nFor details, see:\n\n* https://developers.google.com/protocol-buffers/docs/reference/python-generated\n* https://github.com/protocolbuffers/protobuf/issues/1606\n* https://github.com/googleapis/google-cloud-python/issues/1402\n* https://github.com/googleapis/google-cloud-python/pull/1450\n* https://github.com/googleapis/google-cloud-python/pull/1329\n\n### Struct Field type\n\nThis library supports ``google.protobuf.Struct`` field type out of the box. Struct field values\nare serialized as an embedded entity.\n\nKeep in mind that ``google.protobuf.Struct`` field type mimics JSON type which only supports\n``number`` type for numeric values (https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/struct.proto#L62).\nThis means all the numbers (including integers) are represented as double precision floating\npoint values (internally on the Entity, that's stored as ``value_pb.double_value``).\n\n## Translator Libraries for Other Programming Languages\n\nThis section contains a list of translator libraries for other programming languages which offer\nthe same functionality.\n\n* Golang - [go-protobuf-cloud-datastore-entity-translator](https://github.com/Sheshagiri/go-protobuf-cloud-datastore-entity-translator)\n\n## Tests\n\nUnit and integration tests can be found inside ``tests/`` directory.\n\nYou can run unit and integration tests and other lint checks by using tox.\n\n```bash\n# Run all tox targets\ntox\n\n# Run only lint checks\ntox -e lint\n\n# Run unit tests under Python 2.7\ntox -e py2.7-unit-tests\n\n# Run Integration tests under Python 3.7\ntox -e py3.7-integration-tests\n\n# Run unit and integration tests and generate and display code coverage report\ntox -e coverage\n```\n\nNOTE 1: Integration tests depend on the Google Cloud Datastore Emulator to be running\n(``./scripts/run-datastore-emulator.sh``).\n\nNOTE 2: Integration tests also run cross programming language compatibility tests which\nverify that the Python and Go translator libraries produce exactly the same output. As such,\nthose tests also require Golang >= 1.12 to be installed on the system.\n\n## License\n\nCopyright 2019 Tomaz Muraus\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this work except\nin compliance with the License. You may obtain a copy of the License in the [LICENSE](LICENSE) file,\nor at:\n\n[http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)\n\nBy contributing you agree that these contributions are your own (or approved by your employer) and\nyou grant a full, complete, irrevocable copyright license to all users and developers of the\nproject, present and future, pursuant to the license of the project.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "", "license": "Apache License (2.0)", "maintainer": "", "maintainer_email": "", "name": "protobuf-cloud-datastore-translator", "package_url": "https://pypi.org/project/protobuf-cloud-datastore-translator/", "platform": "", "project_url": "https://pypi.org/project/protobuf-cloud-datastore-translator/", "project_urls": null, "release_url": "https://pypi.org/project/protobuf-cloud-datastore-translator/0.1.13/", "requires_dist": [ "six", "protobuf", "google-cloud-datastore" ], "requires_python": "", "summary": "Library which converts arbitrary Protobuf message objects into Entity Protobuf objects which can be used with Google Datastore.", "version": "0.1.13" }, "last_serial": 5884776, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "ee0180ffeba80ea9fcd780aa9a2a059b", "sha256": "110a3374cde250b3f6e8393dfa6f34e6b50edc197f72e6742477924dfbf06683" }, "downloads": -1, "filename": "protobuf_cloud_datastore_translator-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "ee0180ffeba80ea9fcd780aa9a2a059b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 24578, "upload_time": "2019-07-05T15:29:27", "url": "https://files.pythonhosted.org/packages/fb/1d/cc66dbb66f9bb8aff1af7d0bcf6f8d8f900056f0f131b1419626fb3b8dc1/protobuf_cloud_datastore_translator-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "59abe3035da35ee65ed1c24eff4e7834", "sha256": "05e4515f17bbeeb8007d43cfd82582243c00fb9153855e59620886d4ee487578" }, "downloads": -1, "filename": "protobuf-cloud-datastore-translator-0.1.0.tar.gz", "has_sig": false, "md5_digest": "59abe3035da35ee65ed1c24eff4e7834", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17895, "upload_time": "2019-07-05T15:29:30", "url": "https://files.pythonhosted.org/packages/24/2a/6d308b0f13424a3d31eb4ad034625e6076c344a8f4fb6928f8f6a1e49885/protobuf-cloud-datastore-translator-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "aa56b04debc316b20497aeeda2de6be3", "sha256": "6dcc06ffe65fcd4c64922250bd808a828acf6b513d7383eeb53467e7db92e089" }, "downloads": -1, "filename": "protobuf_cloud_datastore_translator-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "aa56b04debc316b20497aeeda2de6be3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29551, "upload_time": "2019-07-11T19:37:11", "url": "https://files.pythonhosted.org/packages/d0/2a/596154e27fa96176364e28934b0fda5a71fb6184ae2fd99ca2be8e2cbef8/protobuf_cloud_datastore_translator-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "df97f587eb4e7b282d70e63cadcf02f4", "sha256": "c2dadd9b8e78ba18ec30c5490b463a551398a05fa8662fb0132e82c641508989" }, "downloads": -1, "filename": "protobuf-cloud-datastore-translator-0.1.1.tar.gz", "has_sig": false, "md5_digest": "df97f587eb4e7b282d70e63cadcf02f4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26260, "upload_time": "2019-07-11T19:37:13", "url": "https://files.pythonhosted.org/packages/9a/84/e0c92d73243cfb3694ce0c4c032b263d26f9d13ec88b3c6da84c9221ee00/protobuf-cloud-datastore-translator-0.1.1.tar.gz" } ], "0.1.10": [ { "comment_text": "", "digests": { "md5": "60fcdaa86ce8d593d16af3f17efd3848", "sha256": "e098eb49a88b2df15d12a7757b1dd4f7097ea76bacaef281cbeb60a718e8d58d" }, "downloads": -1, "filename": "protobuf_cloud_datastore_translator-0.1.10-py3-none-any.whl", "has_sig": false, "md5_digest": "60fcdaa86ce8d593d16af3f17efd3848", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 46848, "upload_time": "2019-09-04T15:56:15", "url": "https://files.pythonhosted.org/packages/62/dd/881028692100a91fd86c59ebde188e50720e451e5008592567627b99ffd3/protobuf_cloud_datastore_translator-0.1.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4e64f29f65c8ae8d59eafdef35c37c6f", "sha256": "a6d25be6a98bed83488df8d2fbce16f049ca8710b995de93d844267f51470dc2" }, "downloads": -1, "filename": "protobuf-cloud-datastore-translator-0.1.10.tar.gz", "has_sig": false, "md5_digest": "4e64f29f65c8ae8d59eafdef35c37c6f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38637, "upload_time": "2019-09-04T15:56:17", "url": "https://files.pythonhosted.org/packages/71/1f/4068293a22b6f9494f8545e22cefde17e243d62e7ac268aed3d462056dce/protobuf-cloud-datastore-translator-0.1.10.tar.gz" } ], "0.1.11": [ { "comment_text": "", "digests": { "md5": "b48c651cc625c81c484ba644f7852a6e", "sha256": "898831a9b4bd60db595b78db8b4e385185417072c0eda84b2420854b4de3fc82" }, "downloads": -1, "filename": "protobuf_cloud_datastore_translator-0.1.11-py3-none-any.whl", "has_sig": false, "md5_digest": "b48c651cc625c81c484ba644f7852a6e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 46980, "upload_time": "2019-09-09T11:05:55", "url": "https://files.pythonhosted.org/packages/bd/56/ce79de4261a8245b14179e3afd89ddecd0a3988197721ff8e4f48d8f0297/protobuf_cloud_datastore_translator-0.1.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "516a8ea3f2a20b4de3c2b0ae02df2671", "sha256": "f2bdb7131e02953c69fc3c209fe843243462583af1d1dde06884bb26f18b400a" }, "downloads": -1, "filename": "protobuf-cloud-datastore-translator-0.1.11.tar.gz", "has_sig": false, "md5_digest": "516a8ea3f2a20b4de3c2b0ae02df2671", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38802, "upload_time": "2019-09-09T11:05:57", "url": "https://files.pythonhosted.org/packages/cc/14/cf301ec8767aaa3932ba8c82bcfb0e14a80de0c58ad18697fe2fce2cda01/protobuf-cloud-datastore-translator-0.1.11.tar.gz" } ], "0.1.12": [ { "comment_text": "", "digests": { "md5": "5bd6d566e34d5ffe7c9b98788f439fb3", "sha256": "fe12e3b57f381d47edec17663655a0cb8326c41186495b4fd4d5f522027bc520" }, "downloads": -1, "filename": "protobuf_cloud_datastore_translator-0.1.12-py3-none-any.whl", "has_sig": false, "md5_digest": "5bd6d566e34d5ffe7c9b98788f439fb3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 47032, "upload_time": "2019-09-24T16:40:44", "url": "https://files.pythonhosted.org/packages/fb/e8/a1fc06fb9909d17982376f4c76b413c584b436e1bbbbf67a2664de47f5fd/protobuf_cloud_datastore_translator-0.1.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ea22ddf8d473a515806f060da4dcc123", "sha256": "aa4ca16ce376e727797d9e2a967a02c54d9ad301766e2aeaaa4e07d9f9c68e8e" }, "downloads": -1, "filename": "protobuf-cloud-datastore-translator-0.1.12.tar.gz", "has_sig": false, "md5_digest": "ea22ddf8d473a515806f060da4dcc123", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38740, "upload_time": "2019-09-24T16:40:46", "url": "https://files.pythonhosted.org/packages/95/46/f724662e2762275d7bfa005dfca6b51f654c4920c8badfd8c36ae760815a/protobuf-cloud-datastore-translator-0.1.12.tar.gz" } ], "0.1.13": [ { "comment_text": "", "digests": { "md5": "b5af02520eb0324e123229f3d22cbc2b", "sha256": "d5a46cb5545112f7c08d83eba38fdca2a9cecddad304b8db4b32bbac59963269" }, "downloads": -1, "filename": "protobuf_cloud_datastore_translator-0.1.13-py3-none-any.whl", "has_sig": false, "md5_digest": "b5af02520eb0324e123229f3d22cbc2b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 48154, "upload_time": "2019-09-25T11:27:34", "url": "https://files.pythonhosted.org/packages/d3/2a/dcd8162791e061253f9766f909d73849d97dc0f2fe41b69f865ec333066d/protobuf_cloud_datastore_translator-0.1.13-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "88f0c7e501dc9420c91ef44caadc1606", "sha256": "4d8614df4d57af4665c2e8c08fc1ebc703c8c606dd6f9edfc5e0f465bbfa7b95" }, "downloads": -1, "filename": "protobuf-cloud-datastore-translator-0.1.13.tar.gz", "has_sig": false, "md5_digest": "88f0c7e501dc9420c91ef44caadc1606", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40213, "upload_time": "2019-09-25T11:27:37", "url": "https://files.pythonhosted.org/packages/25/e5/053863431f47ba48738318233d601c2774506765a0c451eba66e28083d70/protobuf-cloud-datastore-translator-0.1.13.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "ca753c89fa6f39161d5e5463db7689fa", "sha256": "6e8bf34ccd45d7f4e97c990ccd16f9685e69638588fb0aeb6994f4dbe2693495" }, "downloads": -1, "filename": "protobuf_cloud_datastore_translator-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "ca753c89fa6f39161d5e5463db7689fa", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 30417, "upload_time": "2019-07-16T09:49:30", "url": "https://files.pythonhosted.org/packages/47/c4/d2f794e91e855b0f8dd04c1e6d2fbfe5f742aed4b2db00abf24faa20b6a9/protobuf_cloud_datastore_translator-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "653770790378fd710419ecbf7582f365", "sha256": "d34097a852a9a8677d22b51ab7e43ddd1f37e6b028fa676e5c2b3a4d4364e773" }, "downloads": -1, "filename": "protobuf-cloud-datastore-translator-0.1.2.tar.gz", "has_sig": false, "md5_digest": "653770790378fd710419ecbf7582f365", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26478, "upload_time": "2019-07-16T09:49:32", "url": "https://files.pythonhosted.org/packages/fa/ac/c9030d18d5484f372514754d986653e3f01cad029936e4aa52d23194ffde/protobuf-cloud-datastore-translator-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "808e258ab1583d1557e534e2ac936800", "sha256": "19448f7b070969583a0c7d6eae8547d7ab53ed64fb5459d6dcc607e9b445f223" }, "downloads": -1, "filename": "protobuf_cloud_datastore_translator-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "808e258ab1583d1557e534e2ac936800", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 36968, "upload_time": "2019-07-28T15:50:47", "url": "https://files.pythonhosted.org/packages/ea/8a/cd0db984a71bc3020510f28e7ab4095ea39464b5f917d7e203f8356250ed/protobuf_cloud_datastore_translator-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "36eecee8bb64da878ce13ab432ac97fe", "sha256": "092114e3fb151efbfd56930f9af18b715bb63ed970cb3e880a9d9188779a565d" }, "downloads": -1, "filename": "protobuf-cloud-datastore-translator-0.1.3.tar.gz", "has_sig": false, "md5_digest": "36eecee8bb64da878ce13ab432ac97fe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31168, "upload_time": "2019-07-28T15:50:49", "url": "https://files.pythonhosted.org/packages/e3/cd/7814c9e0bcf2a083c6fcb9b7f09a84fab3748c320a5769f572c3d472e7e1/protobuf-cloud-datastore-translator-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "986f6258909f62e3a7f03d5ddf0a7f2e", "sha256": "cafc99b8a91c22555b340cf9e26683ca89482bd8ce9d38c4332592e03a0c59bc" }, "downloads": -1, "filename": "protobuf_cloud_datastore_translator-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "986f6258909f62e3a7f03d5ddf0a7f2e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 37517, "upload_time": "2019-07-29T11:24:38", "url": "https://files.pythonhosted.org/packages/f5/cb/b6490bb89d599e10bd610d75a41891bc3069b62261d23820434d7258de31/protobuf_cloud_datastore_translator-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7544a5ee113ab51ac5171545e709b9d4", "sha256": "898b9affb6d2ac7fbd0312d1e31c962051b95904193fa7d858955abef26c4964" }, "downloads": -1, "filename": "protobuf-cloud-datastore-translator-0.1.4.tar.gz", "has_sig": false, "md5_digest": "7544a5ee113ab51ac5171545e709b9d4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31683, "upload_time": "2019-07-29T11:24:40", "url": "https://files.pythonhosted.org/packages/c1/0a/5e6aa2c530f23c9db4a63326b39ab03add9ecb3ee4d6ed678943be123374/protobuf-cloud-datastore-translator-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "d33c9d71619d5ecf4d06f148972bd9e7", "sha256": "4f899886a71e1ca6811e2750e8e6132b859c8e7fb81f033a0a45d5a4e7221a8a" }, "downloads": -1, "filename": "protobuf_cloud_datastore_translator-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "d33c9d71619d5ecf4d06f148972bd9e7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 38081, "upload_time": "2019-08-16T17:31:44", "url": "https://files.pythonhosted.org/packages/44/dd/4543740cc88829b0723a9efaae3dc0fd2e6a4fbe0d78d11ad2c48e1cafb8/protobuf_cloud_datastore_translator-0.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8bf9cb4b3ecb31e48e91aa44c14f3e78", "sha256": "3d0f3282bfc9bb609ee86932ecbaf4cb1f8b1ff37aed461b58d6866ad143d6bf" }, "downloads": -1, "filename": "protobuf-cloud-datastore-translator-0.1.5.tar.gz", "has_sig": false, "md5_digest": "8bf9cb4b3ecb31e48e91aa44c14f3e78", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32153, "upload_time": "2019-08-16T17:31:46", "url": "https://files.pythonhosted.org/packages/d0/72/3b632c10289495e2bc811ee289775edc34d99922c49acccbfb65bcbcc6da/protobuf-cloud-datastore-translator-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "23c96a6906d4e24864aac6423832ae8d", "sha256": "72a3671164fa11b568bf420f3b067621fd7cfa7fdc5a710a2e254d9d6176a58c" }, "downloads": -1, "filename": "protobuf_cloud_datastore_translator-0.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "23c96a6906d4e24864aac6423832ae8d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 38202, "upload_time": "2019-08-21T16:35:53", "url": "https://files.pythonhosted.org/packages/73/60/d156dc94d27f21ce50de5152bc1a00b1b34a01eea29d42b6a8e05cb14d29/protobuf_cloud_datastore_translator-0.1.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "40fc36afcd6b0c33d0a73e6f6d1bbbf8", "sha256": "e2d2bda3bd64ff515416101ee18878e0888f5352d7165b178cab8c472215daeb" }, "downloads": -1, "filename": "protobuf-cloud-datastore-translator-0.1.6.tar.gz", "has_sig": false, "md5_digest": "40fc36afcd6b0c33d0a73e6f6d1bbbf8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32262, "upload_time": "2019-08-21T16:35:56", "url": "https://files.pythonhosted.org/packages/56/1a/e3bfd4048cfdb5b8dc9b44464c9fee89296e951982792db30dac323f0387/protobuf-cloud-datastore-translator-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "e9d08d58dc7f0271c1a5c4a131217eb4", "sha256": "73440661f30aed5d6d486d008ac588044ad0f3be0f0ca7d8877f33aecaf1a5fc" }, "downloads": -1, "filename": "protobuf_cloud_datastore_translator-0.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "e9d08d58dc7f0271c1a5c4a131217eb4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 42438, "upload_time": "2019-08-27T14:20:19", "url": "https://files.pythonhosted.org/packages/13/a3/c03a930f7914c592bb88046db69c3818c31d072f7e195846fca0deca0688/protobuf_cloud_datastore_translator-0.1.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8db7847382868c22fb18526bff39e3f0", "sha256": "6a65029991071ae1ceb8c0e0fefe0cde61924dde2ef3263512cdcc4ae56a3667" }, "downloads": -1, "filename": "protobuf-cloud-datastore-translator-0.1.7.tar.gz", "has_sig": false, "md5_digest": "8db7847382868c22fb18526bff39e3f0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36356, "upload_time": "2019-08-27T14:20:20", "url": "https://files.pythonhosted.org/packages/05/14/ad9a4ab511b067eaf8f03d87fa293cfac6f2ee23c01953b0c57a7990b625/protobuf-cloud-datastore-translator-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "a98c76d372d7375e3536c73a82970607", "sha256": "8792ef52641532fb5634bdcad7de56c0bea1415f1052af78d17d280782431040" }, "downloads": -1, "filename": "protobuf_cloud_datastore_translator-0.1.8-py3-none-any.whl", "has_sig": false, "md5_digest": "a98c76d372d7375e3536c73a82970607", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 46069, "upload_time": "2019-08-28T08:21:25", "url": "https://files.pythonhosted.org/packages/44/bd/5f0d526cb95b41fb577dc0807170f389fb189d158d87d63129fd43d38dcd/protobuf_cloud_datastore_translator-0.1.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c9cd8a4cac574ec04fd6208541f40709", "sha256": "1ae758e01c35b9aac3a6483f53ab981f8fa1f3e949a9ee835e939456c8297ad6" }, "downloads": -1, "filename": "protobuf-cloud-datastore-translator-0.1.8.tar.gz", "has_sig": false, "md5_digest": "c9cd8a4cac574ec04fd6208541f40709", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37768, "upload_time": "2019-08-28T08:21:27", "url": "https://files.pythonhosted.org/packages/89/e7/4905dd50e0043ca6783d976c511ce63eed087d5b23d2f8b0b713018ec692/protobuf-cloud-datastore-translator-0.1.8.tar.gz" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "d0b31b77ab4d569796f240395f674d2c", "sha256": "ff9ee55681a2adbec0a5fd77685b01e7d151914e295869125317743ec59f0bb3" }, "downloads": -1, "filename": "protobuf_cloud_datastore_translator-0.1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "d0b31b77ab4d569796f240395f674d2c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 46519, "upload_time": "2019-08-29T11:12:39", "url": "https://files.pythonhosted.org/packages/33/44/49db0756a3aac6a831a1805a3fcb15027732d0e85ab024ae392fbd24bc6d/protobuf_cloud_datastore_translator-0.1.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "15c45ac4b400a9f4eb4bc98e1408febd", "sha256": "eaa0a7926f87e04a5bc73652c52199c5d12a0b89a25b11fe1fc7465952a47192" }, "downloads": -1, "filename": "protobuf-cloud-datastore-translator-0.1.9.tar.gz", "has_sig": false, "md5_digest": "15c45ac4b400a9f4eb4bc98e1408febd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38300, "upload_time": "2019-08-29T11:12:46", "url": "https://files.pythonhosted.org/packages/37/cc/38f5145de3a607be56eb7eece12bae65df6eb8d5f32b18d176b89859f8ac/protobuf-cloud-datastore-translator-0.1.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "b5af02520eb0324e123229f3d22cbc2b", "sha256": "d5a46cb5545112f7c08d83eba38fdca2a9cecddad304b8db4b32bbac59963269" }, "downloads": -1, "filename": "protobuf_cloud_datastore_translator-0.1.13-py3-none-any.whl", "has_sig": false, "md5_digest": "b5af02520eb0324e123229f3d22cbc2b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 48154, "upload_time": "2019-09-25T11:27:34", "url": "https://files.pythonhosted.org/packages/d3/2a/dcd8162791e061253f9766f909d73849d97dc0f2fe41b69f865ec333066d/protobuf_cloud_datastore_translator-0.1.13-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "88f0c7e501dc9420c91ef44caadc1606", "sha256": "4d8614df4d57af4665c2e8c08fc1ebc703c8c606dd6f9edfc5e0f465bbfa7b95" }, "downloads": -1, "filename": "protobuf-cloud-datastore-translator-0.1.13.tar.gz", "has_sig": false, "md5_digest": "88f0c7e501dc9420c91ef44caadc1606", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40213, "upload_time": "2019-09-25T11:27:37", "url": "https://files.pythonhosted.org/packages/25/e5/053863431f47ba48738318233d601c2774506765a0c451eba66e28083d70/protobuf-cloud-datastore-translator-0.1.13.tar.gz" } ] }