{ "info": { "author": "Philip Schleihauf", "author_email": "uniphil@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "kale\n====\n[![Build Status](https://travis-ci.org/Calama/kale.png?branch=master)](https://travis-ci.org/Calama/kale)\n\nA convenient superclass and some helpers for stuff you want to keep in mongodb.\n\n\n**Note**: The master branch should be considered unstable. Releases are tagged,\nso checkout a tag or use a release published on pypi for production.\n\n\nMotivation\n----------\n\nPyMongo is awesome. Object-oriented data through model classes is awesome. kale\ntries to bridge those two, and get out of your way.\n\n\n### Why not just use PyMongo?\n\nYou should! It's awesome, and perfectly useable stand-alone. It keeps you\nconnected to your data, and to mongo itself, and I think that's important.\n\nKale does not try to stand as a layer to hide PyMongo from you. It simply\nchanges a couple things around to make more sense in the Model paradigm, and\ngive you something consistent to build your models on. It extends PyMongo.\n\n\n### blah blah blah\n\nabout the paradigm, why I don't like other ORMs. explicit++; schema\nvalidation--.\n\n\nQuick, Start!\n-------------\n\nThis is not a tutorial on PyMongo. There's a decent chance that PyMongo alone\nis enough for you. Start there.\n\n\n```python\nPython 2.7.3 (default, Sep 26 2012, 21:51:14) \n[GCC 4.7.2] on linux2\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n>>> from pymongo import MongoClient\n>>> from kale import Model\n>>> \n>>> def super_insecure_hash(to_hash):\n... hashed = \"\".join(str(ord(c)) for c in to_hash)\n... return hashed\n... \n>>> class User(Model):\n... _collection_name = 'users'\n... _database = MongoClient().test_database\n... \n... def __init__(self, username, password):\n... self.username = username\n... self.set_password(password)\n... \n... def set_password(self, password):\n... pw_hash = super_insecure_hash(password)\n... self.pw_hash = pw_hash\n... \n... def check_password(self, password_challenge):\n... hashed_challenge = super_insecure_hash(password_challenge)\n... return hashed_challenge == self.pw_hash # true if they match\n... \n>>> alice = User('alice', 'abc123')\n>>> alice.save()\nObjectId('513a4a99360e2e1697b81f15')\n>>> alice\n\n>>> del alice\n>>> \n>>> def login(username, password):\n... requested_user = User.collection.find_one({'username': username})\n... if requested_user.check_password(password):\n... return requested_user\n... else:\n... return 'Bad login!'\n... \n>>> faker = login('alice', '123456')\n>>> faker\n'Bad login!'\n>>> \n>>> real_alice = login('alice', 'abc123')\n>>> real_alice\n\n>>> real_alice.set_password('password')\n>>> real_alice.save()\nObjectId('513a4a99360e2e1697b81f15')\n>>> \n>>> User.collection.drop()\n>>> \n```\n\n\nkale provides you with a base class for your own models. This base class\nsubclasses python's `dict`, so it can be directly saved to Mongo.\n\nYou need to define two things in your models:\n\n 1. `_collection_name`, a string specifying the collection where instances of\n your models should be saved to and loaded from.\n\n 2. '_database', a PyMongo database instance.\n\nYour model will be provided with four attributes you should know about:\n\n 1. `Model.save`,\n 2. `Model.insert`,\n 3. `Model.remove`: These functions map\n almost directly to `PyMongo`'s `Collection.save`, etc. However, they are\n inteded for use on _instances of your model_. So you don't need to pass\n anything to them. If you have an instance of something, you can just call\n `save()` on it, and it'll be saved.\n\n 4. `Model.collection`: This attribute gives you a special version of\n `PyMongo`'s `Collection` object, tied to the model's collection (specified\n with `Model._collection_name`!). The special part is that any documents\n retrieved from mongo will be instantiations of the Model.\n\n The `Model.collection.raw()` method will give you access to `PyMongo`'s\n `Collection` for the model, unaltered.\n\n\nNotes\n-----\n\n * Collection-level operations are accessible though the `.collection`,\n eg. `MyModel.collection.find_one()`.\n\n * All documents returned through the collection will be instantiated as\n models. To get the raw json document, use `raw()`, eg.\n `MyModel.collection.raw().find_one()`.\n\n * Document-level operations are ported down directly to the model, eg.\n `MyModel().save()`. The model's `_id` will be passed in where appropriate.\n\n * There is no model-level `update`, since it clashes with `dict`'s `update`.\n Use `save`, or `Model.collection.update(instance, ...)`.\n\n * The model-level `remove` is restricted to only remove the model's document.\n\n * No special ref support... yet.\n\n * Feedback and tests welcome!\n\n * Kale does its best to cast dicts to `kale.AttrDict` recursively when you\n instantiate a `kale.Model`, but it can't do magic -- If you do\n `my_model_instance.listproperty.append({'some': 'dict'})`, it will be a\n dict, not an `AttrDict`. However, if a document with this structure is\n retrieved from the database, `dict`s in iterables _will_ be cast to\n `AttrDict`s (as of v0.2.1).\n\n\nChangelog\n---------\n\n### v0.3\n\n * Added live-instance registry that ensure only one instance of a document's\n model exists in the program.\n * Added `collectionmethod` decorator.\n\n\n### v0.2.2\n * fix some casting stuff\n\n### v0.2.1\n\n * bugfix for casting dicts in iterables to AttrDict.", "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/Calama/kale", "keywords": null, "license": ":) released by Calama Consulting", "maintainer": null, "maintainer_email": null, "name": "kale", "package_url": "https://pypi.org/project/kale/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/kale/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/Calama/kale" }, "release_url": "https://pypi.org/project/kale/0.2.4/", "requires_dist": null, "requires_python": null, "summary": "Tiny PyMongo model layer", "version": "0.2.4" }, "last_serial": 981722, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "3411eab767606694ed2d305713a8bba8", "sha256": "769816b8319d8aea44941ae746300cb961fdab853eeceecbba99917ea6095767" }, "downloads": -1, "filename": "kale-0.0.1.tar.gz", "has_sig": false, "md5_digest": "3411eab767606694ed2d305713a8bba8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2881, "upload_time": "2013-02-26T20:19:30", "url": "https://files.pythonhosted.org/packages/f0/7c/507679683ba37a399f0d1053c6edb1cf498737f5daef3c2a9c0847ec7039/kale-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "395340a45c1e6109b538fd6dbe525e36", "sha256": "03b4756ae689e3b2582805326a914afa8b7c6bb9eccfb3c6012eb023bab136fe" }, "downloads": -1, "filename": "kale-0.0.2.tar.gz", "has_sig": false, "md5_digest": "395340a45c1e6109b538fd6dbe525e36", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3188, "upload_time": "2013-02-26T20:31:48", "url": "https://files.pythonhosted.org/packages/b9/49/8170568f737b517d7507806704f2cac026684ca353398dcf6fc92c877aef/kale-0.0.2.tar.gz" } ], "0.0.21": [ { "comment_text": "", "digests": { "md5": "19ed72c25a9c24cd9639da40e3aa28eb", "sha256": "3f4f6d8de25b3f4d3e5c981a259b15cfe733156421433531be80111cd6e0b719" }, "downloads": -1, "filename": "kale-0.0.21.tar.gz", "has_sig": false, "md5_digest": "19ed72c25a9c24cd9639da40e3aa28eb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3182, "upload_time": "2013-02-26T20:41:11", "url": "https://files.pythonhosted.org/packages/45/24/1975428b19d5a0c23eea9d721282905649d7e3e6d54829a448017a9a8bb6/kale-0.0.21.tar.gz" } ], "0.0.22": [ { "comment_text": "", "digests": { "md5": "acceec39b48a5de319c351b7b86f7b61", "sha256": "5901d2870f9c23b0c1262b34d0d6091137799888027679dc076e435f219ddfe7" }, "downloads": -1, "filename": "kale-0.0.22.tar.gz", "has_sig": false, "md5_digest": "acceec39b48a5de319c351b7b86f7b61", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3269, "upload_time": "2013-02-26T20:45:11", "url": "https://files.pythonhosted.org/packages/de/75/656c813ea078a4fca473ae876fab1734f2fac2c59daaf2b9b030218c7e53/kale-0.0.22.tar.gz" } ], "0.1": [ { "comment_text": "", "digests": { "md5": "a92657f32da408631bfda76ad720a186", "sha256": "5a6959db29c0fc6a7c60d9e824bfa315fbf7e0ecc19d4d297790fc64e9ae7bd0" }, "downloads": -1, "filename": "kale-0.1.tar.gz", "has_sig": false, "md5_digest": "a92657f32da408631bfda76ad720a186", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5146, "upload_time": "2013-03-08T20:41:12", "url": "https://files.pythonhosted.org/packages/8c/17/9b55a1e821938e61ddb5d4fec2416f25775782739b3df66a1cda4f74174b/kale-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "95a5bfb216c386b94f8d463be290822b", "sha256": "2e175ebd0e5fa02d1a69cbab6fb622bcbcca3983c09941edb995a1581ee65b7b" }, "downloads": -1, "filename": "kale-0.1.1.tar.gz", "has_sig": false, "md5_digest": "95a5bfb216c386b94f8d463be290822b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5169, "upload_time": "2013-03-13T23:29:10", "url": "https://files.pythonhosted.org/packages/20/c4/619da4054ad54a1c3ab0d77237f9e1a81419b7248cc288a7e139b65d50ea/kale-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "5202d8517f9ef672b22fd7be9b2787bd", "sha256": "974d2b1f0c6070bb5587847bb97f9d061fa69cac6056dd04afd0019b269a483e" }, "downloads": -1, "filename": "kale-0.1.2.tar.gz", "has_sig": false, "md5_digest": "5202d8517f9ef672b22fd7be9b2787bd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5153, "upload_time": "2013-03-14T16:09:32", "url": "https://files.pythonhosted.org/packages/f3/e0/139d7c464e4e8f2f0e28b66552f76b8a7939c4340a67b7c3fd4cb5c9cbd6/kale-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "5628cab1d0b0c1530f902d56b1f37b2f", "sha256": "c3f6448f825a4019df327ba865935899662344a0f0a15d9eb1ea83572f38e845" }, "downloads": -1, "filename": "kale-0.1.3.tar.gz", "has_sig": false, "md5_digest": "5628cab1d0b0c1530f902d56b1f37b2f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5237, "upload_time": "2013-03-16T07:08:13", "url": "https://files.pythonhosted.org/packages/80/f5/d4df852386cf41e9fee91bc775f023de7cf488b84d225d32b8bb0611bc36/kale-0.1.3.tar.gz" } ], "0.1rc1": [ { "comment_text": "", "digests": { "md5": "b0d9a1c27c0b56b773fd7f0124165885", "sha256": "6738a9f89d8046312c14c551382e9ae2789bf661ceb7baab987a8a1649de4bfb" }, "downloads": -1, "filename": "kale-0.1rc1.tar.gz", "has_sig": false, "md5_digest": "b0d9a1c27c0b56b773fd7f0124165885", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3335, "upload_time": "2013-03-05T11:24:46", "url": "https://files.pythonhosted.org/packages/83/64/f068a8dad14ff03c5e174c913d3248f41b159636414930fc3230b1b18a18/kale-0.1rc1.tar.gz" } ], "0.1rc2": [ { "comment_text": "", "digests": { "md5": "dc8fae411b3c609ac09e99080ebf74e7", "sha256": "94af338f15845b77b93d6bb9554a2edd49d63b69df0c97e451c64ba60bbcc525" }, "downloads": -1, "filename": "kale-0.1rc2.tar.gz", "has_sig": false, "md5_digest": "dc8fae411b3c609ac09e99080ebf74e7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3418, "upload_time": "2013-03-06T05:52:16", "url": "https://files.pythonhosted.org/packages/96/31/0d3e30d651697884a0b8f54c52a433c837f61347c34749f8bdc984e554c0/kale-0.1rc2.tar.gz" } ], "0.1rc3": [ { "comment_text": "", "digests": { "md5": "d14bec62468c804c24d65e87126cbc8a", "sha256": "8bf296c6b114debd56ee334c278411a1819bb5ec5668cbb3eee1c6adec48ec9b" }, "downloads": -1, "filename": "kale-0.1rc3.tar.gz", "has_sig": false, "md5_digest": "d14bec62468c804c24d65e87126cbc8a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4890, "upload_time": "2013-03-06T20:15:02", "url": "https://files.pythonhosted.org/packages/5a/d4/22767212b4ed9865251bfcb996d223a7a18d76c197eddf97f544f2aedbd5/kale-0.1rc3.tar.gz" } ], "0.1rc3a": [ { "comment_text": "", "digests": { "md5": "97a37cc67b0e81b48878b09ec050792e", "sha256": "a0ed1fdcd3f4d8e24c8317e794eef66b595617b7d0d023a7641fa8bc2d01d359" }, "downloads": -1, "filename": "kale-0.1rc3a.tar.gz", "has_sig": false, "md5_digest": "97a37cc67b0e81b48878b09ec050792e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5088, "upload_time": "2013-03-07T01:32:38", "url": "https://files.pythonhosted.org/packages/d8/7a/ca927cb2db498c17fb12bbc3704d1bb9de958599b94b66daa4ee8465c601/kale-0.1rc3a.tar.gz" } ], "0.1rc4": [ { "comment_text": "", "digests": { "md5": "fb2242bea22adb1b72de1064e9e12853", "sha256": "1bf36d5dbcbd027cf5401bfa814452974a194c511cce9345053efadb9bc98785" }, "downloads": -1, "filename": "kale-0.1rc4.tar.gz", "has_sig": false, "md5_digest": "fb2242bea22adb1b72de1064e9e12853", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5060, "upload_time": "2013-03-07T01:53:21", "url": "https://files.pythonhosted.org/packages/59/7b/6f3657fee4322ad59613d82eebd63863a8bcbefa9cc55ca53ef754800ad6/kale-0.1rc4.tar.gz" } ], "0.1rc5": [ { "comment_text": "", "digests": { "md5": "611daa4d00981028ff82505bdd612cdf", "sha256": "4ef69cb983ee648f293b61e19b706eabb80321a4ad1863ccbf7faed762e05035" }, "downloads": -1, "filename": "kale-0.1rc5.tar.gz", "has_sig": false, "md5_digest": "611daa4d00981028ff82505bdd612cdf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5072, "upload_time": "2013-03-07T02:22:17", "url": "https://files.pythonhosted.org/packages/3a/c1/b5a14505f30b57f256c45eb7a4fab31c12a28024c20828135f289e2d2cf4/kale-0.1rc5.tar.gz" } ], "0.1rc6": [ { "comment_text": "", "digests": { "md5": "b51792893147c6202f5e7c90496a3b5b", "sha256": "bff3fe483399ffa6a5ec519083abdd91045ac181f3bf5bb3a2f40cdeb54b1460" }, "downloads": -1, "filename": "kale-0.1rc6.tar.gz", "has_sig": false, "md5_digest": "b51792893147c6202f5e7c90496a3b5b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5216, "upload_time": "2013-03-07T15:49:35", "url": "https://files.pythonhosted.org/packages/ad/aa/cd89bd35f3e7378dccf9dca14d1c202a314d2596ebf7b86af6b13a7111e2/kale-0.1rc6.tar.gz" } ], "0.1rc7": [ { "comment_text": "", "digests": { "md5": "1959e64e96d1bf5866d5baf7c61cfdf9", "sha256": "d071653f91ce57ed9a37b5aeaac699cac36c6f9c874a5a02bac0d332ab663691" }, "downloads": -1, "filename": "kale-0.1rc7.tar.gz", "has_sig": false, "md5_digest": "1959e64e96d1bf5866d5baf7c61cfdf9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5221, "upload_time": "2013-03-08T00:23:46", "url": "https://files.pythonhosted.org/packages/13/9f/07f04f65a9e3309fa432809f50e6d0bbe7d7c91fcda0100f8f902a15037c/kale-0.1rc7.tar.gz" } ], "0.1rc7a": [ { "comment_text": "", "digests": { "md5": "2fd848646b4c7a95ed1235add3fd9c66", "sha256": "03c5d51660c34bb271a12f189ae992879b7b0c6c188a8d6a08909ce03d4f78ea" }, "downloads": -1, "filename": "kale-0.1rc7a.tar.gz", "has_sig": false, "md5_digest": "2fd848646b4c7a95ed1235add3fd9c66", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5152, "upload_time": "2013-03-08T20:33:02", "url": "https://files.pythonhosted.org/packages/89/5b/7cf8aff4f3860f52c509b6279fc2468eb9b26848d76881e35655824073ba/kale-0.1rc7a.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "46d2fbf3faf714d5fa5554f6da0d105a", "sha256": "4cc70fb3d3405dbfbc38f04508da1f34f0cf506726ea2e0e5e980a83db7af3af" }, "downloads": -1, "filename": "kale-0.2.tar.gz", "has_sig": false, "md5_digest": "46d2fbf3faf714d5fa5554f6da0d105a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5233, "upload_time": "2013-03-16T07:21:59", "url": "https://files.pythonhosted.org/packages/47/b1/22220d3150534512cc857a1c6f34ca028e0edc8da922de5a2ae90cbe163f/kale-0.2.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "757aaa4eabbe9251d37436e49ee1e1fa", "sha256": "1e3373cb7e8b02e7dc3e4fa9b937078b591abcf7c6c575bd46b0c27ecc8d4550" }, "downloads": -1, "filename": "kale-0.2.1.tar.gz", "has_sig": false, "md5_digest": "757aaa4eabbe9251d37436e49ee1e1fa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5885, "upload_time": "2013-08-09T18:22:15", "url": "https://files.pythonhosted.org/packages/6b/1b/1cd46573eac25a0dafc05ae94590d08647e3ae402a444cf2ca3b14e0bce4/kale-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "5b5cfcb55b31152eb81ab033d7154ea6", "sha256": "eb4d83a0f48eed0e8ee3ec7e95b7308cdf6893aac37ee989b022a3bdf8f7da01" }, "downloads": -1, "filename": "kale-0.2.2.tar.gz", "has_sig": false, "md5_digest": "5b5cfcb55b31152eb81ab033d7154ea6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5957, "upload_time": "2013-10-11T02:24:13", "url": "https://files.pythonhosted.org/packages/ff/16/aaf716ef32c8c05f2d604856ef84b36066b6eb2a37f3cbda67982b2221c3/kale-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "16f5ea7bf195e512de43834acd391745", "sha256": "bff58421729c49154786fe9802d11c7bf713ccb8e10e45c87b5a20f57f8461ce" }, "downloads": -1, "filename": "kale-0.2.3.tar.gz", "has_sig": false, "md5_digest": "16f5ea7bf195e512de43834acd391745", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6013, "upload_time": "2013-10-11T03:44:07", "url": "https://files.pythonhosted.org/packages/23/c7/2982c7e8ae07722579c63bf19d8d16f52f480a2443cef1bca191512e4a01/kale-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "a6d9c4162259956e4891b196a01d9c92", "sha256": "8772f816938b27fd016395829247275d20e73c7fd3419ea82ed9f9faf060bdac" }, "downloads": -1, "filename": "kale-0.2.4.tar.gz", "has_sig": false, "md5_digest": "a6d9c4162259956e4891b196a01d9c92", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5967, "upload_time": "2014-01-26T09:40:55", "url": "https://files.pythonhosted.org/packages/b6/00/16228a3dd048a06771a18caa2c9189beef543d5b2d84be8590e830458d30/kale-0.2.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a6d9c4162259956e4891b196a01d9c92", "sha256": "8772f816938b27fd016395829247275d20e73c7fd3419ea82ed9f9faf060bdac" }, "downloads": -1, "filename": "kale-0.2.4.tar.gz", "has_sig": false, "md5_digest": "a6d9c4162259956e4891b196a01d9c92", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5967, "upload_time": "2014-01-26T09:40:55", "url": "https://files.pythonhosted.org/packages/b6/00/16228a3dd048a06771a18caa2c9189beef543d5b2d84be8590e830458d30/kale-0.2.4.tar.gz" } ] }