{ "info": { "author": "Marcel Nicolay", "author_email": "marcel.nicolay@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved", "Natural Language :: English", "Natural Language :: Portuguese (Brazilian)", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 2.7", "Topic :: Software Development :: Libraries :: Application Frameworks" ], "description": "# What is MongoTor ?\n\n(MONGOdb + TORnado) is an asynchronous toolkit for working with ``mongodb`` inside a ``tornado`` app. Mongotor has a pure implementation of python + tornado and only depends on tornado and bson (provided by pymongo)\n\n[![Build Status](https://travis-ci.org/marcelnicolay/mongotor.svg?branch=master)](https://travis-ci.org/marcelnicolay/mongotor)\n\n## Features\n\nMongoTor is still an alpha project, but already implements the following features:\n\n* Support for ``replica sets``\n* Automatic ``reconnection``\n* Connection ``pooling``\n* Support for running database commands (``count``, ``sum``, ``mapreduce`` etc...)\n* ``ORM`` like to map documents and fields\n* ``Signals`` for pre_save, post_save, pre_remove, post_remove, pre_update and post_update\n* 100% of code coverage by test\n\nThe next steps are provide support to:\n\n* sharding\n* authentication\n* nearest preference in replica sets\n* gridfs\n* all python versions (2.5, 2.6, 2.7, 3.2 and PyPy), only python 2.7 is tested now\n\n## Documentation\n\nVisit our online [documentation](http://mongotor.readthedocs.org/) for more examples\n\n## Why not pymongo ?\n\n[PyMongo](http://api.mongodb.org/python/current/) is a recommended way to work with MongoDB in python, but isn't asynchronous and not run inside de tornado's ioloop. If you use pymongo you won't take the advantages of tornado.\n\n## Why not motor ?\n\n[Motor](http://emptysquare.net/motor/) wraps PyMongo and makes it async with greenlet. Is a great project, but it uses greenlet. If you can use greenlets why not use gevent instead of tornado? PyMongo already works with gevent and you dont need to thinking about write all of your code with callbacks. My point is, if you are using a very powerfull non-blocking web server with a pure python code, you'll probably want to work with a pure tornado driver for accessing mongo, obviously since this module has a full support to mongodb features like pymongo.\n\n## Why not asyncmongo ?\n\n[AsyncMongo](https://github.com/bitly/asyncmongo) is an asynchronous library for accessing mongodb with tornado.ioloop, but don't implement replica set and other mongodb features.\n\nBesides, this project is not walking very well, or better, very fast. Exist a lot of issues and pull requests that aren't looked.\n\nI am very thankful to asyncmongo, i worked with it in some projects and it's been served as inspiration, but now, I am very excited to write my own library, more flexible, fast, secure and that will walking faster.\n\n\n## Installing\n\n```bash\npip install mongotor\n```\n\n## Simple usage\n\n```python\nimport tornado.web\nfrom tornado import gen\nfrom mongotor.database import Database\nfrom bson import ObjectId\n\nclass Handler(tornado.web.RequestHandler):\n\n def initialize(self):\n self.db = Database.init('localhost:27017', 'mongotor_test')\n\n @tornado.web.asynchronous\n @gen.engine\n def get(self):\n user = {'_id': ObjectId(), 'name': 'User Name'}\n yield gen.Task(self.db.user.insert, user)\n \n yield gen.Task(self.db.user.update, user['_id'], {\"$set\": {'name': 'New User Name'}})\n\n user_found = yield gen.Task(self.db.user.find_one, user['_id'])\n assert user_found['name'] == 'New User Name'\n\n yield gen.Task(self.db.user.remove, user['_id'])\n```\n\n## Support to ReplicaSet\n\n```python\nimport tornado.web\nfrom tornado import gen\nfrom mongotor.database import Database\nfrom mongotor.node import ReadPreference\nfrom bson import ObjectId\nimport time\n\n\nclass Handler(tornado.web.RequestHandler):\n\n def initialize(self):\n # configuring an replica set\n self.db = db = Database.init([\"localhost:27027\", \"localhost:27028\"], dbname='mongotor_test',\n read_preference=ReadPreference.SECONDARY_PREFERRED)\n\n @tornado.web.asynchronous\n @gen.engine\n def get(self):\n user = {'_id': ObjectId()}\n \n # write on primary\n yield gen.Task(self.db.user.insert, user)\n \n # wait for replication\n time.sleep(2)\n\n # read from secondary\n user_found = yield gen.Task(self.db.user.find_one, user['_id'])\n assert user_found == user\n```\n\n## Using ORM\n\n```python\nfrom mongotor.orm import collection, field\nfrom mongotor.database import Database\n\nfrom datetime import datetime\nimport tornado.web\nfrom tornado import gen\n\n# A connection to the MongoDB database needs to be\n# established before perform operations\nDatabase.init(['localhost:27017','localhost:27018'], 'mongotor_test')\n\nclass User(collection.Collection):\n __collection__ = \"user\"\n\n _id = field.ObjectIdField()\n name = field.StringField()\n active = field.BooleanField()\n created = field.DateTimeField()\n\nclass Handler(tornado.web.RequestHandler):\n\n @tornado.web.asynchronous\n @gen.engine\n def get(self):\n user = User()\n user.name = \"User name\"\n user.active = True\n user.created = datetime.now()\n\n yield gen.Task(user.save)\n\n # update date\n user.name = \"New name\"\n yield gen.Task(user.update)\n\n # find one object\n user_found = yield gen.Task(User.objects.find_one, user._id)\n\n # find many objects\n new_user = User()\n new_user.name = \"new user name\"\n new_user.user.active = True\n new_user.created = datetime.now()\n\n users_actives = yield gen.Task(User.objects.find, {'active': True})\n\n users_actives[0].active = False\n yield gen.Task(users_actives[0].save)\n\n # remove object\n yield gen.Task(user_found.remove)\n```\n\n## Contributing\n\nWrite tests for your new feature and send a pull request.\n\nFor run mongotor tests install mongodb and do:\n\n```bash\n# create a new virtualenv\nmkvirtualenv mongotor\n\n# install dev requirements\npip install -r requirements-dev.txt\n\n# start mongo\nmake mongo-start\n\n# configure replicaset\nmake mongo-config\n\n# run tests\nmake test\n```\n\n## Issues\n\nPlease report any issues via [github issues](https://github.com/marcelnicolay/mongotor/issues)", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://marcelnicolay.github.com/mongotor/", "keywords": "mongo,tornado", "license": "OSI", "maintainer": null, "maintainer_email": null, "name": "mongotor", "package_url": "https://pypi.org/project/mongotor/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/mongotor/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://marcelnicolay.github.com/mongotor/" }, "release_url": "https://pypi.org/project/mongotor/0.1.0/", "requires_dist": null, "requires_python": null, "summary": "(MongoDB + Tornado) is an asynchronous driver and toolkit for working with MongoDB inside a Tornado app", "version": "0.1.0" }, "last_serial": 1122046, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "27b197ab97515465ea4bc2a67ccfa4f1", "sha256": "eeeb17728ee0b49c6211001e75df28e431f6de50fa166d1bea2c2bcd681c21dc" }, "downloads": -1, "filename": "mongotor-0.0.1.tar.gz", "has_sig": false, "md5_digest": "27b197ab97515465ea4bc2a67ccfa4f1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16334, "upload_time": "2012-09-04T00:43:07", "url": "https://files.pythonhosted.org/packages/52/19/3100049830ae5f9018ace997a60a8b4cbb5f47250f2d5bd159764a657f22/mongotor-0.0.1.tar.gz" } ], "0.0.10": [ { "comment_text": "", "digests": { "md5": "60417072331b2241602a31a6b3961572", "sha256": "ca0bddfaefdb6ac271555e36a4df594f8ecac42d62039b485ffd2feb4ec6699a" }, "downloads": -1, "filename": "mongotor-0.0.10.tar.gz", "has_sig": false, "md5_digest": "60417072331b2241602a31a6b3961572", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16597, "upload_time": "2012-11-07T18:35:02", "url": "https://files.pythonhosted.org/packages/12/f7/12108366f428ca22cc3005ff3e7c32440965fe84912c1f8f83063634f4be/mongotor-0.0.10.tar.gz" } ], "0.0.11": [ { "comment_text": "", "digests": { "md5": "733e165d9c18f5c0a5860806a62630d1", "sha256": "52bfbb795a9120e6995fc6659bd68824bf0487366c585f20a0a2e39b7ca3fec3" }, "downloads": -1, "filename": "mongotor-0.0.11.tar.gz", "has_sig": false, "md5_digest": "733e165d9c18f5c0a5860806a62630d1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16897, "upload_time": "2012-11-08T00:35:37", "url": "https://files.pythonhosted.org/packages/0b/41/a4287e4e6e0024781de6d432790e4c7a0952d96abfc9bbf8f24018c01295/mongotor-0.0.11.tar.gz" } ], "0.0.12": [ { "comment_text": "", "digests": { "md5": "69c19f72250ab86802b90d2cb9550678", "sha256": "1806f153b62a0a78924f2eda0d5105f65c16d04043b69cfbe74be80399a66e20" }, "downloads": -1, "filename": "mongotor-0.0.12.tar.gz", "has_sig": false, "md5_digest": "69c19f72250ab86802b90d2cb9550678", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16915, "upload_time": "2012-11-08T18:51:38", "url": "https://files.pythonhosted.org/packages/69/1b/5954f1c8edabc322987946efe35c5daf60625dda656cd5a84b5079ee2c9a/mongotor-0.0.12.tar.gz" } ], "0.0.13": [ { "comment_text": "", "digests": { "md5": "9e9aa17b793ec897780b579066e2d9ff", "sha256": "a034f929effd005359243ddfff9bb297d5649166b864f014c927cac3e938fce7" }, "downloads": -1, "filename": "mongotor-0.0.13.tar.gz", "has_sig": false, "md5_digest": "9e9aa17b793ec897780b579066e2d9ff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17093, "upload_time": "2012-11-09T19:34:11", "url": "https://files.pythonhosted.org/packages/b8/c8/ebc6afc367e2126f93cc328ce5cc036252333feb0875667de203f2d24375/mongotor-0.0.13.tar.gz" } ], "0.0.14": [ { "comment_text": "", "digests": { "md5": "644ede36c6be9a1fe657f7194032a4d9", "sha256": "8dfd5b887d39337d74f0a8a6b58ddc47d5881ac4e2546164ba7b0813569def56" }, "downloads": -1, "filename": "mongotor-0.0.14.tar.gz", "has_sig": false, "md5_digest": "644ede36c6be9a1fe657f7194032a4d9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17250, "upload_time": "2012-11-10T03:57:04", "url": "https://files.pythonhosted.org/packages/9a/9d/2bbe84726f995104e9561a2a56da3d0c87c1ae946628074f48c01d7be090/mongotor-0.0.14.tar.gz" } ], "0.0.2": [], "0.0.3": [ { "comment_text": "", "digests": { "md5": "827e4163f10f85b904809911430cf1b7", "sha256": "2cbed8d33226c4ed2b8688e3234a09b37fe3ec4342b4b19bfa65ffeaf176fdbf" }, "downloads": -1, "filename": "mongotor-0.0.3.tar.gz", "has_sig": false, "md5_digest": "827e4163f10f85b904809911430cf1b7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15560, "upload_time": "2012-09-22T16:42:14", "url": "https://files.pythonhosted.org/packages/58/da/97de3dba2497b0b87415f0a583a3e4fc4bc35f3608d489727c15412c87b3/mongotor-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "2b33946cc504dcbe17a0d3d303674d07", "sha256": "3b58e6a85e5b94f4665ff93ea8d3b404401c92391624d1bc1201e1f87e218023" }, "downloads": -1, "filename": "mongotor-0.0.4.tar.gz", "has_sig": false, "md5_digest": "2b33946cc504dcbe17a0d3d303674d07", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16093, "upload_time": "2012-10-18T19:41:39", "url": "https://files.pythonhosted.org/packages/3a/d6/ddcdc882deafa682065a5d5694a0b1aa0deb7cb1bb4b72e29ead1fbc4565/mongotor-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "00a8f0aef836c09b9e197a63fddbfee5", "sha256": "7090c453865351131ab3345cb4e6b8f1fe78f8474ee4b85ae832a41c1cccdc43" }, "downloads": -1, "filename": "mongotor-0.0.5.tar.gz", "has_sig": false, "md5_digest": "00a8f0aef836c09b9e197a63fddbfee5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16104, "upload_time": "2012-10-24T18:09:05", "url": "https://files.pythonhosted.org/packages/a0/c4/4a467e27829735d81d027f66d49ee1d0c593e28a91160964e1fc5ac53bd9/mongotor-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "035907126785fe3e5945484788cd944b", "sha256": "63a9f1c8f7577a9a4f9e44cfe454af82a14a2396a51d73e1daf0b00745a9fb23" }, "downloads": -1, "filename": "mongotor-0.0.6.tar.gz", "has_sig": false, "md5_digest": "035907126785fe3e5945484788cd944b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16437, "upload_time": "2012-10-27T15:45:24", "url": "https://files.pythonhosted.org/packages/b2/c5/784045bd9299f04ed521124e13691028856a57bd9fc0ad8fc934e8d35608/mongotor-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "ff20e3df2aafab4922a648d2afeaf532", "sha256": "5831673321d2c10e9a33e69b5650dc7d4bbfca0394cf677d68f3f164968d8e4c" }, "downloads": -1, "filename": "mongotor-0.0.7.tar.gz", "has_sig": false, "md5_digest": "ff20e3df2aafab4922a648d2afeaf532", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16429, "upload_time": "2012-10-31T17:26:57", "url": "https://files.pythonhosted.org/packages/ae/75/46428885b171a6c29bf799d06bc486d3be61cc70a71a5b33f682ccd906bb/mongotor-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "69ef14179b80d2adfd6110ef2753c3f0", "sha256": "14bfb2a499d64699861d770526ed9cf097f6843acc12a0999293dea342817fcc" }, "downloads": -1, "filename": "mongotor-0.0.8.tar.gz", "has_sig": false, "md5_digest": "69ef14179b80d2adfd6110ef2753c3f0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16586, "upload_time": "2012-11-03T19:58:29", "url": "https://files.pythonhosted.org/packages/61/f5/146a88cef7383841f386fe3e102f6b4f113a475f1b683a0779a5e7995b13/mongotor-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "40256988a6dcfaa1ebc9974c428c104e", "sha256": "020dd3847b7ddfb116ad6b3b5c43010ec27575b166fb08520ed165b019188fbc" }, "downloads": -1, "filename": "mongotor-0.0.9.tar.gz", "has_sig": false, "md5_digest": "40256988a6dcfaa1ebc9974c428c104e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16578, "upload_time": "2012-11-04T00:34:58", "url": "https://files.pythonhosted.org/packages/af/16/87f61d36f3232f5b3bdbd7e316a5d148376b98edd038845dc5f92538eba6/mongotor-0.0.9.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "5bbba3a77a5caa35380698257046e3f7", "sha256": "0120ea1e5fb36bdc261da9f8ae4a2bf8d69332e53f8e8935310f31f6295d24d6" }, "downloads": -1, "filename": "mongotor-0.1.0.tar.gz", "has_sig": false, "md5_digest": "5bbba3a77a5caa35380698257046e3f7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20428, "upload_time": "2014-06-11T19:46:05", "url": "https://files.pythonhosted.org/packages/b8/70/62b003528fb402a9b79893a3ec787dff865c595e4437de70df0862f0f458/mongotor-0.1.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "5bbba3a77a5caa35380698257046e3f7", "sha256": "0120ea1e5fb36bdc261da9f8ae4a2bf8d69332e53f8e8935310f31f6295d24d6" }, "downloads": -1, "filename": "mongotor-0.1.0.tar.gz", "has_sig": false, "md5_digest": "5bbba3a77a5caa35380698257046e3f7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20428, "upload_time": "2014-06-11T19:46:05", "url": "https://files.pythonhosted.org/packages/b8/70/62b003528fb402a9b79893a3ec787dff865c595e4437de70df0862f0f458/mongotor-0.1.0.tar.gz" } ] }