{ "info": { "author": "Morepath developers", "author_email": "morepath@googlegroups.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Internet :: WWW/HTTP :: WSGI", "Topic :: Software Development :: Libraries :: Application Frameworks" ], "description": "Morepath: Python web microframework with super powers\n=====================================================\n\nMorepath is a Python web framework. An application consists of\n*models*. Each type of model is published on a URL *path*. Content is\nexposed to the web using *views*.\n\nDocumentation_.\n\n.. _Documentation: http://morepath.readthedocs.io\n\nBuild Status\n------------\n\n.. image:: https://travis-ci.org/morepath/morepath.svg?branch=master\n :target: https://travis-ci.org/morepath/morepath\n\n.. image:: https://coveralls.io/repos/morepath/morepath/badge.svg?branch=master\n :target: https://coveralls.io/r/morepath/morepath?branch=master\n\nCHANGES\n*******\n\n0.18.2 (2019-01-22)\n===================\n\n* Fixes an infinite recursion error during morepath.autoscan.\n\n The error that occured when morepath.autoscan was run in an environment where\n two packages depended on each other, as well as depending on morepath\n through an intermediary.\n\n See `#536`\n\n .. _#536: https://github.com/morepath/morepath/issues/536\n\n* Added support for Python 3.6 and dropped support for Python 3.3\n\n0.18.1 (2017-06-30)\n===================\n\n* Link generation was unstable when supplied with multiple URL parameters.\n Sort URL parameters so that link generation is stable. This is convenient\n in tests.\n\n This could potentially break tests which weren't stable in the past. Fixing\n the tests to use the alphabetical sort order should fix the issue.\n\n* The poisoned host header protection is no longer case-sensitive.\n\n* Underscores are now allowed in host headers. Though they are not valid in\n domain names, they are valid in host names and offer no attack surface.\n\n0.18 (2017-03-17)\n=================\n\n* **New**: The `load`` API, which allows you to define how incoming JSON\n (through a POST, PUT or PATH request) will be converted to a Python object and\n how it will be validated. This feature lets you plug in external\n serialization and validation libraries, such as Marshmallow, Colander,\n Cerberus, Jsonschema or Voluptuous.\n\n* **Removed**: ``morepath.body_model_predicate`` is removed from the\n Morepath API together with the ``morepath.App.load_json`` directive\n and the ``morepath.request.body_obj`` property.\n If you use the ``load_json`` directive, this functionality has been moved\n to a separate `more.body_model`_ package. Use this package instead by\n subclassing your App from `more.body_model.BodyModelApp`.\n\n .. _more.body_model: https://github.com/morepath/more.body_model\n\n* Uploading huge files lead to excessive memory consumption as the whole body\n was consumed for no good reason. This is now fixed.\n\n See `#504`_\n\n .. _#504: https://github.com/morepath/morepath/issues/504\n\n* Fixes link prefix not applying to mounted applications.\n\n See '#516'\n\n .. _#516: https://github.com/morepath/morepath/issues/516\n\n0.17 (2016-12-23)\n=================\n\n* **Removed**: The class ``morepath.ViewRegistry`` is gone.\n\n* Upload universal wheels to pypi during release.\n\n* Refactored and simplified implementation of ``ConverterRegistry``.\n\n* Bugfix: exception views in mounted apps weren't looked up correctly\n anymore.\n\n* Adds compatibility with WebOb 1.7.\n\n* Removed extra spaces after the colon in json.\n For example: {\"foo\": \"bar\"} is now {\"foo\":\"bar\"}.\n\n* Morepath now keeps track of what code was used to resolve a path and\n a view. You use `more.whytool`_ to get a command line tool that\n provides insight in what code was used for a request.\n\n.. _`more.whytool`: https://pypi.python.org/pypi/morepath\n\n0.16.1 (2016-10-04)\n===================\n\n* Adjust ``setup.py`` to require Reg 0.10 and Dectate 0.12, otherwise\n Morepath won't work properly.\n\n0.16 (2016-10-04)\n=================\n\nRelease highlights\n------------------\n\n* A new, cleaner and faster implementation of Reg underlies this\n version of Morepath. It turns generic functions into methods on the\n ``App`` class, and removes implicit behavior entirely.\n\n This has some impact if you used the low-level ``function``\n directive or if you defined your own predicates with the\n ``predicate`` and ``predicate_fallback`` directives, see details\n below.\n\n* A new build environment based around virtualenv and pip. We've\n removed the old buildout-based build environment. ``doc/developing.rst``\n has much more.\n\n* Performance work boosts performance of Morepath significantly.\n\nRemovals & Deprecations\n-----------------------\n\n- **Removed**: ``morepath.remember_identity`` is removed from the\n Morepath API.\n\n Use ::\n\n request.app.remember_identity(response, request, identity)\n\n Instead of ::\n\n remember_identity(response, request, identity, lookup=request.lookup)\n\n- **Removed**: ``morepath.forget_identity`` is removed from the\n Morepath API.\n\n Use ::\n\n request.app.forget_identity(response, request)\n\n Instead of ::\n\n morepath.forget_identity(response, request, lookup=request.lookup)\n\n- **Removed** ``morepath.settings`` is removed from the Morepath API.\n\n Use the ``morepath.App.settings`` property instead. You can access\n this through ``app.settings``. You can access this through\n ``request.app.settings`` if you have the request. The following\n directives now get an additional optional first argument called\n ``app``: ``permission_rule``, ``verify_identity``, ``dump_json``,\n ``load_json``, ``link_prefix`` and the ``variables`` function passed\n to the path directive.\n\n- **Removed** ``morepath.enable_implicit`` and\n ``morepath.disable_implicit`` are both removed from the Morepath API.\n\n Morepath now uses generic *methods* on the application class. The\n application class determines the context used.\n\n- **Removed** We previously used buildout to install a development\n environment for Morepath. We now use pip. See ``doc/developing.rst``\n for details, and also below.\n\nFeatures\n--------\n\n- **Breaking change** Dectate used to support the ``directive``\n pseudo-directive to let you define directives. But this could lead\n to import problems if you forgot to import the module where the\n pseudo-directives are defined before using them. In this release we\n define the directives directly on the ``App`` class using the new\n ``dectate.directive`` mechanism, avoiding this problem.\n\n If you have code that defines new directives, you have to adjust\n your code accordingly; see the `Dectate changelog`_ for more\n details.\n\n .. _`Dectate changelog`: http://dectate.readthedocs.io/en/latest/changes.html\n\n- **Breaking change** Previously Morepath used Reg's dispatch\n functions directly, with a mechanism to pass in a ``lookup``\n argument to a dispatch function to control the application\n context. The lookup was maintained on ``App.lookup``. Tests were to\n pass the lookup explicitly. Reg also maintained this lookup in a\n thread-local variable, and any dispatch call that did not have a\n explicit lookup argument passed in used this implicit lookup\n directly.\n\n Reg has undergone a major refactoring which affects Morepath. As a\n result, Morepath is faster and dispatch code becomes more\n Pythonic. The concept of lookup is gone: no more lookup argument,\n ``app.lookup`` or implicit lookup. Instead, Morepath now makes use\n of dispatch *methods* on the application. The application itself\n provides the explicit dispatch context. See `#448`_ for the\n discussion leading up to this change.\n\n .. _`#448`: https://github.com/morepath/morepath/issues/448\n\n Most Morepath application and library projects should continue to\n work unchanged, but some changes are necessary if you used\n some advanced features:\n\n * If in your code you call a generic function from\n ``morepath.generic`` directly it won't work anymore. Call the\n equivalent method on the app instance instead.\n\n * If you pass through the ``lookup`` argument explicitly, remove\n this. Calling the dispatch method on the app instance is enough to\n indicate context.\n\n * If you defined a generic function in your code, you should move it\n to a ``morepath.App`` subclass instead and use\n ``morepath.dispatch_method`` instead of ``reg.dispatch``. Using\n ``reg.dispatch_method`` directly is possible but not recommended:\n ``morepath.dispatch_method`` includes caching behavior that speeds\n up applications. For example::\n\n class MyApp(morepath.App):\n @morepath.dispatch_method('obj')\n def my_dispatch(self, obj):\n pass\n\n * The ``function`` directive has been replaced by the ``method`` directive,\n where you indicate the dispatch method on the first argument. For\n example::\n\n @App.method(MyApp.my_dispatch, obj=Foo)\n def my_dispatch_impl(app, obj):\n return \"Implementation for Foo\"\n\n * The ``predicate`` directive can be used to install new predicates for\n dispatch methods. The first argument should be a reference to the\n dispatch method, for instance::\n\n @App.predicate(App.get_view, name='model', default=None,\n index=ClassIndex)\n def model_predicate(obj):\n return obj.__class__\n\n There is a new public method called ``App.get_view`` that you can\n install view predicates on.\n\n * The ``predicate_fallback`` directive gets a reference to the\n method too. The decorated function needs to take the same\n arguments as the dispatch method; previously it could be a subset.\n So for example::\n\n @App.predicate_fallback(App.get_view, model_predicate)\n def model_not_found(self, obj, request):\n raise HTTPNotFound()\n\n Where ``self`` refers to the app instance.\n\nBug fixes\n---------\n\n- Fix code_examples path for doctests with tox.\n\nBuild environment\n-----------------\n\n- We now use virtualenv and pip instead of buildout to set up the\n development environment. The development documentation has been\n updated accordingly. Also see issues `#473`_ and `#484`_.\n\n- Have the manifest file for source distribution include all files\n under VCS.\n\n- As we reached 100% code coverage for pytest, coveralls integration\n was replaced by the ``--fail-under=100`` argument of ``coverage\n report`` in the tox coverage test.\n\n.. _#473: https://github.com/morepath/morepath/issues/473\n.. _#484: https://github.com/morepath/morepath/pull/484\n\nOther\n-----\n\n- Refactored traject routing code with an eye on performance.\n\n- Use abstract base classes from the standard library for\n ``morepath.IdentityPolicy``.\n\n- Reorganize the table of contents of the documentation into a\n hierarchy (`#468`_).\n\n- Expand the test suite to cover ``morepath.Request.reset``, loop\n detection for deferred class links, dispatching of\n ``@App.verify_identity``-decorated functions on the ``identity``\n argument (`#464`_). Coverage ratio is now 100%.\n\n.. _#464: https://github.com/morepath/morepath/issues/464\n.. _#468: https://github.com/morepath/morepath/pull/468\n\n0.15 (2016-07-18)\n=================\n\nRemovals & Deprecations\n-----------------------\n\n- **Removed**: ``morepath.autosetup`` and ``morepath.autocommit`` are\n both removed from the Morepath API.\n\n Use ``autoscan``. Also use new explicit ``App.commit`` method, or\n rely on Morepath automatically committing during the first\n request. So instead of::\n\n morepath.autosetup()\n morepath.run(App())\n\n you do::\n\n morepath.autoscan()\n App.commit() # optional\n morepath.run(App())\n\n- **Removed**: the ``morepath.security`` module is removed, and you cannot\n import from it anymore. Change imports from it to the public API, so go\n from::\n\n from morepath.security import NO_IDENTITY\n\n to::\n\n from morepath import NO_IDENTITY\n\n- **Deprecated** ``morepath.remember_identity`` and\n ``morepath.forget_identity`` are both deprecated.\n\n Use the ``morepath.App.remember_identity`` and\n ``morepath.App.forget_identity`` methods, respectively.\n\n Instead of ::\n\n remember_identity(response, request, identity, lookup=request.lookup)\n ...\n morepath.forget_identity(response, request, lookup=request.lookup)\n\n you do::\n\n request.app.remember_identity(response, request, identity)\n ...\n request.app.forget_identity(response, request)\n\n- **Deprecated** ``morepath.settings`` is deprecated.\n\n Use the ``morepath.App.settings`` property instead.\n\n- **Deprecated** ``morepath.enable_implicit`` and\n ``morepath.disable_implicit`` are both deprecated.\n\n You no longer need to choose between implicit or explicit lookup for\n generic functions, as the generic functions that are part of the API\n have all been deprecated.\n\nFeatures\n--------\n\n- Factored out new ``App.mounted_app_classes()`` class method which\n can be used to determine the mounted app classes after a\n commit. This can used to get the argument to ``dectate.query_tool``\n if the commit is known to have already been done earlier.\n\n- The ``morepath.run`` function now takes command-line arguments to\n set the host and port, and is friendlier in general.\n\n- Add ``App.init_settings`` for pre-filling the settings registry with\n a python dictionary. This can be used to load the settings from a\n config file.\n\n- Add a ``reset`` method to the ``Request`` class that resets it to\n the state it had when request processing started. This is used by\n ``more.transaction`` to reset request processing when it retries a\n transaction.\n\nBug fixes\n---------\n\n- Fix a bug where a double slash at the start of a path was not\n normalized.\n\nCleanups\n--------\n\n- Cleanups and testing of ``reify`` functionality.\n\n- More doctests in the narrative documentation.\n\n- A few small performance tweaks.\n\n- Remove unused imports and fix pep8 in core.py.\n\nOther\n-----\n\n- Add support for Python 3.5 and make it the default Python\n environment.\n\n0.14 (2016-04-26)\n=================\n\n- **New** We have a new chat channel available. You can join us by clicking\n this link:\n\n https://discord.gg/0xRQrJnOPiRsEANa\n\n Please join and hang out! We are retiring the (empty) Freenode\n #morepath channel.\n\n- **Breaking change**: Move the basic auth policy to\n ``more.basicauth`` extension extension. Basic auth is just one of\n the authentication choices you have and not the default. To update\n code, make your project depend on ``more.basicauth`` and import\n ``BasicAuthIdentityPolicy`` from ``more.basicauth``.\n\n- **Breaking change**: Remove some exception classes that weren't\n used: ``morepath.error.ViewError``, ``morepath.error.ResolveError``.\n If you try to catch them in your code, just remove the whole\n ``except`` statement as they were never raised.\n\n- **Deprecated** Importing from ``morepath.security`` directly. We\n moved a few things from it into the public API: ``enable_implicit``,\n ``disable_implicit``, ``remember_identity``, ``forget_identity``,\n ``Identity``, ``IdentityPolicy``, ``NO_IDENTITY``. Some of these\n were already documented as importable from ``morepath.security``.\n Although importing from ``morepath.security`` won't break yet, you\n should stop importing from it and import directly from ``morepath``\n instead.\n\n- **Deprecated** ``morepath.autosetup`` and ``morepath.autocommit``\n are both deprecated.\n\n Use ``autoscan``. Also use new explicit ``App.commit`` method, or\n rely on Morepath automatically committing during the first\n request. So instead of::\n\n morepath.autosetup()\n morepath.run(App())\n\n you do::\n\n morepath.autoscan()\n App.commit() # optional\n morepath.run(App())\n\n- **Breaking change** Extensions that imported ``RegRegistry`` directly\n from ``morepath.app`` are going to be broken. This kind of import::\n\n from morepath.app import RegRegistry\n\n needs to become::\n\n from morepath.directive import RegRegistry\n\n This change was made to avoid circular imports in Morepath, and\n because ``App`` did not directly depend on ``RegRegistry`` anymore.\n\n- **Breaking change**: the ``variables`` function for the ``path``\n directive *has* to be defined taking a first ``obj`` argument. In\n the past it was possible to define a ``variables`` function that\n took no arguments. This is now an error.\n\n- Introduce a new ``commit`` method on ``App`` that commits the App\n and also recursively commits all mounted apps. This is more explicit\n than ``autocommit`` and less verbose than using the lower-level\n ``dectate.commit``.\n\n- Automatic commit of the app is done during the first request if the\n app wasn't committed previously. See issue #392.\n\n- Introduce a deprecation warnings (for ``morepath.security``,\n ``morepath.autosetup``) and document how a user can deal with such\n warnings.\n\n- Adds host header validation to protect against header poisoning attacks.\n\n See https://github.com/morepath/morepath/issues/271\n\n You can use ``morepath.HOST_HEADER_PROTECTION`` in your own tween\n factory to wrap before or under it.\n\n- Refactor internals of publishing/view engine. Reg is used more\n effectively for view lookup, order of some parameters is reversed\n for consistency with public APIs.\n\n- Document the internals of Morepath, see implementation document.\n This includes docstrings for all the internal APIs.\n\n- The framehack module was merged into ``autosetup``. Increased\n the coverage to this module to 100%.\n\n- New cookiecutter template for Morepath, and added references in the\n documentation for it.\n\n See https://github.com/morepath/morepath-cookiecutter\n\n- Test cleanup; scan in many tests turns out to be superfluous. Issue\n #379\n\n- Add a test that verifies we can instantiate an app before configuration\n is done. See issue #378 for discussion.\n\n- Started doctesting some of the docs.\n\n- Renamed ``RegRegistry.lookup`` to ``RegRegistry.caching_lookup`` as\n the ``lookup`` property was shadowing a lookup property on\n ``reg.Registry``. This wasn't causing bugs but made debugging\n harder.\n\n- Refactored link generation. Introduce a new ``defer_class_links``\n directive that lets you defer link generation using\n ``Request.class_link()`` in addition to ``Request.link()``. This is\n an alternative to ``defer_links``, which cannot support\n ``Request.class_link``.\n\n- Morepath now has extension API docs that are useful when you want to\n create your own directive and build on one of Morepath's registries\n or directives.\n\n- A friendlier ``morepath.run`` that tells you how to quit it with\n ``ctrl-C``.\n\n- A new document describing how to write a test for Morepath-based\n applications.\n\n- Document how to create a Dectate-based command-line query tool that\n lets you query Morepath directives.\n\n- Uses the topological sort implementation in Dectate. Sort out a mess\n where there were too many ``TopologicalSortError`` classes.\n\n0.13.2 (2016-04-13)\n===================\n\n- Undid change in 0.13.1 where ``App`` could not be instantiated if\n not committed, as ran into real-world code where this assumption\n was broken.\n\n0.13.1 (2016-04-13)\n===================\n\n- Enable queries by the Dectate query tool.\n\n- Document ``scan`` function in API docs.\n\n- Work around an issue in Python where ``~`` (tilde) is quoted by\n ``urllib.quote`` & ``urllib.encode``, even though it should not be\n according to the RFC, as ``~`` is considered unreserved.\n\n https://www.ietf.org/rfc/rfc3986.txt\n\n- Document some tricks you can do with directives in a new \"Directive\n tricks\" document.\n\n- Refactor creation of tweens into function on TweenRegistry.\n\n- Update the REST document; it was rather old and made no mention of\n ``body_model``.\n\n- Bail out with an error if an App is instantiated without being\n committed.\n\n0.13 (2016-04-06)\n=================\n\n- **Breaking change**. Morepath has a new, extensively refactored\n configuration system based on dectate_ and importscan_. Dectate is\n an extracted, and heavily refactored version of Morepath's\n configuration system that used to be in ``morepath.config``\n module. It's finally documented too!\n\n .. _dectate: http://dectate.readthedocs.org\n\n .. _importscan: http://importscan.readthedocs.org\n\n Dectate and thus Morepath does not use Venusian (or Venusifork)\n anymore so that dependency is gone.\n\n Code that uses ``morepath.autosetup`` should still work.\n\n Code that uses ``morepath.setup`` and scans and commits manually\n needs to change. Change this::\n\n from morepath import setup\n\n config = morepath.setup()\n config.scan(package)\n config.commit()\n\n into this::\n\n import morepath\n\n morepath.scan(package)\n morepath.autocommit()\n\n Similarly ``config.scan()`` without arguments to scan its own\n package needs to be rewritten to use ``morepath.scan()`` without\n arguments.\n\n Anything you import directly now does not need to be scanned\n anymore; the act of importing a module directly registers the\n directives with Morepath, though as before they won't be active\n until you commit. But scanning something you've imported before\n won't do any harm.\n\n The signature for ``morepath.scan`` is somewhat different than that\n of the old ``config.scan``. There is no third argument\n ``recursive=True`` anymore. The ``onerror`` argument has been\n renamed to ``handle_error`` and has different behavior; the\n importscan_ documentation describes the details.\n\n If you were writing tests that involve Morepath, the old structure of\n the test was::\n\n import morepath\n\n def test_foo():\n config = morepath.setup()\n\n class App(morepath.App):\n testing_config = config\n\n ... use directives on App ...\n\n config.commit()\n\n ... do asserts ...\n\n This now needs to change to::\n\n import morepath\n\n def test_foo():\n class App(morepath.App):\n pass\n\n ... use directives on App ...\n\n morepath.commit([App])\n\n ... do asserts ...\n\n So, you need to use the ``morepath.commit()`` function and give it a\n list of the application objects you want to commit,\n explicitly. ``morepath.autocommit()`` won't work in the context of a\n test.\n\n If you used a test that scanned code you need to adjust it too, from::\n\n import morepath\n import some_package\n\n def test_foo():\n config = morepath.setup()\n\n config.scan(some_package)\n\n config.commit()\n\n ... do asserts ...\n\n to this::\n\n import morepath\n import some_package\n\n def test_foo():\n morepath.scan(some_package)\n morepath.commit([some_package.App])\n\n ... do asserts ...\n\n Again you need to be explicit and use ``morepath.commit`` to commit\n those apps you want to test.\n\n If you had a low-level reference to ``app.registry`` in your code it\n will break; the registry has been split up and is now under\n ``app.config``. If you want access to ``lookup`` you can use\n ``app.lookup``.\n\n If you created custom directives, the way to create directives\n is now documented as part of the dectate_ project. The main updates you\n need to do are:\n\n * subclass from `dectate.Action` instead of `morepath.Directive`.\n\n * no more ``app`` first argument.\n\n * no ``super`` call is needed anymore in ``__init__``.\n\n * add a ``config`` class variable to declare the registries\n you want to affect. Until we break up the main registry this\n is::\n\n from morepath.app import Registry\n\n ...\n config = { 'registry': Registry }\n\n\n * reverse the arguments to ``perform``, so that the object\n being registered comes first. So change::\n\n def perform(self, registry, obj):\n ...\n\n into::\n\n def perform(self, obj, registry):\n ...\n\n But instead of ``registry`` use the registry you set up in your\n action's ``config``.\n\n * no more ``prepare``. Do error checking inside the ``perform``\n method and raise a ``DirectiveError`` if something is wrong.\n\n If you created sub-actions from ``prepare``, subclass from\n `dectate.Composite` instead and implement an ``actions`` method.\n\n * ``group_key`` method has changed to ``group_class`` class variable.\n\n If you were using ``morepath.sphinxext`` to document directives\n using Sphinx autodoc, use ``dectate.sphinxext`` instead.\n\n- **Breaking change** If you want to use Morepath directives on\n ``@staticmethod``, you need to change the order in which these are\n applied. In the past::\n\n @App.path(model=Foo, path='bar')\n @staticmethod\n def get_foo():\n ....\n\n But now you need to write::\n\n @staticmethod\n @App.path(model=Foo, path='bar')\n def get_foo():\n ....\n\n- **Breaking change** You cannot use a Morepath ``path`` directive on\n a ``@classmethod`` directly anymore. Instead you can do this::\n\n class Foo(object):\n @classmethod\n def get_something():\n pass\n\n @App.path('/', model=Something)(Foo.get_something)\n\n- **Breaking change**. Brought `app.settings` back, a shortcut to the\n settings registry. If you use settings, you need to replace any\n references to ``app.registry.settings`` to ``app.settings``.\n\n- Add `request.class_link`. This lets you link using classes instead\n of instances as an optimization. In some cases instantiating an\n object just so you can generate a link to it is relatively\n expensive. In that case you can use `request.class_link`\n instead. This lets you link to a model class and supply a\n `variables` dictionary manually.\n\n- **Breaking change**. In Morepath versions before this there was an\n class attribute on ``App`` subclasses called ``registry``. This was\n a giant mixed registry which subclassed a lot of different\n registries used by Morepath (reg registry, converter registry,\n traject registry, etc). The Dectate configuration system allows us\n to break this registry into a lot of smaller interdependent registries\n that are configured in the ``config`` of the directives.\n\n While normally you shouldn't be, if you were somehow relying on\n ``App.registry`` in your code you should now rewrite it to use\n ``App.config.reg_registry``, ``App.config.setting_registry``,\n ``App.config.path_registry`` etc.\n\n0.12 (2016-01-27)\n=================\n\n- **Breaking change**. The ``request.after`` function is now called even if\n the response was directly created by the view (as opposed to the view\n returning a value to be rendered by morepath). Basically, ``request.after``\n is now guaranteed to be called if the response's HTTP status code lies within\n the 2XX-3XX range.\n\n See https://github.com/morepath/morepath/issues/346\n\n- Fixed a typo in the `defer_link` documentation.\n\n- Morepath's link generation wasn't properly quoting paths and\n parameters in all circumstances where non-ascii characters or\n URL-quoted characters were used. See issue #337.\n\n- Morepath could not handle varargs or keyword arguments properly\n in path functions. Now bails out with an error early during\n configuration time. To fix existing code, get rid of any ``*args`` or\n ``**kw``.\n\n- Morepath could not properly generate links if a path directive\n defines a path variable for the path but does not actually use it in\n the path function. Now we complain during configuration time. To fix\n existing code, add all variables that are defined in the path\n (i.e. ``{id}``) to the function signature.\n\n- Certain errors (``ConfigError``) were not reporting directive line number\n information. They now do.\n\n- Better ``ConfigError`` reporting when ``setting_section`` is in use.\n\n- Removed the unused ``request`` parameter from the ``link`` method in\n ``morepath.request``. See issue #351.\n\n- Require venusifork 2.0a3. This is a hacked version which works around\n some unusual compatibility issues with ``six``.\n\n0.11.1 (2015-06-29)\n===================\n\n- setuptools has the nasty habit to change underscores in project\n names to minus characters. This broke the new autoscan machinery for\n packages with an underscore in their name (such as\n `morepath_sqlalchemy`). This was fixed.\n\n0.11 (2015-06-29)\n=================\n\n- **Breaking change**. The ``morepath.autoconfig`` and ``morepath.autosetup``\n methods had to be rewritten. Before, Morepath was unable to autoload packages\n installed using ``pip``.\n\n As a result, Morepath won't be able to autoload packages if the setup.py\n name differs from the name of the distributed package or module.\n\n For example: A package named ``my-app`` containing a module named ``myapp``\n won't be automatically loaded anymore.\n\n Packages like this need to be loaded manually now::\n\n import morepath\n import myapp\n\n config = morepath.setup()\n config.scan(myapp)\n config.commit()\n\n See https://github.com/morepath/morepath/issues/319\n\n- The ``config.scan`` method now excludes 'test' and 'tests' directories\n by default.\n\n See https://github.com/morepath/morepath/issues/326\n\n- The ``template_directory`` directive will no longer inspect the current\n module if the template directory refers to an absolute path. This makes it\n easier to write tests where the current module might not be available.\n\n Fixes https://github.com/morepath/morepath/issues/299\n\n- The ``identity_policy`` passes ``settings`` to the function if it\n defines such an argument. This way an identity policy can be created\n that takes settings into account.\n\n See https://github.com/morepath/morepath/issues/309\n\n- Dots in the request path are now always normalized away. Before, Morepath\n basically relied on the client to do this, which was a potential security\n issue.\n\n See https://github.com/morepath/morepath/issues/329\n\n- Additional documentation on the Morepath config system:\n http://morepath.readthedocs.org/en/latest/configuration.html\n\n- Additional documentation on how to serve static images in\n https://morepath.readthedocs.org/en/latest/more.static.html\n\n- Move undocumented ``pdb`` out of ``__init__.py`` as it could\n sometimes trip up things. Instead documented it in the API docs in\n the special `morepath.pdbsupport` module.\n\n https://github.com/morepath/morepath/issues/328\n\n\n0.10 (2015-04-09)\n=================\n\n- Server-side templating language support: there is now a ``template``\n argument for the ``html`` directive (and ``view`` and ``json``).\n You need to use a plugin to add particular template languages to\n your project, such as ``more.chameleon`` and ``more.jinja2``, but\n you can also add your own.\n\n See http://morepath.readthedocs.org/en/latest/templates.html\n\n- Add a new \"A Review of the Web\" document to the docs to show how\n Morepath fits within the web.\n\n http://morepath.readthedocs.org/en/latest/web.html\n\n- The publisher does not respond to a ``None`` render function\n anymore. Instead, the ``view`` directive now uses a default\n ``render_view`` if ``None`` is configured. This simplifies the\n publisher guaranteeing a ``render`` function always exists.\n\n Fixes https://github.com/morepath/morepath/issues/283\n\n- Introduce a ``request.resolve_path`` method that allows you to resolve\n paths to objects programmatically.\n\n- Modify ``setup.py`` to use ``io.open`` instead of ``open`` to\n include the README and the CHANGELOG and hardcode UTF-8 so it works\n on all versions of Python with all default encodings.\n\n- Various documentation fixes.\n\n0.9 (2014-11-25)\n================\n\n- **Breaking change**. In previous releases of Morepath, Morepath did\n not include the full hostname in generated links (so ``/a`` instead\n of ``http://example.com/a``). Morepath 0.9 does include the full\n hostname in generated links by default. This to support the\n non-browser client use case better. In the previous system without\n fully qualified URLs, client code needs to manually add the base of\n links itself in order to be able to access them. That makes client\n code more complicated than it should be. To make writing such client\n code as easy as possible Morepath now generates complete URLs.\n\n This should not break any code, though it can break tests that rely\n on the previous behavior. To fix ``webtest`` style tests, prefix\n the expected links with ``http://localhost/``.\n\n If for some reason you want the old behavior back in an application,\n you can use the ``link_prefix`` directive::\n\n @App.link_prefix()\n def my_link_prefix(request):\n return '' # prefix nothing again\n\n- Directives are now logged to the ``morepath.directive`` log, which\n is using the standard Python ``logging`` infrastructure. See\n http://morepath.readthedocs.org/en/latest/logging.html\n\n- Document ``more.forwarded`` proxy support in\n http://morepath.readthedocs.org/en/latest/paths_and_linking.html\n\n- Document behavior of ``request.after`` in combination with directly\n returning a response object from a view.\n\n- Expose ``body_model_predicate`` to the public Morepath API. You\n can now say your predicate comes after it.\n\n- Expose ``LAST_VIEW_PREDICATE`` to the Morepath API. This is the last\n predicate defined by the Morepath core.\n\n- Update the predicate documentation.\n\n- Updated the more.static doc to reflect changes in it.\n\n- Fix doc for grouping views with the ``with`` statement.\n\n- Suggest a few things to try when your code doesn't appear to be\n scanned properly.\n\n- A new view predicate without a fallback resulted in an internal\n server error if the predicate did not match. Now it results in a 404\n Not Found by default. To override this default, define a predicate\n fallback.\n\n0.8 (2014-11-13)\n================\n\n- **Breaking change**. Reg 0.9 introduces a new, more powerful\n way to create dispatch functions, and this has resulted in\n a new, incompatible Reg API.\n\n Morepath has been adjusted to make use of the new Reg. This won't\n affect many Morepath applications, and they should be able to\n continue unchanged. But some Morepath extensions and advanced\n applications may break, so you should be aware of the changes.\n\n * The ``@App.function`` directive has changed from this::\n\n class A(object):\n pass\n\n class B(object):\n pass\n\n @reg.generic\n def dispatch_function(a, b):\n pass\n\n @App.function(dispatch_function, A, B)\n def dispatched_to(a, b):\n return 'dispatched to A and B'\n\n to this::\n\n class A(object):\n pass\n\n class B(object):\n pass\n\n @reg.dispatch('a', 'b')\n def dispatch_function(a, b):\n pass\n\n @App.function(dispatch_function, a=A, b=B)\n def dispatched_to(a, b):\n return 'dispatched to A and B'\n\n The new system in Reg (see its docs_) is a lot more flexible than\n what we had before. When you use ``function`` you don't need to\n know about the order of the predicates anymore -- this is\n determined by the arguments to ``@reg.dispatch()``. You can now\n also have function arguments that Reg ignores for dispatch.\n\n * The ``@App.predicate`` and ``@App.predicate_fallback`` directive\n have changed. You can now install custom predicates and fallbacks\n for *any* generic function that's marked with\n ``@reg.dispatch_external_predicates()``. The Morepath view code\n has been simplified to be based on this, and is also more powerful\n as it can now be extended with new predicates that use\n predicate-style dispatch.\n\n .. _docs: http://reg.readthedocs.org\n\n- Introduce the ``body_model`` predicate for views. You can give it\n the class of the ``request.body_obj`` you want to handle with this\n view. In combination with the ``load_json`` directive this allows\n you to write views that respond only to the POSTing or PUTing of a\n certain type of object.\n\n- Internals refactoring: we had a few potentially overridable dispatch\n functions in ``morepath.generic`` that actually were never\n overridden in any directives. Simplify this by moving their\n implementation into ``morepath.publish`` and\n ``morepath.request``. ``generic.link``, ``generic.consume`` and\n ``generic.response`` are now gone.\n\n- Introduce a ``link_prefix`` directive that allows you to set the\n URL prefix used by every link generated by the request.\n\n- A bug fix in ``request.view()``; the ``lookup`` on the ``request``\n was not properly updated.\n\n- Another bug fix in ``request.view()``; if ``deferred_link_app`` app\n is used, ``request.app`` should be adjusted to the app currently\n being deferred to.\n\n- ``request.after`` behavior is clarified: it does not run for any\n exceptions raised during the handling of the request, only for the\n \"proper\" response. Fix a bug where it *did* sometimes run.\n\n- Previously if you returned ``None`` for a path in a ``variables``\n function for a path, you would get a path with ``None`` in it. Now\n it is a ``LinkError``.\n\n- If you return a non-dict for ``variables`` for a path, you get a proper\n ``LinkError`` now.\n\n- One test related to defer_links did not work correctly in Python 3. Fixed.\n\n- Add API doc for ``body_obj``. Also fix JSON and objects doc to talk\n about ``request.body_obj`` instead of ``request.obj``.\n\n- Extend API docs for security: detail the API an identity policy\n needs to implement and fix a few bugs.\n\n- Fix ReST error in API docs for ``autoconfig`` and ``autosetup``.\n\n- Fix a few ReST links to the API docs in the app reuse document.\n\n0.7 (2014-11-03)\n================\n\n- **Breaking change**. There has been a change in the way the mount\n directive works. There has also been a change in the way linking\n between application works. The changes result in a simpler, more\n powerful API and implementation.\n\n The relevant changes are:\n\n * You can now define your own custom ``__init__`` for\n ``morepath.App`` subclasses. Here you can specify the arguments\n with which your application object should be mounted. The previous\n ``variables`` class attribute is now ignored.\n\n It's not necessary to use ``super()`` when you subclass from\n ``morepath.App`` directly.\n\n So, instead of this::\n\n class MyApp(morepath.App):\n variables = ['mount_id']\n\n You should now write this::\n\n class MyApp(morepath.App):\n def __init__(self, mount_id):\n self.mount_id = mount_id\n\n * The ``mount`` directive should now return an *instance* of the\n application being mounted, not a dictionary with mount\n parameters. The application is specified using the ``app``\n argument to the directive. So instead of this::\n\n @RootApp.mount(app=MyApp, path='sub/{id}')\n def mount_sub(id):\n return {\n 'mount_id': id\n }\n\n You should now use this::\n\n @RootApp.mount(app=MyApp, path='sub/{id}')\n def mount_sub(id):\n return MyApp(mount_id=id)\n\n * The ``mount`` directive now takes a ``variables`` argument. This\n works like the ``variables`` argument to the ``path``\n directive and is used to construct links.\n\n It is given an instance of the app being mounted, and it should\n reconstruct those variables needed in its path as a dictionary. If\n omitted, Morepath tries to get them as attributes from the\n application instance, just like it tries to get attributes of any\n model instance.\n\n ``MyApp`` above is a good example of where this is required: it\n does store the correct information, but as the ``mount_id``\n attribute, not the ``id`` attribute. You should add a ``variables``\n argument to the ``mount`` directive to explain to Morepath how\n to obtain ``id``::\n\n @RootApp.mount(app=MyApp, path='sub/{id}',\n variables=lambda app: dict(id=app.mount_id))\n def mount_sub(id):\n return MyApp(mount_id=id)\n\n The simplest way to avoid having to do this is to name the\n attributes the same way as the variables in the paths, just like\n you can do for model classes.\n\n * In the past you'd get additional mount context variables as extra\n variables in the function decorated by the ``path`` decorator.\n This does not happen anymore. Instead you can add a special\n ``app`` parameter to this function. This gives you access to the\n current application object, and you can extract its attributes\n there.\n\n So instead of this::\n\n @MyApp.path(path='models/{id}', model=Model)\n def get_root(mount_id, id):\n return Model(mount_id, id)\n\n where ``mount_id`` is magically retrieved from the way ``MyApp`` was\n mounted, you now write this::\n\n @MyApp.path(path='models/{id}', model=Model)\n def get_root(app, id):\n return Model(app.mount_id, id)\n\n * There was an ``request.mounted`` attribute. This was a special an\n instance of a special ``Mounted`` class. This ``Mounted`` class is\n now gone -- instead mounted applications are simply instances of\n their class. To access the currently mounted application, use\n ``request.app``.\n\n * The ``Request`` object had ``child`` and ``sibling`` methods as\n well as a ``parent`` attribute to navigate to different \"link\n makers\". You'd navigate to the link maker of an application in\n order to create links to objects in that application. These are\n now gone. Instead you can do this navigation from the application\n object directly, and instead of link makers, you get application\n instances. You can pass an application instance as a special\n ``app`` argument to ``request.link`` and ``request.view``.\n\n So instead of this::\n\n request.child(foo).link(obj)\n\n You now write this::\n\n request.link(obj, app=request.app.child(foo))\n\n And instead of this::\n\n request.parent.link(obj)\n\n You now write this::\n\n request.link(obj, app=request.app.parent)\n\n Note that the new ``defer_links`` directive can be used to\n automate this behavior for particular models.\n\n * The ``.child`` method on ``App`` can the app class as well as the\n parameters for the function decorated by the ``mount`` directive::\n\n app.child(MyApp, id='foo')\n\n This can also be done by name. So, assuming ``MyApp`` was mounted\n under ``my_app``::\n\n app.child('my_app', id='foo')\n\n This is how ``request.child`` worked already.\n\n As an alternative you can now instead pass an app *instance*::\n\n app.child(MyApp(mount_id='foo'))\n\n Unlike the other ways to get the child, this takes the parameters\n need to create the app instance, as opposed to taking the\n parameters under which the app was mounted.\n\n Motivation behind these changes:\n\n Morepath used to have a ``Mount`` class separate from the ``App``\n classes you define. Since Morepath 0.4 application objects became\n classes, and it made sense to make their instances the same as the\n mounted application. This unification has now taken place.\n\n It then also made sense to use its navigation methods (``child`` and\n friend) to navigate the mount tree, instead of using the rather\n complicated \"link maker\" infrastructure we had before.\n\n This change simplifies the implementation of mounting considerably,\n without taking away features and actually making the APIs involved\n more clear. This simplification in turn made it easier to implement\n the new ``defer_links`` directive.\n\n- **Breaking change**. The arguments to the ``render`` function have\n changed. This is a function you can pass to a view directive. The\n render function now takes a second argument, the request. You need\n to update your render functions to take this into account. This only\n affects code that supplies an explicit ``render`` function to the\n ``view``, ``json`` and ``html`` directives, and since not a lot of\n those functions exist, the impact is expected to be minimal.\n\n- **Breaking change**. In certain circumstances it was useful to\n access the settings through an application instance using\n ``app.settings``. This does not work anymore; access the settings\n through ``app.registry.settings`` instead.\n\n- ``dump_json`` and ``load_json`` directives. This lets you\n automatically convert an object going to a response to JSON, and\n converts JSON coming in as a request body from JSON to an\n object. See http://morepath.readthedocs.org/en/latest/json.html for\n more information.\n\n- ``defer_links`` directive. This directive can be used to declare\n that a particular mounted application takes care of linking to\n instances of a class. Besides deferring ``request.link()`` it will\n also defer ``request.view``. This lets you combine applications with\n more ease. By returning ``None`` from it you can also defer links to\n this app's parent app.\n\n- ``app.ancestors()`` method and ``app.root`` attribute. These can be\n used for convenient access to the ancestor apps of a mounted\n application. To access from the request, use ``request.app.root``\n and ``request.app.ancestors()``.\n\n- The ``App`` class now has a ``request_class`` class attribute. This\n determines the class of the request that is created and can be\n overridden by subclasses. ``more.static`` now makes use of this.\n\n- Several generic functions that weren't really pulling their weight\n are now gone as part of the mount simplification:\n ``generic.context`` and ``generic.traject`` are not needed anymore,\n along with ``generic.link_maker``.\n\n- Change documentation to use uppercase class names for App classes\n everywhere. This reflects a change in 0.4 and should help clarity.\n\n- Added documentation about auto-reloading Morepath during development.\n\n- No longer silently suppress ImportError during scanning: this can\n hide genuine ``ImportError`` in the underlying code.\n\n We were suppressing ``ImportError`` before as it can be triggered\n by packages that rely on optional dependencies.\n\n This is a common case in the ``.tests`` subdirectory of a package\n which may import a test runner like ``pytest``. ``pytest`` is only a\n test dependency of the package and not a mainline dependencies, and\n this can break scanning. To avoid this problem, Morepath's autosetup\n and autoconfig now automatically ignore ``.tests`` and ``.test``\n sub-packages.\n\n Enhanced the API docs for ``autosetup`` and ``autoconfig`` to describe\n scenarios which can generate legitimate ``ImportError`` exceptions\n and how to handle them.\n\n- Fix of examples in tween documentation.\n\n- Minor improvement in docstrings.\n\n0.6 (2014-09-08)\n================\n\n- Fix documentation on the ``with`` statement; it was not using the local\n ``view`` variable correctly.\n\n- Add #morepath IRC channel to the community docs.\n\n- Named mounts. Instead of referring to the app class when\n constructing a link to an object in an application mounted\n elsewhere, you can put in the name of the mount. The name of the\n mount can be given explicitly in the mount directive but defaults to\n the mount path.\n\n This helps when an application is mounted several times and needs to\n generate different links depending on where it's mounted; by\n referring to the application by name this is loosely coupled and\n will work no matter what application is mounted under that name.\n\n This also helps when linking to an application that may or may not\n be present; instead of doing an import while looking for\n ``ImportError``, you can try to construct the link and you'll get a\n ``LinkError`` exception if the application is not there. Though this\n still assumes you can import the model class of what you're linking\n to.\n\n (see issue #197)\n\n- Introduce a ``sibling`` method on Request. This combines the\n ``.parent.child`` step in one for convenience when you want to\n link to a sibling app.\n\n0.5.1 (2014-08-28)\n==================\n\n- Drop usage of sphinxcontrib.youtube in favor of raw HTML embedding,\n as otherwise too many things broke on readthedocs.\n\n0.5 (2014-08-28)\n================\n\n- Add ``more.static`` documentation on local components.\n\n- Add links to youtube videos on Morepath: the keynote at PyCon DE\n 2013, and the talk on Morepath at EuroPython 2014.\n\n- Add a whole bunch of extra code quality tools to buildout.\n\n- ``verify_identity`` would be called even if no identity could be\n established. Now skip calling ``verify_identity`` when we already\n have ``NO_IDENTITY``. See issue #175.\n\n- Fix issue #186: mounting an app that is absorbing paths could\n sometimes generate the wrong link. Thanks to Ying Zhong for the bug\n report and test case.\n\n- Upgraded to a newer version of Reg (0.8) for ``@reg.classgeneric``\n support as well as performance improvements.\n\n- Add a note in the documentation on how to deal with URL parameters\n that are not Python names (such as ``foo@``, or ``blah[]``). You can\n use a combination of ``extra_parameters`` and ``get_converters`` to\n handle them.\n\n- Document the use of the ``with`` statement for directive\n abbreviation (see the Views document).\n\n- Created a mailing list:\n\n https://groups.google.com/forum/#!forum/morepath\n\n Please join!\n\n Add a new page on community to document this.\n\n0.4.1 (2014-07-08)\n==================\n\n- Compatibility for Python 3. I introduced a meta class in Morepath\n 0.4 and Python 3 did not like this. Now the tests pass again in\n Python 3.\n\n- remove ``generic.lookup``, unused since Morepath 0.4.\n\n- Increase test coverage back to 100%.\n\n0.4 (2014-07-07)\n================\n\n- **BREAKING CHANGE** Move to class-based application registries. This\n breaks old code and it needs to be updated. The update is not\n difficult and amounts to:\n\n * subclass ``morepath.App`` instead of instantiating it to create a\n new app. Use subclasses for extension too.\n\n * To get a WSGI object you can plug into a WSGI server, you need to\n instantiate the app class first.\n\n Old way::\n\n app = morepath.App()\n\n So, the ``app`` object that you use directives on is an\n instance. New way::\n\n class app(morepath.App):\n pass\n\n So, now it's a class. The directives look the same as before, so this\n hasn't changed::\n\n @app.view(model=Foo)\n def foo_default(self, request):\n ...\n\n To extend an application with another one, you used to have to pass\n the ``extends`` arguments. Old way::\n\n sub_app = morepath.App(extends=[core_app])\n\n This has now turned into subclassing. New way::\n\n class sub_app(core_app):\n pass\n\n There was also a ``variables`` argument to specify an application\n that can be mounted. Old way::\n\n app = morepath.App(variables=['foo'])\n\n This is now a class attribute. New way::\n\n class app(morepath.App):\n variables = ['foo']\n\n The ``name`` argument to help debugging is gone; we can look at the\n class name now. The ``testing_config`` argument used internally in\n the Morepath tests has also become a class attribute.\n\n In the old system, the application object was both configuration\n point and WSGI object. Old way::\n\n app = morepath.App()\n\n # configuration\n @app.path(...)\n ...\n\n # wsgi\n morepath.run(app)\n\n In the Morepath 0.4 this has been split. As we've already seen, the\n application *class* serves. To get a WSGI object, you need to first\n *instantiate* it. New way::\n\n class app(morepath.App):\n pass\n\n # configuration\n @app.path(...)\n ...\n\n # wsgi\n morepath.run(app())\n\n To mount an application manually with variables, we used to need the\n special ``mount()`` method. Old way::\n\n mounted_wiki_app = wiki_app.mount(wiki_id=3)\n\n In the new system, mounting is done during instantiation of the app::\n\n mounted_wiki_app = wiki_app(wiki_id=3)\n\n Class names in Python are usually spelled with an upper case. In the\n Morepath docs the application object has been spelled with a lower\n case. We've used lower-case class names for application objects even\n in the updated docs for example code, but feel free to make them\n upper-case in your own code if you wish.\n\n Why this change? There are some major benefits to this change:\n\n * both extending and mounting app now use natural Python mechanisms:\n subclassing and instantation.\n\n * it allows us to expose the facility to create new directives to\n the API. You can create application-specific directives.\n\n- You can define your own directives on your applications using the\n ``directive`` directive::\n\n @my_app.directive('my_directive')\n\n This exposes details of the configuration system which is\n underdocumented for now; study the ``morepath.directive`` module\n source code for examples.\n\n- Document how to use more.static to include static resources into\n your application.\n\n- Add a ``recursive=False`` option to the config.scan method. This\n allows the non-recursive scanning of a package. Only its\n ``__init__.py`` will be scanned.\n\n- To support scanning a single module non-recursively we need a\n feature that hasn't landed in mainline Venusian yet, so depend on\n Venusifork for now.\n\n- A small optimization in the publishing machinery. Less work is done\n to update the generic function lookup context during routing.\n\n0.3 (2014-06-23)\n================\n\n- Ability to absorb paths entirely in path directive, as per issue #132.\n\n- Refactor of config engine to make Venusian and immediate config more\n clear.\n\n- Typo fix in docs (Remco Wendt).\n\n- Get version number in docs from setuptools.\n\n- Fix changelog so that PyPI page generates HTML correctly.\n\n- Fix PDF generation so that the full content is generated.\n\n- Ability to mark a view as internal. It will be available to\n ``request.view()`` but will give 404 on the web. This is useful for\n structuring JSON views for reusability where you don't want them to\n actually show up on the web.\n\n- A ``request.child(something).view()`` that had this view in turn\n call a ``request.view()`` from the context of the ``something``\n application would fail -- it would not be able to look up the view\n as lookups still occurred in the context of the mounting\n application. This is now fixed. (thanks Ying Zhong for reporting it)\n\n Along with this fix refactored the request object so it keeps a\n simple ``mounted`` attribute instead of a stack of ``mounts``; the\n stack-like nature was not in use anymore as mounts themselves have\n parents anyway. The new code is simpler.\n\n0.2 (2014-04-24)\n================\n\n- Python 3 support, in particular Python 3.4 (Alec Munro - fudomunro\n on github).\n\n- Link generation now takes ``SCRIPT_NAME`` into account.\n\n- Morepath 0.1 had a security system, but it was undocumented. Now\n it's documented (docs now in `Morepath Security`_), and some of its\n behavior was slightly tweaked:\n\n * new ``verify_identity`` directive.\n\n * ``permission`` directive was renamed to ``permission_rule``.\n\n * default unauthorized error is 403 Forbidden, not 401 Unauthorized.\n\n * ``morepath.remember`` and ``morepath.forbet`` renamed to\n ``morepath.remember_identity`` and ``morepath.forget_identity``.\n\n- Installation documentation tweaks. (Auke Willem Oosterhoff)\n\n- ``.gitignore`` tweaks (Auke Willem Oosterhoff)\n\n.. _`Morepath Security`: http://blog.startifact.com/posts/morepath-security.html\n\n0.1 (2014-04-08)\n================\n\n- Initial public release.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://morepath.readthedocs.io", "keywords": "web wsgi routing morepath", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "morepath", "package_url": "https://pypi.org/project/morepath/", "platform": "", "project_url": "https://pypi.org/project/morepath/", "project_urls": { "Homepage": "http://morepath.readthedocs.io" }, "release_url": "https://pypi.org/project/morepath/0.18.2/", "requires_dist": [ "setuptools", "webob (>=1.7.0)", "reg (>=0.11)", "dectate (>=0.13)", "importscan", "pytest-cov ; extra == 'coverage'", "sphinx ; extra == 'docs'", "pyyaml ; extra == 'docs'", "WebTest (>=2.0.14) ; extra == 'docs'", "flake8 ; extra == 'pep8'", "pytest (>=2.9.0) ; extra == 'test'", "pytest-remove-stale-bytecode ; extra == 'test'", "WebTest (>=2.0.14) ; extra == 'test'" ], "requires_python": "", "summary": "A micro web-framework with superpowers", "version": "0.18.2" }, "last_serial": 4726044, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "c0dc409d351d299c4367fb6c3b69edac", "sha256": "574d6b29210bf96531e0dda252e2a923e6025fb43efdc714fb775b7da4d1ef81" }, "downloads": -1, "filename": "morepath-0.1.zip", "has_sig": false, "md5_digest": "c0dc409d351d299c4367fb6c3b69edac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 138284, "upload_time": "2014-04-08T13:07:59", "url": "https://files.pythonhosted.org/packages/2f/7c/69c678282e7829e46f84ee59c34e57bdff28fbd1a9f74c21d46be70d882f/morepath-0.1.zip" } ], "0.10": [ { "comment_text": "", "digests": { "md5": "0ed642ca53e0f807e0f11705829006fa", "sha256": "9117594e8064ae83b7face7b8c4e489312a6663be47490fe8784480853d09301" }, "downloads": -1, "filename": "morepath-0.10.zip", "has_sig": false, "md5_digest": "0ed642ca53e0f807e0f11705829006fa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 218164, "upload_time": "2015-04-09T09:24:55", "url": "https://files.pythonhosted.org/packages/48/fa/5a260229c52d598135534bef3424dd5d0969b1d0a6367fd6384b31139bf9/morepath-0.10.zip" } ], "0.11": [ { "comment_text": "", "digests": { "md5": "953e105f99a817cf3aecac54a0d48501", "sha256": "4292f00937d7c01920be84a842f36451e532e54635409965a9624db36d93bc43" }, "downloads": -1, "filename": "morepath-0.11.tar.gz", "has_sig": false, "md5_digest": "953e105f99a817cf3aecac54a0d48501", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 177732, "upload_time": "2015-06-29T13:59:27", "url": "https://files.pythonhosted.org/packages/87/16/047c4d75bdda5a1768c5a9bc5d7275c517ede343862d2064df7f1d618287/morepath-0.11.tar.gz" } ], "0.11.1": [ { "comment_text": "", "digests": { "md5": "e8dae6719f0adbed98466b3c2476b966", "sha256": "18485bf0a64ec388a4c0301c5cba2183db7bf1631ebf5de6a91f1fc4b25615fb" }, "downloads": -1, "filename": "morepath-0.11.1.tar.gz", "has_sig": false, "md5_digest": "e8dae6719f0adbed98466b3c2476b966", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 178247, "upload_time": "2015-06-29T14:35:46", "url": "https://files.pythonhosted.org/packages/ba/98/2863ce4a1fc61d870e8b23a86953adff1cf221d9984b201454a4938b85de/morepath-0.11.1.tar.gz" } ], "0.12": [ { "comment_text": "", "digests": { "md5": "ba2e286a7890e933c5bbdae38c17025e", "sha256": "4287ea9ad464ca48b2ccc49e9b2987a25bdad81dc3877592bb50454ed9526db9" }, "downloads": -1, "filename": "morepath-0.12.tar.gz", "has_sig": false, "md5_digest": "ba2e286a7890e933c5bbdae38c17025e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 181310, "upload_time": "2016-01-27T11:38:40", "url": "https://files.pythonhosted.org/packages/fd/b2/72d22cb68e451833e4c4b800ff8d7af247ce9e60d437fa767fdafc6b2d74/morepath-0.12.tar.gz" } ], "0.13": [ { "comment_text": "", "digests": { "md5": "8371cf194bf52aa3dcca20657e8845b0", "sha256": "f700fc13eb9b00fa9fb9e944fa65ce90214e748c3be030dc8b4d3f11f2bf6854" }, "downloads": -1, "filename": "morepath-0.13.tar.gz", "has_sig": false, "md5_digest": "8371cf194bf52aa3dcca20657e8845b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 179496, "upload_time": "2016-04-06T12:28:25", "url": "https://files.pythonhosted.org/packages/a8/67/e870e598b3a5f4301daf26c6ce2b351df1d5f8bc8d426005f1ffc7e26fa9/morepath-0.13.tar.gz" } ], "0.13.1": [ { "comment_text": "", "digests": { "md5": "ca9cb5fc33217cd77806061343c1e165", "sha256": "64ecd326a71d2f8d8c75a6b6a856c4d76da2d90c4a40ed3eb01f32df24b91603" }, "downloads": -1, "filename": "morepath-0.13.1.tar.gz", "has_sig": false, "md5_digest": "ca9cb5fc33217cd77806061343c1e165", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 184591, "upload_time": "2016-04-13T08:07:21", "url": "https://files.pythonhosted.org/packages/32/e8/0c2bf91496362a87f0f144f0bfd4abbc89b370a678bdbc51acd0c184f958/morepath-0.13.1.tar.gz" } ], "0.13.2": [ { "comment_text": "", "digests": { "md5": "59111990d9558f1cd39cbf808478728f", "sha256": "e1786c403d87abf6c897993d8a5f5914d8ef487ed0374181b7e607daa6878d30" }, "downloads": -1, "filename": "morepath-0.13.2.tar.gz", "has_sig": false, "md5_digest": "59111990d9558f1cd39cbf808478728f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 184739, "upload_time": "2016-04-13T08:20:38", "url": "https://files.pythonhosted.org/packages/75/c3/c3d21b9d9a72d1fea695b8664fc20ec81e919be86fa6df6883aa92ec7840/morepath-0.13.2.tar.gz" } ], "0.14": [ { "comment_text": "", "digests": { "md5": "65fadd9f137e25cd837cdc4819081cca", "sha256": "a857619ee069c23ce0717e3708e4e7b0a19a8c61b8de0a62ff577c4827a95e35" }, "downloads": -1, "filename": "morepath-0.14.tar.gz", "has_sig": false, "md5_digest": "65fadd9f137e25cd837cdc4819081cca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 211057, "upload_time": "2016-04-26T12:39:51", "url": "https://files.pythonhosted.org/packages/6e/5a/3ffebd0e6cffd35d7139921b1a4cf94598185afc07277358740221b7b817/morepath-0.14.tar.gz" } ], "0.15": [ { "comment_text": "", "digests": { "md5": "3f0674ee6e4451011b10aaceea8d5ec3", "sha256": "8b284f9d9b97e9ae39c850b2da74d6a5146534dcb21f3e0c9ff937894c8ab597" }, "downloads": -1, "filename": "morepath-0.15.tar.gz", "has_sig": false, "md5_digest": "3f0674ee6e4451011b10aaceea8d5ec3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 221207, "upload_time": "2016-07-18T12:06:02", "url": "https://files.pythonhosted.org/packages/27/29/9c073a2c9ee892ab68a1f18a6f6a0e940c340d802f6662045ec003caa0fd/morepath-0.15.tar.gz" } ], "0.16": [ { "comment_text": "", "digests": { "md5": "1b0109791d42fbef1511f9a704eb3f6f", "sha256": "c5c8a96c9c2db111ca2275b947513f06f8bc0a451d433149d80321171ac7c146" }, "downloads": -1, "filename": "morepath-0.16.tar.gz", "has_sig": false, "md5_digest": "1b0109791d42fbef1511f9a704eb3f6f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 229036, "upload_time": "2016-10-04T14:01:25", "url": "https://files.pythonhosted.org/packages/fc/cd/1c24adbb180b7f2dc6485ce680b107d5178d9556bcd877f255b510f9608d/morepath-0.16.tar.gz" } ], "0.16.1": [ { "comment_text": "", "digests": { "md5": "e3235c965fcab654f1163c728b20c7b9", "sha256": "5977806689f94a523f225454afa1238ccee7d88f41dc3e528a2bec85f0405296" }, "downloads": -1, "filename": "morepath-0.16.1.tar.gz", "has_sig": false, "md5_digest": "e3235c965fcab654f1163c728b20c7b9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 229196, "upload_time": "2016-10-04T15:06:54", "url": "https://files.pythonhosted.org/packages/9c/ba/8996c370b651133b78a2b55cb2a9ae389c0dc046c80502b2e6211349b947/morepath-0.16.1.tar.gz" } ], "0.16.2": [ { "comment_text": "", "digests": { "md5": "b56327bc64ad93ee2c89acd14cbb5dff", "sha256": "83ccebea5b6f18ae3b875014d111b1265d4e898a1a72bb95c9dc2101ed5054d2" }, "downloads": -1, "filename": "morepath-0.16.2.tar.gz", "has_sig": false, "md5_digest": "b56327bc64ad93ee2c89acd14cbb5dff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 229364, "upload_time": "2016-10-24T04:18:37", "url": "https://files.pythonhosted.org/packages/45/fa/ca2669c31cb2f74530f0c2aa1f5a2e7aaaf5da6351b21d9a25ff03be9fef/morepath-0.16.2.tar.gz" } ], "0.17": [ { "comment_text": "", "digests": { "md5": "508e18b386127c47338241b0a70bc9b0", "sha256": "835baf161a8bc9bdf79ec220bc9f68fd10d2fc5fb6810354ba661cc17a3faa27" }, "downloads": -1, "filename": "morepath-0.17-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "508e18b386127c47338241b0a70bc9b0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 148431, "upload_time": "2016-12-23T12:07:11", "url": "https://files.pythonhosted.org/packages/ac/d6/f20d18f81c723933d8a28ef3ea3efe0c2280860605ae0f36ab8dbad01ab7/morepath-0.17-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bf056834813f4eb641d0891d11d98795", "sha256": "e2c3c6f545ce50f649f5a978a462d7f14a4fbab03fc8d79ffcb8e557057f6bdc" }, "downloads": -1, "filename": "morepath-0.17.tar.gz", "has_sig": false, "md5_digest": "bf056834813f4eb641d0891d11d98795", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 229615, "upload_time": "2016-12-23T12:07:13", "url": "https://files.pythonhosted.org/packages/a6/0c/98b292001fd04e345d0932f4b6f932c5426165c81118c1c3eb66526cc8b9/morepath-0.17.tar.gz" } ], "0.18": [ { "comment_text": "", "digests": { "md5": "6883b9717510035e824701c3ad867073", "sha256": "da102702d8ceb4d24c2f010ce5f9f8dd422b34782295dba6389f3baf60fb55c1" }, "downloads": -1, "filename": "morepath-0.18-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6883b9717510035e824701c3ad867073", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 149167, "upload_time": "2017-03-17T17:29:10", "url": "https://files.pythonhosted.org/packages/f4/9f/41a4faa26d62d7d62ce4f9ca2795685269872d0c21baf7891b152324883e/morepath-0.18-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c2e44d86f727f9a684432f23319f10dc", "sha256": "41a779093fb48583ef071be72a6895ea092fb53513d439e86c826455d93f65a2" }, "downloads": -1, "filename": "morepath-0.18.tar.gz", "has_sig": false, "md5_digest": "c2e44d86f727f9a684432f23319f10dc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 231898, "upload_time": "2017-03-17T17:29:41", "url": "https://files.pythonhosted.org/packages/03/17/f7c37ed543ab09b9b02f4dee0272c8b24e5ecdb1338136c80260d2d535ac/morepath-0.18.tar.gz" } ], "0.18.1": [ { "comment_text": "", "digests": { "md5": "d709abd199eb95ab41d79fab948067b0", "sha256": "94532e9a3fbd45fa119e43d7e21d3039ec9aec844d1b07c54d55f08c2dc3c33d" }, "downloads": -1, "filename": "morepath-0.18.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d709abd199eb95ab41d79fab948067b0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 149735, "upload_time": "2017-06-30T16:42:19", "url": "https://files.pythonhosted.org/packages/c3/75/e749b17116ac5c0cac7c109e8235ca26ce8bda9ec6762b6bff941ea3afa8/morepath-0.18.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4020aad8e5318f753852a1901d30906d", "sha256": "4b634b52ad79e30cc31d10a5433dffd6105b4f37b45ee25c222b3a4ee67b21d7" }, "downloads": -1, "filename": "morepath-0.18.1.tar.gz", "has_sig": false, "md5_digest": "4020aad8e5318f753852a1901d30906d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 232707, "upload_time": "2017-06-30T16:42:22", "url": "https://files.pythonhosted.org/packages/99/d9/4b914c4552830546b4e84e9e9c53169eba142631493026a6a0813b564709/morepath-0.18.1.tar.gz" } ], "0.18.2": [ { "comment_text": "", "digests": { "md5": "64c469f06ea1d66676e198b56c022cc3", "sha256": "ba5659ac85312bfe995641b4d362af76cac111018dc9787d5bf5cd18443f7ad3" }, "downloads": -1, "filename": "morepath-0.18.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "64c469f06ea1d66676e198b56c022cc3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 132089, "upload_time": "2019-01-22T13:59:37", "url": "https://files.pythonhosted.org/packages/49/49/54c2d6a368d01b52d729684fe6be7a928710401e1169f0836994a7b9610f/morepath-0.18.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ffb99360d25b7961317c971feec910af", "sha256": "7bc289b0fe15aa74ad2faa33a6c8f3d4340395a2b8f09db1da9703d4a17bf346" }, "downloads": -1, "filename": "morepath-0.18.2.tar.gz", "has_sig": false, "md5_digest": "ffb99360d25b7961317c971feec910af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 233050, "upload_time": "2019-01-22T13:59:39", "url": "https://files.pythonhosted.org/packages/26/1c/fc413083ce6216dd459a46dea1273c57b98c2e657aeca40d5ff6487d5817/morepath-0.18.2.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "8b3285af6f47959cb60db31d7e55ea43", "sha256": "4fa3521b8f5e4213e56f85e09881abe31b1215600d18f41cbc458887e321ee7c" }, "downloads": -1, "filename": "morepath-0.2.zip", "has_sig": false, "md5_digest": "8b3285af6f47959cb60db31d7e55ea43", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 144744, "upload_time": "2014-04-24T12:41:33", "url": "https://files.pythonhosted.org/packages/f5/c1/c884e6ff497c8c1ae605a914fd6cd122bb6d048a63d6e3fc7cc6454474cf/morepath-0.2.zip" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "3e941a8ae001e54c81ca5eb297003a7c", "sha256": "a9c4d34f0331f73b229e00a021e2301e832b418a0016220c3db7761c6035e305" }, "downloads": -1, "filename": "morepath-0.3.zip", "has_sig": false, "md5_digest": "3e941a8ae001e54c81ca5eb297003a7c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 149107, "upload_time": "2014-06-23T13:20:51", "url": "https://files.pythonhosted.org/packages/0a/a7/455ba886a52965e32429e2b64860c3e79df614b88ac52f603e40e47cb478/morepath-0.3.zip" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "9ef37adfc3d0faeedede7c7d943a4c01", "sha256": "d911d56c5f24e1ddf8b47e8470ea7848e5b0d2335cafd2f2f378b6cfd9266aef" }, "downloads": -1, "filename": "morepath-0.4.zip", "has_sig": false, "md5_digest": "9ef37adfc3d0faeedede7c7d943a4c01", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 157324, "upload_time": "2014-07-07T13:53:27", "url": "https://files.pythonhosted.org/packages/d1/67/667b7755ff5db6879de078c4be09d2da37d01de2e79cf48f1df89f624606/morepath-0.4.zip" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "7f07dcd513b85f1e37e706ef8423b36e", "sha256": "553d382e06d6d81a93f03389943e7022bb2833cc3fc339ed4967cde50d2e3eac" }, "downloads": -1, "filename": "morepath-0.4.1.zip", "has_sig": false, "md5_digest": "7f07dcd513b85f1e37e706ef8423b36e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 158592, "upload_time": "2014-07-08T10:16:28", "url": "https://files.pythonhosted.org/packages/ef/3e/5b54b5e84e1df984a439c5040e6237860723b6958ee6c7742d1b939cecc3/morepath-0.4.1.zip" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "9e55f8320547476f03f5ccbf63be2da4", "sha256": "4e99feac4581bb66a550e3f4314d3b782ac623b23c1f0776ac16c70ac94ba060" }, "downloads": -1, "filename": "morepath-0.5.zip", "has_sig": false, "md5_digest": "9e55f8320547476f03f5ccbf63be2da4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 162187, "upload_time": "2014-08-28T14:24:23", "url": "https://files.pythonhosted.org/packages/4e/bf/44a78ae5ad334db5226288c9f4acbb87523091d6d5c8f7324ad8fd71e723/morepath-0.5.zip" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "dfc89025e96a8c6d4392e03ab69cf4b0", "sha256": "42ef13279cd29dbc46d4fae0f5edb0bd2c0e1e6454c394c470a39338e39031d7" }, "downloads": -1, "filename": "morepath-0.5.1.zip", "has_sig": false, "md5_digest": "dfc89025e96a8c6d4392e03ab69cf4b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 163023, "upload_time": "2014-08-28T14:55:34", "url": "https://files.pythonhosted.org/packages/f6/ca/ea0b69e2e590161a451241ebb8aa1d84ca1447e369a4b7e4200ec4d2b576/morepath-0.5.1.zip" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "05f08718950192f79fe130ed3889345d", "sha256": "2c8f993a094aafee893f82af191143d41d09b0e2766c554a9eec999686c4c3ad" }, "downloads": -1, "filename": "morepath-0.6.zip", "has_sig": false, "md5_digest": "05f08718950192f79fe130ed3889345d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 165162, "upload_time": "2014-09-08T13:02:38", "url": "https://files.pythonhosted.org/packages/11/04/95b0a0a7c5b0cacdda59b6f94e4c472ec6a41075f61362b312f1d142e78e/morepath-0.6.zip" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "a07ddebee5ee0b612f9f088114cdec11", "sha256": "b6222806832a49080b66a348bfebc7ab5e3d4134aa89542166cb12ae2ccac3f4" }, "downloads": -1, "filename": "morepath-0.7.zip", "has_sig": false, "md5_digest": "a07ddebee5ee0b612f9f088114cdec11", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 180345, "upload_time": "2014-11-03T14:44:50", "url": "https://files.pythonhosted.org/packages/f1/3a/6a6a97d07bbdfe4bb43c1841bde68f5ade54aef03a0e7ba88754cf868258/morepath-0.7.zip" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "3c05f32c4a65b063acfa47ecfd82e5c6", "sha256": "ef3a5783a7c4f8e4f58cfe7df6c20f170cccc067c8172fa7b2e73ef6f6b703cf" }, "downloads": -1, "filename": "morepath-0.7.1.zip", "has_sig": false, "md5_digest": "3c05f32c4a65b063acfa47ecfd82e5c6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 181059, "upload_time": "2014-11-11T13:26:33", "url": "https://files.pythonhosted.org/packages/3c/36/3ea3e035ee255c298ae20ed9a03e6b0ad7c5150aec4eb2b5e49294c1acae/morepath-0.7.1.zip" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "c4b63e5677f3b02ae3a9ae1508694ebc", "sha256": "b62cf5b66f0d17cb47360e4425ce229b7c65ff0a6e73df1711d1f96301b35985" }, "downloads": -1, "filename": "morepath-0.7.2.zip", "has_sig": false, "md5_digest": "c4b63e5677f3b02ae3a9ae1508694ebc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 181257, "upload_time": "2014-11-11T16:05:35", "url": "https://files.pythonhosted.org/packages/63/22/02d2cb2adc0ad1d15f11b9264a1f4f3521fb6d1b76b07d696db95606ef91/morepath-0.7.2.zip" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "f835a85bddb0cb6178d5ca355966285f", "sha256": "00dc6d0d9821d9b353d24f459243031706d9912c85ed4101b339ac92effca4ee" }, "downloads": -1, "filename": "morepath-0.8.zip", "has_sig": false, "md5_digest": "f835a85bddb0cb6178d5ca355966285f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 188686, "upload_time": "2014-11-13T14:34:09", "url": "https://files.pythonhosted.org/packages/65/82/a0ec879f9c9a632a92da38f6be4792bb352f073edeb408e76e3ee3666d21/morepath-0.8.zip" } ], "0.9": [ { "comment_text": "", "digests": { "md5": "95f5c33b20626497444438701b4d3bc8", "sha256": "67ce6629e4dab12b54ea802ad1e376bab8a2abb4a483ee432867d54ac6a5ac99" }, "downloads": -1, "filename": "morepath-0.9.zip", "has_sig": false, "md5_digest": "95f5c33b20626497444438701b4d3bc8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 195648, "upload_time": "2014-11-25T13:47:32", "url": "https://files.pythonhosted.org/packages/b3/a7/3042e8532d391408f07935fc928fda2e76fadf688a0e7bc7ad936c88b29f/morepath-0.9.zip" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "64c469f06ea1d66676e198b56c022cc3", "sha256": "ba5659ac85312bfe995641b4d362af76cac111018dc9787d5bf5cd18443f7ad3" }, "downloads": -1, "filename": "morepath-0.18.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "64c469f06ea1d66676e198b56c022cc3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 132089, "upload_time": "2019-01-22T13:59:37", "url": "https://files.pythonhosted.org/packages/49/49/54c2d6a368d01b52d729684fe6be7a928710401e1169f0836994a7b9610f/morepath-0.18.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ffb99360d25b7961317c971feec910af", "sha256": "7bc289b0fe15aa74ad2faa33a6c8f3d4340395a2b8f09db1da9703d4a17bf346" }, "downloads": -1, "filename": "morepath-0.18.2.tar.gz", "has_sig": false, "md5_digest": "ffb99360d25b7961317c971feec910af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 233050, "upload_time": "2019-01-22T13:59:39", "url": "https://files.pythonhosted.org/packages/26/1c/fc413083ce6216dd459a46dea1273c57b98c2e657aeca40d5ff6487d5817/morepath-0.18.2.tar.gz" } ] }