{ "info": { "author": "Josh Johnston", "author_email": "johnston.joshua+nosegae@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 2.7", "Topic :: Software Development :: Testing" ], "description": "NoseGAE: Nose for Google App Engine Testing\n===========================================\n\n`|PyPI| `_\n`|Downloads| `_\n`|License| `_ `|Build\nStatus| `_\n\nInstalling\n----------\n\nNoseGAE is available from the cheeseshop and can be installed easiest\nvia ``pip install nosegae``. While the library is actively maintained,\nno new features are being added at this time so development has\nstagnated. If you want to work on the library, or just like to clone and\ninstall you can use your choice of ``python setup.py install`` or\n``python setup.py develop`` or even the ``pip`` equiv.\n\nOverview\n--------\n\nNoseGAE is a `nose `_\nplugin that makes it easier to write functional and unit tests for\n`Google App Engine `_ applications.\n\n1. `What does it do? <#what-does-it-do>`_\n\n 1. `Functional tests <#functional-tests>`_\n 2. `Unit tests <#unit-tests>`_\n\n2. `Configuring the TestBed <#configuring-the-testbed>`_\n\n 1. `Class Based Tests <#class-based-tests>`_\n 2. `Function Tests <#function-tests>`_\n 3. `Doctest <#doctest>`_\n\n3. `Changes in 0.5.2 <#changes-in-052>`_\n4. `Changes in 0.4.0 <#changes-in-040>`_\n\nWhat does it do?\n----------------\n\nNoseGAE sets up the GAE development environment before your test run.\nThis means that you can easily write functional tests for your\napplication without having to actually start the dev server and test\nover http. The plugin also configures and initializes a TestBed\ninstance, your application\\_id based off your ``app.yaml``, and sets the\nproper paths using ``dev_appserver.fix_sys_path()``.\n\nFunctional tests\n~~~~~~~~~~~~~~~~\n\nConsider the simple hello world application in ``examples/helloworld``:\n\n::\n\n import webapp2\n from jinja2 import Environment\n\n\n class Hello(webapp2.RequestHandler):\n def get(self):\n self.response.headers['Content-Type'] = 'text/plain'\n env = Environment()\n template = env.from_string(\"Hello {{ greeting }}!\")\n self.response.out.write(template.render(greeting='world'))\n\n app = webapp2.WSGIApplication([('/', Hello)], debug=True)\n\nAnd a simple functional test suite ``examples/helloworld/test.py`` for\nthe application:\n\n::\n\n from webtest import TestApp\n import unittest\n import helloworld\n\n app = TestApp(helloworld.app)\n\n\n class HelloWorldTest(unittest.TestCase):\n def test_index(self):\n \"\"\"Tests that the index page for the application\n\n The page should be served as: Content-Type: text/plain\n The body content should contain the string: Hello world!\n \"\"\"\n response = app.get('/')\n self.assertEqual(response.content_type, 'text/plain')\n self.assertIn('Hello world!', response.body)\n\nWithout NoseGAE, the test fails.\n\n::\n\n helloworld$ nosetests --logging-level=ERROR\n E\n ======================================================================\n ERROR: Failure: ImportError (No module named webapp2)\n ----------------------------------------------------------------------\n Traceback (most recent call last):\n File \"/Users/Josh/Developer/Github/jj/lib/python2.7/site-packages/nose-1.3.4-py2.7.egg/nose/loader.py\", line 414, in loadTestsFromName\n addr.filename, addr.module)\n File \"/Users/Josh/Developer/Github/jj/lib/python2.7/site-packages/nose-1.3.4-py2.7.egg/nose/importer.py\", line 47, in importFromPath\n return self.importFromDir(dir_path, fqname)\n File \"/Users/Josh/Developer/Github/jj/lib/python2.7/site-packages/nose-1.3.4-py2.7.egg/nose/importer.py\", line 94, in importFromDir\n mod = load_module(part_fqname, fh, filename, desc)\n File \"/Users/Josh/Developer/Github/nosegae/examples/helloworld/test.py\", line 2, in \n import helloworld\n File \"/Users/Josh/Developer/Github/nosegae/examples/helloworld/helloworld.py\", line 1, in \n import webapp2\n ImportError: No module named webapp2\n\n ----------------------------------------------------------------------\n Ran 1 test in 0.075s\n\n FAILED (errors=1)\n\nWith NoseGAE, they pass.\n\n::\n\n helloworld$ nosetests --logging-level=ERROR --with-gae\n .\n ----------------------------------------------------------------------\n Ran 1 test in 0.264s\n\n OK\n\nUnit tests\n~~~~~~~~~~\n\nFunctional tests are only one kind of test, of course. What if you want\nto write unit tests for your data models? Normally, you can't use your\nmodels at all outside of the dev environment, because the Google App\nEngine datastore isn't available. However, since the NoseGAE plugin sets\nup the development environment around your test run, you can use models\ndirectly in your tests.\n\nConsider the ``examples/pets/models.py`` file that includes some\ndoctests:\n\n::\n\n from google.appengine.ext import ndb\n\n class Pet(ndb.Model):\n \"\"\"The Pet class provides storage for pets.\n\n >>> # initialize testbed stubs\n >>> testbed.init_memcache_stub()\n >>> testbed.init_datastore_v3_stub()\n\n You can create a pet:\n >>> muffy = Pet(name=u'muffy', type=u'dog', breed=u\"Shi'Tzu\")\n >>> muffy # doctest: +ELLIPSIS\n Pet(name=u'muffy', type=u'dog', breed=u\"Shi'Tzu\", ...)\n >>> muffy_key = muffy.put()\n\n Once created, you can load a pet by its key:\n\n >>> muffy_key.get() # doctest: +ELLIPSIS\n Pet(name=u'muffy', type=u'dog', breed=u\"Shi'Tzu\", ...)\n\n Or by a query that selects the pet:\n\n >>> list(Pet.query(Pet.type == 'dog')) # doctest: +ELLIPSIS\n [Pet(name=u'muffy', ...)]\n\n To modify a pet, change one of its properties and ``put()`` it again.\n\n >>> muffy_2 = muffy\n >>> muffy_2.age = 10\n >>> muffy_key_2 = muffy_2.put()\n\n The pet's key doesn't change when it is updated.\n\n >>> bool(muffy_key == muffy_key_2)\n True\n \"\"\"\n name = ndb.StringProperty(required=True)\n type = ndb.StringProperty(required=True, choices=(\"cat\", \"dog\", \"bird\", \"fish\", \"monkey\"))\n breed = ndb.StringProperty()\n age = ndb.IntegerProperty()\n comments = ndb.TextProperty()\n created = ndb.DateTimeProperty(auto_now_add=True, required=True)\n\n def __repr__(self):\n return (\"Pet(name=%r, type=%r, breed=%r, age=%r, \"\n \"comments=%r, created=%r)\" %\n (self.name, self.type, self.breed, self.age,\n self.comments, self.created))\n\nWithout NoseGAE, the doctests fail.\n\n::\n\n pets$ nosetests --with-doctest --logging-level=ERROR\n F\n ======================================================================\n FAIL: Doctest: models.Pet\n ----------------------------------------------------------------------\n Traceback (most recent call last):\n File \"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/doctest.py\", line 2201, in runTest\n raise self.failureException(self.format_failure(new.getvalue()))\n AssertionError: Failed doctest test for models.Pet\n File \"/Users/Josh/Developer/Github/nosegae/examples/pets/models.py\", line 4, in Pet\n\n ----------------------------------------------------------------------\n File \"/Users/Josh/Developer/Github/nosegae/examples/pets/models.py\", line 15, in models.Pet\n Failed example:\n muffy_key = muffy.put()\n Exception raised:\n Traceback (most recent call last):\n File \"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/doctest.py\", line 1289, in __run\n compileflags, 1) in test.globs\n File \"\", line 1, in \n muffy_key = muffy.put()\n File \"/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/model.py\", line 3379, in _put\n return self._put_async(**ctx_options).get_result()\n File \"/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/tasklets.py\", line 325, in get_result\n self.check_success()\n File \"/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/tasklets.py\", line 368, in _help_tasklet_along\n value = gen.throw(exc.__class__, exc, tb)\n File \"/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/context.py\", line 810, in put\n key = yield self._put_batcher.add(entity, options)\n File \"/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/tasklets.py\", line 371, in _help_tasklet_along\n value = gen.send(val)\n File \"/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/context.py\", line 343, in _put_tasklet\n keys = yield self._conn.async_put(options, datastore_entities)\n File \"/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/datastore/datastore_rpc.py\", line 1801, in async_put\n return make_put_call(base_req, pbs, extra_hook)\n File \"/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/datastore/datastore_rpc.py\", line 1784, in make_put_call\n service_name=self._api_version)\n File \"/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/datastore/datastore_rpc.py\", line 1310, in _make_rpc_call\n rpc = self._create_rpc(config, service_name)\n File \"/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/datastore/datastore_rpc.py\", line 1205, in _create_rpc\n rpc = apiproxy_stub_map.UserRPC(service_name, deadline, callback)\n File \"/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py\", line 414, in __init__\n self.__rpc = CreateRPC(service, stubmap)\n File \"/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py\", line 68, in CreateRPC\n assert stub, 'No api proxy found for service \"%s\"' % service\n AssertionError: No api proxy found for service \"datastore_v3\"\n\nWith NoseGAE, they pass.\n\n::\n\n pets$ nosetests --with-doctest --with-gae\n .\n ----------------------------------------------------------------------\n Ran 1 test in 0.228s\n\n OK\n\nConfiguring the TestBed\n-----------------------\n\nNoseGAE automatically configures your ``TestBed`` instance for you and\nthen enables any stubs that you may need for your tests to pass. There\nare two ways to enable and configure your stubs. The first and most\nflexible way is to directly initialize the stub(s) on the ``TestBed``\ninstance injected into your test case. The second, and simpler way, is\nto set the ``nosegae_*`` and optional ``nosegae_*_kwargs`` attributes on\nyour test case and let NoseGAE configure them for you. The following\nthree sections describe how to use the ``TestBed`` in your own tests.\n\nClass Based Tests\n~~~~~~~~~~~~~~~~~\n\nThe simplest of use cases is when your test class extends\n``unittest.TestCase``. The NoseGAE plugin injects an attribute named\n``testbed`` to the instance of your test class and configures it based\nupon any attributes matching the convention ``nosegae_`` and\n``nosegae__kwargs``.\n\nThis test uses the assigned ``testbed`` attribute to manually configure\neach test.\n\n::\n\n class MyTest(unittest.TestCase):\n def test_using_memcache(self):\n \"\"\"Unit test using memcache\"\"\"\n from google.appengine.api import memcache\n self.testbed.init_memcache_stub()\n memcache.set('test', True, 30)\n self.assertTrue(memcache.get('test'))\n\n def test_using_taskqueue(self):\n \"\"\"Unit test using the taskqueue\"\"\"\n self.testbed.init_taskqueue_stub(root_path='/path/to/app')\n from google.appengine.api import taskqueue\n task_url = '/some/task'\n taskqueue.add(url=task_url)\n taskqueue_stub = self.testbed.get_stub('taskqueue')\n tasks = taskqueue_stub.get_filtered_tasks(url=task_url)\n self.assertEqual(1, len(tasks))\n self.assertEqual(task_url, tasks[0].url)\n\nThe following test case shows how to write a test that uses the\ndatastore stub based on the simple configuration method using\n``nosegae_`` and ``nosegae__kwargs``.\n\n::\n\n class DataTest(unittest.TestCase):\n # enable the datastore stub\n nosegae_datastore_v3 = True\n\n def test_get_entity(self):\n \"\"\"Naively tests that we can fetch an entity from the datastore\"\"\"\n entity = MyModel.query().get()\n self.assertIsNotNone(entity)\n\nFunction Tests\n~~~~~~~~~~~~~~\n\nThis test case uses the ``testbed`` instance assigned to the function to\nmanually configure any needed stubs. See\n``examples/function_manual_config``.\n\n::\n\n def test_index():\n # test_index.testbed is assigned by the NoseGAE plugin\n test_index.testbed.init_taskqueue_stub(task_retry_seconds=42, root_path=os.path.dirname(__file__))\n # Assume the `/` route fires off a task queue and should pass without exceptions\n app = TestApp(helloworld.app)\n response = app.get('/')\n assert 'Hello world!' in str(response)\n\nThe following test shows how to use the simple method while passing\nkwargs to the taskqueue stub's initialization method. See\n``examples/issue42_task-queue`` for full example code.\n\n::\n\n def test_index():\n # Assume the `/` route fires off a task queue and should pass without exceptions\n app = TestApp(app)\n response = app.get('/')\n assert 'Hello world!' in str(response)\n\n # Enable any stubs needed as attributes off of the test function\n\n # NoseGAE looks for queue.yaml in the root of the\n # application when nosegae_taskqueue is True\n test_index.nosegae_taskqueue = True\n\n # ...or you can manually set the path and any additional arguments with the kwargs attribute\n test_index.nosegae_taskqueue_kwargs = dict(task_retry_seconds=42, root_path=os.path.dirname(__file__))\n\nDoctest\n~~~~~~~\n\nDoctests are a whole other beast. They still work but all ``TestBed``\nconfiguration has to be done manually. NoseGAE uses the `nose doctest\nplugin `_\nto inject a global variable named ``testbed`` into your doctest scope\nthat contains the current active ``TestBed`` instance. See\n``examples/pets/models.py`` for full example.\n\n\\`\\`\\`python class Pet(ndb.Model): \"\"\"The Pet class provides storage for\npets.\n\n::\n\n >>> # Initialize stubs using the injected testbed instance\n >>> testbed.init_memcache_stub()\n >>> testbed.init_datastore_v3_stub()\n\n You can create a pet:\n >>> muffy = Pet(name=u'muffy', type=u'dog', breed=u\"Shi'Tzu\")\n >>> muffy_key = muffy.put()\n \"\"\"\n name = ndb.StringProperty(required=True)\n type = ndb.StringProperty(required=True, choices=(\"cat\", \"dog\", \"bird\", \"fish\", \"monkey\"))\n breed = ndb.StringProperty()\n\n\\`\\`\\` ## Changes in 0.5.2\n\nThe 0.5.2 release introduces preliminary modules support by allowing\nmultiple yaml or paths sent to the ``--gae-application`` command line\noption.\n\n::\n\n nosetests --with-gae \\\n --gae-application='app.yaml,mobile_frontend.yaml,static_backend.yaml,dispatch.yaml'\n\nChanges in 0.4.0\n----------------\n\nThe 0.4.0 release is a major rewrite to support ``dev_appserver2``. This\nrelease introduced two important changes listed below.\n\nSandbox is gone\n~~~~~~~~~~~~~~~\n\nDue to changes in the sandboxing mechanisms in dev\\_appserver2, it isn't\npossible for NoseGAE to simulate the deployed environment any longer.\nThe sandboxing feature had to be removed since there is no longer any\nway to toggle it between ``nose``s own internal workings.\n\nThis means that certain tests may pass locally but the code in question\nwill fail in production due to restricted modules and functions. As of\nnow there is no workaround but pull requests are welcome!\n\nTestbed is set up for you\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe new plugin automatically sets up the initial\n``google.appengine.ext.testbed.Testbed`` instance and injects it into\nyour test cases for you.\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/NoseGAE.svg\n.. |Downloads| image:: https://img.shields.io/pypi/dm/NoseGAE.svg\n.. |License| image:: https://img.shields.io/pypi/l/NoseGAE.svg\n.. |Build\nStatus| image:: https://travis-ci.org/Trii/NoseGAE.svg?branch=master\n", "description_content_type": null, "docs_url": "https://pythonhosted.org/NoseGAE/", "download_url": "https://github.com/Trii/NoseGAE/tarball/0.5.10", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/Trii/NoseGAE", "keywords": "google,appengine,unittest,nose,testing", "license": "BSD License", "maintainer": "", "maintainer_email": "", "name": "NoseGAE", "package_url": "https://pypi.org/project/NoseGAE/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/NoseGAE/", "project_urls": { "Download": "https://github.com/Trii/NoseGAE/tarball/0.5.10", "Homepage": "https://github.com/Trii/NoseGAE" }, "release_url": "https://pypi.org/project/NoseGAE/0.5.10/", "requires_dist": null, "requires_python": "", "summary": "NoseGAE: nose plugin for Google App Engine testing", "version": "0.5.10" }, "last_serial": 2521401, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "66744e9b8fccc3a1dda0359d558415ad", "sha256": "73d9ec0739cfabee4044f4c418a1a4a8fef28604d342d469fc8a64a3c35277ab" }, "downloads": -1, "filename": "NoseGAE-0.1.tar.gz", "has_sig": false, "md5_digest": "66744e9b8fccc3a1dda0359d558415ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10534, "upload_time": "2008-04-19T20:53:21", "url": "https://files.pythonhosted.org/packages/7d/4b/d98de66925c86a48be746ef861aa21f9b6676348674472b4398ac38922e0/NoseGAE-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "891b93b0c0653c3cdbcd337d101daf47", "sha256": "419d3a2210570bf6164798246ff4d4554503d551cb4d461e437be027d28e97c1" }, "downloads": -1, "filename": "NoseGAE-0.1.1.tar.gz", "has_sig": false, "md5_digest": "891b93b0c0653c3cdbcd337d101daf47", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13507, "upload_time": "2008-04-20T19:41:34", "url": "https://files.pythonhosted.org/packages/9a/c9/21ca9805e508d3272bea00f00b4f24dcf7c1841fc3d7681fa9d52adeedc0/NoseGAE-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "693cc3323965adee15c1f1b2a30fef2a", "sha256": "c691c806cde0cbb3986478195ce31bbaf43fa6d90640b6c1739f9f1d37101cbe" }, "downloads": -1, "filename": "NoseGAE-0.1.2.tar.gz", "has_sig": false, "md5_digest": "693cc3323965adee15c1f1b2a30fef2a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15829, "upload_time": "2008-04-21T21:47:05", "url": "https://files.pythonhosted.org/packages/7c/ff/03ac1b183b65ea7a300c0e574582a0e779c06ff8da33e416ad71683b88da/NoseGAE-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "68ce05a31b51981b5bfee3d1e68c7037", "sha256": "40877409928a937e679691ee99d7136bb75d347daf9db78f8ac759a56c1b4e85" }, "downloads": -1, "filename": "NoseGAE-0.1.3.tar.gz", "has_sig": false, "md5_digest": "68ce05a31b51981b5bfee3d1e68c7037", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16388, "upload_time": "2008-05-30T02:46:53", "url": "https://files.pythonhosted.org/packages/c9/37/3f56844162785ccb5f537b68839cae1281501084e8b79ac87ddc54727f8f/NoseGAE-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "49a6c40fc40d1d5f02b3b728040c084b", "sha256": "436a27a606d8c97ba33254af5f8f9acdf999a9767ef4e9bd747a3b3a655d54e5" }, "downloads": -1, "filename": "NoseGAE-0.1.4-py2.5.egg", "has_sig": true, "md5_digest": "49a6c40fc40d1d5f02b3b728040c084b", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 8673, "upload_time": "2009-05-25T20:17:21", "url": "https://files.pythonhosted.org/packages/21/5d/5ade4ae7384a4789f389c94f6132dd5a08b9da15baf25e6c45e37904cc06/NoseGAE-0.1.4-py2.5.egg" }, { "comment_text": "", "digests": { "md5": "6ae0b62f141df2bbbfceb2e733f151a5", "sha256": "a2562b1a36b583366d980e296247b767d92cf4b1eed27dc6e94fbd68d2ddc1a3" }, "downloads": -1, "filename": "NoseGAE-0.1.4.tar.gz", "has_sig": true, "md5_digest": "6ae0b62f141df2bbbfceb2e733f151a5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15989, "upload_time": "2009-05-25T20:17:18", "url": "https://files.pythonhosted.org/packages/6f/44/485fbd132b59920fb145454b1bbd5e1af14f61348a4049fa1323116b2f18/NoseGAE-0.1.4.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "912780930db9534e8cf0afbe1567e123", "sha256": "395ab811c56157eda27a6ac421ffcbde66ddf5b1bf059cb29f8f59a4bf586934" }, "downloads": -1, "filename": "NoseGAE-0.1.7.tar.gz", "has_sig": true, "md5_digest": "912780930db9534e8cf0afbe1567e123", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18861, "upload_time": "2010-02-19T22:03:42", "url": "https://files.pythonhosted.org/packages/49/bf/fb7f604eaa9ce6b74fa713dc628f9b8a18f1623a8846a4c4a26c3a4e3397/NoseGAE-0.1.7.tar.gz" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "d207651f164bde5755c2c813df64a65d", "sha256": "63433b67f746cc8a9c67991d9fe2ce81f1dcb91ac0057ea4305c2e522c9bf9db" }, "downloads": -1, "filename": "NoseGAE-0.1.9-py2.6.egg", "has_sig": true, "md5_digest": "d207651f164bde5755c2c813df64a65d", "packagetype": "bdist_egg", "python_version": "2.6", "requires_python": null, "size": 9547, "upload_time": "2011-06-23T23:07:39", "url": "https://files.pythonhosted.org/packages/1f/94/a5a7d81caf79ae53e00d831d1560886fed576b3e48ab7c65e8de26270602/NoseGAE-0.1.9-py2.6.egg" }, { "comment_text": "", "digests": { "md5": "a97bd3d92c1ca7a5f4a9300ab82d3646", "sha256": "c70082e4d9b69ed95105e6c8ecdb74d1b89fa5113fd5a5ebec53dee1260a28ae" }, "downloads": -1, "filename": "NoseGAE-0.1.9.tar.gz", "has_sig": true, "md5_digest": "a97bd3d92c1ca7a5f4a9300ab82d3646", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18679, "upload_time": "2011-06-23T23:07:41", "url": "https://files.pythonhosted.org/packages/d5/cc/7d2c6f6e1a1f2a8013513e5e01bcedec2989ab87322d2cb244054f09beab/NoseGAE-0.1.9.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "15b55bc4c7c95f96104d2ff69e67c107", "sha256": "021014a96510913c7333241b2be7ec78c427c7f033d8261db2763c4d2cf21e5b" }, "downloads": -1, "filename": "NoseGAE-0.2.0.tar.gz", "has_sig": false, "md5_digest": "15b55bc4c7c95f96104d2ff69e67c107", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18671, "upload_time": "2011-11-13T21:20:57", "url": "https://files.pythonhosted.org/packages/f8/6e/37df8333fd8629a2a702c3d737a48be210c76e376ed2dc6f0901e02804a2/NoseGAE-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "3f7f46b9c24e86c7e1085607b24fa96c", "sha256": "5d2d96f9b83bd6b108d1bd0206bd98ac8ece6534abf6c94301e035b5f5541e69" }, "downloads": -1, "filename": "NoseGAE-0.2.1.tar.gz", "has_sig": false, "md5_digest": "3f7f46b9c24e86c7e1085607b24fa96c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6570, "upload_time": "2014-04-07T15:04:39", "url": "https://files.pythonhosted.org/packages/5e/02/00bdb24c2db02adc6d7fd0b921634ead97abdfb1a53aa6454b917c553207/NoseGAE-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "73c43f5f6b9cda01ad59e1d0bb155788", "sha256": "dca2726b5d543630d58199347281c29fc8f9bb9309e49f011623aae92d1c7e00" }, "downloads": -1, "filename": "NoseGAE-0.3.0.tar.gz", "has_sig": false, "md5_digest": "73c43f5f6b9cda01ad59e1d0bb155788", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5969, "upload_time": "2014-12-09T19:13:56", "url": "https://files.pythonhosted.org/packages/68/98/0bee68cc41c78dc4c7093807dd7c3a51b39c9890daaf79c64254fa0f7ee7/NoseGAE-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "03703fc37b52416cccab2aebcb64dacf", "sha256": "4d0bb333da315b48eca2969e9d1ffe4f337792efa3189dfb5a0e99832e5640f4" }, "downloads": -1, "filename": "NoseGAE-0.4.0-py2.7.egg", "has_sig": false, "md5_digest": "03703fc37b52416cccab2aebcb64dacf", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 7319, "upload_time": "2015-01-02T19:29:02", "url": "https://files.pythonhosted.org/packages/7f/64/625bcfcc3f6cde896d96aaec6635032495cc47123bf39d02042eaea1be44/NoseGAE-0.4.0-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "cf81deff499603123305d1df6c46ec7a", "sha256": "36ac9e016a7d1da68d2756c9c5becb2bef855e383954fe90acb0e0ed2eed3ac2" }, "downloads": -1, "filename": "NoseGAE-0.4.0.tar.gz", "has_sig": false, "md5_digest": "cf81deff499603123305d1df6c46ec7a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5323, "upload_time": "2015-01-02T19:29:09", "url": "https://files.pythonhosted.org/packages/1b/8e/8bf0ab2016a3ecee5de61c02337e32c2fe38db6fe980e4fc976e0067e2de/NoseGAE-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "8b61a6d8ec098d7c422f65ff4b5b3a70", "sha256": "ed2f3a0184ff08d69173ef124e2ef89409b2301c267dcc84edfd3ab7c5522c3e" }, "downloads": -1, "filename": "NoseGAE-0.4.1.tar.gz", "has_sig": false, "md5_digest": "8b61a6d8ec098d7c422f65ff4b5b3a70", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12466, "upload_time": "2015-02-03T17:13:25", "url": "https://files.pythonhosted.org/packages/d6/2f/004c8c2b3039f5eb4ce432017eb334c27ac649f5ffab2955a8929cbec747/NoseGAE-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "da97c5fce007793b845b5c87e20dcca0", "sha256": "339ee96f7423491470708e8ad95d797d7c377bae619e717ec937e7da77103bb6" }, "downloads": -1, "filename": "NoseGAE-0.4.2.tar.gz", "has_sig": false, "md5_digest": "da97c5fce007793b845b5c87e20dcca0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8644, "upload_time": "2015-02-03T17:28:34", "url": "https://files.pythonhosted.org/packages/6c/a8/927f11b411dfab8173c1545128900e95ca35881cb940b3799961af5c9556/NoseGAE-0.4.2.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "744b58dc180255d5a5b682eb6ddf1317", "sha256": "cbf15d8b5cf364411a41bb2ea955fa911397ca9bdc5a0176a87ed53735a8a4cb" }, "downloads": -1, "filename": "NoseGAE-0.5.0.tar.gz", "has_sig": false, "md5_digest": "744b58dc180255d5a5b682eb6ddf1317", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4029, "upload_time": "2015-02-03T17:42:05", "url": "https://files.pythonhosted.org/packages/cc/12/cb4ab2a79e0bd1780648a530722ae67facf80c3240807be3c822dafcaf4c/NoseGAE-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "f6fa91d5c914e1ddcb9d79f3a7c8be99", "sha256": "92a9bf34fcab3fd7df50dd9834371d788877066464349e5641f2a40e6e5bf4b4" }, "downloads": -1, "filename": "NoseGAE-0.5.1.tar.gz", "has_sig": false, "md5_digest": "f6fa91d5c914e1ddcb9d79f3a7c8be99", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4067, "upload_time": "2015-02-13T17:11:01", "url": "https://files.pythonhosted.org/packages/43/2a/6adea17ae8f62f8c3cacf5f1710610143c1212fc29df9eabbb08d57b8492/NoseGAE-0.5.1.tar.gz" } ], "0.5.10": [ { "comment_text": "", "digests": { "md5": "2854ebcb32fdc708ba8900da7decd6ec", "sha256": "86974d6f2da94705d252b682bf30290fc9e888691a30cc0a28a898710da8b355" }, "downloads": -1, "filename": "NoseGAE-0.5.10-py2.7.egg", "has_sig": false, "md5_digest": "2854ebcb32fdc708ba8900da7decd6ec", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 9478, "upload_time": "2016-12-15T15:23:57", "url": "https://files.pythonhosted.org/packages/e3/d4/84ea69b980771e73a2ee355cf7472b5deff9a2f26d9c02260fcfef8424ff/NoseGAE-0.5.10-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "d963b0339d5bd84dcd603f0ca90beeb0", "sha256": "dc7b60bad4db7dd32d0ccd81d9b01ab6c88439c4d9d205dfb11009e6c54699a8" }, "downloads": -1, "filename": "NoseGAE-0.5.10.tar.gz", "has_sig": false, "md5_digest": "d963b0339d5bd84dcd603f0ca90beeb0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10020, "upload_time": "2016-12-15T15:23:59", "url": "https://files.pythonhosted.org/packages/ad/b0/c01d43bd5ba72ac7bcf690f7ceae79316c36f8672c350a90b6a9b16f4305/NoseGAE-0.5.10.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "5d0e7155d4a6bba31faaf1d323bdec9b", "sha256": "e073de7492cc12771529b50c5a3e76ee7d4c42357238062c5e47194f6efc2d82" }, "downloads": -1, "filename": "NoseGAE-0.5.2.tar.gz", "has_sig": false, "md5_digest": "5d0e7155d4a6bba31faaf1d323bdec9b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4291, "upload_time": "2015-02-23T22:04:21", "url": "https://files.pythonhosted.org/packages/7d/10/e3c94840de42edbe11acba1a2a8527cae080bcdef6a8e1d83c120cf1fe6a/NoseGAE-0.5.2.tar.gz" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "e3bc79a459abc7ce3f2c08966cb2df94", "sha256": "827ce2b301a7d3a27c46cc9e94c9a52f6978e0f826ac1fd7250f0fd882f70f36" }, "downloads": -1, "filename": "NoseGAE-0.5.3.tar.gz", "has_sig": false, "md5_digest": "e3bc79a459abc7ce3f2c08966cb2df94", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9110, "upload_time": "2015-02-24T21:50:44", "url": "https://files.pythonhosted.org/packages/87/8e/8234ebb5070ccb3835683f8bb20c1dfdd02f205f2ffb675e11c6da5c1717/NoseGAE-0.5.3.tar.gz" } ], "0.5.4": [ { "comment_text": "", "digests": { "md5": "d764797aaece959c53bdefc6ccce5a4b", "sha256": "a28ee025e635199a0d09da17e462cf534ad02e6715662b0451dd56e3ccef8530" }, "downloads": -1, "filename": "NoseGAE-0.5.4.tar.gz", "has_sig": false, "md5_digest": "d764797aaece959c53bdefc6ccce5a4b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9500, "upload_time": "2015-03-09T20:38:46", "url": "https://files.pythonhosted.org/packages/56/9b/521242aa81434175c2d131fda506cb51b6e5e3f8043e0ee0679576d3ba1f/NoseGAE-0.5.4.tar.gz" } ], "0.5.5": [ { "comment_text": "", "digests": { "md5": "562f4ab7b101ea0cc2375a67e408f318", "sha256": "90f4f19b273cb86de0778270f0013f424a02212fb3c435eb2ed8acbfb0893657" }, "downloads": -1, "filename": "NoseGAE-0.5.5.tar.gz", "has_sig": false, "md5_digest": "562f4ab7b101ea0cc2375a67e408f318", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9664, "upload_time": "2015-03-11T16:38:41", "url": "https://files.pythonhosted.org/packages/3a/e7/557942b48f17d2633231c8ed1b7e950c376b6f16927e557184255ba126a7/NoseGAE-0.5.5.tar.gz" } ], "0.5.6": [ { "comment_text": "", "digests": { "md5": "3bfb9613deeba94421fc483ea373a608", "sha256": "486c59714bd573b1b4aa8b371bf5172b349bb7fe2871fa7877f3baccd40b284a" }, "downloads": -1, "filename": "NoseGAE-0.5.6.tar.gz", "has_sig": false, "md5_digest": "3bfb9613deeba94421fc483ea373a608", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9718, "upload_time": "2015-04-17T15:40:40", "url": "https://files.pythonhosted.org/packages/ae/20/d3a0c26154ee5f8411214f2f0b55828af2c184eb33d1f25a8c7fe113bc65/NoseGAE-0.5.6.tar.gz" } ], "0.5.7": [ { "comment_text": "", "digests": { "md5": "81ccbae95d035d86ba0e614535c0ed68", "sha256": "31a5b1c81c12354076e3bae321b7fb9cb1fc478dd8d241a997fa14ce2f9d8991" }, "downloads": -1, "filename": "NoseGAE-0.5.7.tar.gz", "has_sig": false, "md5_digest": "81ccbae95d035d86ba0e614535c0ed68", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9856, "upload_time": "2015-05-12T18:25:17", "url": "https://files.pythonhosted.org/packages/ac/46/dced4d8aef481fe2513bc540c7a6c1493d51734acc29e54b665c711da333/NoseGAE-0.5.7.tar.gz" } ], "0.5.8": [ { "comment_text": "", "digests": { "md5": "c39f48f81f32e0ff70e79de29d0151d2", "sha256": "41528aa611b2edb0d55a6f2e8b3afd3a8104c737399f6ce3c895832d425a2ab3" }, "downloads": -1, "filename": "NoseGAE-0.5.8-py2.7.egg", "has_sig": false, "md5_digest": "c39f48f81f32e0ff70e79de29d0151d2", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 10294, "upload_time": "2016-08-18T14:24:15", "url": "https://files.pythonhosted.org/packages/24/b5/1c3c30bb8b01807847e18443b8fa75a66bddfab2135dc0ee694df98b361c/NoseGAE-0.5.8-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "e010c12f5d6ac35021b0ccbe8216c6dd", "sha256": "b770a70c1819585115a4446f69c1e74c481dc2c743666eda9684a4db880b5558" }, "downloads": -1, "filename": "NoseGAE-0.5.8.tar.gz", "has_sig": false, "md5_digest": "e010c12f5d6ac35021b0ccbe8216c6dd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39090, "upload_time": "2015-10-05T16:51:08", "url": "https://files.pythonhosted.org/packages/79/d1/6a43a44f2af6f21fb1652ce3d8415880dee2767674bb6dd5f79298b569cc/NoseGAE-0.5.8.tar.gz" } ], "0.5.9": [ { "comment_text": "", "digests": { "md5": "1a11ecfb4d553d2dbe75b7dacb932ab1", "sha256": "82e0ada62533a687495339758cea7b3a6ac02ef7f8c8106a8afdf906d960f6d1" }, "downloads": -1, "filename": "NoseGAE-0.5.9-py2.7.egg", "has_sig": false, "md5_digest": "1a11ecfb4d553d2dbe75b7dacb932ab1", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 10292, "upload_time": "2016-08-18T14:30:14", "url": "https://files.pythonhosted.org/packages/57/ed/2edb519c588df278ec0b0f3bdd1eef12cb1ab242fab27b6ca645f14f9a88/NoseGAE-0.5.9-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "789d696e764372c527c2d06e60051ef9", "sha256": "3540c51c0cdc69590688b79f80e3c8367b31b5b98ed64a5afa60a45ce1597b25" }, "downloads": -1, "filename": "NoseGAE-0.5.9.tar.gz", "has_sig": false, "md5_digest": "789d696e764372c527c2d06e60051ef9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10145, "upload_time": "2016-08-18T14:30:17", "url": "https://files.pythonhosted.org/packages/4b/56/bdae3582852677108ad8e43f41c398323c8810312508a87a052c335959ad/NoseGAE-0.5.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "2854ebcb32fdc708ba8900da7decd6ec", "sha256": "86974d6f2da94705d252b682bf30290fc9e888691a30cc0a28a898710da8b355" }, "downloads": -1, "filename": "NoseGAE-0.5.10-py2.7.egg", "has_sig": false, "md5_digest": "2854ebcb32fdc708ba8900da7decd6ec", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 9478, "upload_time": "2016-12-15T15:23:57", "url": "https://files.pythonhosted.org/packages/e3/d4/84ea69b980771e73a2ee355cf7472b5deff9a2f26d9c02260fcfef8424ff/NoseGAE-0.5.10-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "d963b0339d5bd84dcd603f0ca90beeb0", "sha256": "dc7b60bad4db7dd32d0ccd81d9b01ab6c88439c4d9d205dfb11009e6c54699a8" }, "downloads": -1, "filename": "NoseGAE-0.5.10.tar.gz", "has_sig": false, "md5_digest": "d963b0339d5bd84dcd603f0ca90beeb0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10020, "upload_time": "2016-12-15T15:23:59", "url": "https://files.pythonhosted.org/packages/ad/b0/c01d43bd5ba72ac7bcf690f7ceae79316c36f8672c350a90b6a9b16f4305/NoseGAE-0.5.10.tar.gz" } ] }