{ "info": { "author": "Victor Makarov", "author_email": "vitja.makarov@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "DictObject\n==========\n\nSubclassing this type you can declare your object model. `DictObject` itself is\n`dict` subclass so you can access object properties as attribute or as an item:\n\n .. code-block:: python\n\n class Foo(dicty.DictObject):\n foo = dicty.Field()\n\n obj = Foo(foo='bar')\n obj.foo # 'bar'\n obj['foo'] # 'bar'\n\nObject constructor accepts properties as keyword arguments, or you can create\ninstance with `fromjson()` classmethod that takes object dictionary (e.g. result\n`json.loads()`) as an argument:\n\n .. code-block:: python\n\n obj = Foo(foo='bar')\n obj = Foo.fromjson({'foo': 'bar'})\n\nYou can pass `DictObject` instance directly to json library or call `jsonize()`\nmethod first that will return plain dict version of your object with only\ndeclared fields left:\n\n .. code-block:: python\n\n obj = Foo.fromjson({'foo': 123, 'bar': 123})\n obj == {'foo': 123, 'bar': 123}\n obj.jsonize() == {'foo': 123}\n\nName aliasing\n-------------\n\nIf you don't like naming scheme in JSON objects, API and so on. Dicty allows to\nchoose whatever python name you like while manually specify dictionary key. For\ninstance map camel-case keys to their underscore counterparts:\n\n .. code-block:: python\n\n class Foo(dicty.DictObject):\n prop_foo = dicty.Field('propFoo')\n\n obj = Foo(prop_foo=123)\n obj = Foo.fromjson({'propFoo': 123})\n obj.prop_foo\n obj['propFoo']\n\n\nSubclassing\n-----------\n\n`DictObject` supports subclassing:\n\n .. code-block:: python\n\n class Foo(dicty.DictObject):\n foo = dicty.Field()\n\n\n class Bar(Foo):\n bar = dicty.Field()\n\n\n obj = Bar.fromjson({'foo': 1, 'bar': 2})\n print obj.jsonize() # {'foo': 1, 'bar': 2}\n\nMixins are supported as well:\n\n .. code-block:: python\n\n class FooMixIn(object):\n foo = dicty.Field()\n\n\n class Bar(dicty.DictObject, FooMixIn):\n bar = dicty.Field()\n\n\n obj = Bar.fromjson({'foo': 1, 'bar': 2})\n print obj.jsonize() # {'foo': 1, 'bar': 2}\n\n\nFields\n======\n\n`dicty.Field` is baseclass for all dicty fields. You can use itself directly to\ndeclare a field with no special type info.\n\nOptional fields and default values\n----------------------------------\n\nAccessing field that is not set will lead to `AttributeError`:\nYou can specify default value for your field:\n\n .. code-block:: python\n\n class Foo(dicty.DictObject):\n foo = dicty.Field()\n\n obj = Foo()\n obj.foo # raises AttributeError\n\nYou can mark field as optional, in this case `None` will be returned if it was\nnot set before:\n\n .. code-block:: python\n\n class Foo(dicty.DictObject):\n foo = dicty.Field(optional=True)\n\n obj = Foo()\n obj.foo # None\n\nFor optional fields you can specify default value other than `None` with\n`default` argument:\n\n .. code-block:: python\n\n class Foo(dicty.DictObject):\n foo = dicty.Field(optional=True, default=123)\n\n obj = Foo()\n obj.foo # 123\n obj == {}\n\nPlease note that default value does not affect internal dictionary. But if\ndefault value is NOT hashable dict key will be set on `getattr` access.\n\nThere is also an option to suply `default_func` it's get default value for\nobject's field. It takes object instance as an argument. Value returned by\n`default_func` is always stored in dict:\n\n .. code-block:: python\n\n class Foo(dicty.DictObject):\n id = dicty.Field(optional=True, default_func=lambda obj: uuid.uuid4().hex)\n\n obj = Foo()\n obj == {}\n obj.id # Would be populated with newly generated UUID\n obj == {'id': '07d0af8affaf46c885cc251e17dbc37a'}\n\n\nAvailable Fields\n----------------\n\nDicty is shipped with the follwing:\n\n`BooleanField`\n\n`DateField`\n\n`DatetimeField`\n\n`DictField`\n\n`FloatField`\n\n`IntegerField`\n\n`ListField`\n\n`NativeDateField`\n\n`NativeDatetimeField`\n\n`NumberField`\n\n`RegexpStringField`\n\n`StringField`\n\n`TypedDictField`\n\n`TypedListField`\n\n`TypedObjectField`\n\n\nSample usage\n============\n\nWith dicty you can easily describe your data model and then use it to encode/decode JSON objects. It supports\ndata validataion, optional parameters, default values, nested objects and so on. \n\n\n .. code-block:: python\n\n import dicty\n\n\n class MyDoc(dicty.DictObject):\n prop1 = dicty.StringField()\n prop2 = dicty.IntegerField()\n\n # Regular constructor\n doc = MyDoc(prop1='foo', prop2=123)\n print doc.prop1 # you can access values as attributes\n print doc['prop2'] # as well as dictionary items\n\n print json.dumps(doc)\n print json.dumps(doc.jsonify()) # Jsonify will clean and validate output data\n\n # Create instance from dictionary\n doc = MyDoc.fromjson({'prop1': 'foo', 'prop2': 123})\n\n # would raise dicty.FieldError here\n doc = MyDoc.fromjson({'prop1': 123, 'prop2': 123})\n\n\nNested Objects\n==============\n\n .. code-block:: python\n\n import dicty\n\n\n class Foo(dicty.DictObject):\n class Bar(dicty.DictObject):\n prop = dicty.StringField()\n\n bar = dicty.TypedObjectField(Bar)\n\n obj = Foo()\n obj.bar.prop = 123\n print obj # {'bar': {'prop': 123}}\n\n\n.. _CornerApp: https://cornerapp.com/\n\n\nMongo-style key pathes\n======================\n\nDicty allows to build key pathes that can be used to create mongo query:\n\n .. code-block:: python\n\n class Foo(dicty.DictObject):\n bar = dicty.Field('myBar')\n\n print Foo.bar # 'myBar' full path to the item\n print Foo.bar.key # 'myBar' only leaf key\n print Foo.bar.attname # 'bar' python attribute name\n\n\nNested object:\n\n .. code-block:: python\n\n class Bar(dicty.DictObject):\n foo = dicty.TypedObjectField(Foo)\n\n print Bar.foo # 'foo'\n print Bar.foo.bar # 'foo.myBar'\n\nList of objects:\n\n .. code-block:: python\n\n class Bar(dicty.DictObject):\n items = dicty.TypedListField(Foo)\n\n print Bar.items.foo # 'items.myBar' without index\n print Bar.items[0].foo # 'items.0.myBar' indexed path\n\nDict of objects:\n\n .. code-block:: python\n\n class Bar(dicty.DictObject):\n items = dicty.TypedDictField(Foo)\n\n # With index\n print Bar.items['maurice'].bar # 'items.maurice.myBar'\n\n # Would raise IndexError\n print Bar.items['x.y'].bar", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/vitek/dicty", "keywords": null, "license": "UNKNOWN", "maintainer": null, "maintainer_email": null, "name": "dicty", "package_url": "https://pypi.org/project/dicty/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/dicty/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/vitek/dicty" }, "release_url": "https://pypi.org/project/dicty/0.1.1/", "requires_dist": null, "requires_python": null, "summary": "A library for mapping dictionaries to Python objects", "version": "0.1.1" }, "last_serial": 2855468, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "578b6f8e928dcc5d910d7c4234f5004b", "sha256": "d35cbc091e89946f7f8840c4560e31de9b44e7daee4c286fa4d0745b0ffd00c2" }, "downloads": -1, "filename": "dicty-0.1.tar.gz", "has_sig": false, "md5_digest": "578b6f8e928dcc5d910d7c4234f5004b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3868, "upload_time": "2016-06-07T04:55:52", "url": "https://files.pythonhosted.org/packages/21/95/ea620c42414401c9656ae34bf41264c03359f5720eb8339fd595c78c56e2/dicty-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "cd2f2fa7a0f4c703db01325950bb9bae", "sha256": "32302f627e9c4990031bc20cb364b139b6f384da3147c77c3165a3cacc71545e" }, "downloads": -1, "filename": "dicty-0.1.1.tar.gz", "has_sig": false, "md5_digest": "cd2f2fa7a0f4c703db01325950bb9bae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6493, "upload_time": "2017-05-06T07:13:29", "url": "https://files.pythonhosted.org/packages/7e/17/f25df974c6fae8cb86f7e57eedf01c9b60ce47b51f094aa25856a0acee60/dicty-0.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "cd2f2fa7a0f4c703db01325950bb9bae", "sha256": "32302f627e9c4990031bc20cb364b139b6f384da3147c77c3165a3cacc71545e" }, "downloads": -1, "filename": "dicty-0.1.1.tar.gz", "has_sig": false, "md5_digest": "cd2f2fa7a0f4c703db01325950bb9bae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6493, "upload_time": "2017-05-06T07:13:29", "url": "https://files.pythonhosted.org/packages/7e/17/f25df974c6fae8cb86f7e57eedf01c9b60ce47b51f094aa25856a0acee60/dicty-0.1.1.tar.gz" } ] }